Add support for testing in ACM Participant Simulator

Support backward compatibility between participants and ACM-R.

Issue-ID: POLICY-4952
Change-Id: I115ab3f0ccf0a2d6ad9ec4b998ef175e9b8ca1b8
Signed-off-by: FrancescoFioraEst <francesco.fiora@est.tech>
diff --git a/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/acm/participant/sim/main/handler/AutomationCompositionElementHandler.java b/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/acm/participant/sim/main/handler/AutomationCompositionElementHandler.java
deleted file mode 100644
index 2cba379..0000000
--- a/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/acm/participant/sim/main/handler/AutomationCompositionElementHandler.java
+++ /dev/null
@@ -1,415 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- *  Copyright (C) 2023-2024 Nordix Foundation.
- * ================================================================================
- * 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.acm.participant.sim.main.handler;
-
-import java.lang.invoke.MethodHandles;
-import java.util.ArrayList;
-import java.util.Map;
-import java.util.UUID;
-import lombok.Getter;
-import lombok.Setter;
-import org.onap.policy.clamp.acm.participant.intermediary.api.CompositionDto;
-import org.onap.policy.clamp.acm.participant.intermediary.api.CompositionElementDto;
-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.AcElementListenerV2;
-import org.onap.policy.clamp.acm.participant.sim.model.InternalData;
-import org.onap.policy.clamp.acm.participant.sim.model.InternalDatas;
-import org.onap.policy.clamp.acm.participant.sim.model.SimConfig;
-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.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.StateChangeResult;
-import org.onap.policy.clamp.models.acm.utils.AcmUtils;
-import org.onap.policy.models.base.PfModelException;
-import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Component;
-
-/**
- * This class handles implementation of automationCompositionElement updates.
- */
-@Component
-public class AutomationCompositionElementHandler extends AcElementListenerV2 {
-
-    private static final Logger LOGGER = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
-
-    @Getter
-    @Setter
-    private SimConfig config = new SimConfig();
-
-    public AutomationCompositionElementHandler(ParticipantIntermediaryApi intermediaryApi) {
-        super(intermediaryApi);
-    }
-
-    /**
-     * Handle a deploy on a automation composition element.
-     *
-     * @param compositionElement the information of the Automation Composition Definition Element
-     * @param instanceElement the information of the Automation Composition Instance Element
-     * @throws PfModelException from Policy framework
-     */
-    @Override
-    public void deploy(CompositionElementDto compositionElement, InstanceElementDto instanceElement)
-            throws PfModelException {
-        LOGGER.debug("deploy call compositionElement: {}, instanceElement: {}", compositionElement, instanceElement);
-
-        if (!execution(config.getDeployTimerMs(), "Current Thread deploy is Interrupted during execution {}",
-            instanceElement.elementId())) {
-            return;
-        }
-
-        if (config.isDeploySuccess()) {
-            intermediaryApi.updateAutomationCompositionElementState(instanceElement.instanceId(),
-                instanceElement.elementId(), DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR,
-                "Deployed");
-        } else {
-            intermediaryApi.updateAutomationCompositionElementState(instanceElement.instanceId(),
-                instanceElement.elementId(), DeployState.UNDEPLOYED, null, StateChangeResult.FAILED,
-                "Deploy failed!");
-        }
-    }
-
-    private boolean execution(int timeMs, String msg, UUID elementId) {
-        long endTime = System.currentTimeMillis() + timeMs;
-        while (System.currentTimeMillis() < endTime) {
-            try {
-                if (Thread.currentThread().isInterrupted()) {
-                    LOGGER.debug(msg, elementId);
-                    return false;
-                }
-                Thread.sleep(10L);
-            } catch (InterruptedException e) {
-                LOGGER.debug(msg, elementId);
-                Thread.currentThread().interrupt();
-                return false;
-            }
-        }
-        return true;
-    }
-
-    /**
-     * Handle a automation composition element state change.
-     *
-     * @param compositionElement the information of the Automation Composition Definition Element
-     * @param instanceElement the information of the Automation Composition Instance Element
-     * @throws PfModelException from Policy framework
-     */
-    @Override
-    public void undeploy(CompositionElementDto compositionElement, InstanceElementDto instanceElement)
-        throws PfModelException {
-        LOGGER.debug("undeploy call compositionElement: {}, instanceElement: {}", compositionElement, instanceElement);
-
-        if (!execution(config.getUndeployTimerMs(), "Current Thread undeploy is Interrupted during execution {}",
-            instanceElement.elementId())) {
-            return;
-        }
-
-        if (config.isUndeploySuccess()) {
-            intermediaryApi.updateAutomationCompositionElementState(instanceElement.instanceId(),
-                instanceElement.elementId(), DeployState.UNDEPLOYED, null, StateChangeResult.NO_ERROR,
-                    "Undeployed");
-        } else {
-            intermediaryApi.updateAutomationCompositionElementState(instanceElement.instanceId(),
-                instanceElement.elementId(), DeployState.DEPLOYED, null, StateChangeResult.FAILED,
-                    "Undeploy failed!");
-        }
-    }
-
-    @Override
-    public void lock(CompositionElementDto compositionElement, InstanceElementDto instanceElement)
-        throws PfModelException {
-        LOGGER.debug("lock call compositionElement: {}, instanceElement: {}", compositionElement, instanceElement);
-
-        if (!execution(config.getLockTimerMs(), "Current Thread lock is Interrupted during execution {}",
-            instanceElement.elementId())) {
-            return;
-        }
-
-        if (config.isLockSuccess()) {
-            intermediaryApi.updateAutomationCompositionElementState(instanceElement.instanceId(),
-                instanceElement.elementId(), null, LockState.LOCKED, StateChangeResult.NO_ERROR, "Locked");
-        } else {
-            intermediaryApi.updateAutomationCompositionElementState(instanceElement.instanceId(),
-                instanceElement.elementId(), null, LockState.UNLOCKED, StateChangeResult.FAILED, "Lock failed!");
-        }
-    }
-
-    @Override
-    public void unlock(CompositionElementDto compositionElement, InstanceElementDto instanceElement)
-        throws PfModelException {
-        LOGGER.debug("unlock call compositionElement: {}, instanceElement: {}", compositionElement, instanceElement);
-
-        if (!execution(config.getUnlockTimerMs(), "Current Thread unlock is Interrupted during execution {}",
-            instanceElement.elementId())) {
-            return;
-        }
-
-        if (config.isUnlockSuccess()) {
-            intermediaryApi.updateAutomationCompositionElementState(instanceElement.instanceId(),
-                instanceElement.elementId(), null, LockState.UNLOCKED, StateChangeResult.NO_ERROR, "Unlocked");
-        } else {
-            intermediaryApi.updateAutomationCompositionElementState(instanceElement.instanceId(),
-                instanceElement.elementId(), null, LockState.LOCKED, StateChangeResult.FAILED, "Unlock failed!");
-        }
-    }
-
-    @Override
-    public void delete(CompositionElementDto compositionElement, InstanceElementDto instanceElement)
-        throws PfModelException {
-        LOGGER.debug("delete call compositionElement: {}, instanceElement: {}", compositionElement, instanceElement);
-
-        if (!execution(config.getDeleteTimerMs(), "Current Thread delete is Interrupted during execution {}",
-            instanceElement.elementId())) {
-            return;
-        }
-
-        if (config.isDeleteSuccess()) {
-            intermediaryApi.updateAutomationCompositionElementState(instanceElement.instanceId(),
-                instanceElement.elementId(), DeployState.DELETED, null, StateChangeResult.NO_ERROR, "Deleted");
-        } else {
-            intermediaryApi.updateAutomationCompositionElementState(instanceElement.instanceId(),
-                instanceElement.elementId(), DeployState.UNDEPLOYED, null, StateChangeResult.FAILED,
-                "Delete failed!");
-        }
-    }
-
-    @Override
-    public void update(CompositionElementDto compositionElement, InstanceElementDto instanceElement,
-                       InstanceElementDto instanceElementUpdated) throws PfModelException {
-        LOGGER.debug("update call compositionElement: {}, instanceElement: {}, instanceElementUpdated: {}",
-            compositionElement, instanceElement, instanceElementUpdated);
-
-        if (!execution(config.getUpdateTimerMs(), "Current Thread update is Interrupted during execution {}",
-            instanceElement.elementId())) {
-            return;
-        }
-
-        if (config.isUpdateSuccess()) {
-            intermediaryApi.updateAutomationCompositionElementState(
-                instanceElement.instanceId(), instanceElement.elementId(),
-                DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Updated");
-        } else {
-            intermediaryApi.updateAutomationCompositionElementState(
-                instanceElement.instanceId(), instanceElement.elementId(),
-                DeployState.DEPLOYED, null, StateChangeResult.FAILED, "Update failed!");
-        }
-    }
-
-    /**
-     * Get AutomationComposition.
-     *
-     * @return the AutomationCompositions
-     */
-    public AutomationCompositions getAutomationCompositions() {
-        var result = new AutomationCompositions();
-        result.setAutomationCompositionList(new ArrayList<>(intermediaryApi.getAutomationCompositions().values()));
-        return result;
-    }
-
-    public AutomationComposition getAutomationComposition(UUID instanceId) {
-        return intermediaryApi.getAutomationComposition(instanceId);
-    }
-
-    /**
-     * Set OutProperties.
-     *
-     * @param automationCompositionId the automationComposition Id
-     * @param elementId the automationComposition Element Id
-     * @param useState the useState
-     * @param operationalState the operationalState
-     * @param outProperties the outProperties
-     */
-    public void setOutProperties(UUID automationCompositionId, UUID elementId, String useState, String operationalState,
-            Map<String, Object> outProperties) {
-        intermediaryApi.sendAcElementInfo(automationCompositionId, elementId, useState, operationalState,
-                outProperties);
-    }
-
-    @Override
-    public void prime(CompositionDto composition) throws PfModelException {
-        LOGGER.debug("prime call composition: {}", composition);
-
-        if (!execution(config.getPrimeTimerMs(), "Current Thread prime is Interrupted during execution {}",
-            composition.compositionId())) {
-            return;
-        }
-
-        if (config.isPrimeSuccess()) {
-            intermediaryApi.updateCompositionState(composition.compositionId(),
-                AcTypeState.PRIMED, StateChangeResult.NO_ERROR, "Primed");
-        } else {
-            intermediaryApi.updateCompositionState(composition.compositionId(),
-                AcTypeState.COMMISSIONED, StateChangeResult.FAILED, "Prime failed!");
-        }
-    }
-
-    @Override
-    public void deprime(CompositionDto composition) throws PfModelException {
-        LOGGER.debug("deprime call composition: {}", composition);
-
-        if (!execution(config.getDeprimeTimerMs(), "Current Thread deprime is Interrupted during execution {}",
-            composition.compositionId())) {
-            return;
-        }
-
-        if (config.isDeprimeSuccess()) {
-            intermediaryApi.updateCompositionState(composition.compositionId(), AcTypeState.COMMISSIONED,
-                StateChangeResult.NO_ERROR, "Deprimed");
-        } else {
-            intermediaryApi.updateCompositionState(composition.compositionId(), AcTypeState.PRIMED,
-                StateChangeResult.FAILED, "Deprime failed!");
-        }
-    }
-
-    /**
-     * Get Instance Data List.
-     *
-     * @return the InternalDatas
-     */
-    public InternalDatas getDataList() {
-        var result = new InternalDatas();
-        var map = intermediaryApi.getAutomationCompositions();
-        for (var instance : map.values()) {
-            for (var element : instance.getElements().values()) {
-                var data = new InternalData();
-                data.setCompositionId(instance.getCompositionId());
-                data.setCompositionDefinitionElementId(element.getDefinition());
-                data.setAutomationCompositionId(instance.getInstanceId());
-                data.setAutomationCompositionElementId(element.getId());
-                data.setIntProperties(element.getProperties());
-                data.setOperationalState(element.getOperationalState());
-                data.setUseState(element.getUseState());
-                data.setOutProperties(element.getOutProperties());
-                result.getList().add(data);
-            }
-        }
-        return result;
-    }
-
-    @Override
-    public void handleRestartComposition(CompositionDto composition, AcTypeState state) throws PfModelException {
-        LOGGER.debug("restart composition definition call");
-        switch (state) {
-            case PRIMING:
-                prime(composition);
-                break;
-
-            case DEPRIMING:
-                deprime(composition);
-                break;
-
-            default:
-                intermediaryApi.updateCompositionState(composition.compositionId(), state,
-                    StateChangeResult.NO_ERROR, "Restarted");
-        }
-    }
-
-    @Override
-    public void handleRestartInstance(CompositionElementDto compositionElement, InstanceElementDto instanceElement,
-        DeployState deployState, LockState lockState) throws PfModelException {
-        LOGGER.debug("restart instance call");
-        if (!AcmUtils.isInTransitionalState(deployState, lockState)) {
-            intermediaryApi.updateAutomationCompositionElementState(
-                instanceElement.instanceId(), instanceElement.elementId(), deployState, lockState,
-                StateChangeResult.NO_ERROR, "Restarted");
-            return;
-        }
-        if (DeployState.DEPLOYING.equals(deployState)) {
-            deploy(compositionElement, instanceElement);
-            return;
-        }
-        if (DeployState.UNDEPLOYING.equals(deployState)) {
-            undeploy(compositionElement, instanceElement);
-            return;
-        }
-        if (DeployState.UPDATING.equals(deployState)) {
-            update(compositionElement, instanceElement, instanceElement);
-            return;
-        }
-        if (DeployState.DELETING.equals(deployState)) {
-            delete(compositionElement, instanceElement);
-            return;
-        }
-        if (LockState.LOCKING.equals(lockState)) {
-            lock(compositionElement, instanceElement);
-            return;
-        }
-        if (LockState.UNLOCKING.equals(lockState)) {
-            unlock(compositionElement, instanceElement);
-        }
-    }
-
-    /**
-     * Get Composition Data List.
-     *
-     * @return the InternalDatas
-     */
-    public InternalDatas getCompositionDataList() {
-        var acElementsDefinitions = intermediaryApi.getAcElementsDefinitions();
-        var internalDatas = new InternalDatas();
-        for (var entry : acElementsDefinitions.entrySet()) {
-            for (var acElementsDefinition : entry.getValue().values()) {
-                var internalData = new InternalData();
-                internalData.setCompositionId(entry.getKey());
-                internalData.setCompositionDefinitionElementId(acElementsDefinition.getAcElementDefinitionId());
-                internalData.setIntProperties(
-                        acElementsDefinition.getAutomationCompositionElementToscaNodeTemplate().getProperties());
-                internalData.setOutProperties(acElementsDefinition.getOutProperties());
-                internalDatas.getList().add(internalData);
-            }
-        }
-        return internalDatas;
-    }
-
-    public void setCompositionOutProperties(UUID compositionId, ToscaConceptIdentifier compositionDefinitionElementId,
-            Map<String, Object> outProperties) {
-        intermediaryApi.sendAcDefinitionInfo(compositionId, compositionDefinitionElementId, outProperties);
-
-    }
-
-    @Override
-    public void migrate(CompositionElementDto compositionElement, CompositionElementDto compositionElementTarget,
-                        InstanceElementDto instanceElement, InstanceElementDto instanceElementMigrate)
-        throws PfModelException {
-        LOGGER.debug("migrate call compositionElement: {}, compositionElementTarget: {}, instanceElement: {},"
-                + " instanceElementMigrate: {}",
-            compositionElement, compositionElementTarget, instanceElement, instanceElementMigrate);
-
-        if (!execution(config.getMigrateTimerMs(), "Current Thread migrate is Interrupted during execution {}",
-            instanceElement.elementId())) {
-            return;
-        }
-
-        if (config.isMigrateSuccess()) {
-            intermediaryApi.updateAutomationCompositionElementState(
-                instanceElement.instanceId(), instanceElement.elementId(),
-                DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Migrated");
-        } else {
-            intermediaryApi.updateAutomationCompositionElementState(
-                instanceElement.instanceId(), instanceElement.elementId(),
-                DeployState.DEPLOYED, null, StateChangeResult.FAILED, "Migrate failed!");
-        }
-    }
-}
diff --git a/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/acm/participant/sim/main/handler/AutomationCompositionElementHandlerV1.java b/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/acm/participant/sim/main/handler/AutomationCompositionElementHandlerV1.java
new file mode 100644
index 0000000..f503987
--- /dev/null
+++ b/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/acm/participant/sim/main/handler/AutomationCompositionElementHandlerV1.java
@@ -0,0 +1,170 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2024 Nordix Foundation.
+ * ================================================================================
+ * 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.acm.participant.sim.main.handler;
+
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import org.onap.policy.clamp.acm.participant.intermediary.api.ParticipantIntermediaryApi;
+import org.onap.policy.clamp.acm.participant.intermediary.api.impl.AcElementListenerV1;
+import org.onap.policy.clamp.models.acm.concepts.AcElementDeploy;
+import org.onap.policy.clamp.models.acm.concepts.AcTypeState;
+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.StateChangeResult;
+import org.onap.policy.clamp.models.acm.utils.AcmUtils;
+import org.onap.policy.models.base.PfModelException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
+import org.springframework.stereotype.Component;
+
+@ConditionalOnExpression("'${element.handler}'=='AcElementHandlerV1'")
+@Component
+public class AutomationCompositionElementHandlerV1 extends AcElementListenerV1 {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(AutomationCompositionElementHandlerV1.class);
+
+    private final SimulatorService simulatorService;
+
+    public AutomationCompositionElementHandlerV1(ParticipantIntermediaryApi intermediaryApi,
+        SimulatorService simulatorService) {
+        super(intermediaryApi);
+        this.simulatorService = simulatorService;
+    }
+
+    @Override
+    public void deploy(UUID instanceId, AcElementDeploy element, Map<String, Object> properties)
+            throws PfModelException {
+        LOGGER.debug("deploy call instanceId: {}, element: {}, properties: {}", instanceId, element, properties);
+        simulatorService.deploy(instanceId, element.getId());
+    }
+
+    @Override
+    public void undeploy(UUID instanceId, UUID elementId) throws PfModelException {
+        LOGGER.debug("undeploy call instanceId: {}, elementId: {}", instanceId, elementId);
+        simulatorService.undeploy(instanceId, elementId);
+    }
+
+    @Override
+    public void lock(UUID instanceId, UUID elementId) throws PfModelException {
+        LOGGER.debug("lock call instanceId: {}, elementId: {}", instanceId, elementId);
+        simulatorService.lock(instanceId, elementId);
+    }
+
+    @Override
+    public void unlock(UUID instanceId, UUID elementId) throws PfModelException {
+        LOGGER.debug("unlock call instanceId: {}, elementId: {}", instanceId, elementId);
+        simulatorService.unlock(instanceId, elementId);
+    }
+
+    @Override
+    public void delete(UUID instanceId, UUID elementId) throws PfModelException {
+        LOGGER.debug("delete call instanceId: {}, elementId: {}", instanceId, elementId);
+        simulatorService.delete(instanceId, elementId);
+    }
+
+    @Override
+    public void update(UUID instanceId, AcElementDeploy element, Map<String, Object> properties)
+            throws PfModelException {
+        LOGGER.debug("update call instanceId: {}, element: {}, properties: {}", instanceId, element, properties);
+        simulatorService.update(instanceId, element.getId());
+    }
+
+    @Override
+    public void prime(UUID compositionId, List<AutomationCompositionElementDefinition> elementDefinitionList)
+            throws PfModelException {
+        LOGGER.debug("prime call compositionId: {}, elementDefinitionList: {}", compositionId, elementDefinitionList);
+        simulatorService.prime(compositionId);
+    }
+
+    @Override
+    public void deprime(UUID compositionId) throws PfModelException {
+        LOGGER.debug("deprime call compositionId: {}", compositionId);
+        simulatorService.deprime(compositionId);
+    }
+
+    @Override
+    public void handleRestartComposition(UUID compositionId,
+        List<AutomationCompositionElementDefinition> elementDefinitionList, AcTypeState state)
+            throws PfModelException {
+        LOGGER.debug("restart composition definition call compositionId: {}, elementDefinitionList: {}, state: {}",
+                compositionId, elementDefinitionList, state);
+
+        switch (state) {
+            case PRIMING:
+                prime(compositionId, elementDefinitionList);
+                break;
+
+            case DEPRIMING:
+                deprime(compositionId);
+                break;
+
+            default:
+                intermediaryApi.updateCompositionState(compositionId, state, StateChangeResult.NO_ERROR, "Restarted");
+        }
+    }
+
+    @Override
+    public void handleRestartInstance(UUID instanceId, AcElementDeploy element,
+        Map<String, Object> properties, DeployState deployState, LockState lockState) throws PfModelException {
+        LOGGER.debug("restart instance call instanceId: {}, element: {}, properties: {},"
+                + "deployState: {}, lockState: {}", instanceId, element, properties, deployState, lockState);
+
+        if (!AcmUtils.isInTransitionalState(deployState, lockState)) {
+            intermediaryApi.updateAutomationCompositionElementState(instanceId, element.getId(),
+                    deployState, lockState, StateChangeResult.NO_ERROR, "Restarted");
+            return;
+        }
+        if (DeployState.DEPLOYING.equals(deployState)) {
+            deploy(instanceId, element, properties);
+            return;
+        }
+        if (DeployState.UNDEPLOYING.equals(deployState)) {
+            undeploy(instanceId, element.getId());
+            return;
+        }
+        if (DeployState.UPDATING.equals(deployState)) {
+            update(instanceId, element, properties);
+            return;
+        }
+        if (DeployState.DELETING.equals(deployState)) {
+            delete(instanceId, element.getId());
+            return;
+        }
+        if (LockState.LOCKING.equals(lockState)) {
+            lock(instanceId, element.getId());
+            return;
+        }
+        if (LockState.UNLOCKING.equals(lockState)) {
+            unlock(instanceId, element.getId());
+        }
+    }
+
+    @Override
+    public void migrate(UUID instanceId, AcElementDeploy element, UUID compositionTargetId,
+        Map<String, Object> properties) throws PfModelException {
+        LOGGER.debug("migrate call instanceId: {}, element: {}, compositionTargetId: {}, properties: {}",
+                instanceId, element, compositionTargetId, properties);
+        simulatorService.migrate(instanceId, element.getId());
+    }
+}
diff --git a/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/acm/participant/sim/main/handler/AutomationCompositionElementHandlerV2.java b/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/acm/participant/sim/main/handler/AutomationCompositionElementHandlerV2.java
new file mode 100644
index 0000000..e836c98
--- /dev/null
+++ b/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/acm/participant/sim/main/handler/AutomationCompositionElementHandlerV2.java
@@ -0,0 +1,187 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2023-2024 Nordix Foundation.
+ * ================================================================================
+ * 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.acm.participant.sim.main.handler;
+
+import org.onap.policy.clamp.acm.participant.intermediary.api.CompositionDto;
+import org.onap.policy.clamp.acm.participant.intermediary.api.CompositionElementDto;
+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.AcElementListenerV2;
+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.StateChangeResult;
+import org.onap.policy.clamp.models.acm.utils.AcmUtils;
+import org.onap.policy.models.base.PfModelException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
+import org.springframework.stereotype.Component;
+
+/**
+ * This class handles implementation of automationCompositionElement updates.
+ */
+@ConditionalOnExpression("'${element.handler:AcElementHandlerV2}' == 'AcElementHandlerV2'")
+@Component
+public class AutomationCompositionElementHandlerV2 extends AcElementListenerV2 {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(AutomationCompositionElementHandlerV2.class);
+
+    private final SimulatorService simulatorService;
+
+    public AutomationCompositionElementHandlerV2(ParticipantIntermediaryApi intermediaryApi,
+        SimulatorService simulatorService) {
+        super(intermediaryApi);
+        this.simulatorService = simulatorService;
+    }
+
+    /**
+     * Handle a deploy on a automation composition element.
+     *
+     * @param compositionElement the information of the Automation Composition Definition Element
+     * @param instanceElement the information of the Automation Composition Instance Element
+     * @throws PfModelException from Policy framework
+     */
+    @Override
+    public void deploy(CompositionElementDto compositionElement, InstanceElementDto instanceElement)
+            throws PfModelException {
+        LOGGER.debug("deploy call compositionElement: {}, instanceElement: {}", compositionElement, instanceElement);
+        simulatorService.deploy(instanceElement.instanceId(), instanceElement.elementId());
+    }
+
+    /**
+     * Handle a automation composition element state change.
+     *
+     * @param compositionElement the information of the Automation Composition Definition Element
+     * @param instanceElement the information of the Automation Composition Instance Element
+     * @throws PfModelException from Policy framework
+     */
+    @Override
+    public void undeploy(CompositionElementDto compositionElement, InstanceElementDto instanceElement)
+            throws PfModelException {
+        LOGGER.debug("undeploy call compositionElement: {}, instanceElement: {}", compositionElement, instanceElement);
+        simulatorService.undeploy(instanceElement.instanceId(), instanceElement.elementId());
+    }
+
+    @Override
+    public void lock(CompositionElementDto compositionElement, InstanceElementDto instanceElement)
+            throws PfModelException {
+        LOGGER.debug("lock call compositionElement: {}, instanceElement: {}", compositionElement, instanceElement);
+        simulatorService.lock(instanceElement.instanceId(), instanceElement.elementId());
+    }
+
+    @Override
+    public void unlock(CompositionElementDto compositionElement, InstanceElementDto instanceElement)
+            throws PfModelException {
+        LOGGER.debug("unlock call compositionElement: {}, instanceElement: {}", compositionElement, instanceElement);
+        simulatorService.unlock(instanceElement.instanceId(), instanceElement.elementId());
+    }
+
+    @Override
+    public void delete(CompositionElementDto compositionElement, InstanceElementDto instanceElement)
+            throws PfModelException {
+        LOGGER.debug("delete call compositionElement: {}, instanceElement: {}", compositionElement, instanceElement);
+        simulatorService.delete(instanceElement.instanceId(), instanceElement.elementId());
+    }
+
+    @Override
+    public void update(CompositionElementDto compositionElement, InstanceElementDto instanceElement,
+                       InstanceElementDto instanceElementUpdated) throws PfModelException {
+        LOGGER.debug("update call compositionElement: {}, instanceElement: {}, instanceElementUpdated: {}",
+                compositionElement, instanceElement, instanceElementUpdated);
+        simulatorService.update(instanceElement.instanceId(), instanceElement.elementId());
+    }
+
+    @Override
+    public void prime(CompositionDto composition) throws PfModelException {
+        LOGGER.debug("prime call composition: {}", composition);
+        simulatorService.prime(composition.compositionId());
+    }
+
+    @Override
+    public void deprime(CompositionDto composition) throws PfModelException {
+        LOGGER.debug("deprime call composition: {}", composition);
+        simulatorService.deprime(composition.compositionId());
+    }
+
+    @Override
+    public void handleRestartComposition(CompositionDto composition, AcTypeState state) throws PfModelException {
+        LOGGER.debug("restart composition definition call");
+        switch (state) {
+            case PRIMING:
+                prime(composition);
+                break;
+
+            case DEPRIMING:
+                deprime(composition);
+                break;
+
+            default:
+                intermediaryApi.updateCompositionState(composition.compositionId(), state,
+                        StateChangeResult.NO_ERROR, "Restarted");
+        }
+    }
+
+    @Override
+    public void handleRestartInstance(CompositionElementDto compositionElement, InstanceElementDto instanceElement,
+                                      DeployState deployState, LockState lockState) throws PfModelException {
+        LOGGER.debug("restart instance call");
+        if (!AcmUtils.isInTransitionalState(deployState, lockState)) {
+            intermediaryApi.updateAutomationCompositionElementState(
+                    instanceElement.instanceId(), instanceElement.elementId(), deployState, lockState,
+                    StateChangeResult.NO_ERROR, "Restarted");
+            return;
+        }
+        if (DeployState.DEPLOYING.equals(deployState)) {
+            deploy(compositionElement, instanceElement);
+            return;
+        }
+        if (DeployState.UNDEPLOYING.equals(deployState)) {
+            undeploy(compositionElement, instanceElement);
+            return;
+        }
+        if (DeployState.UPDATING.equals(deployState)) {
+            update(compositionElement, instanceElement, instanceElement);
+            return;
+        }
+        if (DeployState.DELETING.equals(deployState)) {
+            delete(compositionElement, instanceElement);
+            return;
+        }
+        if (LockState.LOCKING.equals(lockState)) {
+            lock(compositionElement, instanceElement);
+            return;
+        }
+        if (LockState.UNLOCKING.equals(lockState)) {
+            unlock(compositionElement, instanceElement);
+        }
+    }
+
+    @Override
+    public void migrate(CompositionElementDto compositionElement, CompositionElementDto compositionElementTarget,
+                        InstanceElementDto instanceElement, InstanceElementDto instanceElementMigrate)
+            throws PfModelException {
+        LOGGER.debug("migrate call compositionElement: {}, compositionElementTarget: {}, instanceElement: {},"
+                        + " instanceElementMigrate: {}",
+                compositionElement, compositionElementTarget, instanceElement, instanceElementMigrate);
+        simulatorService.migrate(instanceElement.instanceId(), instanceElement.elementId());
+    }
+}
diff --git a/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/acm/participant/sim/main/handler/SimulatorService.java b/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/acm/participant/sim/main/handler/SimulatorService.java
new file mode 100644
index 0000000..d37edf7
--- /dev/null
+++ b/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/acm/participant/sim/main/handler/SimulatorService.java
@@ -0,0 +1,345 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2024 Nordix Foundation.
+ * ================================================================================
+ * 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.acm.participant.sim.main.handler;
+
+import java.util.ArrayList;
+import java.util.Map;
+import java.util.UUID;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import lombok.Setter;
+import org.onap.policy.clamp.acm.participant.intermediary.api.ParticipantIntermediaryApi;
+import org.onap.policy.clamp.acm.participant.sim.model.InternalData;
+import org.onap.policy.clamp.acm.participant.sim.model.InternalDatas;
+import org.onap.policy.clamp.acm.participant.sim.model.SimConfig;
+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.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.StateChangeResult;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+/**
+ * This class handles implementation of Simulator Service.
+ */
+@Service
+@RequiredArgsConstructor
+public class SimulatorService {
+
+    private final ParticipantIntermediaryApi intermediaryApi;
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(SimulatorService.class);
+
+    @Getter
+    @Setter
+    private SimConfig config = new SimConfig();
+
+    /**
+     * Get AutomationComposition.
+     *
+     * @return the AutomationCompositions
+     */
+    public AutomationCompositions getAutomationCompositions() {
+        var result = new AutomationCompositions();
+        result.setAutomationCompositionList(new ArrayList<>(intermediaryApi.getAutomationCompositions().values()));
+        return result;
+    }
+
+    public AutomationComposition getAutomationComposition(UUID instanceId) {
+        return intermediaryApi.getAutomationComposition(instanceId);
+    }
+
+    /**
+     * Set OutProperties.
+     *
+     * @param instanceId the automationComposition Id
+     * @param elementId the automationComposition Element Id
+     * @param useState the useState
+     * @param operationalState the operationalState
+     * @param outProperties the outProperties
+     */
+    public void setOutProperties(UUID instanceId, UUID elementId, String useState, String operationalState,
+                                 Map<String, Object> outProperties) {
+        intermediaryApi.sendAcElementInfo(instanceId, elementId, useState, operationalState,
+                outProperties);
+    }
+
+    /**
+     * Get Instance Data List.
+     *
+     * @return the InternalDatas
+     */
+    public InternalDatas getDataList() {
+        var result = new InternalDatas();
+        var map = intermediaryApi.getAutomationCompositions();
+        for (var instance : map.values()) {
+            for (var element : instance.getElements().values()) {
+                var data = new InternalData();
+                data.setCompositionId(instance.getCompositionId());
+                data.setAutomationCompositionId(instance.getInstanceId());
+                data.setAutomationCompositionElementId(element.getId());
+                data.setIntProperties(element.getProperties());
+                data.setOperationalState(element.getOperationalState());
+                data.setUseState(element.getUseState());
+                data.setOutProperties(element.getOutProperties());
+                result.getList().add(data);
+            }
+        }
+        return result;
+    }
+
+    /**
+     * Get Composition Data List.
+     *
+     * @return the InternalDatas
+     */
+    public InternalDatas getCompositionDataList() {
+        var acElementsDefinitions = intermediaryApi.getAcElementsDefinitions();
+        var internalDatas = new InternalDatas();
+        for (var entry : acElementsDefinitions.entrySet()) {
+            for (var acElementsDefinition : entry.getValue().values()) {
+                var internalData = new InternalData();
+                internalData.setCompositionId(entry.getKey());
+                internalData.setCompositionDefinitionElementId(acElementsDefinition.getAcElementDefinitionId());
+                internalData.setIntProperties(
+                        acElementsDefinition.getAutomationCompositionElementToscaNodeTemplate().getProperties());
+                internalData.setOutProperties(acElementsDefinition.getOutProperties());
+                internalDatas.getList().add(internalData);
+            }
+        }
+        return internalDatas;
+    }
+
+    public void setCompositionOutProperties(UUID compositionId, ToscaConceptIdentifier compositionDefinitionElementId,
+                                            Map<String, Object> outProperties) {
+        intermediaryApi.sendAcDefinitionInfo(compositionId, compositionDefinitionElementId, outProperties);
+
+    }
+
+    private boolean execution(int timeMs, String msg, UUID elementId) {
+        long endTime = System.currentTimeMillis() + timeMs;
+        while (System.currentTimeMillis() < endTime) {
+            try {
+                if (Thread.currentThread().isInterrupted()) {
+                    LOGGER.debug(msg, elementId);
+                    return false;
+                }
+                Thread.sleep(10L);
+            } catch (InterruptedException e) {
+                LOGGER.debug(msg, elementId);
+                Thread.currentThread().interrupt();
+                return false;
+            }
+        }
+        return true;
+    }
+
+    /**
+     * Handle a deploy on a automation composition element.
+     *
+     * @param instanceId the instanceId
+     * @param elementId the elementId
+     */
+    public void deploy(UUID instanceId, UUID elementId) {
+        if (!execution(getConfig().getDeployTimerMs(),
+                "Current Thread deploy is Interrupted during execution {}", elementId)) {
+            return;
+        }
+
+        if (getConfig().isDeploySuccess()) {
+            intermediaryApi.updateAutomationCompositionElementState(instanceId, elementId,
+                    DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Deployed");
+        } else {
+            intermediaryApi.updateAutomationCompositionElementState(instanceId, elementId,
+                    DeployState.UNDEPLOYED, null, StateChangeResult.FAILED, "Deploy failed!");
+        }
+    }
+
+    /**
+     * Handle an udeploy on a automation composition element.
+     *
+     * @param instanceId the instanceId
+     * @param elementId the elementId
+     */
+    public void undeploy(UUID instanceId, UUID elementId) {
+        if (!execution(getConfig().getUndeployTimerMs(),
+                "Current Thread undeploy is Interrupted during execution {}", elementId)) {
+            return;
+        }
+
+        if (getConfig().isUndeploySuccess()) {
+            intermediaryApi.updateAutomationCompositionElementState(instanceId, elementId,
+                    DeployState.UNDEPLOYED, null, StateChangeResult.NO_ERROR, "Undeployed");
+        } else {
+            intermediaryApi.updateAutomationCompositionElementState(instanceId, elementId,
+                    DeployState.DEPLOYED, null, StateChangeResult.FAILED, "Undeploy failed!");
+        }
+    }
+
+    /**
+     * Handle a lock on a automation composition element.
+     *
+     * @param instanceId the instanceId
+     * @param elementId the elementId
+     */
+    public void lock(UUID instanceId, UUID elementId) {
+        if (!execution(getConfig().getLockTimerMs(),
+                "Current Thread lock is Interrupted during execution {}", elementId)) {
+            return;
+        }
+
+        if (getConfig().isLockSuccess()) {
+            intermediaryApi.updateAutomationCompositionElementState(instanceId, elementId,
+                    null, LockState.LOCKED, StateChangeResult.NO_ERROR, "Locked");
+        } else {
+            intermediaryApi.updateAutomationCompositionElementState(instanceId, elementId,
+                    null, LockState.UNLOCKED, StateChangeResult.FAILED, "Lock failed!");
+        }
+    }
+
+    /**
+     * Handle an unlock on a automation composition element.
+     *
+     * @param instanceId the instanceId
+     * @param elementId the elementId
+     */
+    public void unlock(UUID instanceId, UUID elementId) {
+        if (!execution(getConfig().getUnlockTimerMs(),
+                "Current Thread unlock is Interrupted during execution {}", elementId)) {
+            return;
+        }
+
+        if (getConfig().isUnlockSuccess()) {
+            intermediaryApi.updateAutomationCompositionElementState(instanceId, elementId,
+                    null, LockState.UNLOCKED, StateChangeResult.NO_ERROR, "Unlocked");
+        } else {
+            intermediaryApi.updateAutomationCompositionElementState(instanceId, elementId,
+                    null, LockState.LOCKED, StateChangeResult.FAILED, "Unlock failed!");
+        }
+    }
+
+    /**
+     * Handle a delete on a automation composition element.
+     *
+     * @param instanceId the instanceId
+     * @param elementId the elementId
+     */
+    public void delete(UUID instanceId, UUID elementId) {
+        if (!execution(getConfig().getDeleteTimerMs(),
+                "Current Thread delete is Interrupted during execution {}", elementId)) {
+            return;
+        }
+
+        if (getConfig().isDeleteSuccess()) {
+            intermediaryApi.updateAutomationCompositionElementState(instanceId, elementId,
+                    DeployState.DELETED, null, StateChangeResult.NO_ERROR, "Deleted");
+        } else {
+            intermediaryApi.updateAutomationCompositionElementState(instanceId, elementId,
+                    DeployState.UNDEPLOYED, null, StateChangeResult.FAILED, "Delete failed!");
+        }
+    }
+
+    /**
+     * Handle an update on a automation composition element.
+     *
+     * @param instanceId the instanceId
+     * @param elementId the elementId
+     */
+    public void update(UUID instanceId, UUID elementId) {
+        if (!execution(getConfig().getUpdateTimerMs(),
+                "Current Thread update is Interrupted during execution {}", elementId)) {
+            return;
+        }
+
+        if (getConfig().isUpdateSuccess()) {
+            intermediaryApi.updateAutomationCompositionElementState(instanceId, elementId,
+                    DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Updated");
+        } else {
+            intermediaryApi.updateAutomationCompositionElementState(instanceId, elementId,
+                    DeployState.DEPLOYED, null, StateChangeResult.FAILED, "Update failed!");
+        }
+    }
+
+    /**
+     * Handle a prime on a automation composition definition.
+     *
+     * @param compositionId the compositionId
+     */
+    public void prime(UUID compositionId) {
+        if (!execution(getConfig().getPrimeTimerMs(),
+                "Current Thread prime is Interrupted during execution {}", compositionId)) {
+            return;
+        }
+
+        if (getConfig().isPrimeSuccess()) {
+            intermediaryApi.updateCompositionState(compositionId, AcTypeState.PRIMED, StateChangeResult.NO_ERROR,
+                    "Primed");
+        } else {
+            intermediaryApi.updateCompositionState(compositionId, AcTypeState.COMMISSIONED, StateChangeResult.FAILED,
+                    "Prime failed!");
+        }
+    }
+
+    /**
+     * Handle a deprime on a automation composition definition.
+     *
+     * @param compositionId the compositionId
+     */
+    public void deprime(UUID compositionId) {
+        if (!execution(getConfig().getDeprimeTimerMs(),
+                "Current Thread deprime is Interrupted during execution {}", compositionId)) {
+            return;
+        }
+
+        if (getConfig().isDeprimeSuccess()) {
+            intermediaryApi.updateCompositionState(compositionId, AcTypeState.COMMISSIONED, StateChangeResult.NO_ERROR,
+                    "Deprimed");
+        } else {
+            intermediaryApi.updateCompositionState(compositionId, AcTypeState.PRIMED, StateChangeResult.FAILED,
+                    "Deprime failed!");
+        }
+    }
+
+    /**
+     * Handle a migrate on a automation composition element.
+     *
+     * @param instanceId the instanceId
+     * @param elementId the elementId
+     */
+    public void migrate(UUID instanceId, UUID elementId) {
+        if (!execution(getConfig().getMigrateTimerMs(),
+                "Current Thread migrate is Interrupted during execution {}", elementId)) {
+            return;
+        }
+
+        if (getConfig().isMigrateSuccess()) {
+            intermediaryApi.updateAutomationCompositionElementState(instanceId, elementId,
+                    DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Migrated");
+        } else {
+            intermediaryApi.updateAutomationCompositionElementState(instanceId, elementId,
+                    DeployState.DEPLOYED, null, StateChangeResult.FAILED, "Migrate failed!");
+        }
+    }
+}
diff --git a/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/acm/participant/sim/rest/SimulatorController.java b/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/acm/participant/sim/rest/SimulatorController.java
index cf4ac8e..5863fed 100644
--- a/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/acm/participant/sim/rest/SimulatorController.java
+++ b/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/acm/participant/sim/rest/SimulatorController.java
@@ -1,6 +1,6 @@
 /*-
  * ============LICENSE_START=======================================================
- *  Copyright (C) 2023 Nordix Foundation.
+ *  Copyright (C) 2023-2024 Nordix Foundation.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -25,7 +25,7 @@
 import java.util.UUID;
 import lombok.RequiredArgsConstructor;
 import org.onap.policy.clamp.acm.participant.sim.controller.genapi.SimulatorParticipantControllerApi;
-import org.onap.policy.clamp.acm.participant.sim.main.handler.AutomationCompositionElementHandler;
+import org.onap.policy.clamp.acm.participant.sim.main.handler.SimulatorService;
 import org.onap.policy.clamp.acm.participant.sim.model.InternalData;
 import org.onap.policy.clamp.acm.participant.sim.model.InternalDatas;
 import org.onap.policy.clamp.acm.participant.sim.model.SimConfig;
@@ -42,33 +42,33 @@
 @RequestMapping(value = "/v2", produces = {MediaType.APPLICATION_JSON})
 public class SimulatorController implements SimulatorParticipantControllerApi {
 
-    private final AutomationCompositionElementHandler automationCompositionElementHandler;
+    private final SimulatorService simulatorService;
 
     @Override
     public ResponseEntity<SimConfig> getConfig(UUID xonapRequestId) {
-        return new ResponseEntity<>(automationCompositionElementHandler.getConfig(), HttpStatus.OK);
+        return new ResponseEntity<>(simulatorService.getConfig(), HttpStatus.OK);
     }
 
     @Override
     public ResponseEntity<Void> setConfig(UUID xonapRequestId, @Valid @RequestBody SimConfig body) {
-        automationCompositionElementHandler.setConfig(body);
+        simulatorService.setConfig(body);
         return new ResponseEntity<>(HttpStatus.OK);
     }
 
     @Override
     public ResponseEntity<AutomationCompositions> getAutomationCompositions(UUID xonapRequestId) {
-        return new ResponseEntity<>(automationCompositionElementHandler.getAutomationCompositions(), HttpStatus.OK);
+        return new ResponseEntity<>(simulatorService.getAutomationCompositions(), HttpStatus.OK);
     }
 
     @Override
     public ResponseEntity<AutomationComposition> getAutomationComposition(UUID instanceId, UUID xonapRequestId) {
-        return new ResponseEntity<>(automationCompositionElementHandler.getAutomationComposition(instanceId),
+        return new ResponseEntity<>(simulatorService.getAutomationComposition(instanceId),
                 HttpStatus.OK);
     }
 
     @Override
     public ResponseEntity<InternalDatas> getDatas(UUID xonapRequestId) {
-        return new ResponseEntity<>(automationCompositionElementHandler.getDataList(), HttpStatus.OK);
+        return new ResponseEntity<>(simulatorService.getDataList(), HttpStatus.OK);
     }
 
     /**
@@ -79,7 +79,7 @@
      */
     @Override
     public ResponseEntity<Void> setData(UUID xonapRequestId, @Valid @RequestBody InternalData body) {
-        automationCompositionElementHandler.setOutProperties(body.getAutomationCompositionId(),
+        simulatorService.setOutProperties(body.getAutomationCompositionId(),
                 body.getAutomationCompositionElementId(), body.getUseState(), body.getOperationalState(),
                 body.getOutProperties());
         return new ResponseEntity<>(HttpStatus.OK);
@@ -87,12 +87,12 @@
 
     @Override
     public ResponseEntity<InternalDatas> getCompositionDatas(UUID xonapRequestId) {
-        return new ResponseEntity<>(automationCompositionElementHandler.getCompositionDataList(), HttpStatus.OK);
+        return new ResponseEntity<>(simulatorService.getCompositionDataList(), HttpStatus.OK);
     }
 
     @Override
     public ResponseEntity<Void> setCompositionData(UUID xonapRequestId, @Valid InternalData body) {
-        automationCompositionElementHandler.setCompositionOutProperties(body.getCompositionId(),
+        simulatorService.setCompositionOutProperties(body.getCompositionId(),
                 body.getCompositionDefinitionElementId(), body.getOutProperties());
         return new ResponseEntity<>(HttpStatus.OK);
     }
diff --git a/participant/participant-impl/participant-impl-simulator/src/test/java/org/onap/policy/clamp/acm/participant/sim/main/handler/AutomationCompositionElementHandlerV1Test.java b/participant/participant-impl/participant-impl-simulator/src/test/java/org/onap/policy/clamp/acm/participant/sim/main/handler/AutomationCompositionElementHandlerV1Test.java
new file mode 100644
index 0000000..1061b3ba
--- /dev/null
+++ b/participant/participant-impl/participant-impl-simulator/src/test/java/org/onap/policy/clamp/acm/participant/sim/main/handler/AutomationCompositionElementHandlerV1Test.java
@@ -0,0 +1,285 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2023-2024 Nordix Foundation.
+ * ================================================================================
+ * 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.acm.participant.sim.main.handler;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+
+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.ParticipantIntermediaryApi;
+import org.onap.policy.clamp.acm.participant.sim.model.SimConfig;
+import org.onap.policy.clamp.models.acm.concepts.AcElementDeploy;
+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.StateChangeResult;
+import org.onap.policy.models.base.PfModelException;
+
+class AutomationCompositionElementHandlerV1Test {
+
+    @Test
+    void testDeploy() throws PfModelException {
+        var config = new SimConfig();
+        config.setDeployTimerMs(1);
+        var intermediaryApi = mock(ParticipantIntermediaryApi.class);
+        var simulatorService = new SimulatorService(intermediaryApi);
+        var acElementHandler = new AutomationCompositionElementHandlerV1(intermediaryApi, simulatorService);
+        simulatorService.setConfig(config);
+        var instanceId = UUID.randomUUID();
+        var element = new AcElementDeploy();
+        element.setId(UUID.randomUUID());
+        acElementHandler.deploy(instanceId, element, Map.of());
+        verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, element.getId(),
+                DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Deployed");
+
+        config.setDeploySuccess(false);
+        acElementHandler.deploy(instanceId, element, Map.of());
+        verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, element.getId(),
+                DeployState.UNDEPLOYED, null, StateChangeResult.FAILED, "Deploy failed!");
+    }
+
+    @Test
+    void testUndeploy() throws PfModelException {
+        var config = new SimConfig();
+        config.setUndeployTimerMs(1);
+        var intermediaryApi = mock(ParticipantIntermediaryApi.class);
+        var simulatorService = new SimulatorService(intermediaryApi);
+        var acElementHandler = new AutomationCompositionElementHandlerV1(intermediaryApi, simulatorService);
+        simulatorService.setConfig(config);
+        var instanceId = UUID.randomUUID();
+        var elementId = UUID.randomUUID();
+        acElementHandler.undeploy(instanceId, elementId);
+        verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId, DeployState.UNDEPLOYED,
+                null, StateChangeResult.NO_ERROR, "Undeployed");
+
+        config.setUndeploySuccess(false);
+        acElementHandler.undeploy(instanceId, elementId);
+        verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId, DeployState.DEPLOYED,
+                null, StateChangeResult.FAILED, "Undeploy failed!");
+    }
+
+    @Test
+    void testLock() throws PfModelException {
+        var config = new SimConfig();
+        config.setLockTimerMs(1);
+        var intermediaryApi = mock(ParticipantIntermediaryApi.class);
+        var simulatorService = new SimulatorService(intermediaryApi);
+        var acElementHandler = new AutomationCompositionElementHandlerV1(intermediaryApi, simulatorService);
+        simulatorService.setConfig(config);
+        var instanceId = UUID.randomUUID();
+        var elementId = UUID.randomUUID();
+        acElementHandler.lock(instanceId, elementId);
+        verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId, null, LockState.LOCKED,
+                StateChangeResult.NO_ERROR, "Locked");
+
+        config.setLockSuccess(false);
+        acElementHandler.lock(instanceId, elementId);
+        verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId, null, LockState.UNLOCKED,
+                StateChangeResult.FAILED, "Lock failed!");
+    }
+
+    @Test
+    void testUnlock() throws PfModelException {
+        var config = new SimConfig();
+        config.setUnlockTimerMs(1);
+        var intermediaryApi = mock(ParticipantIntermediaryApi.class);
+        var simulatorService = new SimulatorService(intermediaryApi);
+        var acElementHandler = new AutomationCompositionElementHandlerV1(intermediaryApi, simulatorService);
+        simulatorService.setConfig(config);
+        var instanceId = UUID.randomUUID();
+        var elementId = UUID.randomUUID();
+        acElementHandler.unlock(instanceId, elementId);
+        verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId, null, LockState.UNLOCKED,
+                StateChangeResult.NO_ERROR, "Unlocked");
+
+        config.setUnlockSuccess(false);
+        acElementHandler.unlock(instanceId, elementId);
+        verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId, null, LockState.LOCKED,
+                StateChangeResult.FAILED, "Unlock failed!");
+    }
+
+    @Test
+    void testUpdate() throws PfModelException {
+        var config = new SimConfig();
+        config.setUpdateTimerMs(1);
+        var intermediaryApi = mock(ParticipantIntermediaryApi.class);
+        var simulatorService = new SimulatorService(intermediaryApi);
+        var acElementHandler = new AutomationCompositionElementHandlerV1(intermediaryApi, simulatorService);
+        simulatorService.setConfig(config);
+        var instanceId = UUID.randomUUID();
+        var element = new AcElementDeploy();
+        element.setId(UUID.randomUUID());
+        acElementHandler.update(instanceId, element, Map.of());
+        verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, element.getId(),
+                DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Updated");
+
+        config.setUpdateSuccess(false);
+        acElementHandler.update(instanceId, element, Map.of());
+        verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, element.getId(),
+                DeployState.DEPLOYED, null, StateChangeResult.FAILED, "Update failed!");
+    }
+
+    @Test
+    void testDelete() throws PfModelException {
+        var config = new SimConfig();
+        config.setDeleteTimerMs(1);
+        var intermediaryApi = mock(ParticipantIntermediaryApi.class);
+        var simulatorService = new SimulatorService(intermediaryApi);
+        var acElementHandler = new AutomationCompositionElementHandlerV1(intermediaryApi, simulatorService);
+        simulatorService.setConfig(config);
+        var instanceId = UUID.randomUUID();
+        var elementId = UUID.randomUUID();
+        acElementHandler.delete(instanceId, elementId);
+        verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId, DeployState.DELETED,
+                null, StateChangeResult.NO_ERROR, "Deleted");
+
+        config.setDeleteSuccess(false);
+        acElementHandler.delete(instanceId, elementId);
+        verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId, DeployState.UNDEPLOYED,
+                null, StateChangeResult.FAILED, "Delete failed!");
+    }
+
+    @Test
+    void testPrime() throws PfModelException {
+        var config = new SimConfig();
+        config.setPrimeTimerMs(1);
+        var intermediaryApi = mock(ParticipantIntermediaryApi.class);
+        var simulatorService = new SimulatorService(intermediaryApi);
+        var acElementHandler = new AutomationCompositionElementHandlerV1(intermediaryApi, simulatorService);
+        simulatorService.setConfig(config);
+        var compositionId = UUID.randomUUID();
+        acElementHandler.prime(compositionId, List.of());
+        verify(intermediaryApi).updateCompositionState(compositionId, AcTypeState.PRIMED, StateChangeResult.NO_ERROR,
+                "Primed");
+
+        config.setPrimeSuccess(false);
+        acElementHandler.prime(compositionId, List.of());
+        verify(intermediaryApi).updateCompositionState(compositionId, AcTypeState.COMMISSIONED,
+                StateChangeResult.FAILED, "Prime failed!");
+    }
+
+    @Test
+    void testDeprime() throws PfModelException {
+        var config = new SimConfig();
+        config.setDeprimeTimerMs(1);
+        var intermediaryApi = mock(ParticipantIntermediaryApi.class);
+        var simulatorService = new SimulatorService(intermediaryApi);
+        var acElementHandler = new AutomationCompositionElementHandlerV1(intermediaryApi, simulatorService);
+        simulatorService.setConfig(config);
+        var compositionId = UUID.randomUUID();
+        acElementHandler.deprime(compositionId);
+        verify(intermediaryApi).updateCompositionState(compositionId, AcTypeState.COMMISSIONED,
+                StateChangeResult.NO_ERROR, "Deprimed");
+
+        config.setDeprimeSuccess(false);
+        acElementHandler.deprime(compositionId);
+        verify(intermediaryApi).updateCompositionState(compositionId, AcTypeState.PRIMED, StateChangeResult.FAILED,
+                "Deprime failed!");
+    }
+
+    @Test
+    void testHandleRestartComposition() throws PfModelException {
+        var config = new SimConfig();
+        config.setPrimeTimerMs(1);
+        var intermediaryApi = mock(ParticipantIntermediaryApi.class);
+        var simulatorService = new SimulatorService(intermediaryApi);
+        var acElementHandler = new AutomationCompositionElementHandlerV1(intermediaryApi, simulatorService);
+        simulatorService.setConfig(config);
+        var compositionId = UUID.randomUUID();
+        acElementHandler.handleRestartComposition(compositionId, List.of(), AcTypeState.PRIMING);
+        verify(intermediaryApi).updateCompositionState(compositionId, AcTypeState.PRIMED, StateChangeResult.NO_ERROR,
+                "Primed");
+
+        acElementHandler.handleRestartComposition(compositionId, List.of(), AcTypeState.PRIMED);
+        verify(intermediaryApi).updateCompositionState(compositionId, AcTypeState.PRIMED, StateChangeResult.NO_ERROR,
+                "Restarted");
+
+        acElementHandler.handleRestartComposition(compositionId, List.of(), AcTypeState.DEPRIMING);
+        verify(intermediaryApi).updateCompositionState(compositionId, AcTypeState.COMMISSIONED,
+                StateChangeResult.NO_ERROR, "Deprimed");
+    }
+
+    @Test
+    void testHandleRestartInstance() throws PfModelException {
+        var config = new SimConfig();
+        config.setDeployTimerMs(1);
+        var intermediaryApi = mock(ParticipantIntermediaryApi.class);
+        var simulatorService = new SimulatorService(intermediaryApi);
+        var acElementHandler = new AutomationCompositionElementHandlerV1(intermediaryApi, simulatorService);
+        simulatorService.setConfig(config);
+        var instanceId = UUID.randomUUID();
+        var element = new AcElementDeploy();
+        element.setId(UUID.randomUUID());
+        acElementHandler.handleRestartInstance(instanceId, element, Map.of(), DeployState.DEPLOYING, LockState.NONE);
+        verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, element.getId(),
+                DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Deployed");
+
+        acElementHandler.handleRestartInstance(instanceId, element, Map.of(), DeployState.DEPLOYED, LockState.LOCKED);
+        verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, element.getId(),
+                DeployState.DEPLOYED, LockState.LOCKED, StateChangeResult.NO_ERROR, "Restarted");
+
+        acElementHandler.handleRestartInstance(instanceId, element, Map.of(), DeployState.UPDATING, LockState.LOCKED);
+        verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, element.getId(),
+                DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Updated");
+
+        acElementHandler.handleRestartInstance(instanceId, element, Map.of(), DeployState.UNDEPLOYING,
+                LockState.LOCKED);
+        verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, element.getId(),
+                DeployState.UNDEPLOYED, null, StateChangeResult.NO_ERROR, "Undeployed");
+
+        acElementHandler.handleRestartInstance(instanceId, element, Map.of(), DeployState.DELETING, LockState.NONE);
+        verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, element.getId(),
+                DeployState.DELETED, null, StateChangeResult.NO_ERROR, "Deleted");
+
+        acElementHandler.handleRestartInstance(instanceId, element, Map.of(), DeployState.DEPLOYED, LockState.LOCKING);
+        verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, element.getId(), null,
+                LockState.LOCKED, StateChangeResult.NO_ERROR, "Locked");
+
+        acElementHandler.handleRestartInstance(instanceId, element, Map.of(), DeployState.DEPLOYED,
+                LockState.UNLOCKING);
+        verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, element.getId(), null,
+                LockState.UNLOCKED, StateChangeResult.NO_ERROR, "Unlocked");
+    }
+
+    @Test
+    void testMigrate() throws PfModelException {
+        var config = new SimConfig();
+        config.setUpdateTimerMs(1);
+        var intermediaryApi = mock(ParticipantIntermediaryApi.class);
+        var simulatorService = new SimulatorService(intermediaryApi);
+        var acElementHandler = new AutomationCompositionElementHandlerV1(intermediaryApi, simulatorService);
+        simulatorService.setConfig(config);
+        var instanceId = UUID.randomUUID();
+        var element = new AcElementDeploy();
+        element.setId(UUID.randomUUID());
+        acElementHandler.migrate(instanceId, element, UUID.randomUUID(), Map.of());
+        verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, element.getId(),
+                DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Migrated");
+
+        config.setMigrateSuccess(false);
+        acElementHandler.migrate(instanceId, element, UUID.randomUUID(), Map.of());
+        verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, element.getId(),
+                DeployState.DEPLOYED, null, StateChangeResult.FAILED, "Migrate failed!");
+    }
+}
diff --git a/participant/participant-impl/participant-impl-simulator/src/test/java/org/onap/policy/clamp/acm/participant/sim/main/handler/AutomationCompositionElementHandlerTest.java b/participant/participant-impl/participant-impl-simulator/src/test/java/org/onap/policy/clamp/acm/participant/sim/main/handler/AutomationCompositionElementHandlerV2Test.java
similarity index 69%
rename from participant/participant-impl/participant-impl-simulator/src/test/java/org/onap/policy/clamp/acm/participant/sim/main/handler/AutomationCompositionElementHandlerTest.java
rename to participant/participant-impl/participant-impl-simulator/src/test/java/org/onap/policy/clamp/acm/participant/sim/main/handler/AutomationCompositionElementHandlerV2Test.java
index d634053..c521d37 100644
--- a/participant/participant-impl/participant-impl-simulator/src/test/java/org/onap/policy/clamp/acm/participant/sim/main/handler/AutomationCompositionElementHandlerTest.java
+++ b/participant/participant-impl/participant-impl-simulator/src/test/java/org/onap/policy/clamp/acm/participant/sim/main/handler/AutomationCompositionElementHandlerV2Test.java
@@ -20,11 +20,8 @@
 
 package org.onap.policy.clamp.acm.participant.sim.main.handler;
 
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
 
 import java.util.Map;
 import java.util.UUID;
