#. The requested operations are completed in the handler class and the ACM-runtime needs to be notified.
   #. Collect all instances data.
   #. Send out Properties to ACM-runtime.
+  #. Calculate the next stage during migration, rollback and prepare
 
   The methods are as follows:
 
   1.  Map<UUID, AutomationComposition> getAutomationCompositions();
   2.  AutomationComposition getAutomationComposition(UUID instanceId);
   3.  AutomationCompositionElement getAutomationCompositionElement(UUID instanceId, UUID elementId);
-  4.  getInstanceElementDto(UUID instanceId, UUID elementId);
+  4.  InstanceElementDto getInstanceElementDto(UUID instanceId, UUID elementId);
   5.  Map<UUID, Map<ToscaConceptIdentifier, AutomationCompositionElementDefinition>> getAcElementsDefinitions();
   6   Map<ToscaConceptIdentifier, AutomationCompositionElementDefinition> getAcElementsDefinitions(UUID compositionId);
   7.  AutomationCompositionElementDefinition getAcElementDefinition(UUID compositionId, ToscaConceptIdentifier elementId);
-  8.  getCompositionElementDto(UUID compositionId, ToscaConceptIdentifier elementId);
+  8.  CompositionElementDto getCompositionElementDto(UUID compositionId, ToscaConceptIdentifier elementId);
 
 This following methods are invoked to update the outProperties during each operation in the participant.
 
   2.  void updateCompositionState(UUID compositionId, AcTypeState state, StateChangeResult stateChangeResult, String message);
   3.  void updateAutomationCompositionElementStage(UUID instance, UUID elementId, StateChangeResult stateChangeResult, int stage, String message);
 
