import org.onap.policy.clamp.models.acm.persistence.repository.AutomationCompositionElementRepository;
 import org.onap.policy.clamp.models.acm.persistence.repository.AutomationCompositionRepository;
 import org.onap.policy.clamp.models.acm.persistence.repository.AutomationCompositionRollbackRepository;
-import org.onap.policy.clamp.models.acm.utils.AcmUtils;
+import org.onap.policy.clamp.models.acm.utils.AcmStateUtils;
 import org.onap.policy.common.parameters.BeanValidationResult;
 import org.onap.policy.common.parameters.ValidationStatus;
 import org.onap.policy.models.base.PfConceptKey;
      */
     public AutomationComposition createAutomationComposition(final AutomationComposition automationComposition) {
         automationComposition.setInstanceId(UUID.randomUUID());
-        AcmUtils.setCascadedState(automationComposition, DeployState.UNDEPLOYED, LockState.NONE);
+        AcmStateUtils.setCascadedState(automationComposition, DeployState.UNDEPLOYED, LockState.NONE);
         var result = automationCompositionRepository.save(ProviderUtils.getJpaAndValidate(automationComposition,
             JpaAutomationComposition::new, "automation composition"));
 
 
 /*-
  * ============LICENSE_START=======================================================
- *  Copyright (C) 2021-2025 OpenInfra Foundation Europe. All rights reserved.
+ *  Copyright (C) 2025 OpenInfra Foundation Europe. All rights reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.policy.clamp.models.acm.concepts;
+package org.onap.policy.clamp.models.acm.utils;
 
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.stream.Collectors;
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
+import org.onap.policy.clamp.models.acm.concepts.AutomationComposition;
+import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionElement;
+import org.onap.policy.clamp.models.acm.concepts.DeployState;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
 
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
-public final class ParticipantUtils {
+public final class AcmStageUtils {
     private static final String STAGE_MIGRATE = "migrate";
     private static final String STAGE_PREPARE = "prepare";
-    public static final String DEFAULT_TIMEOUT = "maxOperationWaitMs";
-    public static final String PRIME_TIMEOUT = "primeTimeoutMs";
-    public static final String DEPRIME_TIMEOUT = "deprimeTimeoutMs";
-    public static final String DEPLOY_TIMEOUT = "deployTimeoutMs";
-    public static final String UNDEPLOY_TIMEOUT = "undeployTimeoutMs";
-    public static final String UPDATE_TIMEOUT = "updateTimeoutMs";
-    public static final String MIGRATE_TIMEOUT = "migrateTimeoutMs";
-    public static final String DELETE_TIMEOUT = "deleteTimeoutMs";
-
-    public static final Map<DeployState, String> MAP_TIMEOUT = Map.of(DeployState.DEPLOYING, DEPLOY_TIMEOUT,
-            DeployState.UNDEPLOYING, UNDEPLOY_TIMEOUT,
-            DeployState.UPDATING, UPDATE_TIMEOUT,
-            DeployState.MIGRATING, MIGRATE_TIMEOUT,
-            DeployState.DELETING, DELETE_TIMEOUT);
 
     /**
      * Get the First StartPhase.
      * @return the First StartPhase
      */
     public static int getFirstStartPhase(
-        AutomationComposition automationComposition, ToscaServiceTemplate toscaServiceTemplate) {
+            AutomationComposition automationComposition, ToscaServiceTemplate toscaServiceTemplate) {
         var minStartPhase = 1000;
         var maxStartPhase = 0;
         for (var element : automationComposition.getElements().values()) {
             var toscaNodeTemplate = toscaServiceTemplate.getToscaTopologyTemplate().getNodeTemplates()
-                .get(element.getDefinition().getName());
+                    .get(element.getDefinition().getName());
             int startPhase = toscaNodeTemplate != null
                     && element.getDefinition().getVersion().equals(toscaNodeTemplate.getVersion())
-                    ? ParticipantUtils.findStartPhase(toscaNodeTemplate.getProperties()) : 0;
+                    ? findStartPhase(toscaNodeTemplate.getProperties()) : 0;
             minStartPhase = Math.min(minStartPhase, startPhase);
             maxStartPhase = Math.max(maxStartPhase, startPhase);
         }
 
-        return DeployState.DEPLOYING.equals(automationComposition.getDeployState())
-            || LockState.UNLOCKING.equals(automationComposition.getLockState()) ? minStartPhase : maxStartPhase;
+        return AcmStateUtils.isForward(automationComposition.getDeployState(), automationComposition.getLockState())
+                ? minStartPhase : maxStartPhase;
     }
 
     /**
-     * Get the First Stage.
+     * Get the First Stage from AutomationComposition.
      *
      * @param automationComposition the automation composition
      * @param toscaServiceTemplate the ToscaServiceTemplate
      */
     public static int getFirstStage(AutomationComposition automationComposition,
             ToscaServiceTemplate toscaServiceTemplate) {
-        Set<Integer> minStage = new HashSet<>();
-        for (var element : automationComposition.getElements().values()) {
-            if (! MigrationState.REMOVED.equals(element.getMigrationState())) {
-                var toscaNodeTemplate = toscaServiceTemplate.getToscaTopologyTemplate().getNodeTemplates()
-                        .get(element.getDefinition().getName());
-                var stage = DeployState.MIGRATING.equals(automationComposition.getDeployState())
-                        ? ParticipantUtils.findStageSetMigrate(toscaNodeTemplate.getProperties())
-                        : ParticipantUtils.findStageSetPrepare(toscaNodeTemplate.getProperties());
-                minStage.addAll(stage);
-            }
+        var stages = automationComposition.getElements().values().stream()
+                .map(element -> getFirstStage(element, toscaServiceTemplate));
+        return stages.min(Integer::compare).orElse(0);
+    }
 
+    /**
+     * Get the First Stage from AutomationCompositionElement.
+     *
+     * @param element the automation composition element
+     * @param toscaServiceTemplate the ToscaServiceTemplate
+     * @return the First stage
+     */
+    public static int getFirstStage(AutomationCompositionElement element, ToscaServiceTemplate toscaServiceTemplate) {
+        var toscaNodeTemplate = toscaServiceTemplate.getToscaTopologyTemplate().getNodeTemplates()
+                .get(element.getDefinition().getName());
+        if (toscaNodeTemplate == null) {
+            return 0;
         }
-        return minStage.stream().min(Integer::compare).orElse(0);
+        return getFirstStage(element.getDeployState(), toscaNodeTemplate.getProperties());
+    }
+
+    /**
+     * Get the First Stage.
+     *
+     * @param deployState the DeployState
+     * @param properties Map of properties
+     * @return the First stage
+     */
+    public static int getFirstStage(DeployState deployState, Map<String, Object> properties) {
+        var stageSet = AcmStateUtils.isMigrating(deployState)
+                ? findStageSetMigrate(properties)
+                : findStageSetPrepare(properties);
+        return stageSet.stream().min(Integer::compare).orElse(0);
     }
 
     /**
         return Set.of(0);
     }
 
-    /**
-     * Get timeout value from properties by name operation, return default value if not present.
-     *
-     * @param properties instance properties
-     * @param name the operation name
-     * @param defaultValue the default value
-     * @return the timeout value
-     */
-    public static long getTimeout(Map<String, Object> properties, String name, long defaultValue) {
-        var objTimeout = properties.get(name);
-        if (objTimeout != null) {
-            return Long.parseLong(objTimeout.toString());
-        }
-        return defaultValue;
-    }
-
-    /**
-     * Get operation name of a composition definition.
-     *
-     * @param state the state of the composition definition
-     * @return the operation name
-     */
-    public static String getOpName(AcTypeState state) {
-        return AcTypeState.PRIMING.equals(state) ? PRIME_TIMEOUT : DEPRIME_TIMEOUT;
-    }
-
-    /**
-     * Get operation name of a AutomationComposition.
-     *
-     * @param deployState the state of the AutomationComposition
-     * @return the operation name
-     */
-    public static String getOpName(DeployState deployState) {
-        return MAP_TIMEOUT.getOrDefault(deployState, DEFAULT_TIMEOUT);
-    }
-
     /**
      * Finds stage from a map of properties for Migrate.
      *
 
--- /dev/null
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2025 OpenInfra Foundation Europe. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.clamp.models.acm.utils;
+
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+import org.apache.commons.collections4.MapUtils;
+import org.onap.policy.clamp.models.acm.concepts.AcTypeState;
+import org.onap.policy.clamp.models.acm.concepts.AutomationComposition;
+import org.onap.policy.clamp.models.acm.concepts.DeployState;
+import org.onap.policy.clamp.models.acm.concepts.LockState;
+import org.onap.policy.clamp.models.acm.concepts.SubState;
+import org.onap.policy.clamp.models.acm.messages.rest.instantiation.DeployOrder;
+import org.onap.policy.clamp.models.acm.messages.rest.instantiation.LockOrder;
+
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public final class AcmStateUtils {
+
+    /**
+     * Return true if DeployState, LockState and SubState are in a Transitional State.
+     *
+     * @param deployState the DeployState
+     * @param lockState the LockState
+     * @param subState the SubState
+     * @return true if there is a state in a Transitional State
+     */
+    public static boolean isInTransitionalState(DeployState deployState, LockState lockState, SubState subState) {
+        return DeployState.DEPLOYING.equals(deployState) || DeployState.UNDEPLOYING.equals(deployState)
+                || LockState.LOCKING.equals(lockState) || LockState.UNLOCKING.equals(lockState)
+                || DeployState.DELETING.equals(deployState) || DeployState.UPDATING.equals(deployState)
+                || DeployState.MIGRATING.equals(deployState) || DeployState.MIGRATION_REVERTING.equals(deployState)
+                || !SubState.NONE.equals(subState);
+    }
+
+    /**
+     * Return true if AcTypeState is in a Transitional State.
+     *
+     * @param compositionState the AcTypeState
+     * @return true if the state in a Transitional State
+     */
+    public static boolean isInTransitionalState(AcTypeState compositionState) {
+        return AcTypeState.PRIMING.equals(compositionState)
+                || AcTypeState.DEPRIMING.equals(compositionState);
+    }
+
+    /**
+     * Get DeployOrder from transitional DeployState.
+     *
+     * @param deployState the Deploy State
+     * @return the DeployOrder
+     */
+    public static DeployOrder stateDeployToOrder(DeployState deployState) {
+        return switch (deployState) {
+            case DEPLOYING -> DeployOrder.DEPLOY;
+            case UNDEPLOYING -> DeployOrder.UNDEPLOY;
+            case DELETING -> DeployOrder.DELETE;
+            default -> DeployOrder.NONE;
+        };
+    }
+
+    /**
+     * Get LockOrder from transitional LockState.
+     *
+     * @param lockState the Lock State
+     * @return the LockOrder
+     */
+    public static LockOrder stateLockToOrder(LockState lockState) {
+        if (LockState.LOCKING.equals(lockState)) {
+            return LockOrder.LOCK;
+        } else if (LockState.UNLOCKING.equals(lockState)) {
+            return LockOrder.UNLOCK;
+        }
+        return LockOrder.NONE;
+    }
+
+    /**
+     * Get final DeployState from transitional DeployState.
+     *
+     * @param deployState the DeployState
+     * @return the DeployState
+     */
+    public static DeployState deployCompleted(DeployState deployState) {
+        return switch (deployState) {
+            case MIGRATING, MIGRATION_REVERTING, UPDATING, DEPLOYING -> DeployState.DEPLOYED;
+            case UNDEPLOYING -> DeployState.UNDEPLOYED;
+            case DELETING -> DeployState.DELETED;
+            default -> deployState;
+        };
+    }
+
+    /**
+     * Get final LockState from transitional LockState.
+     *
+     * @param lockState the LockState
+     * @return the LockState
+     */
+    public static LockState lockCompleted(DeployState deployState, LockState lockState) {
+        if (LockState.LOCKING.equals(lockState) || DeployState.DEPLOYING.equals(deployState)) {
+            return LockState.LOCKED;
+        } else if (LockState.UNLOCKING.equals(lockState)) {
+            return LockState.UNLOCKED;
+        } else if (DeployState.UNDEPLOYING.equals(deployState)) {
+            return LockState.NONE;
+        }
+        return lockState;
+    }
+
+    /**
+     * Return true if transition states is Forward.
+     *
+     * @param deployState the DeployState
+     * @param lockState the LockState
+     * @return true if transition is Forward
+     */
+    public static boolean isForward(DeployState deployState, LockState lockState) {
+        return DeployState.DEPLOYING.equals(deployState) || LockState.UNLOCKING.equals(lockState);
+    }
+
+    /**
+     * Return true if migration states is Forward.
+     *
+     * @param deployState the DeployState
+     * @return true if migration is Forward
+     */
+    public static boolean isMigrationForward(DeployState deployState) {
+        return DeployState.MIGRATING.equals(deployState);
+    }
+
+    /**
+     * Return true if the transition is MIGRATING or MIGRATION_REVERTING.
+     *
+     * @param deployState the DeployState
+     * @return true if the transition is MIGRATING or MIGRATION_REVERTING
+     */
+    public static boolean isMigrating(DeployState deployState) {
+        return DeployState.MIGRATING.equals(deployState) || DeployState.MIGRATION_REVERTING.equals(deployState);
+    }
+
+    /**
+     * Set the states on the automation composition and on all its automation composition elements.
+     *
+     * @param deployState the DeployState we want the automation composition to transition to
+     * @param lockState the LockState we want the automation composition to transition to
+     */
+    public static void setCascadedState(final AutomationComposition automationComposition,
+            final DeployState deployState, final LockState lockState) {
+        setCascadedState(automationComposition, deployState, lockState, SubState.NONE);
+    }
+
+    /**
+     /**
+     * Set the states on the automation composition and on all its automation composition elements.
+     *
+     * @param deployState the DeployState we want the automation composition to transition to
+     * @param lockState the LockState we want the automation composition to transition to
+     * @param subState the SubState we want the automation composition to transition to
+     */
+    public static void setCascadedState(final AutomationComposition automationComposition,
+            final DeployState deployState, final LockState lockState, final SubState subState) {
+        automationComposition.setDeployState(deployState);
+        automationComposition.setLockState(lockState);
+        automationComposition.setLastMsg(TimestampHelper.now());
+        automationComposition.setSubState(subState);
+
+        if (MapUtils.isEmpty(automationComposition.getElements())) {
+            return;
+        }
+
+        for (var element : automationComposition.getElements().values()) {
+            element.setDeployState(deployState);
+            element.setLockState(lockState);
+            element.setSubState(subState);
+            element.setMessage(null);
+            element.setStage(null);
+        }
+    }
+}
 
--- /dev/null
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2025 OpenInfra Foundation Europe. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.clamp.models.acm.utils;
+
+import java.util.Map;
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+import org.onap.policy.clamp.models.acm.concepts.AcTypeState;
+import org.onap.policy.clamp.models.acm.concepts.DeployState;
+
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public final class AcmTimeoutUtils {
+    public static final String DEFAULT_TIMEOUT = "maxOperationWaitMs";
+    public static final String PRIME_TIMEOUT = "primeTimeoutMs";
+    public static final String DEPRIME_TIMEOUT = "deprimeTimeoutMs";
+    public static final String DEPLOY_TIMEOUT = "deployTimeoutMs";
+    public static final String UNDEPLOY_TIMEOUT = "undeployTimeoutMs";
+    public static final String UPDATE_TIMEOUT = "updateTimeoutMs";
+    public static final String MIGRATE_TIMEOUT = "migrateTimeoutMs";
+    public static final String DELETE_TIMEOUT = "deleteTimeoutMs";
+
+    public static final Map<DeployState, String> MAP_TIMEOUT = Map.of(DeployState.DEPLOYING, DEPLOY_TIMEOUT,
+            DeployState.UNDEPLOYING, UNDEPLOY_TIMEOUT,
+            DeployState.UPDATING, UPDATE_TIMEOUT,
+            DeployState.MIGRATING, MIGRATE_TIMEOUT,
+            DeployState.DELETING, DELETE_TIMEOUT);
+
+    /**
+     * Get timeout value from properties by name operation, return default value if not present.
+     *
+     * @param properties instance properties
+     * @param name the operation name
+     * @param defaultValue the default value
+     * @return the timeout value
+     */
+    public static long getTimeout(Map<String, Object> properties, String name, long defaultValue) {
+        var objTimeout = properties.get(name);
+        if (objTimeout != null) {
+            return Long.parseLong(objTimeout.toString());
+        }
+        return defaultValue;
+    }
+
+    /**
+     * Get operation name of a composition definition.
+     *
+     * @param state the state of the composition definition
+     * @return the operation name
+     */
+    public static String getOpName(AcTypeState state) {
+        return AcTypeState.PRIMING.equals(state) ? PRIME_TIMEOUT : DEPRIME_TIMEOUT;
+    }
+
+    /**
+     * Get operation name of a AutomationComposition.
+     *
+     * @param deployState the state of the AutomationComposition
+     * @return the operation name
+     */
+    public static String getOpName(DeployState deployState) {
+        return MAP_TIMEOUT.getOrDefault(deployState, DEFAULT_TIMEOUT);
+    }
+}
 
 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionDefinition;
 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionElement;
 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionElementDefinition;
-import org.onap.policy.clamp.models.acm.concepts.DeployState;
-import org.onap.policy.clamp.models.acm.concepts.LockState;
 import org.onap.policy.clamp.models.acm.concepts.MigrationState;
 import org.onap.policy.clamp.models.acm.concepts.NodeTemplateState;
 import org.onap.policy.clamp.models.acm.concepts.ParticipantDefinition;
 import org.onap.policy.clamp.models.acm.concepts.ParticipantDeploy;
 import org.onap.policy.clamp.models.acm.concepts.ParticipantRestartAc;
-import org.onap.policy.clamp.models.acm.concepts.SubState;
 import org.onap.policy.clamp.models.acm.messages.rest.instantiation.DeployOrder;
-import org.onap.policy.clamp.models.acm.messages.rest.instantiation.LockOrder;
 import org.onap.policy.clamp.models.acm.persistence.concepts.StringToMapConverter;
 import org.onap.policy.common.parameters.BeanValidationResult;
 import org.onap.policy.common.parameters.ObjectValidationResult;
      * @return the result of validation
      */
     public static BeanValidationResult validateAutomationComposition(AutomationComposition automationComposition,
-            ToscaServiceTemplate serviceTemplate, String toscaCompositionName, boolean migrateOperation) {
+            ToscaServiceTemplate serviceTemplate, String toscaCompositionName, int removeElement) {
         var result = new BeanValidationResult(ENTRY + automationComposition.getName(), automationComposition);
 
         var map = getMapToscaNodeTemplates(serviceTemplate);
                     .collect(Collectors.toMap(ToscaConceptIdentifier::getName, UnaryOperator.identity()));
             // @formatter:on
 
-            if (definitions.size() != automationComposition.getElements().size()
-                    && !migrateOperation) {
+            if (definitions.size() != (automationComposition.getElements().size() - removeElement)) {
                 result.setResult(ValidationStatus.INVALID,
                             "Elements of the instance not matching with the elements of the composition");
             }
     }
 
     private static ValidationResult validateDefinition(Map<String, ToscaConceptIdentifier> definitions,
-                                                       ToscaConceptIdentifier definition,
-                                                       MigrationState migrationState) {
+            ToscaConceptIdentifier definition, MigrationState migrationState) {
+        if (MigrationState.REMOVED.equals(migrationState)) {
+            return null;
+        }
         var result = new BeanValidationResult(ENTRY + definition.getName(), definition);
         var identifier = definitions.get(definition.getName());
-        if (identifier == null && MigrationState.DEFAULT.equals(migrationState)) {
+        if (identifier == null) {
             result.setResult(ValidationStatus.INVALID, "Not found");
-        } else if (! definition.equals(identifier) && MigrationState.DEFAULT.equals(migrationState)) {
+        } else if (! definition.equals(identifier)) {
             result.setResult(ValidationStatus.INVALID, "Version not matching");
         }
         return (result.isClean() ? null : result);
         // @formatter:on
     }
 
-
-    /**
-     * Return true if DeployState, LockState and SubState are in a Transitional State.
-     *
-     * @param deployState the DeployState
-     * @param lockState the LockState
-     * @param subState the SubState
-     * @return true if there is a state in a Transitional State
-     */
-    public static boolean isInTransitionalState(DeployState deployState, LockState lockState, SubState subState) {
-        return DeployState.DEPLOYING.equals(deployState) || DeployState.UNDEPLOYING.equals(deployState)
-                || LockState.LOCKING.equals(lockState) || LockState.UNLOCKING.equals(lockState)
-                || DeployState.DELETING.equals(deployState) || DeployState.UPDATING.equals(deployState)
-                || DeployState.MIGRATING.equals(deployState) || DeployState.MIGRATION_REVERTING.equals(deployState)
-                || !SubState.NONE.equals(subState);
-    }
-
-    /**
-     * Get DeployOrder from transitional DeployState.
-     *
-     * @param deployState the Deploy State
-     * @return the DeployOrder
-     */
-    public static DeployOrder stateDeployToOrder(DeployState deployState) {
-        return switch (deployState) {
-            case DEPLOYING -> DeployOrder.DEPLOY;
-            case UNDEPLOYING -> DeployOrder.UNDEPLOY;
-            case DELETING -> DeployOrder.DELETE;
-            default -> DeployOrder.NONE;
-        };
-    }
-
-    /**
-     * Get LockOrder from transitional LockState.
-     *
-     * @param lockState the Lock State
-     * @return the LockOrder
-     */
-    public static LockOrder stateLockToOrder(LockState lockState) {
-        if (LockState.LOCKING.equals(lockState)) {
-            return LockOrder.LOCK;
-        } else if (LockState.UNLOCKING.equals(lockState)) {
-            return LockOrder.UNLOCK;
-        }
-        return LockOrder.NONE;
-    }
-
-    /**
-     * Get final DeployState from transitional DeployState.
-     *
-     * @param deployState the DeployState
-     * @return the DeployState
-     */
-    public static DeployState deployCompleted(DeployState deployState) {
-        return switch (deployState) {
-            case MIGRATING, MIGRATION_REVERTING, UPDATING, DEPLOYING -> DeployState.DEPLOYED;
-            case UNDEPLOYING -> DeployState.UNDEPLOYED;
-            case DELETING -> DeployState.DELETED;
-            default -> deployState;
-        };
-    }
-
-    /**
-     * Get final LockState from transitional LockState.
-     *
-     * @param lockState the LockState
-     * @return the LockState
-     */
-    public static LockState lockCompleted(DeployState deployState, LockState lockState) {
-        if (LockState.LOCKING.equals(lockState) || DeployState.DEPLOYING.equals(deployState)) {
-            return LockState.LOCKED;
-        } else if (LockState.UNLOCKING.equals(lockState)) {
-            return LockState.UNLOCKED;
-        } else if (DeployState.UNDEPLOYING.equals(deployState)) {
-            return LockState.NONE;
-        }
-        return lockState;
-    }
-
-    /**
-     * Return true if transition states is Forward.
-     *
-     * @param deployState the DeployState
-     * @param lockState the LockState
-     * @return true if transition if Forward
-     */
-    public static boolean isForward(DeployState deployState, LockState lockState) {
-        return DeployState.DEPLOYING.equals(deployState) || LockState.UNLOCKING.equals(lockState);
-    }
-
-    /**
-     * Set the states on the automation composition and on all its automation composition elements.
-     *
-     * @param deployState the DeployState we want the automation composition to transition to
-     * @param lockState the LockState we want the automation composition to transition to
-     */
-    public static void setCascadedState(final AutomationComposition automationComposition,
-            final DeployState deployState, final LockState lockState) {
-        setCascadedState(automationComposition, deployState, lockState, SubState.NONE);
-    }
-
-    /**
-     /**
-     * Set the states on the automation composition and on all its automation composition elements.
-     *
-     * @param deployState the DeployState we want the automation composition to transition to
-     * @param lockState the LockState we want the automation composition to transition to
-     * @param subState the SubState we want the automation composition to transition to
-     */
-    public static void setCascadedState(final AutomationComposition automationComposition,
-        final DeployState deployState, final LockState lockState, final SubState subState) {
-        automationComposition.setDeployState(deployState);
-        automationComposition.setLockState(lockState);
-        automationComposition.setLastMsg(TimestampHelper.now());
-        automationComposition.setSubState(subState);
-
-        if (MapUtils.isEmpty(automationComposition.getElements())) {
-            return;
-        }
-
-        for (var element : automationComposition.getElements().values()) {
-            element.setDeployState(deployState);
-            element.setLockState(lockState);
-            element.setSubState(subState);
-            element.setMessage(null);
-            element.setStage(null);
-        }
-    }
-
     /**
      * Create a new AcElementDeploy from an AutomationCompositionElement.
      *
 
+++ /dev/null
-/*-
- * ============LICENSE_START=======================================================
- *  Copyright (C) 2021-2023,2025 OpenInfra Foundation Europe. All rights reserved.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * SPDX-License-Identifier: Apache-2.0
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.policy.clamp.models.acm.concepts;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-import java.util.Map;
-import org.junit.jupiter.api.Test;
-import org.onap.policy.clamp.models.acm.utils.CommonTestData;
-import org.onap.policy.common.utils.coder.Coder;
-import org.onap.policy.common.utils.coder.CoderException;
-import org.onap.policy.common.utils.coder.StandardCoder;
-import org.onap.policy.common.utils.resources.ResourceUtils;
-
-class ParticipantUtilsTest {
-
-    private static final Coder CODER = new StandardCoder();
-    private static final String TOSCA_TEMPLATE_YAML = "examples/acm/test-pm-subscription-handling.yaml";
-    private static final String AUTOMATION_COMPOSITION_JSON =
-        "src/test/resources/providers/TestAutomationCompositions.json";
-
-    private static final String PROPERTIES = """
-            stage:
-              prepare: [1,2]
-              migrate: [2,3]
-            """;
-
-
-    @Test
-    void testFindStartPhase() {
-        var identifier = 13;
-        var result = ParticipantUtils.findStartPhase(Map.of("startPhase", identifier));
-        assertThat(result).isEqualTo(identifier);
-    }
-
-    @Test
-    void testGetFirstStartPhase() throws CoderException {
-        var serviceTemplate = CommonTestData.getToscaServiceTemplate(TOSCA_TEMPLATE_YAML);
-        var automationComposition =
-            CODER.decode(ResourceUtils.getResourceAsString(AUTOMATION_COMPOSITION_JSON), AutomationCompositions.class)
-                    .getAutomationCompositionList().get(0);
-        automationComposition.setDeployState(DeployState.DEPLOYING);
-        automationComposition.setLockState(LockState.NONE);
-        var result = ParticipantUtils.getFirstStartPhase(automationComposition, serviceTemplate);
-        assertThat(result).isZero();
-
-        automationComposition.setDeployState(DeployState.DEPLOYED);
-        automationComposition.setLockState(LockState.UNLOCKING);
-        result = ParticipantUtils.getFirstStartPhase(automationComposition, serviceTemplate);
-        assertThat(result).isZero();
-
-        automationComposition.setDeployState(DeployState.UNDEPLOYING);
-        automationComposition.setLockState(LockState.NONE);
-        result = ParticipantUtils.getFirstStartPhase(automationComposition, serviceTemplate);
-        assertThat(result).isEqualTo(1);
-    }
-
-    @Test
-    void testGetFirstStartPhaseWithNull() throws CoderException {
-        var serviceTemplate = CommonTestData.getToscaServiceTemplate(TOSCA_TEMPLATE_YAML);
-        var automationComposition =
-            CODER.decode(ResourceUtils.getResourceAsString(AUTOMATION_COMPOSITION_JSON), AutomationCompositions.class)
-                    .getAutomationCompositionList().get(0);
-        automationComposition.setDeployState(DeployState.DEPLOYING);
-        automationComposition.setLockState(LockState.NONE);
-
-        serviceTemplate.getToscaTopologyTemplate().getNodeTemplates().values()
-            .forEach(node -> node.setVersion("0.0.0"));
-        var result = ParticipantUtils.getFirstStartPhase(automationComposition, serviceTemplate);
-        assertThat(result).isZero();
-
-        automationComposition.setDeployState(DeployState.DEPLOYED);
-        automationComposition.setLockState(LockState.UNLOCKING);
-        result = ParticipantUtils.getFirstStartPhase(automationComposition, serviceTemplate);
-        assertThat(result).isZero();
-
-        automationComposition.setDeployState(DeployState.UNDEPLOYING);
-        automationComposition.setLockState(LockState.NONE);
-        result = ParticipantUtils.getFirstStartPhase(automationComposition, serviceTemplate);
-        assertThat(result).isZero();
-
-        serviceTemplate.getToscaTopologyTemplate().getNodeTemplates().clear();
-        result = ParticipantUtils.getFirstStartPhase(automationComposition, serviceTemplate);
-        assertThat(result).isZero();
-
-        automationComposition.setDeployState(DeployState.DEPLOYED);
-        automationComposition.setLockState(LockState.UNLOCKING);
-        result = ParticipantUtils.getFirstStartPhase(automationComposition, serviceTemplate);
-        assertThat(result).isZero();
-
-        automationComposition.setDeployState(DeployState.UNDEPLOYING);
-        automationComposition.setLockState(LockState.NONE);
-        result = ParticipantUtils.getFirstStartPhase(automationComposition, serviceTemplate);
-        assertThat(result).isZero();
-    }
-
-    @Test
-    void testGetFirstStage() throws CoderException {
-        var serviceTemplate = CommonTestData.getToscaServiceTemplate(TOSCA_TEMPLATE_YAML);
-        var automationComposition =
-            CODER.decode(ResourceUtils.getResourceAsString(AUTOMATION_COMPOSITION_JSON), AutomationCompositions.class)
-                    .getAutomationCompositionList().get(0);
-        automationComposition.setDeployState(DeployState.MIGRATING);
-        var result = ParticipantUtils.getFirstStage(automationComposition, serviceTemplate);
-        assertThat(result).isZero();
-
-        automationComposition.setDeployState(DeployState.UNDEPLOYED);
-        automationComposition.setSubState(SubState.PREPARING);
-        result = ParticipantUtils.getFirstStage(automationComposition, serviceTemplate);
-        assertThat(result).isZero();
-    }
-
-    @Test
-    void testFindStageSetPrepare() {
-        var result = ParticipantUtils.findStageSetPrepare(Map.of());
-        assertThat(result).hasSize(1).contains(0);
-        result = ParticipantUtils.findStageSetPrepare(Map.of("stage", 1));
-        assertThat(result).hasSize(1).contains(0);
-
-        Map<String, Object> map = CommonTestData.getObject(PROPERTIES, Map.class);
-        result = ParticipantUtils.findStageSetPrepare(map);
-        assertThat(result).hasSize(2).contains(1).contains(2);
-    }
-
-    @Test
-    void testFindStageSetMigrate() {
-        var result = ParticipantUtils.findStageSetMigrate(Map.of());
-        assertThat(result).hasSize(1).contains(0);
-        result = ParticipantUtils.findStageSetMigrate(Map.of("stage", 1));
-        assertThat(result).hasSize(1).contains(0);
-
-        Map<String, Object> map = CommonTestData.getObject(PROPERTIES, Map.class);
-        result = ParticipantUtils.findStageSetMigrate(map);
-        assertThat(result).hasSize(2).contains(2).contains(3);
-    }
-
-    @Test
-    void testGetTimeout() {
-        var result = ParticipantUtils.getTimeout(Map.of(), ParticipantUtils.DEPLOY_TIMEOUT, 1000);
-        assertEquals(1000, result);
-
-        result = ParticipantUtils.getTimeout(Map.of(ParticipantUtils.DEPLOY_TIMEOUT, 20000),
-                ParticipantUtils.DEPLOY_TIMEOUT, 1000);
-        assertEquals(20000, result);
-    }
-
-    @Test
-    void testGetOpName() {
-        var result = ParticipantUtils.getOpName(AcTypeState.PRIMING);
-        assertEquals(ParticipantUtils.PRIME_TIMEOUT, result);
-        result = ParticipantUtils.getOpName(AcTypeState.DEPRIMING);
-        assertEquals(ParticipantUtils.DEPRIME_TIMEOUT, result);
-        result = ParticipantUtils.getOpName(DeployState.DEPLOYING);
-        assertEquals(ParticipantUtils.DEPLOY_TIMEOUT, result);
-        result = ParticipantUtils.getOpName(DeployState.UNDEPLOYING);
-        assertEquals(ParticipantUtils.UNDEPLOY_TIMEOUT, result);
-        result = ParticipantUtils.getOpName(DeployState.UPDATING);
-        assertEquals(ParticipantUtils.UPDATE_TIMEOUT, result);
-        result = ParticipantUtils.getOpName(DeployState.DELETING);
-        assertEquals(ParticipantUtils.DELETE_TIMEOUT, result);
-        result = ParticipantUtils.getOpName(DeployState.MIGRATING);
-        assertEquals(ParticipantUtils.MIGRATE_TIMEOUT, result);
-        result = ParticipantUtils.getOpName(DeployState.DEPLOYED);
-        assertEquals(ParticipantUtils.DEFAULT_TIMEOUT, result);
-    }
-}
 
--- /dev/null
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2025 OpenInfra Foundation Europe. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.clamp.models.acm.utils;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.Map;
+import org.junit.jupiter.api.Test;
+import org.onap.policy.clamp.models.acm.concepts.AutomationCompositions;
+import org.onap.policy.clamp.models.acm.concepts.DeployState;
+import org.onap.policy.clamp.models.acm.concepts.LockState;
+import org.onap.policy.clamp.models.acm.concepts.SubState;
+import org.onap.policy.common.utils.resources.ResourceUtils;
+
+class AcmStageUtilsTest {
+
+    private static final String TOSCA_TEMPLATE_YAML = "examples/acm/test-pm-subscription-handling.yaml";
+    private static final String AUTOMATION_COMPOSITION_JSON =
+            "src/test/resources/providers/TestAutomationCompositions.json";
+
+    private static final String PROPERTIES = """
+            stage:
+              prepare: [1,2]
+              migrate: [2,3]
+            """;
+
+    @Test
+    void testFindStartPhase() {
+        var identifier = 13;
+        var result = AcmStageUtils.findStartPhase(Map.of("startPhase", identifier));
+        assertThat(result).isEqualTo(identifier);
+    }
+
+    @Test
+    void testGetFirstStartPhase() {
+        var automationCompositions = CommonTestData.getJson(
+                ResourceUtils.getResourceAsString(AUTOMATION_COMPOSITION_JSON), AutomationCompositions.class);
+        assertThat(automationCompositions).isNotNull();
+        var automationComposition = automationCompositions.getAutomationCompositionList().get(0);
+        automationComposition.setDeployState(DeployState.DEPLOYING);
+        automationComposition.setLockState(LockState.NONE);
+        var serviceTemplate = CommonTestData.getToscaServiceTemplate(TOSCA_TEMPLATE_YAML);
+        var result = AcmStageUtils.getFirstStartPhase(automationComposition, serviceTemplate);
+        assertThat(result).isZero();
+
+        automationComposition.setDeployState(DeployState.DEPLOYED);
+        automationComposition.setLockState(LockState.UNLOCKING);
+        result = AcmStageUtils.getFirstStartPhase(automationComposition, serviceTemplate);
+        assertThat(result).isZero();
+
+        automationComposition.setDeployState(DeployState.UNDEPLOYING);
+        automationComposition.setLockState(LockState.NONE);
+        result = AcmStageUtils.getFirstStartPhase(automationComposition, serviceTemplate);
+        assertThat(result).isEqualTo(1);
+    }
+
+    @Test
+    void testGetFirstStartPhaseWithNull() {
+        var automationCompositions = CommonTestData.getJson(
+                ResourceUtils.getResourceAsString(AUTOMATION_COMPOSITION_JSON), AutomationCompositions.class);
+        assertThat(automationCompositions).isNotNull();
+        var automationComposition = automationCompositions.getAutomationCompositionList().get(0);
+        automationComposition.setDeployState(DeployState.DEPLOYING);
+        automationComposition.setLockState(LockState.NONE);
+
+        var serviceTemplate = CommonTestData.getToscaServiceTemplate(TOSCA_TEMPLATE_YAML);
+        assertThat(serviceTemplate).isNotNull();
+        serviceTemplate.getToscaTopologyTemplate().getNodeTemplates().values()
+                .forEach(node -> node.setVersion("0.0.0"));
+        var result = AcmStageUtils.getFirstStartPhase(automationComposition, serviceTemplate);
+        assertThat(result).isZero();
+
+        automationComposition.setDeployState(DeployState.DEPLOYED);
+        automationComposition.setLockState(LockState.UNLOCKING);
+        result = AcmStageUtils.getFirstStartPhase(automationComposition, serviceTemplate);
+        assertThat(result).isZero();
+
+        automationComposition.setDeployState(DeployState.UNDEPLOYING);
+        automationComposition.setLockState(LockState.NONE);
+        result = AcmStageUtils.getFirstStartPhase(automationComposition, serviceTemplate);
+        assertThat(result).isZero();
+
+        serviceTemplate.getToscaTopologyTemplate().getNodeTemplates().clear();
+        result = AcmStageUtils.getFirstStartPhase(automationComposition, serviceTemplate);
+        assertThat(result).isZero();
+
+        automationComposition.setDeployState(DeployState.DEPLOYED);
+        automationComposition.setLockState(LockState.UNLOCKING);
+        result = AcmStageUtils.getFirstStartPhase(automationComposition, serviceTemplate);
+        assertThat(result).isZero();
+
+        automationComposition.setDeployState(DeployState.UNDEPLOYING);
+        automationComposition.setLockState(LockState.NONE);
+        result = AcmStageUtils.getFirstStartPhase(automationComposition, serviceTemplate);
+        assertThat(result).isZero();
+    }
+
+    @Test
+    void testGetFirstStage() {
+        var serviceTemplate = CommonTestData.getToscaServiceTemplate(TOSCA_TEMPLATE_YAML);
+        var automationCompositions = CommonTestData.getJson(
+                ResourceUtils.getResourceAsString(AUTOMATION_COMPOSITION_JSON), AutomationCompositions.class);
+        assertThat(automationCompositions).isNotNull();
+        var automationComposition = automationCompositions.getAutomationCompositionList().get(0);
+        AcmStateUtils.setCascadedState(automationComposition, DeployState.MIGRATING, LockState.LOCKED);
+        var result = AcmStageUtils.getFirstStage(automationComposition, serviceTemplate);
+        assertThat(result).isZero();
+
+        AcmStateUtils.setCascadedState(automationComposition, DeployState.UNDEPLOYED, LockState.NONE);
+        automationComposition.setSubState(SubState.PREPARING);
+        result = AcmStageUtils.getFirstStage(automationComposition, serviceTemplate);
+        assertThat(result).isZero();
+    }
+
+    @Test
+    void testFindStageSetPrepare() {
+        var result = AcmStageUtils.findStageSetPrepare(Map.of());
+        assertThat(result).hasSize(1).contains(0);
+        result = AcmStageUtils.findStageSetPrepare(Map.of("stage", 1));
+        assertThat(result).hasSize(1).contains(0);
+
+        Map<String, Object> map = CommonTestData.getObject(PROPERTIES, Map.class);
+        result = AcmStageUtils.findStageSetPrepare(map);
+        assertThat(result).hasSize(2).contains(1).contains(2);
+    }
+
+    @Test
+    void testFindStageSetMigrate() {
+        var result = AcmStageUtils.findStageSetMigrate(Map.of());
+        assertThat(result).hasSize(1).contains(0);
+        result = AcmStageUtils.findStageSetMigrate(Map.of("stage", 1));
+        assertThat(result).hasSize(1).contains(0);
+
+        Map<String, Object> map = CommonTestData.getObject(PROPERTIES, Map.class);
+        result = AcmStageUtils.findStageSetMigrate(map);
+        assertThat(result).hasSize(2).contains(2).contains(3);
+    }
+
+}
 
--- /dev/null
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2025 OpenInfra Foundation Europe. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.clamp.models.acm.utils;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import org.junit.jupiter.api.Test;
+import org.onap.policy.clamp.models.acm.concepts.AcTypeState;
+import org.onap.policy.clamp.models.acm.concepts.DeployState;
+import org.onap.policy.clamp.models.acm.concepts.LockState;
+import org.onap.policy.clamp.models.acm.concepts.SubState;
+import org.onap.policy.clamp.models.acm.messages.rest.instantiation.DeployOrder;
+import org.onap.policy.clamp.models.acm.messages.rest.instantiation.LockOrder;
+
+class AcmStateUtilsTest {
+
+    @Test
+    void testIsInTransitionalState() {
+        assertFalse(AcmStateUtils.isInTransitionalState(DeployState.DEPLOYED, LockState.LOCKED, SubState.NONE));
+        assertTrue(AcmStateUtils.isInTransitionalState(DeployState.DEPLOYING, LockState.NONE, SubState.NONE));
+        assertTrue(AcmStateUtils.isInTransitionalState(DeployState.UNDEPLOYING, LockState.NONE, SubState.NONE));
+        assertTrue(AcmStateUtils.isInTransitionalState(DeployState.DEPLOYED, LockState.LOCKING, SubState.NONE));
+        assertTrue(AcmStateUtils.isInTransitionalState(DeployState.DEPLOYED, LockState.UNLOCKING, SubState.NONE));
+        assertTrue(AcmStateUtils.isInTransitionalState(DeployState.DELETING, LockState.NONE, SubState.NONE));
+        assertTrue(AcmStateUtils.isInTransitionalState(DeployState.UPDATING, LockState.LOCKED, SubState.NONE));
+        assertTrue(AcmStateUtils.isInTransitionalState(DeployState.MIGRATING, LockState.LOCKED, SubState.NONE));
+        assertTrue(AcmStateUtils.isInTransitionalState(DeployState.MIGRATION_REVERTING, LockState.LOCKED,
+                SubState.NONE));
+        assertTrue(AcmStateUtils.isInTransitionalState(DeployState.DEPLOYED, LockState.LOCKED,
+                SubState.MIGRATION_PRECHECKING));
+    }
+
+    @Test
+    void testCompositionIsInTransitionalState() {
+        assertTrue(AcmStateUtils.isInTransitionalState(AcTypeState.PRIMING));
+        assertTrue(AcmStateUtils.isInTransitionalState(AcTypeState.DEPRIMING));
+        assertFalse(AcmStateUtils.isInTransitionalState(AcTypeState.PRIMED));
+        assertFalse(AcmStateUtils.isInTransitionalState(AcTypeState.COMMISSIONED));
+    }
+
+    @Test
+    void testStateDeployToOrder() {
+        // from transitional state to order state
+        assertEquals(DeployOrder.DEPLOY, AcmStateUtils.stateDeployToOrder(DeployState.DEPLOYING));
+        assertEquals(DeployOrder.UNDEPLOY, AcmStateUtils.stateDeployToOrder(DeployState.UNDEPLOYING));
+        assertEquals(DeployOrder.DELETE, AcmStateUtils.stateDeployToOrder(DeployState.DELETING));
+        assertEquals(DeployOrder.NONE, AcmStateUtils.stateDeployToOrder(DeployState.DEPLOYED));
+    }
+
+    @Test
+    void testStateLockToOrder() {
+        // from transitional state to order state
+        assertEquals(LockOrder.LOCK, AcmStateUtils.stateLockToOrder(LockState.LOCKING));
+        assertEquals(LockOrder.UNLOCK, AcmStateUtils.stateLockToOrder(LockState.UNLOCKING));
+        assertEquals(LockOrder.NONE, AcmStateUtils.stateLockToOrder(LockState.NONE));
+    }
+
+    @Test
+    void testDeployCompleted() {
+        // from transitional state to final state
+        assertEquals(DeployState.DEPLOYED, AcmStateUtils.deployCompleted(DeployState.DEPLOYING));
+        assertEquals(DeployState.UNDEPLOYED, AcmStateUtils.deployCompleted(DeployState.UNDEPLOYING));
+        assertEquals(DeployState.DEPLOYED, AcmStateUtils.deployCompleted(DeployState.DEPLOYED));
+        assertEquals(DeployState.DELETED, AcmStateUtils.deployCompleted(DeployState.DELETING));
+    }
+
+    @Test
+    void testLockCompleted() {
+        // from transitional state to final state
+        assertEquals(LockState.LOCKED, AcmStateUtils.lockCompleted(DeployState.DEPLOYING, LockState.NONE));
+        assertEquals(LockState.LOCKED, AcmStateUtils.lockCompleted(DeployState.DEPLOYED, LockState.LOCKING));
+        assertEquals(LockState.UNLOCKED, AcmStateUtils.lockCompleted(DeployState.DEPLOYED, LockState.UNLOCKING));
+        assertEquals(LockState.NONE, AcmStateUtils.lockCompleted(DeployState.UNDEPLOYING, LockState.LOCKED));
+    }
+
+    @Test
+    void testIsForward() {
+        assertTrue(AcmStateUtils.isForward(DeployState.DEPLOYING, LockState.NONE));
+        assertTrue(AcmStateUtils.isForward(DeployState.DEPLOYED, LockState.UNLOCKING));
+        assertFalse(AcmStateUtils.isForward(DeployState.DEPLOYED, LockState.LOCKING));
+        assertFalse(AcmStateUtils.isForward(DeployState.UNDEPLOYING, LockState.LOCKED));
+    }
+
+    @Test
+    void testIsMigratingForward() {
+        assertTrue(AcmStateUtils.isMigrationForward(DeployState.MIGRATING));
+        assertFalse(AcmStateUtils.isMigrationForward(DeployState.MIGRATION_REVERTING));
+    }
+
+    @Test
+    void testIsMigrating() {
+        assertTrue(AcmStateUtils.isMigrating(DeployState.MIGRATING));
+        assertTrue(AcmStateUtils.isMigrating(DeployState.MIGRATION_REVERTING));
+        assertFalse(AcmStateUtils.isMigrating(DeployState.DEPLOYING));
+        assertFalse(AcmStateUtils.isMigrating(DeployState.DEPLOYED));
+    }
+}
 
--- /dev/null
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2025 OpenInfra Foundation Europe. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.clamp.models.acm.utils;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import java.util.Map;
+import org.junit.jupiter.api.Test;
+import org.onap.policy.clamp.models.acm.concepts.AcTypeState;
+import org.onap.policy.clamp.models.acm.concepts.DeployState;
+
+class AcmTimeoutUtilsTest {
+
+    @Test
+    void testGetTimeout() {
+        var result = AcmTimeoutUtils.getTimeout(Map.of(), AcmTimeoutUtils.DEPLOY_TIMEOUT, 1000);
+        assertEquals(1000, result);
+
+        result = AcmTimeoutUtils.getTimeout(Map.of(AcmTimeoutUtils.DEPLOY_TIMEOUT, 20000),
+                AcmTimeoutUtils.DEPLOY_TIMEOUT, 1000);
+        assertEquals(20000, result);
+    }
+
+    @Test
+    void testGetOpName() {
+        var result = AcmTimeoutUtils.getOpName(AcTypeState.PRIMING);
+        assertEquals(AcmTimeoutUtils.PRIME_TIMEOUT, result);
+        result = AcmTimeoutUtils.getOpName(AcTypeState.DEPRIMING);
+        assertEquals(AcmTimeoutUtils.DEPRIME_TIMEOUT, result);
+        result = AcmTimeoutUtils.getOpName(DeployState.DEPLOYING);
+        assertEquals(AcmTimeoutUtils.DEPLOY_TIMEOUT, result);
+        result = AcmTimeoutUtils.getOpName(DeployState.UNDEPLOYING);
+        assertEquals(AcmTimeoutUtils.UNDEPLOY_TIMEOUT, result);
+        result = AcmTimeoutUtils.getOpName(DeployState.UPDATING);
+        assertEquals(AcmTimeoutUtils.UPDATE_TIMEOUT, result);
+        result = AcmTimeoutUtils.getOpName(DeployState.DELETING);
+        assertEquals(AcmTimeoutUtils.DELETE_TIMEOUT, result);
+        result = AcmTimeoutUtils.getOpName(DeployState.MIGRATING);
+        assertEquals(AcmTimeoutUtils.MIGRATE_TIMEOUT, result);
+        result = AcmTimeoutUtils.getOpName(DeployState.DEPLOYED);
+        assertEquals(AcmTimeoutUtils.DEFAULT_TIMEOUT, result);
+    }
+}
 
 import org.onap.policy.clamp.models.acm.concepts.AutomationComposition;
 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionDefinition;
 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionElement;
-import org.onap.policy.clamp.models.acm.concepts.DeployState;
-import org.onap.policy.clamp.models.acm.concepts.LockState;
-import org.onap.policy.clamp.models.acm.concepts.SubState;
 import org.onap.policy.clamp.models.acm.document.concepts.DocToscaServiceTemplate;
 import org.onap.policy.clamp.models.acm.messages.rest.instantiation.DeployOrder;
-import org.onap.policy.clamp.models.acm.messages.rest.instantiation.LockOrder;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaDataType;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate;
             "org.onap.policy.clamp.acm.AutomationCompositionElement";
     public static final String AUTOMATION_COMPOSITION_NODE_TYPE = "org.onap.policy.clamp.acm.AutomationComposition";
 
-    @Test
-    void testIsInTransitionalState() {
-        assertThat(AcmUtils.isInTransitionalState(DeployState.DEPLOYED, LockState.LOCKED, SubState.NONE)).isFalse();
-        assertThat(AcmUtils.isInTransitionalState(DeployState.DEPLOYING, LockState.NONE, SubState.NONE)).isTrue();
-        assertThat(AcmUtils.isInTransitionalState(DeployState.UNDEPLOYING, LockState.NONE, SubState.NONE)).isTrue();
-        assertThat(AcmUtils.isInTransitionalState(DeployState.DEPLOYED, LockState.LOCKING, SubState.NONE)).isTrue();
-        assertThat(AcmUtils.isInTransitionalState(DeployState.DEPLOYED, LockState.UNLOCKING, SubState.NONE)).isTrue();
-        assertThat(AcmUtils.isInTransitionalState(DeployState.DELETING, LockState.NONE, SubState.NONE)).isTrue();
-        assertThat(AcmUtils.isInTransitionalState(DeployState.UPDATING, LockState.LOCKED, SubState.NONE)).isTrue();
-        assertThat(AcmUtils.isInTransitionalState(DeployState.MIGRATING, LockState.LOCKED, SubState.NONE)).isTrue();
-        assertThat(AcmUtils.isInTransitionalState(DeployState.MIGRATION_REVERTING, LockState.LOCKED,
-                SubState.NONE)).isTrue();
-        assertThat(AcmUtils.isInTransitionalState(DeployState.DEPLOYED, LockState.LOCKED,
-                SubState.MIGRATION_PRECHECKING)).isTrue();
-    }
-
     @Test
     void testCheckIfNodeTemplateIsAutomationCompositionElement() {
         var serviceTemplate = CommonTestData.getToscaServiceTemplate(TOSCA_TEMPLATE_YAML);
         var doc = new DocToscaServiceTemplate(CommonTestData.getToscaServiceTemplate(TOSCA_TEMPLATE_YAML));
         var automationComposition = CommonTestData.getJsonObject(AC_INSTANTIATION_JSON, AutomationComposition.class);
         var result = AcmUtils.validateAutomationComposition(automationComposition, doc.toAuthorative(),
-                AUTOMATION_COMPOSITION_NODE_TYPE, false);
+                AUTOMATION_COMPOSITION_NODE_TYPE, 0);
         assertTrue(result.isValid());
 
         var element = automationComposition.getElements().values().iterator().next();
         automationComposition.getElements().remove(element.getId());
         result = AcmUtils.validateAutomationComposition(automationComposition, doc.toAuthorative(),
-                AUTOMATION_COMPOSITION_NODE_TYPE, false);
+                AUTOMATION_COMPOSITION_NODE_TYPE, 0);
         assertFalse(result.isValid());
         assertThat(result.getMessage()).contains("not matching");
     }
         var automationComposition = getDummyAutomationComposition();
         var toscaServiceTemplate = getDummyToscaServiceTemplate();
         var result = AcmUtils.validateAutomationComposition(automationComposition,
-                toscaServiceTemplate, AUTOMATION_COMPOSITION_NODE_TYPE, false);
+                toscaServiceTemplate, AUTOMATION_COMPOSITION_NODE_TYPE, 0);
         assertNotNull(result);
         assertFalse(result.isValid());
 
         nodeTemplates.put("org.onap.dcae.acm.DCAEMicroserviceAutomationCompositionParticipant", nodeTemplate);
         toscaServiceTemplate.getToscaTopologyTemplate().setNodeTemplates(nodeTemplates);
         result = AcmUtils.validateAutomationComposition(automationComposition, toscaServiceTemplate,
-                AUTOMATION_COMPOSITION_NODE_TYPE, false);
+                AUTOMATION_COMPOSITION_NODE_TYPE, 0);
         assertFalse(result.isValid());
 
         var doc = new DocToscaServiceTemplate(CommonTestData.getToscaServiceTemplate(TOSCA_TEMPLATE_YAML));
         result = AcmUtils.validateAutomationComposition(automationComposition, doc.toAuthorative(),
-                AUTOMATION_COMPOSITION_NODE_TYPE, false);
+                AUTOMATION_COMPOSITION_NODE_TYPE, 0);
         assertFalse(result.isValid());
     }
 
-    @Test
-    void testStateDeployToOrder() {
-        // from transitional state to order state
-        assertEquals(DeployOrder.DEPLOY, AcmUtils.stateDeployToOrder(DeployState.DEPLOYING));
-        assertEquals(DeployOrder.UNDEPLOY, AcmUtils.stateDeployToOrder(DeployState.UNDEPLOYING));
-        assertEquals(DeployOrder.DELETE, AcmUtils.stateDeployToOrder(DeployState.DELETING));
-        assertEquals(DeployOrder.NONE, AcmUtils.stateDeployToOrder(DeployState.DEPLOYED));
-    }
-
-    @Test
-    void testStateLockToOrder() {
-        // from transitional state to order state
-        assertEquals(LockOrder.LOCK, AcmUtils.stateLockToOrder(LockState.LOCKING));
-        assertEquals(LockOrder.UNLOCK, AcmUtils.stateLockToOrder(LockState.UNLOCKING));
-        assertEquals(LockOrder.NONE, AcmUtils.stateLockToOrder(LockState.NONE));
-    }
-
-    @Test
-    void testDeployCompleted() {
-        // from transitional state to final state
-        assertEquals(DeployState.DEPLOYED, AcmUtils.deployCompleted(DeployState.DEPLOYING));
-        assertEquals(DeployState.UNDEPLOYED, AcmUtils.deployCompleted(DeployState.UNDEPLOYING));
-        assertEquals(DeployState.DEPLOYED, AcmUtils.deployCompleted(DeployState.DEPLOYED));
-        assertEquals(DeployState.DELETED, AcmUtils.deployCompleted(DeployState.DELETING));
-    }
-
-    @Test
-    void testLockCompleted() {
-        // from transitional state to final state
-        assertEquals(LockState.LOCKED, AcmUtils.lockCompleted(DeployState.DEPLOYING, LockState.NONE));
-        assertEquals(LockState.LOCKED, AcmUtils.lockCompleted(DeployState.DEPLOYED, LockState.LOCKING));
-        assertEquals(LockState.UNLOCKED, AcmUtils.lockCompleted(DeployState.DEPLOYED, LockState.UNLOCKING));
-        assertEquals(LockState.NONE, AcmUtils.lockCompleted(DeployState.UNDEPLOYING, LockState.LOCKED));
-    }
-
-    @Test
-    void testIsForward() {
-        assertTrue(AcmUtils.isForward(DeployState.DEPLOYING, LockState.NONE));
-        assertTrue(AcmUtils.isForward(DeployState.DEPLOYED, LockState.UNLOCKING));
-        assertFalse(AcmUtils.isForward(DeployState.DEPLOYED, LockState.LOCKING));
-        assertFalse(AcmUtils.isForward(DeployState.UNDEPLOYING, LockState.LOCKED));
-    }
-
     @Test
     void testCreateAcElementDeploy() {
         var element = getDummyAutomationComposition().getElements().values().iterator().next();
 
         }
     }
 
+    /**
+     * Get Object from json string.
+     *
+     * @param json the json
+     * @param clazz the Class of the Object
+     * @return the Object
+     */
+    public static <T> T getJson(final String json, Class<T> clazz) {
+        try {
+            return CODER.decode(json, clazz);
+        } catch (CoderException e) {
+            fail("Cannot decode " + json);
+            return null;
+        }
+    }
+
     /**
      * Get new AutomationCompositionElementDefinition.
      *
 
      */
     @Override
     public void deploy(CompositionElementDto compositionElement, InstanceElementDto instanceElement) {
-        LOGGER.debug("deploy call compositionElement: {}, instanceElement: {}", compositionElement, instanceElement);
+        LOGGER.info("deploy call compositionElement: {}, instanceElement: {}", compositionElement, instanceElement);
         simulatorService.deploy(instanceElement.instanceId(), instanceElement.elementId(),
                 instanceElement.outProperties());
     }
      */
     @Override
     public void undeploy(CompositionElementDto compositionElement, InstanceElementDto instanceElement) {
-        LOGGER.debug("undeploy call compositionElement: {}, instanceElement: {}", compositionElement, instanceElement);
+        LOGGER.info("undeploy call compositionElement: {}, instanceElement: {}", compositionElement, instanceElement);
         simulatorService.undeploy(instanceElement.instanceId(), instanceElement.elementId(),
                 instanceElement.outProperties());
     }
 
     @Override
     public void lock(CompositionElementDto compositionElement, InstanceElementDto instanceElement) {
-        LOGGER.debug("lock call compositionElement: {}, instanceElement: {}", compositionElement, instanceElement);
+        LOGGER.info("lock call compositionElement: {}, instanceElement: {}", compositionElement, instanceElement);
         simulatorService.lock(instanceElement.instanceId(), instanceElement.elementId());
     }
 
     @Override
     public void unlock(CompositionElementDto compositionElement, InstanceElementDto instanceElement) {
-        LOGGER.debug("unlock call compositionElement: {}, instanceElement: {}", compositionElement, instanceElement);
+        LOGGER.info("unlock call compositionElement: {}, instanceElement: {}", compositionElement, instanceElement);
         simulatorService.unlock(instanceElement.instanceId(), instanceElement.elementId());
     }
 
     @Override
     public void delete(CompositionElementDto compositionElement, InstanceElementDto instanceElement) {
-        LOGGER.debug("delete call compositionElement: {}, instanceElement: {}", compositionElement, instanceElement);
+        LOGGER.info("delete call compositionElement: {}, instanceElement: {}", compositionElement, instanceElement);
         simulatorService.delete(instanceElement.instanceId(), instanceElement.elementId());
     }
 
     @Override
     public void update(CompositionElementDto compositionElement, InstanceElementDto instanceElement,
                        InstanceElementDto instanceElementUpdated) {
-        LOGGER.debug("update call compositionElement: {}, instanceElement: {}, instanceElementUpdated: {}",
+        LOGGER.info("update call compositionElement: {}, instanceElement: {}, instanceElementUpdated: {}",
                 compositionElement, instanceElement, instanceElementUpdated);
         simulatorService.update(instanceElement.instanceId(), instanceElement.elementId());
     }
 
     @Override
     public void prime(CompositionDto composition) {
-        LOGGER.debug("prime call composition: {}", composition);
+        LOGGER.info("prime call composition: {}", composition);
         simulatorService.prime(composition);
     }
 
     @Override
     public void deprime(CompositionDto composition) {
-        LOGGER.debug("deprime call composition: {}", composition);
+        LOGGER.info("deprime call composition: {}", composition);
         simulatorService.deprime(composition);
     }
 
     @Override
     public void migrate(CompositionElementDto compositionElement, CompositionElementDto compositionElementTarget,
                         InstanceElementDto instanceElement, InstanceElementDto instanceElementMigrate, int stage) {
-        LOGGER.debug("migrate call compositionElement: {}, compositionElementTarget: {}, instanceElement: {},"
+        LOGGER.info("migrate call compositionElement: {}, compositionElementTarget: {}, instanceElement: {},"
                 + " instanceElementMigrate: {}, stage: {}",
             compositionElement, compositionElementTarget, instanceElement, instanceElementMigrate, stage);
 
         if (ElementState.REMOVED.equals(instanceElementMigrate.state())) {
             simulatorService.deleteInMigration(instanceElement.instanceId(), instanceElement.elementId());
         } else {
+            var nextStage = intermediaryApi.getMigrateNextStage(compositionElementTarget, stage);
             simulatorService.migrate(instanceElementMigrate.instanceId(), instanceElementMigrate.elementId(), stage,
-                    compositionElementTarget.inProperties(), instanceElementMigrate.outProperties());
+                    nextStage, instanceElementMigrate.outProperties());
         }
     }
 
     public void migratePrecheck(CompositionElementDto compositionElement,
             CompositionElementDto compositionElementTarget, InstanceElementDto instanceElement,
             InstanceElementDto instanceElementMigrate) {
-        LOGGER.debug("migrate precheck call compositionElement: {}, compositionElementTarget: {}, instanceElement: {},"
+        LOGGER.info("migrate precheck call compositionElement: {}, compositionElementTarget: {}, instanceElement: {},"
                         + " instanceElementMigrate: {}",
                 compositionElement, compositionElementTarget, instanceElement, instanceElementMigrate);
         simulatorService.migratePrecheck(instanceElement.instanceId(), instanceElement.elementId());
 
     @Override
     public void prepare(CompositionElementDto compositionElement, InstanceElementDto instanceElement, int stage) {
-        LOGGER.debug("prepare call compositionElement: {}, instanceElement: {}", compositionElement, instanceElement);
+        LOGGER.info("prepare call compositionElement: {}, instanceElement: {}", compositionElement, instanceElement);
+        var nextStage = intermediaryApi.getPrepareNextStage(compositionElement, stage);
         simulatorService.prepare(instanceElement.instanceId(), instanceElement.elementId(),
-                stage, compositionElement.inProperties(), instanceElement.outProperties());
+                stage, nextStage, instanceElement.outProperties());
     }
 
     @Override
     public void review(CompositionElementDto compositionElement, InstanceElementDto instanceElement) {
-        LOGGER.debug("review call compositionElement: {}, instanceElement: {}", compositionElement, instanceElement);
+        LOGGER.info("review call compositionElement: {}, instanceElement: {}", compositionElement, instanceElement);
         simulatorService.review(instanceElement.instanceId(), instanceElement.elementId());
     }
 
     public void rollbackMigration(CompositionElementDto compositionElement,
             CompositionElementDto compositionElementRollback, InstanceElementDto instanceElement,
             InstanceElementDto instanceElementRollback, int stage) {
-        LOGGER.debug("rollback call compositionElement: {}, compositionElementRollback: {}, instanceElement: {},"
+        LOGGER.info("rollback call compositionElement: {}, compositionElementRollback: {}, instanceElement: {},"
                         + " instanceElementRollback: {}, stage: {}",
                 compositionElement, compositionElementRollback, instanceElement, instanceElementRollback, stage);
 
         if (ElementState.REMOVED.equals(instanceElementRollback.state())) {
             simulatorService.deleteInRollback(instanceElement.instanceId(), instanceElement.elementId());
         } else {
+            var nextStage = intermediaryApi.getRollbackNextStage(compositionElementRollback, stage);
             simulatorService.rollback(instanceElementRollback.instanceId(), instanceElementRollback.elementId(), stage,
-                    compositionElementRollback.inProperties(), instanceElementRollback.outProperties());
+                    nextStage, instanceElementRollback.outProperties());
         }
     }
 }
 
 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositions;
 import org.onap.policy.clamp.models.acm.concepts.DeployState;
 import org.onap.policy.clamp.models.acm.concepts.LockState;
-import org.onap.policy.clamp.models.acm.concepts.ParticipantUtils;
 import org.onap.policy.clamp.models.acm.concepts.StateChangeResult;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
 import org.slf4j.Logger;
      * @param instanceId              the instanceId
      * @param elementId               the elementId
      * @param stage                   the stage
-     * @param compositionInProperties in Properties from composition definition element
+     * @param nextStage               the next stage
      * @param instanceOutProperties   in Properties from instance element
      */
-    public void migrate(UUID instanceId, UUID elementId, int stage, Map<String, Object> compositionInProperties,
+    public void migrate(UUID instanceId, UUID elementId, int stage, int nextStage,
                         Map<String, Object> instanceOutProperties) {
         if (isInterrupted(getConfig().getMigrateTimerMs(),
             "Current Thread migrate is Interrupted during execution {}", elementId)) {
         }
 
         if (config.isMigrateSuccess()) {
-            var stageSet = ParticipantUtils.findStageSetMigrate(compositionInProperties);
-            var nextStage = 1000;
-            for (var s : stageSet) {
-                if (s > stage) {
-                    nextStage = Math.min(s, nextStage);
-                }
-            }
             instanceOutProperties.putIfAbsent(MIGRATION_PROPERTY, new ArrayList<>());
             @SuppressWarnings("unchecked")
             var stageList = (List<Integer>) instanceOutProperties.get(MIGRATION_PROPERTY);
             stageList.add(stage);
             intermediaryApi.sendAcElementInfo(instanceId, elementId, null, null, instanceOutProperties);
-            if (nextStage == 1000) {
+            if (nextStage == stage) {
                 intermediaryApi.updateAutomationCompositionElementState(
                     instanceId, elementId,
                     DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Migrated");
      * @param instanceId              the instanceId
      * @param elementId               the elementId
      * @param stage                   the stage
-     * @param compositionInProperties in Properties from composition definition element
+     * @param nextStage               the next stage
      * @param instanceOutProperties   in Properties from instance element
      */
-    public void prepare(UUID instanceId, UUID elementId, int stage, Map<String, Object> compositionInProperties,
+    public void prepare(UUID instanceId, UUID elementId, int stage, int nextStage,
                         Map<String, Object> instanceOutProperties) {
         if (isInterrupted(config.getPrepareTimerMs(),
             "Current Thread prepare is Interrupted during execution {}", elementId)) {
         }
 
         if (config.isPrepare()) {
-            var stageSet = ParticipantUtils.findStageSetPrepare(compositionInProperties);
-            var nextStage = 1000;
-            for (var s : stageSet) {
-                if (s > stage) {
-                    nextStage = Math.min(s, nextStage);
-                }
-            }
             instanceOutProperties.putIfAbsent(PREPARE_PROPERTY, new ArrayList<>());
             @SuppressWarnings("unchecked")
             var stageList = (List<Integer>) instanceOutProperties.get(PREPARE_PROPERTY);
             stageList.add(stage);
             intermediaryApi.sendAcElementInfo(instanceId, elementId, null, null, instanceOutProperties);
-            if (nextStage == 1000) {
+            if (nextStage == stage) {
                 intermediaryApi.updateAutomationCompositionElementState(instanceId, elementId,
                     DeployState.UNDEPLOYED, null, StateChangeResult.NO_ERROR, "Prepare completed");
             } else {
      * @param instanceId              the instanceId
      * @param elementId               the elementId
      * @param stage                   the stage
-     * @param compositionInProperties in Properties from composition definition element
+     * @param nextStage               the next stage
      * @param instanceOutProperties   in Properties from instance element
      */
-    public void rollback(UUID instanceId, UUID elementId, int stage, Map<String, Object> compositionInProperties,
+    public void rollback(UUID instanceId, UUID elementId, int stage, int nextStage,
             Map<String, Object> instanceOutProperties) {
         if (isInterrupted(getConfig().getRollbackTimerMs(),
             "Current Thread for rollback was Interrupted during execution {}", instanceId)) {
         }
 
         if (config.isRollback()) {
-            var stageSet = ParticipantUtils.findStageSetMigrate(compositionInProperties);
-            var nextStage = 1000;
-            for (var s : stageSet) {
-                if (s > stage) {
-                    nextStage = Math.min(s, nextStage);
-                }
-            }
             instanceOutProperties.putIfAbsent(ROLLBACK_PROPERTY, new ArrayList<>());
             @SuppressWarnings("unchecked")
             var stageList = (List<Integer>) instanceOutProperties.get(ROLLBACK_PROPERTY);
             stageList.add(stage);
             intermediaryApi.sendAcElementInfo(instanceId, elementId, null, null, instanceOutProperties);
-            if (nextStage == 1000) {
+            if (nextStage == stage) {
                 intermediaryApi.updateAutomationCompositionElementState(
                         instanceId, elementId,
                         DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Migration rollback done");
 
 package org.onap.policy.clamp.acm.participant.sim.main.handler;
 
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
 
 import java.util.HashMap;
 import org.onap.policy.clamp.acm.participant.intermediary.api.ElementState;
 import org.onap.policy.clamp.acm.participant.intermediary.api.InstanceElementDto;
 import org.onap.policy.clamp.acm.participant.intermediary.api.ParticipantIntermediaryApi;
+import org.onap.policy.clamp.acm.participant.intermediary.api.impl.ParticipantIntermediaryApiImpl;
 import org.onap.policy.clamp.acm.participant.sim.comm.CommonTestData;
 import org.onap.policy.clamp.models.acm.concepts.AcTypeState;
 import org.onap.policy.clamp.models.acm.concepts.DeployState;
     @Test
     void testMigrateStage() {
         var config = CommonTestData.createSimConfig();
-        var intermediaryApi = mock(ParticipantIntermediaryApi.class);
+        var intermediaryApi = spy(new ParticipantIntermediaryApiImpl(mock(), mock()));
         var simulatorService = new SimulatorService(intermediaryApi);
         var acElementHandler = new AutomationCompositionElementHandler(intermediaryApi, simulatorService);
         simulatorService.setConfig(config);
     @Test
     void testMigrateAdd() {
         var config = CommonTestData.createSimConfig();
-        var intermediaryApi = mock(ParticipantIntermediaryApi.class);
+        var intermediaryApi = spy(new ParticipantIntermediaryApiImpl(mock(), mock()));
         var simulatorService = new SimulatorService(intermediaryApi);
         var acElementHandler = new AutomationCompositionElementHandler(intermediaryApi, simulatorService);
         simulatorService.setConfig(config);
             null, StateChangeResult.FAILED, "Migration rollback failed");
     }
 
-
     @Test
     void testRollbackStage() {
         var config = CommonTestData.createSimConfig();
-        var intermediaryApi = mock(ParticipantIntermediaryApi.class);
+        var intermediaryApi = spy(new ParticipantIntermediaryApiImpl(mock(), mock()));
         var simulatorService = new SimulatorService(intermediaryApi);
         var acElementHandler = new AutomationCompositionElementHandler(intermediaryApi, simulatorService);
         simulatorService.setConfig(config);
 
         simulatorService.update(UUID.randomUUID(), UUID.randomUUID());
         simulatorService.prime(mock(CompositionDto.class));
         simulatorService.deprime(mock(CompositionDto.class));
-        simulatorService.migrate(UUID.randomUUID(), UUID.randomUUID(), 0, new HashMap<>(), new HashMap<>());
+        simulatorService.migrate(UUID.randomUUID(), UUID.randomUUID(), 0, 1, new HashMap<>());
         simulatorService.review(UUID.randomUUID(), UUID.randomUUID());
-        simulatorService.prepare(UUID.randomUUID(), UUID.randomUUID(), 0, new HashMap<>(), new HashMap<>());
+        simulatorService.prepare(UUID.randomUUID(), UUID.randomUUID(), 0, 1, new HashMap<>());
         simulatorService.migratePrecheck(UUID.randomUUID(), UUID.randomUUID());
         verify(intermediaryApi, times(0)).sendAcDefinitionInfo(any(), any(), any());
     }
 
      */
     void updateCompositionState(UUID compositionId, AcTypeState state, StateChangeResult stateChangeResult,
             String message);
+
+    /**
+     * Get next stage in Migration.
+     *
+     * @param compositionElementTarget the CompositionElementDto target
+     * @param lastStage the last stage completed
+     * @return the next stage or lastStage if migration completed
+     */
+    int getMigrateNextStage(CompositionElementDto compositionElementTarget, int lastStage);
+
+    /**
+     * Get next stage in Rollback.
+     *
+     * @param compositionElementRollback the CompositionElementDto rollback target
+     * @param lastStage the last stage completed
+     * @return the next stage or lastStage if rollback completed
+     */
+    int getRollbackNextStage(CompositionElementDto compositionElementRollback, int lastStage);
+
+    /**
+     * Get next stage in Prepare.
+     *
+     * @param compositionElement the CompositionElementDto
+     * @param lastStage the last stage completed
+     * @return the next stage or lastStage if prepare completed
+     */
+    int getPrepareNextStage(CompositionElementDto compositionElement, int lastStage);
 }
 
 import org.onap.policy.clamp.models.acm.concepts.DeployState;
 import org.onap.policy.clamp.models.acm.concepts.LockState;
 import org.onap.policy.clamp.models.acm.concepts.StateChangeResult;
-import org.onap.policy.clamp.models.acm.utils.AcmUtils;
+import org.onap.policy.clamp.models.acm.utils.AcmStageUtils;
 import org.onap.policy.models.base.PfUtils;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
 import org.springframework.stereotype.Component;
 @RequiredArgsConstructor
 public class ParticipantIntermediaryApiImpl implements ParticipantIntermediaryApi {
 
+    private static final int MAX_STAGES = 1000;
+
     // The handler for the automationComposition intermediary
     private final AutomationCompositionOutHandler automationCompositionHandler;
     private final CacheProvider cacheProvider;
         automationCompositionHandler.updateCompositionState(compositionId, state, stateChangeResult, message);
     }
 
+    @Override
+    public int getMigrateNextStage(CompositionElementDto compositionElementTarget, int lastStage) {
+        var stageSet = AcmStageUtils.findStageSetMigrate(compositionElementTarget.inProperties());
+        var nextStage = MAX_STAGES;
+        for (var s : stageSet) {
+            if (s > lastStage) {
+                nextStage = Math.min(s, nextStage);
+            }
+        }
+        return nextStage == MAX_STAGES ? lastStage : nextStage;
+    }
+
+    @Override
+    public int getRollbackNextStage(CompositionElementDto compositionElementRollback, int lastStage) {
+        return getMigrateNextStage(compositionElementRollback, lastStage);
+    }
+
+    @Override
+    public int getPrepareNextStage(CompositionElementDto compositionElement, int lastStage) {
+        var stageSet = AcmStageUtils.findStageSetPrepare(compositionElement.inProperties());
+        var nextStage = MAX_STAGES;
+        for (var s : stageSet) {
+            if (s > lastStage) {
+                nextStage = Math.min(s, nextStage);
+            }
+        }
+        return nextStage == MAX_STAGES ? lastStage : nextStage;
+    }
+
     @Override
     public AutomationCompositionElement getAutomationCompositionElement(UUID instanceId, UUID elementId) {
         var automationComposition = cacheProvider.getAutomationCompositions().get(instanceId);
 
 import org.onap.policy.clamp.acm.participant.intermediary.handler.cache.CacheProvider;
 import org.onap.policy.clamp.models.acm.concepts.AutomationComposition;
 import org.onap.policy.clamp.models.acm.concepts.LockState;
-import org.onap.policy.clamp.models.acm.concepts.ParticipantUtils;
 import org.onap.policy.clamp.models.acm.concepts.SubState;
 import org.onap.policy.clamp.models.acm.messages.kafka.participant.AutomationCompositionStateChange;
+import org.onap.policy.clamp.models.acm.utils.AcmStageUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
         for (var element : automationComposition.getElements().values()) {
             var compositionInProperties = cacheProvider
                     .getCommonProperties(automationComposition.getCompositionId(), element.getDefinition());
-            int startPhase = ParticipantUtils.findStartPhase(compositionInProperties);
+            int startPhase = AcmStageUtils.findStartPhase(compositionInProperties);
             if (startPhaseMsg.equals(startPhase)) {
                 element.setLockState(LockState.LOCKING);
                 element.setSubState(SubState.NONE);
         for (var element : automationComposition.getElements().values()) {
             var compositionInProperties = cacheProvider
                     .getCommonProperties(automationComposition.getCompositionId(), element.getDefinition());
-            int startPhase = ParticipantUtils.findStartPhase(compositionInProperties);
+            int startPhase = AcmStageUtils.findStartPhase(compositionInProperties);
             if (startPhaseMsg.equals(startPhase)) {
                 element.setLockState(LockState.UNLOCKING);
                 element.setSubState(SubState.NONE);
 
 import org.onap.policy.clamp.models.acm.concepts.AutomationComposition;
 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionElement;
 import org.onap.policy.clamp.models.acm.concepts.DeployState;
-import org.onap.policy.clamp.models.acm.concepts.ParticipantUtils;
 import org.onap.policy.clamp.models.acm.concepts.SubState;
 import org.onap.policy.clamp.models.acm.messages.kafka.participant.AutomationCompositionMigration;
 import org.onap.policy.clamp.models.acm.messages.kafka.participant.AutomationCompositionPrepare;
+import org.onap.policy.clamp.models.acm.utils.AcmStageUtils;
 import org.onap.policy.clamp.models.acm.utils.AcmUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
                 .getCommonProperties(automationComposition.getCompositionId(), element.getDefinition());
             var compositionElement = cacheProvider.createCompositionElementDto(automationComposition.getCompositionId(),
                 element);
-            var stageSet = ParticipantUtils.findStageSetPrepare(compositionInProperties);
+            var stageSet = AcmStageUtils.findStageSetPrepare(compositionInProperties);
             if (stageSet.contains(stageMsg)) {
                 var instanceElement =
                         new InstanceElementDto(instanceId, elementDeploy.getId(), elementDeploy.getProperties(),
 
 
 package org.onap.policy.clamp.acm.participant.intermediary.handler;
 
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import org.onap.policy.clamp.acm.participant.intermediary.api.ElementState;
 import org.onap.policy.clamp.acm.participant.intermediary.api.InstanceElementDto;
 import org.onap.policy.clamp.acm.participant.intermediary.comm.ParticipantMessagePublisher;
-import org.onap.policy.clamp.acm.participant.intermediary.handler.cache.AcDefinition;
 import org.onap.policy.clamp.acm.participant.intermediary.handler.cache.CacheProvider;
 import org.onap.policy.clamp.models.acm.concepts.AcElementDeploy;
 import org.onap.policy.clamp.models.acm.concepts.AutomationComposition;
 import org.onap.policy.clamp.models.acm.concepts.LockState;
 import org.onap.policy.clamp.models.acm.concepts.MigrationState;
 import org.onap.policy.clamp.models.acm.concepts.ParticipantDeploy;
-import org.onap.policy.clamp.models.acm.concepts.ParticipantUtils;
 import org.onap.policy.clamp.models.acm.concepts.StateChangeResult;
 import org.onap.policy.clamp.models.acm.concepts.SubState;
 import org.onap.policy.clamp.models.acm.messages.kafka.participant.AutomationCompositionDeploy;
 import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantMessageType;
 import org.onap.policy.clamp.models.acm.messages.kafka.participant.PropertiesUpdate;
 import org.onap.policy.clamp.models.acm.messages.rest.instantiation.DeployOrder;
+import org.onap.policy.clamp.models.acm.utils.AcmStageUtils;
 import org.onap.policy.clamp.models.acm.utils.AcmUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
             var element = automationComposition.getElements().get(elementDeploy.getId());
             var compositionInProperties = cacheProvider.getCommonProperties(automationComposition.getCompositionId(),
                     element.getDefinition());
-            int startPhase = ParticipantUtils.findStartPhase(compositionInProperties);
+            int startPhase = AcmStageUtils.findStartPhase(compositionInProperties);
             if (startPhaseMsg.equals(startPhase)) {
                 var compositionElement =
                         cacheProvider.createCompositionElementDto(automationComposition.getCompositionId(), element);
         }
     }
 
-    private void migrateExistingElementsOnThisParticipant(AutomationComposition automationComposition,
-                                                          UUID compositionTargetId, ParticipantDeploy participantDeploy,
-                                                          int stage, boolean newParticipant) {
+    private void migrateAutomationComposition(AutomationComposition automationComposition,
+            ParticipantDeploy participantDeploy, int stage) {
         for (var element : participantDeploy.getAcElementList()) {
-            UUID compIdForCommonProperties = null;
-            if (MigrationState.REMOVED.equals(element.getMigrationState())) {
-                compIdForCommonProperties = automationComposition.getCompositionId();
-            } else {
-                compIdForCommonProperties = compositionTargetId;
-            }
-            var compositionInProperties =
-                    cacheProvider.getCommonProperties(compIdForCommonProperties, element.getDefinition());
-            var stageSet = ParticipantUtils.findStageSetMigrate(compositionInProperties);
-            if (MigrationState.REMOVED.equals(element.getMigrationState())) {
-                stageSet = Set.of(0);
+            var stageSet = getMigrationStageSet(element, automationComposition.getCompositionTargetId());
+            if (stageSet.contains(stage)) {
+                migrateElement(element, automationComposition, stage, participantDeploy);
             }
+        }
+    }
+
+    private void rollbackAutomationComposition(AutomationComposition automationComposition,
+            ParticipantDeploy participantDeploy, int stage) {
+        for (var element : participantDeploy.getAcElementList()) {
+            var stageSet = getRollbackStageSet(element, automationComposition.getCompositionId());
             if (stageSet.contains(stage)) {
-                migrateElement(element, automationComposition, compositionTargetId, stage, newParticipant,
-                        participantDeploy);
+                migrateElement(element, automationComposition, stage, participantDeploy);
             }
         }
     }
 
     private void migrateElement(AcElementDeploy element, AutomationComposition automationComposition,
-                                UUID compositionTargetId, int stage, boolean newParticipant,
-                                ParticipantDeploy participantDeploy) {
+            int stage, ParticipantDeploy participantDeploy) {
         var acElementList = automationComposition.getElements();
-        automationComposition.setCompositionTargetId(compositionTargetId);
-        automationComposition.setDeployState(DeployState.MIGRATING);
         var acElement = acElementList.get(element.getId());
         if (acElement == null) {  // NEW element with existing participant
             var newElement = CacheProvider.createAutomationCompositionElement(element);
             newElement.setParticipantId(participantDeploy.getParticipantId());
-            newElement.setDeployState(DeployState.MIGRATING);
+            newElement.setDeployState(automationComposition.getDeployState());
             newElement.setLockState(LockState.LOCKED);
             newElement.setStage(stage);
             newElement.setMigrationState(MigrationState.NEW);
         } else {
             acElement.setStage(stage);
             acElement.setMigrationState(element.getMigrationState());
-            if (! newParticipant) { //DEFAULT element
+            acElement.setDeployState(automationComposition.getDeployState());
+            acElement.setDefinition(element.getDefinition());
+            if (MigrationState.DEFAULT.equals(element.getMigrationState())) { //DEFAULT element
                 AcmUtils.recursiveMerge(acElement.getProperties(), element.getProperties());
-                acElement.setDeployState(DeployState.MIGRATING);
-                acElement.setDefinition(element.getDefinition());
             }
             LOGGER.info("Cache updated for the migration of element with id {}", element.getId());
         }
-
     }
 
     private void updateExistingElementsOnThisParticipant(UUID instanceId, ParticipantDeploy participantDeploy) {
             Integer startPhaseMsg) {
         automationComposition.setDeployState(DeployState.UNDEPLOYING);
         for (var element : automationComposition.getElements().values()) {
-            UUID compositionId = null;
-            if (MigrationState.NEW.equals(element.getMigrationState())) {
-                compositionId = automationComposition.getCompositionTargetId();
-            } else {
-                compositionId = automationComposition.getCompositionId();
-            }
+            var compositionId = MigrationState.NEW.equals(element.getMigrationState())
+                    ? automationComposition.getCompositionTargetId() : automationComposition.getCompositionId();
             var compositionInProperties = cacheProvider.getCommonProperties(compositionId, element.getDefinition());
-            int startPhase = ParticipantUtils.findStartPhase(compositionInProperties);
+            var startPhase = AcmStageUtils.findStartPhase(compositionInProperties);
             if (MigrationState.NEW.equals(element.getMigrationState())) {
                 // Undeploy newly added element on a Failed Migration
                 startPhase = 0;
         for (var element : automationComposition.getElements().values()) {
             var compositionInProperties = cacheProvider.getCommonProperties(automationComposition.getCompositionId(),
                     element.getDefinition());
-            int startPhase = ParticipantUtils.findStartPhase(compositionInProperties);
+            int startPhase = AcmStageUtils.findStartPhase(compositionInProperties);
             if (startPhaseMsg.equals(startPhase)) {
                 element.setDeployState(DeployState.DELETING);
                 element.setSubState(SubState.NONE);
      */
     public void handleAutomationCompositionMigration(AutomationCompositionMigration migrationMsg) {
         var automationComposition = cacheProvider.getAutomationComposition(migrationMsg.getAutomationCompositionId());
-        var acTargetDefinition = cacheProvider.getAcElementsDefinitions().get(migrationMsg.getCompositionTargetId());
         if (Boolean.FALSE.equals(migrationMsg.getRollback())) {
-            handleMigration(automationComposition, acTargetDefinition, migrationMsg);
+            handleMigration(automationComposition, migrationMsg);
         } else {
             handleRollback(automationComposition, migrationMsg);
         }
 
     private void handleRollback(AutomationComposition automationComposition,
                                 AutomationCompositionMigration migrationMsg) {
-        AutomationComposition acCopy = null;
-        if (automationComposition == null) {
-            LOGGER.warn(AC_NOT_USED, migrationMsg.getAutomationCompositionId());
-            return;
-        } else {
-            LOGGER.info("Rollback operation invoked for the instance {}", migrationMsg.getAutomationCompositionId());
-            acCopy = new AutomationComposition(automationComposition);
-            automationComposition.setCompositionTargetId(migrationMsg.getCompositionTargetId());
-            automationComposition.setDeployState(DeployState.MIGRATION_REVERTING);
-        }
+        LOGGER.info("Rollback operation invoked for the instance {}", migrationMsg.getAutomationCompositionId());
+        automationComposition.setCompositionTargetId(migrationMsg.getCompositionTargetId());
+        automationComposition.setDeployState(DeployState.MIGRATION_REVERTING);
+        var automationCompositionCopy = new AutomationComposition(automationComposition);
         for (var participantDeploy : migrationMsg.getParticipantUpdatesList()) {
             if (cacheProvider.getParticipantId().equals(participantDeploy.getParticipantId())) {
-                migrateExistingElementsOnThisParticipant(automationComposition, migrationMsg.getCompositionTargetId(),
-                        participantDeploy, migrationMsg.getStage(), false);
-
-                callParticipantMigrate(migrationMsg, participantDeploy.getAcElementList(), acCopy);
+                rollbackAutomationComposition(automationComposition, participantDeploy, migrationMsg.getStage());
+                callParticipantRollback(migrationMsg, participantDeploy.getAcElementList(), automationCompositionCopy);
             }
 
         }
     }
 
-    private void handleMigration(AutomationComposition automationComposition, AcDefinition acTargetDefinition,
-                                 AutomationCompositionMigration migrationMsg) {
-        AutomationComposition acCopy = null;
-        if (automationComposition == null) {
-            if (acTargetDefinition == null) {
-                LOGGER.warn(AC_NOT_USED, migrationMsg.getAutomationCompositionId());
-                return;
-            }
-        } else {
-            LOGGER.info("Migration invoked on an existing participant for the instance {}",
-                    migrationMsg.getAutomationCompositionId());
-            acCopy = new AutomationComposition(automationComposition);
-        }
-        var newParticipant = false;
+    private void handleMigration(AutomationComposition automationComposition,
+            AutomationCompositionMigration migrationMsg) {
+        LOGGER.info("Migration invoked for the instance {}", migrationMsg.getAutomationCompositionId());
+        automationComposition.setCompositionTargetId(migrationMsg.getCompositionTargetId());
+        automationComposition.setDeployState(DeployState.MIGRATING);
+        var automationCompositionCopy = new AutomationComposition(automationComposition);
         for (var participantDeploy : migrationMsg.getParticipantUpdatesList()) {
             if (cacheProvider.getParticipantId().equals(participantDeploy.getParticipantId())) {
-                if (automationComposition == null) {
-                    // New element with new participant added in Migration
-                    LOGGER.info("Participant newly added in Migration for the instance {}",
-                            migrationMsg.getAutomationCompositionId());
-                    newParticipant = true;
-                    cacheProvider.initializeAutomationComposition(migrationMsg.getCompositionId(),
-                            migrationMsg.getCompositionTargetId(), migrationMsg.getAutomationCompositionId(),
-                            participantDeploy, DeployState.MIGRATING, SubState.NONE,
-                            migrationMsg.getRevisionIdInstance());
-                    automationComposition = cacheProvider
-                            .getAutomationComposition(migrationMsg.getAutomationCompositionId());
-                }
-                migrateExistingElementsOnThisParticipant(automationComposition, migrationMsg.getCompositionTargetId(),
-                        participantDeploy, migrationMsg.getStage(), newParticipant);
-
-                callParticipantMigrate(migrationMsg, participantDeploy.getAcElementList(), acCopy);
+                migrateAutomationComposition(automationComposition, participantDeploy, migrationMsg.getStage());
+                callParticipantMigrate(migrationMsg, participantDeploy.getAcElementList(), automationCompositionCopy);
             }
         }
     }
 
     private void callParticipantMigrate(AutomationCompositionMigration migrationMsg, List<AcElementDeploy> acElements,
-                                        AutomationComposition formerAcInstance) {
-        var latestAcFromCache = cacheProvider.getAutomationComposition(migrationMsg.getAutomationCompositionId());
-        var instanceElementTargetMap = cacheProvider.getInstanceElementDtoMap(latestAcFromCache);
-        var compositionElementTargetMap = cacheProvider.getCompositionElementDtoMap(latestAcFromCache,
-                migrationMsg.getCompositionTargetId());
-        Map<UUID, CompositionElementDto> compositionElementMap = new HashMap<>();
-        Map<UUID, InstanceElementDto> instanceElementMap = new HashMap<>();
-        if (formerAcInstance != null) { //Existing participant
-            compositionElementMap = cacheProvider.getCompositionElementDtoMap(formerAcInstance);
-            instanceElementMap = cacheProvider.getInstanceElementDtoMap(formerAcInstance);
-        }
-        // Call migrate for new and existing elements
+            AutomationComposition automationCompositionCopy) {
+        var automationComposition = cacheProvider.getAutomationComposition(automationCompositionCopy.getInstanceId());
+        var instanceElementTargetMap = cacheProvider.getInstanceElementDtoMap(automationComposition);
+        var compositionElementTargetMap = cacheProvider.getCompositionElementDtoMap(automationComposition,
+                automationCompositionCopy.getCompositionTargetId());
+        var compositionElementMap = cacheProvider.getCompositionElementDtoMap(automationCompositionCopy);
+        var instanceElementMap = cacheProvider.getInstanceElementDtoMap(automationCompositionCopy);
         for (var acElement : acElements) {
-            UUID compIdForCommonProperties = null;
-            if (MigrationState.REMOVED.equals(acElement.getMigrationState())) {
-                compIdForCommonProperties = latestAcFromCache.getCompositionId();
-            } else {
-                compIdForCommonProperties = migrationMsg.getCompositionTargetId();
-            }
-            var compositionInProperties =
-                    cacheProvider.getCommonProperties(compIdForCommonProperties, acElement.getDefinition());
-            var stageSet = ParticipantUtils.findStageSetMigrate(compositionInProperties);
-            if (MigrationState.REMOVED.equals(acElement.getMigrationState())) {
-                stageSet = Set.of(0);
-            }
-            var rollback = Boolean.TRUE.equals(migrationMsg.getRollback());
+            var stageSet = getMigrationStageSet(acElement, automationComposition.getCompositionTargetId());
+            var newElement = MigrationState.NEW.equals(acElement.getMigrationState());
             if (stageSet.contains(migrationMsg.getStage())) {
-                if (MigrationState.NEW.equals(acElement.getMigrationState())) {
-                    var compositionElementDto = new CompositionElementDto(migrationMsg.getCompositionId(),
+                if (newElement) {
+                    var compositionElementDto = new CompositionElementDto(automationCompositionCopy.getCompositionId(),
                             acElement.getDefinition(), Map.of(), Map.of(), ElementState.NOT_PRESENT);
-                    var instanceElementDto = new InstanceElementDto(migrationMsg.getAutomationCompositionId(),
+                    var instanceElementDto = new InstanceElementDto(automationCompositionCopy.getInstanceId(),
                             acElement.getId(), Map.of(), Map.of(), ElementState.NOT_PRESENT);
                     var compositionElementTargetDto =
                             CacheProvider.changeStateToNew(compositionElementTargetMap.get(acElement.getId()));
                             CacheProvider.changeStateToNew(instanceElementTargetMap.get(acElement.getId()));
 
                     listenerMigrate(migrationMsg.getMessageId(), compositionElementDto, compositionElementTargetDto,
-                            instanceElementDto, instanceElementTargetDto, migrationMsg.getStage(), rollback);
+                            instanceElementDto, instanceElementTargetDto, migrationMsg.getStage());
 
                 } else if (MigrationState.REMOVED.equals(acElement.getMigrationState())) {
                     var compositionDtoTarget = new CompositionElementDto(migrationMsg.getCompositionTargetId(),
                             acElement.getId(), Map.of(), Map.of(), ElementState.REMOVED);
                     listenerMigrate(migrationMsg.getMessageId(), compositionElementMap.get(acElement.getId()),
                             compositionDtoTarget, instanceElementMap.get(acElement.getId()), instanceElementDtoTarget,
-                            migrationMsg.getStage(), rollback);
+                            migrationMsg.getStage());
 
                 } else { // DEFAULT case
                     listenerMigrate(migrationMsg.getMessageId(), compositionElementMap.get(acElement.getId()),
                             compositionElementTargetMap.get(acElement.getId()),
                             instanceElementMap.get(acElement.getId()), instanceElementTargetMap.get(acElement.getId()),
-                            migrationMsg.getStage(), rollback);
+                            migrationMsg.getStage());
                 }
             }
         }
     }
 
+    private Set<Integer> getMigrationStageSet(AcElementDeploy acElement, UUID compositionTargetId) {
+        if (MigrationState.REMOVED.equals(acElement.getMigrationState())) {
+            return Set.of(0);
+        } else {
+            var commonProperties = cacheProvider.getCommonProperties(compositionTargetId, acElement.getDefinition());
+            return AcmStageUtils.findStageSetMigrate(commonProperties);
+        }
+    }
+
+    private void callParticipantRollback(AutomationCompositionMigration migrationMsg, List<AcElementDeploy> acElements,
+            AutomationComposition automationCompositionCopy) {
+        var automationComposition = cacheProvider.getAutomationComposition(automationCompositionCopy.getInstanceId());
+        var instanceElementTargetMap = cacheProvider.getInstanceElementDtoMap(automationComposition);
+        var compositionElementTargetMap = cacheProvider.getCompositionElementDtoMap(automationComposition);
+        var compositionElementMap = cacheProvider.getCompositionElementDtoMap(automationCompositionCopy,
+                automationCompositionCopy.getCompositionTargetId());
+        var instanceElementMap = cacheProvider.getInstanceElementDtoMap(automationCompositionCopy);
+        for (var acElement : acElements) {
+            var stageSet = getRollbackStageSet(acElement, automationComposition.getCompositionId());
+            var removed = MigrationState.NEW.equals(acElement.getMigrationState());
+            if (!removed) {
+                var commonProperties = cacheProvider
+                        .getCommonProperties(automationComposition.getCompositionId(), acElement.getDefinition());
+                stageSet = AcmStageUtils.findStageSetMigrate(commonProperties);
+            }
+            var newElement = MigrationState.REMOVED.equals(acElement.getMigrationState());
+            if (stageSet.contains(migrationMsg.getStage())) {
+                if (newElement) {
+                    var compositionElementDto =
+                            new CompositionElementDto(automationCompositionCopy.getCompositionTargetId(),
+                            acElement.getDefinition(), Map.of(), Map.of(), ElementState.NOT_PRESENT);
+                    var instanceElementDto = new InstanceElementDto(automationCompositionCopy.getInstanceId(),
+                            acElement.getId(), Map.of(), Map.of(), ElementState.NOT_PRESENT);
+                    var compositionElementTargetDto =
+                            CacheProvider.changeStateToNew(compositionElementTargetMap.get(acElement.getId()));
+                    var instanceElementTargetDto =
+                            CacheProvider.changeStateToNew(instanceElementTargetMap.get(acElement.getId()));
+
+                    listenerRollback(migrationMsg.getMessageId(), compositionElementDto, compositionElementTargetDto,
+                            instanceElementDto, instanceElementTargetDto, migrationMsg.getStage());
+
+                } else if (removed) {
+                    var compositionDtoTarget = new CompositionElementDto(
+                            automationCompositionCopy.getCompositionId(), acElement.getDefinition(),
+                            Map.of(), Map.of(), ElementState.REMOVED);
+                    var instanceElementDtoTarget = new InstanceElementDto(automationCompositionCopy.getInstanceId(),
+                            acElement.getId(), Map.of(), Map.of(), ElementState.REMOVED);
+                    listenerRollback(migrationMsg.getMessageId(), compositionElementMap.get(acElement.getId()),
+                            compositionDtoTarget, instanceElementMap.get(acElement.getId()), instanceElementDtoTarget,
+                            migrationMsg.getStage());
+
+                } else { // DEFAULT case
+                    listenerRollback(migrationMsg.getMessageId(), compositionElementMap.get(acElement.getId()),
+                            compositionElementTargetMap.get(acElement.getId()),
+                            instanceElementMap.get(acElement.getId()), instanceElementTargetMap.get(acElement.getId()),
+                            migrationMsg.getStage());
+                }
+            }
+        }
+    }
+
+    private Set<Integer> getRollbackStageSet(AcElementDeploy acElement, UUID compositionId) {
+        if (MigrationState.NEW.equals(acElement.getMigrationState())) {
+            return Set.of(0);
+        } else {
+            var commonProperties = cacheProvider.getCommonProperties(compositionId, acElement.getDefinition());
+            return AcmStageUtils.findStageSetMigrate(commonProperties);
+        }
+    }
+
     private void listenerMigrate(UUID messageId, CompositionElementDto compositionElement,
             CompositionElementDto compositionElementTarget, InstanceElementDto instanceElement,
-            InstanceElementDto instanceElementMigrate, int stage, boolean rollback) {
-        if (rollback) {
-            listener.rollback(messageId, compositionElement, compositionElementTarget, instanceElement,
-                    instanceElementMigrate, stage);
-        } else {
-            LOGGER.info("Invoking migration of element on the participant for {}", instanceElement.elementId());
-            listener.migrate(messageId, compositionElement, compositionElementTarget, instanceElement,
+            InstanceElementDto instanceElementMigrate, int stage) {
+        LOGGER.info("Invoking migration of element on the participant for {}", instanceElement.elementId());
+        listener.migrate(messageId, compositionElement, compositionElementTarget, instanceElement,
                     instanceElementMigrate, stage);
-        }
+    }
+
+    private void listenerRollback(UUID messageId, CompositionElementDto compositionElement,
+            CompositionElementDto compositionElementTarget, InstanceElementDto instanceElement,
+            InstanceElementDto instanceElementMigrate, int stage) {
+        LOGGER.info("Invoking rollback of element on the participant for {}", instanceElement.elementId());
+        listener.rollback(messageId, compositionElement, compositionElementTarget, instanceElement,
+                instanceElementMigrate, stage);
     }
 }
 
 import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantMessageType;
 import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantPrimeAck;
 import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantStatus;
+import org.onap.policy.clamp.models.acm.utils.AcmStateUtils;
 import org.onap.policy.clamp.models.acm.utils.AcmUtils;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
 import org.slf4j.Logger;
         }
 
         if ((deployState != null && lockState != null) || (deployState == null && lockState == null)
-                || AcmUtils.isInTransitionalState(deployState, lockState, SubState.NONE)) {
+                || AcmStateUtils.isInTransitionalState(deployState, lockState, SubState.NONE)) {
             LOGGER.error("state error {} and {} cannot be handled", deployState, lockState);
             return;
         }
 
      */
     public Map<String, Object> getCommonProperties(@NonNull UUID compositionId,
         @NonNull ToscaConceptIdentifier definition) {
-        var acDefinition = acElementsDefinitions.get(compositionId);
+        var map = getAcElementDefinition(acElementsDefinitions.get(compositionId), definition);
+        return map != null ? map.getAutomationCompositionElementToscaNodeTemplate().getProperties() : new HashMap<>();
+    }
+
+    /**
+     * Get AutomationCompositionElementDefinition from AcDefinition and ToscaConceptIdentifier.
+     *
+     * @param acDefinition the AcDefinition
+     * @param definition the ToscaConceptIdentifier
+     * @return the AutomationCompositionElementDefinition
+     */
+    public AutomationCompositionElementDefinition getAcElementDefinition(AcDefinition acDefinition,
+            ToscaConceptIdentifier definition) {
         if (acDefinition == null) {
-            return new HashMap<>();
+            return null;
         }
-        var map = acDefinition.getElements().get(definition);
-        return map != null ? map.getAutomationCompositionElementToscaNodeTemplate().getProperties() : new HashMap<>();
+        var acDefinitionElement = acDefinition.getElements().get(definition);
+        if (acDefinitionElement == null) {
+            var val = acDefinition.getElements().entrySet().stream()
+                    .filter(entry -> definition.getName().equals(entry.getKey().getName()))
+                    .findFirst();
+            if (val.isPresent()) {
+                acDefinitionElement = val.get().getValue();
+            }
+        }
+        return acDefinitionElement;
     }
 
     /**
      */
     public CompositionElementDto createCompositionElementDto(UUID compositionId, AutomationCompositionElement element) {
         var acDefinition = acElementsDefinitions.get(compositionId);
-        var acDefinitionElement = acDefinition != null ? acDefinition.getElements().get(element.getDefinition()) : null;
+        var acDefinitionElement = getAcElementDefinition(acDefinition, element.getDefinition());
 
-        return (acDefinitionElement != null) ? new CompositionElementDto(compositionId, element.getDefinition(),
+        return (acDefinitionElement != null) ? new CompositionElementDto(compositionId,
+                acDefinitionElement.getAcElementDefinitionId(),
                 acDefinitionElement.getAutomationCompositionElementToscaNodeTemplate().getProperties(),
                 acDefinitionElement.getOutProperties()) :
             new CompositionElementDto(compositionId, element.getDefinition(),
         var acDefinition = acElementsDefinitions.get(compositionId);
         Map<UUID, CompositionElementDto> map = new HashMap<>();
         for (var element : automationComposition.getElements().values()) {
-            var acDefinitionElement = (acDefinition != null) ? acDefinition.getElements().get(element.getDefinition()) :
-                    null;
+            var acDefinitionElement = getAcElementDefinition(acDefinition, element.getDefinition());
             var compositionElement = (acDefinitionElement != null)
-                    ? new CompositionElementDto(compositionId, element.getDefinition(),
+                    ? new CompositionElementDto(compositionId, acDefinitionElement.getAcElementDefinitionId(),
                     acDefinitionElement.getAutomationCompositionElementToscaNodeTemplate().getProperties(),
                     acDefinitionElement.getOutProperties()) :
                     new CompositionElementDto(compositionId, element.getDefinition(),
 
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import java.util.List;
 import java.util.Map;
 import java.util.UUID;
 import org.junit.jupiter.api.Test;
+import org.onap.policy.clamp.acm.participant.intermediary.api.CompositionElementDto;
 import org.onap.policy.clamp.acm.participant.intermediary.api.ElementState;
 import org.onap.policy.clamp.acm.participant.intermediary.api.InstanceElementDto;
 import org.onap.policy.clamp.acm.participant.intermediary.handler.AutomationCompositionOutHandler;
         assertEquals(acElementDefinition.getOutProperties(), element.outProperties());
         assertEquals(ElementState.PRESENT, element.state());
     }
+
+    @Test
+    void testGetMigrateNextStage() {
+        var cacheProvider = mock(CacheProvider.class);
+        var automationCompositionHandler = mock(AutomationCompositionOutHandler.class);
+        var apiImpl = new ParticipantIntermediaryApiImpl(automationCompositionHandler, cacheProvider);
+        var migrate = Map.of("migrate", List.of(0, 2));
+        Map<String, Object> stageSet = Map.of("stage", migrate);
+        var compositionElementTarget = new CompositionElementDto(UUID.randomUUID(), new ToscaConceptIdentifier(),
+                stageSet, Map.of());
+        var result = apiImpl.getMigrateNextStage(compositionElementTarget, 0);
+        assertEquals(2, result);
+        result = apiImpl.getMigrateNextStage(compositionElementTarget, 2);
+        assertEquals(2, result);
+    }
+
+    @Test
+    void testGetRollbackNextStage() {
+        var cacheProvider = mock(CacheProvider.class);
+        var automationCompositionHandler = mock(AutomationCompositionOutHandler.class);
+        var apiImpl = new ParticipantIntermediaryApiImpl(automationCompositionHandler, cacheProvider);
+        var migrate = Map.of("migrate", List.of(0, 2));
+        Map<String, Object> stageSet = Map.of("stage", migrate);
+        var compositionElementTarget = new CompositionElementDto(UUID.randomUUID(), new ToscaConceptIdentifier(),
+                stageSet, Map.of());
+        var result = apiImpl.getRollbackNextStage(compositionElementTarget, 0);
+        assertEquals(2, result);
+        result = apiImpl.getRollbackNextStage(compositionElementTarget, 2);
+        assertEquals(2, result);
+    }
 }
 
 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionElement;
 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionElementDefinition;
 import org.onap.policy.clamp.models.acm.concepts.DeployState;
+import org.onap.policy.clamp.models.acm.concepts.LockState;
 import org.onap.policy.clamp.models.acm.concepts.MigrationState;
 import org.onap.policy.clamp.models.acm.concepts.ParticipantDeploy;
 import org.onap.policy.clamp.models.acm.messages.kafka.participant.AutomationCompositionDeploy;
 import org.onap.policy.clamp.models.acm.messages.kafka.participant.PropertiesUpdate;
 import org.onap.policy.clamp.models.acm.messages.rest.instantiation.DeployOrder;
 import org.onap.policy.clamp.models.acm.messages.rest.instantiation.LockOrder;
+import org.onap.policy.clamp.models.acm.utils.AcmStateUtils;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
 
 class AutomationCompositionHandlerTest {
         verify(listener, times(0)).deploy(any(), any(), any());
     }
 
-    @Test
-    void handleMigrationNullTest() {
-        var ach = new AutomationCompositionHandler(
-                mock(CacheProvider.class), mock(ParticipantMessagePublisher.class), mock(ThreadHandler.class));
-        var migrationMsg = new AutomationCompositionMigration();
-        var rollbackMsg = new AutomationCompositionMigration();
-        rollbackMsg.setRollback(true);
-
-        migrationMsg.setStage(0);
-        assertDoesNotThrow(() -> ach.handleAutomationCompositionMigration(migrationMsg));
-        migrationMsg.setAutomationCompositionId(UUID.randomUUID());
-        migrationMsg.setCompositionTargetId(UUID.randomUUID());
-        assertDoesNotThrow(() -> ach.handleAutomationCompositionMigration(migrationMsg));
-
-        rollbackMsg.setStage(0);
-        assertDoesNotThrow(() -> ach.handleAutomationCompositionMigration(rollbackMsg));
-        rollbackMsg.setAutomationCompositionId(UUID.randomUUID());
-        rollbackMsg.setCompositionTargetId(UUID.randomUUID());
-        assertDoesNotThrow(() -> ach.handleAutomationCompositionMigration(rollbackMsg));
-    }
-
     @Test
     void handleAutomationCompositionMigrationTest() {
         var automationComposition = CommonTestData.getTestAutomationCompositionMap().values().iterator().next();
         automationComposition.setCompositionId(UUID.randomUUID());
-        var instanceId = UUID.randomUUID();
-        automationComposition.setInstanceId(instanceId);
+        automationComposition.setInstanceId(UUID.randomUUID());
         automationComposition.setCompositionTargetId(UUID.randomUUID());
         var definitions =
                 CommonTestData.createAutomationCompositionElementDefinitionList(automationComposition);
                 automationComposition.getElements().size(), false);
         testMigration(cacheProviderRollback, automationComposition, 0,
                 automationComposition.getElements().size(), true);
-
-        // New participant with new elements added in Migration
-        cacheProvider.removeAutomationComposition(instanceId);
-        for (var element : automationComposition.getElements().entrySet()) {
-            element.getValue().setMigrationState(MigrationState.NEW);
-        }
-        testMigration(cacheProvider, automationComposition, 0,
-                automationComposition.getElements().size(), false);
-    }
-
-    @Test
-    void handleMigrationAddRemoveTest() {
-        var automationComposition = CommonTestData.getTestAutomationCompositionMap().values().iterator().next();
-        automationComposition.setCompositionId(UUID.randomUUID());
-        automationComposition.setInstanceId(UUID.randomUUID());
-
-        var acMigrate = new AutomationComposition(automationComposition);
-        acMigrate.setCompositionTargetId(UUID.randomUUID());
-
-        // remove element
-        var element = acMigrate.getElements().values().iterator().next();
-        element.setMigrationState(MigrationState.REMOVED);
-
-        //Add element
-        var newElement = new AutomationCompositionElement(element);
-        newElement.setDefinition(new ToscaConceptIdentifier("policy.clamp.new.element", "1.2.4"));
-        newElement.setId(UUID.randomUUID());
-        newElement.setMigrationState(MigrationState.NEW);
-
-        acMigrate.getElements().put(newElement.getId(), newElement);
-
-        var migrateDefinitions =
-                CommonTestData.createAutomationCompositionElementDefinitionList(acMigrate);
-
-        var participantDeploy =
-                CommonTestData.createparticipantDeploy(CommonTestData.getParticipantId(), automationComposition);
-        var definitions =
-                CommonTestData.createAutomationCompositionElementDefinitionList(automationComposition);
-        var cacheProvider = createCacheProvider(participantDeploy, automationComposition.getCompositionId(),
-                automationComposition.getInstanceId(), definitions,
-                acMigrate.getCompositionTargetId(), migrateDefinitions);
-        var cacheProviderRollback = createCacheProvider(participantDeploy, automationComposition.getCompositionId(),
-                automationComposition.getInstanceId(), definitions,
-                acMigrate.getCompositionTargetId(), migrateDefinitions);
-
-        testMigration(cacheProvider, acMigrate, 0, acMigrate.getElements().size(), false);
-        testMigration(cacheProviderRollback, acMigrate, 0, acMigrate.getElements().size(), true);
     }
 
-
     @Test
     void handleAcMigrationStageTest() {
         var automationComposition = CommonTestData.getTestAutomationCompositionMap().values().iterator().next();
+        AcmStateUtils.setCascadedState(automationComposition, DeployState.DEPLOYED, LockState.LOCKED);
         automationComposition.setCompositionId(UUID.randomUUID());
         automationComposition.setInstanceId(UUID.randomUUID());
 
         var acMigrate = new AutomationComposition(automationComposition);
+        AcmStateUtils.setCascadedState(acMigrate, DeployState.MIGRATING, LockState.LOCKED);
         acMigrate.setCompositionTargetId(UUID.randomUUID());
 
-        // remove element
-        var element = acMigrate.getElements().values().iterator().next();
-        element.setMigrationState(MigrationState.REMOVED);
-
-        //Add element
-        var newElement = new AutomationCompositionElement(element);
-        newElement.setDefinition(new ToscaConceptIdentifier("policy.clamp.new.element", "1.2.4"));
-        newElement.setId(UUID.randomUUID());
-        newElement.setMigrationState(MigrationState.NEW);
-
-        acMigrate.getElements().put(newElement.getId(), newElement);
+        // remove first element
+        var elementRemoved = acMigrate.getElements().values().iterator().next();
+        elementRemoved.setMigrationState(MigrationState.REMOVED);
 
+        // add new element
+        var element = new AutomationCompositionElement(elementRemoved);
+        element.setDefinition(new ToscaConceptIdentifier("policy.clamp.new.element", "1.2.4"));
+        element.setId(UUID.randomUUID());
+        element.setMigrationState(MigrationState.NEW);
+        acMigrate.getElements().put(element.getId(), element);
 
-        // replacing definition version
-        acMigrate.getElements().values().forEach(el -> el.setDefinition(
-                new ToscaConceptIdentifier(el.getDefinition().getName(), "1.2.4")));
+        // replacing definition version excluding the removed element
+        acMigrate.getElements().values().stream()
+                .filter(el -> !el.getId().equals(elementRemoved.getId()))
+                .forEach(el -> el.setDefinition(
+                        new ToscaConceptIdentifier(el.getDefinition().getName(), "1.2.4")));
 
         var migrateDefinitions =
                 CommonTestData.createAutomationCompositionElementDefinitionList(acMigrate);
 
+        // scenario 1,2
         migrateDefinitions.forEach(el -> el.getAutomationCompositionElementToscaNodeTemplate()
-                .setProperties(Map.of("stage", List.of(0, 1))));
+                .setProperties(Map.of("stage", List.of(1, 2))));
 
         var participantDeploy =
                 CommonTestData.createparticipantDeploy(CommonTestData.getParticipantId(), automationComposition);
         var cacheProvider = createCacheProvider(participantDeploy, automationComposition.getCompositionId(),
                 automationComposition.getInstanceId(), definitions,
                 acMigrate.getCompositionTargetId(), migrateDefinitions);
-        var cacheProviderRollback = createCacheProvider(participantDeploy, automationComposition.getCompositionId(),
-                automationComposition.getInstanceId(), definitions,
-                acMigrate.getCompositionTargetId(), migrateDefinitions);
-
 
-        // scenario 1,2
-        migrateDefinitions.forEach(el -> el.getAutomationCompositionElementToscaNodeTemplate()
+        definitions.forEach(el -> el.getAutomationCompositionElementToscaNodeTemplate()
                 .setProperties(Map.of("stage", List.of(1, 2))));
+        automationComposition.getElements().put(element.getId(), element);
 
         // expected the element deleted
         testMigration(cacheProvider, acMigrate, 0, 1, false);
-        testMigration(cacheProviderRollback, acMigrate, 0, 1, true);
 
         // expected 4 elements from stage 1
         testMigration(cacheProvider, acMigrate, 1, 4, false);
-        testMigration(cacheProviderRollback, acMigrate, 1, 4, true);
 
         // scenario 0,2
         cacheProvider = createCacheProvider(participantDeploy, automationComposition.getCompositionId(),
                 automationComposition.getInstanceId(), definitions,
                 acMigrate.getCompositionTargetId(), migrateDefinitions);
-        cacheProviderRollback = createCacheProvider(participantDeploy, automationComposition.getCompositionId(),
-                automationComposition.getInstanceId(), definitions,
-                acMigrate.getCompositionTargetId(), migrateDefinitions);
 
         migrateDefinitions.forEach(el -> el.getAutomationCompositionElementToscaNodeTemplate()
                 .setProperties(Map.of("stage", List.of(0, 2))));
 
         // expected the element deleted + 4 elements from stage 0
         testMigration(cacheProvider, acMigrate, 0, 5, false);
-        testMigration(cacheProviderRollback, acMigrate, 0, 5, true);
 
         // expected 0 elements
         testMigration(cacheProvider, acMigrate, 1, 0, false);
-        testMigration(cacheProviderRollback, acMigrate, 1, 0, true);
     }
 
     private CacheProvider createCacheProvider(ParticipantDeploy participantDeploy,
             verify(listener, times(expectedMigrated)).rollback(any(), any(), any(), any(), any(), anyInt());
         }
     }
+
+    @Test
+    void handleAcRollbackStageTest() {
+        var automationComposition = CommonTestData.getTestAutomationCompositionMap().values().iterator().next();
+        AcmStateUtils.setCascadedState(automationComposition, DeployState.MIGRATING, LockState.LOCKED);
+        automationComposition.setCompositionId(UUID.randomUUID());
+        automationComposition.setInstanceId(UUID.randomUUID());
+        automationComposition.setCompositionTargetId(UUID.randomUUID());
+
+        var acRollback = new AutomationComposition(automationComposition);
+        AcmStateUtils.setCascadedState(acRollback, DeployState.MIGRATION_REVERTING, LockState.LOCKED);
+
+        var acRollbackDefinitions =
+                CommonTestData.createAutomationCompositionElementDefinitionList(acRollback);
+        acRollbackDefinitions.forEach(el -> el.getAutomationCompositionElementToscaNodeTemplate()
+                .setProperties(Map.of("stage", List.of(1, 2))));
+
+        // remove first element
+        var elementRemoved = automationComposition.getElements().values().iterator().next();
+        elementRemoved.setMigrationState(MigrationState.REMOVED);
+        acRollback.getElements().get(elementRemoved.getId()).setMigrationState(MigrationState.REMOVED);
+
+        // add new element
+        var element = new AutomationCompositionElement(elementRemoved);
+        element.setDefinition(new ToscaConceptIdentifier("policy.clamp.new.element", "1.2.4"));
+        element.setId(UUID.randomUUID());
+        element.setMigrationState(MigrationState.NEW);
+        automationComposition.getElements().put(element.getId(), element);
+        acRollback.getElements().put(element.getId(), element);
+
+        // replacing definition version excluding the removed element
+        automationComposition.getElements().values().stream()
+                .filter(el -> !el.getId().equals(elementRemoved.getId()))
+                .forEach(el -> el.setDefinition(
+                        new ToscaConceptIdentifier(el.getDefinition().getName(), "1.2.4")));
+
+        var acDefinitions =
+                CommonTestData.createAutomationCompositionElementDefinitionList(automationComposition);
+        acDefinitions.forEach(el -> el.getAutomationCompositionElementToscaNodeTemplate()
+                .setProperties(Map.of("stage", List.of(1, 2))));
+
+        var participantDeploy =
+                CommonTestData.createparticipantDeploy(CommonTestData.getParticipantId(), automationComposition);
+        var cacheProvider = new CacheProvider(CommonTestData.getParticipantParameters());
+        cacheProvider.addElementDefinition(
+                automationComposition.getCompositionTargetId(), acDefinitions, UUID.randomUUID());
+        cacheProvider.initializeAutomationComposition(automationComposition.getCompositionId(),
+                automationComposition.getInstanceId(), participantDeploy, UUID.randomUUID());
+        cacheProvider.addElementDefinition(
+                automationComposition.getCompositionId(), acRollbackDefinitions, UUID.randomUUID());
+
+        // expected the new element deleted
+        testMigration(cacheProvider, acRollback, 0, 1, true);
+
+        // expected default elements
+        testMigration(cacheProvider, acRollback, 1, 4, true);
+
+        // expected default elements
+        testMigration(cacheProvider, acRollback, 2, 4, true);
+    }
+
 }
 
 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositions;
 import org.onap.policy.clamp.models.acm.concepts.DeployState;
 import org.onap.policy.clamp.models.acm.concepts.LockState;
+import org.onap.policy.clamp.models.acm.concepts.MigrationState;
 import org.onap.policy.clamp.models.acm.concepts.ParticipantDeploy;
 import org.onap.policy.clamp.models.acm.concepts.ParticipantRestartAc;
 import org.onap.policy.clamp.models.acm.concepts.ParticipantSupportedElementType;
             createAutomationCompositionElementDefinitionList(AutomationComposition automationComposition) {
         List<AutomationCompositionElementDefinition> definitions = new ArrayList<>();
         for (var element : automationComposition.getElements().values()) {
-            definitions.add(createAutomationCompositionElementDefinition(element.getDefinition()));
+            if (!MigrationState.REMOVED.equals(element.getMigrationState())) {
+                definitions.add(createAutomationCompositionElementDefinition(element.getDefinition()));
+            }
         }
         return definitions;
     }
 
 import org.onap.policy.clamp.models.acm.concepts.DeployState;
 import org.onap.policy.clamp.models.acm.concepts.LockState;
 import org.onap.policy.clamp.models.acm.concepts.MigrationState;
-import org.onap.policy.clamp.models.acm.concepts.ParticipantUtils;
 import org.onap.policy.clamp.models.acm.concepts.StateChangeResult;
 import org.onap.policy.clamp.models.acm.concepts.SubState;
 import org.onap.policy.clamp.models.acm.messages.rest.instantiation.AcInstanceStateUpdate;
 import org.onap.policy.clamp.models.acm.persistence.provider.AcInstanceStateResolver;
 import org.onap.policy.clamp.models.acm.persistence.provider.AutomationCompositionProvider;
 import org.onap.policy.clamp.models.acm.persistence.provider.ParticipantProvider;
+import org.onap.policy.clamp.models.acm.utils.AcmStageUtils;
+import org.onap.policy.clamp.models.acm.utils.AcmStateUtils;
 import org.onap.policy.clamp.models.acm.utils.AcmUtils;
 import org.onap.policy.common.parameters.BeanValidationResult;
 import org.onap.policy.models.base.PfModelRuntimeException;
 
         var acDefinition = acDefinitionProvider.getAcDefinition(compositionId);
         AcDefinitionProvider.checkPrimedComposition(acDefinition);
-        var validationResult = validateAutomationComposition(automationComposition, acDefinition, false);
+        var validationResult = validateAutomationComposition(automationComposition, acDefinition, 0);
         if (!validationResult.isValid()) {
             throw new PfModelRuntimeException(Status.BAD_REQUEST, validationResult.getResult());
         } else {
             acFromDb.setVersion(automationComposition.getVersion());
             acFromDb.setDescription(automationComposition.getDescription());
             acFromDb.setDerivedFrom(automationComposition.getDerivedFrom());
-            var validationResult = validateAutomationComposition(acFromDb, acDefinition, false);
+            var validationResult = validateAutomationComposition(acFromDb, acDefinition, 0);
             if (!validationResult.isValid()) {
                 throw new PfModelRuntimeException(Status.BAD_REQUEST, validationResult.getResult());
             } else {
             AcmUtils.recursiveMerge(dbAcElement.getProperties(), element.getValue().getProperties());
         }
 
-        var validationResult = validateAutomationComposition(acToBeUpdated, acDefinition, false);
+        var validationResult = validateAutomationComposition(acToBeUpdated, acDefinition, 0);
         if (!validationResult.isValid()) {
             throw new PfModelRuntimeException(Status.BAD_REQUEST, validationResult.getResult());
         } else {
 
     private void updateAcForMigration(AutomationComposition acFromDb,
                                       AutomationCompositionDefinition acDefinition, DeployState deployState) {
-        AcmUtils.setCascadedState(acFromDb, deployState, LockState.LOCKED);
+        AcmStateUtils.setCascadedState(acFromDb, deployState, LockState.LOCKED);
         acFromDb.setStateChangeResult(StateChangeResult.NO_ERROR);
-        var stage = ParticipantUtils.getFirstStage(acFromDb, acDefinition.getServiceTemplate());
+        var stage = AcmStageUtils.getFirstStage(acFromDb, acDefinition.getServiceTemplate());
         acFromDb.setPhase(stage);
     }
 
     private void updateAcForProperties(AutomationComposition acToBeUpdated) {
-        AcmUtils.setCascadedState(acToBeUpdated, DeployState.UPDATING, acToBeUpdated.getLockState());
+        AcmStateUtils.setCascadedState(acToBeUpdated, DeployState.UPDATING, acToBeUpdated.getLockState());
         acToBeUpdated.setStateChangeResult(StateChangeResult.NO_ERROR);
     }
 
         // Publish migrate event to the participants
         supervisionAcHandler.migratePrecheck(copyAc, acDefinition.getRevisionId(), acDefinitionTarget.getRevisionId());
 
-        AcmUtils.setCascadedState(acToBeUpdated, DeployState.DEPLOYED, LockState.LOCKED,
+        AcmStateUtils.setCascadedState(acToBeUpdated, DeployState.DEPLOYED, LockState.LOCKED,
             SubState.MIGRATION_PRECHECKING);
         acToBeUpdated.setStateChangeResult(StateChangeResult.NO_ERROR);
 
      * @return the result of validation
      */
     private BeanValidationResult validateAutomationComposition(AutomationComposition automationComposition,
-            AutomationCompositionDefinition acDefinition, boolean migrateOperation) {
+            AutomationCompositionDefinition acDefinition, int removeElement) {
         var result = new BeanValidationResult("AutomationComposition", automationComposition);
         participantProvider.checkRegisteredParticipant(acDefinition);
         result.addResult(AcmUtils.validateAutomationComposition(automationComposition,
                 acDefinition.getServiceTemplate(),
-            acRuntimeParameterGroup.getAcmParameters().getToscaCompositionName(), migrateOperation));
+            acRuntimeParameterGroup.getAcmParameters().getToscaCompositionName(), removeElement));
 
         result.addResult(automationCompositionProvider.validateElementIds(automationComposition));
 
         var automationCompositionToRollback =
             automationCompositionProvider.getAutomationCompositionRollback(instanceId);
         var acFromDbCopy = new AutomationComposition(acFromDb);
-        acFromDbCopy.setCompositionTargetId(automationCompositionToRollback.getCompositionId());
         acFromDbCopy.setElements(automationCompositionToRollback.getElements().values().stream()
                 .collect(Collectors.toMap(AutomationCompositionElement::getId, AutomationCompositionElement::new)));
 
-        var acDefinitionTarget = acDefinitionProvider.getAcDefinition(acFromDbCopy.getCompositionTargetId());
-        var validationResult = validateAutomationComposition(acFromDbCopy, acDefinitionTarget, true);
+        var acDefinition = acDefinitionProvider.getAcDefinition(acFromDbCopy.getCompositionId());
+        var validationResult = validateAutomationComposition(acFromDbCopy, acDefinition, 0);
         if (!validationResult.isValid()) {
             throw new PfModelRuntimeException(Status.BAD_REQUEST, validationResult.getResult());
         }
             }
         }
 
-        updateAcForMigration(acFromDbCopy, acDefinitionTarget, DeployState.MIGRATION_REVERTING);
+        updateAcForMigration(acFromDbCopy, acDefinition, DeployState.MIGRATION_REVERTING);
         automationCompositionProvider.updateAutomationComposition(acFromDbCopy);
-        var acDefinition = acDefinitionProvider.getAcDefinition(acFromDbCopy.getCompositionId());
+        var acDefinitionTarget = acDefinitionProvider.getAcDefinition(acFromDbCopy.getCompositionTargetId());
         supervisionAcHandler.migrate(acFromDbCopy, acDefinition.getRevisionId(), acDefinitionTarget.getRevisionId());
     }
 
         elementsRemoved.forEach(element -> acFromDb.getElements().get(element.getId())
                 .setMigrationState(MigrationState.REMOVED));
 
-        var validationResult = validateAutomationComposition(acFromDb, acDefinitionTarget, true);
+        var validationResult = validateAutomationComposition(acFromDb, acDefinitionTarget, elementsRemoved.size());
         if (!validationResult.isValid()) {
             throw new PfModelRuntimeException(Status.BAD_REQUEST, validationResult.getResult());
         } else {
         for (var element : acFromDb.getElements().values()) {
             var name = element.getDefinition().getName();
             var migrationState = element.getMigrationState();
-            if (MigrationState.REMOVED.equals(migrationState) && oldAcDefinition != null) {
-                var participantId = oldAcDefinition.getElementStateMap().get(name).getParticipantId();
-                element.setParticipantId(participantId);
-            } else {
+            if (MigrationState.DEFAULT.equals(migrationState) || MigrationState.NEW.equals(migrationState)) {
                 var participantId = acDefinitionTarget.getElementStateMap().get(name).getParticipantId();
                 element.setParticipantId(participantId);
+            } else if (MigrationState.REMOVED.equals(migrationState) && oldAcDefinition != null) {
+                var participantId = oldAcDefinition.getElementStateMap().get(name).getParticipantId();
+                element.setParticipantId(participantId);
             }
         }
     }
 
 import org.onap.policy.clamp.models.acm.concepts.DeployState;
 import org.onap.policy.clamp.models.acm.concepts.LockState;
 import org.onap.policy.clamp.models.acm.concepts.MigrationState;
-import org.onap.policy.clamp.models.acm.concepts.ParticipantUtils;
 import org.onap.policy.clamp.models.acm.concepts.StateChangeResult;
 import org.onap.policy.clamp.models.acm.concepts.SubState;
 import org.onap.policy.clamp.models.acm.messages.kafka.participant.AutomationCompositionDeployAck;
 import org.onap.policy.clamp.models.acm.persistence.provider.AutomationCompositionProvider;
 import org.onap.policy.clamp.models.acm.persistence.provider.MessageProvider;
-import org.onap.policy.clamp.models.acm.utils.AcmUtils;
+import org.onap.policy.clamp.models.acm.utils.AcmStageUtils;
+import org.onap.policy.clamp.models.acm.utils.AcmStateUtils;
 import org.onap.policy.clamp.models.acm.utils.TimestampHelper;
 import org.onap.policy.models.base.PfModelRuntimeException;
 import org.slf4j.Logger;
                 }
             }
         } else {
-            AcmUtils.setCascadedState(automationComposition, DeployState.DEPLOYING, LockState.NONE);
+            AcmStateUtils.setCascadedState(automationComposition, DeployState.DEPLOYING, LockState.NONE);
         }
         automationComposition.setStateChangeResult(StateChangeResult.NO_ERROR);
-        var startPhase = ParticipantUtils.getFirstStartPhase(automationComposition, acDefinition.getServiceTemplate());
+        var startPhase = AcmStageUtils.getFirstStartPhase(automationComposition, acDefinition.getServiceTemplate());
         automationComposition.setPhase(startPhase);
         automationCompositionProvider.updateAutomationComposition(automationComposition);
         executor.execute(
                 }
             }
         } else {
-            AcmUtils.setCascadedState(automationComposition, DeployState.UNDEPLOYING, LockState.NONE);
+            AcmStateUtils.setCascadedState(automationComposition, DeployState.UNDEPLOYING, LockState.NONE);
         }
         automationComposition.setStateChangeResult(StateChangeResult.NO_ERROR);
-        var startPhase = ParticipantUtils.getFirstStartPhase(automationComposition, acDefinition.getServiceTemplate());
+        var startPhase = AcmStageUtils.getFirstStartPhase(automationComposition, acDefinition.getServiceTemplate());
         automationComposition.setPhase(startPhase);
         automationCompositionProvider.updateAutomationComposition(automationComposition);
         executor.execute(() -> automationCompositionStateChangePublisher.send(automationComposition,
                 }
             }
         } else {
-            AcmUtils.setCascadedState(automationComposition, DeployState.DEPLOYED, LockState.UNLOCKING);
+            AcmStateUtils.setCascadedState(automationComposition, DeployState.DEPLOYED, LockState.UNLOCKING);
         }
         automationComposition.setStateChangeResult(StateChangeResult.NO_ERROR);
-        var startPhase = ParticipantUtils.getFirstStartPhase(automationComposition, acDefinition.getServiceTemplate());
+        var startPhase = AcmStageUtils.getFirstStartPhase(automationComposition, acDefinition.getServiceTemplate());
         automationComposition.setPhase(startPhase);
         automationCompositionProvider.updateAutomationComposition(automationComposition);
         executor.execute(
      */
     public void prepare(AutomationComposition automationComposition, AutomationCompositionDefinition acDefinition) {
         LOGGER.info("Prepare pre-deploy request received for instanceID: {}", automationComposition.getInstanceId());
-        AcmUtils.setCascadedState(automationComposition, DeployState.UNDEPLOYED, LockState.NONE, SubState.PREPARING);
+        AcmStateUtils
+                .setCascadedState(automationComposition, DeployState.UNDEPLOYED, LockState.NONE, SubState.PREPARING);
         automationComposition.setStateChangeResult(StateChangeResult.NO_ERROR);
-        var stage = ParticipantUtils.getFirstStage(automationComposition, acDefinition.getServiceTemplate());
+        var stage = AcmStageUtils.getFirstStage(automationComposition, acDefinition.getServiceTemplate());
         automationComposition.setPhase(stage);
         automationCompositionProvider.updateAutomationComposition(automationComposition);
         executor.execute(() -> {
      */
     public void review(AutomationComposition automationComposition, AutomationCompositionDefinition acDefinition) {
         LOGGER.info("Prepare post-deploy request received for instanceID: {}", automationComposition.getInstanceId());
-        AcmUtils.setCascadedState(automationComposition, DeployState.DEPLOYED, LockState.LOCKED, SubState.REVIEWING);
+        AcmStateUtils
+                .setCascadedState(automationComposition, DeployState.DEPLOYED, LockState.LOCKED, SubState.REVIEWING);
         automationComposition.setStateChangeResult(StateChangeResult.NO_ERROR);
         automationCompositionProvider.updateAutomationComposition(automationComposition);
         executor.execute(() -> acPreparePublisher.sendReview(automationComposition, acDefinition.getRevisionId()));
                 }
             }
         } else {
-            AcmUtils.setCascadedState(automationComposition, DeployState.DEPLOYED, LockState.LOCKING);
+            AcmStateUtils.setCascadedState(automationComposition, DeployState.DEPLOYED, LockState.LOCKING);
         }
         automationComposition.setStateChangeResult(StateChangeResult.NO_ERROR);
-        var startPhase = ParticipantUtils.getFirstStartPhase(automationComposition, acDefinition.getServiceTemplate());
+        var startPhase = AcmStageUtils.getFirstStartPhase(automationComposition, acDefinition.getServiceTemplate());
         automationComposition.setPhase(startPhase);
         automationCompositionProvider.updateAutomationComposition(automationComposition);
         executor.execute(
      * @param acDefinition the AutomationCompositionDefinition
      */
     public void delete(AutomationComposition automationComposition, AutomationCompositionDefinition acDefinition) {
-        AcmUtils.setCascadedState(automationComposition, DeployState.DELETING, LockState.NONE);
+        AcmStateUtils.setCascadedState(automationComposition, DeployState.DELETING, LockState.NONE);
         automationComposition.setStateChangeResult(StateChangeResult.NO_ERROR);
-        var startPhase = ParticipantUtils.getFirstStartPhase(automationComposition, acDefinition.getServiceTemplate());
+        var startPhase = AcmStageUtils.getFirstStartPhase(automationComposition, acDefinition.getServiceTemplate());
         automationComposition.setPhase(startPhase);
         automationCompositionProvider.updateAutomationComposition(automationComposition);
         executor.execute(
         if ((acAckMessage.getStage() == null)
             && (acAckMessage.getAutomationCompositionResultMap() != null)) {
             for (var el : acAckMessage.getAutomationCompositionResultMap().values()) {
-                if (AcmUtils.isInTransitionalState(el.getDeployState(), el.getLockState(), SubState.NONE)) {
+                if (AcmStateUtils.isInTransitionalState(el.getDeployState(), el.getLockState(), SubState.NONE)) {
                     LOGGER.error("Not valid AutomationCompositionDeployAck message, states are not valid");
                     return false;
                 }
 
 import org.onap.policy.clamp.models.acm.concepts.ParticipantReplica;
 import org.onap.policy.clamp.models.acm.concepts.ParticipantState;
 import org.onap.policy.clamp.models.acm.concepts.ParticipantSupportedElementType;
-import org.onap.policy.clamp.models.acm.concepts.ParticipantUtils;
 import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantDeregister;
 import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantRegister;
 import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantReqSync;
 import org.onap.policy.clamp.models.acm.persistence.provider.AutomationCompositionProvider;
 import org.onap.policy.clamp.models.acm.persistence.provider.MessageProvider;
 import org.onap.policy.clamp.models.acm.persistence.provider.ParticipantProvider;
+import org.onap.policy.clamp.models.acm.utils.AcmStageUtils;
 import org.onap.policy.clamp.models.acm.utils.TimestampHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
         encryptionUtils.decryptInstanceProperties(automationComposition);
         if (DeployState.MIGRATING.equals(automationComposition.getDeployState())) {
             var acDefinition = acDefinitionProvider.getAcDefinition(automationComposition.getCompositionTargetId());
-            var stage = ParticipantUtils.getFirstStage(automationComposition, acDefinition.getServiceTemplate());
+            var stage = AcmStageUtils.getFirstStage(automationComposition, acDefinition.getServiceTemplate());
             if (automationComposition.getPhase().equals(stage)) {
                 // scenario first stage migration
                 var rollback = automationCompositionProvider.getAutomationCompositionRollback(automationCompositionId);
 
     public void send(AutomationComposition automationComposition, int stage, UUID revisionIdComposition,
                      UUID revisionIdCompositionTarget) {
         var acMigration = new AutomationCompositionMigration();
-        acMigration.setRollback(DeployState.MIGRATION_REVERTING.equals(automationComposition.getDeployState()));
+        var rollback = DeployState.MIGRATION_REVERTING.equals(automationComposition.getDeployState());
+        acMigration.setRollback(rollback);
         acMigration.setPrecheck(Boolean.TRUE.equals(automationComposition.getPrecheck()));
         acMigration.setCompositionId(automationComposition.getCompositionId());
         acMigration.setAutomationCompositionId(automationComposition.getInstanceId());
         acMigration.setRevisionIdInstance(automationComposition.getRevisionId());
         acMigration.setRevisionIdComposition(revisionIdComposition);
         acMigration.setRevisionIdCompositionTarget(revisionIdCompositionTarget);
-        var participantUpdatesList = AcmUtils.createParticipantDeployList(automationComposition, DeployOrder.MIGRATE);
+        var participantUpdatesList = AcmUtils.createParticipantDeployList(automationComposition,
+                rollback ? DeployOrder.MIGRATION_REVERT : DeployOrder.MIGRATE);
         acMigration.setParticipantUpdatesList(participantUpdatesList);
         acMigration.setParticipantIdList(participantUpdatesList.stream()
                 .map(ParticipantDeploy::getParticipantId).collect(Collectors.toSet()));
 
 import org.onap.policy.clamp.models.acm.concepts.AutomationComposition;
 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionElement;
 import org.onap.policy.clamp.models.acm.messages.kafka.participant.AutomationCompositionStateChange;
-import org.onap.policy.clamp.models.acm.utils.AcmUtils;
+import org.onap.policy.clamp.models.acm.utils.AcmStateUtils;
 import org.springframework.stereotype.Component;
 
 /**
         acsc.setCompositionId(automationComposition.getCompositionId());
         acsc.setAutomationCompositionId(automationComposition.getInstanceId());
         acsc.setMessageId(UUID.randomUUID());
-        acsc.setDeployOrderedState(AcmUtils.stateDeployToOrder(automationComposition.getDeployState()));
-        acsc.setLockOrderedState(AcmUtils.stateLockToOrder(automationComposition.getLockState()));
+        acsc.setDeployOrderedState(AcmStateUtils.stateDeployToOrder(automationComposition.getDeployState()));
+        acsc.setLockOrderedState(AcmStateUtils.stateLockToOrder(automationComposition.getLockState()));
         acsc.setStartPhase(startPhase);
         acsc.setFirstStartPhase(firstStartPhase);
         acsc.setRevisionIdInstance(automationComposition.getRevisionId());
 
 import org.onap.policy.clamp.models.acm.concepts.AutomationComposition;
 import org.onap.policy.clamp.models.acm.concepts.DeployState;
 import org.onap.policy.clamp.models.acm.concepts.MigrationState;
-import org.onap.policy.clamp.models.acm.concepts.ParticipantUtils;
 import org.onap.policy.clamp.models.acm.concepts.StateChangeResult;
 import org.onap.policy.clamp.models.acm.concepts.SubState;
 import org.onap.policy.clamp.models.acm.persistence.provider.AutomationCompositionProvider;
-import org.onap.policy.clamp.models.acm.utils.AcmUtils;
+import org.onap.policy.clamp.models.acm.utils.AcmStateUtils;
+import org.onap.policy.clamp.models.acm.utils.AcmTimeoutUtils;
 import org.onap.policy.clamp.models.acm.utils.TimestampHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
                 automationComposition.getSubState());
 
         var deployState = automationComposition.getDeployState();
+        if (DeployState.MIGRATING.equals(automationComposition.getDeployState())) {
+            // migration completed
+            automationComposition.setCompositionId(automationComposition.getCompositionTargetId());
+        }
         if (DeployState.MIGRATING.equals(automationComposition.getDeployState())
                 || DeployState.MIGRATION_REVERTING.equals(automationComposition.getDeployState())) {
-            // migration scenario
-            automationComposition.setCompositionId(automationComposition.getCompositionTargetId());
             automationComposition.setCompositionTargetId(null);
-
             for (var acElement : automationComposition.getElements().values()) {
                 if (MigrationState.NEW.equals(acElement.getMigrationState())) {
                     acElement.setMigrationState(MigrationState.DEFAULT);
                 }
             }
         }
-        automationComposition.setDeployState(AcmUtils.deployCompleted(deployState));
-        automationComposition.setLockState(AcmUtils.lockCompleted(deployState, automationComposition.getLockState()));
+        automationComposition.setDeployState(AcmStateUtils.deployCompleted(deployState));
+        automationComposition.setLockState(
+                AcmStateUtils.lockCompleted(deployState, automationComposition.getLockState()));
         automationComposition.setPhase(null);
         automationComposition.setSubState(SubState.NONE);
         automationComposition.setPrecheck(null);
             saveAndSync(automationComposition, updateSync);
             return;
         }
-        var name = ParticipantUtils.getOpName(automationComposition.getDeployState());
+        var name = AcmTimeoutUtils.getOpName(automationComposition.getDeployState());
         var element = automationComposition.getElements().values().stream()
                 .filter(el -> automationComposition.getDeployState().equals(el.getDeployState())).findFirst();
-        var maxWaitMs = element.map(automationCompositionElement -> ParticipantUtils.getTimeout(
+        var maxWaitMs = element.map(automationCompositionElement -> AcmTimeoutUtils.getTimeout(
                 automationCompositionElement.getProperties(), name, maxOperationWaitMs)).orElse(maxOperationWaitMs);
         var now = TimestampHelper.nowEpochMilli();
         var lastMsg = TimestampHelper.toEpochMilli(automationComposition.getLastMsg());
 
 import org.onap.policy.clamp.acm.runtime.supervision.comm.ParticipantSyncPublisher;
 import org.onap.policy.clamp.models.acm.concepts.AcTypeState;
 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionDefinition;
-import org.onap.policy.clamp.models.acm.concepts.ParticipantUtils;
 import org.onap.policy.clamp.models.acm.concepts.StateChangeResult;
 import org.onap.policy.clamp.models.acm.document.concepts.DocMessage;
 import org.onap.policy.clamp.models.acm.persistence.provider.AcDefinitionProvider;
+import org.onap.policy.clamp.models.acm.utils.AcmTimeoutUtils;
 import org.onap.policy.clamp.models.acm.utils.TimestampHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
             LOGGER.debug("The ac definition is in timeout {}", acDefinition.getCompositionId());
             return result;
         }
-        var name = ParticipantUtils.getOpName(acDefinition.getState());
-        var maxWaitMs = ParticipantUtils
+        var name = AcmTimeoutUtils.getOpName(acDefinition.getState());
+        var maxWaitMs = AcmTimeoutUtils
                 .getTimeout(acDefinition.getServiceTemplate().getMetadata(), name, maxOperationWaitMs);
         var lastMsg = TimestampHelper.toEpochMilli(acDefinition.getLastMsg());
         var now = TimestampHelper.nowEpochMilli();
 
 import org.onap.policy.clamp.models.acm.persistence.provider.AcDefinitionProvider;
 import org.onap.policy.clamp.models.acm.persistence.provider.AutomationCompositionProvider;
 import org.onap.policy.clamp.models.acm.persistence.provider.MessageProvider;
-import org.onap.policy.clamp.models.acm.utils.AcmUtils;
+import org.onap.policy.clamp.models.acm.utils.AcmStateUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
             automationCompositionOpt.ifPresent(ac -> updateSync.or(simpleScanner.scanMessage(ac, message)));
             messageProvider.removeMessage(message.getMessageId());
         }
-        if (automationCompositionOpt.isPresent()) {
-            var automationComposition = automationCompositionOpt.get();
-            if (automationComposition.getCompositionTargetId() != null) {
-                var acDefinitionTarget = acDefinitionMap.computeIfAbsent(automationComposition.getCompositionTargetId(),
-                        acDefinitionProvider::getAcDefinition);
-                var acDefinition = acDefinitionMap.computeIfAbsent(automationComposition.getCompositionId(),
-                        acDefinitionProvider::getAcDefinition);
+        automationCompositionOpt.ifPresent(ac -> scanAutomationComposition(ac, updateSync, acDefinitionMap));
+    }
+
+    private void scanAutomationComposition(final AutomationComposition automationComposition, UpdateSync updateSync,
+            Map<UUID, AutomationCompositionDefinition> acDefinitionMap) {
+        var acDefinition = acDefinitionMap.computeIfAbsent(automationComposition.getCompositionId(),
+                acDefinitionProvider::getAcDefinition);
+        if (AcmStateUtils.isMigrating(automationComposition.getDeployState())) {
+            var acDefinitionTarget = acDefinitionMap.computeIfAbsent(automationComposition.getCompositionTargetId(),
+                    acDefinitionProvider::getAcDefinition);
+            if (DeployState.MIGRATING.equals(automationComposition.getDeployState())) {
                 scanAutomationComposition(automationComposition, acDefinitionTarget, updateSync,
                         acDefinition.getRevisionId());
             } else {
-                var acDefinition = acDefinitionMap.computeIfAbsent(automationComposition.getCompositionId(),
-                        acDefinitionProvider::getAcDefinition);
                 scanAutomationComposition(automationComposition, acDefinition, updateSync,
-                        acDefinition.getRevisionId());
+                        acDefinitionTarget.getRevisionId());
             }
+        } else {
+            scanAutomationComposition(automationComposition, acDefinition, updateSync,
+                    acDefinition.getRevisionId());
         }
     }
 
             AutomationCompositionDefinition acDefinition, UpdateSync updateSync, UUID revisionIdComposition) {
         LOGGER.debug("scanning automation composition {} . . .", automationComposition.getInstanceId());
 
-        if (!AcmUtils.isInTransitionalState(automationComposition.getDeployState(),
+        if (!AcmStateUtils.isInTransitionalState(automationComposition.getDeployState(),
                 automationComposition.getLockState(), automationComposition.getSubState())
                 || StateChangeResult.FAILED.equals(automationComposition.getStateChangeResult())) {
             LOGGER.debug("automation composition {} scanned, OK", automationComposition.getInstanceId());
             return;
         }
 
-        if (DeployState.MIGRATING.equals(automationComposition.getDeployState())
-                || DeployState.MIGRATION_REVERTING.equals(automationComposition.getDeployState())
+        if (AcmStateUtils.isMigrating(automationComposition.getDeployState())
                 || SubState.PREPARING.equals(automationComposition.getSubState())) {
             stageScanner.scanStage(automationComposition, acDefinition, updateSync, revisionIdComposition);
         } else if (DeployState.UPDATING.equals(automationComposition.getDeployState())
 
 import org.onap.policy.clamp.models.acm.concepts.AutomationComposition;
 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionDefinition;
 import org.onap.policy.clamp.models.acm.concepts.DeployState;
-import org.onap.policy.clamp.models.acm.concepts.ParticipantUtils;
 import org.onap.policy.clamp.models.acm.persistence.provider.AutomationCompositionProvider;
-import org.onap.policy.clamp.models.acm.utils.AcmUtils;
+import org.onap.policy.clamp.models.acm.utils.AcmStageUtils;
+import org.onap.policy.clamp.models.acm.utils.AcmStateUtils;
 import org.springframework.stereotype.Component;
 
 @Component
                     .get(element.getDefinition().getName());
             int startPhase = toscaNodeTemplate != null
                     && element.getDefinition().getVersion().equals(toscaNodeTemplate.getVersion())
-                    ? ParticipantUtils.findStartPhase(toscaNodeTemplate.getProperties()) : 0;
+                    ? AcmStageUtils.findStartPhase(toscaNodeTemplate.getProperties()) : 0;
             defaultMin = Math.min(defaultMin, startPhase);
             defaultMax = Math.max(defaultMax, startPhase);
-            if (AcmUtils.isInTransitionalState(element.getDeployState(), element.getLockState(),
+            if (AcmStateUtils.isInTransitionalState(element.getDeployState(), element.getLockState(),
                     element.getSubState())) {
                 completed = false;
                 minSpNotCompleted = Math.min(minSpNotCompleted, startPhase);
             LOGGER.debug("automation composition scan: transition state {} {} not completed",
                     automationComposition.getDeployState(), automationComposition.getLockState());
 
-            var isForward =
-                    AcmUtils.isForward(automationComposition.getDeployState(), automationComposition.getLockState());
+            var isForward = AcmStateUtils
+                    .isForward(automationComposition.getDeployState(), automationComposition.getLockState());
 
             var nextSpNotCompleted = isForward ? minSpNotCompleted : maxSpNotCompleted;
 
 
 import org.onap.policy.clamp.acm.runtime.main.utils.EncryptionUtils;
 import org.onap.policy.clamp.acm.runtime.supervision.comm.ParticipantSyncPublisher;
 import org.onap.policy.clamp.models.acm.concepts.AutomationComposition;
-import org.onap.policy.clamp.models.acm.concepts.DeployState;
 import org.onap.policy.clamp.models.acm.concepts.StateChangeResult;
 import org.onap.policy.clamp.models.acm.concepts.SubState;
 import org.onap.policy.clamp.models.acm.document.concepts.DocMessage;
 import org.onap.policy.clamp.models.acm.persistence.provider.AutomationCompositionProvider;
-import org.onap.policy.clamp.models.acm.utils.AcmUtils;
+import org.onap.policy.clamp.models.acm.utils.AcmStateUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
      */
     public void simpleScan(final AutomationComposition automationComposition, UpdateSync updateSync) {
         var completed = automationComposition.getElements().values().stream()
-                .filter(element -> AcmUtils.isInTransitionalState(element.getDeployState(), element.getLockState(),
+                .filter(element -> AcmStateUtils.isInTransitionalState(element.getDeployState(), element.getLockState(),
                         element.getSubState())).findFirst().isEmpty();
 
         if (completed) {
 
 package org.onap.policy.clamp.acm.runtime.supervision.scanner;
 
 import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.HashSet;
 import java.util.List;
-import java.util.Set;
 import java.util.UUID;
 import org.onap.policy.clamp.acm.runtime.main.parameters.AcRuntimeParameterGroup;
 import org.onap.policy.clamp.acm.runtime.main.utils.EncryptionUtils;
 import org.onap.policy.clamp.acm.runtime.supervision.comm.ParticipantSyncPublisher;
 import org.onap.policy.clamp.models.acm.concepts.AutomationComposition;
 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionDefinition;
-import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionElement;
 import org.onap.policy.clamp.models.acm.concepts.DeployState;
-import org.onap.policy.clamp.models.acm.concepts.MigrationState;
-import org.onap.policy.clamp.models.acm.concepts.ParticipantUtils;
 import org.onap.policy.clamp.models.acm.concepts.StateChangeResult;
 import org.onap.policy.clamp.models.acm.concepts.SubState;
 import org.onap.policy.clamp.models.acm.persistence.provider.AutomationCompositionProvider;
-import org.onap.policy.clamp.models.acm.utils.AcmUtils;
+import org.onap.policy.clamp.models.acm.utils.AcmStageUtils;
+import org.onap.policy.clamp.models.acm.utils.AcmStateUtils;
 import org.springframework.stereotype.Component;
 
 @Component
         var minStageNotCompleted = 1000; // min stage not completed
         List<UUID> elementsDeleted = new ArrayList<>();
         for (var element : automationComposition.getElements().values()) {
-            if (AcmUtils.isInTransitionalState(element.getDeployState(), element.getLockState(),
+            if (AcmStateUtils.isInTransitionalState(element.getDeployState(), element.getLockState(),
                     element.getSubState())) {
-                var minStage = calculateMinStage(element, automationComposition, acDefinition);
-                int stage = element.getStage() != null ? element.getStage() : minStage;
+                var firstStage = AcmStageUtils.getFirstStage(element, acDefinition.getServiceTemplate());
+                int stage = element.getStage() != null ? element.getStage() : firstStage;
                 minStageNotCompleted = Math.min(minStageNotCompleted, stage);
                 completed = false;
-            } else if (DeployState.DELETED.equals(element.getDeployState())
+            } else if (element.getDeployState().equals(DeployState.DELETED)
                     && automationComposition.getStateChangeResult().equals(StateChangeResult.NO_ERROR)) {
                 // Migration with successful removal of element
                 elementsDeleted.add(element.getId());
             savePhase(automationComposition, minStageNotCompleted);
             updateSync.setUpdated(true);
             saveAndSync(automationComposition, updateSync);
-            LOGGER.debug("retry message AutomationCompositionMigration");
             var acToSend = new AutomationComposition(automationComposition);
             decryptInstanceProperties(acToSend);
             sendNextStage(acToSend, minStageNotCompleted, revisionIdComposition, acDefinition);
         }
     }
 
-    private Integer calculateMinStage(AutomationCompositionElement element, AutomationComposition automationComposition,
-                                      AutomationCompositionDefinition acDefinition) {
-        Set<Integer> stageSet = new HashSet<>();
-        if (! MigrationState.REMOVED.equals(element.getMigrationState())) {
-            var toscaNodeTemplate = acDefinition.getServiceTemplate().getToscaTopologyTemplate().getNodeTemplates()
-                    .get(element.getDefinition().getName());
-            stageSet = DeployState.MIGRATING.equals(automationComposition.getDeployState())
-                    || DeployState.MIGRATION_REVERTING.equals(automationComposition.getDeployState())
-                    ? ParticipantUtils.findStageSetMigrate(toscaNodeTemplate.getProperties())
-                    : ParticipantUtils.findStageSetPrepare(toscaNodeTemplate.getProperties());
-        }
-        return stageSet.stream().min(Comparator.comparing(Integer::valueOf)).orElse(0);
-    }
-
     private void removeDeletedElements(AutomationComposition automationComposition, List<UUID> elementsDeleted,
                                        UpdateSync updateSync) {
         for (var elementId : elementsDeleted) {
 
     private void sendNextStage(final AutomationComposition automationComposition, int minStageNotCompleted,
             UUID revisionIdComposition, AutomationCompositionDefinition acDefinition) {
-        if (DeployState.MIGRATING.equals(automationComposition.getDeployState())
-                || DeployState.MIGRATION_REVERTING.equals(automationComposition.getDeployState())) {
-            LOGGER.debug("retry message AutomationCompositionMigration");
+        if (DeployState.MIGRATING.equals(automationComposition.getDeployState())) {
+            LOGGER.debug("retry migrating message AutomationCompositionMigration");
             // acDefinition for migration is the Composition target
             acMigrationPublisher.send(automationComposition, minStageNotCompleted, revisionIdComposition,
                     acDefinition.getRevisionId());
-        }
-        if (SubState.PREPARING.equals(automationComposition.getSubState())) {
+        } else if (DeployState.MIGRATION_REVERTING.equals(automationComposition.getDeployState())) {
+            LOGGER.debug("retry rollback message AutomationCompositionMigration");
+            acMigrationPublisher.send(automationComposition, minStageNotCompleted, acDefinition.getRevisionId(),
+                    revisionIdComposition);
+        } else if (SubState.PREPARING.equals(automationComposition.getSubState())) {
             LOGGER.debug("retry message AutomationCompositionPrepare");
             acPreparePublisher.sendPrepare(automationComposition, minStageNotCompleted, acDefinition.getRevisionId());
         }
 
 import org.onap.policy.clamp.models.acm.persistence.provider.AutomationCompositionProvider;
 import org.onap.policy.clamp.models.acm.persistence.provider.ParticipantProvider;
 import org.onap.policy.clamp.models.acm.persistence.provider.ProviderUtils;
-import org.onap.policy.clamp.models.acm.utils.AcmUtils;
+import org.onap.policy.clamp.models.acm.utils.AcmStateUtils;
 import org.onap.policy.models.base.PfModelRuntimeException;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
 import org.onap.policy.models.tosca.simple.concepts.JpaToscaServiceTemplate;
         InstantiationUtils.assertInstantiationResponse(preCheckResponse, automationCompositionTarget);
 
         automationCompositionTarget.setPrecheck(false);
-        AcmUtils.setCascadedState(automationComposition, DeployState.DEPLOYED, LockState.LOCKED,
+        AcmStateUtils.setCascadedState(automationComposition, DeployState.DEPLOYED, LockState.LOCKED,
                 SubState.NONE);
         var instantiationResponse = instantiationProvider.updateAutomationComposition(compositionId,
                 automationCompositionTarget);
     @Test
     void testRollbackSuccess() {
         var acDefinitionProvider = mock(AcDefinitionProvider.class);
-        var acDefinition = CommonTestData.createAcDefinition(serviceTemplateMigration, AcTypeState.PRIMED);
+        var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
         var compositionId = acDefinition.getCompositionId();
         when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
 
         var automationComposition =
                 InstantiationUtils.getAutomationCompositionFromResource(AC_MIGRATE_JSON, "Crud");
         var instanceId = UUID.randomUUID();
+        var compositionTargetId = UUID.randomUUID();
         automationComposition.setInstanceId(instanceId);
         automationComposition.setCompositionId(compositionId);
+        automationComposition.setCompositionTargetId(compositionTargetId);
         automationComposition.setDeployState(DeployState.MIGRATING);
         automationComposition.setLockState(LockState.LOCKED);
         automationComposition.setStateChangeResult(StateChangeResult.FAILED);
                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
 
         var rollbackRecord = new AutomationCompositionRollback();
-        var compositionTargetId = UUID.randomUUID();
         rollbackRecord.setCompositionId(compositionTargetId);
         rollbackRecord.setInstanceId(instanceId);
         rollbackRecord.setElements(acRollback.getElements());
         var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
                 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider, new AcRuntimeParameterGroup(),
                 encryptionUtils);
-        var acDefinitionTarget = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
+        var acDefinitionTarget = CommonTestData.createAcDefinition(serviceTemplateMigration, AcTypeState.PRIMED);
         when(acDefinitionProvider.getAcDefinition(compositionTargetId)).thenReturn(acDefinitionTarget);
 
         instantiationProvider.rollback(compositionId, automationComposition.getInstanceId());
 
         when(automationCompositionProvider.findAutomationComposition(automationComposition.getInstanceId()))
                 .thenReturn(Optional.of(automationComposition));
 
-        var definitionTarget = createAutomationCompositionDefinition(AcTypeState.PRIMED);
-        definitionTarget.setCompositionId(compositionTargetId);
+        var acDefinitionTarget = createAutomationCompositionDefinition(AcTypeState.PRIMED);
+        acDefinitionTarget.setCompositionId(compositionTargetId);
         var acDefinitionProvider = createAcDefinitionProvider(AcTypeState.PRIMED);
-        when(acDefinitionProvider.getAcDefinition(compositionTargetId)).thenReturn(definitionTarget);
+        when(acDefinitionProvider.getAcDefinition(compositionTargetId)).thenReturn(acDefinitionTarget);
         var acDefinition = new AutomationCompositionDefinition();
         acDefinition.setCompositionId(COMPOSITION_ID);
         when(acDefinitionProvider.getAcDefinition(COMPOSITION_ID)).thenReturn(acDefinition);
                 messageProvider, monitoringScanner);
 
         supervisionScanner.run();
-        verify(stageScanner).scanStage(automationComposition, definitionTarget, new UpdateSync(),
-                acDefinition.getRevisionId());
+        verify(stageScanner).scanStage(automationComposition, acDefinition, new UpdateSync(),
+                acDefinitionTarget.getRevisionId());
         verify(messageProvider).removeJob(JOB_ID);
     }
 
 
         verify(acProvider).updateAutomationComposition(any(AutomationComposition.class));
 
         assertEquals(DeployState.DEPLOYED, automationComposition.getDeployState());
-        assertEquals(compositionTargetId, automationComposition.getCompositionId());
     }
 
     @Test