@@ -33,40 +30,38 @@
 import org.onap.policy.clamp.acm.participant.intermediary.api.CompositionElementDto;
 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.sim.comm.CommonTestData;
 import org.onap.policy.clamp.acm.participant.sim.model.SimConfig;
 import org.onap.policy.clamp.models.acm.concepts.AcElementDeploy;
 import org.onap.policy.clamp.models.acm.concepts.AcTypeState;
-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.StateChangeResult;
 import org.onap.policy.models.base.PfModelException;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
-import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate;
 
-class AutomationCompositionElementHandlerTest {
+class AutomationCompositionElementHandlerV2Test {
 
     @Test
     void testDeploy() throws PfModelException {
         var config = new SimConfig();
         config.setDeployTimerMs(1);
         var intermediaryApi = mock(ParticipantIntermediaryApi.class);
-        var acElementHandler = new AutomationCompositionElementHandler(intermediaryApi);
-        acElementHandler.setConfig(config);
+        var simulatorService = new SimulatorService(intermediaryApi);
+        var acElementHandler = new AutomationCompositionElementHandlerV2(intermediaryApi, simulatorService);
+        simulatorService.setConfig(config);
         var compositionElement = new CompositionElementDto(UUID.randomUUID(), new ToscaConceptIdentifier(),
-            Map.of(), Map.of());
+                Map.of(), Map.of());
         var instanceId = UUID.randomUUID();
         var elementId = UUID.randomUUID();
         var instanceElement = new InstanceElementDto(instanceId, elementId, null, Map.of(), Map.of());
         acElementHandler.deploy(compositionElement, instanceElement);
         verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId, DeployState.DEPLOYED,
-            null, StateChangeResult.NO_ERROR, "Deployed");
+                null, StateChangeResult.NO_ERROR, "Deployed");
 
         config.setDeploySuccess(false);
         acElementHandler.deploy(compositionElement, instanceElement);
         verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId, DeployState.UNDEPLOYED,