+This following methods calculate the next stage during migration, rollback and prepare for the AC element during each operation in the participant.
+
+.. code-block:: java
+
+  1. int getMigrateNextStage(CompositionElementDto compositionElementTarget, int lastStage);
+  2. int getRollbackNextStage(CompositionElementDto compositionElementRollback, int lastStage);
+  3. int getPrepareNextStage(CompositionElementDto compositionElement, int lastStage);
+
 In/Out composition Properties
 -----------------------------
 The 'Common Properties' could be created or updated by ACM-runtime.
   public class AutomationCompositionElementHandler extends AcElementListenerV3 {
 
     @Override
-    public void deploy(CompositionElementDto compositionElement, InstanceElementDto instanceElement)
-            throws PfModelException {
+    public void prime(CompositionDto composition) throws PfModelException {
 
-        // TODO deploy process
+        // TODO prime process
 
-        if (isDeploySuccess()) {
-            intermediaryApi.updateAutomationCompositionElementState(instanceElement.instanceId(),
-                instanceElement.elementId(), DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR,
-                "Deployed");
+        if (isPrimeSuccess()) {
+            intermediaryApi.updateCompositionState(composition.compositionId(),
+                AcTypeState.PRIMED, StateChangeResult.NO_ERROR, "Primed");
         } else {
-            intermediaryApi.updateAutomationCompositionElementState(instanceElement.instanceId(),
-                instanceElement.elementId(), DeployState.UNDEPLOYED, null, StateChangeResult.FAILED,
-                "Deploy failed!");
+            intermediaryApi.updateCompositionState(composition.compositionId(),
+                AcTypeState.COMMISSIONED, StateChangeResult.FAILED, "Prime failed!");
         }
     }
 
     @Override
-    public void undeploy(CompositionElementDto compositionElement, InstanceElementDto instanceElement)
-            throws PfModelException {
+    public void deprime(CompositionDto composition) throws PfModelException {
 
-        // TODO undeploy process
+        // TODO deprime process
 
-        if (isUndeploySuccess()) {
-            intermediaryApi.updateAutomationCompositionElementState(instanceElement.instanceId(),
-                instanceElement.elementId(), DeployState.UNDEPLOYED, null, StateChangeResult.NO_ERROR,
-                    "Undeployed");
+        if (isDeprimeSuccess()) {
+            intermediaryApi.updateCompositionState(composition.compositionId(), AcTypeState.COMMISSIONED,
+                StateChangeResult.NO_ERROR, "Deprimed");
         } else {
-            intermediaryApi.updateAutomationCompositionElementState(instanceElement.instanceId(),
-                instanceElement.elementId(), DeployState.DEPLOYED, null, StateChangeResult.FAILED,
-                    "Undeploy failed!");
+            intermediaryApi.updateCompositionState(composition.compositionId(), AcTypeState.PRIMED,
+                StateChangeResult.FAILED, "Deprime failed!");
         }
     }
 
     @Override
-    public void lock(CompositionElementDto compositionElement, InstanceElementDto instanceElement)
+    public void deploy(CompositionElementDto compositionElement, InstanceElementDto instanceElement)
             throws PfModelException {
 
-        // TODO lock process
+        // TODO deploy process
 
-        if (isLockSuccess()) {
+        if (isDeploySuccess()) {
             intermediaryApi.updateAutomationCompositionElementState(instanceElement.instanceId(),
-                instanceElement.elementId(), null, LockState.LOCKED, StateChangeResult.NO_ERROR, "Locked");
+                instanceElement.elementId(), DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR,
+                "Deployed");
         } else {
             intermediaryApi.updateAutomationCompositionElementState(instanceElement.instanceId(),
-                instanceElement.elementId(), null, LockState.UNLOCKED, StateChangeResult.FAILED, "Lock failed!");
+                instanceElement.elementId(), DeployState.UNDEPLOYED, null, StateChangeResult.FAILED,
+                "Deploy failed!");
         }
     }
 
     @Override
-    public void unlock(CompositionElementDto compositionElement, InstanceElementDto instanceElement)
+    public void undeploy(CompositionElementDto compositionElement, InstanceElementDto instanceElement)
             throws PfModelException {
 
-        // TODO unlock process
+        // TODO undeploy process
 
-        if (isUnlockSuccess()) {
+        if (isUndeploySuccess()) {
             intermediaryApi.updateAutomationCompositionElementState(instanceElement.instanceId(),
-                instanceElement.elementId(), null, LockState.UNLOCKED, StateChangeResult.NO_ERROR, "Unlocked");
+                instanceElement.elementId(), DeployState.UNDEPLOYED, null, StateChangeResult.NO_ERROR,
+                    "Undeployed");
         } else {
             intermediaryApi.updateAutomationCompositionElementState(instanceElement.instanceId(),
-                instanceElement.elementId(), null, LockState.LOCKED, StateChangeResult.FAILED, "Unlock failed!");
+                instanceElement.elementId(), DeployState.DEPLOYED, null, StateChangeResult.FAILED,
+                    "Undeploy failed!");
         }
     }
 
         }
     }
 
+
+The following example shows how could be the implemented the update/migration/rollback notifications.
+Note: the removed elements always happen at stage 0
+
+.. code-block:: java
+
+
     @Override
     public void update(CompositionElementDto compositionElement, InstanceElementDto instanceElement,
             InstanceElementDto instanceElementUpdated) throws PfModelException {
             InstanceElementDto instanceElement, InstanceElementDto instanceElementMigrate, int stage)
             throws PfModelException
 
+        if (ElementState.REMOVED.equals(instanceElementMigrate.state())) {
+
+            // TODO element remove scenario
+
+            if (isMigrateSuccess()) {
+                intermediaryApi.updateAutomationCompositionElementState(
+                    instanceElement.instanceId(), instanceElement.elementId(),
+                    DeployState.DELETED, null, StateChangeResult.NO_ERROR, "Migrated");
+            } else {
+                intermediaryApi.updateAutomationCompositionElementState(
+                    instanceElement.instanceId(), instanceElement.elementId(),
+                    DeployState.DEPLOYED, null, StateChangeResult.FAILED, "Migrate failed!");
+            }
+            return;
+        }
+
         switch (instanceElementMigrate.state()) {
             case NEW -> // TODO new element scenario
-            case REMOVED -> // TODO element remove scenario
             default ->  // TODO migration process
         }
 
         if (isMigrateSuccess()) {
-            var stageSet = ParticipantUtils.findStageSetMigrate(compositionElementTarget.inProperties());
-            var nextStage = 1000;
-            for (var s : stageSet) {
-                if (s > stage) {
-                    nextStage = Math.min(s, nextStage);
-                }
-            }
-
-            if (nextStage == 1000) {
+            var nextStage = intermediaryApi.getMigrateNextStage(compositionElementTarget, stage);
+            if (nextStage == stage) {
                 intermediaryApi.updateAutomationCompositionElementState(
                     instanceElement.instanceId(), instanceElement.elementId(),
                     DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Migrated");
     }
 
     @Override
-    public void migratePrecheck(UUID instanceId, UUID elementId) throws PfModelException {
+    public void rollbackMigration(CompositionElementDto compositionElement,
+            CompositionElementDto compositionElementRollback, InstanceElementDto instanceElement,
+            InstanceElementDto instanceElementRollback, int stage) {
 
-        // TODO migration Precheck process
+        if (ElementState.REMOVED.equals(instanceElementRollback.state())) {
 
-        intermediaryApi.updateAutomationCompositionElementState(
-            instanceElement.instanceId(), instanceElement.elementId(),
-            DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Migration precheck completed");
+            // TODO element remove scenario
+
+            if (isRollbackSuccess()) {
+                intermediaryApi.updateAutomationCompositionElementState(
+                    instanceElement.instanceId(), instanceElement.elementId(),
+                    DeployState.DELETED, null, StateChangeResult.NO_ERROR, "Rollback completed");
+            } else {
+                intermediaryApi.updateAutomationCompositionElementState(
+                    instanceElement.instanceId(), instanceElement.elementId(),
+                    DeployState.DEPLOYED, null, StateChangeResult.FAILED, "Rollback failed!");
+            }
+            return;
+        }
+
+        switch (instanceElementRollback.state()) {
+            case NEW -> // TODO element to be re-insert
+            default ->  // TODO rollback process
+        }
+
+        if (isRollbackSuccess()) {
+            var nextStage = intermediaryApi.getRollbackNextStage(compositionElementRollback, stage);
+            if (nextStage == stage) {
+                intermediaryApi.updateAutomationCompositionElementState(
+                    instanceElement.instanceId(), instanceElement.elementId(),
+                    DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Rollback completed");
+            } else {
+                intermediaryApi.updateAutomationCompositionElementStage(
+                    instanceElement.instanceId(), instanceElement.elementId(),
+                    StateChangeResult.NO_ERROR, nextStage, "stage " + stage + " Rollback");
+            }
+        } else {
+            intermediaryApi.updateAutomationCompositionElementState(
+                instanceElement.instanceId(), instanceElement.elementId(),
+                DeployState.DEPLOYED, null, StateChangeResult.FAILED, "Rollback failed!");
+        }
     }
 
+
+The following example shows how could be the implemented the other notifications.
+
+.. code-block:: java
+
     @Override
-    public void prepare(UUID instanceId, UUID elementId) throws PfModelException {
+    public void lock(CompositionElementDto compositionElement, InstanceElementDto instanceElement)
+            throws PfModelException {
 
-        // TODO prepare process
+        // TODO lock process
 
-        intermediaryApi.updateAutomationCompositionElementState(
-            instanceElement.instanceId(), instanceElement.elementId(),
-            DeployState.UNDEPLOYED, null, StateChangeResult.NO_ERROR, "Prepare completed");
+        if (isLockSuccess()) {
+            intermediaryApi.updateAutomationCompositionElementState(instanceElement.instanceId(),
+                instanceElement.elementId(), null, LockState.LOCKED, StateChangeResult.NO_ERROR, "Locked");
+        } else {
+            intermediaryApi.updateAutomationCompositionElementState(instanceElement.instanceId(),
+                instanceElement.elementId(), null, LockState.UNLOCKED, StateChangeResult.FAILED, "Lock failed!");
+        }
     }
 
     @Override
-    public void review(UUID instanceId, UUID elementId) throws PfModelException {
+    public void unlock(CompositionElementDto compositionElement, InstanceElementDto instanceElement)
+            throws PfModelException {
 
-        // TODO review process
+        // TODO unlock process
+
+        if (isUnlockSuccess()) {
+            intermediaryApi.updateAutomationCompositionElementState(instanceElement.instanceId(),
+                instanceElement.elementId(), null, LockState.UNLOCKED, StateChangeResult.NO_ERROR, "Unlocked");
+        } else {
+            intermediaryApi.updateAutomationCompositionElementState(instanceElement.instanceId(),
+                instanceElement.elementId(), null, LockState.LOCKED, StateChangeResult.FAILED, "Unlock failed!");
+        }
+    }
+
+    @Override
+    public void migratePrecheck(UUID instanceId, UUID elementId) throws PfModelException {
+
+        // TODO migration Precheck process
 
         intermediaryApi.updateAutomationCompositionElementState(
             instanceElement.instanceId(), instanceElement.elementId(),
-            DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Review completed");
+            DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Migration precheck completed");
     }
 
     @Override
-    public void prime(CompositionDto composition) throws PfModelException {
-
-        // TODO prime process
+    public void prepare(UUID instanceId, UUID elementId) throws PfModelException {
 
-        if (isPrimeSuccess()) {
-            intermediaryApi.updateCompositionState(composition.compositionId(),
-                AcTypeState.PRIMED, StateChangeResult.NO_ERROR, "Primed");
+        // TODO prepare process
+        if (isPrepareSuccess()) {
+            var nextStage = intermediaryApi.getPrepareNextStage(compositionElement, stage);
+            if (nextStage == stage) {
+                intermediaryApi.updateAutomationCompositionElementState(
+                    instanceElement.instanceId(), instanceElement.elementId(),
+                    DeployState.UNDEPLOYED, null, StateChangeResult.NO_ERROR, "Prepare completed");
+            } else {
+                intermediaryApi.updateAutomationCompositionElementStage(
+                    instanceElement.instanceId(), instanceElement.elementId(),
+                    StateChangeResult.NO_ERROR, nextStage, "stage " + stage + " Prepare");
+            }
         } else {
-            intermediaryApi.updateCompositionState(composition.compositionId(),
-                AcTypeState.COMMISSIONED, StateChangeResult.FAILED, "Prime failed!");
+            intermediaryApi.updateAutomationCompositionElementState(
+                instanceElement.instanceId(), instanceElement.elementId(),
+                DeployState.UNDEPLOYED, null, StateChangeResult.FAILED, "Prepare failed");
         }
     }
 
     @Override
-    public void deprime(CompositionDto composition) throws PfModelException {
+    public void review(UUID instanceId, UUID elementId) throws PfModelException {
 
-        // TODO deprime process
+        // TODO review process
 
-        if (isDeprimeSuccess()) {
-            intermediaryApi.updateCompositionState(composition.compositionId(), AcTypeState.COMMISSIONED,
-                StateChangeResult.NO_ERROR, "Deprimed");
-        } else {
-            intermediaryApi.updateCompositionState(composition.compositionId(), AcTypeState.PRIMED,
-                StateChangeResult.FAILED, "Deprime failed!");
-        }
+        intermediaryApi.updateAutomationCompositionElementState(
+            instanceElement.instanceId(), instanceElement.elementId(),
+            DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Review completed");
     }