Index: flexoentity/composite_backend.py
===================================================================
--- flexoentity/composite_backend.py	(revision ea28ca0608ed52526793cd6fea857763cf9a41ba)
+++ flexoentity/composite_backend.py	(revision 1f5bf2d93db39da80b62ad71327aec892abbf357)
@@ -39,7 +39,7 @@
     @primary.setter
     def primary(self, new_primary):
-        self._primary = new_primary    
+        self._primary = new_primary
 
-    def add_backend(self, backend, clear=False):
+    def add_sync_backend(self, backend, clear=False):
         """
         Append an additional backend.
Index: flexoentity/domain_manager.py
===================================================================
--- flexoentity/domain_manager.py	(revision ea28ca0608ed52526793cd6fea857763cf9a41ba)
+++ flexoentity/domain_manager.py	(revision 1f5bf2d93db39da80b62ad71327aec892abbf357)
@@ -33,6 +33,8 @@
     ENTITY_CLASS = Domain
 
-    def __init__(self, backend, registry=None):
-        super().__init__(backend)
+    def __init__(self, local_backend, staging_backend, permanent_backend, registry=None):
+        super().__init__(local_backend=local_backend,
+                         staging_backend=staging_backend,
+                         permanent_backend=permanent_backend)
         self._registry = registry
         self._index_by_domain_id = {}
@@ -50,6 +52,7 @@
         """Rebuild domain_id lookup table from backend contents."""
         self._index_by_domain_id.clear()
-        for dom in self.backend.load_all():
-            self._index_by_domain_id[dom.domain_id] = dom
+        for backend in [self.local_backend, self.staging_backend, self.permanent_backend]:
+            for dom in backend.load_all():
+                self._index_by_domain_id[dom.domain_id] = dom
 
     # ------------------------------------------------------------
Index: flexoentity/entity_manager.py
===================================================================
--- flexoentity/entity_manager.py	(revision ea28ca0608ed52526793cd6fea857763cf9a41ba)
+++ flexoentity/entity_manager.py	(revision 1f5bf2d93db39da80b62ad71327aec892abbf357)
@@ -17,5 +17,5 @@
     ENTITY_CLASS = None  # must be overridden by subclasses
 
-    def __init__(self, backend):
+    def __init__(self, local_backend, staging_backend, permanent_backend):
         if self.ENTITY_CLASS is None:
             raise ValueError("Subclasses must define ENTITY_CLASS")
@@ -23,5 +23,7 @@
         if not issubclass(self.ENTITY_CLASS, FlexoEntity):
             raise TypeError("ENTITY_CLASS must be a subclass of FlexOEntity")
-        self.backend = backend
+        self.local_backend = local_backend
+        self.staging_backend = staging_backend
+        self.permanent_backend = permanent_backend
 
     # ------------------------------------------------------------------
@@ -32,14 +34,14 @@
         """Insert a new entity."""
         self._ensure_type(entity)
-        self.backend.save(entity)
+        self.local_backend.save(entity)
 
     def update(self, entity):
         """Replace an existing entity (same flexo_id)."""
         self._ensure_type(entity)
-        self.backend.update(entity)
+        self.local_backend.update(entity)
 
     def delete(self, flexo_id: str):
         """Remove entity by string flexo_id."""
-        self.backend.delete(flexo_id)
+        self.local_backend.delete(flexo_id)
 
     # ------------------------------------------------------------------
@@ -52,9 +54,28 @@
         Returns ENTITY_CLASS instance or None.
         """
-        return self.backend.load(flexo_id)
+        return self.local_backend.load(flexo_id)
 
     def all(self):
         """Load all entities as a list of instances."""
-        return self.backend.load_all()
+        return self.local_backend.load_all()
+
+    def promote_to_staging(self, flexo_id):
+        entity = self.local_backend.load(flexo_id)
+        self.staging_backend.save(entity)
+
+    def promote_to_permanent(self, flexo_id):
+        entity = self.staging_backend.load(flexo_id)
+        self.permanent_backend.save(entity)
+
+    def sync_all(self):
+        # sync staging → local
+        for e in self.staging_backend.load_all():
+            self.local_backend.save(e)
+
+        # sync permanent → local
+        for e in self.permanent_backend.load_all():
+            self.local_backend.save(e)
+        self.refresh()
+
     # ------------------------------------------------------------------
     # Helpers
@@ -65,5 +86,5 @@
 
     def count(self) -> int:
-        return len(self.backend.load_all())
+        return len(self.local_backend.load_all())
 
     def add_or_update(self, entity):
@@ -78,5 +99,5 @@
 
     def as_collection(self):
-        return TypedCollection(self.ENTITY_CLASS, items=self.backend.load_all())
+        return TypedCollection(self.ENTITY_CLASS, items=self.local_backend.load_all())
 
     # ------------------------------------------------------------------