-            null, StateChangeResult.FAILED, "Deploy failed!");
+                null, StateChangeResult.FAILED, "Deploy failed!");
     }
 
     @Test
@@ -74,10 +69,11 @@
         var config = new SimConfig();
         config.setUndeployTimerMs(1);
         var intermediaryApi = mock(ParticipantIntermediaryApi.class);
-        var acElementHandler = new AutomationCompositionElementHandler(intermediaryApi);
-        acElementHandler.setConfig(config);
+        var simulatorService = new SimulatorService(intermediaryApi);
+        var acElementHandler = new AutomationCompositionElementHandlerV2(intermediaryApi, simulatorService);
+        simulatorService.setConfig(config);
         var compositionElement = new CompositionElementDto(UUID.randomUUID(), new ToscaConceptIdentifier(),
-            Map.of(), Map.of());
+                Map.of(), Map.of());
         var instanceId = UUID.randomUUID();
         var elementId = UUID.randomUUID();
         var instanceElement = new InstanceElementDto(instanceId, elementId, null, Map.of(), Map.of());
@@ -96,10 +92,11 @@
         var config = new SimConfig();
         config.setLockTimerMs(1);
         var intermediaryApi = mock(ParticipantIntermediaryApi.class);
-        var acElementHandler = new AutomationCompositionElementHandler(intermediaryApi);
-        acElementHandler.setConfig(config);
+        var simulatorService = new SimulatorService(intermediaryApi);
+        var acElementHandler = new AutomationCompositionElementHandlerV2(intermediaryApi, simulatorService);
+        simulatorService.setConfig(config);
         var compositionElement = new CompositionElementDto(UUID.randomUUID(), new ToscaConceptIdentifier(),
-            Map.of(), Map.of());
+                Map.of(), Map.of());
         var instanceId = UUID.randomUUID();
         var elementId = UUID.randomUUID();
         var instanceElement = new InstanceElementDto(instanceId, elementId, null, Map.of(), Map.of());
@@ -118,10 +115,11 @@
         var config = new SimConfig();
         config.setUnlockTimerMs(1);
         var intermediaryApi = mock(ParticipantIntermediaryApi.class);
-        var acElementHandler = new AutomationCompositionElementHandler(intermediaryApi);
-        acElementHandler.setConfig(config);
+        var simulatorService = new SimulatorService(intermediaryApi);
+        var acElementHandler = new AutomationCompositionElementHandlerV2(intermediaryApi, simulatorService);
+        simulatorService.setConfig(config);
         var compositionElement = new CompositionElementDto(UUID.randomUUID(), new ToscaConceptIdentifier(),
-            Map.of(), Map.of());
+                Map.of(), Map.of());
         var instanceId = UUID.randomUUID();
         var elementId = UUID.randomUUID();
         var instanceElement = new InstanceElementDto(instanceId, elementId, null, Map.of(), Map.of());
@@ -140,16 +138,17 @@
         var config = new SimConfig();
         config.setUpdateTimerMs(1);
         var intermediaryApi = mock(ParticipantIntermediaryApi.class);
-        var acElementHandler = new AutomationCompositionElementHandler(intermediaryApi);
-        acElementHandler.setConfig(config);
+        var simulatorService = new SimulatorService(intermediaryApi);
+        var acElementHandler = new AutomationCompositionElementHandlerV2(intermediaryApi, simulatorService);
+        simulatorService.setConfig(config);
         var compositionElement = new CompositionElementDto(UUID.randomUUID(), new ToscaConceptIdentifier(),
-            Map.of(), Map.of());
+                Map.of(), Map.of());
         var instanceId = UUID.randomUUID();
         var element = new AcElementDeploy();
         element.setId(UUID.randomUUID());
         var instanceElement = new InstanceElementDto(instanceId, element.getId(), null, Map.of(), Map.of());
         var instanceElementUpdated = new InstanceElementDto(instanceId, element.getId(), null,
-            Map.of("key", "value"), Map.of());
+                Map.of("key", "value"), Map.of());
         acElementHandler.update(compositionElement, instanceElement, instanceElementUpdated);
         verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, element.getId(),
                 DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Updated");
@@ -165,10 +164,11 @@
         var config = new SimConfig();
         config.setDeleteTimerMs(1);
         var intermediaryApi = mock(ParticipantIntermediaryApi.class);
-        var acElementHandler = new AutomationCompositionElementHandler(intermediaryApi);
-        acElementHandler.setConfig(config);
+        var simulatorService = new SimulatorService(intermediaryApi);
+        var acElementHandler = new AutomationCompositionElementHandlerV2(intermediaryApi, simulatorService);
+        simulatorService.setConfig(config);
         var compositionElement = new CompositionElementDto(UUID.randomUUID(), new ToscaConceptIdentifier(),
-            Map.of(), Map.of());
+                Map.of(), Map.of());
         var instanceId = UUID.randomUUID();
         var elementId = UUID.randomUUID();
         var instanceElement = new InstanceElementDto(instanceId, elementId, null, Map.of(), Map.of());
@@ -183,64 +183,13 @@
     }
 
     @Test
-    void testgetAutomationCompositions() throws PfModelException {
-        var intermediaryApi = mock(ParticipantIntermediaryApi.class);
-        var acElementHandler = new AutomationCompositionElementHandler(intermediaryApi);
-
-        var map = CommonTestData.getTestAutomationCompositionMap();
-        when(intermediaryApi.getAutomationCompositions()).thenReturn(map);
-        var result = acElementHandler.getAutomationCompositions();
-        assertEquals(map.values().iterator().next(), result.getAutomationCompositionList().get(0));
-    }
-
-    @Test
-    void testgetAutomationComposition() throws PfModelException {
-        var intermediaryApi = mock(ParticipantIntermediaryApi.class);
-        var acElementHandler = new AutomationCompositionElementHandler(intermediaryApi);
-
-        var instance = CommonTestData.getTestAutomationCompositionMap().values().iterator().next();
-        when(intermediaryApi.getAutomationComposition(instance.getInstanceId())).thenReturn(instance);
-        var result = acElementHandler.getAutomationComposition(instance.getInstanceId());
-        assertEquals(instance, result);
-    }
-
-    @Test
-    void testsetOutProperties() {
-        var intermediaryApi = mock(ParticipantIntermediaryApi.class);
-        var acElementHandler = new AutomationCompositionElementHandler(intermediaryApi);
-
-        var instanceId = UUID.randomUUID();
-        var elementId = UUID.randomUUID();
-        var useState = "useState";
-        var operationalState = "operationalState";
-        Map<String, Object> map = Map.of("id", "1234");
-
-        acElementHandler.setOutProperties(instanceId, elementId, useState, operationalState, map);
-        verify(intermediaryApi).sendAcElementInfo(instanceId, elementId, useState, operationalState, map);
-    }
-
-    @Test
-    void testgetDataList() {
-        var intermediaryApi = mock(ParticipantIntermediaryApi.class);
-        var acElementHandler = new AutomationCompositionElementHandler(intermediaryApi);
-
-        var map = CommonTestData.getTestAutomationCompositionMap();
-        when(intermediaryApi.getAutomationCompositions()).thenReturn(map);
-        var result = acElementHandler.getDataList();
-        var data = result.getList().get(0);
-        var automationcomposition = map.values().iterator().next();
-        assertEquals(automationcomposition.getInstanceId(), data.getAutomationCompositionId());
-        var element = automationcomposition.getElements().values().iterator().next();
-        assertEquals(element.getId(), data.getAutomationCompositionElementId());
-    }
-
-    @Test
     void testPrime() throws PfModelException {
         var config = new SimConfig();
         config.setPrimeTimerMs(1);
         var intermediaryApi = mock(ParticipantIntermediaryApi.class);
-        var acElementHandler = new AutomationCompositionElementHandler(intermediaryApi);
-        acElementHandler.setConfig(config);
+        var simulatorService = new SimulatorService(intermediaryApi);
+        var acElementHandler = new AutomationCompositionElementHandlerV2(intermediaryApi, simulatorService);
+        simulatorService.setConfig(config);
         var compositionId = UUID.randomUUID();
         var composition = new CompositionDto(compositionId, Map.of(), Map.of());
         acElementHandler.prime(composition);
@@ -258,8 +207,9 @@
         var config = new SimConfig();
         config.setDeprimeTimerMs(1);
         var intermediaryApi = mock(ParticipantIntermediaryApi.class);
-        var acElementHandler = new AutomationCompositionElementHandler(intermediaryApi);
-        acElementHandler.setConfig(config);
+        var simulatorService = new SimulatorService(intermediaryApi);
+        var acElementHandler = new AutomationCompositionElementHandlerV2(intermediaryApi, simulatorService);
+        simulatorService.setConfig(config);
         var compositionId = UUID.randomUUID();
         var composition = new CompositionDto(compositionId, Map.of(), Map.of());
         acElementHandler.deprime(composition);
@@ -277,8 +227,9 @@
         var config = new SimConfig();
         config.setPrimeTimerMs(1);
         var intermediaryApi = mock(ParticipantIntermediaryApi.class);
-        var acElementHandler = new AutomationCompositionElementHandler(intermediaryApi);
-        acElementHandler.setConfig(config);
+        var simulatorService = new SimulatorService(intermediaryApi);
+        var acElementHandler = new AutomationCompositionElementHandlerV2(intermediaryApi, simulatorService);
+        simulatorService.setConfig(config);
         var compositionId = UUID.randomUUID();
         var composition = new CompositionDto(compositionId, Map.of(), Map.of());
         acElementHandler.handleRestartComposition(composition, AcTypeState.PRIMING);
@@ -299,25 +250,26 @@
         var config = new SimConfig();
         config.setDeployTimerMs(1);
         var intermediaryApi = mock(ParticipantIntermediaryApi.class);
-        var acElementHandler = new AutomationCompositionElementHandler(intermediaryApi);
-        acElementHandler.setConfig(config);
+        var simulatorService = new SimulatorService(intermediaryApi);
+        var acElementHandler = new AutomationCompositionElementHandlerV2(intermediaryApi, simulatorService);
+        simulatorService.setConfig(config);
         var instanceId = UUID.randomUUID();
         var elementId = UUID.randomUUID();
         var instanceElement = new InstanceElementDto(instanceId, elementId, null, Map.of(), Map.of());
         var compositionElement = new CompositionElementDto(UUID.randomUUID(), new ToscaConceptIdentifier(),
-            Map.of(), Map.of());
+                Map.of(), Map.of());
         acElementHandler.handleRestartInstance(compositionElement, instanceElement,
-            DeployState.DEPLOYING, LockState.NONE);
+                DeployState.DEPLOYING, LockState.NONE);
         verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId,
                 DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Deployed");
 
         acElementHandler.handleRestartInstance(compositionElement, instanceElement,
-            DeployState.DEPLOYED, LockState.LOCKED);
+                DeployState.DEPLOYED, LockState.LOCKED);
         verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId,
                 DeployState.DEPLOYED, LockState.LOCKED, StateChangeResult.NO_ERROR, "Restarted");
 
         acElementHandler.handleRestartInstance(compositionElement, instanceElement,
-            DeployState.UPDATING, LockState.LOCKED);
+                DeployState.UPDATING, LockState.LOCKED);
         verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId,
                 DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Updated");
 
@@ -327,12 +279,12 @@
                 DeployState.UNDEPLOYED, null, StateChangeResult.NO_ERROR, "Undeployed");
 
         acElementHandler.handleRestartInstance(compositionElement, instanceElement,
-            DeployState.DELETING, LockState.NONE);
+                DeployState.DELETING, LockState.NONE);
         verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId,
                 DeployState.DELETED, null, StateChangeResult.NO_ERROR, "Deleted");
 
         acElementHandler.handleRestartInstance(compositionElement, instanceElement,
-            DeployState.DEPLOYED, LockState.LOCKING);
+                DeployState.DEPLOYED, LockState.LOCKING);
         verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId, null,
                 LockState.LOCKED, StateChangeResult.NO_ERROR, "Locked");
 
@@ -342,66 +294,34 @@
                 LockState.UNLOCKED, StateChangeResult.NO_ERROR, "Unlocked");
     }
 
-    @Test
-    void testGetCompositionDataList() {
-        var acElementDefinition = new AutomationCompositionElementDefinition();
-        var toscaConceptIdentifier = new ToscaConceptIdentifier("code", "1.0.0");
-        acElementDefinition.setAcElementDefinitionId(toscaConceptIdentifier);
-        acElementDefinition.setAutomationCompositionElementToscaNodeTemplate(new ToscaNodeTemplate());
-        Map<String, Object> outProperties = Map.of("code", "value");
-        Map<String, Object> inProperties = Map.of("key", "value");
-        acElementDefinition.getAutomationCompositionElementToscaNodeTemplate().setProperties(inProperties);
-        acElementDefinition.setOutProperties(outProperties);
-        var elementsDefinitions = Map.of(toscaConceptIdentifier, acElementDefinition);
-        var compositionId = UUID.randomUUID();
-        var map = Map.of(compositionId, elementsDefinitions);
-        var intermediaryApi = mock(ParticipantIntermediaryApi.class);
-        when(intermediaryApi.getAcElementsDefinitions()).thenReturn(map);
-        var acElementHandler = new AutomationCompositionElementHandler(intermediaryApi);
 
-        var result = acElementHandler.getCompositionDataList();
-        assertThat(result.getList()).hasSize(1);
-        assertEquals(result.getList().get(0).getCompositionId(), compositionId);
-        assertEquals(result.getList().get(0).getCompositionDefinitionElementId(), toscaConceptIdentifier);
-        assertEquals(result.getList().get(0).getOutProperties(), outProperties);
-        assertEquals(result.getList().get(0).getIntProperties(), inProperties);
-    }
-
-    @Test
-    void testSetCompositionData() {
-        var intermediaryApi = mock(ParticipantIntermediaryApi.class);
-        var acElementHandler = new AutomationCompositionElementHandler(intermediaryApi);
-
-        var compositionId = UUID.randomUUID();
-        acElementHandler.setCompositionOutProperties(compositionId, null, Map.of());
-        verify(intermediaryApi).sendAcDefinitionInfo(compositionId, null, Map.of());
-    }
 
     @Test
     void testMigrate() throws PfModelException {
         var config = new SimConfig();
         config.setUpdateTimerMs(1);
         var intermediaryApi = mock(ParticipantIntermediaryApi.class);
-        var acElementHandler = new AutomationCompositionElementHandler(intermediaryApi);
-        acElementHandler.setConfig(config);
+        var simulatorService = new SimulatorService(intermediaryApi);
+        var acElementHandler = new AutomationCompositionElementHandlerV2(intermediaryApi, simulatorService);
+        simulatorService.setConfig(config);
         var compositionElement = new CompositionElementDto(UUID.randomUUID(), new ToscaConceptIdentifier(),
-            Map.of(), Map.of());
+                Map.of(), Map.of());
         var compositionElementTraget = new CompositionElementDto(UUID.randomUUID(), new ToscaConceptIdentifier(),
-            Map.of(), Map.of());
+                Map.of(), Map.of());
         var instanceId = UUID.randomUUID();
         var element = new AcElementDeploy();
         element.setId(UUID.randomUUID());
         var instanceElement = new InstanceElementDto(instanceId, element.getId(), null, Map.of(), Map.of());
         var instanceElementMigrated = new InstanceElementDto(instanceId, element.getId(),
-            null, Map.of("key", "value"), Map.of());
+                null, Map.of("key", "value"), Map.of());
         acElementHandler
-            .migrate(compositionElement, compositionElementTraget, instanceElement, instanceElementMigrated);
+                .migrate(compositionElement, compositionElementTraget, instanceElement, instanceElementMigrated);
         verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, element.getId(),
                 DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Migrated");
 
         config.setMigrateSuccess(false);
         acElementHandler
-            .migrate(compositionElement, compositionElementTraget, instanceElement, instanceElementMigrated);
+                .migrate(compositionElement, compositionElementTraget, instanceElement, instanceElementMigrated);
         verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, element.getId(),
                 DeployState.DEPLOYED, null, StateChangeResult.FAILED, "Migrate failed!");
     }
diff --git a/participant/participant-impl/participant-impl-simulator/src/test/java/org/onap/policy/clamp/acm/participant/sim/main/handler/SimulatorServiceTest.java b/participant/participant-impl/participant-impl-simulator/src/test/java/org/onap/policy/clamp/acm/participant/sim/main/handler/SimulatorServiceTest.java
new file mode 100644
index 0000000..714f717
--- /dev/null
+++ b/participant/participant-impl/participant-impl-simulator/src/test/java/org/onap/policy/clamp/acm/participant/sim/main/handler/SimulatorServiceTest.java
@@ -0,0 +1,126 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2024 Nordix Foundation.
+ * ================================================================================
+ * 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.acm.participant.sim.main.handler;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import java.util.Map;
+import java.util.UUID;
+import org.junit.jupiter.api.Test;
+import org.onap.policy.clamp.acm.participant.intermediary.api.ParticipantIntermediaryApi;
+import org.onap.policy.clamp.acm.participant.sim.comm.CommonTestData;
+import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionElementDefinition;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate;
+
+class SimulatorServiceTest {
+
+    @Test
+    void testGetAutomationCompositions() {
+        var intermediaryApi = mock(ParticipantIntermediaryApi.class);
+        var simulatorService = new SimulatorService(intermediaryApi);
+
+        var map = CommonTestData.getTestAutomationCompositionMap();
+        when(intermediaryApi.getAutomationCompositions()).thenReturn(map);
+        var result = simulatorService.getAutomationCompositions();
+        assertEquals(map.values().iterator().next(), result.getAutomationCompositionList().get(0));
+    }
+
+    @Test
+    void testGetAutomationComposition() {
+        var intermediaryApi = mock(ParticipantIntermediaryApi.class);
+        var simulatorService = new SimulatorService(intermediaryApi);
+
+        var instance = CommonTestData.getTestAutomationCompositionMap().values().iterator().next();
+        when(intermediaryApi.getAutomationComposition(instance.getInstanceId())).thenReturn(instance);
+        var result = simulatorService.getAutomationComposition(instance.getInstanceId());
+        assertEquals(instance, result);
+    }
+
+    @Test
+    void testSetOutProperties() {
+        var intermediaryApi = mock(ParticipantIntermediaryApi.class);
+        var simulatorService = new SimulatorService(intermediaryApi);
+
+        var instanceId = UUID.randomUUID();
+        var elementId = UUID.randomUUID();
+        var useState = "useState";
+        var operationalState = "operationalState";
+        Map<String, Object> map = Map.of("id", "1234");
+
+        simulatorService.setOutProperties(instanceId, elementId, useState, operationalState, map);
+        verify(intermediaryApi).sendAcElementInfo(instanceId, elementId, useState, operationalState, map);
+    }
+
+    @Test
+    void testGetDataList() {
+        var intermediaryApi = mock(ParticipantIntermediaryApi.class);
+        var simulatorService = new SimulatorService(intermediaryApi);
+
+        var map = CommonTestData.getTestAutomationCompositionMap();
+        when(intermediaryApi.getAutomationCompositions()).thenReturn(map);
+        var result = simulatorService.getDataList();
+        var data = result.getList().get(0);
+        var automationcomposition = map.values().iterator().next();
+        assertEquals(automationcomposition.getInstanceId(), data.getAutomationCompositionId());
+        var element = automationcomposition.getElements().values().iterator().next();
+        assertEquals(element.getId(), data.getAutomationCompositionElementId());
+    }
+
+    @Test
+    void testGetCompositionDataList() {
+        var acElementDefinition = new AutomationCompositionElementDefinition();
+        var toscaConceptIdentifier = new ToscaConceptIdentifier("code", "1.0.0");
+        acElementDefinition.setAcElementDefinitionId(toscaConceptIdentifier);
+        acElementDefinition.setAutomationCompositionElementToscaNodeTemplate(new ToscaNodeTemplate());
+        Map<String, Object> outProperties = Map.of("code", "value");
+        Map<String, Object> inProperties = Map.of("key", "value");
+        acElementDefinition.getAutomationCompositionElementToscaNodeTemplate().setProperties(inProperties);
+        acElementDefinition.setOutProperties(outProperties);
+        var elementsDefinitions = Map.of(toscaConceptIdentifier, acElementDefinition);
+        var compositionId = UUID.randomUUID();
+        var map = Map.of(compositionId, elementsDefinitions);
+        var intermediaryApi = mock(ParticipantIntermediaryApi.class);
+        when(intermediaryApi.getAcElementsDefinitions()).thenReturn(map);
+        var simulatorService = new SimulatorService(intermediaryApi);
+
+        var result = simulatorService.getCompositionDataList();
+        assertThat(result.getList()).hasSize(1);
+        assertEquals(result.getList().get(0).getCompositionId(), compositionId);
+        assertEquals(result.getList().get(0).getCompositionDefinitionElementId(), toscaConceptIdentifier);
+        assertEquals(result.getList().get(0).getOutProperties(), outProperties);
+        assertEquals(result.getList().get(0).getIntProperties(), inProperties);
+    }
+
+    @Test
+    void testSetCompositionData() {
+        var intermediaryApi = mock(ParticipantIntermediaryApi.class);
+        var simulatorService = new SimulatorService(intermediaryApi);
+
+        var compositionId = UUID.randomUUID();
+        simulatorService.setCompositionOutProperties(compositionId, null, Map.of());
+        verify(intermediaryApi).sendAcDefinitionInfo(compositionId, null, Map.of());
+    }
+}
diff --git a/participant/participant-impl/participant-impl-simulator/src/test/java/org/onap/policy/clamp/acm/participant/sim/rest/AcSimRestTest.java b/participant/participant-impl/participant-impl-simulator/src/test/java/org/onap/policy/clamp/acm/participant/sim/rest/AcSimRestTest.java
index 3592a19..f62d6cd 100644
--- a/participant/participant-impl/participant-impl-simulator/src/test/java/org/onap/policy/clamp/acm/participant/sim/rest/AcSimRestTest.java
+++ b/participant/participant-impl/participant-impl-simulator/src/test/java/org/onap/policy/clamp/acm/participant/sim/rest/AcSimRestTest.java
@@ -1,6 +1,6 @@
 /*-
  * ============LICENSE_START=======================================================
- *  Copyright (C) 2023 Nordix Foundation.
+ *  Copyright (C) 2023-2024 Nordix Foundation.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -32,11 +32,12 @@
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.onap.policy.clamp.acm.participant.sim.comm.CommonTestData;
-import org.onap.policy.clamp.acm.participant.sim.main.handler.AutomationCompositionElementHandler;
+import org.onap.policy.clamp.acm.participant.sim.main.handler.SimulatorService;
 import org.onap.policy.clamp.acm.participant.sim.model.InternalData;
 import org.onap.policy.clamp.acm.participant.sim.model.InternalDatas;
 import org.onap.policy.clamp.acm.participant.sim.model.SimConfig;
 import org.onap.policy.clamp.acm.participant.sim.parameters.ParticipantSimParameters;
+import org.onap.policy.clamp.models.acm.concepts.AutomationComposition;
 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositions;
 import org.onap.policy.common.utils.coder.Coder;
 import org.onap.policy.common.utils.coder.StandardCoder;
@@ -70,7 +71,7 @@
     private MockMvc mockMvc;
 
     @MockBean
-    private AutomationCompositionElementHandler automationCompositionElementHandler;
+    private SimulatorService simulatorService;
 
     @Autowired
     private WebApplicationContext context;
@@ -81,10 +82,10 @@
     }
 
     @Test
-    void testgetConfig() throws Exception {
+    void testGetConfig() throws Exception {
         var requestBuilder = MockMvcRequestBuilders.get(CONFIG_URL).accept(MediaType.APPLICATION_JSON_VALUE);
 
-        doReturn(new SimConfig()).when(automationCompositionElementHandler).getConfig();
+        doReturn(new SimConfig()).when(simulatorService).getConfig();
 
         mockMvc.perform(requestBuilder).andExpect(status().isOk())
                 .andExpect(content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON))
@@ -92,7 +93,7 @@
     }
 
     @Test
-    void testsetConfig() throws Exception {
+    void testSetConfig() throws Exception {
         var requestBuilder = MockMvcRequestBuilders.put(CONFIG_URL).accept(MediaType.APPLICATION_JSON_VALUE)
                 .content(CODER.encode(new SimConfig())).contentType(MediaType.APPLICATION_JSON_VALUE);
 
@@ -100,13 +101,13 @@
     }
 
     @Test
-    void testgetAutomationCompositions() throws Exception {
+    void testGetAutomationCompositions() throws Exception {
         var requestBuilder = MockMvcRequestBuilders.get(INSTANCE_URL).accept(MediaType.APPLICATION_JSON_VALUE);
 
         var automationCompositions = new AutomationCompositions();
         automationCompositions.getAutomationCompositionList().add(CommonTestData.getTestAutomationComposition());
 
-        doReturn(automationCompositions).when(automationCompositionElementHandler).getAutomationCompositions();
+        doReturn(automationCompositions).when(simulatorService).getAutomationCompositions();
 
         var result = mockMvc.perform(requestBuilder).andExpect(status().isOk())
                 .andExpect(content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON)).andReturn();
@@ -117,13 +118,31 @@
     }
 
     @Test
-    void testgetDatas() throws Exception {
+    void testGetAutomationComposition() throws Exception {
+        var automationComposition = CommonTestData.getTestAutomationComposition();
+
+        var requestBuilder = MockMvcRequestBuilders
+                .get(INSTANCE_URL + "/" + automationComposition.getInstanceId())
+                .accept(MediaType.APPLICATION_JSON_VALUE);
+
+        doReturn(automationComposition).when(simulatorService)
+                .getAutomationComposition(automationComposition.getInstanceId());
+
+        var result = mockMvc.perform(requestBuilder).andExpect(status().isOk())
+                .andExpect(content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON)).andReturn();
+        var body = result.getResponse().getContentAsString();
+        var acsResult = CODER.decode(body, AutomationComposition.class);
+        assertEquals(automationComposition, acsResult);
+    }
+
+    @Test
+    void testGetDatas() throws Exception {
         var internalDatas = new InternalDatas();
         var internalData = new InternalData();
         internalData.setAutomationCompositionId(UUID.randomUUID());
         internalDatas.getList().add(internalData);
 
-        doReturn(internalDatas).when(automationCompositionElementHandler).getDataList();
+        doReturn(internalDatas).when(simulatorService).getDataList();
 
         var requestBuilder = MockMvcRequestBuilders.get(DATAS_URL).accept(MediaType.APPLICATION_JSON_VALUE);
         var result = mockMvc.perform(requestBuilder).andExpect(status().isOk())
@@ -135,7 +154,7 @@
     }
 
     @Test
-    void testsetDatas() throws Exception {
+    void testSetDatas() throws Exception {
         var requestBuilder = MockMvcRequestBuilders.put(DATAS_URL).accept(MediaType.APPLICATION_JSON_VALUE)
                 .content(CODER.encode(new InternalData())).contentType(MediaType.APPLICATION_JSON_VALUE);
 
@@ -143,13 +162,13 @@
     }
 
     @Test
-    void testgetCompositionDatas() throws Exception {
+    void testGetCompositionDatas() throws Exception {
         var internalDatas = new InternalDatas();
         var internalData = new InternalData();
         internalData.setCompositionId(UUID.randomUUID());
         internalDatas.getList().add(internalData);
 
-        doReturn(internalDatas).when(automationCompositionElementHandler).getCompositionDataList();
+        doReturn(internalDatas).when(simulatorService).getCompositionDataList();
 
         var requestBuilder = MockMvcRequestBuilders.get(COMPOSITION_DATAS_URL).accept(MediaType.APPLICATION_JSON_VALUE);
         var result = mockMvc.perform(requestBuilder).andExpect(status().isOk())
@@ -160,7 +179,7 @@
     }
 
     @Test
-    void testsetCompositionDatas() throws Exception {
+    void testSetCompositionDatas() throws Exception {
         var requestBuilder = MockMvcRequestBuilders.put(COMPOSITION_DATAS_URL).accept(MediaType.APPLICATION_JSON_VALUE)
                 .content(CODER.encode(new InternalData())).contentType(MediaType.APPLICATION_JSON_VALUE);