Transfer tosca-poc onto master

This is the third if three commits, this commit makes the content of
the master branch the same as the tosca-poc branch.

This commit adds the "src" files for TOSCA control loops to the modules
in master.

Difference between this commit and the current master:
------------------------------------------------------
diff -qr clamp clamp-master |diff_filter.sh
Only in clamp/common: src
Only in clamp/models: src
Files clamp/participant/participant-impl/participant-impl-dcae/pom.xml and clamp-master/participant/participant-impl/participant-impl-dcae/pom.xml differ
Only in clamp/participant/participant-impl/participant-impl-dcae: src
Only in clamp/participant/participant-impl/participant-impl-policy: src
Only in clamp/participant/participant-impl/participant-impl-simulator: src
Files clamp/participant/participant-impl/pom.xml and clamp-master/participant/participant-impl/pom.xml differ
Only in clamp/participant/participant-intermediary: src
Files clamp/participant/pom.xml and clamp-master/participant/pom.xml differ
Files clamp/pom.xml and clamp-master/pom.xml differ
Files clamp/runtime/pom.xml and clamp-master/runtime/pom.xml differ
Only in clamp: runtime-controlloop

Difference between this commit and the current tosca-poc branch:
----------------------------------------------------------------
diff -qr clamp clamp-tp |diff_filter.sh
Files clamp/INFO.yaml and clamp-tp/INFO.yaml differ
Only in clamp/releases: 6.0.1-container.yaml
Only in clamp/releases: 6.0.1.yaml
Only in clamp/releases: 6.0.2-container.yaml
Only in clamp/releases: 6.0.2.yaml
Only in clamp/releases: 6.1.0-container.yaml
Only in clamp/releases: 6.1.0.yaml
Only in clamp/releases: 6.1.1-container.yaml
Only in clamp/releases: 6.1.1.yaml
Files clamp/runtime/src/main/resources/META-INF/resources/swagger.html and clamp-tp/runtime/src/main/resources/META-INF/resources/swagger.html differ

Issue-ID: POLICY-3215
Change-Id: Ica1aa3fe5d6110df2396ea856703102e800fa770
Signed-off-by: liamfallon <liam.fallon@est.tech>
diff --git a/common/src/main/java/org/onap/policy/clamp/controlloop/common/ControlLoopConstants.java b/common/src/main/java/org/onap/policy/clamp/controlloop/common/ControlLoopConstants.java
new file mode 100644
index 0000000..aa8b720
--- /dev/null
+++ b/common/src/main/java/org/onap/policy/clamp/controlloop/common/ControlLoopConstants.java
@@ -0,0 +1,32 @@
+/*
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.clamp.controlloop.common;
+
+/**
+ * Names of various items contained in the Registry.
+ */
+public class ControlLoopConstants {
+
+    // Registry keys
+    public static final String REG_CLRUNTIME_ACTIVATOR = "object:activator/clruntime";
+
+    private ControlLoopConstants() {
+        super();
+    }
+}
diff --git a/common/src/main/java/org/onap/policy/clamp/controlloop/common/exception/ControlLoopException.java b/common/src/main/java/org/onap/policy/clamp/controlloop/common/exception/ControlLoopException.java
new file mode 100644
index 0000000..05b913b
--- /dev/null
+++ b/common/src/main/java/org/onap/policy/clamp/controlloop/common/exception/ControlLoopException.java
@@ -0,0 +1,94 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.common.exception;
+
+import javax.ws.rs.core.Response;
+import lombok.Getter;
+import lombok.ToString;
+import org.onap.policy.models.errors.concepts.ErrorResponse;
+import org.onap.policy.models.errors.concepts.ErrorResponseInfo;
+import org.onap.policy.models.errors.concepts.ErrorResponseUtils;
+
+/**
+ * This class is a base exception from which all control loop exceptions are sub classes.
+ */
+@Getter
+@ToString
+public class ControlLoopException extends Exception implements ErrorResponseInfo {
+    private static final long serialVersionUID = -8507246953751956974L;
+
+    // The error response of the exception
+    private final ErrorResponse errorResponse = new ErrorResponse();
+
+    // The object on which the exception was thrown
+    private final transient Object object;
+
+    /**
+     * Instantiates a new control loop exception.
+     *
+     * @param statusCode the return code for the exception
+     * @param message the message on the exception
+     */
+    public ControlLoopException(final Response.Status statusCode, final String message) {
+        this(statusCode, message, null);
+    }
+
+    /**
+     * Instantiates a new control loop exception.
+     *
+     * @param statusCode the return code for the exception
+     * @param message the message on the exception
+     * @param object the object that the exception was thrown on
+     */
+    public ControlLoopException(final Response.Status statusCode, final String message, final Object object) {
+        super(message);
+        errorResponse.setResponseCode(statusCode);
+        ErrorResponseUtils.getExceptionMessages(errorResponse, this);
+        this.object = object;
+    }
+
+    /**
+     * Instantiates a new control loop exception.
+     *
+     * @param statusCode the return code for the exception
+     * @param message the message on the exception
+     * @param exception the exception that caused this exception
+     */
+    public ControlLoopException(final Response.Status statusCode, final String message, final Exception exception) {
+        this(statusCode, message, exception, null);
+    }
+
+    /**
+     * Instantiates a new exception.
+     *
+     * @param statusCode the return code for the exception
+     * @param message the message on the exception
+     * @param exception the exception that caused this exception
+     * @param object the object that the exception was thrown on
+     */
+    public ControlLoopException(final Response.Status statusCode, final String message, final Exception exception,
+            final Object object) {
+        super(message, exception);
+        errorResponse.setResponseCode(statusCode);
+        ErrorResponseUtils.getExceptionMessages(errorResponse, this);
+        this.object = object;
+    }
+}
diff --git a/common/src/main/java/org/onap/policy/clamp/controlloop/common/exception/ControlLoopRuntimeException.java b/common/src/main/java/org/onap/policy/clamp/controlloop/common/exception/ControlLoopRuntimeException.java
new file mode 100644
index 0000000..b110a43
--- /dev/null
+++ b/common/src/main/java/org/onap/policy/clamp/controlloop/common/exception/ControlLoopRuntimeException.java
@@ -0,0 +1,107 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.common.exception;
+
+import javax.ws.rs.core.Response;
+import lombok.Getter;
+import lombok.ToString;
+import org.onap.policy.models.errors.concepts.ErrorResponse;
+import org.onap.policy.models.errors.concepts.ErrorResponseInfo;
+import org.onap.policy.models.errors.concepts.ErrorResponseUtils;
+
+/**
+ * This class is a base control loop run time exception from which all control loop run time exceptions are sub classes.
+ */
+@Getter
+@ToString
+public class ControlLoopRuntimeException extends RuntimeException implements ErrorResponseInfo {
+    private static final long serialVersionUID = -8507246953751956974L;
+
+    // The error response of the exception
+    private final ErrorResponse errorResponse = new ErrorResponse();
+
+    // The object on which the exception was thrown
+    private final transient Object object;
+
+    /**
+     * Instantiates a new control loop runtime exception.
+     *
+     * @param statusCode the return code for the exception
+     * @param message the message on the exception
+     */
+    public ControlLoopRuntimeException(final Response.Status statusCode, final String message) {
+        this(statusCode, message, null);
+    }
+
+    /**
+     * Instantiates a new control loop runtime exception.
+     *
+     * @param statusCode the return code for the exception
+     * @param message the message on the exception
+     * @param object the object that the exception was thrown on
+     */
+    public ControlLoopRuntimeException(final Response.Status statusCode, final String message, final Object object) {
+        super(message);
+        this.object = object;
+        errorResponse.setResponseCode(statusCode);
+        ErrorResponseUtils.getExceptionMessages(errorResponse, this);
+    }
+
+    /**
+     * Instantiates a new control loop runtime exception.
+     *
+     * @param statusCode the return code for the exception
+     * @param message the message on the exception
+     * @param exception the exception that caused this control loop exception
+     */
+    public ControlLoopRuntimeException(final Response.Status statusCode, final String message,
+            final Exception exception) {
+        this(statusCode, message, exception, null);
+    }
+
+    /**
+     * Instantiates a new model runtime exception from a ControlLoopException instance.
+     *
+     * @param exception the exception that caused this control loop exception
+     */
+    public ControlLoopRuntimeException(final ControlLoopException exception) {
+        super(exception.getMessage(), exception);
+        this.object = exception.getObject();
+        errorResponse.setResponseCode(exception.getErrorResponse().getResponseCode());
+        ErrorResponseUtils.getExceptionMessages(errorResponse, this);
+    }
+
+    /**
+     * Instantiates a new control loop runtime exception.
+     *
+     * @param statusCode the return code for the exception
+     * @param message the message on the exception
+     * @param exception the exception that caused this control loop exception
+     * @param object the object that the exception was thrown on
+     */
+    public ControlLoopRuntimeException(final Response.Status statusCode, final String message,
+            final Exception exception, final Object object) {
+        super(message, exception);
+        this.object = object;
+        errorResponse.setResponseCode(statusCode);
+        ErrorResponseUtils.getExceptionMessages(errorResponse, this);
+    }
+}
diff --git a/common/src/main/java/org/onap/policy/clamp/controlloop/common/handler/ControlLoopHandler.java b/common/src/main/java/org/onap/policy/clamp/controlloop/common/handler/ControlLoopHandler.java
new file mode 100644
index 0000000..1bbe566
--- /dev/null
+++ b/common/src/main/java/org/onap/policy/clamp/controlloop/common/handler/ControlLoopHandler.java
@@ -0,0 +1,110 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.common.handler;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import lombok.Getter;
+import lombok.NonNull;
+import org.onap.policy.common.endpoints.event.comm.TopicSink;
+import org.onap.policy.common.endpoints.listeners.MessageTypeDispatcher;
+import org.onap.policy.common.utils.services.Registry;
+import org.onap.policy.models.provider.PolicyModelsProviderParameters;
+
+/**
+ * Abstract class for handlers for sub components in the control loop system
+ *
+ * <p>Instances are effectively singletons that are started at system start.
+ */
+public abstract class ControlLoopHandler {
+    @Getter
+    private final PolicyModelsProviderParameters databaseProviderParameters;
+
+    /**
+     * Create a handler.
+     *
+     * @param databaseProviderParameters the parameters for access to the database
+     */
+    protected ControlLoopHandler(@NonNull PolicyModelsProviderParameters databaseProviderParameters) {
+        this.databaseProviderParameters = databaseProviderParameters;
+
+        Registry.register(this.getClass().getName(), this);
+    }
+
+    public void close() {
+        Registry.unregister(this.getClass().getName());
+    }
+
+    /**
+     * Get the provider classes that are used in instantiation.
+     *
+     * @return the provider classes
+     */
+    public Set<Class<?>> getProviderClasses() {
+        // No REST interfaces are the default
+        return new HashSet<>();
+    }
+
+    /**
+     * Start any topic message listeners for this handler.
+     *
+     * @param msgDispatcher the message dispatcher with which to register the listener
+     */
+    public void startAndRegisterListeners(MessageTypeDispatcher msgDispatcher) {
+        // Start and register listeners
+    }
+
+    /**
+     * Start any topic message publishers for this handler.
+     *
+     * @param topicSinks the topic sinks on which the publisher can publish
+     */
+    public void startAndRegisterPublishers(List<TopicSink> topicSinks) {
+        // Start and register publishers
+    }
+
+    /**
+     * Stop any topic message publishers for this handler.
+     */
+    public void stopAndUnregisterPublishers() {
+        // Stop and unregister publishers
+    }
+
+    /**
+     * Stop any topic message listeners for this handler.
+     *
+     * @param msgDispatcher the message dispatcher from which to unregister the listener
+     */
+    public void stopAndUnregisterListeners(MessageTypeDispatcher msgDispatcher) {
+        // Stop and unregister listeners
+    }
+
+    /**
+     * Start any providers for this handler.
+     */
+    public abstract void startProviders();
+
+    /**
+     * Stop any providers for this handler.
+     */
+    public abstract void stopProviders();
+}
diff --git a/common/src/main/java/org/onap/policy/clamp/controlloop/common/startstop/CommonCommandLineArguments.java b/common/src/main/java/org/onap/policy/clamp/controlloop/common/startstop/CommonCommandLineArguments.java
new file mode 100644
index 0000000..3ef3d4c
--- /dev/null
+++ b/common/src/main/java/org/onap/policy/clamp/controlloop/common/startstop/CommonCommandLineArguments.java
@@ -0,0 +1,142 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.common.startstop;
+
+import java.io.File;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.net.URL;
+import javax.ws.rs.core.Response;
+import org.apache.commons.cli.HelpFormatter;
+import org.apache.commons.cli.Option;
+import org.apache.commons.cli.Options;
+import org.apache.commons.lang3.StringUtils;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopException;
+import org.onap.policy.common.utils.resources.ResourceUtils;
+
+/**
+ * This class reads and handles command line parameters.
+ *
+ */
+public class CommonCommandLineArguments {
+    private static final String FILE_MESSAGE_PREAMBLE = " file \"";
+    private static final int HELP_LINE_LENGTH = 120;
+
+    /**
+     * Construct the options for the policy participant.
+     */
+    public CommonCommandLineArguments(final Options options) {
+        //@formatter:off
+        options.addOption(Option.builder("h")
+                .longOpt("help")
+                .desc("outputs the usage of this command")
+                .required(false)
+                .type(Boolean.class)
+                .build());
+        options.addOption(Option.builder("v")
+                .longOpt("version")
+                .desc("outputs the version of policy participant")
+                .required(false)
+                .type(Boolean.class)
+                .build());
+        options.addOption(Option.builder("c")
+                .longOpt("config-file")
+                .desc("the full path to the configuration file to use, "
+                        + "the configuration file must be a Json file containing the "
+                        + "policy participant parameters")
+                .hasArg()
+                .argName("CONFIG_FILE")
+                .required(false)
+                .type(String.class)
+                .build());
+        //@formatter:on
+    }
+
+    /**
+     * Validate the command line options.
+     *
+     * @throws ControlLoopException on command argument validation errors
+     */
+    public void validate(final String configurationFilePath) throws ControlLoopException {
+        validateReadableFile("policy participant configuration", configurationFilePath);
+    }
+
+    /**
+     * Print version information for policy participant.
+     *
+     * @return the version string
+     */
+    public String version() {
+        return ResourceUtils.getResourceAsString("version.txt");
+    }
+
+    /**
+     * Print help information for policy participant.
+     *
+     * @param mainClassName the main class name
+     * @return the help string
+     */
+    public String help(final String mainClassName, final Options options) {
+        final HelpFormatter helpFormatter = new HelpFormatter();
+        final StringWriter stringWriter = new StringWriter();
+        final PrintWriter printWriter = new PrintWriter(stringWriter);
+
+        helpFormatter.printHelp(printWriter, HELP_LINE_LENGTH, mainClassName + " [options...]", "options", options, 0,
+                0, "");
+
+        return stringWriter.toString();
+    }
+
+    /**
+     * Validate readable file.
+     *
+     * @param fileTag the file tag
+     * @param fileName the file name
+     * @throws ControlLoopException on the file name passed as a parameter
+     */
+    private void validateReadableFile(final String fileTag, final String fileName) throws ControlLoopException {
+        if (StringUtils.isEmpty(fileName)) {
+            throw new ControlLoopException(Response.Status.NOT_ACCEPTABLE,
+                    fileTag + " file was not specified as an argument");
+        }
+
+        // The file name refers to a resource on the local file system
+        final URL fileUrl = ResourceUtils.getUrl4Resource(fileName);
+        if (fileUrl == null) {
+            throw new ControlLoopException(Response.Status.NOT_ACCEPTABLE,
+                    fileTag + FILE_MESSAGE_PREAMBLE + fileName + "\" does not exist");
+        }
+
+        final File theFile = new File(fileUrl.getPath());
+        if (!theFile.exists()) {
+            throw new ControlLoopException(Response.Status.NOT_ACCEPTABLE,
+                    fileTag + FILE_MESSAGE_PREAMBLE + fileName + "\" does not exist");
+        }
+        if (!theFile.isFile()) {
+            throw new ControlLoopException(Response.Status.NOT_ACCEPTABLE,
+                    fileTag + FILE_MESSAGE_PREAMBLE + fileName + "\" is not a normal file");
+        }
+        if (!theFile.canRead()) {
+            throw new ControlLoopException(Response.Status.NOT_ACCEPTABLE,
+                    fileTag + FILE_MESSAGE_PREAMBLE + fileName + "\" is ureadable");
+        }
+    }
+}
diff --git a/common/src/main/resources/examples/controlloop/KubernetesHelm.yaml b/common/src/main/resources/examples/controlloop/KubernetesHelm.yaml
new file mode 100644
index 0000000..2a5f760
--- /dev/null
+++ b/common/src/main/resources/examples/controlloop/KubernetesHelm.yaml
@@ -0,0 +1,169 @@
+# ============LICENSE_START=======================================================
+# Copyright (C) 2021 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=========================================================
+
+tosca_definitions_version: tosca_simple_yaml_1_3
+data_types:
+  onap.datatypes.ToscaConceptIdentifier:
+    derived_from: tosca.datatypes.Root
+    properties:
+      name:
+        type: string
+        required: true
+      version:
+        type: string
+        required: true
+node_types:
+  org.onap.policy.clamp.controlloop.Participant:
+    version: 1.0.1
+    derived_from: tosca.nodetypes.Root
+    properties:
+      provider:
+        type: string
+        requred: false
+  org.onap.policy.clamp.controlloop.ControlLoopElement:
+    version: 1.0.1
+    derived_from: tosca.nodetypes.Root
+    properties:
+      provider:
+        type: string
+        requred: false
+      participant_id:
+        type: onap.datatypes.ToscaConceptIdentifier
+        requred: true
+  org.onap.policy.clamp.controlloop.ControlLoop:
+    version: 1.0.1
+    derived_from: tosca.nodetypes.Root
+    properties:
+      provider:
+        type: string
+        requred: false
+      elements:
+        type: list
+        required: true
+        entry_schema:
+          type: onap.datatypes.ToscaConceptIdentifier
+  org.onap.policy.clamp.controlloop.K8SMicroserviceControlLoopElement:
+    version: 1.0.1
+    derived_from: org.onap.policy.clamp.controlloop.ControlLoopElement
+    properties:
+      chart:
+        type: string
+        requred: true
+      configs:
+        type: list
+        required: false
+      requirements:
+        type: string
+        requred: false
+      templates:
+        type: list
+        required: false
+        entry_schema:
+      values:
+        type: string
+        requred: true
+topology_template:
+  node_templates:
+    org.onap.k8s.controlloop.K8SControlLoopParticipant:
+      version: 2.3.4
+      type: org.onap.policy.clamp.controlloop.Participant
+      type_version: 1.0.1
+      description: Participant for K8S
+      properties:
+        provider: ONAP
+    org.onap.domain.database.Postgres_K8SMicroserviceControlLoopElement:
+      # See https://github.com/onap/oom/tree/master/kubernetes/common/postgres
+      version: 1.2.3
+      type: org.onap.policy.clamp.controlloop.K8SMicroserviceControlLoopElement
+      type_version: 1.0.0
+      description: Control loop element for the K8S microservice for Postgres
+      properties:
+        provider: ONAP
+        participant_id:
+          name: org.onap.k8s.controlloop.K8SControlLoopParticipant
+          version: 2.3.4
+        chart:
+          apiVersion: v1
+          description: ONAP Postgres Server
+          name: postgres
+          version: 7.0.0
+        configs:
+          - name: pg_hba.conf
+            value: <Contents of pg_hba.conf>
+          - name: setup.sql
+            value: <Contents of setup.sql>
+        requirements:
+          dependencies:
+            - name: common
+              version: ~7.x-0
+              repository: 'file://../common'
+            - name: repositoryGenerator
+              version: ~7.x-0
+              repository: 'file://../repositoryGenerator'
+        templates:
+          - name: first_template_file
+            value: <first_template_file>
+          - name: And so on
+        values:
+          <The Values>
+    org.onap.domain.database.HelloWorld_K8SMicroserviceControlLoopElement:
+      # See https://github.com/stakater-charts/helloworld/tree/master/helloworld
+      version: 1.2.3
+      type: org.onap.policy.clamp.controlloop.K8SMicroserviceControlLoopElement
+      type_version: 1.0.0
+      description: Control loop element for the K8S microservice for Hello World
+      properties:
+        provider: ONAP
+        participant_id:
+          name: org.onap.k8s.controlloop.K8SControlLoopParticipant
+          version: 2.3.4
+        chart:
+          apiVersion: v1
+          name: helloworld
+          description: helloworld chart that runs on kubernetes
+          version: 1.0.0
+          keywords:
+            - helloworld
+            - kubernetes
+          home: https://github.com/stakater-charts/helloworld
+          maintainers:
+          - name: Stakater
+            email: stakater@aurorasolutions.io
+        values:
+          kubernetes:
+            host: https://kubernetes.default
+          helloworld:
+            namespace: default
+            image:
+              name: tutum/hello-world
+              tag: latest
+            pullPolicy: IfNotPresent
+          service:
+            ingressClass: internal-ingress
+    org.onap.domain.sample.Postgres_HelloWorld_ControlLoopDefinition:
+      version: 1.2.3
+      type: org.onap.policy.clamp.controlloop.ControlLoop
+      type_version: 1.0.0
+      description: Control loop for Postgres and Hello World
+      properties:
+        provider: ONAP
+        elements:
+        - name: org.onap.domain.database.Postgres_K8SMicroserviceControlLoopElement
+          version: 1.2.3
+        - name: org.onap.domain.database.HelloWorld_K8SMicroserviceControlLoopElement
+          version: 1.2.3
diff --git a/common/src/main/resources/examples/controlloop/PMSH/consul_call_body.json b/common/src/main/resources/examples/controlloop/PMSH/consul_call_body.json
new file mode 100644
index 0000000..9118e9a
--- /dev/null
+++ b/common/src/main/resources/examples/controlloop/PMSH/consul_call_body.json
@@ -0,0 +1,62 @@
+{
+    "subscription": {
+        "subscriptionName": "subscriptiona",
+        "administrativeState": "UNLOCKED",
+        "fileBasedGP": 15,
+        "fileLocation": "/pm/pm.xml",
+        "nfFilter": {
+            "nfNames": [
+                "^pnf1.*"
+            ],
+            "modelInvariantIDs": [
+                "5845y423-g654-6fju-po78-8n53154532k6",
+                "7129e420-d396-4efb-af02-6b83499b12f8"
+            ],
+            "modelVersionIDs": [
+                "e80a6ae3-cafd-4d24-850d-e14c084a5ca9"
+            ]
+        },
+        "measurementGroups": [
+            {
+                "measurementGroup": {
+                    "measurementTypes": [
+                        {
+                            "measurementType": "countera"
+                        },
+                        {
+                            "measurementType": "counterb"
+                        }
+                    ],
+                    "managedObjectDNsBasic": [
+                        {
+                            "DN": "dna"
+                        },
+                        {
+                            "DN": "dnb"
+                        }
+                    ]
+                }
+            },
+            {
+                "measurementGroup": {
+                    "measurementTypes": [
+                        {
+                            "measurementType": "counterc"
+                        },
+                        {
+                            "measurementType": "counterd"
+                        }
+                    ],
+                    "managedObjectDNsBasic": [
+                        {
+                            "DN": "dnc"
+                        },
+                        {
+                            "DN": "dnd"
+                        }
+                    ]
+                }
+            }
+        ]
+    }
+}
diff --git a/common/src/main/resources/examples/controlloop/PMSH/consul_url.txt b/common/src/main/resources/examples/controlloop/PMSH/consul_url.txt
new file mode 100644
index 0000000..e90ded1
--- /dev/null
+++ b/common/src/main/resources/examples/controlloop/PMSH/consul_url.txt
@@ -0,0 +1 @@
+http://consul:31321/v1/kv/dcae-pmsh:policy
\ No newline at end of file
diff --git a/common/src/main/resources/examples/controlloop/PMSH/pmsh_cloudify_blueprint.yaml b/common/src/main/resources/examples/controlloop/PMSH/pmsh_cloudify_blueprint.yaml
new file mode 100644
index 0000000..7cdc6d5
--- /dev/null
+++ b/common/src/main/resources/examples/controlloop/PMSH/pmsh_cloudify_blueprint.yaml
@@ -0,0 +1,176 @@
+#
+# ============LICENSE_START=======================================================
+#  Copyright (C) 2020 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=========================================================
+#
+
+tosca_definitions_version: cloudify_dsl_1_3
+
+imports:
+  - https://www.getcloudify.org/spec/cloudify/4.5.5/types.yaml
+ # - plugin:k8splugin?version=>=3.4.3,<4.0.0
+  - plugin:k8splugin?version=3.7.0
+  - plugin:pgaas?version=1.3.0
+  - plugin:clamppolicyplugin?version=1.1.0
+inputs:
+  tag_version:
+    type: string
+    description: Docker image to be used
+    default: 'nexus3.onap.org:10001/onap/org.onap.dcaegen2.services.pmsh:1.1.2'
+  replicas:
+    type: integer
+    description: Number of instances
+    default: 1
+  operational_policy_name:
+    type: string
+    default: 'pmsh-operational-policy'
+  control_loop_name:
+    type: string
+    default: 'pmsh-control-loop'
+  pmsh_publish_topic_name:
+    type: string
+    default: 'unauthenticated.DCAE_CL_OUTPUT'
+  policy_feedback_topic_name:
+    type: string
+    default: 'unauthenticated.PMSH_CL_INPUT'
+  aai_notification_topic_name:
+    type: string
+    default: 'AAI-EVENT'
+  publisher_client_role:
+    type: string
+    description: Client role to request secure access to topic
+    default: 'org.onap.dcae.pmPublisher'
+  subscriber_client_role:
+    type: string
+    description: Client role to request secure access to topic
+    default: 'org.onap.dcae.pmSubscriber'
+  dcae_location:
+    type: string
+    description: DCAE location for the subscriber, used to set up routing
+    default: 'san-francisco'
+  cpu_limit:
+    type: string
+    default: '1000m'
+  cpu_request:
+    type: string
+    default: '1000m'
+  memory_limit:
+    type: string
+    default: '1024Mi'
+  memory_request:
+    type: string
+    default: '1024Mi'
+  pgaas_cluster_name:
+    type: string
+    default: 'dcae-pg-primary.onap'
+  enable_tls:
+    type: boolean
+    default: true
+  protocol:
+    type: string
+    description: PMSH protocol. If enable_tls is false, set to http
+    default: 'https'
+  policy_model_id:
+    type: 'string'
+    default: 'onap.policies.monitoring.dcae-pm-subscription-handler'
+  policy_id:
+    type: 'string'
+    default: 'onap.policies.monitoring.dcae-pm-subscription-handler'
+node_templates:
+  pgaasvm:
+    type: dcae.nodes.pgaas.database
+    properties:
+      writerfqdn: { get_input: pgaas_cluster_name }
+      name: 'pmsh'
+  pmsh:
+    type: dcae.nodes.ContainerizedServiceComponentUsingDmaap
+    interfaces:
+      cloudify.interfaces.lifecycle:
+        create:
+          inputs:
+            ports:
+              - '8443:0'
+            envs:
+              PMSH_PG_URL:
+                { get_attribute: [ pgaasvm, admin, host ] }
+              PMSH_PG_PASSWORD:
+                { get_attribute: [ pgaasvm, admin, password ] }
+              PMSH_PG_USERNAME:
+                { get_attribute: [ pgaasvm, admin, user ] }
+              PMSH_DB_NAME:
+                { get_attribute: [ pgaasvm, admin, database ] }
+
+    relationships:
+      - target: pmsh-policy
+        type: cloudify.relationships.depends_on
+
+    properties:
+      service_component_type: 'dcae-pmsh'
+      service_component_name_override: 'dcae-pmsh'
+      application_config:
+        enable_tls: { get_input: enable_tls }
+        aaf_identity: 'dcae@dcae.onap.org'
+        aaf_password: 'demo123456!'
+        operational_policy_name: { get_input: operational_policy_name }
+        control_loop_name: { get_input: control_loop_name }
+        cert_path: '/opt/app/pmsh/etc/certs/cert.pem'
+        key_path: '/opt/app/pmsh/etc/certs/key.pem'
+        ca_cert_path: '/opt/app/pmsh/etc/certs/cacert.pem'
+        streams_publishes:
+          policy_pm_publisher:
+            type: message_router
+            dmaap_info:
+              #topic_url: {concat: ["https://message-router:3905/events/", { get_input: pmsh_publish_topic_name }]}
+              topic_url: { concat: [ "http://message-router:3904/events/", { get_input: pmsh_publish_topic_name } ] }
+        streams_subscribes:
+          policy_pm_subscriber:
+            type: message_router
+            dmaap_info:
+              #topic_url: {concat: ["https://message-router:3905/events/", { get_input: policy_feedback_topic_name }]}
+              topic_url: {concat: ["http://message-router:3904/events/", { get_input: policy_feedback_topic_name }]}
+          aai_subscriber:
+            type: message_router
+            dmaap_info:
+              #topic_url: {concat: ["https://message-router:3905/events/", { get_input: aai_notification_topic_name }]}
+              topic_url: {concat: ["http://message-router:3904/events/", { get_input: aai_notification_topic_name }]}
+      resource_config:
+        limits:
+          cpu: { get_input: cpu_limit }
+          memory: { get_input: memory_limit }
+        requests:
+          cpu: { get_input: cpu_request }
+          memory: { get_input: memory_request }
+      docker_config:
+        healthcheck:
+          endpoint: /healthcheck
+          interval: 15s
+          timeout: 1s
+          type: { get_input: protocol }
+      image: { get_input: tag_version }
+      replicas: { get_input: replicas }
+      log_info:
+        log_directory: '/var/log/ONAP/dcaegen2/services/pmsh'
+      tls_info:
+        cert_directory: '/opt/app/pmsh/etc/certs'
+        use_tls: { get_input: enable_tls }
+  pmsh-policy:
+    type: clamp.nodes.policy
+    properties:
+      policy_model_id:
+        get_input: policy_model_id
+      policy_id:
+        get_input: policy_id
diff --git a/common/src/main/resources/examples/controlloop/PMSH/pmsh_monitoring_policy.json b/common/src/main/resources/examples/controlloop/PMSH/pmsh_monitoring_policy.json
new file mode 100644
index 0000000..5b64b5b
--- /dev/null
+++ b/common/src/main/resources/examples/controlloop/PMSH/pmsh_monitoring_policy.json
@@ -0,0 +1,123 @@
+{
+    "tosca_definitions_version": "tosca_simple_yaml_1_1_0",
+    "topology_template": {
+        "policies": [
+            {
+                "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0test": {
+                    "type": "onap.policies.monitoring.dcae-pm-subscription-handler",
+                    "type_version": "1.0.0",
+                    "properties": {
+                        "pmsh_policy": {
+                            "measurementGroups": [
+                                {
+                                    "measurementGroup": {
+                                        "onap.datatypes.monitoring.measurementGroup": {
+                                            "measurementTypes": [
+                                                {
+                                                    "measurementType": {
+                                                        "onap.datatypes.monitoring.measurementType": {
+                                                            "measurementType": "countera"
+                                                        }
+                                                    }
+                                                },
+                                                {
+                                                    "measurementType": {
+                                                        "onap.datatypes.monitoring.measurementType": {
+                                                            "measurementType": "counterb"
+                                                        }
+                                                    }
+                                                }
+                                            ],
+                                            "managedObjectDNsBasic": [
+                                                {
+                                                    "managedObjectDNsBasic": {
+                                                        "onap.datatypes.monitoring.managedObjectDNsBasic": {
+                                                            "DN": "dna"
+                                                        }
+                                                    }
+                                                },
+                                                {
+                                                    "managedObjectDNsBasic": {
+                                                        "onap.datatypes.monitoring.managedObjectDNsBasic": {
+                                                            "DN": "dnb"
+                                                        }
+                                                    }
+                                                }
+                                            ]
+                                        }
+                                    }
+                                },
+                                {
+                                    "measurementGroup": {
+                                        "onap.datatypes.monitoring.measurementGroup": {
+                                            "measurementTypes": [
+                                                {
+                                                    "measurementType": {
+                                                        "onap.datatypes.monitoring.measurementType": {
+                                                            "measurementType": "counterc"
+                                                        }
+                                                    }
+                                                },
+                                                {
+                                                    "measurementType": {
+                                                        "onap.datatypes.monitoring.measurementType": {
+                                                            "measurementType": "counterd"
+                                                        }
+                                                    }
+                                                }
+                                            ],
+                                            "managedObjectDNsBasic": [
+                                                {
+                                                    "managedObjectDNsBasic": {
+                                                        "onap.datatypes.monitoring.managedObjectDNsBasic": {
+                                                            "DN": "dnc"
+                                                        }
+                                                    }
+                                                },
+                                                {
+                                                    "managedObjectDNsBasic": {
+                                                        "onap.datatypes.monitoring.managedObjectDNsBasic": {
+                                                            "DN": "dnd"
+                                                        }
+                                                    }
+                                                }
+                                            ]
+                                        }
+                                    }
+                                }
+                            ],
+                            "fileBasedGP": 15,
+                            "fileLocation": "/pm/pm.xml",
+                            "subscriptionName": "subscriptiona",
+                            "administrativeState": "UNLOCKED",
+                            "nfFilter": {
+                                "onap.datatypes.monitoring.nfFilter": {
+                                    "modelVersionIDs": [
+                                        "e80a6ae3-cafd-4d24-850d-e14c084a5ca9"
+                                    ],
+                                    "modelInvariantIDs": [
+                                        "5845y423-g654-6fju-po78-8n53154532k6",
+                                        "7129e420-d396-4efb-af02-6b83499b12f8"
+                                    ],
+                                    "modelNames": [],
+                                    "nfNames": [
+                                        "\"^pnf1.*\""
+                                    ]
+                                }
+                            }
+                        }
+                    },
+                    "name": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0test",
+                    "version": "1.0.0",
+                    "metadata": {
+                        "policy-id": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0test",
+                        "policy-version": "1.0.0"
+                    }
+                }
+            }
+        ]
+    },
+    "name": "ToscaServiceTemplateSimple",
+    "version": "1.0.0",
+    "metadata": {}
+}
diff --git a/common/src/main/resources/examples/controlloop/PMSH/pmsh_monitoring_policy.yaml b/common/src/main/resources/examples/controlloop/PMSH/pmsh_monitoring_policy.yaml
new file mode 100644
index 0000000..6021f36
--- /dev/null
+++ b/common/src/main/resources/examples/controlloop/PMSH/pmsh_monitoring_policy.yaml
@@ -0,0 +1,64 @@
+---
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+name: ToscaServiceTemplateSimple
+version: 1.0.0
+metadata: {}
+topology_template:
+  policies:
+  - MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0test:
+      type: onap.policies.monitoring.dcae-pm-subscription-handler
+      type_version: 1.0.0
+      name: MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0test
+      version: 1.0.0
+      metadata:
+        policy-id: MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0test
+        policy-version: 1.0.0
+      properties:
+        pmsh_policy:
+          fileBasedGP: 15
+          fileLocation: "/pm/pm.xml"
+          subscriptionName: subscriptiona
+          administrativeState: UNLOCKED
+          nfFilter:
+            onap.datatypes.monitoring.nfFilter:
+              modelVersionIDs:
+              - e80a6ae3-cafd-4d24-850d-e14c084a5ca9
+              modelInvariantIDs:
+              - 5845y423-g654-6fju-po78-8n53154532k6
+              - 7129e420-d396-4efb-af02-6b83499b12f8
+              modelNames: []
+              nfNames:
+              - '"^pnf1.*"'
+          measurementGroups:
+          - measurementGroup:
+              onap.datatypes.monitoring.measurementGroup:
+                measurementTypes:
+                - measurementType:
+                    onap.datatypes.monitoring.measurementType:
+                      measurementType: countera
+                - measurementType:
+                    onap.datatypes.monitoring.measurementType:
+                      measurementType: counterb
+                managedObjectDNsBasic:
+                - managedObjectDNsBasic:
+                    onap.datatypes.monitoring.managedObjectDNsBasic:
+                      DN: dna
+                - managedObjectDNsBasic:
+                    onap.datatypes.monitoring.managedObjectDNsBasic:
+                      DN: dnb
+          - measurementGroup:
+              onap.datatypes.monitoring.measurementGroup:
+                measurementTypes:
+                - measurementType:
+                    onap.datatypes.monitoring.measurementType:
+                      measurementType: counterc
+                - measurementType:
+                    onap.datatypes.monitoring.measurementType:
+                      measurementType: counterd
+                managedObjectDNsBasic:
+                - managedObjectDNsBasic:
+                    onap.datatypes.monitoring.managedObjectDNsBasic:
+                      DN: dnc
+                - managedObjectDNsBasic:
+                    onap.datatypes.monitoring.managedObjectDNsBasic:
+                      DN: dnd
diff --git a/common/src/main/resources/examples/controlloop/PMSH/pmsh_monitoring_policy_type.yaml b/common/src/main/resources/examples/controlloop/PMSH/pmsh_monitoring_policy_type.yaml
new file mode 100644
index 0000000..e282bf5
--- /dev/null
+++ b/common/src/main/resources/examples/controlloop/PMSH/pmsh_monitoring_policy_type.yaml
@@ -0,0 +1,264 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+name: ToscaServiceTemplateSimple
+version: 1.0.0
+metadata: {}
+policy_types:
+  onap.policies.Monitoring:
+    derived_from: tosca.policies.Root
+    description: a base policy type for all policies that govern monitoring provisioning
+    version: 1.0.0
+    name: onap.policies.Monitoring
+    onap.policies.monitoring.dcae-pm-subscription-handler:
+      name: onap.policies.monitoring.dcae-pm-subscription-handler
+      version: 1.0.0
+      derived_from: onap.policies.Monitoring
+      metadata: {}
+      properties:
+        pmsh_policy:
+          name: pmsh_policy
+          type: onap.datatypes.monitoring.subscription
+          typeVersion: 0.0.0
+          description: PMSH Policy JSON
+          required: false
+          constraints: []
+          metadata: {}
+data_types:
+  onap.datatypes.monitoring.managedObjectDNsBasic:
+    name: onap.datatypes.monitoring.managedObjectDNsBasic
+    version: 0.0.0
+    derived_from: tosca.datatypes.Root
+    metadata: {}
+    constraints: []
+    properties:
+      DN:
+        name: DN
+        type: string
+        typeVersion: 0.0.0
+        description: Managed object distinguished name
+        required: true
+        constraints: []
+        metadata: {}
+  onap.datatypes.monitoring.managedObjectDNsBasics:
+    name: onap.datatypes.monitoring.managedObjectDNsBasics
+    version: 0.0.0
+    derived_from: tosca.datatypes.Root
+    metadata: {}
+    constraints: []
+    properties:
+      managedObjectDNsBasic:
+        name: managedObjectDNsBasic
+        type: map
+        typeVersion: 0.0.0
+        description: Managed object distinguished name object
+        required: true
+        constraints: []
+        entry_schema:
+          type: onap.datatypes.monitoring.managedObjectDNsBasic
+          typeVersion: 0.0.0
+          constraints: []
+        metadata: {}
+  onap.datatypes.monitoring.measurementGroup:
+    name: onap.datatypes.monitoring.measurementGroup
+    version: 0.0.0
+    derived_from: tosca.datatypes.Root
+    metadata: {}
+    constraints: []
+    properties:
+      measurementTypes:
+        name: measurementTypes
+        type: list
+        typeVersion: 0.0.0
+        description: List of measurement types
+        required: true
+        constraints: []
+        entry_schema:
+          type: onap.datatypes.monitoring.measurementTypes
+          typeVersion: 0.0.0
+          constraints: []
+        metadata: {}
+      managedObjectDNsBasic:
+        name: managedObjectDNsBasic
+        type: list
+        typeVersion: 0.0.0
+        description: List of managed object distinguished names
+        required: true
+        constraints: []
+        entry_schema:
+          type: onap.datatypes.monitoring.managedObjectDNsBasics
+          typeVersion: 0.0.0
+          constraints: []
+        metadata: {}
+  onap.datatypes.monitoring.measurementGroups:
+    name: onap.datatypes.monitoring.measurementGroups
+    version: 0.0.0
+    derived_from: tosca.datatypes.Root
+    metadata: {}
+    constraints: []
+    properties:
+      measurementGroup:
+        name: measurementGroup
+        type: map
+        typeVersion: 0.0.0
+        description: Measurement Group
+        required: true
+        constraints: []
+        entry_schema:
+          type: onap.datatypes.monitoring.measurementGroup
+          typeVersion: 0.0.0
+          constraints: []
+        metadata: {}
+  onap.datatypes.monitoring.measurementType:
+    name: onap.datatypes.monitoring.measurementType
+    version: 0.0.0
+    derived_from: tosca.datatypes.Root
+    metadata: {}
+    constraints: []
+    properties:
+      measurementType:
+        name: measurementType
+        type: string
+        typeVersion: 0.0.0
+        description: Measurement type
+        required: true
+        constraints: []
+        metadata: {}
+  onap.datatypes.monitoring.measurementTypes:
+    name: onap.datatypes.monitoring.measurementTypes
+    version: 0.0.0
+    derived_from: tosca.datatypes.Root
+    metadata: {}
+    constraints: []
+    properties:
+      measurementType:
+        name: measurementType
+        type: map
+        typeVersion: 0.0.0
+        description: Measurement type object
+        required: true
+        constraints: []
+        entry_schema:
+          type: onap.datatypes.monitoring.measurementType
+          typeVersion: 0.0.0
+          constraints: []
+        metadata: {}
+  onap.datatypes.monitoring.nfFilter:
+    name: onap.datatypes.monitoring.nfFilter
+    version: 0.0.0
+    derived_from: tosca.datatypes.Root
+    metadata: {}
+    constraints: []
+    properties:
+      modelNames:
+        name: modelNames
+        type: list
+        typeVersion: 0.0.0
+        description: List of model names
+        required: true
+        constraints: []
+        entry_schema:
+          type: string
+          typeVersion: 0.0.0
+          constraints: []
+        metadata: {}
+      modelInvariantIDs:
+        name: modelInvariantIDs
+        type: list
+        typeVersion: 0.0.0
+        description: List of model invariant IDs
+        required: true
+        constraints: []
+        entry_schema:
+          type: string
+          typeVersion: 0.0.0
+          constraints: []
+        metadata: {}
+      modelVersionIDs:
+        name: modelVersionIDs
+        type: list
+        typeVersion: 0.0.0
+        description: List of model version IDs
+        required: true
+        constraints: []
+        entry_schema:
+          type: string
+          typeVersion: 0.0.0
+          constraints: []
+        metadata: {}
+      nfNames:
+        name: nfNames
+        type: list
+        typeVersion: 0.0.0
+        description: List of network functions
+        required: true
+        constraints: []
+        entry_schema:
+          type: string
+          typeVersion: 0.0.0
+          constraints: []
+        metadata: {}
+  onap.datatypes.monitoring.subscription:
+    name: onap.datatypes.monitoring.subscription
+    version: 0.0.0
+    derived_from: tosca.datatypes.Root
+    metadata: {}
+    constraints: []
+    properties:
+      measurementGroups:
+        name: measurementGroups
+        type: list
+        typeVersion: 0.0.0
+        description: Measurement Groups
+        required: true
+        constraints: []
+        entry_schema:
+          type: onap.datatypes.monitoring.measurementGroups
+          typeVersion: 0.0.0
+          constraints: []
+        metadata: {}
+      fileBasedGP:
+        name: fileBasedGP
+        type: integer
+        typeVersion: 0.0.0
+        description: File based granularity period
+        required: true
+        constraints: []
+        metadata: {}
+      fileLocation:
+        name: fileLocation
+        type: string
+        typeVersion: 0.0.0
+        description: ROP file location
+        required: true
+        constraints: []
+        metadata: {}
+      subscriptionName:
+        name: subscriptionName
+        type: string
+        typeVersion: 0.0.0
+        description: Name of the subscription
+        required: true
+        constraints: []
+        metadata: {}
+      administrativeState:
+        name: administrativeState
+        type: string
+        typeVersion: 0.0.0
+        description: State of the subscription
+        required: true
+        constraints:
+        - valid_values:
+          - LOCKED
+          - UNLOCKED
+        metadata: {}
+      nfFilter:
+        name: nfFilter
+        type: map
+        typeVersion: 0.0.0
+        description: Network function filter
+        required: true
+        constraints: []
+        entry_schema:
+          type: onap.datatypes.monitoring.nfFilter
+          typeVersion: 0.0.0
+          constraints: []
+        metadata: {}
diff --git a/common/src/main/resources/examples/controlloop/PMSH/pmsh_operational_policy.json b/common/src/main/resources/examples/controlloop/PMSH/pmsh_operational_policy.json
new file mode 100644
index 0000000..6bd681d
--- /dev/null
+++ b/common/src/main/resources/examples/controlloop/PMSH/pmsh_operational_policy.json
@@ -0,0 +1,2808 @@
+{
+   "tosca_definitions_version":"tosca_simple_yaml_1_1_0",
+   "topology_template":{
+      "policies":[
+         {
+            "operational.apex.pmcontrol":{
+               "type":"onap.policies.controlloop.operational.Apex",
+               "type_version":"1.0.0",
+               "version":"1.0.0",
+               "metadata":{
+                  "policy-id":"operational.apex.pmcontrol",
+                  "policy-version":1
+               },
+               "properties":{
+                  "engineServiceParameters":{
+                     "name":"MyApexEngine",
+                     "version":"0.0.1",
+                     "id":45,
+                     "instanceCount":2,
+                     "deploymentPort":12561,
+                     "policy_type_impl":{
+                        "apexPolicyModel":{
+                           "key":{
+                              "name":"PMControlPolicy",
+                              "version":"0.0.1"
+                           },
+                           "keyInformation":{
+                              "key":{
+                                 "name":"PMControlPolicy_KeyInfo",
+                                 "version":"0.0.1"
+                              },
+                              "keyInfoMap":{
+                                 "entry":[
+                                    {
+                                       "key":{
+                                          "name":"CDSActionIdentifiersType",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"CDSActionIdentifiersType",
+                                             "version":"0.0.1"
+                                          },
+                                          "UUID":"6e5fa19b-14df-37e3-a4ae-8c537e861a82",
+                                          "description":"Generated description for concept referred to by key \"CDSActionIdentifiersType:0.0.1\""
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"CDSCreateResponseEvent",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"CDSCreateResponseEvent",
+                                             "version":"0.0.1"
+                                          },
+                                          "UUID":"14b29e38-ac75-3273-aa4e-8583c0aa7dad",
+                                          "description":"Generated description for concept referred to by key \"CDSCreateResponseEvent:0.0.1\""
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"CDSCreateResponsePayloadType",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"CDSCreateResponsePayloadType",
+                                             "version":"0.0.1"
+                                          },
+                                          "UUID":"04573f8f-e772-30a5-b1d9-d7318d4a1e13",
+                                          "description":"Generated description for concept referred to by key \"CDSCreateResponsePayloadType:0.0.1\""
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"CDSCreateResponsePolicy",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"CDSCreateResponsePolicy",
+                                             "version":"0.0.1"
+                                          },
+                                          "UUID":"e126c965-fc09-3bfe-8f55-70f380a4a49c",
+                                          "description":"Generated description for concept referred to by key \"CDSCreateResponsePolicy:0.0.1\""
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"CDSCreateResponseTask",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"CDSCreateResponseTask",
+                                             "version":"0.0.1"
+                                          },
+                                          "UUID":"6165ee82-afd2-3aab-a517-f00b3f2461d2",
+                                          "description":"Generated description for concept referred to by key \"CDSCreateResponseTask:0.0.1\""
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"CDSCreateSubscriptionPayloadType",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"CDSCreateSubscriptionPayloadType",
+                                             "version":"0.0.1"
+                                          },
+                                          "UUID":"8350ac5e-c157-38b9-9614-a0f93a830e60",
+                                          "description":"Generated description for concept referred to by key \"CDSCreateSubscriptionPayloadType:0.0.1\""
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"CDSCreateSubscriptionRequestEvent",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"CDSCreateSubscriptionRequestEvent",
+                                             "version":"0.0.1"
+                                          },
+                                          "UUID":"cfa325ba-226b-3a31-9183-ec43e2b6e9a2",
+                                          "description":"Generated description for concept referred to by key \"CDSCreateSubscriptionRequestEvent:0.0.1\""
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"CDSDeleteResponseEvent",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"CDSDeleteResponseEvent",
+                                             "version":"0.0.1"
+                                          },
+                                          "UUID":"8be9c0fa-7437-3841-aff2-b3cec6ae3bd8",
+                                          "description":"Generated description for concept referred to by key \"CDSDeleteResponseEvent:0.0.1\""
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"CDSDeleteResponsePayloadType",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"CDSDeleteResponsePayloadType",
+                                             "version":"0.0.1"
+                                          },
+                                          "UUID":"3fbfe0c9-152e-34d3-a504-09cd13c058d0",
+                                          "description":"Generated description for concept referred to by key \"CDSDeleteResponsePayloadType:0.0.1\""
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"CDSDeleteResponsePolicy",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"CDSDeleteResponsePolicy",
+                                             "version":"0.0.1"
+                                          },
+                                          "UUID":"a780251c-edd5-3132-b865-04313246b43c",
+                                          "description":"Generated description for concept referred to by key \"CDSDeleteResponsePolicy:0.0.1\""
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"CDSDeleteResponseTask",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"CDSDeleteResponseTask",
+                                             "version":"0.0.1"
+                                          },
+                                          "UUID":"afce4555-3aa3-3521-a7d8-ee8cdf0d3efc",
+                                          "description":"Generated description for concept referred to by key \"CDSDeleteResponseTask:0.0.1\""
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"CDSDeleteSubscriptionPayloadType",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"CDSDeleteSubscriptionPayloadType",
+                                             "version":"0.0.1"
+                                          },
+                                          "UUID":"12658406-9147-3c9d-a38c-5ad5e30b092b",
+                                          "description":"Generated description for concept referred to by key \"CDSDeleteSubscriptionPayloadType:0.0.1\""
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"CDSDeleteSubscriptionRequestEvent",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"CDSDeleteSubscriptionRequestEvent",
+                                             "version":"0.0.1"
+                                          },
+                                          "UUID":"24380c95-9289-36e6-8cbf-0edefa15ccd9",
+                                          "description":"Generated description for concept referred to by key \"CDSDeleteSubscriptionRequestEvent:0.0.1\""
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"CDSRequestCommonHeaderType",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"CDSRequestCommonHeaderType",
+                                             "version":"0.0.1"
+                                          },
+                                          "UUID":"35590ac0-062c-39f1-8786-b4ff716e30b1",
+                                          "description":"Generated description for concept referred to by key \"CDSRequestCommonHeaderType:0.0.1\""
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"CDSResponseCommonHeaderType",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"CDSResponseCommonHeaderType",
+                                             "version":"0.0.1"
+                                          },
+                                          "UUID":"dd7e1805-885a-350b-aaf9-ed541321ae3c",
+                                          "description":"Generated description for concept referred to by key \"CDSResponseCommonHeaderType:0.0.1\""
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"CDSResponseStatusEvent",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"CDSResponseStatusEvent",
+                                             "version":"0.0.1"
+                                          },
+                                          "UUID":"7986e21b-32f7-302e-9554-31f21b673493",
+                                          "description":"Generated description for concept referred to by key \"CDSResponseStatusEvent:0.0.1\""
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"CDSResponseStatusType",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"CDSResponseStatusType",
+                                             "version":"0.0.1"
+                                          },
+                                          "UUID":"92b8a2cf-344e-3ce1-8cc0-2b7d3cb695fa",
+                                          "description":"Generated description for concept referred to by key \"CDSResponseStatusType:0.0.1\""
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"CreateSubscriptionPayloadEvent",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"CreateSubscriptionPayloadEvent",
+                                             "version":"0.0.1"
+                                          },
+                                          "UUID":"92162397-1a8e-3a3f-a469-d2af7700af4a",
+                                          "description":"Generated description for concept referred to by key \"CreateSubscriptionPayloadEvent:0.0.1\""
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"CreateSubscriptionPayloadTask",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"CreateSubscriptionPayloadTask",
+                                             "version":"0.0.1"
+                                          },
+                                          "UUID":"bc0c69f0-52ed-38ea-b468-ae4a6fd1730d",
+                                          "description":"Generated description for concept referred to by key \"CreateSubscriptionPayloadTask:0.0.1\""
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"CreateSubscriptionRequestTask",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"CreateSubscriptionRequestTask",
+                                             "version":"0.0.1"
+                                          },
+                                          "UUID":"89cb75e9-f06c-30d3-b4ff-698d45f63869",
+                                          "description":"Generated description for concept referred to by key \"CreateSubscriptionRequestTask:0.0.1\""
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"DeleteSubscriptionPayloadEvent",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"DeleteSubscriptionPayloadEvent",
+                                             "version":"0.0.1"
+                                          },
+                                          "UUID":"994fa441-04ab-33bb-832d-1cd12ab5d074",
+                                          "description":"Generated description for concept referred to by key \"DeleteSubscriptionPayloadEvent:0.0.1\""
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"DeleteSubscriptionPayloadTask",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"DeleteSubscriptionPayloadTask",
+                                             "version":"0.0.1"
+                                          },
+                                          "UUID":"0f519117-5fea-3e4b-941f-8f778100465f",
+                                          "description":"Generated description for concept referred to by key \"DeleteSubscriptionPayloadTask:0.0.1\""
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"DeleteSubscriptionRequestTask",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"DeleteSubscriptionRequestTask",
+                                             "version":"0.0.1"
+                                          },
+                                          "UUID":"acb772fe-d442-39e3-98f9-b1080caf4150",
+                                          "description":"Generated description for concept referred to by key \"DeleteSubscriptionRequestTask:0.0.1\""
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"MRResponseEvent",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"MRResponseEvent",
+                                             "version":"0.0.1"
+                                          },
+                                          "UUID":"13c747a3-6bae-3bcf-9c80-b152e01dc194",
+                                          "description":"Generated description for concept referred to by key \"MRResponseEvent:0.0.1\""
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"PMControlPolicy",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"PMControlPolicy",
+                                             "version":"0.0.1"
+                                          },
+                                          "UUID":"acf1e55c-7bc5-3bd5-975a-0ca54afcd8a4",
+                                          "description":"Generated description for concept referred to by key \"PMControlPolicy:0.0.1\""
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"PMControlPolicy_Albums",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"PMControlPolicy_Albums",
+                                             "version":"0.0.1"
+                                          },
+                                          "UUID":"b38ad204-c2c8-32f4-9b5a-dda0aeb0145b",
+                                          "description":"Generated description for concept referred to by key \"PMControlPolicy_Albums:0.0.1\""
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"PMControlPolicy_Events",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"PMControlPolicy_Events",
+                                             "version":"0.0.1"
+                                          },
+                                          "UUID":"be3871a0-c42a-3113-a066-82d192840eca",
+                                          "description":"Generated description for concept referred to by key \"PMControlPolicy_Events:0.0.1\""
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"PMControlPolicy_KeyInfo",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"PMControlPolicy_KeyInfo",
+                                             "version":"0.0.1"
+                                          },
+                                          "UUID":"ced37634-28a4-3178-b7f6-2980794927b0",
+                                          "description":"Generated description for concept referred to by key \"PMControlPolicy_KeyInfo:0.0.1\""
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"PMControlPolicy_Policies",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"PMControlPolicy_Policies",
+                                             "version":"0.0.1"
+                                          },
+                                          "UUID":"be3d180d-ef9c-3a75-8e9c-84271a038bed",
+                                          "description":"Generated description for concept referred to by key \"PMControlPolicy_Policies:0.0.1\""
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"PMControlPolicy_Schemas",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"PMControlPolicy_Schemas",
+                                             "version":"0.0.1"
+                                          },
+                                          "UUID":"e61973f1-189c-39e5-82f6-0d3afe298a20",
+                                          "description":"Generated description for concept referred to by key \"PMControlPolicy_Schemas:0.0.1\""
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"PMControlPolicy_Tasks",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"PMControlPolicy_Tasks",
+                                             "version":"0.0.1"
+                                          },
+                                          "UUID":"5658adb3-2962-30a3-a241-fae75bb8eb4a",
+                                          "description":"Generated description for concept referred to by key \"PMControlPolicy_Tasks:0.0.1\""
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"PMSubscriptionAlbum",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"PMSubscriptionAlbum",
+                                             "version":"0.0.1"
+                                          },
+                                          "UUID":"c2bd6f0d-6854-317a-9be2-97c08338428c",
+                                          "description":"Generated description for concept referred to by key \"PMSubscriptionAlbum:0.0.1\""
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"PMSubscriptionOutputEvent",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"PMSubscriptionOutputEvent",
+                                             "version":"0.0.1"
+                                          },
+                                          "UUID":"992b7819-9f69-3aa0-bb0f-6e45ea15ce05",
+                                          "description":"Generated description for concept referred to by key \"PMSubscriptionOutputEvent:0.0.1\""
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"PMSubscriptionType",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"PMSubscriptionType",
+                                             "version":"0.0.1"
+                                          },
+                                          "UUID":"73c1c397-4fc3-357f-93b6-a8ad707fbaae",
+                                          "description":"Generated description for concept referred to by key \"PMSubscriptionType:0.0.1\""
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"ReceiveEventPolicy",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"ReceiveEventPolicy",
+                                             "version":"0.0.1"
+                                          },
+                                          "UUID":"568b7345-9de1-36d3-b6a3-9b857e6809a1",
+                                          "description":"Generated description for concept referred to by key \"ReceiveEventPolicy:0.0.1\""
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"ReceiveSubscriptionTask",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"ReceiveSubscriptionTask",
+                                             "version":"0.0.1"
+                                          },
+                                          "UUID":"f596afc8-100c-35eb-92c8-352355ea457d",
+                                          "description":"Generated description for concept referred to by key \"ReceiveSubscriptionTask:0.0.1\""
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"SimpleIntType",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"SimpleIntType",
+                                             "version":"0.0.1"
+                                          },
+                                          "UUID":"153791fd-ae0a-36a7-88a5-309a7936415d",
+                                          "description":"Generated description for concept referred to by key \"SimpleIntType:0.0.1\""
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"SimpleStringType",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"SimpleStringType",
+                                             "version":"0.0.1"
+                                          },
+                                          "UUID":"8a4957cf-9493-3a76-8c22-a208e23259af",
+                                          "description":"Generated description for concept referred to by key \"SimpleStringType:0.0.1\""
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"SubscriptionStatusType",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"SubscriptionStatusType",
+                                             "version":"0.0.1"
+                                          },
+                                          "UUID":"597643b1-9db1-31ce-85d0-e1c63c43b30b",
+                                          "description":"Generated description for concept referred to by key \"SubscriptionStatusType:0.0.1\""
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"SubscriptionType",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"SubscriptionType",
+                                             "version":"0.0.1"
+                                          },
+                                          "UUID":"184547bb-7d64-3cb2-a273-d7185102c5ce",
+                                          "description":"Generated description for concept referred to by key \"SubscriptionType:0.0.1\""
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"UUIDType",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"UUIDType",
+                                             "version":"0.0.1"
+                                          },
+                                          "UUID":"6a8cc68e-dfc8-3403-9c6d-071c886b319c",
+                                          "description":"Generated description for concept referred to by key \"UUIDType:0.0.1\""
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"pmsh-operational-policy",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"pmsh-operational-policy",
+                                             "version":"0.0.1"
+                                          },
+                                          "UUID":"fdf2c9ff-6422-3ea6-b6b6-49b12116265d",
+                                          "description":"Generated description for concept referred to by key \"pmsh-operational-policy:0.0.1\""
+                                       }
+                                    }
+                                 ]
+                              }
+                           },
+                           "policies":{
+                              "key":{
+                                 "name":"PMControlPolicy_Policies",
+                                 "version":"0.0.1"
+                              },
+                              "policyMap":{
+                                 "entry":[
+                                    {
+                                       "key":{
+                                          "name":"CDSCreateResponsePolicy",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "policyKey":{
+                                             "name":"CDSCreateResponsePolicy",
+                                             "version":"0.0.1"
+                                          },
+                                          "template":"Freestyle",
+                                          "state":{
+                                             "entry":[
+                                                {
+                                                   "key":"CDSCreateResponseState",
+                                                   "value":{
+                                                      "stateKey":{
+                                                         "parentKeyName":"CDSCreateResponsePolicy",
+                                                         "parentKeyVersion":"0.0.1",
+                                                         "parentLocalName":"NULL",
+                                                         "localName":"CDSCreateResponseState"
+                                                      },
+                                                      "trigger":{
+                                                         "name":"CDSCreateResponseEvent",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "stateOutputs":{
+                                                         "entry":[
+                                                            {
+                                                               "key":"ResponseOutput",
+                                                               "value":{
+                                                                  "key":{
+                                                                     "parentKeyName":"CDSCreateResponsePolicy",
+                                                                     "parentKeyVersion":"0.0.1",
+                                                                     "parentLocalName":"CDSCreateResponseState",
+                                                                     "localName":"ResponseOutput"
+                                                                  },
+                                                                  "outgoingEvent":{
+                                                                     "name":"CDSResponseStatusEvent",
+                                                                     "version":"0.0.1"
+                                                                  },
+                                                                  "nextState":{
+                                                                     "parentKeyName":"NULL",
+                                                                     "parentKeyVersion":"0.0.0",
+                                                                     "parentLocalName":"NULL",
+                                                                     "localName":"NULL"
+                                                                  }
+                                                               }
+                                                            }
+                                                         ]
+                                                      },
+                                                      "contextAlbumReference":[
+                                                         
+                                                      ],
+                                                      "taskSelectionLogic":{
+                                                         "key":"NULL",
+                                                         "logicFlavour":"UNDEFINED",
+                                                         "logic":""
+                                                      },
+                                                      "stateFinalizerLogicMap":{
+                                                         "entry":[
+                                                            
+                                                         ]
+                                                      },
+                                                      "defaultTask":{
+                                                         "name":"CDSCreateResponseTask",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "taskReferences":{
+                                                         "entry":[
+                                                            {
+                                                               "key":{
+                                                                  "name":"CDSCreateResponseTask",
+                                                                  "version":"0.0.1"
+                                                               },
+                                                               "value":{
+                                                                  "key":{
+                                                                     "parentKeyName":"CDSCreateResponsePolicy",
+                                                                     "parentKeyVersion":"0.0.1",
+                                                                     "parentLocalName":"CDSCreateResponseState",
+                                                                     "localName":"CDSCreateResponsePolicy"
+                                                                  },
+                                                                  "outputType":"DIRECT",
+                                                                  "output":{
+                                                                     "parentKeyName":"CDSCreateResponsePolicy",
+                                                                     "parentKeyVersion":"0.0.1",
+                                                                     "parentLocalName":"CDSCreateResponseState",
+                                                                     "localName":"ResponseOutput"
+                                                                  }
+                                                               }
+                                                            }
+                                                         ]
+                                                      }
+                                                   }
+                                                }
+                                             ]
+                                          },
+                                          "firstState":"CDSCreateResponseState"
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"CDSDeleteResponsePolicy",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "policyKey":{
+                                             "name":"CDSDeleteResponsePolicy",
+                                             "version":"0.0.1"
+                                          },
+                                          "template":"Freestyle",
+                                          "state":{
+                                             "entry":[
+                                                {
+                                                   "key":"CDSDeleteResponseState",
+                                                   "value":{
+                                                      "stateKey":{
+                                                         "parentKeyName":"CDSDeleteResponsePolicy",
+                                                         "parentKeyVersion":"0.0.1",
+                                                         "parentLocalName":"NULL",
+                                                         "localName":"CDSDeleteResponseState"
+                                                      },
+                                                      "trigger":{
+                                                         "name":"CDSDeleteResponseEvent",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "stateOutputs":{
+                                                         "entry":[
+                                                            {
+                                                               "key":"ResponseOutput",
+                                                               "value":{
+                                                                  "key":{
+                                                                     "parentKeyName":"CDSDeleteResponsePolicy",
+                                                                     "parentKeyVersion":"0.0.1",
+                                                                     "parentLocalName":"CDSDeleteResponseState",
+                                                                     "localName":"ResponseOutput"
+                                                                  },
+                                                                  "outgoingEvent":{
+                                                                     "name":"CDSResponseStatusEvent",
+                                                                     "version":"0.0.1"
+                                                                  },
+                                                                  "nextState":{
+                                                                     "parentKeyName":"NULL",
+                                                                     "parentKeyVersion":"0.0.0",
+                                                                     "parentLocalName":"NULL",
+                                                                     "localName":"NULL"
+                                                                  }
+                                                               }
+                                                            }
+                                                         ]
+                                                      },
+                                                      "contextAlbumReference":[
+                                                         
+                                                      ],
+                                                      "taskSelectionLogic":{
+                                                         "key":"NULL",
+                                                         "logicFlavour":"UNDEFINED",
+                                                         "logic":""
+                                                      },
+                                                      "stateFinalizerLogicMap":{
+                                                         "entry":[
+                                                            
+                                                         ]
+                                                      },
+                                                      "defaultTask":{
+                                                         "name":"CDSDeleteResponseTask",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "taskReferences":{
+                                                         "entry":[
+                                                            {
+                                                               "key":{
+                                                                  "name":"CDSDeleteResponseTask",
+                                                                  "version":"0.0.1"
+                                                               },
+                                                               "value":{
+                                                                  "key":{
+                                                                     "parentKeyName":"CDSDeleteResponsePolicy",
+                                                                     "parentKeyVersion":"0.0.1",
+                                                                     "parentLocalName":"CDSDeleteResponseState",
+                                                                     "localName":"CDSDeleteResponsePolicy"
+                                                                  },
+                                                                  "outputType":"DIRECT",
+                                                                  "output":{
+                                                                     "parentKeyName":"CDSDeleteResponsePolicy",
+                                                                     "parentKeyVersion":"0.0.1",
+                                                                     "parentLocalName":"CDSDeleteResponseState",
+                                                                     "localName":"ResponseOutput"
+                                                                  }
+                                                               }
+                                                            }
+                                                         ]
+                                                      }
+                                                   }
+                                                }
+                                             ]
+                                          },
+                                          "firstState":"CDSDeleteResponseState"
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"ReceiveEventPolicy",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "policyKey":{
+                                             "name":"ReceiveEventPolicy",
+                                             "version":"0.0.1"
+                                          },
+                                          "template":"Freestyle",
+                                          "state":{
+                                             "entry":[
+                                                {
+                                                   "key":"CreateOrDeleteState",
+                                                   "value":{
+                                                      "stateKey":{
+                                                         "parentKeyName":"ReceiveEventPolicy",
+                                                         "parentKeyVersion":"0.0.1",
+                                                         "parentLocalName":"NULL",
+                                                         "localName":"CreateOrDeleteState"
+                                                      },
+                                                      "trigger":{
+                                                         "name":"PMSubscriptionOutputEvent",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "stateOutputs":{
+                                                         "entry":[
+                                                            {
+                                                               "key":"CreateSubscriptionPayload",
+                                                               "value":{
+                                                                  "key":{
+                                                                     "parentKeyName":"ReceiveEventPolicy",
+                                                                     "parentKeyVersion":"0.0.1",
+                                                                     "parentLocalName":"CreateOrDeleteState",
+                                                                     "localName":"CreateSubscriptionPayload"
+                                                                  },
+                                                                  "outgoingEvent":{
+                                                                     "name":"CreateSubscriptionPayloadEvent",
+                                                                     "version":"0.0.1"
+                                                                  },
+                                                                  "nextState":{
+                                                                     "parentKeyName":"ReceiveEventPolicy",
+                                                                     "parentKeyVersion":"0.0.1",
+                                                                     "parentLocalName":"NULL",
+                                                                     "localName":"CreateSubscription"
+                                                                  }
+                                                               }
+                                                            },
+                                                            {
+                                                               "key":"DeleteSubscriptionPayload",
+                                                               "value":{
+                                                                  "key":{
+                                                                     "parentKeyName":"ReceiveEventPolicy",
+                                                                     "parentKeyVersion":"0.0.1",
+                                                                     "parentLocalName":"CreateOrDeleteState",
+                                                                     "localName":"DeleteSubscriptionPayload"
+                                                                  },
+                                                                  "outgoingEvent":{
+                                                                     "name":"DeleteSubscriptionPayloadEvent",
+                                                                     "version":"0.0.1"
+                                                                  },
+                                                                  "nextState":{
+                                                                     "parentKeyName":"ReceiveEventPolicy",
+                                                                     "parentKeyVersion":"0.0.1",
+                                                                     "parentLocalName":"NULL",
+                                                                     "localName":"DeleteSubscription"
+                                                                  }
+                                                               }
+                                                            }
+                                                         ]
+                                                      },
+                                                      "contextAlbumReference":[
+                                                         {
+                                                            "name":"PMSubscriptionAlbum",
+                                                            "version":"0.0.1"
+                                                         }
+                                                      ],
+                                                      "taskSelectionLogic":{
+                                                         "key":"TaskSelectionLogic",
+                                                         "logicFlavour":"JAVASCRIPT",
+                                                         "logic":"/*\n * ============LICENSE_START=======================================================\n *  Copyright (C) 2020 Nordix. All rights reserved.\n * ================================================================================\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: Apache-2.0\n * ============LICENSE_END=========================================================\n */\n\nexecutor.logger.info(executor.subject.id);\n\nvar pmSubscriptionInfo = executor.getContextAlbum(\"PMSubscriptionAlbum\").get(executor.inFields.get(\"albumID\").toString())\nvar changeType = pmSubscriptionInfo.get(\"changeType\").toString()\n\nexecutor.logger.info(\"Change Type is \" + changeType)\n\nif (\"CREATE\".equals(changeType)) {\n    executor.logger.info(\"Choosing to create a subscription\")\n    executor.subject.getTaskKey(\"CreateSubscriptionPayloadTask\").copyTo(executor.selectedTask);\n}\nelse if (\"DELETE\".equals(changeType)) {\n    executor.logger.info(\"Choosing to delete a subscription\")\n    executor.subject.getTaskKey(\"DeleteSubscriptionPayloadTask\").copyTo(executor.selectedTask);\n}\n\n//var returnValue = executor.isTrue;\ntrue;"
+                                                      },
+                                                      "stateFinalizerLogicMap":{
+                                                         "entry":[
+                                                            
+                                                         ]
+                                                      },
+                                                      "defaultTask":{
+                                                         "name":"CreateSubscriptionPayloadTask",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "taskReferences":{
+                                                         "entry":[
+                                                            {
+                                                               "key":{
+                                                                  "name":"CreateSubscriptionPayloadTask",
+                                                                  "version":"0.0.1"
+                                                               },
+                                                               "value":{
+                                                                  "key":{
+                                                                     "parentKeyName":"ReceiveEventPolicy",
+                                                                     "parentKeyVersion":"0.0.1",
+                                                                     "parentLocalName":"CreateOrDeleteState",
+                                                                     "localName":"ReceiveEventPolicy"
+                                                                  },
+                                                                  "outputType":"DIRECT",
+                                                                  "output":{
+                                                                     "parentKeyName":"ReceiveEventPolicy",
+                                                                     "parentKeyVersion":"0.0.1",
+                                                                     "parentLocalName":"CreateOrDeleteState",
+                                                                     "localName":"CreateSubscriptionPayload"
+                                                                  }
+                                                               }
+                                                            },
+                                                            {
+                                                               "key":{
+                                                                  "name":"DeleteSubscriptionPayloadTask",
+                                                                  "version":"0.0.1"
+                                                               },
+                                                               "value":{
+                                                                  "key":{
+                                                                     "parentKeyName":"ReceiveEventPolicy",
+                                                                     "parentKeyVersion":"0.0.1",
+                                                                     "parentLocalName":"CreateOrDeleteState",
+                                                                     "localName":"ReceiveEventPolicy"
+                                                                  },
+                                                                  "outputType":"DIRECT",
+                                                                  "output":{
+                                                                     "parentKeyName":"ReceiveEventPolicy",
+                                                                     "parentKeyVersion":"0.0.1",
+                                                                     "parentLocalName":"CreateOrDeleteState",
+                                                                     "localName":"DeleteSubscriptionPayload"
+                                                                  }
+                                                               }
+                                                            }
+                                                         ]
+                                                      }
+                                                   }
+                                                },
+                                                {
+                                                   "key":"CreateSubscription",
+                                                   "value":{
+                                                      "stateKey":{
+                                                         "parentKeyName":"ReceiveEventPolicy",
+                                                         "parentKeyVersion":"0.0.1",
+                                                         "parentLocalName":"NULL",
+                                                         "localName":"CreateSubscription"
+                                                      },
+                                                      "trigger":{
+                                                         "name":"CreateSubscriptionPayloadEvent",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "stateOutputs":{
+                                                         "entry":[
+                                                            {
+                                                               "key":"IssueCreateSubscriptionRequestOutput",
+                                                               "value":{
+                                                                  "key":{
+                                                                     "parentKeyName":"ReceiveEventPolicy",
+                                                                     "parentKeyVersion":"0.0.1",
+                                                                     "parentLocalName":"CreateSubscription",
+                                                                     "localName":"IssueCreateSubscriptionRequestOutput"
+                                                                  },
+                                                                  "outgoingEvent":{
+                                                                     "name":"CDSCreateSubscriptionRequestEvent",
+                                                                     "version":"0.0.1"
+                                                                  },
+                                                                  "nextState":{
+                                                                     "parentKeyName":"NULL",
+                                                                     "parentKeyVersion":"0.0.0",
+                                                                     "parentLocalName":"NULL",
+                                                                     "localName":"NULL"
+                                                                  }
+                                                               }
+                                                            }
+                                                         ]
+                                                      },
+                                                      "contextAlbumReference":[
+                                                         {
+                                                            "name":"PMSubscriptionAlbum",
+                                                            "version":"0.0.1"
+                                                         }
+                                                      ],
+                                                      "taskSelectionLogic":{
+                                                         "key":"NULL",
+                                                         "logicFlavour":"UNDEFINED",
+                                                         "logic":""
+                                                      },
+                                                      "stateFinalizerLogicMap":{
+                                                         "entry":[
+                                                            
+                                                         ]
+                                                      },
+                                                      "defaultTask":{
+                                                         "name":"CreateSubscriptionRequestTask",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "taskReferences":{
+                                                         "entry":[
+                                                            {
+                                                               "key":{
+                                                                  "name":"CreateSubscriptionRequestTask",
+                                                                  "version":"0.0.1"
+                                                               },
+                                                               "value":{
+                                                                  "key":{
+                                                                     "parentKeyName":"ReceiveEventPolicy",
+                                                                     "parentKeyVersion":"0.0.1",
+                                                                     "parentLocalName":"CreateSubscription",
+                                                                     "localName":"ReceiveEventPolicy"
+                                                                  },
+                                                                  "outputType":"DIRECT",
+                                                                  "output":{
+                                                                     "parentKeyName":"ReceiveEventPolicy",
+                                                                     "parentKeyVersion":"0.0.1",
+                                                                     "parentLocalName":"CreateSubscription",
+                                                                     "localName":"IssueCreateSubscriptionRequestOutput"
+                                                                  }
+                                                               }
+                                                            }
+                                                         ]
+                                                      }
+                                                   }
+                                                },
+                                                {
+                                                   "key":"DeleteSubscription",
+                                                   "value":{
+                                                      "stateKey":{
+                                                         "parentKeyName":"ReceiveEventPolicy",
+                                                         "parentKeyVersion":"0.0.1",
+                                                         "parentLocalName":"NULL",
+                                                         "localName":"DeleteSubscription"
+                                                      },
+                                                      "trigger":{
+                                                         "name":"DeleteSubscriptionPayloadEvent",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "stateOutputs":{
+                                                         "entry":[
+                                                            {
+                                                               "key":"IssueDeleteSubscriptionRequestOutput",
+                                                               "value":{
+                                                                  "key":{
+                                                                     "parentKeyName":"ReceiveEventPolicy",
+                                                                     "parentKeyVersion":"0.0.1",
+                                                                     "parentLocalName":"DeleteSubscription",
+                                                                     "localName":"IssueDeleteSubscriptionRequestOutput"
+                                                                  },
+                                                                  "outgoingEvent":{
+                                                                     "name":"CDSDeleteSubscriptionRequestEvent",
+                                                                     "version":"0.0.1"
+                                                                  },
+                                                                  "nextState":{
+                                                                     "parentKeyName":"NULL",
+                                                                     "parentKeyVersion":"0.0.0",
+                                                                     "parentLocalName":"NULL",
+                                                                     "localName":"NULL"
+                                                                  }
+                                                               }
+                                                            }
+                                                         ]
+                                                      },
+                                                      "contextAlbumReference":[
+                                                         {
+                                                            "name":"PMSubscriptionAlbum",
+                                                            "version":"0.0.1"
+                                                         }
+                                                      ],
+                                                      "taskSelectionLogic":{
+                                                         "key":"NULL",
+                                                         "logicFlavour":"UNDEFINED",
+                                                         "logic":""
+                                                      },
+                                                      "stateFinalizerLogicMap":{
+                                                         "entry":[
+                                                            
+                                                         ]
+                                                      },
+                                                      "defaultTask":{
+                                                         "name":"DeleteSubscriptionRequestTask",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "taskReferences":{
+                                                         "entry":[
+                                                            {
+                                                               "key":{
+                                                                  "name":"DeleteSubscriptionRequestTask",
+                                                                  "version":"0.0.1"
+                                                               },
+                                                               "value":{
+                                                                  "key":{
+                                                                     "parentKeyName":"ReceiveEventPolicy",
+                                                                     "parentKeyVersion":"0.0.1",
+                                                                     "parentLocalName":"DeleteSubscription",
+                                                                     "localName":"ReceiveEventPolicy"
+                                                                  },
+                                                                  "outputType":"DIRECT",
+                                                                  "output":{
+                                                                     "parentKeyName":"ReceiveEventPolicy",
+                                                                     "parentKeyVersion":"0.0.1",
+                                                                     "parentLocalName":"DeleteSubscription",
+                                                                     "localName":"IssueDeleteSubscriptionRequestOutput"
+                                                                  }
+                                                               }
+                                                            }
+                                                         ]
+                                                      }
+                                                   }
+                                                },
+                                                {
+                                                   "key":"ReceiveSubscriptionState",
+                                                   "value":{
+                                                      "stateKey":{
+                                                         "parentKeyName":"ReceiveEventPolicy",
+                                                         "parentKeyVersion":"0.0.1",
+                                                         "parentLocalName":"NULL",
+                                                         "localName":"ReceiveSubscriptionState"
+                                                      },
+                                                      "trigger":{
+                                                         "name":"pmsh-operational-policy",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "stateOutputs":{
+                                                         "entry":[
+                                                            {
+                                                               "key":"ReceivePMSubscriptionOutput",
+                                                               "value":{
+                                                                  "key":{
+                                                                     "parentKeyName":"ReceiveEventPolicy",
+                                                                     "parentKeyVersion":"0.0.1",
+                                                                     "parentLocalName":"ReceiveSubscriptionState",
+                                                                     "localName":"ReceivePMSubscriptionOutput"
+                                                                  },
+                                                                  "outgoingEvent":{
+                                                                     "name":"PMSubscriptionOutputEvent",
+                                                                     "version":"0.0.1"
+                                                                  },
+                                                                  "nextState":{
+                                                                     "parentKeyName":"ReceiveEventPolicy",
+                                                                     "parentKeyVersion":"0.0.1",
+                                                                     "parentLocalName":"NULL",
+                                                                     "localName":"CreateOrDeleteState"
+                                                                  }
+                                                               }
+                                                            }
+                                                         ]
+                                                      },
+                                                      "contextAlbumReference":[
+                                                         {
+                                                            "name":"PMSubscriptionAlbum",
+                                                            "version":"0.0.1"
+                                                         }
+                                                      ],
+                                                      "taskSelectionLogic":{
+                                                         "key":"NULL",
+                                                         "logicFlavour":"UNDEFINED",
+                                                         "logic":""
+                                                      },
+                                                      "stateFinalizerLogicMap":{
+                                                         "entry":[
+                                                            
+                                                         ]
+                                                      },
+                                                      "defaultTask":{
+                                                         "name":"ReceiveSubscriptionTask",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "taskReferences":{
+                                                         "entry":[
+                                                            {
+                                                               "key":{
+                                                                  "name":"ReceiveSubscriptionTask",
+                                                                  "version":"0.0.1"
+                                                               },
+                                                               "value":{
+                                                                  "key":{
+                                                                     "parentKeyName":"ReceiveEventPolicy",
+                                                                     "parentKeyVersion":"0.0.1",
+                                                                     "parentLocalName":"ReceiveSubscriptionState",
+                                                                     "localName":"ReceiveEventPolicy"
+                                                                  },
+                                                                  "outputType":"DIRECT",
+                                                                  "output":{
+                                                                     "parentKeyName":"ReceiveEventPolicy",
+                                                                     "parentKeyVersion":"0.0.1",
+                                                                     "parentLocalName":"ReceiveSubscriptionState",
+                                                                     "localName":"ReceivePMSubscriptionOutput"
+                                                                  }
+                                                               }
+                                                            }
+                                                         ]
+                                                      }
+                                                   }
+                                                }
+                                             ]
+                                          },
+                                          "firstState":"ReceiveSubscriptionState"
+                                       }
+                                    }
+                                 ]
+                              }
+                           },
+                           "tasks":{
+                              "key":{
+                                 "name":"PMControlPolicy_Tasks",
+                                 "version":"0.0.1"
+                              },
+                              "taskMap":{
+                                 "entry":[
+                                    {
+                                       "key":{
+                                          "name":"CDSCreateResponseTask",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"CDSCreateResponseTask",
+                                             "version":"0.0.1"
+                                          },
+                                          "inputFields":{
+                                             "entry":[
+                                                {
+                                                   "key":"actionIdentifiers",
+                                                   "value":{
+                                                      "key":"actionIdentifiers",
+                                                      "fieldSchemaKey":{
+                                                         "name":"CDSActionIdentifiersType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                },
+                                                {
+                                                   "key":"commonHeader",
+                                                   "value":{
+                                                      "key":"commonHeader",
+                                                      "fieldSchemaKey":{
+                                                         "name":"CDSResponseCommonHeaderType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                },
+                                                {
+                                                   "key":"payload",
+                                                   "value":{
+                                                      "key":"payload",
+                                                      "fieldSchemaKey":{
+                                                         "name":"CDSCreateResponsePayloadType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                },
+                                                {
+                                                   "key":"status",
+                                                   "value":{
+                                                      "key":"status",
+                                                      "fieldSchemaKey":{
+                                                         "name":"CDSResponseStatusType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                }
+                                             ]
+                                          },
+                                          "outputFields":{
+                                             "entry":[
+                                                {
+                                                   "key":"status",
+                                                   "value":{
+                                                      "key":"status",
+                                                      "fieldSchemaKey":{
+                                                         "name":"SubscriptionStatusType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                }
+                                             ]
+                                          },
+                                          "taskParameters":{
+                                             "entry":[
+                                                
+                                             ]
+                                          },
+                                          "contextAlbumReference":[
+                                             {
+                                                "name":"PMSubscriptionAlbum",
+                                                "version":"0.0.1"
+                                             }
+                                          ],
+                                          "taskLogic":{
+                                             "key":"TaskLogic",
+                                             "logicFlavour":"JAVASCRIPT",
+                                             "logic":"/*\n * ============LICENSE_START=======================================================\n *  Copyright (C) 2020 Nordix. All rights reserved.\n * ================================================================================\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: Apache-2.0\n * ============LICENSE_END=========================================================\n */\n\nexecutor.logger.info(executor.subject.id);\n\nvar commonHeader = executor.inFields.get(\"commonHeader\")\nvar response = executor.inFields.get(\"payload\")\nvar albumID = commonHeader.get(\"requestId\")\n\nvar pmSubscriptionInfo = executor.getContextAlbum(\"PMSubscriptionAlbum\").get(albumID.toString());\nvar responseStatus = executor.subject.getOutFieldSchemaHelper(\"status\").createNewInstance();\n\nresponseStatus.put(\"subscriptionName\", pmSubscriptionInfo.get(\"subscription\").get(\"subscriptionName\"))\nresponseStatus.put(\"nfName\", pmSubscriptionInfo.get(\"nfName\"))\nresponseStatus.put(\"changeType\", pmSubscriptionInfo.get(\"changeType\"))\n\nvar status = response.get(pmSubscriptionInfo.get(\"changeType\").toLowerCase() + \"_DasH_subscription_DasH_response\").get(\"odl_DasH_response\").get(\"status\")\n\nexecutor.logger.info(\"RESPONSE STATUS = \" + status)\n\nif(status == \"success\") {\n    responseStatus.put(\"message\", \"success\")\n} else {\n    responseStatus.put(\"message\", \"failed\")\n}\n\nexecutor.outFields.put(\"status\", responseStatus)\n\n//var returnValue = executor.isTrue;\ntrue;"
+                                          }
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"CDSDeleteResponseTask",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"CDSDeleteResponseTask",
+                                             "version":"0.0.1"
+                                          },
+                                          "inputFields":{
+                                             "entry":[
+                                                {
+                                                   "key":"actionIdentifiers",
+                                                   "value":{
+                                                      "key":"actionIdentifiers",
+                                                      "fieldSchemaKey":{
+                                                         "name":"CDSActionIdentifiersType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                },
+                                                {
+                                                   "key":"commonHeader",
+                                                   "value":{
+                                                      "key":"commonHeader",
+                                                      "fieldSchemaKey":{
+                                                         "name":"CDSResponseCommonHeaderType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                },
+                                                {
+                                                   "key":"payload",
+                                                   "value":{
+                                                      "key":"payload",
+                                                      "fieldSchemaKey":{
+                                                         "name":"CDSDeleteResponsePayloadType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                },
+                                                {
+                                                   "key":"status",
+                                                   "value":{
+                                                      "key":"status",
+                                                      "fieldSchemaKey":{
+                                                         "name":"CDSResponseStatusType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                }
+                                             ]
+                                          },
+                                          "outputFields":{
+                                             "entry":[
+                                                {
+                                                   "key":"status",
+                                                   "value":{
+                                                      "key":"status",
+                                                      "fieldSchemaKey":{
+                                                         "name":"SubscriptionStatusType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                }
+                                             ]
+                                          },
+                                          "taskParameters":{
+                                             "entry":[
+                                                
+                                             ]
+                                          },
+                                          "contextAlbumReference":[
+                                             {
+                                                "name":"PMSubscriptionAlbum",
+                                                "version":"0.0.1"
+                                             }
+                                          ],
+                                          "taskLogic":{
+                                             "key":"TaskLogic",
+                                             "logicFlavour":"JAVASCRIPT",
+                                             "logic":"/*\n * ============LICENSE_START=======================================================\n *  Copyright (C) 2020 Nordix. All rights reserved.\n * ================================================================================\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: Apache-2.0\n * ============LICENSE_END=========================================================\n */\n\nexecutor.logger.info(executor.subject.id);\n\nvar commonHeader = executor.inFields.get(\"commonHeader\")\nvar response = executor.inFields.get(\"payload\")\nvar albumID = commonHeader.get(\"requestId\")\n\nvar pmSubscriptionInfo = executor.getContextAlbum(\"PMSubscriptionAlbum\").get(albumID.toString());\nvar responseStatus = executor.subject.getOutFieldSchemaHelper(\"status\").createNewInstance();\n\nresponseStatus.put(\"subscriptionName\", pmSubscriptionInfo.get(\"subscription\").get(\"subscriptionName\"))\nresponseStatus.put(\"nfName\", pmSubscriptionInfo.get(\"nfName\"))\nresponseStatus.put(\"changeType\", pmSubscriptionInfo.get(\"changeType\"))\n\nvar status = response.get(pmSubscriptionInfo.get(\"changeType\").toLowerCase() + \"_DasH_subscription_DasH_response\").get(\"odl_DasH_response\").get(\"status\")\n\nexecutor.logger.info(\"RESPONSE STATUS = \" + status)\n\nif(status == \"success\") {\n    responseStatus.put(\"message\", \"success\")\n} else {\n    responseStatus.put(\"message\", \"failed\")\n}\n\nexecutor.outFields.put(\"status\", responseStatus)\n\n//var returnValue = executor.isTrue;\ntrue;"
+                                          }
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"CreateSubscriptionPayloadTask",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"CreateSubscriptionPayloadTask",
+                                             "version":"0.0.1"
+                                          },
+                                          "inputFields":{
+                                             "entry":[
+                                                {
+                                                   "key":"albumID",
+                                                   "value":{
+                                                      "key":"albumID",
+                                                      "fieldSchemaKey":{
+                                                         "name":"UUIDType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                }
+                                             ]
+                                          },
+                                          "outputFields":{
+                                             "entry":[
+                                                {
+                                                   "key":"albumID",
+                                                   "value":{
+                                                      "key":"albumID",
+                                                      "fieldSchemaKey":{
+                                                         "name":"UUIDType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                },
+                                                {
+                                                   "key":"payload",
+                                                   "value":{
+                                                      "key":"payload",
+                                                      "fieldSchemaKey":{
+                                                         "name":"CDSCreateSubscriptionPayloadType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                }
+                                             ]
+                                          },
+                                          "taskParameters":{
+                                             "entry":[
+                                                
+                                             ]
+                                          },
+                                          "contextAlbumReference":[
+                                             {
+                                                "name":"PMSubscriptionAlbum",
+                                                "version":"0.0.1"
+                                             }
+                                          ],
+                                          "taskLogic":{
+                                             "key":"TaskLogic",
+                                             "logicFlavour":"JAVASCRIPT",
+                                             "logic":"/*\n * ============LICENSE_START=======================================================\n *  Copyright (C) 2020 Nordix. All rights reserved.\n * ================================================================================\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: Apache-2.0\n * ============LICENSE_END=========================================================\n */\n\nexecutor.logger.info(executor.subject.id);\n\nvar pmSubscriptionInfo = executor.getContextAlbum(\"PMSubscriptionAlbum\").get(executor.inFields.get(\"albumID\").toString())\n\nvar changeType = pmSubscriptionInfo.get(\"changeType\").toLowerCase()\n\nvar payloadProperties = executor.subject.getOutFieldSchemaHelper(\"payload\").createNewSubInstance(changeType + \"_DasH_subscription_DasH_properties_record\");\n\npayloadProperties.put(\"nfName\",  pmSubscriptionInfo.get(\"nfName\"))\npayloadProperties.put(\"subscriptionName\",  pmSubscriptionInfo.get(\"subscription\").get(\"subscriptionName\"))\npayloadProperties.put(\"administrativeState\", pmSubscriptionInfo.get(\"subscription\").get(\"administrativeState\"))\npayloadProperties.put(\"fileBasedGP\",  pmSubscriptionInfo.get(\"subscription\").get(\"fileBasedGP\").toString())\npayloadProperties.put(\"fileLocation\", pmSubscriptionInfo.get(\"subscription\").get(\"fileLocation\"))\npayloadProperties.put(\"measurementGroups\", pmSubscriptionInfo.get(\"subscription\").get(\"measurementGroups\"))\n\nvar payloadEntry = executor.subject.getOutFieldSchemaHelper(\"payload\").createNewSubInstance(\"CDSRequestPayloadEntry\");\npayloadEntry.put(changeType + \"_DasH_subscription_DasH_properties\", payloadProperties)\n\nvar payload = executor.subject.getOutFieldSchemaHelper(\"payload\").createNewInstance();\npayload.put(changeType + \"_DasH_subscription_DasH_request\", payloadEntry);\n\nexecutor.outFields.put(\"albumID\", executor.inFields.get(\"albumID\"))\nexecutor.outFields.put(\"payload\", payload);\n\n//var returnValue = executor.isTrue;\ntrue;"
+                                          }
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"CreateSubscriptionRequestTask",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"CreateSubscriptionRequestTask",
+                                             "version":"0.0.1"
+                                          },
+                                          "inputFields":{
+                                             "entry":[
+                                                {
+                                                   "key":"albumID",
+                                                   "value":{
+                                                      "key":"albumID",
+                                                      "fieldSchemaKey":{
+                                                         "name":"UUIDType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                },
+                                                {
+                                                   "key":"payload",
+                                                   "value":{
+                                                      "key":"payload",
+                                                      "fieldSchemaKey":{
+                                                         "name":"CDSCreateSubscriptionPayloadType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                }
+                                             ]
+                                          },
+                                          "outputFields":{
+                                             "entry":[
+                                                {
+                                                   "key":"actionIdentifiers",
+                                                   "value":{
+                                                      "key":"actionIdentifiers",
+                                                      "fieldSchemaKey":{
+                                                         "name":"CDSActionIdentifiersType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                },
+                                                {
+                                                   "key":"commonHeader",
+                                                   "value":{
+                                                      "key":"commonHeader",
+                                                      "fieldSchemaKey":{
+                                                         "name":"CDSRequestCommonHeaderType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                },
+                                                {
+                                                   "key":"payload",
+                                                   "value":{
+                                                      "key":"payload",
+                                                      "fieldSchemaKey":{
+                                                         "name":"CDSCreateSubscriptionPayloadType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                }
+                                             ]
+                                          },
+                                          "taskParameters":{
+                                             "entry":[
+                                                
+                                             ]
+                                          },
+                                          "contextAlbumReference":[
+                                             {
+                                                "name":"PMSubscriptionAlbum",
+                                                "version":"0.0.1"
+                                             }
+                                          ],
+                                          "taskLogic":{
+                                             "key":"TaskLogic",
+                                             "logicFlavour":"JAVASCRIPT",
+                                             "logic":"/*\n * ============LICENSE_START=======================================================\n *  Copyright (C) 2020 Nordix. All rights reserved.\n * ================================================================================\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: Apache-2.0\n * ============LICENSE_END=========================================================\n */\n\nexecutor.logger.info(executor.subject.id);\n\nvar pmSubscriptionInfo = executor.getContextAlbum(\"PMSubscriptionAlbum\").get(executor.inFields.get(\"albumID\").toString())\n\nvar changeType = pmSubscriptionInfo.get(\"changeType\").toLowerCase()\nvar blueprintName = pmSubscriptionInfo.get(\"blueprintName\").toLowerCase()\nvar blueprintVersion = pmSubscriptionInfo.get(\"blueprintVersion\").toLowerCase()\nvar payload = executor.inFields.get(\"payload\")\nvar actionName = changeType + \"-subscription\"\n\nvar commonHeader = executor.subject.getOutFieldSchemaHelper(\"commonHeader\").createNewInstance();\ncommonHeader.put(\"originatorId\", \"sdnc\");\ncommonHeader.put(\"requestId\", executor.inFields.get(\"albumID\").toString());\ncommonHeader.put(\"subRequestId\", \"sub-123456-1000\");\n\nvar actionIdentifiers = executor.subject.getOutFieldSchemaHelper(\"actionIdentifiers\").createNewInstance();\nactionIdentifiers.put(\"actionName\", actionName);\nactionIdentifiers.put(\"blueprintName\", blueprintName);\nactionIdentifiers.put(\"blueprintVersion\", blueprintVersion);\nactionIdentifiers.put(\"mode\", \"sync\");\n\nexecutor.outFields.put(\"commonHeader\", commonHeader);\nexecutor.outFields.put(\"actionIdentifiers\", actionIdentifiers);\nexecutor.outFields.put(\"payload\", payload);\n\n//var returnValue = executor.isTrue;\ntrue;"
+                                          }
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"DeleteSubscriptionPayloadTask",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"DeleteSubscriptionPayloadTask",
+                                             "version":"0.0.1"
+                                          },
+                                          "inputFields":{
+                                             "entry":[
+                                                {
+                                                   "key":"albumID",
+                                                   "value":{
+                                                      "key":"albumID",
+                                                      "fieldSchemaKey":{
+                                                         "name":"UUIDType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                }
+                                             ]
+                                          },
+                                          "outputFields":{
+                                             "entry":[
+                                                {
+                                                   "key":"albumID",
+                                                   "value":{
+                                                      "key":"albumID",
+                                                      "fieldSchemaKey":{
+                                                         "name":"UUIDType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                },
+                                                {
+                                                   "key":"payload",
+                                                   "value":{
+                                                      "key":"payload",
+                                                      "fieldSchemaKey":{
+                                                         "name":"CDSDeleteSubscriptionPayloadType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                }
+                                             ]
+                                          },
+                                          "taskParameters":{
+                                             "entry":[
+                                                
+                                             ]
+                                          },
+                                          "contextAlbumReference":[
+                                             {
+                                                "name":"PMSubscriptionAlbum",
+                                                "version":"0.0.1"
+                                             }
+                                          ],
+                                          "taskLogic":{
+                                             "key":"TaskLogic",
+                                             "logicFlavour":"JAVASCRIPT",
+                                             "logic":"/*\n * ============LICENSE_START=======================================================\n *  Copyright (C) 2020 Nordix. All rights reserved.\n * ================================================================================\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: Apache-2.0\n * ============LICENSE_END=========================================================\n */\n\nexecutor.logger.info(executor.subject.id);\n\nvar pmSubscriptionInfo = executor.getContextAlbum(\"PMSubscriptionAlbum\").get(executor.inFields.get(\"albumID\").toString())\n\nvar changeType = pmSubscriptionInfo.get(\"changeType\").toLowerCase()\n\nvar payloadProperties = executor.subject.getOutFieldSchemaHelper(\"payload\").createNewSubInstance(changeType + \"_DasH_subscription_DasH_properties_record\");\n\npayloadProperties.put(\"nfName\",  pmSubscriptionInfo.get(\"nfName\"))\npayloadProperties.put(\"subscriptionName\",  pmSubscriptionInfo.get(\"subscription\").get(\"subscriptionName\"))\npayloadProperties.put(\"administrativeState\", pmSubscriptionInfo.get(\"subscription\").get(\"administrativeState\"))\npayloadProperties.put(\"fileBasedGP\",  pmSubscriptionInfo.get(\"subscription\").get(\"fileBasedGP\").toString())\npayloadProperties.put(\"fileLocation\", pmSubscriptionInfo.get(\"subscription\").get(\"fileLocation\"))\npayloadProperties.put(\"measurementGroups\", pmSubscriptionInfo.get(\"subscription\").get(\"measurementGroups\"))\n\nvar payloadEntry = executor.subject.getOutFieldSchemaHelper(\"payload\").createNewSubInstance(\"CDSRequestPayloadEntry\");\npayloadEntry.put(changeType + \"_DasH_subscription_DasH_properties\", payloadProperties)\n\nvar payload = executor.subject.getOutFieldSchemaHelper(\"payload\").createNewInstance();\npayload.put(changeType + \"_DasH_subscription_DasH_request\", payloadEntry);\n\nexecutor.outFields.put(\"albumID\", executor.inFields.get(\"albumID\"))\nexecutor.outFields.put(\"payload\", payload);\n\n//var returnValue = executor.isTrue;\ntrue;"
+                                          }
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"DeleteSubscriptionRequestTask",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"DeleteSubscriptionRequestTask",
+                                             "version":"0.0.1"
+                                          },
+                                          "inputFields":{
+                                             "entry":[
+                                                {
+                                                   "key":"albumID",
+                                                   "value":{
+                                                      "key":"albumID",
+                                                      "fieldSchemaKey":{
+                                                         "name":"UUIDType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                },
+                                                {
+                                                   "key":"payload",
+                                                   "value":{
+                                                      "key":"payload",
+                                                      "fieldSchemaKey":{
+                                                         "name":"CDSDeleteSubscriptionPayloadType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                }
+                                             ]
+                                          },
+                                          "outputFields":{
+                                             "entry":[
+                                                {
+                                                   "key":"actionIdentifiers",
+                                                   "value":{
+                                                      "key":"actionIdentifiers",
+                                                      "fieldSchemaKey":{
+                                                         "name":"CDSActionIdentifiersType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                },
+                                                {
+                                                   "key":"commonHeader",
+                                                   "value":{
+                                                      "key":"commonHeader",
+                                                      "fieldSchemaKey":{
+                                                         "name":"CDSRequestCommonHeaderType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                },
+                                                {
+                                                   "key":"payload",
+                                                   "value":{
+                                                      "key":"payload",
+                                                      "fieldSchemaKey":{
+                                                         "name":"CDSDeleteSubscriptionPayloadType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                }
+                                             ]
+                                          },
+                                          "taskParameters":{
+                                             "entry":[
+                                                
+                                             ]
+                                          },
+                                          "contextAlbumReference":[
+                                             {
+                                                "name":"PMSubscriptionAlbum",
+                                                "version":"0.0.1"
+                                             }
+                                          ],
+                                          "taskLogic":{
+                                             "key":"TaskLogic",
+                                             "logicFlavour":"JAVASCRIPT",
+                                             "logic":"/*\n * ============LICENSE_START=======================================================\n *  Copyright (C) 2020 Nordix. All rights reserved.\n * ================================================================================\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: Apache-2.0\n * ============LICENSE_END=========================================================\n */\n\nexecutor.logger.info(executor.subject.id);\n\nvar pmSubscriptionInfo = executor.getContextAlbum(\"PMSubscriptionAlbum\").get(executor.inFields.get(\"albumID\").toString())\n\nvar changeType = pmSubscriptionInfo.get(\"changeType\").toLowerCase()\nvar blueprintName = pmSubscriptionInfo.get(\"blueprintName\").toLowerCase()\nvar blueprintVersion = pmSubscriptionInfo.get(\"blueprintVersion\").toLowerCase()\nvar payload = executor.inFields.get(\"payload\")\nvar actionName = changeType + \"-subscription\"\n\nvar commonHeader = executor.subject.getOutFieldSchemaHelper(\"commonHeader\").createNewInstance();\ncommonHeader.put(\"originatorId\", \"sdnc\");\ncommonHeader.put(\"requestId\", executor.inFields.get(\"albumID\").toString());\ncommonHeader.put(\"subRequestId\", \"sub-123456-1000\");\n\nvar actionIdentifiers = executor.subject.getOutFieldSchemaHelper(\"actionIdentifiers\").createNewInstance();\nactionIdentifiers.put(\"actionName\", actionName);\nactionIdentifiers.put(\"blueprintName\", blueprintName);\nactionIdentifiers.put(\"blueprintVersion\", blueprintVersion);\nactionIdentifiers.put(\"mode\", \"sync\");\n\nexecutor.outFields.put(\"commonHeader\", commonHeader);\nexecutor.outFields.put(\"actionIdentifiers\", actionIdentifiers);\nexecutor.outFields.put(\"payload\", payload);\n\n//var returnValue = executor.isTrue;\ntrue;"
+                                          }
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"ReceiveSubscriptionTask",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"ReceiveSubscriptionTask",
+                                             "version":"0.0.1"
+                                          },
+                                          "inputFields":{
+                                             "entry":[
+                                                {
+                                                   "key":"blueprintName",
+                                                   "value":{
+                                                      "key":"blueprintName",
+                                                      "fieldSchemaKey":{
+                                                         "name":"SimpleStringType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                },
+                                                {
+                                                   "key":"blueprintVersion",
+                                                   "value":{
+                                                      "key":"blueprintVersion",
+                                                      "fieldSchemaKey":{
+                                                         "name":"SimpleStringType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                },
+                                                {
+                                                   "key":"changeType",
+                                                   "value":{
+                                                      "key":"changeType",
+                                                      "fieldSchemaKey":{
+                                                         "name":"SimpleStringType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                },
+                                                {
+                                                   "key":"closedLoopControlName",
+                                                   "value":{
+                                                      "key":"closedLoopControlName",
+                                                      "fieldSchemaKey":{
+                                                         "name":"SimpleStringType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                },
+                                                {
+                                                   "key":"nfName",
+                                                   "value":{
+                                                      "key":"nfName",
+                                                      "fieldSchemaKey":{
+                                                         "name":"SimpleStringType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                },
+                                                {
+                                                   "key":"policyName",
+                                                   "value":{
+                                                      "key":"policyName",
+                                                      "fieldSchemaKey":{
+                                                         "name":"SimpleStringType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                },
+                                                {
+                                                   "key":"subscription",
+                                                   "value":{
+                                                      "key":"subscription",
+                                                      "fieldSchemaKey":{
+                                                         "name":"SubscriptionType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                }
+                                             ]
+                                          },
+                                          "outputFields":{
+                                             "entry":[
+                                                {
+                                                   "key":"albumID",
+                                                   "value":{
+                                                      "key":"albumID",
+                                                      "fieldSchemaKey":{
+                                                         "name":"UUIDType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                }
+                                             ]
+                                          },
+                                          "taskParameters":{
+                                             "entry":[
+                                                
+                                             ]
+                                          },
+                                          "contextAlbumReference":[
+                                             {
+                                                "name":"PMSubscriptionAlbum",
+                                                "version":"0.0.1"
+                                             }
+                                          ],
+                                          "taskLogic":{
+                                             "key":"TaskLogic",
+                                             "logicFlavour":"JAVASCRIPT",
+                                             "logic":"/*\n * ============LICENSE_START=======================================================\n *  Copyright (C) 2020 Nordix. All rights reserved.\n * ================================================================================\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: Apache-2.0\n * ============LICENSE_END=========================================================\n */\nvar uuidType = java.util.UUID;\n\nexecutor.logger.info(executor.subject.id);\n\n//albumID will be used to fetch info from our album later\nvar albumID = uuidType.randomUUID();\nvar pmSubscriptionInfo = executor.getContextAlbum(\"PMSubscriptionAlbum\").getSchemaHelper().createNewInstance();\nvar returnValue = true;\n\nif(executor.inFields.get(\"policyName\") != null) {\n    executor.logger.info(\"nfName in receive sub event \" + executor.inFields.get(\"nfName\"));\n\n    var changeType = executor.inFields.get(\"changeType\")\n    var nfName = executor.inFields.get(\"nfName\")\n    var policyName = executor.inFields.get(\"policyName\")\n    var closedLoopControlName = executor.inFields.get(\"closedLoopControlName\")\n    var subscription = executor.inFields.get(\"subscription\")\n    var blueprintName = executor.inFields.get(\"blueprintName\")\n    var blueprintVersion = executor.inFields.get(\"blueprintVersion\")\n\n    pmSubscriptionInfo.put(\"nfName\", executor.inFields.get(\"nfName\"));\n    pmSubscriptionInfo.put(\"changeType\", executor.inFields.get(\"changeType\"))\n    pmSubscriptionInfo.put(\"policyName\", executor.inFields.get(\"policyName\"))\n    pmSubscriptionInfo.put(\"closedLoopControlName\", executor.inFields.get(\"closedLoopControlName\"))\n    pmSubscriptionInfo.put(\"subscription\", subscription)\n    pmSubscriptionInfo.put(\"blueprintName\", blueprintName)\n    pmSubscriptionInfo.put(\"blueprintVersion\", blueprintVersion)\n\n\n    executor.getContextAlbum(\"PMSubscriptionAlbum\").put(albumID.toString(), pmSubscriptionInfo);\n\n    executor.outFields.put(\"albumID\", albumID)\n} else {\n    executor.message = \"Received invalid event\"\n    returnValue = false;\n}\n\nreturnValue;"
+                                          }
+                                       }
+                                    }
+                                 ]
+                              }
+                           },
+                           "events":{
+                              "key":{
+                                 "name":"PMControlPolicy_Events",
+                                 "version":"0.0.1"
+                              },
+                              "eventMap":{
+                                 "entry":[
+                                    {
+                                       "key":{
+                                          "name":"CDSCreateResponseEvent",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"CDSCreateResponseEvent",
+                                             "version":"0.0.1"
+                                          },
+                                          "nameSpace":"org.onap.policy.apex.onap.pmcontrol",
+                                          "source":"CDS",
+                                          "target":"APEX",
+                                          "parameter":{
+                                             "entry":[
+                                                {
+                                                   "key":"actionIdentifiers",
+                                                   "value":{
+                                                      "key":"actionIdentifiers",
+                                                      "fieldSchemaKey":{
+                                                         "name":"CDSActionIdentifiersType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                },
+                                                {
+                                                   "key":"commonHeader",
+                                                   "value":{
+                                                      "key":"commonHeader",
+                                                      "fieldSchemaKey":{
+                                                         "name":"CDSResponseCommonHeaderType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                },
+                                                {
+                                                   "key":"payload",
+                                                   "value":{
+                                                      "key":"payload",
+                                                      "fieldSchemaKey":{
+                                                         "name":"CDSCreateResponsePayloadType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                },
+                                                {
+                                                   "key":"status",
+                                                   "value":{
+                                                      "key":"status",
+                                                      "fieldSchemaKey":{
+                                                         "name":"CDSResponseStatusType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                }
+                                             ]
+                                          }
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"CDSCreateSubscriptionRequestEvent",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"CDSCreateSubscriptionRequestEvent",
+                                             "version":"0.0.1"
+                                          },
+                                          "nameSpace":"org.onap.policy.apex.onap.pmcontrol",
+                                          "source":"APEX",
+                                          "target":"APEX",
+                                          "parameter":{
+                                             "entry":[
+                                                {
+                                                   "key":"actionIdentifiers",
+                                                   "value":{
+                                                      "key":"actionIdentifiers",
+                                                      "fieldSchemaKey":{
+                                                         "name":"CDSActionIdentifiersType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                },
+                                                {
+                                                   "key":"commonHeader",
+                                                   "value":{
+                                                      "key":"commonHeader",
+                                                      "fieldSchemaKey":{
+                                                         "name":"CDSRequestCommonHeaderType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                },
+                                                {
+                                                   "key":"payload",
+                                                   "value":{
+                                                      "key":"payload",
+                                                      "fieldSchemaKey":{
+                                                         "name":"CDSCreateSubscriptionPayloadType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                }
+                                             ]
+                                          }
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"CDSDeleteResponseEvent",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"CDSDeleteResponseEvent",
+                                             "version":"0.0.1"
+                                          },
+                                          "nameSpace":"org.onap.policy.apex.onap.pmcontrol",
+                                          "source":"CDS",
+                                          "target":"APEX",
+                                          "parameter":{
+                                             "entry":[
+                                                {
+                                                   "key":"actionIdentifiers",
+                                                   "value":{
+                                                      "key":"actionIdentifiers",
+                                                      "fieldSchemaKey":{
+                                                         "name":"CDSActionIdentifiersType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                },
+                                                {
+                                                   "key":"commonHeader",
+                                                   "value":{
+                                                      "key":"commonHeader",
+                                                      "fieldSchemaKey":{
+                                                         "name":"CDSResponseCommonHeaderType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                },
+                                                {
+                                                   "key":"payload",
+                                                   "value":{
+                                                      "key":"payload",
+                                                      "fieldSchemaKey":{
+                                                         "name":"CDSDeleteResponsePayloadType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                },
+                                                {
+                                                   "key":"status",
+                                                   "value":{
+                                                      "key":"status",
+                                                      "fieldSchemaKey":{
+                                                         "name":"CDSResponseStatusType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                }
+                                             ]
+                                          }
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"CDSDeleteSubscriptionRequestEvent",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"CDSDeleteSubscriptionRequestEvent",
+                                             "version":"0.0.1"
+                                          },
+                                          "nameSpace":"org.onap.policy.apex.onap.pmcontrol",
+                                          "source":"APEX",
+                                          "target":"APEX",
+                                          "parameter":{
+                                             "entry":[
+                                                {
+                                                   "key":"actionIdentifiers",
+                                                   "value":{
+                                                      "key":"actionIdentifiers",
+                                                      "fieldSchemaKey":{
+                                                         "name":"CDSActionIdentifiersType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                },
+                                                {
+                                                   "key":"commonHeader",
+                                                   "value":{
+                                                      "key":"commonHeader",
+                                                      "fieldSchemaKey":{
+                                                         "name":"CDSRequestCommonHeaderType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                },
+                                                {
+                                                   "key":"payload",
+                                                   "value":{
+                                                      "key":"payload",
+                                                      "fieldSchemaKey":{
+                                                         "name":"CDSDeleteSubscriptionPayloadType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                }
+                                             ]
+                                          }
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"CDSResponseStatusEvent",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"CDSResponseStatusEvent",
+                                             "version":"0.0.1"
+                                          },
+                                          "nameSpace":"org.onap.policy.apex.onap.pmcontrol",
+                                          "source":"APEX",
+                                          "target":"DCAE",
+                                          "parameter":{
+                                             "entry":[
+                                                {
+                                                   "key":"status",
+                                                   "value":{
+                                                      "key":"status",
+                                                      "fieldSchemaKey":{
+                                                         "name":"SubscriptionStatusType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                }
+                                             ]
+                                          }
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"CreateSubscriptionPayloadEvent",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"CreateSubscriptionPayloadEvent",
+                                             "version":"0.0.1"
+                                          },
+                                          "nameSpace":"org.onap.policy.apex.onap.pmcontrol",
+                                          "source":"APEX",
+                                          "target":"APEX",
+                                          "parameter":{
+                                             "entry":[
+                                                {
+                                                   "key":"albumID",
+                                                   "value":{
+                                                      "key":"albumID",
+                                                      "fieldSchemaKey":{
+                                                         "name":"UUIDType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                },
+                                                {
+                                                   "key":"payload",
+                                                   "value":{
+                                                      "key":"payload",
+                                                      "fieldSchemaKey":{
+                                                         "name":"CDSCreateSubscriptionPayloadType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                }
+                                             ]
+                                          }
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"DeleteSubscriptionPayloadEvent",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"DeleteSubscriptionPayloadEvent",
+                                             "version":"0.0.1"
+                                          },
+                                          "nameSpace":"org.onap.policy.apex.onap.pmcontrol",
+                                          "source":"APEX",
+                                          "target":"APEX",
+                                          "parameter":{
+                                             "entry":[
+                                                {
+                                                   "key":"albumID",
+                                                   "value":{
+                                                      "key":"albumID",
+                                                      "fieldSchemaKey":{
+                                                         "name":"UUIDType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                },
+                                                {
+                                                   "key":"payload",
+                                                   "value":{
+                                                      "key":"payload",
+                                                      "fieldSchemaKey":{
+                                                         "name":"CDSDeleteSubscriptionPayloadType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                }
+                                             ]
+                                          }
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"MRResponseEvent",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"MRResponseEvent",
+                                             "version":"0.0.1"
+                                          },
+                                          "nameSpace":"org.onap.policy.apex.onap.pmcontrol",
+                                          "source":"DCAE",
+                                          "target":"APEX",
+                                          "parameter":{
+                                             "entry":[
+                                                {
+                                                   "key":"count",
+                                                   "value":{
+                                                      "key":"count",
+                                                      "fieldSchemaKey":{
+                                                         "name":"SimpleIntType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                },
+                                                {
+                                                   "key":"serverTimeMs",
+                                                   "value":{
+                                                      "key":"serverTimeMs",
+                                                      "fieldSchemaKey":{
+                                                         "name":"SimpleIntType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                }
+                                             ]
+                                          }
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"PMSubscriptionOutputEvent",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"PMSubscriptionOutputEvent",
+                                             "version":"0.0.1"
+                                          },
+                                          "nameSpace":"org.onap.policy.apex.onap.pmcontrol",
+                                          "source":"APEX",
+                                          "target":"APEX",
+                                          "parameter":{
+                                             "entry":[
+                                                {
+                                                   "key":"albumID",
+                                                   "value":{
+                                                      "key":"albumID",
+                                                      "fieldSchemaKey":{
+                                                         "name":"UUIDType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                }
+                                             ]
+                                          }
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"pmsh-operational-policy",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"pmsh-operational-policy",
+                                             "version":"0.0.1"
+                                          },
+                                          "nameSpace":"org.onap.policy.apex.onap.pmcontrol",
+                                          "source":"DCAE",
+                                          "target":"APEX",
+                                          "parameter":{
+                                             "entry":[
+                                                {
+                                                   "key":"blueprintName",
+                                                   "value":{
+                                                      "key":"blueprintName",
+                                                      "fieldSchemaKey":{
+                                                         "name":"SimpleStringType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                },
+                                                {
+                                                   "key":"blueprintVersion",
+                                                   "value":{
+                                                      "key":"blueprintVersion",
+                                                      "fieldSchemaKey":{
+                                                         "name":"SimpleStringType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                },
+                                                {
+                                                   "key":"changeType",
+                                                   "value":{
+                                                      "key":"changeType",
+                                                      "fieldSchemaKey":{
+                                                         "name":"SimpleStringType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                },
+                                                {
+                                                   "key":"closedLoopControlName",
+                                                   "value":{
+                                                      "key":"closedLoopControlName",
+                                                      "fieldSchemaKey":{
+                                                         "name":"SimpleStringType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                },
+                                                {
+                                                   "key":"nfName",
+                                                   "value":{
+                                                      "key":"nfName",
+                                                      "fieldSchemaKey":{
+                                                         "name":"SimpleStringType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                },
+                                                {
+                                                   "key":"policyName",
+                                                   "value":{
+                                                      "key":"policyName",
+                                                      "fieldSchemaKey":{
+                                                         "name":"SimpleStringType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                },
+                                                {
+                                                   "key":"subscription",
+                                                   "value":{
+                                                      "key":"subscription",
+                                                      "fieldSchemaKey":{
+                                                         "name":"SubscriptionType",
+                                                         "version":"0.0.1"
+                                                      },
+                                                      "optional":false
+                                                   }
+                                                }
+                                             ]
+                                          }
+                                       }
+                                    }
+                                 ]
+                              }
+                           },
+                           "albums":{
+                              "key":{
+                                 "name":"PMControlPolicy_Albums",
+                                 "version":"0.0.1"
+                              },
+                              "albums":{
+                                 "entry":[
+                                    {
+                                       "key":{
+                                          "name":"PMSubscriptionAlbum",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"PMSubscriptionAlbum",
+                                             "version":"0.0.1"
+                                          },
+                                          "scope":"policy",
+                                          "isWritable":true,
+                                          "itemSchema":{
+                                             "name":"PMSubscriptionType",
+                                             "version":"0.0.1"
+                                          }
+                                       }
+                                    }
+                                 ]
+                              }
+                           },
+                           "schemas":{
+                              "key":{
+                                 "name":"PMControlPolicy_Schemas",
+                                 "version":"0.0.1"
+                              },
+                              "schemas":{
+                                 "entry":[
+                                    {
+                                       "key":{
+                                          "name":"CDSActionIdentifiersType",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"CDSActionIdentifiersType",
+                                             "version":"0.0.1"
+                                          },
+                                          "schemaFlavour":"Avro",
+                                          "schemaDefinition":"{\n    \"type\": \"record\",\n    \"name\": \"ActionIdentifiers_Type\",\n    \"namespace\": \"org.onap.policy.apex.onap.helloworld\",\n    \"fields\": [\n        {\n            \"name\": \"actionName\",\n            \"type\": \"string\"\n        },\n        {\n            \"name\": \"blueprintName\",\n            \"type\": \"string\"\n        },\n        {\n            \"name\": \"blueprintVersion\",\n            \"type\": \"string\"\n        },\n        {\n            \"name\": \"mode\",\n            \"type\": \"string\"\n        }\n    ]\n}"
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"CDSCreateResponsePayloadType",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"CDSCreateResponsePayloadType",
+                                             "version":"0.0.1"
+                                          },
+                                          "schemaFlavour":"Avro",
+                                          "schemaDefinition":"{\n  \"name\": \"CreateResponsePayloadEntry\",\n  \"type\": \"record\",\n  \"namespace\": \"org.onap.policy.apex.onap.helloworld\",\n  \"fields\": [\n    {\n      \"name\": \"create_DasH_subscription_DasH_response\",\n      \"type\": {\n        \"name\": \"create_DasH_subscription_DasH_response\",\n        \"type\": \"record\",\n        \"fields\": [\n          {\n            \"name\": \"odl_DasH_response\",\n            \"type\": {\n              \"name\": \"odl_DasH_response\",\n              \"type\": \"record\",\n              \"fields\": [\n                  {\n                    \"name\": \"status\",\n                    \"type\": \"string\"\n                  }\n              ]\n            }\n          }\n        ]\n      }\n    }\n  ]\n}"
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"CDSCreateSubscriptionPayloadType",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"CDSCreateSubscriptionPayloadType",
+                                             "version":"0.0.1"
+                                          },
+                                          "schemaFlavour":"Avro",
+                                          "schemaDefinition":"{\n  \"type\": \"map\",\n  \"values\": {\n    \"type\": \"record\",\n    \"name\": \"CDSRequestPayloadEntry\",\n    \"fields\": [\n      {\n        \"name\": \"create_DasH_subscription_DasH_properties\",\n        \"type\": {\n          \"name\": \"create_DasH_subscription_DasH_properties_record\",\n          \"type\": \"record\",\n          \"fields\": [\n            {\n              \"name\": \"nfName\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"subscriptionName\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"administrativeState\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"fileBasedGP\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"fileLocation\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"measurementGroups\",\n              \"type\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"name\": \"measurementGroups_record\",\n                  \"type\": \"record\",\n                  \"fields\": [\n                    {\n                      \"name\": \"measurementGroup\",\n                      \"type\": {\n                        \"name\": \"measurementGroup\",\n                        \"type\": \"record\",\n                        \"fields\": [\n                          {\n                            \"name\": \"measurementTypes\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": {\n                                \"name\": \"measurementTypes_record\",\n                                \"type\": \"record\",\n                                \"fields\": [\n                                  {\n                                    \"name\": \"measurementType\",\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              }\n                            }\n                          },\n                          {\n                            \"name\": \"managedObjectDNsBasic\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": {\n                                \"name\": \"managedObjectDNsBasic_record\",\n                                \"type\": \"record\",\n                                \"fields\": [\n                                  {\n                                    \"name\": \"DN\",\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              }\n                            }\n                          }\n                        ]\n                      }\n                    }\n                  ]\n                }\n              }\n            }\n          ]\n        }\n      }\n    ]\n  }\n}"
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"CDSDeleteResponsePayloadType",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"CDSDeleteResponsePayloadType",
+                                             "version":"0.0.1"
+                                          },
+                                          "schemaFlavour":"Avro",
+                                          "schemaDefinition":"{\n  \"name\": \"DeleteResponsePayloadEntry\",\n  \"type\": \"record\",\n  \"namespace\": \"com.acme.avro\",\n  \"fields\": [\n    {\n      \"name\": \"delete_DasH_subscription_DasH_response\",\n      \"type\": {\n        \"name\": \"delete_DasH_subscription_DasH_response\",\n        \"type\": \"record\",\n        \"fields\": [\n          {\n            \"name\": \"odl_DasH_response\",\n            \"type\": {\n              \"name\": \"odl_DasH_response\",\n              \"type\": \"record\",\n              \"fields\": [\n                  {\n                    \"name\": \"status\",\n                    \"type\": \"string\"\n                  }\n              ]\n            }\n          }\n        ]\n      }\n    }\n  ]\n}"
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"CDSDeleteSubscriptionPayloadType",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"CDSDeleteSubscriptionPayloadType",
+                                             "version":"0.0.1"
+                                          },
+                                          "schemaFlavour":"Avro",
+                                          "schemaDefinition":"{\n  \"type\": \"map\",\n  \"values\": {\n    \"type\": \"record\",\n    \"name\": \"CDSRequestPayloadEntry\",\n    \"fields\": [\n      {\n        \"name\": \"delete_DasH_subscription_DasH_properties\",\n        \"type\": {\n          \"name\": \"delete_DasH_subscription_DasH_properties_record\",\n          \"type\": \"record\",\n          \"fields\": [\n            {\n              \"name\": \"nfName\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"subscriptionName\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"administrativeState\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"fileBasedGP\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"fileLocation\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"measurementGroups\",\n              \"type\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"name\": \"measurementGroups_record\",\n                  \"type\": \"record\",\n                  \"fields\": [\n                    {\n                      \"name\": \"measurementGroup\",\n                      \"type\": {\n                        \"name\": \"measurementGroup\",\n                        \"type\": \"record\",\n                        \"fields\": [\n                          {\n                            \"name\": \"measurementTypes\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": {\n                                \"name\": \"measurementTypes_record\",\n                                \"type\": \"record\",\n                                \"fields\": [\n                                  {\n                                    \"name\": \"measurementType\",\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              }\n                            }\n                          },\n                          {\n                            \"name\": \"managedObjectDNsBasic\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": {\n                                \"name\": \"managedObjectDNsBasic_record\",\n                                \"type\": \"record\",\n                                \"fields\": [\n                                  {\n                                    \"name\": \"DN\",\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              }\n                            }\n                          }\n                        ]\n                      }\n                    }\n                  ]\n                }\n              }\n            }\n          ]\n        }\n      }\n    ]\n  }\n}"
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"CDSRequestCommonHeaderType",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"CDSRequestCommonHeaderType",
+                                             "version":"0.0.1"
+                                          },
+                                          "schemaFlavour":"Avro",
+                                          "schemaDefinition":"{\n    \"type\": \"record\",\n    \"name\": \"RequestCommonHeader_Type\",\n    \"namespace\": \"org.onap.policy.apex.onap.helloworld\",\n    \"fields\": [\n        {\n            \"name\": \"originatorId\",\n            \"type\": \"string\"\n        },\n        {\n            \"name\": \"requestId\",\n            \"type\": \"string\"\n        },\n        {\n            \"name\": \"subRequestId\",\n            \"type\": \"string\"\n        }\n    ]\n}"
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"CDSResponseCommonHeaderType",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"CDSResponseCommonHeaderType",
+                                             "version":"0.0.1"
+                                          },
+                                          "schemaFlavour":"Avro",
+                                          "schemaDefinition":"{\n    \"type\": \"record\",\n    \"name\": \"ResponseCommonHeader_Type\",\n    \"namespace\": \"org.onap.policy.apex.onap.helloworld\",\n    \"fields\": [\n        {\n            \"name\": \"originatorId\",\n            \"type\": \"string\"\n        },\n        {\n            \"name\": \"requestId\",\n            \"type\": \"string\"\n        },\n        {\n            \"name\": \"subRequestId\",\n            \"type\": \"string\"\n        },\n        {\n            \"name\": \"timestamp\",\n            \"type\": \"string\"\n        },\n        {\n            \"name\": \"flags\",\n            \"type\": [\"null\", \"string\"]\n        }\n    ]\n}"
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"CDSResponseStatusType",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"CDSResponseStatusType",
+                                             "version":"0.0.1"
+                                          },
+                                          "schemaFlavour":"Avro",
+                                          "schemaDefinition":"{\n    \"type\": \"record\",\n    \"name\": \"ResponseStatus_Type\",\n    \"namespace\": \"org.onap.policy.apex.onap.helloworld\",\n    \"fields\": [\n        {\n            \"name\": \"code\",\n            \"type\": \"int\"\n        },\n        {\n            \"name\": \"eventType\",\n            \"type\": \"string\"\n        },\n        {\n            \"name\": \"timestamp\",\n            \"type\": \"string\"\n        },\n        {\n            \"name\": \"message\",\n            \"type\": \"string\"\n        }\n    ]\n}"
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"PMSubscriptionType",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"PMSubscriptionType",
+                                             "version":"0.0.1"
+                                          },
+                                          "schemaFlavour":"Avro",
+                                          "schemaDefinition":"{\n\t\"name\": \"PMSubscription\",\n\t\"type\": \"record\",\n\t\"namespace\": \"org.onap.policy.apex.onap.pmcontrol\",\n\t\"fields\": [\n        {\n            \"name\": \"nfName\",\n            \"type\": \"string\"\n        },\n\t    {\n\t\t\t\"name\": \"changeType\",\n\t\t\t\"type\": \"string\"\n\t\t},\n\t\t{\n\t\t\t\"name\": \"closedLoopControlName\",\n\t\t\t\"type\": \"string\"\n\t\t},\n\t\t{\n\t\t\t\"name\": \"policyName\",\n\t\t\t\"type\": \"string\"\n\t\t},\n\t\t{\n\t\t    \"name\": \"blueprintName\",\n\t\t    \"type\": \"string\"\n\t\t},\n\t\t{\n\t\t    \"name\": \"blueprintVersion\",\n\t\t    \"type\": \"string\"\n\t\t},\n\t\t{\n\t\t\t\"name\": \"subscription\",\n\t\t\t\"type\": {\n\t\t\t\t\"name\": \"subscription\",\n\t\t\t\t\"type\": \"record\",\n\t\t\t\t\"fields\": [{\n\t\t\t\t\t\t\"name\": \"subscriptionName\",\n\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"name\": \"administrativeState\",\n\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"name\": \"fileBasedGP\",\n\t\t\t\t\t\t\"type\": \"int\"\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"name\": \"fileLocation\",\n\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"name\": \"measurementGroups\",\n\t\t\t\t\t\t\"type\": {\n\t\t\t\t\t\t\t\"type\": \"array\",\n\t\t\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\t\t\"name\": \"Measurement_Groups_Type\",\n\t\t\t\t\t\t\t\t\"type\": \"record\",\n\t\t\t\t\t\t\t\t\"fields\": [{\n\t\t\t\t\t\t\t\t\t\"name\": \"measurementGroup\",\n\t\t\t\t\t\t\t\t\t\"type\": {\n\t\t\t\t\t\t\t\t\t\t\"name\": \"Measurement_Group_Type\",\n\t\t\t\t\t\t\t\t\t\t\"type\": \"record\",\n\t\t\t\t\t\t\t\t\t\t\"fields\": [{\n\t\t\t\t\t\t\t\t\t\t\t\t\"name\": \"measurementTypes\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"type\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"type\": \"array\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"name\": \"Measurement_Types_Type\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"type\": \"record\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"fields\": [{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"name\": \"measurementType\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}]\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\"name\": \"managedObjectDNsBasic\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"type\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"type\": \"array\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"name\": \"Managed_Object_Dns_Basic_Type\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"type\": \"record\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"fields\": [{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"name\": \"DN\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}]\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}]\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}\n\t\t}\n\t]\n}"
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"SimpleIntType",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"SimpleIntType",
+                                             "version":"0.0.1"
+                                          },
+                                          "schemaFlavour":"Java",
+                                          "schemaDefinition":"java.lang.Integer"
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"SimpleStringType",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"SimpleStringType",
+                                             "version":"0.0.1"
+                                          },
+                                          "schemaFlavour":"Java",
+                                          "schemaDefinition":"java.lang.String"
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"SubscriptionStatusType",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"SubscriptionStatusType",
+                                             "version":"0.0.1"
+                                          },
+                                          "schemaFlavour":"Avro",
+                                          "schemaDefinition":"{\n    \"type\": \"record\",\n    \"name\": \"ActivateSubscriptionStatus_Type\",\n    \"namespace\": \"org.onap.policy.apex.onap.helloworld\",\n    \"fields\": [\n        {\n            \"name\": \"subscriptionName\",\n            \"type\": \"string\"\n        },\n        {\n            \"name\": \"nfName\",\n            \"type\": \"string\"\n        },\n        {\n            \"name\": \"changeType\",\n            \"type\": \"string\"\n        },\n        {\n            \"name\": \"message\",\n            \"type\": \"string\"\n        }\n    ]\n}"
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"SubscriptionType",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"SubscriptionType",
+                                             "version":"0.0.1"
+                                          },
+                                          "schemaFlavour":"Avro",
+                                          "schemaDefinition":"{\n\t\"name\": \"subscription\",\n\t\"type\": \"record\",\n\t\"fields\": [{\n\t\t\t\"name\": \"subscriptionName\",\n\t\t\t\"type\": \"string\"\n\t\t},\n\t\t{\n\t\t\t\"name\": \"administrativeState\",\n\t\t\t\"type\": \"string\"\n\t\t},\n\t\t{\n\t\t\t\"name\": \"fileBasedGP\",\n\t\t\t\"type\": \"int\"\n\t\t},\n\t\t{\n\t\t\t\"name\": \"fileLocation\",\n\t\t\t\"type\": \"string\"\n\t\t},\n\t\t{\n\t\t\t\"name\": \"measurementGroups\",\n\t\t\t\"type\": {\n\t\t\t\t\"type\": \"array\",\n\t\t\t\t\"items\": {\n\t\t\t\t\t\"name\": \"Measurement_Groups_Type\",\n\t\t\t\t\t\"type\": \"record\",\n\t\t\t\t\t\"fields\": [{\n\t\t\t\t\t\t\"name\": \"measurementGroup\",\n\t\t\t\t\t\t\"type\": {\n\t\t\t\t\t\t\t\"name\": \"Measurement_Group_Type\",\n\t\t\t\t\t\t\t\"type\": \"record\",\n\t\t\t\t\t\t\t\"fields\": [{\n\t\t\t\t\t\t\t\t\t\"name\": \"measurementTypes\",\n\t\t\t\t\t\t\t\t\t\"type\": {\n\t\t\t\t\t\t\t\t\t\t\"type\": \"array\",\n\t\t\t\t\t\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\t\t\t\t\t\"name\": \"Measurement_Types_Type\",\n\t\t\t\t\t\t\t\t\t\t\t\"type\": \"record\",\n\t\t\t\t\t\t\t\t\t\t\t\"fields\": [{\n\t\t\t\t\t\t\t\t\t\t\t\t\"name\": \"measurementType\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t\t\t\t\t\t}]\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"name\": \"managedObjectDNsBasic\",\n\t\t\t\t\t\t\t\t\t\"type\": {\n\t\t\t\t\t\t\t\t\t\t\"type\": \"array\",\n\t\t\t\t\t\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\t\t\t\t\t\"name\": \"Managed_Object_Dns_Basic_Type\",\n\t\t\t\t\t\t\t\t\t\t\t\"type\": \"record\",\n\t\t\t\t\t\t\t\t\t\t\t\"fields\": [{\n\t\t\t\t\t\t\t\t\t\t\t\t\"name\": \"DN\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t\t\t\t\t\t}]\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t}\n\t\t\t\t\t}]\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t]\n}"
+                                       }
+                                    },
+                                    {
+                                       "key":{
+                                          "name":"UUIDType",
+                                          "version":"0.0.1"
+                                       },
+                                       "value":{
+                                          "key":{
+                                             "name":"UUIDType",
+                                             "version":"0.0.1"
+                                          },
+                                          "schemaFlavour":"Java",
+                                          "schemaDefinition":"java.util.UUID"
+                                       }
+                                    }
+                                 ]
+                              }
+                           }
+                        }
+                     },
+                     "engineParameters":{
+                        "executorParameters":{
+                           "JAVASCRIPT":{
+                              "parameterClassName":"org.onap.policy.apex.plugins.executor.javascript.JavascriptExecutorParameters"
+                           }
+                        },
+                        "contextParameters":{
+                           "parameterClassName":"org.onap.policy.apex.context.parameters.ContextParameters",
+                           "schemaParameters":{
+                              "Avro":{
+                                 "parameterClassName":"org.onap.policy.apex.plugins.context.schema.avro.AvroSchemaHelperParameters"
+                              },
+                              "Java":{
+                                 "parameterClassName":"org.onap.policy.apex.context.impl.schema.java.JavaSchemaHelperParameters",
+                                 "jsonAdapters":{
+                                    "Instant":{
+                                       "adaptedClass":"java.time.Instant",
+                                       "adaptorClass":"org.onap.policy.controlloop.util.Serialization$GsonInstantAdapter"
+                                    }
+                                 }
+                              }
+                           }
+                        }
+                     }
+                  },
+                  "eventInputParameters":{
+                     "DCAEConsumer":{
+                        "carrierTechnologyParameters":{
+                           "carrierTechnology":"RESTCLIENT",
+                           "parameterClassName":"org.onap.policy.apex.plugins.event.carrier.restclient.RestClientCarrierTechnologyParameters",
+                           "parameters":{
+                              "consumerPollTime":"50",
+                              "url":"https://message-router:3905/events/unauthenticated.DCAE_CL_OUTPUT/cg1/sg1"
+                           }
+                        },
+                        "eventProtocolParameters":{
+                           "eventProtocol":"JSON",
+                           "parameters":{
+                              "nameAlias":"policyName"
+                           }
+                        },
+                        "eventName":"pmsh-operational-policy",
+                        "eventNameFilter":"pmsh-operational-policy"
+                     },
+                     "CDSRequestConsumer":{
+                        "carrierTechnologyParameters":{
+                           "carrierTechnology":"RESTREQUESTOR",
+                           "parameterClassName":"org.onap.policy.apex.plugins.event.carrier.restrequestor.RestRequestorCarrierTechnologyParameters",
+                           "parameters":{
+                              "url":"http://10.10.10.184:30254/api/v1/execution-service/process",
+                              "httpMethod":"POST",
+                              "restRequestTimeout":2000,
+                              "httpHeaders":[
+                                 [
+                                    "Authorization",
+                                    "Basic Y2NzZGthcHBzOmNjc2RrYXBwcw=="
+                                 ]
+                              ]
+                           }
+                        },
+                        "eventProtocolParameters":{
+                           "eventProtocol":"JSON"
+                        },
+                        "eventName":"CDSCreateResponseEvent",
+                        "eventNameFilter":"CDSCreateResponseEvent",
+                        "requestorMode":true,
+                        "requestorPeer":"CDSRequestProducer",
+                        "requestorTimeout":500
+                     },
+                     "CDSDeleteRequestConsumer":{
+                        "carrierTechnologyParameters":{
+                           "carrierTechnology":"RESTREQUESTOR",
+                           "parameterClassName":"org.onap.policy.apex.plugins.event.carrier.restrequestor.RestRequestorCarrierTechnologyParameters",
+                           "parameters":{
+                              "url":"http://10.10.10.184:30254/api/v1/execution-service/process",
+                              "httpMethod":"POST",
+                              "restRequestTimeout":2000,
+                              "httpHeaders":[
+                                 [
+                                    "Authorization",
+                                    "Basic Y2NzZGthcHBzOmNjc2RrYXBwcw=="
+                                 ]
+                              ]
+                           }
+                        },
+                        "eventProtocolParameters":{
+                           "eventProtocol":"JSON"
+                        },
+                        "eventName":"CDSDeleteResponseEvent",
+                        "eventNameFilter":"CDSDeleteResponseEvent",
+                        "requestorMode":true,
+                        "requestorPeer":"CDSDeleteRequestProducer",
+                        "requestorTimeout":500
+                     },
+                     "CDSReplyConsumer":{
+                        "carrierTechnologyParameters":{
+                           "carrierTechnology":"RESTREQUESTOR",
+                           "parameterClassName":"org.onap.policy.apex.plugins.event.carrier.restrequestor.RestRequestorCarrierTechnologyParameters",
+                           "parameters":{
+                              "url":"https://message-router:3905/events/unauthenticated.PMSH_CL_INPUT",
+                              "httpMethod":"POST",
+                              "restRequestTimeout":2000
+                           }
+                        },
+                        "eventProtocolParameters":{
+                           "eventProtocol":"JSON"
+                        },
+                        "eventName":"MRResponseEvent",
+                        "eventNameFilter":"MRResponseEvent",
+                        "requestorMode":true,
+                        "requestorPeer":"CDSReplyProducer",
+                        "requestorTimeout":500
+                     }
+                  },
+                  "eventOutputParameters":{
+                     "logOutputter":{
+                        "carrierTechnologyParameters":{
+                           "carrierTechnology":"FILE",
+                           "parameters":{
+                              "fileName":"/tmp/outputevents.log"
+                           }
+                        },
+                        "eventProtocolParameters":{
+                           "eventProtocol":"JSON"
+                        }
+                     },
+                     "StdOutOutputter":{
+                        "carrierTechnologyParameters":{
+                           "carrierTechnology":"FILE",
+                           "parameters":{
+                              "standardIo":true
+                           }
+                        },
+                        "eventProtocolParameters":{
+                           "eventProtocol":"JSON"
+                        }
+                     },
+                     "CDSRequestProducer":{
+                        "carrierTechnologyParameters":{
+                           "carrierTechnology":"RESTREQUESTOR",
+                           "parameterClassName":"org.onap.policy.apex.plugins.event.carrier.restrequestor.RestRequestorCarrierTechnologyParameters"
+                        },
+                        "eventProtocolParameters":{
+                           "eventProtocol":"JSON"
+                        },
+                        "eventNameFilter":"CDSCreateSubscriptionRequestEvent",
+                        "requestorMode":true,
+                        "requestorPeer":"CDSRequestConsumer",
+                        "requestorTimeout":500
+                     },
+                     "CDSDeleteRequestProducer":{
+                        "carrierTechnologyParameters":{
+                           "carrierTechnology":"RESTREQUESTOR",
+                           "parameterClassName":"org.onap.policy.apex.plugins.event.carrier.restrequestor.RestRequestorCarrierTechnologyParameters"
+                        },
+                        "eventProtocolParameters":{
+                           "eventProtocol":"JSON"
+                        },
+                        "eventNameFilter":"CDSDeleteSubscriptionRequestEvent",
+                        "requestorMode":true,
+                        "requestorPeer":"CDSDeleteRequestConsumer",
+                        "requestorTimeout":500
+                     },
+                     "CDSReplyProducer":{
+                        "carrierTechnologyParameters":{
+                           "carrierTechnology":"RESTREQUESTOR",
+                           "parameterClassName":"org.onap.policy.apex.plugins.event.carrier.restrequestor.RestRequestorCarrierTechnologyParameters"
+                        },
+                        "eventProtocolParameters":{
+                           "eventProtocol":"JSON"
+                        },
+                        "eventNameFilter":"CDSResponseStatusEvent",
+                        "requestorMode":true,
+                        "requestorPeer":"CDSReplyConsumer",
+                        "requestorTimeout":500
+                     }
+                  }
+               }
+            }
+         }
+      ]
+   }
+}
\ No newline at end of file
diff --git a/common/src/main/resources/examples/controlloop/PMSH/pmsh_operational_policy.yaml b/common/src/main/resources/examples/controlloop/PMSH/pmsh_operational_policy.yaml
new file mode 100644
index 0000000..faf5790
--- /dev/null
+++ b/common/src/main/resources/examples/controlloop/PMSH/pmsh_operational_policy.yaml
@@ -0,0 +1,2619 @@
+---
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+topology_template:
+  policies:
+  - operational.apex.pmcontrol:
+      type: onap.policies.controlloop.operational.Apex
+      type_version: 1.0.0
+      version: 1.0.0
+      metadata:
+        policy-id: operational.apex.pmcontrol
+        policy-version: 1
+      properties:
+        engineServiceParameters:
+          name: MyApexEngine
+          version: 0.0.1
+          id: 45
+          instanceCount: 2
+          deploymentPort: 12561
+          policy_type_impl:
+            apexPolicyModel:
+              key:
+                name: PMControlPolicy
+                version: 0.0.1
+              keyInformation:
+                key:
+                  name: PMControlPolicy_KeyInfo
+                  version: 0.0.1
+                keyInfoMap:
+                  entry:
+                  - key:
+                      name: CDSActionIdentifiersType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSActionIdentifiersType
+                        version: 0.0.1
+                      UUID: 6e5fa19b-14df-37e3-a4ae-8c537e861a82
+                      description: Generated description for concept referred to by
+                        key "CDSActionIdentifiersType:0.0.1"
+                  - key:
+                      name: CDSCreateResponseEvent
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSCreateResponseEvent
+                        version: 0.0.1
+                      UUID: 14b29e38-ac75-3273-aa4e-8583c0aa7dad
+                      description: Generated description for concept referred to by
+                        key "CDSCreateResponseEvent:0.0.1"
+                  - key:
+                      name: CDSCreateResponsePayloadType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSCreateResponsePayloadType
+                        version: 0.0.1
+                      UUID: 04573f8f-e772-30a5-b1d9-d7318d4a1e13
+                      description: Generated description for concept referred to by
+                        key "CDSCreateResponsePayloadType:0.0.1"
+                  - key:
+                      name: CDSCreateResponsePolicy
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSCreateResponsePolicy
+                        version: 0.0.1
+                      UUID: e126c965-fc09-3bfe-8f55-70f380a4a49c
+                      description: Generated description for concept referred to by
+                        key "CDSCreateResponsePolicy:0.0.1"
+                  - key:
+                      name: CDSCreateResponseTask
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSCreateResponseTask
+                        version: 0.0.1
+                      UUID: 6165ee82-afd2-3aab-a517-f00b3f2461d2
+                      description: Generated description for concept referred to by
+                        key "CDSCreateResponseTask:0.0.1"
+                  - key:
+                      name: CDSCreateSubscriptionPayloadType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSCreateSubscriptionPayloadType
+                        version: 0.0.1
+                      UUID: 8350ac5e-c157-38b9-9614-a0f93a830e60
+                      description: Generated description for concept referred to by
+                        key "CDSCreateSubscriptionPayloadType:0.0.1"
+                  - key:
+                      name: CDSCreateSubscriptionRequestEvent
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSCreateSubscriptionRequestEvent
+                        version: 0.0.1
+                      UUID: cfa325ba-226b-3a31-9183-ec43e2b6e9a2
+                      description: Generated description for concept referred to by
+                        key "CDSCreateSubscriptionRequestEvent:0.0.1"
+                  - key:
+                      name: CDSDeleteResponseEvent
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSDeleteResponseEvent
+                        version: 0.0.1
+                      UUID: 8be9c0fa-7437-3841-aff2-b3cec6ae3bd8
+                      description: Generated description for concept referred to by
+                        key "CDSDeleteResponseEvent:0.0.1"
+                  - key:
+                      name: CDSDeleteResponsePayloadType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSDeleteResponsePayloadType
+                        version: 0.0.1
+                      UUID: 3fbfe0c9-152e-34d3-a504-09cd13c058d0
+                      description: Generated description for concept referred to by
+                        key "CDSDeleteResponsePayloadType:0.0.1"
+                  - key:
+                      name: CDSDeleteResponsePolicy
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSDeleteResponsePolicy
+                        version: 0.0.1
+                      UUID: a780251c-edd5-3132-b865-04313246b43c
+                      description: Generated description for concept referred to by
+                        key "CDSDeleteResponsePolicy:0.0.1"
+                  - key:
+                      name: CDSDeleteResponseTask
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSDeleteResponseTask
+                        version: 0.0.1
+                      UUID: afce4555-3aa3-3521-a7d8-ee8cdf0d3efc
+                      description: Generated description for concept referred to by
+                        key "CDSDeleteResponseTask:0.0.1"
+                  - key:
+                      name: CDSDeleteSubscriptionPayloadType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSDeleteSubscriptionPayloadType
+                        version: 0.0.1
+                      UUID: 12658406-9147-3c9d-a38c-5ad5e30b092b
+                      description: Generated description for concept referred to by
+                        key "CDSDeleteSubscriptionPayloadType:0.0.1"
+                  - key:
+                      name: CDSDeleteSubscriptionRequestEvent
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSDeleteSubscriptionRequestEvent
+                        version: 0.0.1
+                      UUID: 24380c95-9289-36e6-8cbf-0edefa15ccd9
+                      description: Generated description for concept referred to by
+                        key "CDSDeleteSubscriptionRequestEvent:0.0.1"
+                  - key:
+                      name: CDSRequestCommonHeaderType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSRequestCommonHeaderType
+                        version: 0.0.1
+                      UUID: 35590ac0-062c-39f1-8786-b4ff716e30b1
+                      description: Generated description for concept referred to by
+                        key "CDSRequestCommonHeaderType:0.0.1"
+                  - key:
+                      name: CDSResponseCommonHeaderType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSResponseCommonHeaderType
+                        version: 0.0.1
+                      UUID: dd7e1805-885a-350b-aaf9-ed541321ae3c
+                      description: Generated description for concept referred to by
+                        key "CDSResponseCommonHeaderType:0.0.1"
+                  - key:
+                      name: CDSResponseStatusEvent
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSResponseStatusEvent
+                        version: 0.0.1
+                      UUID: 7986e21b-32f7-302e-9554-31f21b673493
+                      description: Generated description for concept referred to by
+                        key "CDSResponseStatusEvent:0.0.1"
+                  - key:
+                      name: CDSResponseStatusType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSResponseStatusType
+                        version: 0.0.1
+                      UUID: 92b8a2cf-344e-3ce1-8cc0-2b7d3cb695fa
+                      description: Generated description for concept referred to by
+                        key "CDSResponseStatusType:0.0.1"
+                  - key:
+                      name: CreateSubscriptionPayloadEvent
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CreateSubscriptionPayloadEvent
+                        version: 0.0.1
+                      UUID: 92162397-1a8e-3a3f-a469-d2af7700af4a
+                      description: Generated description for concept referred to by
+                        key "CreateSubscriptionPayloadEvent:0.0.1"
+                  - key:
+                      name: CreateSubscriptionPayloadTask
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CreateSubscriptionPayloadTask
+                        version: 0.0.1
+                      UUID: bc0c69f0-52ed-38ea-b468-ae4a6fd1730d
+                      description: Generated description for concept referred to by
+                        key "CreateSubscriptionPayloadTask:0.0.1"
+                  - key:
+                      name: CreateSubscriptionRequestTask
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CreateSubscriptionRequestTask
+                        version: 0.0.1
+                      UUID: 89cb75e9-f06c-30d3-b4ff-698d45f63869
+                      description: Generated description for concept referred to by
+                        key "CreateSubscriptionRequestTask:0.0.1"
+                  - key:
+                      name: DeleteSubscriptionPayloadEvent
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: DeleteSubscriptionPayloadEvent
+                        version: 0.0.1
+                      UUID: 994fa441-04ab-33bb-832d-1cd12ab5d074
+                      description: Generated description for concept referred to by
+                        key "DeleteSubscriptionPayloadEvent:0.0.1"
+                  - key:
+                      name: DeleteSubscriptionPayloadTask
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: DeleteSubscriptionPayloadTask
+                        version: 0.0.1
+                      UUID: 0f519117-5fea-3e4b-941f-8f778100465f
+                      description: Generated description for concept referred to by
+                        key "DeleteSubscriptionPayloadTask:0.0.1"
+                  - key:
+                      name: DeleteSubscriptionRequestTask
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: DeleteSubscriptionRequestTask
+                        version: 0.0.1
+                      UUID: acb772fe-d442-39e3-98f9-b1080caf4150
+                      description: Generated description for concept referred to by
+                        key "DeleteSubscriptionRequestTask:0.0.1"
+                  - key:
+                      name: MRResponseEvent
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: MRResponseEvent
+                        version: 0.0.1
+                      UUID: 13c747a3-6bae-3bcf-9c80-b152e01dc194
+                      description: Generated description for concept referred to by
+                        key "MRResponseEvent:0.0.1"
+                  - key:
+                      name: PMControlPolicy
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: PMControlPolicy
+                        version: 0.0.1
+                      UUID: acf1e55c-7bc5-3bd5-975a-0ca54afcd8a4
+                      description: Generated description for concept referred to by
+                        key "PMControlPolicy:0.0.1"
+                  - key:
+                      name: PMControlPolicy_Albums
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: PMControlPolicy_Albums
+                        version: 0.0.1
+                      UUID: b38ad204-c2c8-32f4-9b5a-dda0aeb0145b
+                      description: Generated description for concept referred to by
+                        key "PMControlPolicy_Albums:0.0.1"
+                  - key:
+                      name: PMControlPolicy_Events
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: PMControlPolicy_Events
+                        version: 0.0.1
+                      UUID: be3871a0-c42a-3113-a066-82d192840eca
+                      description: Generated description for concept referred to by
+                        key "PMControlPolicy_Events:0.0.1"
+                  - key:
+                      name: PMControlPolicy_KeyInfo
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: PMControlPolicy_KeyInfo
+                        version: 0.0.1
+                      UUID: ced37634-28a4-3178-b7f6-2980794927b0
+                      description: Generated description for concept referred to by
+                        key "PMControlPolicy_KeyInfo:0.0.1"
+                  - key:
+                      name: PMControlPolicy_Policies
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: PMControlPolicy_Policies
+                        version: 0.0.1
+                      UUID: be3d180d-ef9c-3a75-8e9c-84271a038bed
+                      description: Generated description for concept referred to by
+                        key "PMControlPolicy_Policies:0.0.1"
+                  - key:
+                      name: PMControlPolicy_Schemas
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: PMControlPolicy_Schemas
+                        version: 0.0.1
+                      UUID: e61973f1-189c-39e5-82f6-0d3afe298a20
+                      description: Generated description for concept referred to by
+                        key "PMControlPolicy_Schemas:0.0.1"
+                  - key:
+                      name: PMControlPolicy_Tasks
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: PMControlPolicy_Tasks
+                        version: 0.0.1
+                      UUID: 5658adb3-2962-30a3-a241-fae75bb8eb4a
+                      description: Generated description for concept referred to by
+                        key "PMControlPolicy_Tasks:0.0.1"
+                  - key:
+                      name: PMSubscriptionAlbum
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: PMSubscriptionAlbum
+                        version: 0.0.1
+                      UUID: c2bd6f0d-6854-317a-9be2-97c08338428c
+                      description: Generated description for concept referred to by
+                        key "PMSubscriptionAlbum:0.0.1"
+                  - key:
+                      name: PMSubscriptionOutputEvent
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: PMSubscriptionOutputEvent
+                        version: 0.0.1
+                      UUID: 992b7819-9f69-3aa0-bb0f-6e45ea15ce05
+                      description: Generated description for concept referred to by
+                        key "PMSubscriptionOutputEvent:0.0.1"
+                  - key:
+                      name: PMSubscriptionType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: PMSubscriptionType
+                        version: 0.0.1
+                      UUID: 73c1c397-4fc3-357f-93b6-a8ad707fbaae
+                      description: Generated description for concept referred to by
+                        key "PMSubscriptionType:0.0.1"
+                  - key:
+                      name: ReceiveEventPolicy
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: ReceiveEventPolicy
+                        version: 0.0.1
+                      UUID: 568b7345-9de1-36d3-b6a3-9b857e6809a1
+                      description: Generated description for concept referred to by
+                        key "ReceiveEventPolicy:0.0.1"
+                  - key:
+                      name: ReceiveSubscriptionTask
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: ReceiveSubscriptionTask
+                        version: 0.0.1
+                      UUID: f596afc8-100c-35eb-92c8-352355ea457d
+                      description: Generated description for concept referred to by
+                        key "ReceiveSubscriptionTask:0.0.1"
+                  - key:
+                      name: SimpleIntType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: SimpleIntType
+                        version: 0.0.1
+                      UUID: 153791fd-ae0a-36a7-88a5-309a7936415d
+                      description: Generated description for concept referred to by
+                        key "SimpleIntType:0.0.1"
+                  - key:
+                      name: SimpleStringType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: SimpleStringType
+                        version: 0.0.1
+                      UUID: 8a4957cf-9493-3a76-8c22-a208e23259af
+                      description: Generated description for concept referred to by
+                        key "SimpleStringType:0.0.1"
+                  - key:
+                      name: SubscriptionStatusType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: SubscriptionStatusType
+                        version: 0.0.1
+                      UUID: 597643b1-9db1-31ce-85d0-e1c63c43b30b
+                      description: Generated description for concept referred to by
+                        key "SubscriptionStatusType:0.0.1"
+                  - key:
+                      name: SubscriptionType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: SubscriptionType
+                        version: 0.0.1
+                      UUID: 184547bb-7d64-3cb2-a273-d7185102c5ce
+                      description: Generated description for concept referred to by
+                        key "SubscriptionType:0.0.1"
+                  - key:
+                      name: UUIDType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: UUIDType
+                        version: 0.0.1
+                      UUID: 6a8cc68e-dfc8-3403-9c6d-071c886b319c
+                      description: Generated description for concept referred to by
+                        key "UUIDType:0.0.1"
+                  - key:
+                      name: pmsh-operational-policy
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: pmsh-operational-policy
+                        version: 0.0.1
+                      UUID: fdf2c9ff-6422-3ea6-b6b6-49b12116265d
+                      description: Generated description for concept referred to by
+                        key "pmsh-operational-policy:0.0.1"
+              policies:
+                key:
+                  name: PMControlPolicy_Policies
+                  version: 0.0.1
+                policyMap:
+                  entry:
+                  - key:
+                      name: CDSCreateResponsePolicy
+                      version: 0.0.1
+                    value:
+                      policyKey:
+                        name: CDSCreateResponsePolicy
+                        version: 0.0.1
+                      template: Freestyle
+                      state:
+                        entry:
+                        - key: CDSCreateResponseState
+                          value:
+                            stateKey:
+                              parentKeyName: CDSCreateResponsePolicy
+                              parentKeyVersion: 0.0.1
+                              parentLocalName: 'NULL'
+                              localName: CDSCreateResponseState
+                            trigger:
+                              name: CDSCreateResponseEvent
+                              version: 0.0.1
+                            stateOutputs:
+                              entry:
+                              - key: ResponseOutput
+                                value:
+                                  key:
+                                    parentKeyName: CDSCreateResponsePolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: CDSCreateResponseState
+                                    localName: ResponseOutput
+                                  outgoingEvent:
+                                    name: CDSResponseStatusEvent
+                                    version: 0.0.1
+                                  nextState:
+                                    parentKeyName: 'NULL'
+                                    parentKeyVersion: 0.0.0
+                                    parentLocalName: 'NULL'
+                                    localName: 'NULL'
+                            contextAlbumReference: []
+                            taskSelectionLogic:
+                              key: 'NULL'
+                              logicFlavour: UNDEFINED
+                              logic: ''
+                            stateFinalizerLogicMap:
+                              entry: []
+                            defaultTask:
+                              name: CDSCreateResponseTask
+                              version: 0.0.1
+                            taskReferences:
+                              entry:
+                              - key:
+                                  name: CDSCreateResponseTask
+                                  version: 0.0.1
+                                value:
+                                  key:
+                                    parentKeyName: CDSCreateResponsePolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: CDSCreateResponseState
+                                    localName: CDSCreateResponsePolicy
+                                  outputType: DIRECT
+                                  output:
+                                    parentKeyName: CDSCreateResponsePolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: CDSCreateResponseState
+                                    localName: ResponseOutput
+                      firstState: CDSCreateResponseState
+                  - key:
+                      name: CDSDeleteResponsePolicy
+                      version: 0.0.1
+                    value:
+                      policyKey:
+                        name: CDSDeleteResponsePolicy
+                        version: 0.0.1
+                      template: Freestyle
+                      state:
+                        entry:
+                        - key: CDSDeleteResponseState
+                          value:
+                            stateKey:
+                              parentKeyName: CDSDeleteResponsePolicy
+                              parentKeyVersion: 0.0.1
+                              parentLocalName: 'NULL'
+                              localName: CDSDeleteResponseState
+                            trigger:
+                              name: CDSDeleteResponseEvent
+                              version: 0.0.1
+                            stateOutputs:
+                              entry:
+                              - key: ResponseOutput
+                                value:
+                                  key:
+                                    parentKeyName: CDSDeleteResponsePolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: CDSDeleteResponseState
+                                    localName: ResponseOutput
+                                  outgoingEvent:
+                                    name: CDSResponseStatusEvent
+                                    version: 0.0.1
+                                  nextState:
+                                    parentKeyName: 'NULL'
+                                    parentKeyVersion: 0.0.0
+                                    parentLocalName: 'NULL'
+                                    localName: 'NULL'
+                            contextAlbumReference: []
+                            taskSelectionLogic:
+                              key: 'NULL'
+                              logicFlavour: UNDEFINED
+                              logic: ''
+                            stateFinalizerLogicMap:
+                              entry: []
+                            defaultTask:
+                              name: CDSDeleteResponseTask
+                              version: 0.0.1
+                            taskReferences:
+                              entry:
+                              - key:
+                                  name: CDSDeleteResponseTask
+                                  version: 0.0.1
+                                value:
+                                  key:
+                                    parentKeyName: CDSDeleteResponsePolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: CDSDeleteResponseState
+                                    localName: CDSDeleteResponsePolicy
+                                  outputType: DIRECT
+                                  output:
+                                    parentKeyName: CDSDeleteResponsePolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: CDSDeleteResponseState
+                                    localName: ResponseOutput
+                      firstState: CDSDeleteResponseState
+                  - key:
+                      name: ReceiveEventPolicy
+                      version: 0.0.1
+                    value:
+                      policyKey:
+                        name: ReceiveEventPolicy
+                        version: 0.0.1
+                      template: Freestyle
+                      state:
+                        entry:
+                        - key: CreateOrDeleteState
+                          value:
+                            stateKey:
+                              parentKeyName: ReceiveEventPolicy
+                              parentKeyVersion: 0.0.1
+                              parentLocalName: 'NULL'
+                              localName: CreateOrDeleteState
+                            trigger:
+                              name: PMSubscriptionOutputEvent
+                              version: 0.0.1
+                            stateOutputs:
+                              entry:
+                              - key: CreateSubscriptionPayload
+                                value:
+                                  key:
+                                    parentKeyName: ReceiveEventPolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: CreateOrDeleteState
+                                    localName: CreateSubscriptionPayload
+                                  outgoingEvent:
+                                    name: CreateSubscriptionPayloadEvent
+                                    version: 0.0.1
+                                  nextState:
+                                    parentKeyName: ReceiveEventPolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: 'NULL'
+                                    localName: CreateSubscription
+                              - key: DeleteSubscriptionPayload
+                                value:
+                                  key:
+                                    parentKeyName: ReceiveEventPolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: CreateOrDeleteState
+                                    localName: DeleteSubscriptionPayload
+                                  outgoingEvent:
+                                    name: DeleteSubscriptionPayloadEvent
+                                    version: 0.0.1
+                                  nextState:
+                                    parentKeyName: ReceiveEventPolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: 'NULL'
+                                    localName: DeleteSubscription
+                            contextAlbumReference:
+                            - name: PMSubscriptionAlbum
+                              version: 0.0.1
+                            taskSelectionLogic:
+                              key: TaskSelectionLogic
+                              logicFlavour: JAVASCRIPT
+                              logic: |-
+                                /*
+                                 * ============LICENSE_START=======================================================
+                                 *  Copyright (C) 2020 Nordix. All rights reserved.
+                                 * ================================================================================
+                                 * Licensed under the Apache License, Version 2.0 (the "License");
+                                 * you may not use this file except in compliance with the License.
+                                 * You may obtain a copy of the License at
+                                 *
+                                 *      http://www.apache.org/licenses/LICENSE-2.0
+                                 *
+                                 * Unless required by applicable law or agreed to in writing, software
+                                 * distributed under the License is distributed on an "AS IS" BASIS,
+                                 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+                                 * See the License for the specific language governing permissions and
+                                 * limitations under the License.
+                                 *
+                                 * SPDX-License-Identifier: Apache-2.0
+                                 * ============LICENSE_END=========================================================
+                                 */
+
+                                executor.logger.info(executor.subject.id);
+
+                                var pmSubscriptionInfo = executor.getContextAlbum("PMSubscriptionAlbum").get(executor.inFields.get("albumID").toString())
+                                var changeType = pmSubscriptionInfo.get("changeType").toString()
+
+                                executor.logger.info("Change Type is " + changeType)
+
+                                if ("CREATE".equals(changeType)) {
+                                    executor.logger.info("Choosing to create a subscription")
+                                    executor.subject.getTaskKey("CreateSubscriptionPayloadTask").copyTo(executor.selectedTask);
+                                }
+                                else if ("DELETE".equals(changeType)) {
+                                    executor.logger.info("Choosing to delete a subscription")
+                                    executor.subject.getTaskKey("DeleteSubscriptionPayloadTask").copyTo(executor.selectedTask);
+                                }
+
+                                //var returnValue = executor.isTrue;
+                                true;
+                            stateFinalizerLogicMap:
+                              entry: []
+                            defaultTask:
+                              name: CreateSubscriptionPayloadTask
+                              version: 0.0.1
+                            taskReferences:
+                              entry:
+                              - key:
+                                  name: CreateSubscriptionPayloadTask
+                                  version: 0.0.1
+                                value:
+                                  key:
+                                    parentKeyName: ReceiveEventPolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: CreateOrDeleteState
+                                    localName: ReceiveEventPolicy
+                                  outputType: DIRECT
+                                  output:
+                                    parentKeyName: ReceiveEventPolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: CreateOrDeleteState
+                                    localName: CreateSubscriptionPayload
+                              - key:
+                                  name: DeleteSubscriptionPayloadTask
+                                  version: 0.0.1
+                                value:
+                                  key:
+                                    parentKeyName: ReceiveEventPolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: CreateOrDeleteState
+                                    localName: ReceiveEventPolicy
+                                  outputType: DIRECT
+                                  output:
+                                    parentKeyName: ReceiveEventPolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: CreateOrDeleteState
+                                    localName: DeleteSubscriptionPayload
+                        - key: CreateSubscription
+                          value:
+                            stateKey:
+                              parentKeyName: ReceiveEventPolicy
+                              parentKeyVersion: 0.0.1
+                              parentLocalName: 'NULL'
+                              localName: CreateSubscription
+                            trigger:
+                              name: CreateSubscriptionPayloadEvent
+                              version: 0.0.1
+                            stateOutputs:
+                              entry:
+                              - key: IssueCreateSubscriptionRequestOutput
+                                value:
+                                  key:
+                                    parentKeyName: ReceiveEventPolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: CreateSubscription
+                                    localName: IssueCreateSubscriptionRequestOutput
+                                  outgoingEvent:
+                                    name: CDSCreateSubscriptionRequestEvent
+                                    version: 0.0.1
+                                  nextState:
+                                    parentKeyName: 'NULL'
+                                    parentKeyVersion: 0.0.0
+                                    parentLocalName: 'NULL'
+                                    localName: 'NULL'
+                            contextAlbumReference:
+                            - name: PMSubscriptionAlbum
+                              version: 0.0.1
+                            taskSelectionLogic:
+                              key: 'NULL'
+                              logicFlavour: UNDEFINED
+                              logic: ''
+                            stateFinalizerLogicMap:
+                              entry: []
+                            defaultTask:
+                              name: CreateSubscriptionRequestTask
+                              version: 0.0.1
+                            taskReferences:
+                              entry:
+                              - key:
+                                  name: CreateSubscriptionRequestTask
+                                  version: 0.0.1
+                                value:
+                                  key:
+                                    parentKeyName: ReceiveEventPolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: CreateSubscription
+                                    localName: ReceiveEventPolicy
+                                  outputType: DIRECT
+                                  output:
+                                    parentKeyName: ReceiveEventPolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: CreateSubscription
+                                    localName: IssueCreateSubscriptionRequestOutput
+                        - key: DeleteSubscription
+                          value:
+                            stateKey:
+                              parentKeyName: ReceiveEventPolicy
+                              parentKeyVersion: 0.0.1
+                              parentLocalName: 'NULL'
+                              localName: DeleteSubscription
+                            trigger:
+                              name: DeleteSubscriptionPayloadEvent
+                              version: 0.0.1
+                            stateOutputs:
+                              entry:
+                              - key: IssueDeleteSubscriptionRequestOutput
+                                value:
+                                  key:
+                                    parentKeyName: ReceiveEventPolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: DeleteSubscription
+                                    localName: IssueDeleteSubscriptionRequestOutput
+                                  outgoingEvent:
+                                    name: CDSDeleteSubscriptionRequestEvent
+                                    version: 0.0.1
+                                  nextState:
+                                    parentKeyName: 'NULL'
+                                    parentKeyVersion: 0.0.0
+                                    parentLocalName: 'NULL'
+                                    localName: 'NULL'
+                            contextAlbumReference:
+                            - name: PMSubscriptionAlbum
+                              version: 0.0.1
+                            taskSelectionLogic:
+                              key: 'NULL'
+                              logicFlavour: UNDEFINED
+                              logic: ''
+                            stateFinalizerLogicMap:
+                              entry: []
+                            defaultTask:
+                              name: DeleteSubscriptionRequestTask
+                              version: 0.0.1
+                            taskReferences:
+                              entry:
+                              - key:
+                                  name: DeleteSubscriptionRequestTask
+                                  version: 0.0.1
+                                value:
+                                  key:
+                                    parentKeyName: ReceiveEventPolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: DeleteSubscription
+                                    localName: ReceiveEventPolicy
+                                  outputType: DIRECT
+                                  output:
+                                    parentKeyName: ReceiveEventPolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: DeleteSubscription
+                                    localName: IssueDeleteSubscriptionRequestOutput
+                        - key: ReceiveSubscriptionState
+                          value:
+                            stateKey:
+                              parentKeyName: ReceiveEventPolicy
+                              parentKeyVersion: 0.0.1
+                              parentLocalName: 'NULL'
+                              localName: ReceiveSubscriptionState
+                            trigger:
+                              name: pmsh-operational-policy
+                              version: 0.0.1
+                            stateOutputs:
+                              entry:
+                              - key: ReceivePMSubscriptionOutput
+                                value:
+                                  key:
+                                    parentKeyName: ReceiveEventPolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: ReceiveSubscriptionState
+                                    localName: ReceivePMSubscriptionOutput
+                                  outgoingEvent:
+                                    name: PMSubscriptionOutputEvent
+                                    version: 0.0.1
+                                  nextState:
+                                    parentKeyName: ReceiveEventPolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: 'NULL'
+                                    localName: CreateOrDeleteState
+                            contextAlbumReference:
+                            - name: PMSubscriptionAlbum
+                              version: 0.0.1
+                            taskSelectionLogic:
+                              key: 'NULL'
+                              logicFlavour: UNDEFINED
+                              logic: ''
+                            stateFinalizerLogicMap:
+                              entry: []
+                            defaultTask:
+                              name: ReceiveSubscriptionTask
+                              version: 0.0.1
+                            taskReferences:
+                              entry:
+                              - key:
+                                  name: ReceiveSubscriptionTask
+                                  version: 0.0.1
+                                value:
+                                  key:
+                                    parentKeyName: ReceiveEventPolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: ReceiveSubscriptionState
+                                    localName: ReceiveEventPolicy
+                                  outputType: DIRECT
+                                  output:
+                                    parentKeyName: ReceiveEventPolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: ReceiveSubscriptionState
+                                    localName: ReceivePMSubscriptionOutput
+                      firstState: ReceiveSubscriptionState
+              tasks:
+                key:
+                  name: PMControlPolicy_Tasks
+                  version: 0.0.1
+                taskMap:
+                  entry:
+                  - key:
+                      name: CDSCreateResponseTask
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSCreateResponseTask
+                        version: 0.0.1
+                      inputFields:
+                        entry:
+                        - key: actionIdentifiers
+                          value:
+                            key: actionIdentifiers
+                            fieldSchemaKey:
+                              name: CDSActionIdentifiersType
+                              version: 0.0.1
+                            optional: false
+                        - key: commonHeader
+                          value:
+                            key: commonHeader
+                            fieldSchemaKey:
+                              name: CDSResponseCommonHeaderType
+                              version: 0.0.1
+                            optional: false
+                        - key: payload
+                          value:
+                            key: payload
+                            fieldSchemaKey:
+                              name: CDSCreateResponsePayloadType
+                              version: 0.0.1
+                            optional: false
+                        - key: status
+                          value:
+                            key: status
+                            fieldSchemaKey:
+                              name: CDSResponseStatusType
+                              version: 0.0.1
+                            optional: false
+                      outputFields:
+                        entry:
+                        - key: status
+                          value:
+                            key: status
+                            fieldSchemaKey:
+                              name: SubscriptionStatusType
+                              version: 0.0.1
+                            optional: false
+                      taskParameters:
+                        entry: []
+                      contextAlbumReference:
+                      - name: PMSubscriptionAlbum
+                        version: 0.0.1
+                      taskLogic:
+                        key: TaskLogic
+                        logicFlavour: JAVASCRIPT
+                        logic: |-
+                          /*
+                           * ============LICENSE_START=======================================================
+                           *  Copyright (C) 2020 Nordix. All rights reserved.
+                           * ================================================================================
+                           * Licensed under the Apache License, Version 2.0 (the "License");
+                           * you may not use this file except in compliance with the License.
+                           * You may obtain a copy of the License at
+                           *
+                           *      http://www.apache.org/licenses/LICENSE-2.0
+                           *
+                           * Unless required by applicable law or agreed to in writing, software
+                           * distributed under the License is distributed on an "AS IS" BASIS,
+                           * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+                           * See the License for the specific language governing permissions and
+                           * limitations under the License.
+                           *
+                           * SPDX-License-Identifier: Apache-2.0
+                           * ============LICENSE_END=========================================================
+                           */
+
+                          executor.logger.info(executor.subject.id);
+
+                          var commonHeader = executor.inFields.get("commonHeader")
+                          var response = executor.inFields.get("payload")
+                          var albumID = commonHeader.get("requestId")
+
+                          var pmSubscriptionInfo = executor.getContextAlbum("PMSubscriptionAlbum").get(albumID.toString());
+                          var responseStatus = executor.subject.getOutFieldSchemaHelper("status").createNewInstance();
+
+                          responseStatus.put("subscriptionName", pmSubscriptionInfo.get("subscription").get("subscriptionName"))
+                          responseStatus.put("nfName", pmSubscriptionInfo.get("nfName"))
+                          responseStatus.put("changeType", pmSubscriptionInfo.get("changeType"))
+
+                          var status = response.get(pmSubscriptionInfo.get("changeType").toLowerCase() + "_DasH_subscription_DasH_response").get("odl_DasH_response").get("status")
+
+                          executor.logger.info("RESPONSE STATUS = " + status)
+
+                          if(status == "success") {
+                              responseStatus.put("message", "success")
+                          } else {
+                              responseStatus.put("message", "failed")
+                          }
+
+                          executor.outFields.put("status", responseStatus)
+
+                          //var returnValue = executor.isTrue;
+                          true;
+                  - key:
+                      name: CDSDeleteResponseTask
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSDeleteResponseTask
+                        version: 0.0.1
+                      inputFields:
+                        entry:
+                        - key: actionIdentifiers
+                          value:
+                            key: actionIdentifiers
+                            fieldSchemaKey:
+                              name: CDSActionIdentifiersType
+                              version: 0.0.1
+                            optional: false
+                        - key: commonHeader
+                          value:
+                            key: commonHeader
+                            fieldSchemaKey:
+                              name: CDSResponseCommonHeaderType
+                              version: 0.0.1
+                            optional: false
+                        - key: payload
+                          value:
+                            key: payload
+                            fieldSchemaKey:
+                              name: CDSDeleteResponsePayloadType
+                              version: 0.0.1
+                            optional: false
+                        - key: status
+                          value:
+                            key: status
+                            fieldSchemaKey:
+                              name: CDSResponseStatusType
+                              version: 0.0.1
+                            optional: false
+                      outputFields:
+                        entry:
+                        - key: status
+                          value:
+                            key: status
+                            fieldSchemaKey:
+                              name: SubscriptionStatusType
+                              version: 0.0.1
+                            optional: false
+                      taskParameters:
+                        entry: []
+                      contextAlbumReference:
+                      - name: PMSubscriptionAlbum
+                        version: 0.0.1
+                      taskLogic:
+                        key: TaskLogic
+                        logicFlavour: JAVASCRIPT
+                        logic: |-
+                          /*
+                           * ============LICENSE_START=======================================================
+                           *  Copyright (C) 2020 Nordix. All rights reserved.
+                           * ================================================================================
+                           * Licensed under the Apache License, Version 2.0 (the "License");
+                           * you may not use this file except in compliance with the License.
+                           * You may obtain a copy of the License at
+                           *
+                           *      http://www.apache.org/licenses/LICENSE-2.0
+                           *
+                           * Unless required by applicable law or agreed to in writing, software
+                           * distributed under the License is distributed on an "AS IS" BASIS,
+                           * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+                           * See the License for the specific language governing permissions and
+                           * limitations under the License.
+                           *
+                           * SPDX-License-Identifier: Apache-2.0
+                           * ============LICENSE_END=========================================================
+                           */
+
+                          executor.logger.info(executor.subject.id);
+
+                          var commonHeader = executor.inFields.get("commonHeader")
+                          var response = executor.inFields.get("payload")
+                          var albumID = commonHeader.get("requestId")
+
+                          var pmSubscriptionInfo = executor.getContextAlbum("PMSubscriptionAlbum").get(albumID.toString());
+                          var responseStatus = executor.subject.getOutFieldSchemaHelper("status").createNewInstance();
+
+                          responseStatus.put("subscriptionName", pmSubscriptionInfo.get("subscription").get("subscriptionName"))
+                          responseStatus.put("nfName", pmSubscriptionInfo.get("nfName"))
+                          responseStatus.put("changeType", pmSubscriptionInfo.get("changeType"))
+
+                          var status = response.get(pmSubscriptionInfo.get("changeType").toLowerCase() + "_DasH_subscription_DasH_response").get("odl_DasH_response").get("status")
+
+                          executor.logger.info("RESPONSE STATUS = " + status)
+
+                          if(status == "success") {
+                              responseStatus.put("message", "success")
+                          } else {
+                              responseStatus.put("message", "failed")
+                          }
+
+                          executor.outFields.put("status", responseStatus)
+
+                          //var returnValue = executor.isTrue;
+                          true;
+                  - key:
+                      name: CreateSubscriptionPayloadTask
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CreateSubscriptionPayloadTask
+                        version: 0.0.1
+                      inputFields:
+                        entry:
+                        - key: albumID
+                          value:
+                            key: albumID
+                            fieldSchemaKey:
+                              name: UUIDType
+                              version: 0.0.1
+                            optional: false
+                      outputFields:
+                        entry:
+                        - key: albumID
+                          value:
+                            key: albumID
+                            fieldSchemaKey:
+                              name: UUIDType
+                              version: 0.0.1
+                            optional: false
+                        - key: payload
+                          value:
+                            key: payload
+                            fieldSchemaKey:
+                              name: CDSCreateSubscriptionPayloadType
+                              version: 0.0.1
+                            optional: false
+                      taskParameters:
+                        entry: []
+                      contextAlbumReference:
+                      - name: PMSubscriptionAlbum
+                        version: 0.0.1
+                      taskLogic:
+                        key: TaskLogic
+                        logicFlavour: JAVASCRIPT
+                        logic: |-
+                          /*
+                           * ============LICENSE_START=======================================================
+                           *  Copyright (C) 2020 Nordix. All rights reserved.
+                           * ================================================================================
+                           * Licensed under the Apache License, Version 2.0 (the "License");
+                           * you may not use this file except in compliance with the License.
+                           * You may obtain a copy of the License at
+                           *
+                           *      http://www.apache.org/licenses/LICENSE-2.0
+                           *
+                           * Unless required by applicable law or agreed to in writing, software
+                           * distributed under the License is distributed on an "AS IS" BASIS,
+                           * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+                           * See the License for the specific language governing permissions and
+                           * limitations under the License.
+                           *
+                           * SPDX-License-Identifier: Apache-2.0
+                           * ============LICENSE_END=========================================================
+                           */
+
+                          executor.logger.info(executor.subject.id);
+
+                          var pmSubscriptionInfo = executor.getContextAlbum("PMSubscriptionAlbum").get(executor.inFields.get("albumID").toString())
+
+                          var changeType = pmSubscriptionInfo.get("changeType").toLowerCase()
+
+                          var payloadProperties = executor.subject.getOutFieldSchemaHelper("payload").createNewSubInstance(changeType + "_DasH_subscription_DasH_properties_record");
+
+                          payloadProperties.put("nfName",  pmSubscriptionInfo.get("nfName"))
+                          payloadProperties.put("subscriptionName",  pmSubscriptionInfo.get("subscription").get("subscriptionName"))
+                          payloadProperties.put("administrativeState", pmSubscriptionInfo.get("subscription").get("administrativeState"))
+                          payloadProperties.put("fileBasedGP",  pmSubscriptionInfo.get("subscription").get("fileBasedGP").toString())
+                          payloadProperties.put("fileLocation", pmSubscriptionInfo.get("subscription").get("fileLocation"))
+                          payloadProperties.put("measurementGroups", pmSubscriptionInfo.get("subscription").get("measurementGroups"))
+
+                          var payloadEntry = executor.subject.getOutFieldSchemaHelper("payload").createNewSubInstance("CDSRequestPayloadEntry");
+                          payloadEntry.put(changeType + "_DasH_subscription_DasH_properties", payloadProperties)
+
+                          var payload = executor.subject.getOutFieldSchemaHelper("payload").createNewInstance();
+                          payload.put(changeType + "_DasH_subscription_DasH_request", payloadEntry);
+
+                          executor.outFields.put("albumID", executor.inFields.get("albumID"))
+                          executor.outFields.put("payload", payload);
+
+                          //var returnValue = executor.isTrue;
+                          true;
+                  - key:
+                      name: CreateSubscriptionRequestTask
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CreateSubscriptionRequestTask
+                        version: 0.0.1
+                      inputFields:
+                        entry:
+                        - key: albumID
+                          value:
+                            key: albumID
+                            fieldSchemaKey:
+                              name: UUIDType
+                              version: 0.0.1
+                            optional: false
+                        - key: payload
+                          value:
+                            key: payload
+                            fieldSchemaKey:
+                              name: CDSCreateSubscriptionPayloadType
+                              version: 0.0.1
+                            optional: false
+                      outputFields:
+                        entry:
+                        - key: actionIdentifiers
+                          value:
+                            key: actionIdentifiers
+                            fieldSchemaKey:
+                              name: CDSActionIdentifiersType
+                              version: 0.0.1
+                            optional: false
+                        - key: commonHeader
+                          value:
+                            key: commonHeader
+                            fieldSchemaKey:
+                              name: CDSRequestCommonHeaderType
+                              version: 0.0.1
+                            optional: false
+                        - key: payload
+                          value:
+                            key: payload
+                            fieldSchemaKey:
+                              name: CDSCreateSubscriptionPayloadType
+                              version: 0.0.1
+                            optional: false
+                      taskParameters:
+                        entry: []
+                      contextAlbumReference:
+                      - name: PMSubscriptionAlbum
+                        version: 0.0.1
+                      taskLogic:
+                        key: TaskLogic
+                        logicFlavour: JAVASCRIPT
+                        logic: |-
+                          /*
+                           * ============LICENSE_START=======================================================
+                           *  Copyright (C) 2020 Nordix. All rights reserved.
+                           * ================================================================================
+                           * Licensed under the Apache License, Version 2.0 (the "License");
+                           * you may not use this file except in compliance with the License.
+                           * You may obtain a copy of the License at
+                           *
+                           *      http://www.apache.org/licenses/LICENSE-2.0
+                           *
+                           * Unless required by applicable law or agreed to in writing, software
+                           * distributed under the License is distributed on an "AS IS" BASIS,
+                           * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+                           * See the License for the specific language governing permissions and
+                           * limitations under the License.
+                           *
+                           * SPDX-License-Identifier: Apache-2.0
+                           * ============LICENSE_END=========================================================
+                           */
+
+                          executor.logger.info(executor.subject.id);
+
+                          var pmSubscriptionInfo = executor.getContextAlbum("PMSubscriptionAlbum").get(executor.inFields.get("albumID").toString())
+
+                          var changeType = pmSubscriptionInfo.get("changeType").toLowerCase()
+                          var blueprintName = pmSubscriptionInfo.get("blueprintName").toLowerCase()
+                          var blueprintVersion = pmSubscriptionInfo.get("blueprintVersion").toLowerCase()
+                          var payload = executor.inFields.get("payload")
+                          var actionName = changeType + "-subscription"
+
+                          var commonHeader = executor.subject.getOutFieldSchemaHelper("commonHeader").createNewInstance();
+                          commonHeader.put("originatorId", "sdnc");
+                          commonHeader.put("requestId", executor.inFields.get("albumID").toString());
+                          commonHeader.put("subRequestId", "sub-123456-1000");
+
+                          var actionIdentifiers = executor.subject.getOutFieldSchemaHelper("actionIdentifiers").createNewInstance();
+                          actionIdentifiers.put("actionName", actionName);
+                          actionIdentifiers.put("blueprintName", blueprintName);
+                          actionIdentifiers.put("blueprintVersion", blueprintVersion);
+                          actionIdentifiers.put("mode", "sync");
+
+                          executor.outFields.put("commonHeader", commonHeader);
+                          executor.outFields.put("actionIdentifiers", actionIdentifiers);
+                          executor.outFields.put("payload", payload);
+
+                          //var returnValue = executor.isTrue;
+                          true;
+                  - key:
+                      name: DeleteSubscriptionPayloadTask
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: DeleteSubscriptionPayloadTask
+                        version: 0.0.1
+                      inputFields:
+                        entry:
+                        - key: albumID
+                          value:
+                            key: albumID
+                            fieldSchemaKey:
+                              name: UUIDType
+                              version: 0.0.1
+                            optional: false
+                      outputFields:
+                        entry:
+                        - key: albumID
+                          value:
+                            key: albumID
+                            fieldSchemaKey:
+                              name: UUIDType
+                              version: 0.0.1
+                            optional: false
+                        - key: payload
+                          value:
+                            key: payload
+                            fieldSchemaKey:
+                              name: CDSDeleteSubscriptionPayloadType
+                              version: 0.0.1
+                            optional: false
+                      taskParameters:
+                        entry: []
+                      contextAlbumReference:
+                      - name: PMSubscriptionAlbum
+                        version: 0.0.1
+                      taskLogic:
+                        key: TaskLogic
+                        logicFlavour: JAVASCRIPT
+                        logic: |-
+                          /*
+                           * ============LICENSE_START=======================================================
+                           *  Copyright (C) 2020 Nordix. All rights reserved.
+                           * ================================================================================
+                           * Licensed under the Apache License, Version 2.0 (the "License");
+                           * you may not use this file except in compliance with the License.
+                           * You may obtain a copy of the License at
+                           *
+                           *      http://www.apache.org/licenses/LICENSE-2.0
+                           *
+                           * Unless required by applicable law or agreed to in writing, software
+                           * distributed under the License is distributed on an "AS IS" BASIS,
+                           * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+                           * See the License for the specific language governing permissions and
+                           * limitations under the License.
+                           *
+                           * SPDX-License-Identifier: Apache-2.0
+                           * ============LICENSE_END=========================================================
+                           */
+
+                          executor.logger.info(executor.subject.id);
+
+                          var pmSubscriptionInfo = executor.getContextAlbum("PMSubscriptionAlbum").get(executor.inFields.get("albumID").toString())
+
+                          var changeType = pmSubscriptionInfo.get("changeType").toLowerCase()
+
+                          var payloadProperties = executor.subject.getOutFieldSchemaHelper("payload").createNewSubInstance(changeType + "_DasH_subscription_DasH_properties_record");
+
+                          payloadProperties.put("nfName",  pmSubscriptionInfo.get("nfName"))
+                          payloadProperties.put("subscriptionName",  pmSubscriptionInfo.get("subscription").get("subscriptionName"))
+                          payloadProperties.put("administrativeState", pmSubscriptionInfo.get("subscription").get("administrativeState"))
+                          payloadProperties.put("fileBasedGP",  pmSubscriptionInfo.get("subscription").get("fileBasedGP").toString())
+                          payloadProperties.put("fileLocation", pmSubscriptionInfo.get("subscription").get("fileLocation"))
+                          payloadProperties.put("measurementGroups", pmSubscriptionInfo.get("subscription").get("measurementGroups"))
+
+                          var payloadEntry = executor.subject.getOutFieldSchemaHelper("payload").createNewSubInstance("CDSRequestPayloadEntry");
+                          payloadEntry.put(changeType + "_DasH_subscription_DasH_properties", payloadProperties)
+
+                          var payload = executor.subject.getOutFieldSchemaHelper("payload").createNewInstance();
+                          payload.put(changeType + "_DasH_subscription_DasH_request", payloadEntry);
+
+                          executor.outFields.put("albumID", executor.inFields.get("albumID"))
+                          executor.outFields.put("payload", payload);
+
+                          //var returnValue = executor.isTrue;
+                          true;
+                  - key:
+                      name: DeleteSubscriptionRequestTask
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: DeleteSubscriptionRequestTask
+                        version: 0.0.1
+                      inputFields:
+                        entry:
+                        - key: albumID
+                          value:
+                            key: albumID
+                            fieldSchemaKey:
+                              name: UUIDType
+                              version: 0.0.1
+                            optional: false
+                        - key: payload
+                          value:
+                            key: payload
+                            fieldSchemaKey:
+                              name: CDSDeleteSubscriptionPayloadType
+                              version: 0.0.1
+                            optional: false
+                      outputFields:
+                        entry:
+                        - key: actionIdentifiers
+                          value:
+                            key: actionIdentifiers
+                            fieldSchemaKey:
+                              name: CDSActionIdentifiersType
+                              version: 0.0.1
+                            optional: false
+                        - key: commonHeader
+                          value:
+                            key: commonHeader
+                            fieldSchemaKey:
+                              name: CDSRequestCommonHeaderType
+                              version: 0.0.1
+                            optional: false
+                        - key: payload
+                          value:
+                            key: payload
+                            fieldSchemaKey:
+                              name: CDSDeleteSubscriptionPayloadType
+                              version: 0.0.1
+                            optional: false
+                      taskParameters:
+                        entry: []
+                      contextAlbumReference:
+                      - name: PMSubscriptionAlbum
+                        version: 0.0.1
+                      taskLogic:
+                        key: TaskLogic
+                        logicFlavour: JAVASCRIPT
+                        logic: |-
+                          /*
+                           * ============LICENSE_START=======================================================
+                           *  Copyright (C) 2020 Nordix. All rights reserved.
+                           * ================================================================================
+                           * Licensed under the Apache License, Version 2.0 (the "License");
+                           * you may not use this file except in compliance with the License.
+                           * You may obtain a copy of the License at
+                           *
+                           *      http://www.apache.org/licenses/LICENSE-2.0
+                           *
+                           * Unless required by applicable law or agreed to in writing, software
+                           * distributed under the License is distributed on an "AS IS" BASIS,
+                           * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+                           * See the License for the specific language governing permissions and
+                           * limitations under the License.
+                           *
+                           * SPDX-License-Identifier: Apache-2.0
+                           * ============LICENSE_END=========================================================
+                           */
+
+                          executor.logger.info(executor.subject.id);
+
+                          var pmSubscriptionInfo = executor.getContextAlbum("PMSubscriptionAlbum").get(executor.inFields.get("albumID").toString())
+
+                          var changeType = pmSubscriptionInfo.get("changeType").toLowerCase()
+                          var blueprintName = pmSubscriptionInfo.get("blueprintName").toLowerCase()
+                          var blueprintVersion = pmSubscriptionInfo.get("blueprintVersion").toLowerCase()
+                          var payload = executor.inFields.get("payload")
+                          var actionName = changeType + "-subscription"
+
+                          var commonHeader = executor.subject.getOutFieldSchemaHelper("commonHeader").createNewInstance();
+                          commonHeader.put("originatorId", "sdnc");
+                          commonHeader.put("requestId", executor.inFields.get("albumID").toString());
+                          commonHeader.put("subRequestId", "sub-123456-1000");
+
+                          var actionIdentifiers = executor.subject.getOutFieldSchemaHelper("actionIdentifiers").createNewInstance();
+                          actionIdentifiers.put("actionName", actionName);
+                          actionIdentifiers.put("blueprintName", blueprintName);
+                          actionIdentifiers.put("blueprintVersion", blueprintVersion);
+                          actionIdentifiers.put("mode", "sync");
+
+                          executor.outFields.put("commonHeader", commonHeader);
+                          executor.outFields.put("actionIdentifiers", actionIdentifiers);
+                          executor.outFields.put("payload", payload);
+
+                          //var returnValue = executor.isTrue;
+                          true;
+                  - key:
+                      name: ReceiveSubscriptionTask
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: ReceiveSubscriptionTask
+                        version: 0.0.1
+                      inputFields:
+                        entry:
+                        - key: blueprintName
+                          value:
+                            key: blueprintName
+                            fieldSchemaKey:
+                              name: SimpleStringType
+                              version: 0.0.1
+                            optional: false
+                        - key: blueprintVersion
+                          value:
+                            key: blueprintVersion
+                            fieldSchemaKey:
+                              name: SimpleStringType
+                              version: 0.0.1
+                            optional: false
+                        - key: changeType
+                          value:
+                            key: changeType
+                            fieldSchemaKey:
+                              name: SimpleStringType
+                              version: 0.0.1
+                            optional: false
+                        - key: closedLoopControlName
+                          value:
+                            key: closedLoopControlName
+                            fieldSchemaKey:
+                              name: SimpleStringType
+                              version: 0.0.1
+                            optional: false
+                        - key: nfName
+                          value:
+                            key: nfName
+                            fieldSchemaKey:
+                              name: SimpleStringType
+                              version: 0.0.1
+                            optional: false
+                        - key: policyName
+                          value:
+                            key: policyName
+                            fieldSchemaKey:
+                              name: SimpleStringType
+                              version: 0.0.1
+                            optional: false
+                        - key: subscription
+                          value:
+                            key: subscription
+                            fieldSchemaKey:
+                              name: SubscriptionType
+                              version: 0.0.1
+                            optional: false
+                      outputFields:
+                        entry:
+                        - key: albumID
+                          value:
+                            key: albumID
+                            fieldSchemaKey:
+                              name: UUIDType
+                              version: 0.0.1
+                            optional: false
+                      taskParameters:
+                        entry: []
+                      contextAlbumReference:
+                      - name: PMSubscriptionAlbum
+                        version: 0.0.1
+                      taskLogic:
+                        key: TaskLogic
+                        logicFlavour: JAVASCRIPT
+                        logic: |-
+                          /*
+                           * ============LICENSE_START=======================================================
+                           *  Copyright (C) 2020 Nordix. All rights reserved.
+                           * ================================================================================
+                           * Licensed under the Apache License, Version 2.0 (the "License");
+                           * you may not use this file except in compliance with the License.
+                           * You may obtain a copy of the License at
+                           *
+                           *      http://www.apache.org/licenses/LICENSE-2.0
+                           *
+                           * Unless required by applicable law or agreed to in writing, software
+                           * distributed under the License is distributed on an "AS IS" BASIS,
+                           * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+                           * See the License for the specific language governing permissions and
+                           * limitations under the License.
+                           *
+                           * SPDX-License-Identifier: Apache-2.0
+                           * ============LICENSE_END=========================================================
+                           */
+                          var uuidType = java.util.UUID;
+
+                          executor.logger.info(executor.subject.id);
+
+                          //albumID will be used to fetch info from our album later
+                          var albumID = uuidType.randomUUID();
+                          var pmSubscriptionInfo = executor.getContextAlbum("PMSubscriptionAlbum").getSchemaHelper().createNewInstance();
+                          var returnValue = true;
+
+                          if(executor.inFields.get("policyName") != null) {
+                              executor.logger.info("nfName in receive sub event " + executor.inFields.get("nfName"));
+
+                              var changeType = executor.inFields.get("changeType")
+                              var nfName = executor.inFields.get("nfName")
+                              var policyName = executor.inFields.get("policyName")
+                              var closedLoopControlName = executor.inFields.get("closedLoopControlName")
+                              var subscription = executor.inFields.get("subscription")
+                              var blueprintName = executor.inFields.get("blueprintName")
+                              var blueprintVersion = executor.inFields.get("blueprintVersion")
+
+                              pmSubscriptionInfo.put("nfName", executor.inFields.get("nfName"));
+                              pmSubscriptionInfo.put("changeType", executor.inFields.get("changeType"))
+                              pmSubscriptionInfo.put("policyName", executor.inFields.get("policyName"))
+                              pmSubscriptionInfo.put("closedLoopControlName", executor.inFields.get("closedLoopControlName"))
+                              pmSubscriptionInfo.put("subscription", subscription)
+                              pmSubscriptionInfo.put("blueprintName", blueprintName)
+                              pmSubscriptionInfo.put("blueprintVersion", blueprintVersion)
+
+
+                              executor.getContextAlbum("PMSubscriptionAlbum").put(albumID.toString(), pmSubscriptionInfo);
+
+                              executor.outFields.put("albumID", albumID)
+                          } else {
+                              executor.message = "Received invalid event"
+                              returnValue = false;
+                          }
+
+                          returnValue;
+              events:
+                key:
+                  name: PMControlPolicy_Events
+                  version: 0.0.1
+                eventMap:
+                  entry:
+                  - key:
+                      name: CDSCreateResponseEvent
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSCreateResponseEvent
+                        version: 0.0.1
+                      nameSpace: org.onap.policy.apex.onap.pmcontrol
+                      source: CDS
+                      target: APEX
+                      parameter:
+                        entry:
+                        - key: actionIdentifiers
+                          value:
+                            key: actionIdentifiers
+                            fieldSchemaKey:
+                              name: CDSActionIdentifiersType
+                              version: 0.0.1
+                            optional: false
+                        - key: commonHeader
+                          value:
+                            key: commonHeader
+                            fieldSchemaKey:
+                              name: CDSResponseCommonHeaderType
+                              version: 0.0.1
+                            optional: false
+                        - key: payload
+                          value:
+                            key: payload
+                            fieldSchemaKey:
+                              name: CDSCreateResponsePayloadType
+                              version: 0.0.1
+                            optional: false
+                        - key: status
+                          value:
+                            key: status
+                            fieldSchemaKey:
+                              name: CDSResponseStatusType
+                              version: 0.0.1
+                            optional: false
+                  - key:
+                      name: CDSCreateSubscriptionRequestEvent
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSCreateSubscriptionRequestEvent
+                        version: 0.0.1
+                      nameSpace: org.onap.policy.apex.onap.pmcontrol
+                      source: APEX
+                      target: APEX
+                      parameter:
+                        entry:
+                        - key: actionIdentifiers
+                          value:
+                            key: actionIdentifiers
+                            fieldSchemaKey:
+                              name: CDSActionIdentifiersType
+                              version: 0.0.1
+                            optional: false
+                        - key: commonHeader
+                          value:
+                            key: commonHeader
+                            fieldSchemaKey:
+                              name: CDSRequestCommonHeaderType
+                              version: 0.0.1
+                            optional: false
+                        - key: payload
+                          value:
+                            key: payload
+                            fieldSchemaKey:
+                              name: CDSCreateSubscriptionPayloadType
+                              version: 0.0.1
+                            optional: false
+                  - key:
+                      name: CDSDeleteResponseEvent
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSDeleteResponseEvent
+                        version: 0.0.1
+                      nameSpace: org.onap.policy.apex.onap.pmcontrol
+                      source: CDS
+                      target: APEX
+                      parameter:
+                        entry:
+                        - key: actionIdentifiers
+                          value:
+                            key: actionIdentifiers
+                            fieldSchemaKey:
+                              name: CDSActionIdentifiersType
+                              version: 0.0.1
+                            optional: false
+                        - key: commonHeader
+                          value:
+                            key: commonHeader
+                            fieldSchemaKey:
+                              name: CDSResponseCommonHeaderType
+                              version: 0.0.1
+                            optional: false
+                        - key: payload
+                          value:
+                            key: payload
+                            fieldSchemaKey:
+                              name: CDSDeleteResponsePayloadType
+                              version: 0.0.1
+                            optional: false
+                        - key: status
+                          value:
+                            key: status
+                            fieldSchemaKey:
+                              name: CDSResponseStatusType
+                              version: 0.0.1
+                            optional: false
+                  - key:
+                      name: CDSDeleteSubscriptionRequestEvent
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSDeleteSubscriptionRequestEvent
+                        version: 0.0.1
+                      nameSpace: org.onap.policy.apex.onap.pmcontrol
+                      source: APEX
+                      target: APEX
+                      parameter:
+                        entry:
+                        - key: actionIdentifiers
+                          value:
+                            key: actionIdentifiers
+                            fieldSchemaKey:
+                              name: CDSActionIdentifiersType
+                              version: 0.0.1
+                            optional: false
+                        - key: commonHeader
+                          value:
+                            key: commonHeader
+                            fieldSchemaKey:
+                              name: CDSRequestCommonHeaderType
+                              version: 0.0.1
+                            optional: false
+                        - key: payload
+                          value:
+                            key: payload
+                            fieldSchemaKey:
+                              name: CDSDeleteSubscriptionPayloadType
+                              version: 0.0.1
+                            optional: false
+                  - key:
+                      name: CDSResponseStatusEvent
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSResponseStatusEvent
+                        version: 0.0.1
+                      nameSpace: org.onap.policy.apex.onap.pmcontrol
+                      source: APEX
+                      target: DCAE
+                      parameter:
+                        entry:
+                        - key: status
+                          value:
+                            key: status
+                            fieldSchemaKey:
+                              name: SubscriptionStatusType
+                              version: 0.0.1
+                            optional: false
+                  - key:
+                      name: CreateSubscriptionPayloadEvent
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CreateSubscriptionPayloadEvent
+                        version: 0.0.1
+                      nameSpace: org.onap.policy.apex.onap.pmcontrol
+                      source: APEX
+                      target: APEX
+                      parameter:
+                        entry:
+                        - key: albumID
+                          value:
+                            key: albumID
+                            fieldSchemaKey:
+                              name: UUIDType
+                              version: 0.0.1
+                            optional: false
+                        - key: payload
+                          value:
+                            key: payload
+                            fieldSchemaKey:
+                              name: CDSCreateSubscriptionPayloadType
+                              version: 0.0.1
+                            optional: false
+                  - key:
+                      name: DeleteSubscriptionPayloadEvent
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: DeleteSubscriptionPayloadEvent
+                        version: 0.0.1
+                      nameSpace: org.onap.policy.apex.onap.pmcontrol
+                      source: APEX
+                      target: APEX
+                      parameter:
+                        entry:
+                        - key: albumID
+                          value:
+                            key: albumID
+                            fieldSchemaKey:
+                              name: UUIDType
+                              version: 0.0.1
+                            optional: false
+                        - key: payload
+                          value:
+                            key: payload
+                            fieldSchemaKey:
+                              name: CDSDeleteSubscriptionPayloadType
+                              version: 0.0.1
+                            optional: false
+                  - key:
+                      name: MRResponseEvent
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: MRResponseEvent
+                        version: 0.0.1
+                      nameSpace: org.onap.policy.apex.onap.pmcontrol
+                      source: DCAE
+                      target: APEX
+                      parameter:
+                        entry:
+                        - key: count
+                          value:
+                            key: count
+                            fieldSchemaKey:
+                              name: SimpleIntType
+                              version: 0.0.1
+                            optional: false
+                        - key: serverTimeMs
+                          value:
+                            key: serverTimeMs
+                            fieldSchemaKey:
+                              name: SimpleIntType
+                              version: 0.0.1
+                            optional: false
+                  - key:
+                      name: PMSubscriptionOutputEvent
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: PMSubscriptionOutputEvent
+                        version: 0.0.1
+                      nameSpace: org.onap.policy.apex.onap.pmcontrol
+                      source: APEX
+                      target: APEX
+                      parameter:
+                        entry:
+                        - key: albumID
+                          value:
+                            key: albumID
+                            fieldSchemaKey:
+                              name: UUIDType
+                              version: 0.0.1
+                            optional: false
+                  - key:
+                      name: pmsh-operational-policy
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: pmsh-operational-policy
+                        version: 0.0.1
+                      nameSpace: org.onap.policy.apex.onap.pmcontrol
+                      source: DCAE
+                      target: APEX
+                      parameter:
+                        entry:
+                        - key: blueprintName
+                          value:
+                            key: blueprintName
+                            fieldSchemaKey:
+                              name: SimpleStringType
+                              version: 0.0.1
+                            optional: false
+                        - key: blueprintVersion
+                          value:
+                            key: blueprintVersion
+                            fieldSchemaKey:
+                              name: SimpleStringType
+                              version: 0.0.1
+                            optional: false
+                        - key: changeType
+                          value:
+                            key: changeType
+                            fieldSchemaKey:
+                              name: SimpleStringType
+                              version: 0.0.1
+                            optional: false
+                        - key: closedLoopControlName
+                          value:
+                            key: closedLoopControlName
+                            fieldSchemaKey:
+                              name: SimpleStringType
+                              version: 0.0.1
+                            optional: false
+                        - key: nfName
+                          value:
+                            key: nfName
+                            fieldSchemaKey:
+                              name: SimpleStringType
+                              version: 0.0.1
+                            optional: false
+                        - key: policyName
+                          value:
+                            key: policyName
+                            fieldSchemaKey:
+                              name: SimpleStringType
+                              version: 0.0.1
+                            optional: false
+                        - key: subscription
+                          value:
+                            key: subscription
+                            fieldSchemaKey:
+                              name: SubscriptionType
+                              version: 0.0.1
+                            optional: false
+              albums:
+                key:
+                  name: PMControlPolicy_Albums
+                  version: 0.0.1
+                albums:
+                  entry:
+                  - key:
+                      name: PMSubscriptionAlbum
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: PMSubscriptionAlbum
+                        version: 0.0.1
+                      scope: policy
+                      isWritable: true
+                      itemSchema:
+                        name: PMSubscriptionType
+                        version: 0.0.1
+              schemas:
+                key:
+                  name: PMControlPolicy_Schemas
+                  version: 0.0.1
+                schemas:
+                  entry:
+                  - key:
+                      name: CDSActionIdentifiersType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSActionIdentifiersType
+                        version: 0.0.1
+                      schemaFlavour: Avro
+                      schemaDefinition: |-
+                        {
+                            "type": "record",
+                            "name": "ActionIdentifiers_Type",
+                            "namespace": "org.onap.policy.apex.onap.helloworld",
+                            "fields": [
+                                {
+                                    "name": "actionName",
+                                    "type": "string"
+                                },
+                                {
+                                    "name": "blueprintName",
+                                    "type": "string"
+                                },
+                                {
+                                    "name": "blueprintVersion",
+                                    "type": "string"
+                                },
+                                {
+                                    "name": "mode",
+                                    "type": "string"
+                                }
+                            ]
+                        }
+                  - key:
+                      name: CDSCreateResponsePayloadType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSCreateResponsePayloadType
+                        version: 0.0.1
+                      schemaFlavour: Avro
+                      schemaDefinition: |-
+                        {
+                          "name": "CreateResponsePayloadEntry",
+                          "type": "record",
+                          "namespace": "org.onap.policy.apex.onap.helloworld",
+                          "fields": [
+                            {
+                              "name": "create_DasH_subscription_DasH_response",
+                              "type": {
+                                "name": "create_DasH_subscription_DasH_response",
+                                "type": "record",
+                                "fields": [
+                                  {
+                                    "name": "odl_DasH_response",
+                                    "type": {
+                                      "name": "odl_DasH_response",
+                                      "type": "record",
+                                      "fields": [
+                                          {
+                                            "name": "status",
+                                            "type": "string"
+                                          }
+                                      ]
+                                    }
+                                  }
+                                ]
+                              }
+                            }
+                          ]
+                        }
+                  - key:
+                      name: CDSCreateSubscriptionPayloadType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSCreateSubscriptionPayloadType
+                        version: 0.0.1
+                      schemaFlavour: Avro
+                      schemaDefinition: |-
+                        {
+                          "type": "map",
+                          "values": {
+                            "type": "record",
+                            "name": "CDSRequestPayloadEntry",
+                            "fields": [
+                              {
+                                "name": "create_DasH_subscription_DasH_properties",
+                                "type": {
+                                  "name": "create_DasH_subscription_DasH_properties_record",
+                                  "type": "record",
+                                  "fields": [
+                                    {
+                                      "name": "nfName",
+                                      "type": "string"
+                                    },
+                                    {
+                                      "name": "subscriptionName",
+                                      "type": "string"
+                                    },
+                                    {
+                                      "name": "administrativeState",
+                                      "type": "string"
+                                    },
+                                    {
+                                      "name": "fileBasedGP",
+                                      "type": "string"
+                                    },
+                                    {
+                                      "name": "fileLocation",
+                                      "type": "string"
+                                    },
+                                    {
+                                      "name": "measurementGroups",
+                                      "type": {
+                                        "type": "array",
+                                        "items": {
+                                          "name": "measurementGroups_record",
+                                          "type": "record",
+                                          "fields": [
+                                            {
+                                              "name": "measurementGroup",
+                                              "type": {
+                                                "name": "measurementGroup",
+                                                "type": "record",
+                                                "fields": [
+                                                  {
+                                                    "name": "measurementTypes",
+                                                    "type": {
+                                                      "type": "array",
+                                                      "items": {
+                                                        "name": "measurementTypes_record",
+                                                        "type": "record",
+                                                        "fields": [
+                                                          {
+                                                            "name": "measurementType",
+                                                            "type": "string"
+                                                          }
+                                                        ]
+                                                      }
+                                                    }
+                                                  },
+                                                  {
+                                                    "name": "managedObjectDNsBasic",
+                                                    "type": {
+                                                      "type": "array",
+                                                      "items": {
+                                                        "name": "managedObjectDNsBasic_record",
+                                                        "type": "record",
+                                                        "fields": [
+                                                          {
+                                                            "name": "DN",
+                                                            "type": "string"
+                                                          }
+                                                        ]
+                                                      }
+                                                    }
+                                                  }
+                                                ]
+                                              }
+                                            }
+                                          ]
+                                        }
+                                      }
+                                    }
+                                  ]
+                                }
+                              }
+                            ]
+                          }
+                        }
+                  - key:
+                      name: CDSDeleteResponsePayloadType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSDeleteResponsePayloadType
+                        version: 0.0.1
+                      schemaFlavour: Avro
+                      schemaDefinition: |-
+                        {
+                          "name": "DeleteResponsePayloadEntry",
+                          "type": "record",
+                          "namespace": "com.acme.avro",
+                          "fields": [
+                            {
+                              "name": "delete_DasH_subscription_DasH_response",
+                              "type": {
+                                "name": "delete_DasH_subscription_DasH_response",
+                                "type": "record",
+                                "fields": [
+                                  {
+                                    "name": "odl_DasH_response",
+                                    "type": {
+                                      "name": "odl_DasH_response",
+                                      "type": "record",
+                                      "fields": [
+                                          {
+                                            "name": "status",
+                                            "type": "string"
+                                          }
+                                      ]
+                                    }
+                                  }
+                                ]
+                              }
+                            }
+                          ]
+                        }
+                  - key:
+                      name: CDSDeleteSubscriptionPayloadType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSDeleteSubscriptionPayloadType
+                        version: 0.0.1
+                      schemaFlavour: Avro
+                      schemaDefinition: |-
+                        {
+                          "type": "map",
+                          "values": {
+                            "type": "record",
+                            "name": "CDSRequestPayloadEntry",
+                            "fields": [
+                              {
+                                "name": "delete_DasH_subscription_DasH_properties",
+                                "type": {
+                                  "name": "delete_DasH_subscription_DasH_properties_record",
+                                  "type": "record",
+                                  "fields": [
+                                    {
+                                      "name": "nfName",
+                                      "type": "string"
+                                    },
+                                    {
+                                      "name": "subscriptionName",
+                                      "type": "string"
+                                    },
+                                    {
+                                      "name": "administrativeState",
+                                      "type": "string"
+                                    },
+                                    {
+                                      "name": "fileBasedGP",
+                                      "type": "string"
+                                    },
+                                    {
+                                      "name": "fileLocation",
+                                      "type": "string"
+                                    },
+                                    {
+                                      "name": "measurementGroups",
+                                      "type": {
+                                        "type": "array",
+                                        "items": {
+                                          "name": "measurementGroups_record",
+                                          "type": "record",
+                                          "fields": [
+                                            {
+                                              "name": "measurementGroup",
+                                              "type": {
+                                                "name": "measurementGroup",
+                                                "type": "record",
+                                                "fields": [
+                                                  {
+                                                    "name": "measurementTypes",
+                                                    "type": {
+                                                      "type": "array",
+                                                      "items": {
+                                                        "name": "measurementTypes_record",
+                                                        "type": "record",
+                                                        "fields": [
+                                                          {
+                                                            "name": "measurementType",
+                                                            "type": "string"
+                                                          }
+                                                        ]
+                                                      }
+                                                    }
+                                                  },
+                                                  {
+                                                    "name": "managedObjectDNsBasic",
+                                                    "type": {
+                                                      "type": "array",
+                                                      "items": {
+                                                        "name": "managedObjectDNsBasic_record",
+                                                        "type": "record",
+                                                        "fields": [
+                                                          {
+                                                            "name": "DN",
+                                                            "type": "string"
+                                                          }
+                                                        ]
+                                                      }
+                                                    }
+                                                  }
+                                                ]
+                                              }
+                                            }
+                                          ]
+                                        }
+                                      }
+                                    }
+                                  ]
+                                }
+                              }
+                            ]
+                          }
+                        }
+                  - key:
+                      name: CDSRequestCommonHeaderType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSRequestCommonHeaderType
+                        version: 0.0.1
+                      schemaFlavour: Avro
+                      schemaDefinition: |-
+                        {
+                            "type": "record",
+                            "name": "RequestCommonHeader_Type",
+                            "namespace": "org.onap.policy.apex.onap.helloworld",
+                            "fields": [
+                                {
+                                    "name": "originatorId",
+                                    "type": "string"
+                                },
+                                {
+                                    "name": "requestId",
+                                    "type": "string"
+                                },
+                                {
+                                    "name": "subRequestId",
+                                    "type": "string"
+                                }
+                            ]
+                        }
+                  - key:
+                      name: CDSResponseCommonHeaderType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSResponseCommonHeaderType
+                        version: 0.0.1
+                      schemaFlavour: Avro
+                      schemaDefinition: |-
+                        {
+                            "type": "record",
+                            "name": "ResponseCommonHeader_Type",
+                            "namespace": "org.onap.policy.apex.onap.helloworld",
+                            "fields": [
+                                {
+                                    "name": "originatorId",
+                                    "type": "string"
+                                },
+                                {
+                                    "name": "requestId",
+                                    "type": "string"
+                                },
+                                {
+                                    "name": "subRequestId",
+                                    "type": "string"
+                                },
+                                {
+                                    "name": "timestamp",
+                                    "type": "string"
+                                },
+                                {
+                                    "name": "flags",
+                                    "type": ["null", "string"]
+                                }
+                            ]
+                        }
+                  - key:
+                      name: CDSResponseStatusType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSResponseStatusType
+                        version: 0.0.1
+                      schemaFlavour: Avro
+                      schemaDefinition: |-
+                        {
+                            "type": "record",
+                            "name": "ResponseStatus_Type",
+                            "namespace": "org.onap.policy.apex.onap.helloworld",
+                            "fields": [
+                                {
+                                    "name": "code",
+                                    "type": "int"
+                                },
+                                {
+                                    "name": "eventType",
+                                    "type": "string"
+                                },
+                                {
+                                    "name": "timestamp",
+                                    "type": "string"
+                                },
+                                {
+                                    "name": "message",
+                                    "type": "string"
+                                }
+                            ]
+                        }
+                  - key:
+                      name: PMSubscriptionType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: PMSubscriptionType
+                        version: 0.0.1
+                      schemaFlavour: Avro
+                      schemaDefinition: "{\n\t\"name\": \"PMSubscription\",\n\t\"type\":
+                        \"record\",\n\t\"namespace\": \"org.onap.policy.apex.onap.pmcontrol\",\n\t\"fields\":
+                        [\n        {\n            \"name\": \"nfName\",\n            \"type\":
+                        \"string\"\n        },\n\t    {\n\t\t\t\"name\": \"changeType\",\n\t\t\t\"type\":
+                        \"string\"\n\t\t},\n\t\t{\n\t\t\t\"name\": \"closedLoopControlName\",\n\t\t\t\"type\":
+                        \"string\"\n\t\t},\n\t\t{\n\t\t\t\"name\": \"policyName\",\n\t\t\t\"type\":
+                        \"string\"\n\t\t},\n\t\t{\n\t\t    \"name\": \"blueprintName\",\n\t\t
+                        \   \"type\": \"string\"\n\t\t},\n\t\t{\n\t\t    \"name\":
+                        \"blueprintVersion\",\n\t\t    \"type\": \"string\"\n\t\t},\n\t\t{\n\t\t\t\"name\":
+                        \"subscription\",\n\t\t\t\"type\": {\n\t\t\t\t\"name\": \"subscription\",\n\t\t\t\t\"type\":
+                        \"record\",\n\t\t\t\t\"fields\": [{\n\t\t\t\t\t\t\"name\":
+                        \"subscriptionName\",\n\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"name\":
+                        \"administrativeState\",\n\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"name\":
+                        \"fileBasedGP\",\n\t\t\t\t\t\t\"type\": \"int\"\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"name\":
+                        \"fileLocation\",\n\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"name\":
+                        \"measurementGroups\",\n\t\t\t\t\t\t\"type\": {\n\t\t\t\t\t\t\t\"type\":
+                        \"array\",\n\t\t\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\t\t\"name\":
+                        \"Measurement_Groups_Type\",\n\t\t\t\t\t\t\t\t\"type\": \"record\",\n\t\t\t\t\t\t\t\t\"fields\":
+                        [{\n\t\t\t\t\t\t\t\t\t\"name\": \"measurementGroup\",\n\t\t\t\t\t\t\t\t\t\"type\":
+                        {\n\t\t\t\t\t\t\t\t\t\t\"name\": \"Measurement_Group_Type\",\n\t\t\t\t\t\t\t\t\t\t\"type\":
+                        \"record\",\n\t\t\t\t\t\t\t\t\t\t\"fields\": [{\n\t\t\t\t\t\t\t\t\t\t\t\t\"name\":
+                        \"measurementTypes\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"type\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"type\":
+                        \"array\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"name\":
+                        \"Measurement_Types_Type\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"type\":
+                        \"record\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"fields\": [{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"name\":
+                        \"measurementType\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"type\":
+                        \"string\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}]\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\"name\":
+                        \"managedObjectDNsBasic\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"type\":
+                        {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"type\": \"array\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"items\":
+                        {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"name\": \"Managed_Object_Dns_Basic_Type\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"type\":
+                        \"record\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"fields\": [{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"name\":
+                        \"DN\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}]\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}]\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}\n\t\t}\n\t]\n}"
+                  - key:
+                      name: SimpleIntType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: SimpleIntType
+                        version: 0.0.1
+                      schemaFlavour: Java
+                      schemaDefinition: java.lang.Integer
+                  - key:
+                      name: SimpleStringType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: SimpleStringType
+                        version: 0.0.1
+                      schemaFlavour: Java
+                      schemaDefinition: java.lang.String
+                  - key:
+                      name: SubscriptionStatusType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: SubscriptionStatusType
+                        version: 0.0.1
+                      schemaFlavour: Avro
+                      schemaDefinition: |-
+                        {
+                            "type": "record",
+                            "name": "ActivateSubscriptionStatus_Type",
+                            "namespace": "org.onap.policy.apex.onap.helloworld",
+                            "fields": [
+                                {
+                                    "name": "subscriptionName",
+                                    "type": "string"
+                                },
+                                {
+                                    "name": "nfName",
+                                    "type": "string"
+                                },
+                                {
+                                    "name": "changeType",
+                                    "type": "string"
+                                },
+                                {
+                                    "name": "message",
+                                    "type": "string"
+                                }
+                            ]
+                        }
+                  - key:
+                      name: SubscriptionType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: SubscriptionType
+                        version: 0.0.1
+                      schemaFlavour: Avro
+                      schemaDefinition: "{\n\t\"name\": \"subscription\",\n\t\"type\":
+                        \"record\",\n\t\"fields\": [{\n\t\t\t\"name\": \"subscriptionName\",\n\t\t\t\"type\":
+                        \"string\"\n\t\t},\n\t\t{\n\t\t\t\"name\": \"administrativeState\",\n\t\t\t\"type\":
+                        \"string\"\n\t\t},\n\t\t{\n\t\t\t\"name\": \"fileBasedGP\",\n\t\t\t\"type\":
+                        \"int\"\n\t\t},\n\t\t{\n\t\t\t\"name\": \"fileLocation\",\n\t\t\t\"type\":
+                        \"string\"\n\t\t},\n\t\t{\n\t\t\t\"name\": \"measurementGroups\",\n\t\t\t\"type\":
+                        {\n\t\t\t\t\"type\": \"array\",\n\t\t\t\t\"items\": {\n\t\t\t\t\t\"name\":
+                        \"Measurement_Groups_Type\",\n\t\t\t\t\t\"type\": \"record\",\n\t\t\t\t\t\"fields\":
+                        [{\n\t\t\t\t\t\t\"name\": \"measurementGroup\",\n\t\t\t\t\t\t\"type\":
+                        {\n\t\t\t\t\t\t\t\"name\": \"Measurement_Group_Type\",\n\t\t\t\t\t\t\t\"type\":
+                        \"record\",\n\t\t\t\t\t\t\t\"fields\": [{\n\t\t\t\t\t\t\t\t\t\"name\":
+                        \"measurementTypes\",\n\t\t\t\t\t\t\t\t\t\"type\": {\n\t\t\t\t\t\t\t\t\t\t\"type\":
+                        \"array\",\n\t\t\t\t\t\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\t\t\t\t\t\"name\":
+                        \"Measurement_Types_Type\",\n\t\t\t\t\t\t\t\t\t\t\t\"type\":
+                        \"record\",\n\t\t\t\t\t\t\t\t\t\t\t\"fields\": [{\n\t\t\t\t\t\t\t\t\t\t\t\t\"name\":
+                        \"measurementType\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t\t\t\t\t\t}]\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"name\":
+                        \"managedObjectDNsBasic\",\n\t\t\t\t\t\t\t\t\t\"type\": {\n\t\t\t\t\t\t\t\t\t\t\"type\":
+                        \"array\",\n\t\t\t\t\t\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\t\t\t\t\t\"name\":
+                        \"Managed_Object_Dns_Basic_Type\",\n\t\t\t\t\t\t\t\t\t\t\t\"type\":
+                        \"record\",\n\t\t\t\t\t\t\t\t\t\t\t\"fields\": [{\n\t\t\t\t\t\t\t\t\t\t\t\t\"name\":
+                        \"DN\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t\t\t\t\t\t}]\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t}\n\t\t\t\t\t}]\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t]\n}"
+                  - key:
+                      name: UUIDType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: UUIDType
+                        version: 0.0.1
+                      schemaFlavour: Java
+                      schemaDefinition: java.util.UUID
+          engineParameters:
+            executorParameters:
+              JAVASCRIPT:
+                parameterClassName: org.onap.policy.apex.plugins.executor.javascript.JavascriptExecutorParameters
+            contextParameters:
+              parameterClassName: org.onap.policy.apex.context.parameters.ContextParameters
+              schemaParameters:
+                Avro:
+                  parameterClassName: org.onap.policy.apex.plugins.context.schema.avro.AvroSchemaHelperParameters
+                Java:
+                  parameterClassName: org.onap.policy.apex.context.impl.schema.java.JavaSchemaHelperParameters
+                  jsonAdapters:
+                    Instant:
+                      adaptedClass: java.time.Instant
+                      adaptorClass: org.onap.policy.controlloop.util.Serialization$GsonInstantAdapter
+        eventInputParameters:
+          DCAEConsumer:
+            carrierTechnologyParameters:
+              carrierTechnology: RESTCLIENT
+              parameterClassName: org.onap.policy.apex.plugins.event.carrier.restclient.RestClientCarrierTechnologyParameters
+              parameters:
+                consumerPollTime: '50'
+                url: https://message-router:3905/events/unauthenticated.DCAE_CL_OUTPUT/cg1/sg1
+            eventProtocolParameters:
+              eventProtocol: JSON
+              parameters:
+                nameAlias: policyName
+            eventName: pmsh-operational-policy
+            eventNameFilter: pmsh-operational-policy
+          CDSRequestConsumer:
+            carrierTechnologyParameters:
+              carrierTechnology: RESTREQUESTOR
+              parameterClassName: org.onap.policy.apex.plugins.event.carrier.restrequestor.RestRequestorCarrierTechnologyParameters
+              parameters:
+                url: http://10.10.10.184:30254/api/v1/execution-service/process
+                httpMethod: POST
+                restRequestTimeout: 2000
+                httpHeaders:
+                - - Authorization
+                  - Basic Y2NzZGthcHBzOmNjc2RrYXBwcw==
+            eventProtocolParameters:
+              eventProtocol: JSON
+            eventName: CDSCreateResponseEvent
+            eventNameFilter: CDSCreateResponseEvent
+            requestorMode: true
+            requestorPeer: CDSRequestProducer
+            requestorTimeout: 500
+          CDSDeleteRequestConsumer:
+            carrierTechnologyParameters:
+              carrierTechnology: RESTREQUESTOR
+              parameterClassName: org.onap.policy.apex.plugins.event.carrier.restrequestor.RestRequestorCarrierTechnologyParameters
+              parameters:
+                url: http://10.10.10.184:30254/api/v1/execution-service/process
+                httpMethod: POST
+                restRequestTimeout: 2000
+                httpHeaders:
+                - - Authorization
+                  - Basic Y2NzZGthcHBzOmNjc2RrYXBwcw==
+            eventProtocolParameters:
+              eventProtocol: JSON
+            eventName: CDSDeleteResponseEvent
+            eventNameFilter: CDSDeleteResponseEvent
+            requestorMode: true
+            requestorPeer: CDSDeleteRequestProducer
+            requestorTimeout: 500
+          CDSReplyConsumer:
+            carrierTechnologyParameters:
+              carrierTechnology: RESTREQUESTOR
+              parameterClassName: org.onap.policy.apex.plugins.event.carrier.restrequestor.RestRequestorCarrierTechnologyParameters
+              parameters:
+                url: https://message-router:3905/events/unauthenticated.PMSH_CL_INPUT
+                httpMethod: POST
+                restRequestTimeout: 2000
+            eventProtocolParameters:
+              eventProtocol: JSON
+            eventName: MRResponseEvent
+            eventNameFilter: MRResponseEvent
+            requestorMode: true
+            requestorPeer: CDSReplyProducer
+            requestorTimeout: 500
+        eventOutputParameters:
+          logOutputter:
+            carrierTechnologyParameters:
+              carrierTechnology: FILE
+              parameters:
+                fileName: "/tmp/outputevents.log"
+            eventProtocolParameters:
+              eventProtocol: JSON
+          StdOutOutputter:
+            carrierTechnologyParameters:
+              carrierTechnology: FILE
+              parameters:
+                standardIo: true
+            eventProtocolParameters:
+              eventProtocol: JSON
+          CDSRequestProducer:
+            carrierTechnologyParameters:
+              carrierTechnology: RESTREQUESTOR
+              parameterClassName: org.onap.policy.apex.plugins.event.carrier.restrequestor.RestRequestorCarrierTechnologyParameters
+            eventProtocolParameters:
+              eventProtocol: JSON
+            eventNameFilter: CDSCreateSubscriptionRequestEvent
+            requestorMode: true
+            requestorPeer: CDSRequestConsumer
+            requestorTimeout: 500
+          CDSDeleteRequestProducer:
+            carrierTechnologyParameters:
+              carrierTechnology: RESTREQUESTOR
+              parameterClassName: org.onap.policy.apex.plugins.event.carrier.restrequestor.RestRequestorCarrierTechnologyParameters
+            eventProtocolParameters:
+              eventProtocol: JSON
+            eventNameFilter: CDSDeleteSubscriptionRequestEvent
+            requestorMode: true
+            requestorPeer: CDSDeleteRequestConsumer
+            requestorTimeout: 500
+          CDSReplyProducer:
+            carrierTechnologyParameters:
+              carrierTechnology: RESTREQUESTOR
+              parameterClassName: org.onap.policy.apex.plugins.event.carrier.restrequestor.RestRequestorCarrierTechnologyParameters
+            eventProtocolParameters:
+              eventProtocol: JSON
+            eventNameFilter: CDSResponseStatusEvent
+            requestorMode: true
+            requestorPeer: CDSReplyConsumer
+            requestorTimeout: 500
diff --git a/common/src/main/resources/examples/controlloop/PMSubscriptionHandling.yaml b/common/src/main/resources/examples/controlloop/PMSubscriptionHandling.yaml
new file mode 100644
index 0000000..f9f9742
--- /dev/null
+++ b/common/src/main/resources/examples/controlloop/PMSubscriptionHandling.yaml
@@ -0,0 +1,3314 @@
+# ============LICENSE_START=======================================================
+# Copyright (C) 2021 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=========================================================
+tosca_definitions_version: tosca_simple_yaml_1_3
+data_types:
+  onap.datatypes.ToscaConceptIdentifier:
+    derived_from: tosca.datatypes.Root
+    properties:
+      name:
+        type: string
+        required: true
+      version:
+        type: string
+        required: true
+  org.onap.datatypes.policy.clamp.controlloop.DCAEMicroserviceControlLoopElementConsulInfo:
+    name: org.onap.datatypes.policy.clamp.controlloop.DCAEMicroserviceControlLoopElementConsulInfo
+    version: 0.0.0
+    derived_from: tosca.datatypes.Root
+    properties:
+      consulUrl:
+        name: consulUrl
+        type: string
+        typeVersion: 0.0.0
+        description: Consul url for this entry
+        required: true
+      consul_body:
+        name: consulBody
+        type: string
+        typeVersion: 0.0.0
+        description: Body of Consul entry
+        required: true
+  onap.datatypes.monitoring.managedObjectDNsBasic:
+    constraints: []
+    properties:
+      DN:
+        name: DN
+        type: string
+        typeVersion: 0.0.0
+        description: Managed object distinguished name
+        required: true
+        constraints: []
+        metadata: {}
+    name: onap.datatypes.monitoring.managedObjectDNsBasic
+    version: 0.0.0
+    derived_from: tosca.datatypes.Root
+    metadata: {}
+  onap.datatypes.monitoring.managedObjectDNsBasics:
+    constraints: []
+    properties:
+      managedObjectDNsBasic:
+        name: managedObjectDNsBasic
+        type: map
+        typeVersion: 0.0.0
+        description: Managed object distinguished name object
+        required: true
+        constraints: []
+        entry_schema:
+          type: onap.datatypes.monitoring.managedObjectDNsBasic
+          typeVersion: 0.0.0
+          constraints: []
+        metadata: {}
+    name: onap.datatypes.monitoring.managedObjectDNsBasics
+    version: 0.0.0
+    derived_from: tosca.datatypes.Root
+    metadata: {}
+  onap.datatypes.monitoring.measurementGroup:
+    constraints: []
+    properties:
+      measurementTypes:
+        name: measurementTypes
+        type: list
+        typeVersion: 0.0.0
+        description: List of measurement types
+        required: true
+        constraints: []
+        entry_schema:
+          type: onap.datatypes.monitoring.measurementTypes
+          typeVersion: 0.0.0
+          constraints: []
+        metadata: {}
+      managedObjectDNsBasic:
+        name: managedObjectDNsBasic
+        type: list
+        typeVersion: 0.0.0
+        description: List of managed object distinguished names
+        required: true
+        constraints: []
+        entry_schema:
+          type: onap.datatypes.monitoring.managedObjectDNsBasics
+          typeVersion: 0.0.0
+          constraints: []
+        metadata: {}
+    name: onap.datatypes.monitoring.measurementGroup
+    version: 0.0.0
+    derived_from: tosca.datatypes.Root
+    metadata: {}
+  onap.datatypes.monitoring.measurementGroups:
+    constraints: []
+    properties:
+      measurementGroup:
+        name: measurementGroup
+        type: map
+        typeVersion: 0.0.0
+        description: Measurement Group
+        required: true
+        constraints: []
+        entry_schema:
+          type: onap.datatypes.monitoring.measurementGroup
+          typeVersion: 0.0.0
+          constraints: []
+        metadata: {}
+    name: onap.datatypes.monitoring.measurementGroups
+    version: 0.0.0
+    derived_from: tosca.datatypes.Root
+    metadata: {}
+  onap.datatypes.monitoring.measurementType:
+    constraints: []
+    properties:
+      measurementType:
+        name: measurementType
+        type: string
+        typeVersion: 0.0.0
+        description: Measurement type
+        required: true
+        constraints: []
+        metadata: {}
+    name: onap.datatypes.monitoring.measurementType
+    version: 0.0.0
+    derived_from: tosca.datatypes.Root
+    metadata: {}
+  onap.datatypes.monitoring.measurementTypes:
+    constraints: []
+    properties:
+      measurementType:
+        name: measurementType
+        type: map
+        typeVersion: 0.0.0
+        description: Measurement type object
+        required: true
+        constraints: []
+        entry_schema:
+          type: onap.datatypes.monitoring.measurementType
+          typeVersion: 0.0.0
+          constraints: []
+        metadata: {}
+    name: onap.datatypes.monitoring.measurementTypes
+    version: 0.0.0
+    derived_from: tosca.datatypes.Root
+    metadata: {}
+  onap.datatypes.monitoring.nfFilter:
+    constraints: []
+    properties:
+      modelNames:
+        name: modelNames
+        type: list
+        typeVersion: 0.0.0
+        description: List of model names
+        required: true
+        constraints: []
+        entry_schema:
+          type: string
+          typeVersion: 0.0.0
+          constraints: []
+        metadata: {}
+      modelInvariantIDs:
+        name: modelInvariantIDs
+        type: list
+        typeVersion: 0.0.0
+        description: List of model invariant IDs
+        required: true
+        constraints: []
+        entry_schema:
+          type: string
+          typeVersion: 0.0.0
+          constraints: []
+        metadata: {}
+      modelVersionIDs:
+        name: modelVersionIDs
+        type: list
+        typeVersion: 0.0.0
+        description: List of model version IDs
+        required: true
+        constraints: []
+        entry_schema:
+          type: string
+          typeVersion: 0.0.0
+          constraints: []
+        metadata: {}
+      nfNames:
+        name: nfNames
+        type: list
+        typeVersion: 0.0.0
+        description: List of network functions
+        required: true
+        constraints: []
+        entry_schema:
+          type: string
+          typeVersion: 0.0.0
+          constraints: []
+        metadata: {}
+    name: onap.datatypes.monitoring.nfFilter
+    version: 0.0.0
+    derived_from: tosca.datatypes.Root
+    metadata: {}
+  onap.datatypes.monitoring.subscription:
+    constraints: []
+    properties:
+      measurementGroups:
+        name: measurementGroups
+        type: list
+        typeVersion: 0.0.0
+        description: Measurement Groups
+        required: true
+        constraints: []
+        entry_schema:
+          type: onap.datatypes.monitoring.measurementGroups
+          typeVersion: 0.0.0
+          constraints: []
+        metadata: {}
+      fileBasedGP:
+        name: fileBasedGP
+        type: integer
+        typeVersion: 0.0.0
+        description: File based granularity period
+        required: true
+        constraints: []
+        metadata: {}
+      fileLocation:
+        name: fileLocation
+        type: string
+        typeVersion: 0.0.0
+        description: ROP file location
+        required: true
+        constraints: []
+        metadata: {}
+      subscriptionName:
+        name: subscriptionName
+        type: string
+        typeVersion: 0.0.0
+        description: Name of the subscription
+        required: true
+        constraints: []
+        metadata: {}
+      administrativeState:
+        name: administrativeState
+        type: string
+        typeVersion: 0.0.0
+        description: State of the subscription
+        required: true
+        constraints:
+        - valid_values:
+          - LOCKED
+          - UNLOCKED
+        metadata: {}
+      nfFilter:
+        name: nfFilter
+        type: map
+        typeVersion: 0.0.0
+        description: Network function filter
+        required: true
+        constraints: []
+        entry_schema:
+          type: onap.datatypes.monitoring.nfFilter
+          typeVersion: 0.0.0
+          constraints: []
+        metadata: {}
+    name: onap.datatypes.monitoring.subscription
+    version: 0.0.0
+    derived_from: tosca.datatypes.Root
+    metadata: {}
+policy_types:
+  onap.policies.Monitoring:
+    derived_from: tosca.policies.Root
+    description: a base policy type for all policies that govern monitoring provisioning
+    version: 1.0.0
+    name: onap.policies.Monitoring
+  onap.policies.monitoring.dcae-pm-subscription-handler:
+    properties:
+      pmsh_policy:
+        name: pmsh_policy
+        type: onap.datatypes.monitoring.subscription
+        typeVersion: 0.0.0
+        description: PMSH Policy JSON
+        required: false
+        constraints: []
+        metadata: {}
+    name: onap.policies.monitoring.dcae-pm-subscription-handler
+    version: 1.0.0
+    derived_from: onap.policies.Monitoring
+    metadata: {}
+node_types:
+  org.onap.policy.clamp.controlloop.Participant:
+    version: 1.0.1
+    derived_from: tosca.nodetypes.Root
+    properties:
+      provider:
+        type: string
+        requred: false
+  org.onap.policy.clamp.controlloop.ControlLoopElement:
+    version: 1.0.1
+    derived_from: tosca.nodetypes.Root
+    properties:
+      provider:
+        type: string
+        requred: false
+      participant_id:
+        type: onap.datatypes.ToscaConceptIdentifier
+        requred: true
+  org.onap.policy.clamp.controlloop.ControlLoop:
+    version: 1.0.1
+    derived_from: tosca.nodetypes.Root
+    properties:
+      provider:
+        type: string
+        requred: false
+      elements:
+        type: list
+        required: true
+        entry_schema:
+          type: onap.datatypes.ToscaConceptIdentifier
+  org.onap.policy.clamp.controlloop.DCAEMicroserviceControlLoopElement:
+    version: 1.0.1
+    derived_from: org.onap.policy.clamp.controlloop.ControlLoopElement
+    properties:
+      dcae_blueprint_id:
+        type: onap.datatypes.ToscaConceptIdentifier
+        requred: false
+      dcae_blueprint:
+        type: onap.dcae.cloudify_blueprint
+        requred: false
+      consul_info:
+        type: list
+        required: false
+        entry_schema:
+          type: org.onap.datatypes.policy.clamp.controlloop.DCAEMicroserviceControlLoopElementConsulInfo
+  org.onap.policy.clamp.controlloop.PolicyControlLoopElement:
+    version: 1.0.1
+    derived_from: org.onap.policy.clamp.controlloop.ControlLoopElement
+    properties:
+      policy_type_id:
+        type: onap.datatypes.ToscaConceptIdentifier
+        requred: true
+      policy_id:
+        type: onap.datatypes.ToscaConceptIdentifier
+        requred: false
+  org.onap.policy.clamp.controlloop.CDSControlLoopElement:
+    version: 1.0.1
+    derived_from: org.onap.policy.clamp.controlloop.ControlLoopElement
+    properties:
+      cds_blueprint_id:
+        type: onap.datatypes.ToscaConceptIdentifier
+        requred: true
+topology_template:
+  inputs:
+    pmsh_monitoring_policy:
+      type: onap.datatypes.ToscaConceptIdentifier
+      description: The ID of the PMSH monitoring policy to use
+      default:
+        name: MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0test
+        version: 1.0.0
+    pmsh_operational_policy:
+      type: onap.datatypes.ToscaConceptIdentifier
+      description: The ID of the PMSH operational policy to use
+      default:
+        name: operational.apex.pmcontrol
+        version: 1.0.0
+  node_templates:
+    org.onap.dcae.controlloop.DCAEMicroserviceControlLoopParticipant:
+      version: 2.3.4
+      type: org.onap.policy.clamp.controlloop.Participant
+      type_version: 1.0.1
+      description: Participant for DCAE microservices
+      properties:
+        provider: ONAP
+    org.onap.policy.controlloop.PolicyControlLoopParticipant:
+      version: 2.3.1
+      type: org.onap.policy.clamp.controlloop.Participant
+      type_version: 1.0.1
+      description: Participant for DCAE microservices
+      properties:
+        provider: ONAP
+    org.onap.ccsdk.cds.controlloop.CdsControlLoopParticipant:
+      version: 2.2.1
+      type: org.onap.policy.clamp.controlloop.Participant
+      type_version: 1.0.1
+      description: Participant for DCAE microservices
+      properties:
+        provider: ONAP
+    org.onap.domain.pmsh.PMSH_DCAEMicroservice:
+      version: 1.2.3
+      type: org.onap.policy.clamp.controlloop.DCAEMicroserviceControlLoopElement
+      type_version: 1.0.0
+      description: Control loop element for the DCAE microservice for Performance Management Subscription Handling
+      properties:
+        provider: Ericsson
+        participant_id:
+          name: org.onap.dcae.controlloop.DCAEMicroserviceControlLoopParticipant
+          version: 2.3.4
+        dcae_blueprint:
+          tosca_definitions_version: cloudify_dsl_1_3
+          imports:
+          - https://www.getcloudify.org/spec/cloudify/4.5.5/types.yaml
+          - plugin:k8splugin?version=3.7.0
+          - plugin:pgaas?version=1.3.0
+          - plugin:clamppolicyplugin?version=1.1.0
+          inputs:
+            tag_version:
+              type: string
+              description: Docker image to be used
+              default: nexus3.onap.org:10001/onap/org.onap.dcaegen2.services.pmsh:1.1.2
+            replicas:
+              type: integer
+              description: Number of instances
+              default: 1
+            operational_policy_name:
+              type: string
+              default: operational.apex.pmcontrol
+            control_loop_name:
+              type: string
+              default: pmsh-control-loop
+            pmsh_publish_topic_name:
+              type: string
+              default: unauthenticated.DCAE_CL_OUTPUT
+            policy_feedback_topic_name:
+              type: string
+              default: unauthenticated.PMSH_CL_INPUT
+            aai_notification_topic_name:
+              type: string
+              default: AAI-EVENT
+            publisher_client_role:
+              type: string
+              description: Client role to request secure access to topic
+              default: org.onap.dcae.pmPublisher
+            subscriber_client_role:
+              type: string
+              description: Client role to request secure access to topic
+              default: org.onap.dcae.pmSubscriber
+            dcae_location:
+              type: string
+              description: DCAE location for the subscriber, used to set up routing
+              default: san-francisco
+            cpu_limit:
+              type: string
+              default: 1000m
+            cpu_request:
+              type: string
+              default: 1000m
+            memory_limit:
+              type: string
+              default: 1024Mi
+            memory_request:
+              type: string
+              default: 1024Mi
+            pgaas_cluster_name:
+              type: string
+              default: dcae-pg-primary.onap
+            enable_tls:
+              type: boolean
+              default: true
+            protocol:
+              type: string
+              description: PMSH protocol. If enable_tls is false, set to http
+              default: https
+            policy_model_id:
+              type: string
+              default: onap.policies.monitoring.dcae-pm-subscription-handler
+            policy_id:
+              type: string
+              default: MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0test
+          node_templates:
+            pgaasvm:
+              type: dcae.nodes.pgaas.database
+              properties:
+                writerfqdn:
+                  get_input: pgaas_cluster_name
+                name: pmsh
+            pmsh:
+              type: dcae.nodes.ContainerizedServiceComponentUsingDmaap
+              interfaces:
+                cloudify.interfaces.lifecycle:
+                  create:
+                    inputs:
+                      ports:
+                      - '8443:0'
+                      envs:
+                        PMSH_PG_URL:
+                          get_attribute:
+                          - pgaasvm
+                          - admin
+                          - host
+                        PMSH_PG_PASSWORD:
+                          get_attribute:
+                          - pgaasvm
+                          - admin
+                          - password
+                        PMSH_PG_USERNAME:
+                          get_attribute:
+                          - pgaasvm
+                          - admin
+                          - user
+                        PMSH_DB_NAME:
+                          get_attribute:
+                          - pgaasvm
+                          - admin
+                          - database
+              relationships:
+              - target: pmsh-policy
+                type: cloudify.relationships.depends_on
+              properties:
+                service_component_type: dcae-pmsh
+                service_component_name_override: dcae-pmsh
+                application_config:
+                  enable_tls:
+                    get_input: enable_tls
+                  aaf_identity: dcae@dcae.onap.org
+                  aaf_password: demo123456!
+                  operational_policy_name:
+                    get_input: operational_policy_name
+                  control_loop_name:
+                    get_input: control_loop_name
+                  cert_path: /opt/app/pmsh/etc/certs/cert.pem
+                  key_path: /opt/app/pmsh/etc/certs/key.pem
+                  ca_cert_path: /opt/app/pmsh/etc/certs/cacert.pem
+                  streams_publishes:
+                    policy_pm_publisher:
+                      type: message_router
+                      dmaap_info:
+                        topic_url:
+                          concat:
+                          - http://message-router:3904/events/
+                          - get_input: pmsh_publish_topic_name
+                  streams_subscribes:
+                    policy_pm_subscriber:
+                      type: message_router
+                      dmaap_info:
+                        topic_url:
+                          concat:
+                          - http://message-router:3904/events/
+                          - get_input: policy_feedback_topic_name
+                    aai_subscriber:
+                      type: message_router
+                      dmaap_info:
+                        topic_url:
+                          concat:
+                          - http://message-router:3904/events/
+                          - get_input: aai_notification_topic_name
+                resource_config:
+                  limits:
+                    cpu:
+                      get_input: cpu_limit
+                    memory:
+                      get_input: memory_limit
+                  requests:
+                    cpu:
+                      get_input: cpu_request
+                    memory:
+                      get_input: memory_request
+                docker_config:
+                  healthcheck:
+                    endpoint: /healthcheck
+                    interval: 15s
+                    timeout: 1s
+                    type:
+                      get_input: protocol
+                image:
+                  get_input: tag_version
+                replicas:
+                  get_input: replicas
+                log_info:
+                  log_directory: /var/log/ONAP/dcaegen2/services/pmsh
+                tls_info:
+                  cert_directory: /opt/app/pmsh/etc/certs
+                  use_tls:
+                    get_input: enable_tls
+            pmsh-policy:
+              type: clamp.nodes.policy
+              properties:
+                policy_model_id:
+                  get_input: policy_model_id
+                policy_id:
+                  get_input: policy_id
+        consul_info:
+        - consulUrl: http://consul:31321/v1/kv/dcae-pmsh:policy
+          consulBody:
+            subscription:
+              subscriptionName: subscriptiona
+              administrativeState: UNLOCKED
+              fileBasedGP: 15
+              fileLocation: /pm/pm.xml
+              nfFilter:
+                nfNames:
+                - ^pnf1.*
+                modelInvariantIDs:
+                - 5845y423-g654-6fju-po78-8n53154532k6
+                - 7129e420-d396-4efb-af02-6b83499b12f8
+                modelVersionIDs:
+                - e80a6ae3-cafd-4d24-850d-e14c084a5ca9
+              measurementGroups:
+              - measurementGroup:
+                  measurementTypes:
+                  - measurementType: countera
+                  - measurementType: counterb
+                  managedObjectDNsBasic:
+                  - DN: dna
+                  - DN: dnb
+              - measurementGroup:
+                  measurementTypes:
+                  - measurementType: counterc
+                  - measurementType: counterd
+                  managedObjectDNsBasic:
+                  - DN: dnc
+                  - DN: dnd
+    org.onap.domain.pmsh.PMSH_MonitoringPolicyControlLoopElement:
+      version: 1.2.3
+      type: org.onap.policy.clamp.controlloop.PolicyControlLoopElement
+      type_version: 1.0.0
+      description: Control loop element for the monitoring policy for Performance Management Subscription Handling
+      properties:
+        provider: Ericsson
+        participant_id:
+          name: org.onap.policy.controlloop.PolicyControlLoopParticipant
+          version: 2.3.1
+        policy_type_id:
+          name: onap.policies.monitoring.pm-subscription-handler
+          version: 1.0.0
+        policy_id:
+          get_input: pmsh_monitoring_policy
+    org.onap.domain.pmsh.PMSH_OperationalPolicyControlLoopElement:
+      version: 1.2.3
+      type: org.onap.policy.clamp.controlloop.PolicyControlLoopElement
+      type_version: 1.0.0
+      description: Control loop element for the operational policy for Performance Management Subscription Handling
+      properties:
+        provider: Ericsson
+        participant_id:
+          name: org.onap.policy.controlloop.PolicyControlLoopParticipant
+          version: 2.2.1
+        policy_type_id:
+          name: onap.policies.operational.pm-subscription-handler
+          version: 1.0.0
+        policy_id:
+          get_input: pmsh_operational_policy
+    org.onap.domain.pmsh.PMSH_CDS_ControlLoopElement:
+      version: 1.2.3
+      type: org.onap.policy.clamp.controlloop.CDSControlLoopElement
+      type_version: 1.0.0
+      description: Control loop element for CDS for Performance Management Subscription Handling
+      properties:
+        provider: Ericsson
+        participant_Id:
+          name: org.onap.ccsdk.cds.controlloop.CdsControlLoopParticipant
+          version: 3.2.1
+        cds_blueprint_id:
+          name: org.onap.ccsdk.cds.PMSHCdsBlueprint
+          version: 1.0.0
+    org.onap.domain.pmsh.PMSHControlLoopDefinition:
+      version: 1.2.3
+      type: org.onap.policy.clamp.controlloop.ControlLoop
+      type_version: 1.0.0
+      description: Control loop for Performance Management Subscription Handling
+      properties:
+        provider: Ericsson
+        elements:
+        - name: org.onap.domain.pmsh.PMSH_DCAEMicroservice
+          version: 1.2.3
+        - name: org.onap.domain.pmsh.PMSH_MonitoringPolicyControlLoopElement
+          version: 1.2.3
+        - name: org.onap.domain.pmsh.PMSH_OperationalPolicyControlLoopElement
+          version: 1.2.3
+        - name: org.onap.domain.pmsh.PMSH_CDS_ControlLoopElement
+          version: 1.2.3
+  policies:
+  - MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0test:
+      type: onap.policies.monitoring.dcae-pm-subscription-handler
+      type_version: 1.0.0
+      name: MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0test
+      version: 1.0.0
+      metadata:
+        policy-id: MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0test
+        policy-version: 1.0.0
+      properties:
+        pmsh_policy:
+          fileBasedGP: 15
+          fileLocation: /pm/pm.xml
+          subscriptionName: subscriptiona
+          administrativeState: UNLOCKED
+          nfFilter:
+            onap.datatypes.monitoring.nfFilter:
+              modelVersionIDs:
+              - e80a6ae3-cafd-4d24-850d-e14c084a5ca9
+              modelInvariantIDs:
+              - 5845y423-g654-6fju-po78-8n53154532k6
+              - 7129e420-d396-4efb-af02-6b83499b12f8
+              modelNames: []
+              nfNames:
+              - '"^pnf1.*"'
+          measurementGroups:
+          - measurementGroup:
+              onap.datatypes.monitoring.measurementGroup:
+                measurementTypes:
+                - measurementType:
+                    onap.datatypes.monitoring.measurementType:
+                      measurementType: countera
+                - measurementType:
+                    onap.datatypes.monitoring.measurementType:
+                      measurementType: counterb
+                managedObjectDNsBasic:
+                - managedObjectDNsBasic:
+                    onap.datatypes.monitoring.managedObjectDNsBasic:
+                      DN: dna
+                - managedObjectDNsBasic:
+                    onap.datatypes.monitoring.managedObjectDNsBasic:
+                      DN: dnb
+          - measurementGroup:
+              onap.datatypes.monitoring.measurementGroup:
+                measurementTypes:
+                - measurementType:
+                    onap.datatypes.monitoring.measurementType:
+                      measurementType: counterc
+                - measurementType:
+                    onap.datatypes.monitoring.measurementType:
+                      measurementType: counterd
+                managedObjectDNsBasic:
+                - managedObjectDNsBasic:
+                    onap.datatypes.monitoring.managedObjectDNsBasic:
+                      DN: dnc
+                - managedObjectDNsBasic:
+                    onap.datatypes.monitoring.managedObjectDNsBasic:
+                      DN: dnd
+  - operational.apex.pmcontrol:
+      type: onap.policies.controlloop.operational.common.Apex
+      type_version: 1.0.0
+      version: 1.0.0
+      metadata:
+        policy-id: operational.apex.pmcontrol
+        policy-version: 1
+      properties:
+        engineServiceParameters:
+          name: MyApexEngine
+          version: 0.0.1
+          id: 45
+          instanceCount: 2
+          deploymentPort: 12561
+          policy_type_impl:
+            apexPolicyModel:
+              key:
+                name: PMControlPolicy
+                version: 0.0.1
+              keyInformation:
+                key:
+                  name: PMControlPolicy_KeyInfo
+                  version: 0.0.1
+                keyInfoMap:
+                  entry:
+                  - key:
+                      name: CDSActionIdentifiersType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSActionIdentifiersType
+                        version: 0.0.1
+                      UUID: 6e5fa19b-14df-37e3-a4ae-8c537e861a82
+                      description: Generated description for concept referred to by key "CDSActionIdentifiersType:0.0.1"
+                  - key:
+                      name: CDSCreateResponseEvent
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSCreateResponseEvent
+                        version: 0.0.1
+                      UUID: 14b29e38-ac75-3273-aa4e-8583c0aa7dad
+                      description: Generated description for concept referred to by key "CDSCreateResponseEvent:0.0.1"
+                  - key:
+                      name: CDSCreateResponsePayloadType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSCreateResponsePayloadType
+                        version: 0.0.1
+                      UUID: 04573f8f-e772-30a5-b1d9-d7318d4a1e13
+                      description: Generated description for concept referred to by key "CDSCreateResponsePayloadType:0.0.1"
+                  - key:
+                      name: CDSCreateResponsePolicy
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSCreateResponsePolicy
+                        version: 0.0.1
+                      UUID: e126c965-fc09-3bfe-8f55-70f380a4a49c
+                      description: Generated description for concept referred to by key "CDSCreateResponsePolicy:0.0.1"
+                  - key:
+                      name: CDSCreateResponseTask
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSCreateResponseTask
+                        version: 0.0.1
+                      UUID: 6165ee82-afd2-3aab-a517-f00b3f2461d2
+                      description: Generated description for concept referred to by key "CDSCreateResponseTask:0.0.1"
+                  - key:
+                      name: CDSCreateSubscriptionPayloadType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSCreateSubscriptionPayloadType
+                        version: 0.0.1
+                      UUID: 8350ac5e-c157-38b9-9614-a0f93a830e60
+                      description: Generated description for concept referred to by key "CDSCreateSubscriptionPayloadType:0.0.1"
+                  - key:
+                      name: CDSCreateSubscriptionRequestEvent
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSCreateSubscriptionRequestEvent
+                        version: 0.0.1
+                      UUID: cfa325ba-226b-3a31-9183-ec43e2b6e9a2
+                      description: Generated description for concept referred to by key "CDSCreateSubscriptionRequestEvent:0.0.1"
+                  - key:
+                      name: CDSDeleteResponseEvent
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSDeleteResponseEvent
+                        version: 0.0.1
+                      UUID: 8be9c0fa-7437-3841-aff2-b3cec6ae3bd8
+                      description: Generated description for concept referred to by key "CDSDeleteResponseEvent:0.0.1"
+                  - key:
+                      name: CDSDeleteResponsePayloadType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSDeleteResponsePayloadType
+                        version: 0.0.1
+                      UUID: 3fbfe0c9-152e-34d3-a504-09cd13c058d0
+                      description: Generated description for concept referred to by key "CDSDeleteResponsePayloadType:0.0.1"
+                  - key:
+                      name: CDSDeleteResponsePolicy
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSDeleteResponsePolicy
+                        version: 0.0.1
+                      UUID: a780251c-edd5-3132-b865-04313246b43c
+                      description: Generated description for concept referred to by key "CDSDeleteResponsePolicy:0.0.1"
+                  - key:
+                      name: CDSDeleteResponseTask
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSDeleteResponseTask
+                        version: 0.0.1
+                      UUID: afce4555-3aa3-3521-a7d8-ee8cdf0d3efc
+                      description: Generated description for concept referred to by key "CDSDeleteResponseTask:0.0.1"
+                  - key:
+                      name: CDSDeleteSubscriptionPayloadType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSDeleteSubscriptionPayloadType
+                        version: 0.0.1
+                      UUID: 12658406-9147-3c9d-a38c-5ad5e30b092b
+                      description: Generated description for concept referred to by key "CDSDeleteSubscriptionPayloadType:0.0.1"
+                  - key:
+                      name: CDSDeleteSubscriptionRequestEvent
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSDeleteSubscriptionRequestEvent
+                        version: 0.0.1
+                      UUID: 24380c95-9289-36e6-8cbf-0edefa15ccd9
+                      description: Generated description for concept referred to by key "CDSDeleteSubscriptionRequestEvent:0.0.1"
+                  - key:
+                      name: CDSRequestCommonHeaderType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSRequestCommonHeaderType
+                        version: 0.0.1
+                      UUID: 35590ac0-062c-39f1-8786-b4ff716e30b1
+                      description: Generated description for concept referred to by key "CDSRequestCommonHeaderType:0.0.1"
+                  - key:
+                      name: CDSResponseCommonHeaderType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSResponseCommonHeaderType
+                        version: 0.0.1
+                      UUID: dd7e1805-885a-350b-aaf9-ed541321ae3c
+                      description: Generated description for concept referred to by key "CDSResponseCommonHeaderType:0.0.1"
+                  - key:
+                      name: CDSResponseStatusEvent
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSResponseStatusEvent
+                        version: 0.0.1
+                      UUID: 7986e21b-32f7-302e-9554-31f21b673493
+                      description: Generated description for concept referred to by key "CDSResponseStatusEvent:0.0.1"
+                  - key:
+                      name: CDSResponseStatusType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSResponseStatusType
+                        version: 0.0.1
+                      UUID: 92b8a2cf-344e-3ce1-8cc0-2b7d3cb695fa
+                      description: Generated description for concept referred to by key "CDSResponseStatusType:0.0.1"
+                  - key:
+                      name: CreateSubscriptionPayloadEvent
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CreateSubscriptionPayloadEvent
+                        version: 0.0.1
+                      UUID: 92162397-1a8e-3a3f-a469-d2af7700af4a
+                      description: Generated description for concept referred to by key "CreateSubscriptionPayloadEvent:0.0.1"
+                  - key:
+                      name: CreateSubscriptionPayloadTask
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CreateSubscriptionPayloadTask
+                        version: 0.0.1
+                      UUID: bc0c69f0-52ed-38ea-b468-ae4a6fd1730d
+                      description: Generated description for concept referred to by key "CreateSubscriptionPayloadTask:0.0.1"
+                  - key:
+                      name: CreateSubscriptionRequestTask
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CreateSubscriptionRequestTask
+                        version: 0.0.1
+                      UUID: 89cb75e9-f06c-30d3-b4ff-698d45f63869
+                      description: Generated description for concept referred to by key "CreateSubscriptionRequestTask:0.0.1"
+                  - key:
+                      name: DeleteSubscriptionPayloadEvent
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: DeleteSubscriptionPayloadEvent
+                        version: 0.0.1
+                      UUID: 994fa441-04ab-33bb-832d-1cd12ab5d074
+                      description: Generated description for concept referred to by key "DeleteSubscriptionPayloadEvent:0.0.1"
+                  - key:
+                      name: DeleteSubscriptionPayloadTask
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: DeleteSubscriptionPayloadTask
+                        version: 0.0.1
+                      UUID: 0f519117-5fea-3e4b-941f-8f778100465f
+                      description: Generated description for concept referred to by key "DeleteSubscriptionPayloadTask:0.0.1"
+                  - key:
+                      name: DeleteSubscriptionRequestTask
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: DeleteSubscriptionRequestTask
+                        version: 0.0.1
+                      UUID: acb772fe-d442-39e3-98f9-b1080caf4150
+                      description: Generated description for concept referred to by key "DeleteSubscriptionRequestTask:0.0.1"
+                  - key:
+                      name: MRResponseEvent
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: MRResponseEvent
+                        version: 0.0.1
+                      UUID: 13c747a3-6bae-3bcf-9c80-b152e01dc194
+                      description: Generated description for concept referred to by key "MRResponseEvent:0.0.1"
+                  - key:
+                      name: PMControlPolicy
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: PMControlPolicy
+                        version: 0.0.1
+                      UUID: acf1e55c-7bc5-3bd5-975a-0ca54afcd8a4
+                      description: Generated description for concept referred to by key "PMControlPolicy:0.0.1"
+                  - key:
+                      name: PMControlPolicy_Albums
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: PMControlPolicy_Albums
+                        version: 0.0.1
+                      UUID: b38ad204-c2c8-32f4-9b5a-dda0aeb0145b
+                      description: Generated description for concept referred to by key "PMControlPolicy_Albums:0.0.1"
+                  - key:
+                      name: PMControlPolicy_Events
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: PMControlPolicy_Events
+                        version: 0.0.1
+                      UUID: be3871a0-c42a-3113-a066-82d192840eca
+                      description: Generated description for concept referred to by key "PMControlPolicy_Events:0.0.1"
+                  - key:
+                      name: PMControlPolicy_KeyInfo
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: PMControlPolicy_KeyInfo
+                        version: 0.0.1
+                      UUID: ced37634-28a4-3178-b7f6-2980794927b0
+                      description: Generated description for concept referred to by key "PMControlPolicy_KeyInfo:0.0.1"
+                  - key:
+                      name: PMControlPolicy_Policies
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: PMControlPolicy_Policies
+                        version: 0.0.1
+                      UUID: be3d180d-ef9c-3a75-8e9c-84271a038bed
+                      description: Generated description for concept referred to by key "PMControlPolicy_Policies:0.0.1"
+                  - key:
+                      name: PMControlPolicy_Schemas
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: PMControlPolicy_Schemas
+                        version: 0.0.1
+                      UUID: e61973f1-189c-39e5-82f6-0d3afe298a20
+                      description: Generated description for concept referred to by key "PMControlPolicy_Schemas:0.0.1"
+                  - key:
+                      name: PMControlPolicy_Tasks
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: PMControlPolicy_Tasks
+                        version: 0.0.1
+                      UUID: 5658adb3-2962-30a3-a241-fae75bb8eb4a
+                      description: Generated description for concept referred to by key "PMControlPolicy_Tasks:0.0.1"
+                  - key:
+                      name: PMSubscriptionAlbum
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: PMSubscriptionAlbum
+                        version: 0.0.1
+                      UUID: c2bd6f0d-6854-317a-9be2-97c08338428c
+                      description: Generated description for concept referred to by key "PMSubscriptionAlbum:0.0.1"
+                  - key:
+                      name: PMSubscriptionOutputEvent
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: PMSubscriptionOutputEvent
+                        version: 0.0.1
+                      UUID: 992b7819-9f69-3aa0-bb0f-6e45ea15ce05
+                      description: Generated description for concept referred to by key "PMSubscriptionOutputEvent:0.0.1"
+                  - key:
+                      name: PMSubscriptionType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: PMSubscriptionType
+                        version: 0.0.1
+                      UUID: 73c1c397-4fc3-357f-93b6-a8ad707fbaae
+                      description: Generated description for concept referred to by key "PMSubscriptionType:0.0.1"
+                  - key:
+                      name: ReceiveEventPolicy
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: ReceiveEventPolicy
+                        version: 0.0.1
+                      UUID: 568b7345-9de1-36d3-b6a3-9b857e6809a1
+                      description: Generated description for concept referred to by key "ReceiveEventPolicy:0.0.1"
+                  - key:
+                      name: ReceiveSubscriptionTask
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: ReceiveSubscriptionTask
+                        version: 0.0.1
+                      UUID: f596afc8-100c-35eb-92c8-352355ea457d
+                      description: Generated description for concept referred to by key "ReceiveSubscriptionTask:0.0.1"
+                  - key:
+                      name: SimpleIntType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: SimpleIntType
+                        version: 0.0.1
+                      UUID: 153791fd-ae0a-36a7-88a5-309a7936415d
+                      description: Generated description for concept referred to by key "SimpleIntType:0.0.1"
+                  - key:
+                      name: SimpleStringType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: SimpleStringType
+                        version: 0.0.1
+                      UUID: 8a4957cf-9493-3a76-8c22-a208e23259af
+                      description: Generated description for concept referred to by key "SimpleStringType:0.0.1"
+                  - key:
+                      name: SubscriptionStatusType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: SubscriptionStatusType
+                        version: 0.0.1
+                      UUID: 597643b1-9db1-31ce-85d0-e1c63c43b30b
+                      description: Generated description for concept referred to by key "SubscriptionStatusType:0.0.1"
+                  - key:
+                      name: SubscriptionType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: SubscriptionType
+                        version: 0.0.1
+                      UUID: 184547bb-7d64-3cb2-a273-d7185102c5ce
+                      description: Generated description for concept referred to by key "SubscriptionType:0.0.1"
+                  - key:
+                      name: UUIDType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: UUIDType
+                        version: 0.0.1
+                      UUID: 6a8cc68e-dfc8-3403-9c6d-071c886b319c
+                      description: Generated description for concept referred to by key "UUIDType:0.0.1"
+                  - key:
+                      name: pmsh-operational-policy
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: pmsh-operational-policy
+                        version: 0.0.1
+                      UUID: fdf2c9ff-6422-3ea6-b6b6-49b12116265d
+                      description: Generated description for concept referred to by key "pmsh-operational-policy:0.0.1"
+              policies:
+                key:
+                  name: PMControlPolicy_Policies
+                  version: 0.0.1
+                policyMap:
+                  entry:
+                  - key:
+                      name: CDSCreateResponsePolicy
+                      version: 0.0.1
+                    value:
+                      policyKey:
+                        name: CDSCreateResponsePolicy
+                        version: 0.0.1
+                      template: Freestyle
+                      state:
+                        entry:
+                        - key: CDSCreateResponseState
+                          value:
+                            stateKey:
+                              parentKeyName: CDSCreateResponsePolicy
+                              parentKeyVersion: 0.0.1
+                              parentLocalName: 'NULL'
+                              localName: CDSCreateResponseState
+                            trigger:
+                              name: CDSCreateResponseEvent
+                              version: 0.0.1
+                            stateOutputs:
+                              entry:
+                              - key: ResponseOutput
+                                value:
+                                  key:
+                                    parentKeyName: CDSCreateResponsePolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: CDSCreateResponseState
+                                    localName: ResponseOutput
+                                  outgoingEvent:
+                                    name: CDSResponseStatusEvent
+                                    version: 0.0.1
+                                  nextState:
+                                    parentKeyName: 'NULL'
+                                    parentKeyVersion: 0.0.0
+                                    parentLocalName: 'NULL'
+                                    localName: 'NULL'
+                            contextAlbumReference: []
+                            taskSelectionLogic:
+                              key: 'NULL'
+                              logicFlavour: UNDEFINED
+                              logic: ''
+                            stateFinalizerLogicMap:
+                              entry: []
+                            defaultTask:
+                              name: CDSCreateResponseTask
+                              version: 0.0.1
+                            taskReferences:
+                              entry:
+                              - key:
+                                  name: CDSCreateResponseTask
+                                  version: 0.0.1
+                                value:
+                                  key:
+                                    parentKeyName: CDSCreateResponsePolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: CDSCreateResponseState
+                                    localName: CDSCreateResponsePolicy
+                                  outputType: DIRECT
+                                  output:
+                                    parentKeyName: CDSCreateResponsePolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: CDSCreateResponseState
+                                    localName: ResponseOutput
+                      firstState: CDSCreateResponseState
+                  - key:
+                      name: CDSDeleteResponsePolicy
+                      version: 0.0.1
+                    value:
+                      policyKey:
+                        name: CDSDeleteResponsePolicy
+                        version: 0.0.1
+                      template: Freestyle
+                      state:
+                        entry:
+                        - key: CDSDeleteResponseState
+                          value:
+                            stateKey:
+                              parentKeyName: CDSDeleteResponsePolicy
+                              parentKeyVersion: 0.0.1
+                              parentLocalName: 'NULL'
+                              localName: CDSDeleteResponseState
+                            trigger:
+                              name: CDSDeleteResponseEvent
+                              version: 0.0.1
+                            stateOutputs:
+                              entry:
+                              - key: ResponseOutput
+                                value:
+                                  key:
+                                    parentKeyName: CDSDeleteResponsePolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: CDSDeleteResponseState
+                                    localName: ResponseOutput
+                                  outgoingEvent:
+                                    name: CDSResponseStatusEvent
+                                    version: 0.0.1
+                                  nextState:
+                                    parentKeyName: 'NULL'
+                                    parentKeyVersion: 0.0.0
+                                    parentLocalName: 'NULL'
+                                    localName: 'NULL'
+                            contextAlbumReference: []
+                            taskSelectionLogic:
+                              key: 'NULL'
+                              logicFlavour: UNDEFINED
+                              logic: ''
+                            stateFinalizerLogicMap:
+                              entry: []
+                            defaultTask:
+                              name: CDSDeleteResponseTask
+                              version: 0.0.1
+                            taskReferences:
+                              entry:
+                              - key:
+                                  name: CDSDeleteResponseTask
+                                  version: 0.0.1
+                                value:
+                                  key:
+                                    parentKeyName: CDSDeleteResponsePolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: CDSDeleteResponseState
+                                    localName: CDSDeleteResponsePolicy
+                                  outputType: DIRECT
+                                  output:
+                                    parentKeyName: CDSDeleteResponsePolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: CDSDeleteResponseState
+                                    localName: ResponseOutput
+                      firstState: CDSDeleteResponseState
+                  - key:
+                      name: ReceiveEventPolicy
+                      version: 0.0.1
+                    value:
+                      policyKey:
+                        name: ReceiveEventPolicy
+                        version: 0.0.1
+                      template: Freestyle
+                      state:
+                        entry:
+                        - key: CreateOrDeleteState
+                          value:
+                            stateKey:
+                              parentKeyName: ReceiveEventPolicy
+                              parentKeyVersion: 0.0.1
+                              parentLocalName: 'NULL'
+                              localName: CreateOrDeleteState
+                            trigger:
+                              name: PMSubscriptionOutputEvent
+                              version: 0.0.1
+                            stateOutputs:
+                              entry:
+                              - key: CreateSubscriptionPayload
+                                value:
+                                  key:
+                                    parentKeyName: ReceiveEventPolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: CreateOrDeleteState
+                                    localName: CreateSubscriptionPayload
+                                  outgoingEvent:
+                                    name: CreateSubscriptionPayloadEvent
+                                    version: 0.0.1
+                                  nextState:
+                                    parentKeyName: ReceiveEventPolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: 'NULL'
+                                    localName: CreateSubscription
+                              - key: DeleteSubscriptionPayload
+                                value:
+                                  key:
+                                    parentKeyName: ReceiveEventPolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: CreateOrDeleteState
+                                    localName: DeleteSubscriptionPayload
+                                  outgoingEvent:
+                                    name: DeleteSubscriptionPayloadEvent
+                                    version: 0.0.1
+                                  nextState:
+                                    parentKeyName: ReceiveEventPolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: 'NULL'
+                                    localName: DeleteSubscription
+                            contextAlbumReference:
+                            - name: PMSubscriptionAlbum
+                              version: 0.0.1
+                            taskSelectionLogic:
+                              key: TaskSelectionLogic
+                              logicFlavour: JAVASCRIPT
+                              logic: |-
+                                /*
+                                 * ============LICENSE_START=======================================================
+                                 *  Copyright (C) 2020 Nordix. All rights reserved.
+                                 * ================================================================================
+                                 * Licensed under the Apache License, Version 2.0 (the "License");
+                                 * you may not use this file except in compliance with the License.
+                                 * You may obtain a copy of the License at
+                                 *
+                                 *      http://www.apache.org/licenses/LICENSE-2.0
+                                 *
+                                 * Unless required by applicable law or agreed to in writing, software
+                                 * distributed under the License is distributed on an "AS IS" BASIS,
+                                 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+                                 * See the License for the specific language governing permissions and
+                                 * limitations under the License.
+                                 *
+                                 * SPDX-License-Identifier: Apache-2.0
+                                 * ============LICENSE_END=========================================================
+                                 */
+
+                                executor.logger.info(executor.subject.id);
+
+                                var pmSubscriptionInfo = executor.getContextAlbum("PMSubscriptionAlbum").get(executor.inFields.get("albumID").toString())
+                                var changeType = pmSubscriptionInfo.get("changeType").toString()
+
+                                executor.logger.info("Change Type is " + changeType)
+
+                                if ("CREATE".equals(changeType)) {
+                                    executor.logger.info("Choosing to create a subscription")
+                                    executor.subject.getTaskKey("CreateSubscriptionPayloadTask").copyTo(executor.selectedTask);
+                                }
+                                else if ("DELETE".equals(changeType)) {
+                                    executor.logger.info("Choosing to delete a subscription")
+                                    executor.subject.getTaskKey("DeleteSubscriptionPayloadTask").copyTo(executor.selectedTask);
+                                }
+
+                                //var returnValue = executor.isTrue;
+                                true;
+                            stateFinalizerLogicMap:
+                              entry: []
+                            defaultTask:
+                              name: CreateSubscriptionPayloadTask
+                              version: 0.0.1
+                            taskReferences:
+                              entry:
+                              - key:
+                                  name: CreateSubscriptionPayloadTask
+                                  version: 0.0.1
+                                value:
+                                  key:
+                                    parentKeyName: ReceiveEventPolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: CreateOrDeleteState
+                                    localName: ReceiveEventPolicy
+                                  outputType: DIRECT
+                                  output:
+                                    parentKeyName: ReceiveEventPolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: CreateOrDeleteState
+                                    localName: CreateSubscriptionPayload
+                              - key:
+                                  name: DeleteSubscriptionPayloadTask
+                                  version: 0.0.1
+                                value:
+                                  key:
+                                    parentKeyName: ReceiveEventPolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: CreateOrDeleteState
+                                    localName: ReceiveEventPolicy
+                                  outputType: DIRECT
+                                  output:
+                                    parentKeyName: ReceiveEventPolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: CreateOrDeleteState
+                                    localName: DeleteSubscriptionPayload
+                        - key: CreateSubscription
+                          value:
+                            stateKey:
+                              parentKeyName: ReceiveEventPolicy
+                              parentKeyVersion: 0.0.1
+                              parentLocalName: 'NULL'
+                              localName: CreateSubscription
+                            trigger:
+                              name: CreateSubscriptionPayloadEvent
+                              version: 0.0.1
+                            stateOutputs:
+                              entry:
+                              - key: IssueCreateSubscriptionRequestOutput
+                                value:
+                                  key:
+                                    parentKeyName: ReceiveEventPolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: CreateSubscription
+                                    localName: IssueCreateSubscriptionRequestOutput
+                                  outgoingEvent:
+                                    name: CDSCreateSubscriptionRequestEvent
+                                    version: 0.0.1
+                                  nextState:
+                                    parentKeyName: 'NULL'
+                                    parentKeyVersion: 0.0.0
+                                    parentLocalName: 'NULL'
+                                    localName: 'NULL'
+                            contextAlbumReference:
+                            - name: PMSubscriptionAlbum
+                              version: 0.0.1
+                            taskSelectionLogic:
+                              key: 'NULL'
+                              logicFlavour: UNDEFINED
+                              logic: ''
+                            stateFinalizerLogicMap:
+                              entry: []
+                            defaultTask:
+                              name: CreateSubscriptionRequestTask
+                              version: 0.0.1
+                            taskReferences:
+                              entry:
+                              - key:
+                                  name: CreateSubscriptionRequestTask
+                                  version: 0.0.1
+                                value:
+                                  key:
+                                    parentKeyName: ReceiveEventPolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: CreateSubscription
+                                    localName: ReceiveEventPolicy
+                                  outputType: DIRECT
+                                  output:
+                                    parentKeyName: ReceiveEventPolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: CreateSubscription
+                                    localName: IssueCreateSubscriptionRequestOutput
+                        - key: DeleteSubscription
+                          value:
+                            stateKey:
+                              parentKeyName: ReceiveEventPolicy
+                              parentKeyVersion: 0.0.1
+                              parentLocalName: 'NULL'
+                              localName: DeleteSubscription
+                            trigger:
+                              name: DeleteSubscriptionPayloadEvent
+                              version: 0.0.1
+                            stateOutputs:
+                              entry:
+                              - key: IssueDeleteSubscriptionRequestOutput
+                                value:
+                                  key:
+                                    parentKeyName: ReceiveEventPolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: DeleteSubscription
+                                    localName: IssueDeleteSubscriptionRequestOutput
+                                  outgoingEvent:
+                                    name: CDSDeleteSubscriptionRequestEvent
+                                    version: 0.0.1
+                                  nextState:
+                                    parentKeyName: 'NULL'
+                                    parentKeyVersion: 0.0.0
+                                    parentLocalName: 'NULL'
+                                    localName: 'NULL'
+                            contextAlbumReference:
+                            - name: PMSubscriptionAlbum
+                              version: 0.0.1
+                            taskSelectionLogic:
+                              key: 'NULL'
+                              logicFlavour: UNDEFINED
+                              logic: ''
+                            stateFinalizerLogicMap:
+                              entry: []
+                            defaultTask:
+                              name: DeleteSubscriptionRequestTask
+                              version: 0.0.1
+                            taskReferences:
+                              entry:
+                              - key:
+                                  name: DeleteSubscriptionRequestTask
+                                  version: 0.0.1
+                                value:
+                                  key:
+                                    parentKeyName: ReceiveEventPolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: DeleteSubscription
+                                    localName: ReceiveEventPolicy
+                                  outputType: DIRECT
+                                  output:
+                                    parentKeyName: ReceiveEventPolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: DeleteSubscription
+                                    localName: IssueDeleteSubscriptionRequestOutput
+                        - key: ReceiveSubscriptionState
+                          value:
+                            stateKey:
+                              parentKeyName: ReceiveEventPolicy
+                              parentKeyVersion: 0.0.1
+                              parentLocalName: 'NULL'
+                              localName: ReceiveSubscriptionState
+                            trigger:
+                              name: pmsh-operational-policy
+                              version: 0.0.1
+                            stateOutputs:
+                              entry:
+                              - key: ReceivePMSubscriptionOutput
+                                value:
+                                  key:
+                                    parentKeyName: ReceiveEventPolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: ReceiveSubscriptionState
+                                    localName: ReceivePMSubscriptionOutput
+                                  outgoingEvent:
+                                    name: PMSubscriptionOutputEvent
+                                    version: 0.0.1
+                                  nextState:
+                                    parentKeyName: ReceiveEventPolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: 'NULL'
+                                    localName: CreateOrDeleteState
+                            contextAlbumReference:
+                            - name: PMSubscriptionAlbum
+                              version: 0.0.1
+                            taskSelectionLogic:
+                              key: 'NULL'
+                              logicFlavour: UNDEFINED
+                              logic: ''
+                            stateFinalizerLogicMap:
+                              entry: []
+                            defaultTask:
+                              name: ReceiveSubscriptionTask
+                              version: 0.0.1
+                            taskReferences:
+                              entry:
+                              - key:
+                                  name: ReceiveSubscriptionTask
+                                  version: 0.0.1
+                                value:
+                                  key:
+                                    parentKeyName: ReceiveEventPolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: ReceiveSubscriptionState
+                                    localName: ReceiveEventPolicy
+                                  outputType: DIRECT
+                                  output:
+                                    parentKeyName: ReceiveEventPolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: ReceiveSubscriptionState
+                                    localName: ReceivePMSubscriptionOutput
+                      firstState: ReceiveSubscriptionState
+              tasks:
+                key:
+                  name: PMControlPolicy_Tasks
+                  version: 0.0.1
+                taskMap:
+                  entry:
+                  - key:
+                      name: CDSCreateResponseTask
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSCreateResponseTask
+                        version: 0.0.1
+                      inputFields:
+                        entry:
+                        - key: actionIdentifiers
+                          value:
+                            key: actionIdentifiers
+                            fieldSchemaKey:
+                              name: CDSActionIdentifiersType
+                              version: 0.0.1
+                            optional: false
+                        - key: commonHeader
+                          value:
+                            key: commonHeader
+                            fieldSchemaKey:
+                              name: CDSResponseCommonHeaderType
+                              version: 0.0.1
+                            optional: false
+                        - key: payload
+                          value:
+                            key: payload
+                            fieldSchemaKey:
+                              name: CDSCreateResponsePayloadType
+                              version: 0.0.1
+                            optional: false
+                        - key: status
+                          value:
+                            key: status
+                            fieldSchemaKey:
+                              name: CDSResponseStatusType
+                              version: 0.0.1
+                            optional: false
+                      outputFields:
+                        entry:
+                        - key: status
+                          value:
+                            key: status
+                            fieldSchemaKey:
+                              name: SubscriptionStatusType
+                              version: 0.0.1
+                            optional: false
+                      taskParameters:
+                        entry: []
+                      contextAlbumReference:
+                      - name: PMSubscriptionAlbum
+                        version: 0.0.1
+                      taskLogic:
+                        key: TaskLogic
+                        logicFlavour: JAVASCRIPT
+                        logic: |-
+                          /*
+                           * ============LICENSE_START=======================================================
+                           *  Copyright (C) 2020 Nordix. All rights reserved.
+                           * ================================================================================
+                           * Licensed under the Apache License, Version 2.0 (the "License");
+                           * you may not use this file except in compliance with the License.
+                           * You may obtain a copy of the License at
+                           *
+                           *      http://www.apache.org/licenses/LICENSE-2.0
+                           *
+                           * Unless required by applicable law or agreed to in writing, software
+                           * distributed under the License is distributed on an "AS IS" BASIS,
+                           * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+                           * See the License for the specific language governing permissions and
+                           * limitations under the License.
+                           *
+                           * SPDX-License-Identifier: Apache-2.0
+                           * ============LICENSE_END=========================================================
+                           */
+
+                          executor.logger.info(executor.subject.id);
+
+                          var commonHeader = executor.inFields.get("commonHeader")
+                          var response = executor.inFields.get("payload")
+                          var albumID = commonHeader.get("requestId")
+
+                          var pmSubscriptionInfo = executor.getContextAlbum("PMSubscriptionAlbum").get(albumID.toString());
+                          var responseStatus = executor.subject.getOutFieldSchemaHelper("status").createNewInstance();
+
+                          responseStatus.put("subscriptionName", pmSubscriptionInfo.get("subscription").get("subscriptionName"))
+                          responseStatus.put("nfName", pmSubscriptionInfo.get("nfName"))
+                          responseStatus.put("changeType", pmSubscriptionInfo.get("changeType"))
+
+                          var status = response.get(pmSubscriptionInfo.get("changeType").toLowerCase() + "_DasH_subscription_DasH_response").get("odl_DasH_response").get("status")
+
+                          executor.logger.info("RESPONSE STATUS = " + status)
+
+                          if(status == "success") {
+                              responseStatus.put("message", "success")
+                          } else {
+                              responseStatus.put("message", "failed")
+                          }
+
+                          executor.outFields.put("status", responseStatus)
+
+                          //var returnValue = executor.isTrue;
+                          true;
+                  - key:
+                      name: CDSDeleteResponseTask
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSDeleteResponseTask
+                        version: 0.0.1
+                      inputFields:
+                        entry:
+                        - key: actionIdentifiers
+                          value:
+                            key: actionIdentifiers
+                            fieldSchemaKey:
+                              name: CDSActionIdentifiersType
+                              version: 0.0.1
+                            optional: false
+                        - key: commonHeader
+                          value:
+                            key: commonHeader
+                            fieldSchemaKey:
+                              name: CDSResponseCommonHeaderType
+                              version: 0.0.1
+                            optional: false
+                        - key: payload
+                          value:
+                            key: payload
+                            fieldSchemaKey:
+                              name: CDSDeleteResponsePayloadType
+                              version: 0.0.1
+                            optional: false
+                        - key: status
+                          value:
+                            key: status
+                            fieldSchemaKey:
+                              name: CDSResponseStatusType
+                              version: 0.0.1
+                            optional: false
+                      outputFields:
+                        entry:
+                        - key: status
+                          value:
+                            key: status
+                            fieldSchemaKey:
+                              name: SubscriptionStatusType
+                              version: 0.0.1
+                            optional: false
+                      taskParameters:
+                        entry: []
+                      contextAlbumReference:
+                      - name: PMSubscriptionAlbum
+                        version: 0.0.1
+                      taskLogic:
+                        key: TaskLogic
+                        logicFlavour: JAVASCRIPT
+                        logic: |-
+                          /*
+                           * ============LICENSE_START=======================================================
+                           *  Copyright (C) 2020 Nordix. All rights reserved.
+                           * ================================================================================
+                           * Licensed under the Apache License, Version 2.0 (the "License");
+                           * you may not use this file except in compliance with the License.
+                           * You may obtain a copy of the License at
+                           *
+                           *      http://www.apache.org/licenses/LICENSE-2.0
+                           *
+                           * Unless required by applicable law or agreed to in writing, software
+                           * distributed under the License is distributed on an "AS IS" BASIS,
+                           * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+                           * See the License for the specific language governing permissions and
+                           * limitations under the License.
+                           *
+                           * SPDX-License-Identifier: Apache-2.0
+                           * ============LICENSE_END=========================================================
+                           */
+
+                          executor.logger.info(executor.subject.id);
+
+                          var commonHeader = executor.inFields.get("commonHeader")
+                          var response = executor.inFields.get("payload")
+                          var albumID = commonHeader.get("requestId")
+
+                          var pmSubscriptionInfo = executor.getContextAlbum("PMSubscriptionAlbum").get(albumID.toString());
+                          var responseStatus = executor.subject.getOutFieldSchemaHelper("status").createNewInstance();
+
+                          responseStatus.put("subscriptionName", pmSubscriptionInfo.get("subscription").get("subscriptionName"))
+                          responseStatus.put("nfName", pmSubscriptionInfo.get("nfName"))
+                          responseStatus.put("changeType", pmSubscriptionInfo.get("changeType"))
+
+                          var status = response.get(pmSubscriptionInfo.get("changeType").toLowerCase() + "_DasH_subscription_DasH_response").get("odl_DasH_response").get("status")
+
+                          executor.logger.info("RESPONSE STATUS = " + status)
+
+                          if(status == "success") {
+                              responseStatus.put("message", "success")
+                          } else {
+                              responseStatus.put("message", "failed")
+                          }
+
+                          executor.outFields.put("status", responseStatus)
+
+                          //var returnValue = executor.isTrue;
+                          true;
+                  - key:
+                      name: CreateSubscriptionPayloadTask
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CreateSubscriptionPayloadTask
+                        version: 0.0.1
+                      inputFields:
+                        entry:
+                        - key: albumID
+                          value:
+                            key: albumID
+                            fieldSchemaKey:
+                              name: UUIDType
+                              version: 0.0.1
+                            optional: false
+                      outputFields:
+                        entry:
+                        - key: albumID
+                          value:
+                            key: albumID
+                            fieldSchemaKey:
+                              name: UUIDType
+                              version: 0.0.1
+                            optional: false
+                        - key: payload
+                          value:
+                            key: payload
+                            fieldSchemaKey:
+                              name: CDSCreateSubscriptionPayloadType
+                              version: 0.0.1
+                            optional: false
+                      taskParameters:
+                        entry: []
+                      contextAlbumReference:
+                      - name: PMSubscriptionAlbum
+                        version: 0.0.1
+                      taskLogic:
+                        key: TaskLogic
+                        logicFlavour: JAVASCRIPT
+                        logic: |-
+                          /*
+                           * ============LICENSE_START=======================================================
+                           *  Copyright (C) 2020 Nordix. All rights reserved.
+                           * ================================================================================
+                           * Licensed under the Apache License, Version 2.0 (the "License");
+                           * you may not use this file except in compliance with the License.
+                           * You may obtain a copy of the License at
+                           *
+                           *      http://www.apache.org/licenses/LICENSE-2.0
+                           *
+                           * Unless required by applicable law or agreed to in writing, software
+                           * distributed under the License is distributed on an "AS IS" BASIS,
+                           * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+                           * See the License for the specific language governing permissions and
+                           * limitations under the License.
+                           *
+                           * SPDX-License-Identifier: Apache-2.0
+                           * ============LICENSE_END=========================================================
+                           */
+
+                          executor.logger.info(executor.subject.id);
+
+                          var pmSubscriptionInfo = executor.getContextAlbum("PMSubscriptionAlbum").get(executor.inFields.get("albumID").toString())
+
+                          var changeType = pmSubscriptionInfo.get("changeType").toLowerCase()
+
+                          var payloadProperties = executor.subject.getOutFieldSchemaHelper("payload").createNewSubInstance(changeType + "_DasH_subscription_DasH_properties_record");
+
+                          payloadProperties.put("nfName",  pmSubscriptionInfo.get("nfName"))
+                          payloadProperties.put("subscriptionName",  pmSubscriptionInfo.get("subscription").get("subscriptionName"))
+                          payloadProperties.put("administrativeState", pmSubscriptionInfo.get("subscription").get("administrativeState"))
+                          payloadProperties.put("fileBasedGP",  pmSubscriptionInfo.get("subscription").get("fileBasedGP").toString())
+                          payloadProperties.put("fileLocation", pmSubscriptionInfo.get("subscription").get("fileLocation"))
+                          payloadProperties.put("measurementGroups", pmSubscriptionInfo.get("subscription").get("measurementGroups"))
+
+                          var payloadEntry = executor.subject.getOutFieldSchemaHelper("payload").createNewSubInstance("CDSRequestPayloadEntry");
+                          payloadEntry.put(changeType + "_DasH_subscription_DasH_properties", payloadProperties)
+
+                          var payload = executor.subject.getOutFieldSchemaHelper("payload").createNewInstance();
+                          payload.put(changeType + "_DasH_subscription_DasH_request", payloadEntry);
+
+                          executor.outFields.put("albumID", executor.inFields.get("albumID"))
+                          executor.outFields.put("payload", payload);
+
+                          //var returnValue = executor.isTrue;
+                          true;
+                  - key:
+                      name: CreateSubscriptionRequestTask
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CreateSubscriptionRequestTask
+                        version: 0.0.1
+                      inputFields:
+                        entry:
+                        - key: albumID
+                          value:
+                            key: albumID
+                            fieldSchemaKey:
+                              name: UUIDType
+                              version: 0.0.1
+                            optional: false
+                        - key: payload
+                          value:
+                            key: payload
+                            fieldSchemaKey:
+                              name: CDSCreateSubscriptionPayloadType
+                              version: 0.0.1
+                            optional: false
+                      outputFields:
+                        entry:
+                        - key: actionIdentifiers
+                          value:
+                            key: actionIdentifiers
+                            fieldSchemaKey:
+                              name: CDSActionIdentifiersType
+                              version: 0.0.1
+                            optional: false
+                        - key: commonHeader
+                          value:
+                            key: commonHeader
+                            fieldSchemaKey:
+                              name: CDSRequestCommonHeaderType
+                              version: 0.0.1
+                            optional: false
+                        - key: payload
+                          value:
+                            key: payload
+                            fieldSchemaKey:
+                              name: CDSCreateSubscriptionPayloadType
+                              version: 0.0.1
+                            optional: false
+                      taskParameters:
+                        entry: []
+                      contextAlbumReference:
+                      - name: PMSubscriptionAlbum
+                        version: 0.0.1
+                      taskLogic:
+                        key: TaskLogic
+                        logicFlavour: JAVASCRIPT
+                        logic: |-
+                          /*
+                           * ============LICENSE_START=======================================================
+                           *  Copyright (C) 2020 Nordix. All rights reserved.
+                           * ================================================================================
+                           * Licensed under the Apache License, Version 2.0 (the "License");
+                           * you may not use this file except in compliance with the License.
+                           * You may obtain a copy of the License at
+                           *
+                           *      http://www.apache.org/licenses/LICENSE-2.0
+                           *
+                           * Unless required by applicable law or agreed to in writing, software
+                           * distributed under the License is distributed on an "AS IS" BASIS,
+                           * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+                           * See the License for the specific language governing permissions and
+                           * limitations under the License.
+                           *
+                           * SPDX-License-Identifier: Apache-2.0
+                           * ============LICENSE_END=========================================================
+                           */
+
+                          executor.logger.info(executor.subject.id);
+
+                          var pmSubscriptionInfo = executor.getContextAlbum("PMSubscriptionAlbum").get(executor.inFields.get("albumID").toString())
+
+                          var changeType = pmSubscriptionInfo.get("changeType").toLowerCase()
+                          var blueprintName = pmSubscriptionInfo.get("blueprintName").toLowerCase()
+                          var blueprintVersion = pmSubscriptionInfo.get("blueprintVersion").toLowerCase()
+                          var payload = executor.inFields.get("payload")
+                          var actionName = changeType + "-subscription"
+
+                          var commonHeader = executor.subject.getOutFieldSchemaHelper("commonHeader").createNewInstance();
+                          commonHeader.put("originatorId", "sdnc");
+                          commonHeader.put("requestId", executor.inFields.get("albumID").toString());
+                          commonHeader.put("subRequestId", "sub-123456-1000");
+
+                          var actionIdentifiers = executor.subject.getOutFieldSchemaHelper("actionIdentifiers").createNewInstance();
+                          actionIdentifiers.put("actionName", actionName);
+                          actionIdentifiers.put("blueprintName", blueprintName);
+                          actionIdentifiers.put("blueprintVersion", blueprintVersion);
+                          actionIdentifiers.put("mode", "sync");
+
+                          executor.outFields.put("commonHeader", commonHeader);
+                          executor.outFields.put("actionIdentifiers", actionIdentifiers);
+                          executor.outFields.put("payload", payload);
+
+                          //var returnValue = executor.isTrue;
+                          true;
+                  - key:
+                      name: DeleteSubscriptionPayloadTask
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: DeleteSubscriptionPayloadTask
+                        version: 0.0.1
+                      inputFields:
+                        entry:
+                        - key: albumID
+                          value:
+                            key: albumID
+                            fieldSchemaKey:
+                              name: UUIDType
+                              version: 0.0.1
+                            optional: false
+                      outputFields:
+                        entry:
+                        - key: albumID
+                          value:
+                            key: albumID
+                            fieldSchemaKey:
+                              name: UUIDType
+                              version: 0.0.1
+                            optional: false
+                        - key: payload
+                          value:
+                            key: payload
+                            fieldSchemaKey:
+                              name: CDSDeleteSubscriptionPayloadType
+                              version: 0.0.1
+                            optional: false
+                      taskParameters:
+                        entry: []
+                      contextAlbumReference:
+                      - name: PMSubscriptionAlbum
+                        version: 0.0.1
+                      taskLogic:
+                        key: TaskLogic
+                        logicFlavour: JAVASCRIPT
+                        logic: |-
+                          /*
+                           * ============LICENSE_START=======================================================
+                           *  Copyright (C) 2020 Nordix. All rights reserved.
+                           * ================================================================================
+                           * Licensed under the Apache License, Version 2.0 (the "License");
+                           * you may not use this file except in compliance with the License.
+                           * You may obtain a copy of the License at
+                           *
+                           *      http://www.apache.org/licenses/LICENSE-2.0
+                           *
+                           * Unless required by applicable law or agreed to in writing, software
+                           * distributed under the License is distributed on an "AS IS" BASIS,
+                           * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+                           * See the License for the specific language governing permissions and
+                           * limitations under the License.
+                           *
+                           * SPDX-License-Identifier: Apache-2.0
+                           * ============LICENSE_END=========================================================
+                           */
+
+                          executor.logger.info(executor.subject.id);
+
+                          var pmSubscriptionInfo = executor.getContextAlbum("PMSubscriptionAlbum").get(executor.inFields.get("albumID").toString())
+
+                          var changeType = pmSubscriptionInfo.get("changeType").toLowerCase()
+
+                          var payloadProperties = executor.subject.getOutFieldSchemaHelper("payload").createNewSubInstance(changeType + "_DasH_subscription_DasH_properties_record");
+
+                          payloadProperties.put("nfName",  pmSubscriptionInfo.get("nfName"))
+                          payloadProperties.put("subscriptionName",  pmSubscriptionInfo.get("subscription").get("subscriptionName"))
+                          payloadProperties.put("administrativeState", pmSubscriptionInfo.get("subscription").get("administrativeState"))
+                          payloadProperties.put("fileBasedGP",  pmSubscriptionInfo.get("subscription").get("fileBasedGP").toString())
+                          payloadProperties.put("fileLocation", pmSubscriptionInfo.get("subscription").get("fileLocation"))
+                          payloadProperties.put("measurementGroups", pmSubscriptionInfo.get("subscription").get("measurementGroups"))
+
+                          var payloadEntry = executor.subject.getOutFieldSchemaHelper("payload").createNewSubInstance("CDSRequestPayloadEntry");
+                          payloadEntry.put(changeType + "_DasH_subscription_DasH_properties", payloadProperties)
+
+                          var payload = executor.subject.getOutFieldSchemaHelper("payload").createNewInstance();
+                          payload.put(changeType + "_DasH_subscription_DasH_request", payloadEntry);
+
+                          executor.outFields.put("albumID", executor.inFields.get("albumID"))
+                          executor.outFields.put("payload", payload);
+
+                          //var returnValue = executor.isTrue;
+                          true;
+                  - key:
+                      name: DeleteSubscriptionRequestTask
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: DeleteSubscriptionRequestTask
+                        version: 0.0.1
+                      inputFields:
+                        entry:
+                        - key: albumID
+                          value:
+                            key: albumID
+                            fieldSchemaKey:
+                              name: UUIDType
+                              version: 0.0.1
+                            optional: false
+                        - key: payload
+                          value:
+                            key: payload
+                            fieldSchemaKey:
+                              name: CDSDeleteSubscriptionPayloadType
+                              version: 0.0.1
+                            optional: false
+                      outputFields:
+                        entry:
+                        - key: actionIdentifiers
+                          value:
+                            key: actionIdentifiers
+                            fieldSchemaKey:
+                              name: CDSActionIdentifiersType
+                              version: 0.0.1
+                            optional: false
+                        - key: commonHeader
+                          value:
+                            key: commonHeader
+                            fieldSchemaKey:
+                              name: CDSRequestCommonHeaderType
+                              version: 0.0.1
+                            optional: false
+                        - key: payload
+                          value:
+                            key: payload
+                            fieldSchemaKey:
+                              name: CDSDeleteSubscriptionPayloadType
+                              version: 0.0.1
+                            optional: false
+                      taskParameters:
+                        entry: []
+                      contextAlbumReference:
+                      - name: PMSubscriptionAlbum
+                        version: 0.0.1
+                      taskLogic:
+                        key: TaskLogic
+                        logicFlavour: JAVASCRIPT
+                        logic: |-
+                          /*
+                           * ============LICENSE_START=======================================================
+                           *  Copyright (C) 2020 Nordix. All rights reserved.
+                           * ================================================================================
+                           * Licensed under the Apache License, Version 2.0 (the "License");
+                           * you may not use this file except in compliance with the License.
+                           * You may obtain a copy of the License at
+                           *
+                           *      http://www.apache.org/licenses/LICENSE-2.0
+                           *
+                           * Unless required by applicable law or agreed to in writing, software
+                           * distributed under the License is distributed on an "AS IS" BASIS,
+                           * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+                           * See the License for the specific language governing permissions and
+                           * limitations under the License.
+                           *
+                           * SPDX-License-Identifier: Apache-2.0
+                           * ============LICENSE_END=========================================================
+                           */
+
+                          executor.logger.info(executor.subject.id);
+
+                          var pmSubscriptionInfo = executor.getContextAlbum("PMSubscriptionAlbum").get(executor.inFields.get("albumID").toString())
+
+                          var changeType = pmSubscriptionInfo.get("changeType").toLowerCase()
+                          var blueprintName = pmSubscriptionInfo.get("blueprintName").toLowerCase()
+                          var blueprintVersion = pmSubscriptionInfo.get("blueprintVersion").toLowerCase()
+                          var payload = executor.inFields.get("payload")
+                          var actionName = changeType + "-subscription"
+
+                          var commonHeader = executor.subject.getOutFieldSchemaHelper("commonHeader").createNewInstance();
+                          commonHeader.put("originatorId", "sdnc");
+                          commonHeader.put("requestId", executor.inFields.get("albumID").toString());
+                          commonHeader.put("subRequestId", "sub-123456-1000");
+
+                          var actionIdentifiers = executor.subject.getOutFieldSchemaHelper("actionIdentifiers").createNewInstance();
+                          actionIdentifiers.put("actionName", actionName);
+                          actionIdentifiers.put("blueprintName", blueprintName);
+                          actionIdentifiers.put("blueprintVersion", blueprintVersion);
+                          actionIdentifiers.put("mode", "sync");
+
+                          executor.outFields.put("commonHeader", commonHeader);
+                          executor.outFields.put("actionIdentifiers", actionIdentifiers);
+                          executor.outFields.put("payload", payload);
+
+                          //var returnValue = executor.isTrue;
+                          true;
+                  - key:
+                      name: ReceiveSubscriptionTask
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: ReceiveSubscriptionTask
+                        version: 0.0.1
+                      inputFields:
+                        entry:
+                        - key: blueprintName
+                          value:
+                            key: blueprintName
+                            fieldSchemaKey:
+                              name: SimpleStringType
+                              version: 0.0.1
+                            optional: false
+                        - key: blueprintVersion
+                          value:
+                            key: blueprintVersion
+                            fieldSchemaKey:
+                              name: SimpleStringType
+                              version: 0.0.1
+                            optional: false
+                        - key: changeType
+                          value:
+                            key: changeType
+                            fieldSchemaKey:
+                              name: SimpleStringType
+                              version: 0.0.1
+                            optional: false
+                        - key: closedLoopControlName
+                          value:
+                            key: closedLoopControlName
+                            fieldSchemaKey:
+                              name: SimpleStringType
+                              version: 0.0.1
+                            optional: false
+                        - key: nfName
+                          value:
+                            key: nfName
+                            fieldSchemaKey:
+                              name: SimpleStringType
+                              version: 0.0.1
+                            optional: false
+                        - key: policyName
+                          value:
+                            key: policyName
+                            fieldSchemaKey:
+                              name: SimpleStringType
+                              version: 0.0.1
+                            optional: false
+                        - key: subscription
+                          value:
+                            key: subscription
+                            fieldSchemaKey:
+                              name: SubscriptionType
+                              version: 0.0.1
+                            optional: false
+                      outputFields:
+                        entry:
+                        - key: albumID
+                          value:
+                            key: albumID
+                            fieldSchemaKey:
+                              name: UUIDType
+                              version: 0.0.1
+                            optional: false
+                      taskParameters:
+                        entry: []
+                      contextAlbumReference:
+                      - name: PMSubscriptionAlbum
+                        version: 0.0.1
+                      taskLogic:
+                        key: TaskLogic
+                        logicFlavour: JAVASCRIPT
+                        logic: |-
+                          /*
+                           * ============LICENSE_START=======================================================
+                           *  Copyright (C) 2020 Nordix. All rights reserved.
+                           * ================================================================================
+                           * Licensed under the Apache License, Version 2.0 (the "License");
+                           * you may not use this file except in compliance with the License.
+                           * You may obtain a copy of the License at
+                           *
+                           *      http://www.apache.org/licenses/LICENSE-2.0
+                           *
+                           * Unless required by applicable law or agreed to in writing, software
+                           * distributed under the License is distributed on an "AS IS" BASIS,
+                           * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+                           * See the License for the specific language governing permissions and
+                           * limitations under the License.
+                           *
+                           * SPDX-License-Identifier: Apache-2.0
+                           * ============LICENSE_END=========================================================
+                           */
+                          var uuidType = java.util.UUID;
+
+                          executor.logger.info(executor.subject.id);
+
+                          //albumID will be used to fetch info from our album later
+                          var albumID = uuidType.randomUUID();
+                          var pmSubscriptionInfo = executor.getContextAlbum("PMSubscriptionAlbum").getSchemaHelper().createNewInstance();
+                          var returnValue = true;
+
+                          if(executor.inFields.get("policyName") != null) {
+                              executor.logger.info("nfName in receive sub event " + executor.inFields.get("nfName"));
+
+                              var changeType = executor.inFields.get("changeType")
+                              var nfName = executor.inFields.get("nfName")
+                              var policyName = executor.inFields.get("policyName")
+                              var closedLoopControlName = executor.inFields.get("closedLoopControlName")
+                              var subscription = executor.inFields.get("subscription")
+                              var blueprintName = executor.inFields.get("blueprintName")
+                              var blueprintVersion = executor.inFields.get("blueprintVersion")
+
+                              pmSubscriptionInfo.put("nfName", executor.inFields.get("nfName"));
+                              pmSubscriptionInfo.put("changeType", executor.inFields.get("changeType"))
+                              pmSubscriptionInfo.put("policyName", executor.inFields.get("policyName"))
+                              pmSubscriptionInfo.put("closedLoopControlName", executor.inFields.get("closedLoopControlName"))
+                              pmSubscriptionInfo.put("subscription", subscription)
+                              pmSubscriptionInfo.put("blueprintName", blueprintName)
+                              pmSubscriptionInfo.put("blueprintVersion", blueprintVersion)
+
+
+                              executor.getContextAlbum("PMSubscriptionAlbum").put(albumID.toString(), pmSubscriptionInfo);
+
+                              executor.outFields.put("albumID", albumID)
+                          } else {
+                              executor.message = "Received invalid event"
+                              returnValue = false;
+                          }
+
+                          returnValue;
+              events:
+                key:
+                  name: PMControlPolicy_Events
+                  version: 0.0.1
+                eventMap:
+                  entry:
+                  - key:
+                      name: CDSCreateResponseEvent
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSCreateResponseEvent
+                        version: 0.0.1
+                      nameSpace: org.onap.policy.apex.onap.pmcontrol
+                      source: CDS
+                      target: APEX
+                      parameter:
+                        entry:
+                        - key: actionIdentifiers
+                          value:
+                            key: actionIdentifiers
+                            fieldSchemaKey:
+                              name: CDSActionIdentifiersType
+                              version: 0.0.1
+                            optional: false
+                        - key: commonHeader
+                          value:
+                            key: commonHeader
+                            fieldSchemaKey:
+                              name: CDSResponseCommonHeaderType
+                              version: 0.0.1
+                            optional: false
+                        - key: payload
+                          value:
+                            key: payload
+                            fieldSchemaKey:
+                              name: CDSCreateResponsePayloadType
+                              version: 0.0.1
+                            optional: false
+                        - key: status
+                          value:
+                            key: status
+                            fieldSchemaKey:
+                              name: CDSResponseStatusType
+                              version: 0.0.1
+                            optional: false
+                  - key:
+                      name: CDSCreateSubscriptionRequestEvent
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSCreateSubscriptionRequestEvent
+                        version: 0.0.1
+                      nameSpace: org.onap.policy.apex.onap.pmcontrol
+                      source: APEX
+                      target: APEX
+                      parameter:
+                        entry:
+                        - key: actionIdentifiers
+                          value:
+                            key: actionIdentifiers
+                            fieldSchemaKey:
+                              name: CDSActionIdentifiersType
+                              version: 0.0.1
+                            optional: false
+                        - key: commonHeader
+                          value:
+                            key: commonHeader
+                            fieldSchemaKey:
+                              name: CDSRequestCommonHeaderType
+                              version: 0.0.1
+                            optional: false
+                        - key: payload
+                          value:
+                            key: payload
+                            fieldSchemaKey:
+                              name: CDSCreateSubscriptionPayloadType
+                              version: 0.0.1
+                            optional: false
+                  - key:
+                      name: CDSDeleteResponseEvent
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSDeleteResponseEvent
+                        version: 0.0.1
+                      nameSpace: org.onap.policy.apex.onap.pmcontrol
+                      source: CDS
+                      target: APEX
+                      parameter:
+                        entry:
+                        - key: actionIdentifiers
+                          value:
+                            key: actionIdentifiers
+                            fieldSchemaKey:
+                              name: CDSActionIdentifiersType
+                              version: 0.0.1
+                            optional: false
+                        - key: commonHeader
+                          value:
+                            key: commonHeader
+                            fieldSchemaKey:
+                              name: CDSResponseCommonHeaderType
+                              version: 0.0.1
+                            optional: false
+                        - key: payload
+                          value:
+                            key: payload
+                            fieldSchemaKey:
+                              name: CDSDeleteResponsePayloadType
+                              version: 0.0.1
+                            optional: false
+                        - key: status
+                          value:
+                            key: status
+                            fieldSchemaKey:
+                              name: CDSResponseStatusType
+                              version: 0.0.1
+                            optional: false
+                  - key:
+                      name: CDSDeleteSubscriptionRequestEvent
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSDeleteSubscriptionRequestEvent
+                        version: 0.0.1
+                      nameSpace: org.onap.policy.apex.onap.pmcontrol
+                      source: APEX
+                      target: APEX
+                      parameter:
+                        entry:
+                        - key: actionIdentifiers
+                          value:
+                            key: actionIdentifiers
+                            fieldSchemaKey:
+                              name: CDSActionIdentifiersType
+                              version: 0.0.1
+                            optional: false
+                        - key: commonHeader
+                          value:
+                            key: commonHeader
+                            fieldSchemaKey:
+                              name: CDSRequestCommonHeaderType
+                              version: 0.0.1
+                            optional: false
+                        - key: payload
+                          value:
+                            key: payload
+                            fieldSchemaKey:
+                              name: CDSDeleteSubscriptionPayloadType
+                              version: 0.0.1
+                            optional: false
+                  - key:
+                      name: CDSResponseStatusEvent
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSResponseStatusEvent
+                        version: 0.0.1
+                      nameSpace: org.onap.policy.apex.onap.pmcontrol
+                      source: APEX
+                      target: DCAE
+                      parameter:
+                        entry:
+                        - key: status
+                          value:
+                            key: status
+                            fieldSchemaKey:
+                              name: SubscriptionStatusType
+                              version: 0.0.1
+                            optional: false
+                  - key:
+                      name: CreateSubscriptionPayloadEvent
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CreateSubscriptionPayloadEvent
+                        version: 0.0.1
+                      nameSpace: org.onap.policy.apex.onap.pmcontrol
+                      source: APEX
+                      target: APEX
+                      parameter:
+                        entry:
+                        - key: albumID
+                          value:
+                            key: albumID
+                            fieldSchemaKey:
+                              name: UUIDType
+                              version: 0.0.1
+                            optional: false
+                        - key: payload
+                          value:
+                            key: payload
+                            fieldSchemaKey:
+                              name: CDSCreateSubscriptionPayloadType
+                              version: 0.0.1
+                            optional: false
+                  - key:
+                      name: DeleteSubscriptionPayloadEvent
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: DeleteSubscriptionPayloadEvent
+                        version: 0.0.1
+                      nameSpace: org.onap.policy.apex.onap.pmcontrol
+                      source: APEX
+                      target: APEX
+                      parameter:
+                        entry:
+                        - key: albumID
+                          value:
+                            key: albumID
+                            fieldSchemaKey:
+                              name: UUIDType
+                              version: 0.0.1
+                            optional: false
+                        - key: payload
+                          value:
+                            key: payload
+                            fieldSchemaKey:
+                              name: CDSDeleteSubscriptionPayloadType
+                              version: 0.0.1
+                            optional: false
+                  - key:
+                      name: MRResponseEvent
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: MRResponseEvent
+                        version: 0.0.1
+                      nameSpace: org.onap.policy.apex.onap.pmcontrol
+                      source: DCAE
+                      target: APEX
+                      parameter:
+                        entry:
+                        - key: count
+                          value:
+                            key: count
+                            fieldSchemaKey:
+                              name: SimpleIntType
+                              version: 0.0.1
+                            optional: false
+                        - key: serverTimeMs
+                          value:
+                            key: serverTimeMs
+                            fieldSchemaKey:
+                              name: SimpleIntType
+                              version: 0.0.1
+                            optional: false
+                  - key:
+                      name: PMSubscriptionOutputEvent
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: PMSubscriptionOutputEvent
+                        version: 0.0.1
+                      nameSpace: org.onap.policy.apex.onap.pmcontrol
+                      source: APEX
+                      target: APEX
+                      parameter:
+                        entry:
+                        - key: albumID
+                          value:
+                            key: albumID
+                            fieldSchemaKey:
+                              name: UUIDType
+                              version: 0.0.1
+                            optional: false
+                  - key:
+                      name: pmsh-operational-policy
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: pmsh-operational-policy
+                        version: 0.0.1
+                      nameSpace: org.onap.policy.apex.onap.pmcontrol
+                      source: DCAE
+                      target: APEX
+                      parameter:
+                        entry:
+                        - key: blueprintName
+                          value:
+                            key: blueprintName
+                            fieldSchemaKey:
+                              name: SimpleStringType
+                              version: 0.0.1
+                            optional: false
+                        - key: blueprintVersion
+                          value:
+                            key: blueprintVersion
+                            fieldSchemaKey:
+                              name: SimpleStringType
+                              version: 0.0.1
+                            optional: false
+                        - key: changeType
+                          value:
+                            key: changeType
+                            fieldSchemaKey:
+                              name: SimpleStringType
+                              version: 0.0.1
+                            optional: false
+                        - key: closedLoopControlName
+                          value:
+                            key: closedLoopControlName
+                            fieldSchemaKey:
+                              name: SimpleStringType
+                              version: 0.0.1
+                            optional: false
+                        - key: nfName
+                          value:
+                            key: nfName
+                            fieldSchemaKey:
+                              name: SimpleStringType
+                              version: 0.0.1
+                            optional: false
+                        - key: policyName
+                          value:
+                            key: policyName
+                            fieldSchemaKey:
+                              name: SimpleStringType
+                              version: 0.0.1
+                            optional: false
+                        - key: subscription
+                          value:
+                            key: subscription
+                            fieldSchemaKey:
+                              name: SubscriptionType
+                              version: 0.0.1
+                            optional: false
+              albums:
+                key:
+                  name: PMControlPolicy_Albums
+                  version: 0.0.1
+                albums:
+                  entry:
+                  - key:
+                      name: PMSubscriptionAlbum
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: PMSubscriptionAlbum
+                        version: 0.0.1
+                      scope: policy
+                      isWritable: true
+                      itemSchema:
+                        name: PMSubscriptionType
+                        version: 0.0.1
+              schemas:
+                key:
+                  name: PMControlPolicy_Schemas
+                  version: 0.0.1
+                schemas:
+                  entry:
+                  - key:
+                      name: CDSActionIdentifiersType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSActionIdentifiersType
+                        version: 0.0.1
+                      schemaFlavour: Avro
+                      schemaDefinition: |-
+                        {
+                            "type": "record",
+                            "name": "ActionIdentifiers_Type",
+                            "namespace": "org.onap.policy.apex.onap.helloworld",
+                            "fields": [
+                                {
+                                    "name": "actionName",
+                                    "type": "string"
+                                },
+                                {
+                                    "name": "blueprintName",
+                                    "type": "string"
+                                },
+                                {
+                                    "name": "blueprintVersion",
+                                    "type": "string"
+                                },
+                                {
+                                    "name": "mode",
+                                    "type": "string"
+                                }
+                            ]
+                        }
+                  - key:
+                      name: CDSCreateResponsePayloadType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSCreateResponsePayloadType
+                        version: 0.0.1
+                      schemaFlavour: Avro
+                      schemaDefinition: |-
+                        {
+                          "name": "CreateResponsePayloadEntry",
+                          "type": "record",
+                          "namespace": "org.onap.policy.apex.onap.helloworld",
+                          "fields": [
+                            {
+                              "name": "create_DasH_subscription_DasH_response",
+                              "type": {
+                                "name": "create_DasH_subscription_DasH_response",
+                                "type": "record",
+                                "fields": [
+                                  {
+                                    "name": "odl_DasH_response",
+                                    "type": {
+                                      "name": "odl_DasH_response",
+                                      "type": "record",
+                                      "fields": [
+                                          {
+                                            "name": "status",
+                                            "type": "string"
+                                          }
+                                      ]
+                                    }
+                                  }
+                                ]
+                              }
+                            }
+                          ]
+                        }
+                  - key:
+                      name: CDSCreateSubscriptionPayloadType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSCreateSubscriptionPayloadType
+                        version: 0.0.1
+                      schemaFlavour: Avro
+                      schemaDefinition: |-
+                        {
+                          "type": "map",
+                          "values": {
+                            "type": "record",
+                            "name": "CDSRequestPayloadEntry",
+                            "fields": [
+                              {
+                                "name": "create_DasH_subscription_DasH_properties",
+                                "type": {
+                                  "name": "create_DasH_subscription_DasH_properties_record",
+                                  "type": "record",
+                                  "fields": [
+                                    {
+                                      "name": "nfName",
+                                      "type": "string"
+                                    },
+                                    {
+                                      "name": "subscriptionName",
+                                      "type": "string"
+                                    },
+                                    {
+                                      "name": "administrativeState",
+                                      "type": "string"
+                                    },
+                                    {
+                                      "name": "fileBasedGP",
+                                      "type": "string"
+                                    },
+                                    {
+                                      "name": "fileLocation",
+                                      "type": "string"
+                                    },
+                                    {
+                                      "name": "measurementGroups",
+                                      "type": {
+                                        "type": "array",
+                                        "items": {
+                                          "name": "measurementGroups_record",
+                                          "type": "record",
+                                          "fields": [
+                                            {
+                                              "name": "measurementGroup",
+                                              "type": {
+                                                "name": "measurementGroup",
+                                                "type": "record",
+                                                "fields": [
+                                                  {
+                                                    "name": "measurementTypes",
+                                                    "type": {
+                                                      "type": "array",
+                                                      "items": {
+                                                        "name": "measurementTypes_record",
+                                                        "type": "record",
+                                                        "fields": [
+                                                          {
+                                                            "name": "measurementType",
+                                                            "type": "string"
+                                                          }
+                                                        ]
+                                                      }
+                                                    }
+                                                  },
+                                                  {
+                                                    "name": "managedObjectDNsBasic",
+                                                    "type": {
+                                                      "type": "array",
+                                                      "items": {
+                                                        "name": "managedObjectDNsBasic_record",
+                                                        "type": "record",
+                                                        "fields": [
+                                                          {
+                                                            "name": "DN",
+                                                            "type": "string"
+                                                          }
+                                                        ]
+                                                      }
+                                                    }
+                                                  }
+                                                ]
+                                              }
+                                            }
+                                          ]
+                                        }
+                                      }
+                                    }
+                                  ]
+                                }
+                              }
+                            ]
+                          }
+                        }
+                  - key:
+                      name: CDSDeleteResponsePayloadType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSDeleteResponsePayloadType
+                        version: 0.0.1
+                      schemaFlavour: Avro
+                      schemaDefinition: |-
+                        {
+                          "name": "DeleteResponsePayloadEntry",
+                          "type": "record",
+                          "namespace": "com.acme.avro",
+                          "fields": [
+                            {
+                              "name": "delete_DasH_subscription_DasH_response",
+                              "type": {
+                                "name": "delete_DasH_subscription_DasH_response",
+                                "type": "record",
+                                "fields": [
+                                  {
+                                    "name": "odl_DasH_response",
+                                    "type": {
+                                      "name": "odl_DasH_response",
+                                      "type": "record",
+                                      "fields": [
+                                          {
+                                            "name": "status",
+                                            "type": "string"
+                                          }
+                                      ]
+                                    }
+                                  }
+                                ]
+                              }
+                            }
+                          ]
+                        }
+                  - key:
+                      name: CDSDeleteSubscriptionPayloadType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSDeleteSubscriptionPayloadType
+                        version: 0.0.1
+                      schemaFlavour: Avro
+                      schemaDefinition: |-
+                        {
+                          "type": "map",
+                          "values": {
+                            "type": "record",
+                            "name": "CDSRequestPayloadEntry",
+                            "fields": [
+                              {
+                                "name": "delete_DasH_subscription_DasH_properties",
+                                "type": {
+                                  "name": "delete_DasH_subscription_DasH_properties_record",
+                                  "type": "record",
+                                  "fields": [
+                                    {
+                                      "name": "nfName",
+                                      "type": "string"
+                                    },
+                                    {
+                                      "name": "subscriptionName",
+                                      "type": "string"
+                                    },
+                                    {
+                                      "name": "administrativeState",
+                                      "type": "string"
+                                    },
+                                    {
+                                      "name": "fileBasedGP",
+                                      "type": "string"
+                                    },
+                                    {
+                                      "name": "fileLocation",
+                                      "type": "string"
+                                    },
+                                    {
+                                      "name": "measurementGroups",
+                                      "type": {
+                                        "type": "array",
+                                        "items": {
+                                          "name": "measurementGroups_record",
+                                          "type": "record",
+                                          "fields": [
+                                            {
+                                              "name": "measurementGroup",
+                                              "type": {
+                                                "name": "measurementGroup",
+                                                "type": "record",
+                                                "fields": [
+                                                  {
+                                                    "name": "measurementTypes",
+                                                    "type": {
+                                                      "type": "array",
+                                                      "items": {
+                                                        "name": "measurementTypes_record",
+                                                        "type": "record",
+                                                        "fields": [
+                                                          {
+                                                            "name": "measurementType",
+                                                            "type": "string"
+                                                          }
+                                                        ]
+                                                      }
+                                                    }
+                                                  },
+                                                  {
+                                                    "name": "managedObjectDNsBasic",
+                                                    "type": {
+                                                      "type": "array",
+                                                      "items": {
+                                                        "name": "managedObjectDNsBasic_record",
+                                                        "type": "record",
+                                                        "fields": [
+                                                          {
+                                                            "name": "DN",
+                                                            "type": "string"
+                                                          }
+                                                        ]
+                                                      }
+                                                    }
+                                                  }
+                                                ]
+                                              }
+                                            }
+                                          ]
+                                        }
+                                      }
+                                    }
+                                  ]
+                                }
+                              }
+                            ]
+                          }
+                        }
+                  - key:
+                      name: CDSRequestCommonHeaderType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSRequestCommonHeaderType
+                        version: 0.0.1
+                      schemaFlavour: Avro
+                      schemaDefinition: |-
+                        {
+                            "type": "record",
+                            "name": "RequestCommonHeader_Type",
+                            "namespace": "org.onap.policy.apex.onap.helloworld",
+                            "fields": [
+                                {
+                                    "name": "originatorId",
+                                    "type": "string"
+                                },
+                                {
+                                    "name": "requestId",
+                                    "type": "string"
+                                },
+                                {
+                                    "name": "subRequestId",
+                                    "type": "string"
+                                }
+                            ]
+                        }
+                  - key:
+                      name: CDSResponseCommonHeaderType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSResponseCommonHeaderType
+                        version: 0.0.1
+                      schemaFlavour: Avro
+                      schemaDefinition: |-
+                        {
+                            "type": "record",
+                            "name": "ResponseCommonHeader_Type",
+                            "namespace": "org.onap.policy.apex.onap.helloworld",
+                            "fields": [
+                                {
+                                    "name": "originatorId",
+                                    "type": "string"
+                                },
+                                {
+                                    "name": "requestId",
+                                    "type": "string"
+                                },
+                                {
+                                    "name": "subRequestId",
+                                    "type": "string"
+                                },
+                                {
+                                    "name": "timestamp",
+                                    "type": "string"
+                                },
+                                {
+                                    "name": "flags",
+                                    "type": ["null", "string"]
+                                }
+                            ]
+                        }
+                  - key:
+                      name: CDSResponseStatusType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSResponseStatusType
+                        version: 0.0.1
+                      schemaFlavour: Avro
+                      schemaDefinition: |-
+                        {
+                            "type": "record",
+                            "name": "ResponseStatus_Type",
+                            "namespace": "org.onap.policy.apex.onap.helloworld",
+                            "fields": [
+                                {
+                                    "name": "code",
+                                    "type": "int"
+                                },
+                                {
+                                    "name": "eventType",
+                                    "type": "string"
+                                },
+                                {
+                                    "name": "timestamp",
+                                    "type": "string"
+                                },
+                                {
+                                    "name": "message",
+                                    "type": "string"
+                                }
+                            ]
+                        }
+                  - key:
+                      name: PMSubscriptionType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: PMSubscriptionType
+                        version: 0.0.1
+                      schemaFlavour: Avro
+                      schemaDefinition: "{\n\t\"name\": \"PMSubscription\",\n\t\"type\": \"record\",\n\t\"namespace\": \"\
+                        org.onap.policy.apex.onap.pmcontrol\",\n\t\"fields\": [\n        {\n            \"name\": \"nfName\"\
+                        ,\n            \"type\": \"string\"\n        },\n\t    {\n\t\t\t\"name\": \"changeType\",\n\t\t\t\"\
+                        type\": \"string\"\n\t\t},\n\t\t{\n\t\t\t\"name\": \"closedLoopControlName\",\n\t\t\t\"type\": \"\
+                        string\"\n\t\t},\n\t\t{\n\t\t\t\"name\": \"policyName\",\n\t\t\t\"type\": \"string\"\n\t\t},\n\t\t\
+                        {\n\t\t    \"name\": \"blueprintName\",\n\t\t    \"type\": \"string\"\n\t\t},\n\t\t{\n\t\t    \"name\"\
+                        : \"blueprintVersion\",\n\t\t    \"type\": \"string\"\n\t\t},\n\t\t{\n\t\t\t\"name\": \"subscription\"\
+                        ,\n\t\t\t\"type\": {\n\t\t\t\t\"name\": \"subscription\",\n\t\t\t\t\"type\": \"record\",\n\t\t\t\t\
+                        \"fields\": [{\n\t\t\t\t\t\t\"name\": \"subscriptionName\",\n\t\t\t\t\t\t\"type\": \"string\"\n\t\t\
+                        \t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"name\": \"administrativeState\",\n\t\t\t\t\t\t\"type\": \"string\"\
+                        \n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"name\": \"fileBasedGP\",\n\t\t\t\t\t\t\"type\": \"int\"\
+                        \n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"name\": \"fileLocation\",\n\t\t\t\t\t\t\"type\": \"string\"\
+                        \n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"name\": \"measurementGroups\",\n\t\t\t\t\t\t\"type\": {\n\
+                        \t\t\t\t\t\t\t\"type\": \"array\",\n\t\t\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\t\t\"name\": \"Measurement_Groups_Type\"\
+                        ,\n\t\t\t\t\t\t\t\t\"type\": \"record\",\n\t\t\t\t\t\t\t\t\"fields\": [{\n\t\t\t\t\t\t\t\t\t\"name\"\
+                        : \"measurementGroup\",\n\t\t\t\t\t\t\t\t\t\"type\": {\n\t\t\t\t\t\t\t\t\t\t\"name\": \"Measurement_Group_Type\"\
+                        ,\n\t\t\t\t\t\t\t\t\t\t\"type\": \"record\",\n\t\t\t\t\t\t\t\t\t\t\"fields\": [{\n\t\t\t\t\t\t\t\t\
+                        \t\t\t\t\"name\": \"measurementTypes\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"type\": {\n\t\t\t\t\t\t\t\t\t\t\
+                        \t\t\t\"type\": \"array\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"\
+                        name\": \"Measurement_Types_Type\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"type\": \"record\",\n\t\t\t\t\t\
+                        \t\t\t\t\t\t\t\t\t\"fields\": [{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"name\": \"measurementType\",\n\t\
+                        \t\t\t\t\t\t\t\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}]\n\t\t\t\t\t\t\t\t\
+                        \t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\
+                        \t\t\t\t\t\t\t\t\"name\": \"managedObjectDNsBasic\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"type\": {\n\t\t\t\t\
+                        \t\t\t\t\t\t\t\t\t\"type\": \"array\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\t\t\t\
+                        \t\t\t\t\t\"name\": \"Managed_Object_Dns_Basic_Type\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"type\": \"record\"\
+                        ,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"fields\": [{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"name\": \"DN\",\n\t\
+                        \t\t\t\t\t\t\t\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}]\n\t\t\t\t\t\t\t\t\
+                        \t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\
+                        \t\t\t\t}\n\t\t\t\t\t\t\t\t}]\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}\n\t\
+                        \t}\n\t]\n}"
+                  - key:
+                      name: SimpleIntType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: SimpleIntType
+                        version: 0.0.1
+                      schemaFlavour: Java
+                      schemaDefinition: java.lang.Integer
+                  - key:
+                      name: SimpleStringType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: SimpleStringType
+                        version: 0.0.1
+                      schemaFlavour: Java
+                      schemaDefinition: java.lang.String
+                  - key:
+                      name: SubscriptionStatusType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: SubscriptionStatusType
+                        version: 0.0.1
+                      schemaFlavour: Avro
+                      schemaDefinition: |-
+                        {
+                            "type": "record",
+                            "name": "ActivateSubscriptionStatus_Type",
+                            "namespace": "org.onap.policy.apex.onap.helloworld",
+                            "fields": [
+                                {
+                                    "name": "subscriptionName",
+                                    "type": "string"
+                                },
+                                {
+                                    "name": "nfName",
+                                    "type": "string"
+                                },
+                                {
+                                    "name": "changeType",
+                                    "type": "string"
+                                },
+                                {
+                                    "name": "message",
+                                    "type": "string"
+                                }
+                            ]
+                        }
+                  - key:
+                      name: SubscriptionType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: SubscriptionType
+                        version: 0.0.1
+                      schemaFlavour: Avro
+                      schemaDefinition: "{\n\t\"name\": \"subscription\",\n\t\"type\": \"record\",\n\t\"fields\": [{\n\t\t\
+                        \t\"name\": \"subscriptionName\",\n\t\t\t\"type\": \"string\"\n\t\t},\n\t\t{\n\t\t\t\"name\": \"administrativeState\"\
+                        ,\n\t\t\t\"type\": \"string\"\n\t\t},\n\t\t{\n\t\t\t\"name\": \"fileBasedGP\",\n\t\t\t\"type\": \"\
+                        int\"\n\t\t},\n\t\t{\n\t\t\t\"name\": \"fileLocation\",\n\t\t\t\"type\": \"string\"\n\t\t},\n\t\t\
+                        {\n\t\t\t\"name\": \"measurementGroups\",\n\t\t\t\"type\": {\n\t\t\t\t\"type\": \"array\",\n\t\t\t\
+                        \t\"items\": {\n\t\t\t\t\t\"name\": \"Measurement_Groups_Type\",\n\t\t\t\t\t\"type\": \"record\",\n\
+                        \t\t\t\t\t\"fields\": [{\n\t\t\t\t\t\t\"name\": \"measurementGroup\",\n\t\t\t\t\t\t\"type\": {\n\t\
+                        \t\t\t\t\t\t\"name\": \"Measurement_Group_Type\",\n\t\t\t\t\t\t\t\"type\": \"record\",\n\t\t\t\t\t\
+                        \t\t\"fields\": [{\n\t\t\t\t\t\t\t\t\t\"name\": \"measurementTypes\",\n\t\t\t\t\t\t\t\t\t\"type\"\
+                        : {\n\t\t\t\t\t\t\t\t\t\t\"type\": \"array\",\n\t\t\t\t\t\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\t\t\t\
+                        \t\t\"name\": \"Measurement_Types_Type\",\n\t\t\t\t\t\t\t\t\t\t\t\"type\": \"record\",\n\t\t\t\t\t\
+                        \t\t\t\t\t\t\"fields\": [{\n\t\t\t\t\t\t\t\t\t\t\t\t\"name\": \"measurementType\",\n\t\t\t\t\t\t\t\
+                        \t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t\t\t\t\t\t}]\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\
+                        }\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"name\": \"managedObjectDNsBasic\",\n\
+                        \t\t\t\t\t\t\t\t\t\"type\": {\n\t\t\t\t\t\t\t\t\t\t\"type\": \"array\",\n\t\t\t\t\t\t\t\t\t\t\"items\"\
+                        : {\n\t\t\t\t\t\t\t\t\t\t\t\"name\": \"Managed_Object_Dns_Basic_Type\",\n\t\t\t\t\t\t\t\t\t\t\t\"\
+                        type\": \"record\",\n\t\t\t\t\t\t\t\t\t\t\t\"fields\": [{\n\t\t\t\t\t\t\t\t\t\t\t\t\"name\": \"DN\"\
+                        ,\n\t\t\t\t\t\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t\t\t\t\t\t}]\n\t\t\t\t\t\t\t\t\t\t}\n\
+                        \t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t}\n\t\t\t\t\t}]\n\t\t\t\t}\n\t\
+                        \t\t}\n\t\t}\n\t]\n}"
+                  - key:
+                      name: UUIDType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: UUIDType
+                        version: 0.0.1
+                      schemaFlavour: Java
+                      schemaDefinition: java.util.UUID
+          engineParameters:
+            executorParameters:
+              JAVASCRIPT:
+                parameterClassName: org.onap.policy.apex.plugins.executor.javascript.JavascriptExecutorParameters
+            contextParameters:
+              parameterClassName: org.onap.policy.apex.context.parameters.ContextParameters
+              schemaParameters:
+                Avro:
+                  parameterClassName: org.onap.policy.apex.plugins.context.schema.avro.AvroSchemaHelperParameters
+                Java:
+                  parameterClassName: org.onap.policy.apex.context.impl.schema.java.JavaSchemaHelperParameters
+                  jsonAdapters:
+                    Instant:
+                      adaptedClass: java.time.Instant
+                      adaptorClass: org.onap.policy.controlloop.util.Serialization$GsonInstantAdapter
+        eventInputParameters:
+          DCAEConsumer:
+            carrierTechnologyParameters:
+              carrierTechnology: RESTCLIENT
+              parameterClassName: org.onap.policy.apex.plugins.event.carrier.restclient.RestClientCarrierTechnologyParameters
+              parameters:
+                consumerPollTime: '50'
+                url: https://message-router:3905/events/unauthenticated.DCAE_CL_OUTPUT/cg1/sg1
+            eventProtocolParameters:
+              eventProtocol: JSON
+              parameters:
+                nameAlias: policyName
+            eventName: pmsh-operational-policy
+            eventNameFilter: pmsh-operational-policy
+          CDSRequestConsumer:
+            carrierTechnologyParameters:
+              carrierTechnology: RESTREQUESTOR
+              parameterClassName: org.onap.policy.apex.plugins.event.carrier.restrequestor.RestRequestorCarrierTechnologyParameters
+              parameters:
+                url: http://10.10.10.184:30254/api/v1/execution-service/process
+                httpMethod: POST
+                restRequestTimeout: 2000
+                httpHeaders:
+                - - Authorization
+                  - Basic Y2NzZGthcHBzOmNjc2RrYXBwcw==
+            eventProtocolParameters:
+              eventProtocol: JSON
+            eventName: CDSCreateResponseEvent
+            eventNameFilter: CDSCreateResponseEvent
+            requestorMode: true
+            requestorPeer: CDSRequestProducer
+            requestorTimeout: 500
+          CDSDeleteRequestConsumer:
+            carrierTechnologyParameters:
+              carrierTechnology: RESTREQUESTOR
+              parameterClassName: org.onap.policy.apex.plugins.event.carrier.restrequestor.RestRequestorCarrierTechnologyParameters
+              parameters:
+                url: http://10.10.10.184:30254/api/v1/execution-service/process
+                httpMethod: POST
+                restRequestTimeout: 2000
+                httpHeaders:
+                - - Authorization
+                  - Basic Y2NzZGthcHBzOmNjc2RrYXBwcw==
+            eventProtocolParameters:
+              eventProtocol: JSON
+            eventName: CDSDeleteResponseEvent
+            eventNameFilter: CDSDeleteResponseEvent
+            requestorMode: true
+            requestorPeer: CDSDeleteRequestProducer
+            requestorTimeout: 500
+          CDSReplyConsumer:
+            carrierTechnologyParameters:
+              carrierTechnology: RESTREQUESTOR
+              parameterClassName: org.onap.policy.apex.plugins.event.carrier.restrequestor.RestRequestorCarrierTechnologyParameters
+              parameters:
+                url: https://message-router:3905/events/unauthenticated.PMSH_CL_INPUT
+                httpMethod: POST
+                restRequestTimeout: 2000
+            eventProtocolParameters:
+              eventProtocol: JSON
+            eventName: MRResponseEvent
+            eventNameFilter: MRResponseEvent
+            requestorMode: true
+            requestorPeer: CDSReplyProducer
+            requestorTimeout: 500
+        eventOutputParameters:
+          logOutputter:
+            carrierTechnologyParameters:
+              carrierTechnology: FILE
+              parameters:
+                fileName: /tmp/outputevents.log
+            eventProtocolParameters:
+              eventProtocol: JSON
+          StdOutOutputter:
+            carrierTechnologyParameters:
+              carrierTechnology: FILE
+              parameters:
+                standardIo: true
+            eventProtocolParameters:
+              eventProtocol: JSON
+          CDSRequestProducer:
+            carrierTechnologyParameters:
+              carrierTechnology: RESTREQUESTOR
+              parameterClassName: org.onap.policy.apex.plugins.event.carrier.restrequestor.RestRequestorCarrierTechnologyParameters
+            eventProtocolParameters:
+              eventProtocol: JSON
+            eventNameFilter: CDSCreateSubscriptionRequestEvent
+            requestorMode: true
+            requestorPeer: CDSRequestConsumer
+            requestorTimeout: 500
+          CDSDeleteRequestProducer:
+            carrierTechnologyParameters:
+              carrierTechnology: RESTREQUESTOR
+              parameterClassName: org.onap.policy.apex.plugins.event.carrier.restrequestor.RestRequestorCarrierTechnologyParameters
+            eventProtocolParameters:
+              eventProtocol: JSON
+            eventNameFilter: CDSDeleteSubscriptionRequestEvent
+            requestorMode: true
+            requestorPeer: CDSDeleteRequestConsumer
+            requestorTimeout: 500
+          CDSReplyProducer:
+            carrierTechnologyParameters:
+              carrierTechnology: RESTREQUESTOR
+              parameterClassName: org.onap.policy.apex.plugins.event.carrier.restrequestor.RestRequestorCarrierTechnologyParameters
+            eventProtocolParameters:
+              eventProtocol: JSON
+            eventNameFilter: CDSResponseStatusEvent
+            requestorMode: true
+            requestorPeer: CDSReplyConsumer
+            requestorTimeout: 500
diff --git a/common/src/main/resources/examples/controlloop/PMSubscriptionHandling_GuilinFormat.yaml b/common/src/main/resources/examples/controlloop/PMSubscriptionHandling_GuilinFormat.yaml
new file mode 100644
index 0000000..51e3696
--- /dev/null
+++ b/common/src/main/resources/examples/controlloop/PMSubscriptionHandling_GuilinFormat.yaml
@@ -0,0 +1,455 @@
+# ============LICENSE_START=======================================================
+# Copyright (C) 2021 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=========================================================
+
+tosca_definitions_version: tosca_simple_yaml_1_3
+capability_types:
+  org.onap.EventProducer:
+    properties:
+      carrier_protocol_type:
+        type: string
+        required: true
+        constraints:
+        - valid_values:
+          - DMAAP_message_router
+          - SOMETHING_ELSE
+          - REST
+      data_format:
+        type: string
+        required: true
+        constraints:
+        - valid_values:
+          - JSON
+          - YAML
+          - JMS
+      event_format:
+        type: string
+        required: true
+      event_format_version:
+        type: string
+        required: false
+      config_keys:
+        type: list
+        required: false
+        entry_schema:
+          type: string
+          constraints:
+          - valid_values:
+            - all valid values should be added here
+            - if not specified, events of any config key may be generated
+            - 'examples for config_key: ves-measurement, ves-syslog, tca_handle_out,
+              etc.'
+    version: 0.0.1
+    derived_from: tosca.capabilities.Root
+  org.onap.EventConsumer:
+    properties:
+      responding_capability:
+        type: string
+        required: false
+      carrier_protocol_type:
+        type: string
+        required: true
+        constraints:
+        - valid_values:
+          - DMAAP_message_router
+          - SOMETHING_ELSE
+          - REST
+      data_format:
+        type: string
+        required: true
+        constraints:
+        - valid_values:
+          - JSON
+          - YAML
+          - JMS
+          - all valid values should be added here
+      event_format:
+        type: string
+        description: 'examples for event_format: Ves_specification, LinkUp, VnfConfigured,
+          etc.'
+        required: true
+      event_format_version:
+        type: string
+        description: 'examples for event_format_version: 5.28.4, 7.30.1, etc.'
+        required: false
+      config_keys:
+        type: list
+        required: false
+        entry_schema:
+          type: string
+          constraints:
+          - valid_values:
+            - all valid values should be added here
+            - if not specified, events of any config key may be generated
+            - 'examples for config_key: ves-measurement, ves-syslog, tca_handle_out,
+              etc.'
+    version: 0.0.1
+    derived_from: tosca.capabilities.Root
+node_types:
+  org.onap.DynamicConfig:
+    properties:
+      application_name:
+        type: string
+        description: Value used to tie the config to an application ? should we be
+          using a relationship here instead?
+        required: true
+      application_version:
+        type: string
+        required: true
+      application_provider:
+        type: string
+        required: false
+      data_types:
+        type: object
+        required: false
+      schema:
+        type: object
+        required: false
+    version: 0.0.1
+    derived_from: tosca.nodes.Root
+  org.onap.APP:
+    properties:
+      application_name:
+        type: string
+        description: Human readable name for the application Product
+        required: false
+      provider:
+        type: string
+        description: Provider of the application and of the descriptor
+        required: true
+      application_version:
+        type: string
+        description: Software version of the application
+        required: true
+      blueprint_id:
+        type: string
+        description: A reference to the app blueprint
+        required: false
+      monitoring_policy:
+        type: string
+        description: A reference to the monitoring policy
+        required: false
+    requirements:
+    - receive:
+        capability: org.onap.EventProducer
+        relationship: org.onap.PropagateEvent
+        occurrences:
+        - 0
+        - UNBOUNDED
+    - send:
+        capability: org.onap.EventConsumer
+        relationship: org.onap.PropagateEvent
+        occurrences:
+        - 0
+        - UNBOUNDED
+    version: 0.0.1
+    derived_from: tosca.nodes.Root
+  org.onap.EventRelay:
+    properties:
+      event_format:
+        type: string
+        description: 'examples for event_format: Ves_specification, etc.'
+        required: true
+      event_format_version:
+        type: string
+        description: 'examples for event_format_version: 5.28.4, 7.30.1, etc.'
+        required: true
+      config_keys:
+        type: list
+        required: false
+        entry_schema:
+          type: string
+          constraints:
+          - valid_values:
+            - all valid values should be added here
+            - if not specified, events of any config key is relayed
+            - 'examples for config_key: ves-measurement, ves-syslog, tca_handle_out,
+              etc.'
+      supported_carrier_protocols:
+        type: map
+        description: 'A map describing supported carrier protocols and translations.
+          The tuples define what protocol combinations are supported on the producer
+          and consumer side: e.g. { REST: REST, DMAAP: REST, DMAAP: DMAAP}'
+        required: true
+        key_schema:
+          type: string
+          constraints:
+          - valid_values:
+            - DMAAP_message_router
+            - SOMETHING_ELSE
+            - REST
+            - all valid values should be added here
+        entry_schema:
+          type: string
+          constraints:
+          - valid_values:
+            - DMAAP_message_router
+            - SOMETHING_ELSE
+            - REST
+            - all valid values should be added here
+      supported_data_formats:
+        type: map
+        description: 'Is a map describing supported data formats and translation.
+          The tuples define what protocol combinations are supported on the producer
+          and consumer side: e.g. { JSON: JSON, JMS: JSON, YAML:YAML }'
+        required: true
+        key_schema:
+          type: string
+          constraints:
+          - valid_values:
+            - JSON
+            - JMS
+            - YAML
+            - etc
+            - all valid values should be added here
+        entry_schema:
+          type: string
+          constraints:
+          - valid_values:
+            - JSON
+            - JMS
+            - YAML
+            - etc
+            - all valid values should be added here
+    requirements:
+    - receive:
+        capability: org.onap.EventProducer
+        relationship: org.onap.PropagateEvent
+        occurrences:
+        - 0
+        - UNBOUNDED
+    - send:
+        capability: org.onap.EventConsumer
+        relationship: org.onap.PropagateEvent
+        occurrences:
+        - 0
+        - UNBOUNDED
+    version: 0.0.1
+    derived_from: tosca.nodes.Root
+relationship_types:
+  org.onap.PropagateEvent:
+    properties:
+      config_keys:
+        type: list
+        description: The relationship type used on requirements to org.onap.EventProducer
+          and org.onap.EventConsumer capabilities. Filters events by specific config_keys
+          to be transferred by this relationship. That is, any event with a specific
+          config_key found in the list is transferred. If list is not defined or is
+          empty, events with all config_keys are transferred.
+        required: false
+        entry_schema:
+          type: string
+    version: 0.0.1
+    derived_from: tosca.relationships.Root
+topology_template:
+  inputs:
+    pm_subscription_topic:
+      type: string
+    pm_subscription_response_topic:
+      type: string
+    pm_subscription_handler_blueprint_id:
+      type: string
+    pm_subscription_operational_policy_id:
+      type: string
+    pm_subscription_cds_blueprint_id:
+      type: string
+    enable_tls:
+      type: string
+  node_templates:
+    org.onap.PM_Subscription_Handler:
+      type: org.onap.polcy.clamp.ControlLoopElement
+      properties:
+        application_name: PM Subscription Handler
+        provider: Ericsson
+        application_version: 1.0.0
+        artifact_id:
+          get_input: pm_subscription_handler_blueprint_id
+          description: Is this a reference to the DCAE Cloudify Blueprint that is
+            already stored(or will be stored before CL configuration & instatiation)
+            in DCAE Inventory?
+        artifact_config:
+          enable_tls:
+            get_input: enable_tls
+          pmsh_publish_topic_name:
+            get_input: pm_subscription_topic
+      capabilities:
+        pm-subscription-event-publisher:
+          properties:
+            carrier_protocol_type: DMAAP_message_router
+            data_format: JSON
+            event_format: pm-subscription-event-format
+            event_format_version: 1.0.0
+          attributes:
+            type: org.onap.EventProducer
+          occurrences:
+          - 0
+          - UNBOUNDED
+        pm-subscription-event-receiver:
+          properties:
+            carrier_protocol_type: DMAAP_message_router
+            data_format: JSON
+            event_format: pm-subscription-event-response-format
+            event_format_version: 1.0.0
+            relationships:
+            - type: tosca.relationships.DependsOn
+            - description: any ideas on a better realtionship ? or is it better to
+                just use the root realtionship ?
+            - target: org.onap.PM_Monitoring_Policy
+          attributes:
+            type: org.onap.EventConsumer
+          occurrences:
+          - 0
+          - UNBOUNDED
+    org.onap.PM_Monitoring_Policy:
+      type: org.onap.DynamicConfig
+      properties:
+        application_name: PM Subscription Handler
+        application_version: 1.0.0
+        provider: Ericsson
+        data_types:
+          measurementType:
+            type: string
+          DN:
+            type: string
+          nfFilter:
+            properties:
+              nfNames:
+                type: list
+                entry_schema: string
+              modelInvariantIDs:
+                type: list
+                entry_schema:
+                  type: string
+              modelVersionIDs:
+                type: list
+                entry_schema:
+                  type: string
+          measurementGroup:
+            properties:
+              masurementTypes:
+                type: list
+                entry_schema:
+                  type: measurementType
+              managedObjectDNsBasic:
+                type: list
+                entry_schema:
+                  type: DN
+        schema:
+          subscription:
+            subscriptionName:
+              type: string
+              required: true
+            administrativeState:
+              type: string
+              required: true
+            filebasedGP:
+              type: integer
+              required: true
+            fileLocation:
+              type: string
+              required: true
+            nfFilter:
+              type: nfFilter
+            measurementGroups:
+              type: list
+              entry_schema:
+                type: measurementGroup
+      description: Should I be showing a dependency between PM Subscription Handler
+        and the PM Monitoring Policy
+    org.onap.PM_Policy:
+      type: org.onap.APP
+      properties:
+        application_name: PM Subscription Operational Policy
+        provider: Ericsson
+        application_version: 1.0.0
+        artifact_id:
+          get_input: pm_subscription_operational_policy_id
+        artifact_config: NOT_DEFINED
+      requirements:
+      - receive_0:
+          capability: pm-subscription-event-publisher
+          node: org.onap.PM_Subscription_Handler
+          relationship: NOT_DEFINED
+          properties:
+            config_keys:
+            - topic_name:
+                get_input: pm_subscription_topic
+      - send_0:
+          capability: cds-rest-receive
+          node: org.onap.CDS
+      - receive_1:
+          capability: cds-rest-response
+          node: org.onap.CDS
+      - send_1:
+          capability: pm-subscription-event-receiver
+          node: org.onap.PM_Subscription_Handler
+          relationship: NOT_DEFINED
+          properties:
+            config_keys:
+            - topic_name:
+                get_input: pm_subscription_response_topic
+      capabilities:
+        pm-subscription-response-event-publisher:
+          properties:
+            type: org.onap.EventProducer
+            carrier_protocol_type: DMAAP_message_router
+            data_format: JSON
+            event_format: pm-subscription-event-response-format
+            event_format_version: 1.0.0
+          occurrences:
+          - 0
+          - UNBOUNDED
+    org.onap.PM_CDS_Blueprint:
+      type: org.onap.APP
+      properties:
+        application_name: PM Subscription CDS Blueprint
+        provider: Ericsson
+        application_version: 1.0.0
+        artifact_id:
+          get_input: pm_subscription_cds_blueprint_id
+      capabilities:
+        cds-rest-receive:
+          properties:
+            type: org.onap.EventConsumer
+            protocol_type: REST
+            data_format: JSON
+            event_format: cds_action_format
+            event_format_version: 1.0.0
+            responding_capability: cds-rest-response
+          occurrences:
+            - 0
+            - UNBOUNDED
+        cds-rest-response:
+          properties:
+            type: org.onap.EventProducer
+            protocol_type: REST
+            data_format: JSON
+            event_format: cds_action_response_format
+            event_format_version: 1.0.0
+          occurrences:
+            - 0
+    org.onap.controlloop0:
+      version: 1.2.3
+      type: org.onap.policy.clamp.ControlLoop
+      properties:
+        application_name: Test Control Loop
+        provider: Ericsson
+        application_version: 1.0.0
+        status: NOT_DEPLOYED
+        elements:
+            element1: org.onap.PM_Monitoring_Policy
+
diff --git a/common/src/main/resources/examples/controlloop/original/cloop_DCAE_VES_TCA_substitution.yaml b/common/src/main/resources/examples/controlloop/original/cloop_DCAE_VES_TCA_substitution.yaml
new file mode 100644
index 0000000..96ea133
--- /dev/null
+++ b/common/src/main/resources/examples/controlloop/original/cloop_DCAE_VES_TCA_substitution.yaml
@@ -0,0 +1,83 @@
+# ============LICENSE_START=======================================================
+# Copyright (C) 2021 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=========================================================
+
+tosca_definitions_version: tosca_simple_yaml_1_3
+
+imports:
+  - cloop_base_types.yaml
+  - cloop_dcae_types.yaml
+
+topology_template:
+  inputs:
+    some_property_input:
+      type: string
+
+  substitution_mappings:
+    node_type: org.onap.DCAE_VES_TCA
+    properties:
+      some_property: { get_input: some_property_input }
+    capabilities:
+      VES-5.28.4-publisher: [ node1_VES_Collector, VES-5.28.4-publisher ]
+      VES-7.30.1-publisher: [ node1_VES_Collector, VES-7.30.1-publisher ]
+      TCA-handle-out-publisher: [ node2_TCA_GEN_2, TCA-handle-out-publisher ]
+      VES_specification-subscriber: [ node2_TCA_GEN_2, VES_specification-subscriber ]
+
+  node_templates:
+  ################################################################################
+  #alt1: without relay
+
+  node1_VES_Collector:
+    type: org.onap.VESCollector
+
+  node2_TCA_GEN_2:
+    type:  org.onap.TCA_GEN_2
+    requirements:
+      - receive:
+          capability: VES-5.28.4-publisher
+          node: node1_VES_Collector
+          relationship:
+            type: org.onap.PropagateEvent
+            properties:
+              config-keys: [ ves-measurement ]
+
+
+  ################################################################################
+  #alt2: with relay
+
+  node1_VES_Collector:
+    type: org.onap.VESCollector
+
+  node2_TCA_GEN_2:
+    type:  org.onap.TCA_GEN_2
+
+  node3_Relay:
+    type: org.onap.EventRelay
+    properties:
+      event_format: "VES_specification"
+      event_format_version: "5.28.4"
+      supported_carrier_protocols: [{ DMAAP_message_router: DMAAP_message_router }]
+      supported_data_formats: [{ JSON: JSON }]
+    requirements:
+      - receive:
+          node: node1_VES_Collector
+          properties:
+            config_keys: [ ves-measurement ]
+      - send:
+          node: node2_TCA_GEN_2
+          properties:
+            config_keys: [ ves-measurement ]
diff --git a/common/src/main/resources/examples/controlloop/original/cloop_base_types.yaml b/common/src/main/resources/examples/controlloop/original/cloop_base_types.yaml
new file mode 100644
index 0000000..4f29e56
--- /dev/null
+++ b/common/src/main/resources/examples/controlloop/original/cloop_base_types.yaml
@@ -0,0 +1,210 @@
+# ============LICENSE_START=======================================================
+# Copyright (C) 2021 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=========================================================
+
+tosca_definitions_version: tosca_simple_yaml_1_2
+
+capability_types:
+  #producer capability type
+  org.onap.EventProducer:
+    derived_from: tosca.capabilities.Root
+    properties:
+      carrier_protocol_type:
+        type: string
+        required: true
+        constraints:
+          valid_values: [ DMAAP_message_router,  REST ]
+          #all valid values should be added here
+      data_format:
+        type: string
+        required: true
+        constraints:
+          valid_values: [ JSON, YAML, JMS ]
+          #all valid values should be added here
+      event_format:
+        type: string
+        required: true
+        #examples for event_format: Ves_specification, etc.
+      event_format_version:
+        type: string
+        #examples for event_format_version: 5.28.4, 7.30.1, etc.
+      config_keys:
+        type: list
+        required: false
+        entry_schema:
+          type: string
+          constraints:
+            #valid_values: [ ]
+              #all valid values should be added here
+              #if not specified, events of any config key may be generated
+              #examples for config_key: ves-measurement, ves-syslog, tca_handle_out, etc.
+
+
+  #consumer capability type
+  org.onap.EventConsumer:
+    derived_from: tosca.capabilities.Root
+    properties:
+      carrier_protocol_type:
+        type: string
+        required: true
+        constraints:
+          valid_values: [ DMAAP_message_router, REST ]
+          #all valid values should be added here
+      data_format:
+        type: string
+        required: true
+        constraints:
+          valid_values: [ JSON, YAML, JMS ]
+          #all valid values should be added here
+      event_format:
+        type: string
+        required: true
+        #examples for event_format: Ves_specification, LinkUp, VnfConfigured, etc.
+      event_format_version:
+        type: string
+        #examples for event_format_version: 5.28.4, 7.30.1, etc.
+      config_keys:
+        type: list
+        required: false
+        entry_schema:
+          type: string
+          constraints:
+            #valid_values: [ ]
+              #all valid values should be added here
+              #if not specified, events of any config key may be generated
+              #examples for config_key: ves-measurement, ves-syslog, tca_handle_out, etc.
+
+
+relationship_types:
+  #the relationship type used on requirements to org.onap.EventProducer and org.onap.EventConsumer capabilities
+  org.onap.PropagateEvent:
+    derived_from: tosca.relationships.Root
+    properties:
+    config_keys:
+      type: list
+      required: false
+      description: >
+        Filters events by specific config_keys to be transferred by this relationship.
+        That is, any event with a specific config_key found in the list is transferred.
+        If list is not defined or is empty, events with all config_keys are transferred.
+      entry_schema: string
+
+
+
+node_types:
+  #base app node type
+  org.onap.APP:
+    derived_from: tosca.nodes.Root
+    properties:
+      application_name:
+        type: string
+        description: Human readable name for the application Product
+        required: false
+      provider:
+        type: string
+        description: Provider of the application and of the descriptor
+        required: true
+      application_version:
+        type: string
+        description: Software version of the application
+        required: true
+      blueprint_id:
+        type: string
+        description: A reference to the app blueprint
+      monitoring_policy:
+        type: string
+        required: false
+        description: A reference to the monitoring policy
+    requirements:
+      - receive:
+          capability: org.onap.EventProducer
+          relationship: org.onap.PropagateEvent
+          occurrences: [0, UNBOUNDED]
+      - send:
+          capability: org.onap.EventConsumer
+          relationship: org.onap.PropagateEvent
+          occurrences: [0, UNBOUNDED]
+
+  #the event relay node type
+  org.onap.EventRelay:
+    derived_from: tosca.nodes.Root
+    properties:
+      event_format:
+        type: string
+        required: true
+        #examples for event_format: Ves_specification, etc.
+      event_format_version:
+        type: string
+        required: true
+        #examples for event_format_version: 5.28.4, 7.30.1, etc.
+      config_keys:
+        type: list
+        required: false
+        entry_schema:
+          type: string
+          constraints:
+            #valid_values: [ ]
+              #all valid values should be added here
+              #if not specified, events of any config key is relayed
+              #examples for config_key: ves-measurement, ves-syslog, tca_handle_out, etc.
+      supported_carrier_protocols:
+        type: map
+        required: true
+        description: >
+          A map describing supported carrier protocols and translations. The
+          tuples define what protocol combinations are supported on the producer
+          and consumer side: e.g. { REST: REST, DMAAP: REST, DMAAP: DMAAP}
+        key_schema:
+          type: string
+          constraints:
+            valid_values: [ DMAAP_message_router,  REST ]
+            #all valid values should be added here
+        entry_schema:
+          type: string
+          constraints:
+            valid_values: [ DMAAP_message_router,  REST ]
+            #all valid values should be added here
+      supported_data_formats:
+        type: map
+        required: true
+        description: >
+          Is a map describing supported data formats and translation. The tuples
+          define what protocol combinations are supported on the producer and
+          consumer side: e.g. { JSON: JSON, JMS: JSON, YAML:YAML }
+        key_schema:
+          type: string
+          constraints:
+            valid_values: [ JSON,  JMS, YAML, etc ]
+            #all valid values should be added here
+        entry_schema:
+          type: string
+          constraints:
+            valid_values: [ JSON,  JMS, YAML, etc ]
+            #all valid values should be added here
+    requirements:
+      - receive:
+          capability: org.onap.EventProducer
+          relationship: org.onap.PropagateEvent
+          occurrences: [1, UNBOUNDED]
+      - send:
+          capability: org.onap.EventConsumer
+          relationship: org.onap.PropagateEvent
+          occurrences: [1, UNBOUNDED]
+
+
+
+
diff --git a/common/src/main/resources/examples/controlloop/original/cloop_dcae_example.yaml b/common/src/main/resources/examples/controlloop/original/cloop_dcae_example.yaml
new file mode 100644
index 0000000..4629f6f
--- /dev/null
+++ b/common/src/main/resources/examples/controlloop/original/cloop_dcae_example.yaml
@@ -0,0 +1,50 @@
+# ============LICENSE_START=======================================================
+# Copyright (C) 2021 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=========================================================
+
+tosca_definitions_version: tosca_simple_yaml_1_3
+
+imports:
+  - cloop_base_types.yaml
+  - cloop_dcae_types.yaml
+  - cloop_other_types.yaml
+
+topology_template:
+  node_templates:
+
+    node1_DCAE_VES_TCA:
+      type: org.onap.DCAE_VES_TCA
+      directives:
+        - substitute
+
+    node2_PolicyFramework:
+      type: org.onap.ApexPolicyFramework
+      requirements:
+        - receive:
+            capability: TCA-handle-out-publisher
+            node: node1_DCAE_VES_TCA
+            relationship:
+              properties:
+                config_keys: [ ves-measurement ]
+        - send:
+            capability: SelfService
+            node: org.onap.CDS
+            relationship:
+              properties:
+                config_keys: [ ves-measurement ]
+
+  #if this closed loop to subscribe to other events via the VesCollector, should we not add that?
diff --git a/common/src/main/resources/examples/controlloop/original/cloop_dcae_types.yaml b/common/src/main/resources/examples/controlloop/original/cloop_dcae_types.yaml
new file mode 100644
index 0000000..5f96cd5
--- /dev/null
+++ b/common/src/main/resources/examples/controlloop/original/cloop_dcae_types.yaml
@@ -0,0 +1,140 @@
+# ============LICENSE_START=======================================================
+# Copyright (C) 2021 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=========================================================
+
+tosca_definitions_version: tosca_simple_yaml_1_3
+
+imports:
+  - cloop_types.yaml
+
+node_types:
+
+  #node type for VES_Collector
+  org.onap.VES_Collector:
+    derived_from: org.onap.APP
+    capabilities:
+      VES-5.28.4-publisher:
+        type: org.onap.EventProducer
+        occurrences: [ 0, UNBOUNDED ]
+        properties:
+          carrier_protocol_type: "DMAAP_message_router"
+          data_format: "JSON"
+          event_format: "VES_specification"
+          event_format_version: "5.28.4"
+          config_keys:
+            - "ves-fault"
+            - "ves-measurement"
+            - "ves-syslog"
+            - "ves-heartbeat"
+            - "ves-other"
+            - "ves-mobileflow"
+            - "ves-statechange"
+            - "ves-thresholdCrossingAlert"
+            - "ves-voicequality"
+            - "ves-sipsignaling"
+      VES-7.30.1-publisher:
+        type: org.onap.EventProducer
+        occurrences: [ 0, UNBOUNDED ]
+        properties:
+          carrier_protocol_type: "DMAAP_message_router"
+          data_format: "JSON"
+          event_format: "VES_specification"
+          event_format_version: "7.30.1"
+          config_keys:
+            - "ves-fault"
+            - "ves-pnfRegistration"
+            - "ves-notification"
+            - "ves-perf3gpp"
+
+  #node type for TCA_GEN_2
+  org.onap.TCA_GEN_2:
+    derived_from: org.onap.APP
+    capabilities:
+      TCA-handle-out-publisher:
+        type: org.onap.EventProducer
+        occurrences: [ 0, UNBOUNDED ]
+        properties:
+          carrier_protocol_type: "DMAAP_message_router"
+          data_format: "JSON"
+          event_format: "DCAE_CL_Output"
+          event_format_version: "1.0.1"
+          config_keys: [ "tca_handle_out" ]
+      VES_specification-subscriber:
+        type: org.onap.EventConsumer
+        occurrences: [ 0, UNBOUNDED ]
+        properties:
+          carrier_protocol_type: "DMAAP_message_router"
+          data_format: "JSON"
+          event_format: "VES_specification"
+          event_format_version: "5.28.4"
+          config_keys: [ "tca_handle_in" ]
+
+
+
+  #node type for the composed VES_Collector and TCA_GEN_2
+  org.onap.DCAE_VES_TCA:
+    derived_from: org.onap.APP
+    capabilities:
+      VES-5.28.4-publisher:
+        type: org.onap.EventProducer
+        occurrences: [ 0, UNBOUNDED ]
+        properties:
+          carrier_protocol_type: "DMAAP_message_router"
+          data_format: "JSON"
+          event_format: "VES_specification"
+          event_format_version: "5.28.4"
+          config_keys:
+            - "ves-fault"
+            - "ves-measurement"
+            - "ves-syslog"
+            - "ves-heartbeat"
+            - "ves-other"
+            - "ves-mobileflow"
+            - "ves-statechange"
+            - "ves-thresholdCrossingAlert"
+            - "ves-voicequality"
+            - "ves-sipsignaling"
+      VES-7.30.1-publisher:
+        type: org.onap.EventProducer
+        occurrences: [ 0, UNBOUNDED ]
+        properties:
+          carrier_protocol_type: "DMAAP_message_router"
+          data_format: "JSON"
+          event_format: "VES_specification"
+          event_format_version: "7.30.1"
+          config_keys:
+            - "ves-pnfRegistration"
+            - "ves-notification"
+            - "ves-perf3gpp"
+      TCA-handle-out-publisher:
+        type: org.onap.EventProducer
+        occurrences: [ 0, UNBOUNDED ]
+        properties:
+          carrier_protocol_type: "DMAAP_message_router"
+          data_format: "JSON"
+          event_format: "DCAE_CL_Output"
+          event_format_version: "1.0.1"
+          config_keys: [ "tca_handle_out" ]
+      VES_specification-subscriber:
+        type: org.onap.EventConsumer
+        occurrences: [ 0, UNBOUNDED ]
+        properties:
+          carrier_protocol_type: "DMAAP_message_router"
+          data_format: "JSON"
+          event_format: "VES_specification"
+          event_format_version: "5.28.4"
+          config_keys: [ "tca_handle_in" ]
diff --git a/common/src/main/resources/examples/controlloop/original/cloop_other_types.yaml b/common/src/main/resources/examples/controlloop/original/cloop_other_types.yaml
new file mode 100644
index 0000000..d743f49
--- /dev/null
+++ b/common/src/main/resources/examples/controlloop/original/cloop_other_types.yaml
@@ -0,0 +1,63 @@
+# ============LICENSE_START=======================================================
+# Copyright (C) 2021 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=========================================================
+
+tosca_definitions_version: tosca_simple_yaml_1_2
+
+imports:
+  - cloop_base_types.yaml
+
+node_types:
+  #node type for Policy
+  org.onap.PolicyFramework:
+    derived_from: org.onap.APP
+
+  #node type for Apex Policy
+  org.onap.ApexPolicyFramework:
+    derived_from: org.onap.PolicyFramework
+
+  #node type for CDS
+  org.onap.CDS:
+    derived_from: org.onap.APP
+    capabilities:
+      #consumer capability for CDS for events of type ResourceAndTemplate management API
+      ResourceAndTemplateManagement:
+        type: org.onap.EventConsumer
+        properties:
+          carrier_protocol_type: "DMAAP_message_router"
+          data_format: "JSON"
+          event_format: "ResourceAndTemplate"
+          event_format_version: "x.xx.x"
+        occurrences: [ 0, UNBOUNDED ]
+      #consumer capability for CDS for events of type SelfService API
+      SelfService:
+        type: org.onap.EventConsumer
+        properties:
+          carrier_protocol_type: "DMAAP_message_router"
+          data_format: "JSON"
+          event_format: "SelfService"
+          event_format_version: "x.xx.x"
+        occurrences: [ 0, UNBOUNDED ]
+      #producer capability for CDS for events of type PNFControl
+      PNFcontrolEventsProducer:
+        type: org.onap.EventProducer
+        properties:
+          carrier_protocol_type: "DMAAP_message_router"
+          data_format: "JSON"
+          event_format: "PNFcontrol"
+          event_format_version: "x.xx.x"
+        occurrences: [ 0, UNBOUNDED ]
diff --git a/common/src/test/java/org/onap/policy/clamp/controlloop/common/exception/ExceptionsTest.java b/common/src/test/java/org/onap/policy/clamp/controlloop/common/exception/ExceptionsTest.java
new file mode 100644
index 0000000..3c16885
--- /dev/null
+++ b/common/src/test/java/org/onap/policy/clamp/controlloop/common/exception/ExceptionsTest.java
@@ -0,0 +1,84 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.common.exception;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.io.IOException;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+import org.junit.Test;
+import org.onap.policy.models.errors.concepts.ErrorResponse;
+
+public class ExceptionsTest {
+
+    private static final String STRING_TEXT = "String";
+    private static final String MESSAGE = "Message";
+
+    @Test
+    public void testExceptions() {
+        assertNotNull(new ControlLoopException(Response.Status.OK, MESSAGE));
+        assertNotNull(new ControlLoopException(Response.Status.OK, MESSAGE, STRING_TEXT));
+        assertNotNull(new ControlLoopException(Response.Status.OK, MESSAGE, new IOException()));
+        assertNotNull(new ControlLoopException(Response.Status.OK, MESSAGE, new IOException(), STRING_TEXT));
+
+        String key = "A String";
+        ControlLoopException ae =
+                new ControlLoopException(Response.Status.OK, MESSAGE, new IOException("IO exception message"), key);
+        ErrorResponse errorResponse = ae.getErrorResponse();
+        assertEquals("Message\nIO exception message", String.join("\n", errorResponse.getErrorDetails()));
+        assertEquals(key, ae.getObject());
+
+        assertNotNull(new ControlLoopRuntimeException(Response.Status.OK, MESSAGE));
+        assertNotNull(new ControlLoopRuntimeException(Response.Status.OK, MESSAGE, STRING_TEXT));
+        assertNotNull(new ControlLoopRuntimeException(Response.Status.OK, MESSAGE, new IOException()));
+        assertNotNull(new ControlLoopRuntimeException(Response.Status.OK, MESSAGE, new IOException(), STRING_TEXT));
+
+        String rkey = "A String";
+        ControlLoopRuntimeException re = new ControlLoopRuntimeException(Response.Status.OK, "Runtime Message",
+                new IOException("IO runtime exception message"), rkey);
+        errorResponse = re.getErrorResponse();
+        assertEquals("Runtime Message\nIO runtime exception message",
+                String.join("\n", errorResponse.getErrorDetails()));
+        assertEquals(key, re.getObject());
+
+        ControlLoopRuntimeException clre = new ControlLoopRuntimeException(ae);
+        assertEquals(ae.getErrorResponse().getResponseCode(), clre.getErrorResponse().getResponseCode());
+        assertEquals(ae.getMessage(), clre.getMessage());
+
+        try {
+            try {
+                throw new ControlLoopException(Status.BAD_GATEWAY, "An Exception");
+            } catch (ControlLoopException cle) {
+                throw new ControlLoopRuntimeException(cle);
+            }
+        } catch (ControlLoopRuntimeException clred) {
+            assertEquals(Status.BAD_GATEWAY, clred.getErrorResponse().getResponseCode());
+            assertEquals("An Exception", clred.getMessage());
+            assertEquals(ControlLoopException.class.getName(), clred.getCause().getClass().getName());
+        }
+
+        assertThat(ae.toString()).contains("A String");
+        assertThat(re.toString()).contains("A String");
+    }
+}
diff --git a/common/src/test/java/org/onap/policy/clamp/controlloop/common/handler/ControlLoopHandlerTest.java b/common/src/test/java/org/onap/policy/clamp/controlloop/common/handler/ControlLoopHandlerTest.java
new file mode 100644
index 0000000..845bc8d
--- /dev/null
+++ b/common/src/test/java/org/onap/policy/clamp/controlloop/common/handler/ControlLoopHandlerTest.java
@@ -0,0 +1,54 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.common.handler;
+
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import org.junit.Test;
+import org.onap.policy.common.utils.services.Registry;
+import org.onap.policy.models.provider.PolicyModelsProviderParameters;
+
+public class ControlLoopHandlerTest {
+
+    @Test
+    public void testControlLoopHandler() {
+        assertThatThrownBy(() -> new DummyControlLoopHandler(null)).isInstanceOf(NullPointerException.class);
+
+        assertNotNull(new DummyControlLoopHandler(new PolicyModelsProviderParameters()));
+        Registry.unregister(DummyControlLoopHandler.class.getName());
+
+        String dummyClassName = DummyControlLoopHandler.class.getName();
+        assertThatThrownBy(() -> Registry.get(dummyClassName)).isInstanceOf(IllegalArgumentException.class);
+
+        PolicyModelsProviderParameters pars = new PolicyModelsProviderParameters();
+
+        DummyControlLoopHandler dclh = new DummyControlLoopHandler(pars);
+        assertNotNull(dclh);
+
+        assertEquals(pars, dclh.getDatabaseProviderParameters());
+        assertEquals(0, dclh.getProviderClasses().size());
+
+        dclh.close();
+        assertThatThrownBy(() -> Registry.get(dummyClassName)).isInstanceOf(IllegalArgumentException.class);
+    }
+}
diff --git a/common/src/test/java/org/onap/policy/clamp/controlloop/common/handler/DummyControlLoopHandler.java b/common/src/test/java/org/onap/policy/clamp/controlloop/common/handler/DummyControlLoopHandler.java
new file mode 100644
index 0000000..1602fb6
--- /dev/null
+++ b/common/src/test/java/org/onap/policy/clamp/controlloop/common/handler/DummyControlLoopHandler.java
@@ -0,0 +1,63 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.common.handler;
+
+import java.util.List;
+import org.onap.policy.common.endpoints.event.comm.TopicSink;
+import org.onap.policy.common.endpoints.listeners.MessageTypeDispatcher;
+import org.onap.policy.models.provider.PolicyModelsProviderParameters;
+
+public class DummyControlLoopHandler extends ControlLoopHandler {
+
+    public DummyControlLoopHandler(PolicyModelsProviderParameters databaseProviderParameters) {
+        super(databaseProviderParameters);
+    }
+
+    @Override
+    public void startAndRegisterListeners(MessageTypeDispatcher msgDispatcher) {
+        // Do nothing on this dummy class
+    }
+
+    @Override
+    public void startAndRegisterPublishers(List<TopicSink> topicSinks) {
+        // Do nothing on this dummy class
+    }
+
+    @Override
+    public void stopAndUnregisterPublishers() {
+        // Do nothing on this dummy class
+    }
+
+    @Override
+    public void stopAndUnregisterListeners(MessageTypeDispatcher msgDispatcher) {
+        // Do nothing on this dummy class
+    }
+
+    @Override
+    public void startProviders() {
+        // Do nothing on this dummy class
+    }
+
+    @Override
+    public void stopProviders() {
+        // Do nothing on this dummy class
+    }
+}
diff --git a/common/src/test/resources/demo/Notes.txt b/common/src/test/resources/demo/Notes.txt
new file mode 100644
index 0000000..21be914
--- /dev/null
+++ b/common/src/test/resources/demo/Notes.txt
@@ -0,0 +1,39 @@
+Run DMaaP simulator using Docker
+c/Users/${USER}/Github/simulator/distribution
+${USER}@S031PC03 MINGW64 ~/Github/simulator/distribution (master)
+$ docker run -p 3904:3904 --volume //c/Users/${USER}/Github/simulator/distribution:/opt/app/policy/simulators/etc/mounted:ro --name=dmaap-simulator nexus3.onap.org:10001/onap/policy-models-simulator:latest
+
+
+Run DMaaP simulator using Maven
+Check out policy models
+Go to policy/models/models-sim/models-sim-dmaap
+mvn exec:java  -Dexec.mainClass=org.onap.policy.models.sim.dmaap.startstop.Main -Dexec.args="-c src/main/resources/etc/DefaultConfig.json"
+
+
+Run CL from command line
+Go to clamp/tosca-controlloop/runtime
+mvn exec:java  -Dexec.mainClass=org.onap.policy.clamp.controlloop.runtime.main.startstop.Main -Dexec.args="-c src/test/resources/parameters/TestParametersMariaDB.json"
+
+Run Participant from command line
+mvn exec:java  -Dexec.mainClass=org.onap.policy.clamp.controlloop.participants.ParticipantMain -Dexec.args=" -c src/main/resources/config/CDSParticipantConfig.json"
+mvn exec:java  -Dexec.mainClass=org.onap.policy.clamp.controlloop.participant.dcae.main.startstop.Main -Dexec.args=" -c src/main/resources/config/DCAEParticipantConfig.json"
+mvn exec:java  -Dexec.mainClass=org.onap.policy.clamp.controlloop.participants.ParticipantMain -Dexec.args=" -c src/main/resources/config/PolicyParticipantConfig.json"
+
+Config of DB
+
+Prompt > mysql
+MariaDB [(none)]> create database controlloop;
+MariaDB [(none)]> CREATE USER 'policy'@localhost IDENTIFIED BY 'P01icY';
+MariaDB [(none)]> GRANT ALL PRIVILEGES ON controlloop.* TO 'policy'@'localhost';\
+MariaDB [(none)]> SHOW GRANTS for 'policy'@localhost;
++---------------------------------------------------------------------------------------------------------------+
+| Grants for policy@localhost                                                                                   |
++---------------------------------------------------------------------------------------------------------------+
+| GRANT USAGE ON *.* TO `policy`@`localhost` IDENTIFIED BY PASSWORD '*D0574A541C5DEDF11838FB41CA04E256FD5A04CC' |
+| GRANT ALL PRIVILEGES ON `controlloop`.* TO `policy`@`localhost`                                               |
++---------------------------------------------------------------------------------------------------------------+
+2 rows in set (0.000 sec)
+
+
+Run Policy API:
+mvn exec:java -Dexec.mainClass=org.onap.policy.api.main.startstop.Main -Dexec.args="-c ../../clamp-tpn/tosca-controlloop/common/src/test/resources/demo/policy-api/PolicyAPIConfig.json"
diff --git a/common/src/test/resources/demo/config/DEMO.postman_collection.json b/common/src/test/resources/demo/config/DEMO.postman_collection.json
new file mode 100644
index 0000000..0b4c1f2
--- /dev/null
+++ b/common/src/test/resources/demo/config/DEMO.postman_collection.json
@@ -0,0 +1,302 @@
+{
+	"info": {
+		"_postman_id": "44176e3a-cd0d-457f-9ea9-b414bc368f33",
+		"name": "DEMO",
+		"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
+	},
+	"item": [
+		{
+			"name": "Demo: Comission control loop definition Multiple Copy",
+			"protocolProfileBehavior": {
+				"disabledSystemHeaders": {
+					"content-type": true
+				}
+			},
+			"request": {
+				"auth": {
+					"type": "basic",
+					"basic": [
+						{
+							"key": "password",
+							"value": "zb!XztG34",
+							"type": "string"
+						},
+						{
+							"key": "username",
+							"value": "healthcheck",
+							"type": "string"
+						}
+					]
+				},
+				"method": "POST",
+				"header": [
+					{
+						"key": "X-ONAP-RequestID",
+						"type": "text",
+						"value": "709c62b3-8918-41b9-a747-d21eb79c6c20"
+					},
+					{
+						"key": "Content-Type",
+						"type": "text",
+						"value": "application/yaml"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "tosca_definitions_version: tosca_simple_yaml_1_1_0\ndata_types:\n  onap.datatypes.ToscaConceptIdentifier:\n    derived_from: tosca.datatypes.Root\n    properties:\n      name:\n        type: string\n        required: true\n      version:\n        type: string\n        required: true\n  org.onap.datatypes.policy.clamp.controlloop.DCAEMicroserviceControlLoopElementConsulInfo:\n    name: org.onap.datatypes.policy.clamp.controlloop.DCAEMicroserviceControlLoopElementConsulInfo\n    version: 0.0.0\n    derived_from: tosca.datatypes.Root\n    properties:\n      consulUrl:\n        name: consulUrl\n        type: string\n        typeVersion: 0.0.0\n        description: Consul url for this entry\n        required: true\n      consul_body:\n        name: consulBody\n        type: string\n        typeVersion: 0.0.0\n        description: Body of Consul entry\n        required: true\n  onap.datatype.controlloop.Target:\n    derived_from: tosca.datatypes.Root\n    description: Definition for a entity in A&AI to perform a control loop operation on\n    properties:\n      targetType:\n        type: string\n        description: Category for the target type\n        required: true\n        constraints:\n        - valid_values:\n          - VNF\n          - VM\n          - VFMODULE\n          - PNF\n      entityIds:\n        type: map\n        description: |\n          Map of values that identify the resource. If none are provided, it is assumed that the\n          entity that generated the ONSET event will be the target.\n        required: false\n        metadata:\n          clamp_possible_values: ClampExecution:CSAR_RESOURCES\n        entry_schema:\n          type: string\n  onap.datatype.controlloop.Actor:\n    derived_from: tosca.datatypes.Root\n    description: An actor/operation/target definition\n    properties:\n      actor:\n        type: string\n        description: The actor performing the operation.\n        required: true\n        metadata:\n          clamp_possible_values: Dictionary:DefaultActors,ClampExecution:CDS/actor\n      operation:\n        type: string\n        description: The operation the actor is performing.\n        metadata:\n          clamp_possible_values: Dictionary:DefaultOperations,ClampExecution:CDS/operation\n        required: true\n      target:\n        type: onap.datatype.controlloop.Target\n        description: The resource the operation should be performed on.\n        required: true\n      payload:\n        type: map\n        description: Name/value pairs of payload information passed by Policy to the actor\n        required: false\n        metadata:\n          clamp_possible_values: ClampExecution:CDS/payload\n        entry_schema:\n          type: string\n  onap.datatype.controlloop.Operation:\n    derived_from: tosca.datatypes.Root\n    description: An operation supported by an actor\n    properties:\n      id:\n        type: string\n        description: Unique identifier for the operation\n        required: true\n      description:\n        type: string\n        description: A user-friendly description of the intent for the operation\n        required: false\n      operation:\n        type: onap.datatype.controlloop.Actor\n        description: The definition of the operation to be performed.\n        required: true\n      timeout:\n        type: integer\n        description: The amount of time for the actor to perform the operation.\n        required: true\n      retries:\n        type: integer\n        description: The number of retries the actor should attempt to perform the operation.\n        required: true\n        default: 0\n      success:\n        type: string\n        description: Points to the operation to invoke on success. A value of \"final_success\" indicates and end to the operation.\n        required: false\n        default: final_success\n      failure:\n        type: string\n        description: Points to the operation to invoke on Actor operation failure.\n        required: false\n        default: final_failure\n      failure_timeout:\n        type: string\n        description: Points to the operation to invoke when the time out for the operation occurs.\n        required: false\n        default: final_failure_timeout\n      failure_retries:\n        type: string\n        description: Points to the operation to invoke when the current operation has exceeded its max retries.\n        required: false\n        default: final_failure_retries\n      failure_exception:\n        type: string\n        description: Points to the operation to invoke when the current operation causes an exception.\n        required: false\n        default: final_failure_exception\n      failure_guard:\n        type: string\n        description: Points to the operation to invoke when the current operation is blocked due to guard policy enforcement.\n        required: false\n        default: final_failure_guard\n  onap.datatypes.monitoring.managedObjectDNsBasic:\n    constraints: []\n    properties:\n      DN:\n        name: DN\n        type: string\n        typeVersion: 0.0.0\n        description: Managed object distinguished name\n        required: true\n        constraints: []\n        metadata: {}\n    name: onap.datatypes.monitoring.managedObjectDNsBasic\n    version: 0.0.0\n    derived_from: tosca.datatypes.Root\n    metadata: {}\n  onap.datatypes.monitoring.managedObjectDNsBasics:\n    constraints: []\n    properties:\n      managedObjectDNsBasic:\n        name: managedObjectDNsBasic\n        type: map\n        typeVersion: 0.0.0\n        description: Managed object distinguished name object\n        required: true\n        constraints: []\n        entry_schema:\n          type: onap.datatypes.monitoring.managedObjectDNsBasic\n          typeVersion: 0.0.0\n          constraints: []\n        metadata: {}\n    name: onap.datatypes.monitoring.managedObjectDNsBasics\n    version: 0.0.0\n    derived_from: tosca.datatypes.Root\n    metadata: {}\n  onap.datatypes.monitoring.measurementGroup:\n    constraints: []\n    properties:\n      measurementTypes:\n        name: measurementTypes\n        type: list\n        typeVersion: 0.0.0\n        description: List of measurement types\n        required: true\n        constraints: []\n        entry_schema:\n          type: onap.datatypes.monitoring.measurementTypes\n          typeVersion: 0.0.0\n          constraints: []\n        metadata: {}\n      managedObjectDNsBasic:\n        name: managedObjectDNsBasic\n        type: list\n        typeVersion: 0.0.0\n        description: List of managed object distinguished names\n        required: true\n        constraints: []\n        entry_schema:\n          type: onap.datatypes.monitoring.managedObjectDNsBasics\n          typeVersion: 0.0.0\n          constraints: []\n        metadata: {}\n    name: onap.datatypes.monitoring.measurementGroup\n    version: 0.0.0\n    derived_from: tosca.datatypes.Root\n    metadata: {}\n  onap.datatypes.monitoring.measurementGroups:\n    constraints: []\n    properties:\n      measurementGroup:\n        name: measurementGroup\n        type: map\n        typeVersion: 0.0.0\n        description: Measurement Group\n        required: true\n        constraints: []\n        entry_schema:\n          type: onap.datatypes.monitoring.measurementGroup\n          typeVersion: 0.0.0\n          constraints: []\n        metadata: {}\n    name: onap.datatypes.monitoring.measurementGroups\n    version: 0.0.0\n    derived_from: tosca.datatypes.Root\n    metadata: {}\n  onap.datatypes.monitoring.measurementType:\n    constraints: []\n    properties:\n      measurementType:\n        name: measurementType\n        type: string\n        typeVersion: 0.0.0\n        description: Measurement type\n        required: true\n        constraints: []\n        metadata: {}\n    name: onap.datatypes.monitoring.measurementType\n    version: 0.0.0\n    derived_from: tosca.datatypes.Root\n    metadata: {}\n  onap.datatypes.monitoring.measurementTypes:\n    constraints: []\n    properties:\n      measurementType:\n        name: measurementType\n        type: map\n        typeVersion: 0.0.0\n        description: Measurement type object\n        required: true\n        constraints: []\n        entry_schema:\n          type: onap.datatypes.monitoring.measurementType\n          typeVersion: 0.0.0\n          constraints: []\n        metadata: {}\n    name: onap.datatypes.monitoring.measurementTypes\n    version: 0.0.0\n    derived_from: tosca.datatypes.Root\n    metadata: {}\n  onap.datatypes.monitoring.nfFilter:\n    constraints: []\n    properties:\n      modelNames:\n        name: modelNames\n        type: list\n        typeVersion: 0.0.0\n        description: List of model names\n        required: true\n        constraints: []\n        entry_schema:\n          type: string\n          typeVersion: 0.0.0\n          constraints: []\n        metadata: {}\n      modelInvariantIDs:\n        name: modelInvariantIDs\n        type: list\n        typeVersion: 0.0.0\n        description: List of model invariant IDs\n        required: true\n        constraints: []\n        entry_schema:\n          type: string\n          typeVersion: 0.0.0\n          constraints: []\n        metadata: {}\n      modelVersionIDs:\n        name: modelVersionIDs\n        type: list\n        typeVersion: 0.0.0\n        description: List of model version IDs\n        required: true\n        constraints: []\n        entry_schema:\n          type: string\n          typeVersion: 0.0.0\n          constraints: []\n        metadata: {}\n      nfNames:\n        name: nfNames\n        type: list\n        typeVersion: 0.0.0\n        description: List of network functions\n        required: true\n        constraints: []\n        entry_schema:\n          type: string\n          typeVersion: 0.0.0\n          constraints: []\n        metadata: {}\n    name: onap.datatypes.monitoring.nfFilter\n    version: 0.0.0\n    derived_from: tosca.datatypes.Root\n    metadata: {}\n  onap.datatypes.monitoring.subscription:\n    constraints: []\n    properties:\n      measurementGroups:\n        name: measurementGroups\n        type: list\n        typeVersion: 0.0.0\n        description: Measurement Groups\n        required: true\n        constraints: []\n        entry_schema:\n          type: onap.datatypes.monitoring.measurementGroups\n          typeVersion: 0.0.0\n          constraints: []\n        metadata: {}\n      fileBasedGP:\n        name: fileBasedGP\n        type: integer\n        typeVersion: 0.0.0\n        description: File based granularity period\n        required: true\n        constraints: []\n        metadata: {}\n      fileLocation:\n        name: fileLocation\n        type: string\n        typeVersion: 0.0.0\n        description: ROP file location\n        required: true\n        constraints: []\n        metadata: {}\n      subscriptionName:\n        name: subscriptionName\n        type: string\n        typeVersion: 0.0.0\n        description: Name of the subscription\n        required: true\n        constraints: []\n        metadata: {}\n      administrativeState:\n        name: administrativeState\n        type: string\n        typeVersion: 0.0.0\n        description: State of the subscription\n        required: true\n        constraints:\n        - valid_values:\n          - LOCKED\n          - UNLOCKED\n        metadata: {}\n      nfFilter:\n        name: nfFilter\n        type: map\n        typeVersion: 0.0.0\n        description: Network function filter\n        required: true\n        constraints: []\n        entry_schema:\n          type: onap.datatypes.monitoring.nfFilter\n          typeVersion: 0.0.0\n          constraints: []\n        metadata: {}\n    name: onap.datatypes.monitoring.subscription\n    version: 0.0.0\n    derived_from: tosca.datatypes.Root\n    metadata: {}\npolicy_types:\n  onap.policies.Monitoring:\n    derived_from: tosca.policies.Root\n    description: a base policy type for all policies that govern monitoring provisioning\n    version: 1.0.0\n    name: onap.policies.Monitoring\n  onap.policies.Sirisha:\n    derived_from: tosca.policies.Root\n    description: a base policy type for all policies that govern monitoring provisioning\n    version: 1.0.0\n    name: onap.policies.Sirisha\n  onap.policies.monitoring.dcae-pm-subscription-handler:\n    properties:\n      pmsh_policy:\n        name: pmsh_policy\n        type: onap.datatypes.monitoring.subscription\n        typeVersion: 0.0.0\n        description: PMSH Policy JSON\n        required: false\n        constraints: []\n        metadata: {}\n    name: onap.policies.monitoring.dcae-pm-subscription-handler\n    version: 1.0.0\n    derived_from: onap.policies.Monitoring\n    metadata: {}\n  onap.policies.controlloop.operational.Common:\n    derived_from: tosca.policies.Root\n    version: 1.0.0\n    name: onap.policies.controlloop.operational.Common\n    description: |\n      Operational Policy for Control Loop execution. Originated in Frankfurt to support TOSCA Compliant\n      Policy Types. This does NOT support the legacy Policy YAML policy type.\n    properties:\n      id:\n        type: string\n        description: The unique control loop id.\n        required: true\n      timeout:\n        type: integer\n        description: |\n          Overall timeout for executing all the operations. This timeout should equal or exceed the total\n          timeout for each operation listed.\n        required: true\n      abatement:\n        type: boolean\n        description: Whether an abatement event message will be expected for the control loop from DCAE.\n        required: true\n        default: false\n      trigger:\n        type: string\n        description: Initial operation to execute upon receiving an Onset event message for the Control Loop.\n        required: true\n      operations:\n        type: list\n        description: List of operations to be performed when Control Loop is triggered.\n        required: true\n        entry_schema:\n          type: onap.datatype.controlloop.Operation\n  onap.policies.controlloop.operational.common.Apex:\n    derived_from: onap.policies.controlloop.operational.Common\n    type_version: 1.0.0\n    version: 1.0.0\n    name: onap.policies.controlloop.operational.common.Apex\n    description: Operational policies for Apex PDP\n    properties:\n      engineServiceParameters:\n        type: string\n        description: The engine parameters like name, instanceCount, policy implementation, parameters etc.\n        required: true\n      eventInputParameters:\n        type: string\n        description: The event input parameters.\n        required: true\n      eventOutputParameters:\n        type: string\n        description: The event output parameters.\n        required: true\n      javaProperties:\n        type: string\n        description: Name/value pairs of properties to be set for APEX if needed.\n        required: false\nnode_types:\n  org.onap.policy.clamp.controlloop.Participant:\n    version: 1.0.1\n    derived_from: tosca.nodetypes.Root\n    properties:\n      provider:\n        type: string\n        requred: false\n  org.onap.policy.clamp.controlloop.ControlLoopElement:\n    version: 1.0.1\n    derived_from: tosca.nodetypes.Root\n    properties:\n      provider:\n        type: string\n        requred: false\n      participant_id:\n        type: onap.datatypes.ToscaConceptIdentifier\n        requred: true\n  org.onap.policy.clamp.controlloop.ControlLoop:\n    version: 1.0.1\n    derived_from: tosca.nodetypes.Root\n    properties:\n      provider:\n        type: string\n        requred: false\n      elements:\n        type: list\n        required: true\n        entry_schema:\n          type: onap.datatypes.ToscaConceptIdentifier\n  org.onap.policy.clamp.controlloop.DCAEMicroserviceControlLoopElement:\n    version: 1.0.1\n    derived_from: org.onap.policy.clamp.controlloop.ControlLoopElement\n    properties:\n      dcae_blueprint_id:\n        type: onap.datatypes.ToscaConceptIdentifier\n        requred: false\n      dcae_blueprint:\n        type: onap.dcae.cloudify_blueprint\n        requred: false\n      consul_info:\n        type: list\n        required: false\n        entry_schema:\n          type: org.onap.datatypes.policy.clamp.controlloop.DCAEMicroserviceControlLoopElementConsulInfo\n  org.onap.policy.clamp.controlloop.PolicyControlLoopElement:\n    version: 1.0.1\n    derived_from: org.onap.policy.clamp.controlloop.ControlLoopElement\n    properties:\n      policy_type_id:\n        type: onap.datatypes.ToscaConceptIdentifier\n        requred: true\n      policy_id:\n        type: onap.datatypes.ToscaConceptIdentifier\n        requred: false\n  org.onap.policy.clamp.controlloop.CDSControlLoopElement:\n    version: 1.0.1\n    derived_from: org.onap.policy.clamp.controlloop.ControlLoopElement\n    properties:\n      cds_blueprint_id:\n        type: onap.datatypes.ToscaConceptIdentifier\n        requred: true\ntopology_template:\n  inputs:\n    pmsh_monitoring_policy:\n      type: onap.datatypes.ToscaConceptIdentifier\n      description: The ID of the PMSH monitoring policy to use\n      default:\n        name: MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0test\n        version: 1.0.0\n    pmsh_operational_policy:\n      type: onap.datatypes.ToscaConceptIdentifier\n      description: The ID of the PMSH operational policy to use\n      default:\n        name: operational.apex.pmcontrol\n        version: 1.0.0\n  node_templates:\n    org.onap.dcae.controlloop.DCAEMicroserviceControlLoopParticipant:\n      version: 2.3.4\n      type: org.onap.policy.clamp.controlloop.Participant\n      type_version: 1.0.1\n      description: Participant for DCAE microservices\n      properties:\n        provider: ONAP\n    org.onap.policy.controlloop.PolicyControlLoopParticipant:\n      version: 2.3.1\n      type: org.onap.policy.clamp.controlloop.Participant\n      type_version: 1.0.1\n      description: Participant for DCAE microservices\n      properties:\n        provider: ONAP\n    org.onap.domain.pmsh.PMSH_DCAEMicroservice:\n      version: 1.2.3\n      type: org.onap.policy.clamp.controlloop.DCAEMicroserviceControlLoopElement\n      type_version: 1.0.0\n      description: Control loop element for the DCAE microservice for Performance Management Subscription Handling\n      properties:\n        provider: Ericsson\n        participant_id:\n          name: org.onap.dcae.controlloop.DCAEMicroserviceControlLoopParticipant\n          version: 2.3.4\n        dcae_blueprint:\n          tosca_definitions_version: cloudify_dsl_1_3\n          imports:\n          - https://www.getcloudify.org/spec/cloudify/4.5.5/types.yaml\n          - plugin:k8splugin?version=3.7.0\n          - plugin:pgaas?version=1.3.0\n          - plugin:clamppolicyplugin?version=1.1.0\n          inputs:\n            tag_version:\n              type: string\n              description: Docker image to be used\n              default: nexus3.onap.org:10001/onap/org.onap.dcaegen2.services.pmsh:1.1.2\n            replicas:\n              type: integer\n              description: Number of instances\n              default: 1\n            operational_policy_name:\n              type: string\n              default: operational.apex.pmcontrol\n            control_loop_name:\n              type: string\n              default: pmsh-control-loop\n            pmsh_publish_topic_name:\n              type: string\n              default: unauthenticated.DCAE_CL_OUTPUT\n            policy_feedback_topic_name:\n              type: string\n              default: unauthenticated.PMSH_CL_INPUT\n            aai_notification_topic_name:\n              type: string\n              default: AAI-EVENT\n            publisher_client_role:\n              type: string\n              description: Client role to request secure access to topic\n              default: org.onap.dcae.pmPublisher\n            subscriber_client_role:\n              type: string\n              description: Client role to request secure access to topic\n              default: org.onap.dcae.pmSubscriber\n            dcae_location:\n              type: string\n              description: DCAE location for the subscriber, used to set up routing\n              default: san-francisco\n            cpu_limit:\n              type: string\n              default: 1000m\n            cpu_request:\n              type: string\n              default: 1000m\n            memory_limit:\n              type: string\n              default: 1024Mi\n            memory_request:\n              type: string\n              default: 1024Mi\n            pgaas_cluster_name:\n              type: string\n              default: dcae-pg-primary.onap\n            enable_tls:\n              type: boolean\n              default: true\n            protocol:\n              type: string\n              description: PMSH protocol. If enable_tls is false, set to http\n              default: https\n            policy_model_id:\n              type: string\n              default: onap.policies.monitoring.dcae-pm-subscription-handler\n            policy_id:\n              type: string\n              default: MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0test\n          node_templates:\n            pgaasvm:\n              type: dcae.nodes.pgaas.database\n              properties:\n                writerfqdn:\n                  get_input: pgaas_cluster_name\n                name: pmsh\n            pmsh:\n              type: dcae.nodes.ContainerizedServiceComponentUsingDmaap\n              interfaces:\n                cloudify.interfaces.lifecycle:\n                  create:\n                    inputs:\n                      ports:\n                      - '8443:0'\n                      envs:\n                        PMSH_PG_URL:\n                          get_attribute:\n                          - pgaasvm\n                          - admin\n                          - host\n                        PMSH_PG_PASSWORD:\n                          get_attribute:\n                          - pgaasvm\n                          - admin\n                          - password\n                        PMSH_PG_USERNAME:\n                          get_attribute:\n                          - pgaasvm\n                          - admin\n                          - user\n                        PMSH_DB_NAME:\n                          get_attribute:\n                          - pgaasvm\n                          - admin\n                          - database\n              relationships:\n              - target: pmsh-policy\n                type: cloudify.relationships.depends_on\n              properties:\n                service_component_type: dcae-pmsh\n                service_component_name_override: dcae-pmsh\n                application_config:\n                  enable_tls:\n                    get_input: enable_tls\n                  aaf_identity: dcae@dcae.onap.org\n                  aaf_password: demo123456!\n                  operational_policy_name:\n                    get_input: operational_policy_name\n                  control_loop_name:\n                    get_input: control_loop_name\n                  cert_path: /opt/app/pmsh/etc/certs/cert.pem\n                  key_path: /opt/app/pmsh/etc/certs/key.pem\n                  ca_cert_path: /opt/app/pmsh/etc/certs/cacert.pem\n                  streams_publishes:\n                    policy_pm_publisher:\n                      type: message_router\n                      dmaap_info:\n                        topic_url:\n                          concat:\n                          - http://message-router:3904/events/\n                          - get_input: pmsh_publish_topic_name\n                  streams_subscribes:\n                    policy_pm_subscriber:\n                      type: message_router\n                      dmaap_info:\n                        topic_url:\n                          concat:\n                          - http://message-router:3904/events/\n                          - get_input: policy_feedback_topic_name\n                    aai_subscriber:\n                      type: message_router\n                      dmaap_info:\n                        topic_url:\n                          concat:\n                          - http://message-router:3904/events/\n                          - get_input: aai_notification_topic_name\n                resource_config:\n                  limits:\n                    cpu:\n                      get_input: cpu_limit\n                    memory:\n                      get_input: memory_limit\n                  requests:\n                    cpu:\n                      get_input: cpu_request\n                    memory:\n                      get_input: memory_request\n                docker_config:\n                  healthcheck:\n                    endpoint: /healthcheck\n                    interval: 15s\n                    timeout: 1s\n                    type:\n                      get_input: protocol\n                image:\n                  get_input: tag_version\n                replicas:\n                  get_input: replicas\n                log_info:\n                  log_directory: /var/log/ONAP/dcaegen2/services/pmsh\n                tls_info:\n                  cert_directory: /opt/app/pmsh/etc/certs\n                  use_tls:\n                    get_input: enable_tls\n            pmsh-policy:\n              type: clamp.nodes.policy\n              properties:\n                policy_model_id:\n                  get_input: policy_model_id\n                policy_id:\n                  get_input: policy_id\n        consul_info:\n        - consulUrl: http://consul:31321/v1/kv/dcae-pmsh:policy\n          consulBody:\n            subscription:\n              subscriptionName: subscriptiona\n              administrativeState: UNLOCKED\n              fileBasedGP: 15\n              fileLocation: /pm/pm.xml\n              nfFilter:\n                nfNames:\n                - ^pnf1.*\n                modelInvariantIDs:\n                - 5845y423-g654-6fju-po78-8n53154532k6\n                - 7129e420-d396-4efb-af02-6b83499b12f8\n                modelVersionIDs:\n                - e80a6ae3-cafd-4d24-850d-e14c084a5ca9\n              measurementGroups:\n              - measurementGroup:\n                  measurementTypes:\n                  - measurementType: countera\n                  - measurementType: counterb\n                  managedObjectDNsBasic:\n                  - DN: dna\n                  - DN: dnb\n              - measurementGroup:\n                  measurementTypes:\n                  - measurementType: counterc\n                  - measurementType: counterd\n                  managedObjectDNsBasic:\n                  - DN: dnc\n                  - DN: dnd\n    org.onap.domain.pmsh.PMSH_MonitoringPolicyControlLoopElement:\n      version: 1.2.3\n      type: org.onap.policy.clamp.controlloop.PolicyControlLoopElement\n      type_version: 1.0.0\n      description: Control loop element for the monitoring policy for Performance Management Subscription Handling\n      properties:\n        provider: Ericsson\n        participant_id:\n          name: org.onap.policy.controlloop.PolicyControlLoopParticipant\n          version: 2.3.1\n        policy_type_id:\n          name: onap.policies.monitoring.pm-subscription-handler\n          version: 1.0.0\n        policy_id:\n          get_input: pmsh_monitoring_policy\n    org.onap.domain.pmsh.PMSH_OperationalPolicyControlLoopElement:\n      version: 1.2.3\n      type: org.onap.policy.clamp.controlloop.PolicyControlLoopElement\n      type_version: 1.0.0\n      description: Control loop element for the operational policy for Performance Management Subscription Handling\n      properties:\n        provider: Ericsson\n        participant_id:\n          name: org.onap.policy.controlloop.PolicyControlLoopParticipant\n          version: 2.3.1\n        policy_type_id:\n          name: onap.policies.operational.pm-subscription-handler\n          version: 1.0.0\n        policy_id:\n          get_input: pmsh_operational_policy\n    org.onap.domain.pmsh.PMSHControlLoopDefinition:\n      version: 1.2.3\n      type: org.onap.policy.clamp.controlloop.ControlLoop\n      type_version: 1.0.0\n      description: Control loop for Performance Management Subscription Handling\n      properties:\n        provider: Ericsson\n        elements:\n        - name: org.onap.domain.pmsh.PMSH_DCAEMicroservice\n          version: 1.2.3\n        - name: org.onap.domain.pmsh.PMSH_MonitoringPolicyControlLoopElement\n          version: 1.2.3\n        - name: org.onap.domain.pmsh.PMSH_OperationalPolicyControlLoopElement\n          version: 1.2.3\n  policies:\n  - MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0test:\n      type: onap.policies.monitoring.dcae-pm-subscription-handler\n      type_version: 1.0.0\n      name: MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0test\n      version: 1.0.0\n      metadata:\n        policy-id: MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0test\n        policy-version: 1.0.0\n      properties:\n        pmsh_policy:\n          fileBasedGP: 15\n          fileLocation: /pm/pm.xml\n          subscriptionName: subscriptiona\n          administrativeState: UNLOCKED\n          nfFilter:\n            onap.datatypes.monitoring.nfFilter:\n              modelVersionIDs:\n              - e80a6ae3-cafd-4d24-850d-e14c084a5ca9\n              modelInvariantIDs:\n              - 5845y423-g654-6fju-po78-8n53154532k6\n              - 7129e420-d396-4efb-af02-6b83499b12f8\n              modelNames: []\n              nfNames:\n              - '\"^pnf1.*\"'\n          measurementGroups:\n          - measurementGroup:\n              onap.datatypes.monitoring.measurementGroup:\n                measurementTypes:\n                - measurementType:\n                    onap.datatypes.monitoring.measurementType:\n                      measurementType: countera\n                - measurementType:\n                    onap.datatypes.monitoring.measurementType:\n                      measurementType: counterb\n                managedObjectDNsBasic:\n                - managedObjectDNsBasic:\n                    onap.datatypes.monitoring.managedObjectDNsBasic:\n                      DN: dna\n                - managedObjectDNsBasic:\n                    onap.datatypes.monitoring.managedObjectDNsBasic:\n                      DN: dnb\n          - measurementGroup:\n              onap.datatypes.monitoring.measurementGroup:\n                measurementTypes:\n                - measurementType:\n                    onap.datatypes.monitoring.measurementType:\n                      measurementType: counterc\n                - measurementType:\n                    onap.datatypes.monitoring.measurementType:\n                      measurementType: counterd\n                managedObjectDNsBasic:\n                - managedObjectDNsBasic:\n                    onap.datatypes.monitoring.managedObjectDNsBasic:\n                      DN: dnc\n                - managedObjectDNsBasic:\n                    onap.datatypes.monitoring.managedObjectDNsBasic:\n                      DN: dnd\n  - operational.apex.pmcontrol:\n      type: onap.policies.controlloop.operational.common.Apex\n      type_version: 1.0.0\n      version: 1.0.0\n      metadata:\n        policy-id: operational.apex.pmcontrol\n        policy-version: 1\n      properties:\n        engineServiceParameters:\n          name: MyApexEngine\n          version: 0.0.1\n          id: 45\n          instanceCount: 2\n          deploymentPort: 12561\n          policy_type_impl:\n            apexPolicyModel:\n              key:\n                name: PMControlPolicy\n                version: 0.0.1\n              keyInformation:\n                key:\n                  name: PMControlPolicy_KeyInfo\n                  version: 0.0.1\n                keyInfoMap:\n                  entry:\n                  - key:\n                      name: CDSActionIdentifiersType\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: CDSActionIdentifiersType\n                        version: 0.0.1\n                      UUID: 6e5fa19b-14df-37e3-a4ae-8c537e861a82\n                      description: Generated description for concept referred to by key \"CDSActionIdentifiersType:0.0.1\"\n                  - key:\n                      name: CDSCreateResponseEvent\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: CDSCreateResponseEvent\n                        version: 0.0.1\n                      UUID: 14b29e38-ac75-3273-aa4e-8583c0aa7dad\n                      description: Generated description for concept referred to by key \"CDSCreateResponseEvent:0.0.1\"\n                  - key:\n                      name: CDSCreateResponsePayloadType\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: CDSCreateResponsePayloadType\n                        version: 0.0.1\n                      UUID: 04573f8f-e772-30a5-b1d9-d7318d4a1e13\n                      description: Generated description for concept referred to by key \"CDSCreateResponsePayloadType:0.0.1\"\n                  - key:\n                      name: CDSCreateResponsePolicy\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: CDSCreateResponsePolicy\n                        version: 0.0.1\n                      UUID: e126c965-fc09-3bfe-8f55-70f380a4a49c\n                      description: Generated description for concept referred to by key \"CDSCreateResponsePolicy:0.0.1\"\n                  - key:\n                      name: CDSCreateResponseTask\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: CDSCreateResponseTask\n                        version: 0.0.1\n                      UUID: 6165ee82-afd2-3aab-a517-f00b3f2461d2\n                      description: Generated description for concept referred to by key \"CDSCreateResponseTask:0.0.1\"\n                  - key:\n                      name: CDSCreateSubscriptionPayloadType\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: CDSCreateSubscriptionPayloadType\n                        version: 0.0.1\n                      UUID: 8350ac5e-c157-38b9-9614-a0f93a830e60\n                      description: Generated description for concept referred to by key \"CDSCreateSubscriptionPayloadType:0.0.1\"\n                  - key:\n                      name: CDSCreateSubscriptionRequestEvent\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: CDSCreateSubscriptionRequestEvent\n                        version: 0.0.1\n                      UUID: cfa325ba-226b-3a31-9183-ec43e2b6e9a2\n                      description: Generated description for concept referred to by key \"CDSCreateSubscriptionRequestEvent:0.0.1\"\n                  - key:\n                      name: CDSDeleteResponseEvent\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: CDSDeleteResponseEvent\n                        version: 0.0.1\n                      UUID: 8be9c0fa-7437-3841-aff2-b3cec6ae3bd8\n                      description: Generated description for concept referred to by key \"CDSDeleteResponseEvent:0.0.1\"\n                  - key:\n                      name: CDSDeleteResponsePayloadType\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: CDSDeleteResponsePayloadType\n                        version: 0.0.1\n                      UUID: 3fbfe0c9-152e-34d3-a504-09cd13c058d0\n                      description: Generated description for concept referred to by key \"CDSDeleteResponsePayloadType:0.0.1\"\n                  - key:\n                      name: CDSDeleteResponsePolicy\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: CDSDeleteResponsePolicy\n                        version: 0.0.1\n                      UUID: a780251c-edd5-3132-b865-04313246b43c\n                      description: Generated description for concept referred to by key \"CDSDeleteResponsePolicy:0.0.1\"\n                  - key:\n                      name: CDSDeleteResponseTask\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: CDSDeleteResponseTask\n                        version: 0.0.1\n                      UUID: afce4555-3aa3-3521-a7d8-ee8cdf0d3efc\n                      description: Generated description for concept referred to by key \"CDSDeleteResponseTask:0.0.1\"\n                  - key:\n                      name: CDSDeleteSubscriptionPayloadType\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: CDSDeleteSubscriptionPayloadType\n                        version: 0.0.1\n                      UUID: 12658406-9147-3c9d-a38c-5ad5e30b092b\n                      description: Generated description for concept referred to by key \"CDSDeleteSubscriptionPayloadType:0.0.1\"\n                  - key:\n                      name: CDSDeleteSubscriptionRequestEvent\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: CDSDeleteSubscriptionRequestEvent\n                        version: 0.0.1\n                      UUID: 24380c95-9289-36e6-8cbf-0edefa15ccd9\n                      description: Generated description for concept referred to by key \"CDSDeleteSubscriptionRequestEvent:0.0.1\"\n                  - key:\n                      name: CDSRequestCommonHeaderType\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: CDSRequestCommonHeaderType\n                        version: 0.0.1\n                      UUID: 35590ac0-062c-39f1-8786-b4ff716e30b1\n                      description: Generated description for concept referred to by key \"CDSRequestCommonHeaderType:0.0.1\"\n                  - key:\n                      name: CDSResponseCommonHeaderType\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: CDSResponseCommonHeaderType\n                        version: 0.0.1\n                      UUID: dd7e1805-885a-350b-aaf9-ed541321ae3c\n                      description: Generated description for concept referred to by key \"CDSResponseCommonHeaderType:0.0.1\"\n                  - key:\n                      name: CDSResponseStatusEvent\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: CDSResponseStatusEvent\n                        version: 0.0.1\n                      UUID: 7986e21b-32f7-302e-9554-31f21b673493\n                      description: Generated description for concept referred to by key \"CDSResponseStatusEvent:0.0.1\"\n                  - key:\n                      name: CDSResponseStatusType\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: CDSResponseStatusType\n                        version: 0.0.1\n                      UUID: 92b8a2cf-344e-3ce1-8cc0-2b7d3cb695fa\n                      description: Generated description for concept referred to by key \"CDSResponseStatusType:0.0.1\"\n                  - key:\n                      name: CreateSubscriptionPayloadEvent\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: CreateSubscriptionPayloadEvent\n                        version: 0.0.1\n                      UUID: 92162397-1a8e-3a3f-a469-d2af7700af4a\n                      description: Generated description for concept referred to by key \"CreateSubscriptionPayloadEvent:0.0.1\"\n                  - key:\n                      name: CreateSubscriptionPayloadTask\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: CreateSubscriptionPayloadTask\n                        version: 0.0.1\n                      UUID: bc0c69f0-52ed-38ea-b468-ae4a6fd1730d\n                      description: Generated description for concept referred to by key \"CreateSubscriptionPayloadTask:0.0.1\"\n                  - key:\n                      name: CreateSubscriptionRequestTask\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: CreateSubscriptionRequestTask\n                        version: 0.0.1\n                      UUID: 89cb75e9-f06c-30d3-b4ff-698d45f63869\n                      description: Generated description for concept referred to by key \"CreateSubscriptionRequestTask:0.0.1\"\n                  - key:\n                      name: DeleteSubscriptionPayloadEvent\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: DeleteSubscriptionPayloadEvent\n                        version: 0.0.1\n                      UUID: 994fa441-04ab-33bb-832d-1cd12ab5d074\n                      description: Generated description for concept referred to by key \"DeleteSubscriptionPayloadEvent:0.0.1\"\n                  - key:\n                      name: DeleteSubscriptionPayloadTask\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: DeleteSubscriptionPayloadTask\n                        version: 0.0.1\n                      UUID: 0f519117-5fea-3e4b-941f-8f778100465f\n                      description: Generated description for concept referred to by key \"DeleteSubscriptionPayloadTask:0.0.1\"\n                  - key:\n                      name: DeleteSubscriptionRequestTask\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: DeleteSubscriptionRequestTask\n                        version: 0.0.1\n                      UUID: acb772fe-d442-39e3-98f9-b1080caf4150\n                      description: Generated description for concept referred to by key \"DeleteSubscriptionRequestTask:0.0.1\"\n                  - key:\n                      name: MRResponseEvent\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: MRResponseEvent\n                        version: 0.0.1\n                      UUID: 13c747a3-6bae-3bcf-9c80-b152e01dc194\n                      description: Generated description for concept referred to by key \"MRResponseEvent:0.0.1\"\n                  - key:\n                      name: PMControlPolicy\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: PMControlPolicy\n                        version: 0.0.1\n                      UUID: acf1e55c-7bc5-3bd5-975a-0ca54afcd8a4\n                      description: Generated description for concept referred to by key \"PMControlPolicy:0.0.1\"\n                  - key:\n                      name: PMControlPolicy_Albums\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: PMControlPolicy_Albums\n                        version: 0.0.1\n                      UUID: b38ad204-c2c8-32f4-9b5a-dda0aeb0145b\n                      description: Generated description for concept referred to by key \"PMControlPolicy_Albums:0.0.1\"\n                  - key:\n                      name: PMControlPolicy_Events\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: PMControlPolicy_Events\n                        version: 0.0.1\n                      UUID: be3871a0-c42a-3113-a066-82d192840eca\n                      description: Generated description for concept referred to by key \"PMControlPolicy_Events:0.0.1\"\n                  - key:\n                      name: PMControlPolicy_KeyInfo\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: PMControlPolicy_KeyInfo\n                        version: 0.0.1\n                      UUID: ced37634-28a4-3178-b7f6-2980794927b0\n                      description: Generated description for concept referred to by key \"PMControlPolicy_KeyInfo:0.0.1\"\n                  - key:\n                      name: PMControlPolicy_Policies\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: PMControlPolicy_Policies\n                        version: 0.0.1\n                      UUID: be3d180d-ef9c-3a75-8e9c-84271a038bed\n                      description: Generated description for concept referred to by key \"PMControlPolicy_Policies:0.0.1\"\n                  - key:\n                      name: PMControlPolicy_Schemas\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: PMControlPolicy_Schemas\n                        version: 0.0.1\n                      UUID: e61973f1-189c-39e5-82f6-0d3afe298a20\n                      description: Generated description for concept referred to by key \"PMControlPolicy_Schemas:0.0.1\"\n                  - key:\n                      name: PMControlPolicy_Tasks\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: PMControlPolicy_Tasks\n                        version: 0.0.1\n                      UUID: 5658adb3-2962-30a3-a241-fae75bb8eb4a\n                      description: Generated description for concept referred to by key \"PMControlPolicy_Tasks:0.0.1\"\n                  - key:\n                      name: PMSubscriptionAlbum\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: PMSubscriptionAlbum\n                        version: 0.0.1\n                      UUID: c2bd6f0d-6854-317a-9be2-97c08338428c\n                      description: Generated description for concept referred to by key \"PMSubscriptionAlbum:0.0.1\"\n                  - key:\n                      name: PMSubscriptionOutputEvent\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: PMSubscriptionOutputEvent\n                        version: 0.0.1\n                      UUID: 992b7819-9f69-3aa0-bb0f-6e45ea15ce05\n                      description: Generated description for concept referred to by key \"PMSubscriptionOutputEvent:0.0.1\"\n                  - key:\n                      name: PMSubscriptionType\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: PMSubscriptionType\n                        version: 0.0.1\n                      UUID: 73c1c397-4fc3-357f-93b6-a8ad707fbaae\n                      description: Generated description for concept referred to by key \"PMSubscriptionType:0.0.1\"\n                  - key:\n                      name: ReceiveEventPolicy\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: ReceiveEventPolicy\n                        version: 0.0.1\n                      UUID: 568b7345-9de1-36d3-b6a3-9b857e6809a1\n                      description: Generated description for concept referred to by key \"ReceiveEventPolicy:0.0.1\"\n                  - key:\n                      name: ReceiveSubscriptionTask\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: ReceiveSubscriptionTask\n                        version: 0.0.1\n                      UUID: f596afc8-100c-35eb-92c8-352355ea457d\n                      description: Generated description for concept referred to by key \"ReceiveSubscriptionTask:0.0.1\"\n                  - key:\n                      name: SimpleIntType\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: SimpleIntType\n                        version: 0.0.1\n                      UUID: 153791fd-ae0a-36a7-88a5-309a7936415d\n                      description: Generated description for concept referred to by key \"SimpleIntType:0.0.1\"\n                  - key:\n                      name: SimpleStringType\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: SimpleStringType\n                        version: 0.0.1\n                      UUID: 8a4957cf-9493-3a76-8c22-a208e23259af\n                      description: Generated description for concept referred to by key \"SimpleStringType:0.0.1\"\n                  - key:\n                      name: SubscriptionStatusType\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: SubscriptionStatusType\n                        version: 0.0.1\n                      UUID: 597643b1-9db1-31ce-85d0-e1c63c43b30b\n                      description: Generated description for concept referred to by key \"SubscriptionStatusType:0.0.1\"\n                  - key:\n                      name: SubscriptionType\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: SubscriptionType\n                        version: 0.0.1\n                      UUID: 184547bb-7d64-3cb2-a273-d7185102c5ce\n                      description: Generated description for concept referred to by key \"SubscriptionType:0.0.1\"\n                  - key:\n                      name: UUIDType\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: UUIDType\n                        version: 0.0.1\n                      UUID: 6a8cc68e-dfc8-3403-9c6d-071c886b319c\n                      description: Generated description for concept referred to by key \"UUIDType:0.0.1\"\n                  - key:\n                      name: pmsh-operational-policy\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: pmsh-operational-policy\n                        version: 0.0.1\n                      UUID: fdf2c9ff-6422-3ea6-b6b6-49b12116265d\n                      description: Generated description for concept referred to by key \"pmsh-operational-policy:0.0.1\"\n              policies:\n                key:\n                  name: PMControlPolicy_Policies\n                  version: 0.0.1\n                policyMap:\n                  entry:\n                  - key:\n                      name: CDSCreateResponsePolicy\n                      version: 0.0.1\n                    value:\n                      policyKey:\n                        name: CDSCreateResponsePolicy\n                        version: 0.0.1\n                      template: Freestyle\n                      state:\n                        entry:\n                        - key: CDSCreateResponseState\n                          value:\n                            stateKey:\n                              parentKeyName: CDSCreateResponsePolicy\n                              parentKeyVersion: 0.0.1\n                              parentLocalName: 'NULL'\n                              localName: CDSCreateResponseState\n                            trigger:\n                              name: CDSCreateResponseEvent\n                              version: 0.0.1\n                            stateOutputs:\n                              entry:\n                              - key: ResponseOutput\n                                value:\n                                  key:\n                                    parentKeyName: CDSCreateResponsePolicy\n                                    parentKeyVersion: 0.0.1\n                                    parentLocalName: CDSCreateResponseState\n                                    localName: ResponseOutput\n                                  outgoingEvent:\n                                    name: CDSResponseStatusEvent\n                                    version: 0.0.1\n                                  nextState:\n                                    parentKeyName: 'NULL'\n                                    parentKeyVersion: 0.0.0\n                                    parentLocalName: 'NULL'\n                                    localName: 'NULL'\n                            contextAlbumReference: []\n                            taskSelectionLogic:\n                              key: 'NULL'\n                              logicFlavour: UNDEFINED\n                              logic: ''\n                            stateFinalizerLogicMap:\n                              entry: []\n                            defaultTask:\n                              name: CDSCreateResponseTask\n                              version: 0.0.1\n                            taskReferences:\n                              entry:\n                              - key:\n                                  name: CDSCreateResponseTask\n                                  version: 0.0.1\n                                value:\n                                  key:\n                                    parentKeyName: CDSCreateResponsePolicy\n                                    parentKeyVersion: 0.0.1\n                                    parentLocalName: CDSCreateResponseState\n                                    localName: CDSCreateResponsePolicy\n                                  outputType: DIRECT\n                                  output:\n                                    parentKeyName: CDSCreateResponsePolicy\n                                    parentKeyVersion: 0.0.1\n                                    parentLocalName: CDSCreateResponseState\n                                    localName: ResponseOutput\n                      firstState: CDSCreateResponseState\n                  - key:\n                      name: CDSDeleteResponsePolicy\n                      version: 0.0.1\n                    value:\n                      policyKey:\n                        name: CDSDeleteResponsePolicy\n                        version: 0.0.1\n                      template: Freestyle\n                      state:\n                        entry:\n                        - key: CDSDeleteResponseState\n                          value:\n                            stateKey:\n                              parentKeyName: CDSDeleteResponsePolicy\n                              parentKeyVersion: 0.0.1\n                              parentLocalName: 'NULL'\n                              localName: CDSDeleteResponseState\n                            trigger:\n                              name: CDSDeleteResponseEvent\n                              version: 0.0.1\n                            stateOutputs:\n                              entry:\n                              - key: ResponseOutput\n                                value:\n                                  key:\n                                    parentKeyName: CDSDeleteResponsePolicy\n                                    parentKeyVersion: 0.0.1\n                                    parentLocalName: CDSDeleteResponseState\n                                    localName: ResponseOutput\n                                  outgoingEvent:\n                                    name: CDSResponseStatusEvent\n                                    version: 0.0.1\n                                  nextState:\n                                    parentKeyName: 'NULL'\n                                    parentKeyVersion: 0.0.0\n                                    parentLocalName: 'NULL'\n                                    localName: 'NULL'\n                            contextAlbumReference: []\n                            taskSelectionLogic:\n                              key: 'NULL'\n                              logicFlavour: UNDEFINED\n                              logic: ''\n                            stateFinalizerLogicMap:\n                              entry: []\n                            defaultTask:\n                              name: CDSDeleteResponseTask\n                              version: 0.0.1\n                            taskReferences:\n                              entry:\n                              - key:\n                                  name: CDSDeleteResponseTask\n                                  version: 0.0.1\n                                value:\n                                  key:\n                                    parentKeyName: CDSDeleteResponsePolicy\n                                    parentKeyVersion: 0.0.1\n                                    parentLocalName: CDSDeleteResponseState\n                                    localName: CDSDeleteResponsePolicy\n                                  outputType: DIRECT\n                                  output:\n                                    parentKeyName: CDSDeleteResponsePolicy\n                                    parentKeyVersion: 0.0.1\n                                    parentLocalName: CDSDeleteResponseState\n                                    localName: ResponseOutput\n                      firstState: CDSDeleteResponseState\n                  - key:\n                      name: ReceiveEventPolicy\n                      version: 0.0.1\n                    value:\n                      policyKey:\n                        name: ReceiveEventPolicy\n                        version: 0.0.1\n                      template: Freestyle\n                      state:\n                        entry:\n                        - key: CreateOrDeleteState\n                          value:\n                            stateKey:\n                              parentKeyName: ReceiveEventPolicy\n                              parentKeyVersion: 0.0.1\n                              parentLocalName: 'NULL'\n                              localName: CreateOrDeleteState\n                            trigger:\n                              name: PMSubscriptionOutputEvent\n                              version: 0.0.1\n                            stateOutputs:\n                              entry:\n                              - key: CreateSubscriptionPayload\n                                value:\n                                  key:\n                                    parentKeyName: ReceiveEventPolicy\n                                    parentKeyVersion: 0.0.1\n                                    parentLocalName: CreateOrDeleteState\n                                    localName: CreateSubscriptionPayload\n                                  outgoingEvent:\n                                    name: CreateSubscriptionPayloadEvent\n                                    version: 0.0.1\n                                  nextState:\n                                    parentKeyName: ReceiveEventPolicy\n                                    parentKeyVersion: 0.0.1\n                                    parentLocalName: 'NULL'\n                                    localName: CreateSubscription\n                              - key: DeleteSubscriptionPayload\n                                value:\n                                  key:\n                                    parentKeyName: ReceiveEventPolicy\n                                    parentKeyVersion: 0.0.1\n                                    parentLocalName: CreateOrDeleteState\n                                    localName: DeleteSubscriptionPayload\n                                  outgoingEvent:\n                                    name: DeleteSubscriptionPayloadEvent\n                                    version: 0.0.1\n                                  nextState:\n                                    parentKeyName: ReceiveEventPolicy\n                                    parentKeyVersion: 0.0.1\n                                    parentLocalName: 'NULL'\n                                    localName: DeleteSubscription\n                            contextAlbumReference:\n                            - name: PMSubscriptionAlbum\n                              version: 0.0.1\n                            taskSelectionLogic:\n                              key: TaskSelectionLogic\n                              logicFlavour: JAVASCRIPT\n                              logic: |-\n                                /*\n                                 * ============LICENSE_START=======================================================\n                                 *  Copyright (C) 2020 Nordix. All rights reserved.\n                                 * ================================================================================\n                                 * Licensed under the Apache License, Version 2.0 (the \"License\");\n                                 * you may not use this file except in compliance with the License.\n                                 * You may obtain a copy of the License at\n                                 *\n                                 *      http://www.apache.org/licenses/LICENSE-2.0\n                                 *\n                                 * Unless required by applicable law or agreed to in writing, software\n                                 * distributed under the License is distributed on an \"AS IS\" BASIS,\n                                 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n                                 * See the License for the specific language governing permissions and\n                                 * limitations under the License.\n                                 *\n                                 * SPDX-License-Identifier: Apache-2.0\n                                 * ============LICENSE_END=========================================================\n                                 */\n\n                                executor.logger.info(executor.subject.id);\n\n                                var pmSubscriptionInfo = executor.getContextAlbum(\"PMSubscriptionAlbum\").get(executor.inFields.get(\"albumID\").toString())\n                                var changeType = pmSubscriptionInfo.get(\"changeType\").toString()\n\n                                executor.logger.info(\"Change Type is \" + changeType)\n\n                                if (\"CREATE\".equals(changeType)) {\n                                    executor.logger.info(\"Choosing to create a subscription\")\n                                    executor.subject.getTaskKey(\"CreateSubscriptionPayloadTask\").copyTo(executor.selectedTask);\n                                }\n                                else if (\"DELETE\".equals(changeType)) {\n                                    executor.logger.info(\"Choosing to delete a subscription\")\n                                    executor.subject.getTaskKey(\"DeleteSubscriptionPayloadTask\").copyTo(executor.selectedTask);\n                                }\n\n                                //var returnValue = executor.isTrue;\n                                true;\n                            stateFinalizerLogicMap:\n                              entry: []\n                            defaultTask:\n                              name: CreateSubscriptionPayloadTask\n                              version: 0.0.1\n                            taskReferences:\n                              entry:\n                              - key:\n                                  name: CreateSubscriptionPayloadTask\n                                  version: 0.0.1\n                                value:\n                                  key:\n                                    parentKeyName: ReceiveEventPolicy\n                                    parentKeyVersion: 0.0.1\n                                    parentLocalName: CreateOrDeleteState\n                                    localName: ReceiveEventPolicy\n                                  outputType: DIRECT\n                                  output:\n                                    parentKeyName: ReceiveEventPolicy\n                                    parentKeyVersion: 0.0.1\n                                    parentLocalName: CreateOrDeleteState\n                                    localName: CreateSubscriptionPayload\n                              - key:\n                                  name: DeleteSubscriptionPayloadTask\n                                  version: 0.0.1\n                                value:\n                                  key:\n                                    parentKeyName: ReceiveEventPolicy\n                                    parentKeyVersion: 0.0.1\n                                    parentLocalName: CreateOrDeleteState\n                                    localName: ReceiveEventPolicy\n                                  outputType: DIRECT\n                                  output:\n                                    parentKeyName: ReceiveEventPolicy\n                                    parentKeyVersion: 0.0.1\n                                    parentLocalName: CreateOrDeleteState\n                                    localName: DeleteSubscriptionPayload\n                        - key: CreateSubscription\n                          value:\n                            stateKey:\n                              parentKeyName: ReceiveEventPolicy\n                              parentKeyVersion: 0.0.1\n                              parentLocalName: 'NULL'\n                              localName: CreateSubscription\n                            trigger:\n                              name: CreateSubscriptionPayloadEvent\n                              version: 0.0.1\n                            stateOutputs:\n                              entry:\n                              - key: IssueCreateSubscriptionRequestOutput\n                                value:\n                                  key:\n                                    parentKeyName: ReceiveEventPolicy\n                                    parentKeyVersion: 0.0.1\n                                    parentLocalName: CreateSubscription\n                                    localName: IssueCreateSubscriptionRequestOutput\n                                  outgoingEvent:\n                                    name: CDSCreateSubscriptionRequestEvent\n                                    version: 0.0.1\n                                  nextState:\n                                    parentKeyName: 'NULL'\n                                    parentKeyVersion: 0.0.0\n                                    parentLocalName: 'NULL'\n                                    localName: 'NULL'\n                            contextAlbumReference:\n                            - name: PMSubscriptionAlbum\n                              version: 0.0.1\n                            taskSelectionLogic:\n                              key: 'NULL'\n                              logicFlavour: UNDEFINED\n                              logic: ''\n                            stateFinalizerLogicMap:\n                              entry: []\n                            defaultTask:\n                              name: CreateSubscriptionRequestTask\n                              version: 0.0.1\n                            taskReferences:\n                              entry:\n                              - key:\n                                  name: CreateSubscriptionRequestTask\n                                  version: 0.0.1\n                                value:\n                                  key:\n                                    parentKeyName: ReceiveEventPolicy\n                                    parentKeyVersion: 0.0.1\n                                    parentLocalName: CreateSubscription\n                                    localName: ReceiveEventPolicy\n                                  outputType: DIRECT\n                                  output:\n                                    parentKeyName: ReceiveEventPolicy\n                                    parentKeyVersion: 0.0.1\n                                    parentLocalName: CreateSubscription\n                                    localName: IssueCreateSubscriptionRequestOutput\n                        - key: DeleteSubscription\n                          value:\n                            stateKey:\n                              parentKeyName: ReceiveEventPolicy\n                              parentKeyVersion: 0.0.1\n                              parentLocalName: 'NULL'\n                              localName: DeleteSubscription\n                            trigger:\n                              name: DeleteSubscriptionPayloadEvent\n                              version: 0.0.1\n                            stateOutputs:\n                              entry:\n                              - key: IssueDeleteSubscriptionRequestOutput\n                                value:\n                                  key:\n                                    parentKeyName: ReceiveEventPolicy\n                                    parentKeyVersion: 0.0.1\n                                    parentLocalName: DeleteSubscription\n                                    localName: IssueDeleteSubscriptionRequestOutput\n                                  outgoingEvent:\n                                    name: CDSDeleteSubscriptionRequestEvent\n                                    version: 0.0.1\n                                  nextState:\n                                    parentKeyName: 'NULL'\n                                    parentKeyVersion: 0.0.0\n                                    parentLocalName: 'NULL'\n                                    localName: 'NULL'\n                            contextAlbumReference:\n                            - name: PMSubscriptionAlbum\n                              version: 0.0.1\n                            taskSelectionLogic:\n                              key: 'NULL'\n                              logicFlavour: UNDEFINED\n                              logic: ''\n                            stateFinalizerLogicMap:\n                              entry: []\n                            defaultTask:\n                              name: DeleteSubscriptionRequestTask\n                              version: 0.0.1\n                            taskReferences:\n                              entry:\n                              - key:\n                                  name: DeleteSubscriptionRequestTask\n                                  version: 0.0.1\n                                value:\n                                  key:\n                                    parentKeyName: ReceiveEventPolicy\n                                    parentKeyVersion: 0.0.1\n                                    parentLocalName: DeleteSubscription\n                                    localName: ReceiveEventPolicy\n                                  outputType: DIRECT\n                                  output:\n                                    parentKeyName: ReceiveEventPolicy\n                                    parentKeyVersion: 0.0.1\n                                    parentLocalName: DeleteSubscription\n                                    localName: IssueDeleteSubscriptionRequestOutput\n                        - key: ReceiveSubscriptionState\n                          value:\n                            stateKey:\n                              parentKeyName: ReceiveEventPolicy\n                              parentKeyVersion: 0.0.1\n                              parentLocalName: 'NULL'\n                              localName: ReceiveSubscriptionState\n                            trigger:\n                              name: pmsh-operational-policy\n                              version: 0.0.1\n                            stateOutputs:\n                              entry:\n                              - key: ReceivePMSubscriptionOutput\n                                value:\n                                  key:\n                                    parentKeyName: ReceiveEventPolicy\n                                    parentKeyVersion: 0.0.1\n                                    parentLocalName: ReceiveSubscriptionState\n                                    localName: ReceivePMSubscriptionOutput\n                                  outgoingEvent:\n                                    name: PMSubscriptionOutputEvent\n                                    version: 0.0.1\n                                  nextState:\n                                    parentKeyName: ReceiveEventPolicy\n                                    parentKeyVersion: 0.0.1\n                                    parentLocalName: 'NULL'\n                                    localName: CreateOrDeleteState\n                            contextAlbumReference:\n                            - name: PMSubscriptionAlbum\n                              version: 0.0.1\n                            taskSelectionLogic:\n                              key: 'NULL'\n                              logicFlavour: UNDEFINED\n                              logic: ''\n                            stateFinalizerLogicMap:\n                              entry: []\n                            defaultTask:\n                              name: ReceiveSubscriptionTask\n                              version: 0.0.1\n                            taskReferences:\n                              entry:\n                              - key:\n                                  name: ReceiveSubscriptionTask\n                                  version: 0.0.1\n                                value:\n                                  key:\n                                    parentKeyName: ReceiveEventPolicy\n                                    parentKeyVersion: 0.0.1\n                                    parentLocalName: ReceiveSubscriptionState\n                                    localName: ReceiveEventPolicy\n                                  outputType: DIRECT\n                                  output:\n                                    parentKeyName: ReceiveEventPolicy\n                                    parentKeyVersion: 0.0.1\n                                    parentLocalName: ReceiveSubscriptionState\n                                    localName: ReceivePMSubscriptionOutput\n                      firstState: ReceiveSubscriptionState\n              tasks:\n                key:\n                  name: PMControlPolicy_Tasks\n                  version: 0.0.1\n                taskMap:\n                  entry:\n                  - key:\n                      name: CDSCreateResponseTask\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: CDSCreateResponseTask\n                        version: 0.0.1\n                      inputFields:\n                        entry:\n                        - key: actionIdentifiers\n                          value:\n                            key: actionIdentifiers\n                            fieldSchemaKey:\n                              name: CDSActionIdentifiersType\n                              version: 0.0.1\n                            optional: false\n                        - key: commonHeader\n                          value:\n                            key: commonHeader\n                            fieldSchemaKey:\n                              name: CDSResponseCommonHeaderType\n                              version: 0.0.1\n                            optional: false\n                        - key: payload\n                          value:\n                            key: payload\n                            fieldSchemaKey:\n                              name: CDSCreateResponsePayloadType\n                              version: 0.0.1\n                            optional: false\n                        - key: status\n                          value:\n                            key: status\n                            fieldSchemaKey:\n                              name: CDSResponseStatusType\n                              version: 0.0.1\n                            optional: false\n                      outputFields:\n                        entry:\n                        - key: status\n                          value:\n                            key: status\n                            fieldSchemaKey:\n                              name: SubscriptionStatusType\n                              version: 0.0.1\n                            optional: false\n                      taskParameters:\n                        entry: []\n                      contextAlbumReference:\n                      - name: PMSubscriptionAlbum\n                        version: 0.0.1\n                      taskLogic:\n                        key: TaskLogic\n                        logicFlavour: JAVASCRIPT\n                        logic: |-\n                          /*\n                           * ============LICENSE_START=======================================================\n                           *  Copyright (C) 2020 Nordix. All rights reserved.\n                           * ================================================================================\n                           * Licensed under the Apache License, Version 2.0 (the \"License\");\n                           * you may not use this file except in compliance with the License.\n                           * You may obtain a copy of the License at\n                           *\n                           *      http://www.apache.org/licenses/LICENSE-2.0\n                           *\n                           * Unless required by applicable law or agreed to in writing, software\n                           * distributed under the License is distributed on an \"AS IS\" BASIS,\n                           * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n                           * See the License for the specific language governing permissions and\n                           * limitations under the License.\n                           *\n                           * SPDX-License-Identifier: Apache-2.0\n                           * ============LICENSE_END=========================================================\n                           */\n\n                          executor.logger.info(executor.subject.id);\n\n                          var commonHeader = executor.inFields.get(\"commonHeader\")\n                          var response = executor.inFields.get(\"payload\")\n                          var albumID = commonHeader.get(\"requestId\")\n\n                          var pmSubscriptionInfo = executor.getContextAlbum(\"PMSubscriptionAlbum\").get(albumID.toString());\n                          var responseStatus = executor.subject.getOutFieldSchemaHelper(\"status\").createNewInstance();\n\n                          responseStatus.put(\"subscriptionName\", pmSubscriptionInfo.get(\"subscription\").get(\"subscriptionName\"))\n                          responseStatus.put(\"nfName\", pmSubscriptionInfo.get(\"nfName\"))\n                          responseStatus.put(\"changeType\", pmSubscriptionInfo.get(\"changeType\"))\n\n                          var status = response.get(pmSubscriptionInfo.get(\"changeType\").toLowerCase() + \"_DasH_subscription_DasH_response\").get(\"odl_DasH_response\").get(\"status\")\n\n                          executor.logger.info(\"RESPONSE STATUS = \" + status)\n\n                          if(status == \"success\") {\n                              responseStatus.put(\"message\", \"success\")\n                          } else {\n                              responseStatus.put(\"message\", \"failed\")\n                          }\n\n                          executor.outFields.put(\"status\", responseStatus)\n\n                          //var returnValue = executor.isTrue;\n                          true;\n                  - key:\n                      name: CDSDeleteResponseTask\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: CDSDeleteResponseTask\n                        version: 0.0.1\n                      inputFields:\n                        entry:\n                        - key: actionIdentifiers\n                          value:\n                            key: actionIdentifiers\n                            fieldSchemaKey:\n                              name: CDSActionIdentifiersType\n                              version: 0.0.1\n                            optional: false\n                        - key: commonHeader\n                          value:\n                            key: commonHeader\n                            fieldSchemaKey:\n                              name: CDSResponseCommonHeaderType\n                              version: 0.0.1\n                            optional: false\n                        - key: payload\n                          value:\n                            key: payload\n                            fieldSchemaKey:\n                              name: CDSDeleteResponsePayloadType\n                              version: 0.0.1\n                            optional: false\n                        - key: status\n                          value:\n                            key: status\n                            fieldSchemaKey:\n                              name: CDSResponseStatusType\n                              version: 0.0.1\n                            optional: false\n                      outputFields:\n                        entry:\n                        - key: status\n                          value:\n                            key: status\n                            fieldSchemaKey:\n                              name: SubscriptionStatusType\n                              version: 0.0.1\n                            optional: false\n                      taskParameters:\n                        entry: []\n                      contextAlbumReference:\n                      - name: PMSubscriptionAlbum\n                        version: 0.0.1\n                      taskLogic:\n                        key: TaskLogic\n                        logicFlavour: JAVASCRIPT\n                        logic: |-\n                          /*\n                           * ============LICENSE_START=======================================================\n                           *  Copyright (C) 2020 Nordix. All rights reserved.\n                           * ================================================================================\n                           * Licensed under the Apache License, Version 2.0 (the \"License\");\n                           * you may not use this file except in compliance with the License.\n                           * You may obtain a copy of the License at\n                           *\n                           *      http://www.apache.org/licenses/LICENSE-2.0\n                           *\n                           * Unless required by applicable law or agreed to in writing, software\n                           * distributed under the License is distributed on an \"AS IS\" BASIS,\n                           * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n                           * See the License for the specific language governing permissions and\n                           * limitations under the License.\n                           *\n                           * SPDX-License-Identifier: Apache-2.0\n                           * ============LICENSE_END=========================================================\n                           */\n\n                          executor.logger.info(executor.subject.id);\n\n                          var commonHeader = executor.inFields.get(\"commonHeader\")\n                          var response = executor.inFields.get(\"payload\")\n                          var albumID = commonHeader.get(\"requestId\")\n\n                          var pmSubscriptionInfo = executor.getContextAlbum(\"PMSubscriptionAlbum\").get(albumID.toString());\n                          var responseStatus = executor.subject.getOutFieldSchemaHelper(\"status\").createNewInstance();\n\n                          responseStatus.put(\"subscriptionName\", pmSubscriptionInfo.get(\"subscription\").get(\"subscriptionName\"))\n                          responseStatus.put(\"nfName\", pmSubscriptionInfo.get(\"nfName\"))\n                          responseStatus.put(\"changeType\", pmSubscriptionInfo.get(\"changeType\"))\n\n                          var status = response.get(pmSubscriptionInfo.get(\"changeType\").toLowerCase() + \"_DasH_subscription_DasH_response\").get(\"odl_DasH_response\").get(\"status\")\n\n                          executor.logger.info(\"RESPONSE STATUS = \" + status)\n\n                          if(status == \"success\") {\n                              responseStatus.put(\"message\", \"success\")\n                          } else {\n                              responseStatus.put(\"message\", \"failed\")\n                          }\n\n                          executor.outFields.put(\"status\", responseStatus)\n\n                          //var returnValue = executor.isTrue;\n                          true;\n                  - key:\n                      name: CreateSubscriptionPayloadTask\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: CreateSubscriptionPayloadTask\n                        version: 0.0.1\n                      inputFields:\n                        entry:\n                        - key: albumID\n                          value:\n                            key: albumID\n                            fieldSchemaKey:\n                              name: UUIDType\n                              version: 0.0.1\n                            optional: false\n                      outputFields:\n                        entry:\n                        - key: albumID\n                          value:\n                            key: albumID\n                            fieldSchemaKey:\n                              name: UUIDType\n                              version: 0.0.1\n                            optional: false\n                        - key: payload\n                          value:\n                            key: payload\n                            fieldSchemaKey:\n                              name: CDSCreateSubscriptionPayloadType\n                              version: 0.0.1\n                            optional: false\n                      taskParameters:\n                        entry: []\n                      contextAlbumReference:\n                      - name: PMSubscriptionAlbum\n                        version: 0.0.1\n                      taskLogic:\n                        key: TaskLogic\n                        logicFlavour: JAVASCRIPT\n                        logic: |-\n                          /*\n                           * ============LICENSE_START=======================================================\n                           *  Copyright (C) 2020 Nordix. All rights reserved.\n                           * ================================================================================\n                           * Licensed under the Apache License, Version 2.0 (the \"License\");\n                           * you may not use this file except in compliance with the License.\n                           * You may obtain a copy of the License at\n                           *\n                           *      http://www.apache.org/licenses/LICENSE-2.0\n                           *\n                           * Unless required by applicable law or agreed to in writing, software\n                           * distributed under the License is distributed on an \"AS IS\" BASIS,\n                           * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n                           * See the License for the specific language governing permissions and\n                           * limitations under the License.\n                           *\n                           * SPDX-License-Identifier: Apache-2.0\n                           * ============LICENSE_END=========================================================\n                           */\n\n                          executor.logger.info(executor.subject.id);\n\n                          var pmSubscriptionInfo = executor.getContextAlbum(\"PMSubscriptionAlbum\").get(executor.inFields.get(\"albumID\").toString())\n\n                          var changeType = pmSubscriptionInfo.get(\"changeType\").toLowerCase()\n\n                          var payloadProperties = executor.subject.getOutFieldSchemaHelper(\"payload\").createNewSubInstance(changeType + \"_DasH_subscription_DasH_properties_record\");\n\n                          payloadProperties.put(\"nfName\",  pmSubscriptionInfo.get(\"nfName\"))\n                          payloadProperties.put(\"subscriptionName\",  pmSubscriptionInfo.get(\"subscription\").get(\"subscriptionName\"))\n                          payloadProperties.put(\"administrativeState\", pmSubscriptionInfo.get(\"subscription\").get(\"administrativeState\"))\n                          payloadProperties.put(\"fileBasedGP\",  pmSubscriptionInfo.get(\"subscription\").get(\"fileBasedGP\").toString())\n                          payloadProperties.put(\"fileLocation\", pmSubscriptionInfo.get(\"subscription\").get(\"fileLocation\"))\n                          payloadProperties.put(\"measurementGroups\", pmSubscriptionInfo.get(\"subscription\").get(\"measurementGroups\"))\n\n                          var payloadEntry = executor.subject.getOutFieldSchemaHelper(\"payload\").createNewSubInstance(\"CDSRequestPayloadEntry\");\n                          payloadEntry.put(changeType + \"_DasH_subscription_DasH_properties\", payloadProperties)\n\n                          var payload = executor.subject.getOutFieldSchemaHelper(\"payload\").createNewInstance();\n                          payload.put(changeType + \"_DasH_subscription_DasH_request\", payloadEntry);\n\n                          executor.outFields.put(\"albumID\", executor.inFields.get(\"albumID\"))\n                          executor.outFields.put(\"payload\", payload);\n\n                          //var returnValue = executor.isTrue;\n                          true;\n                  - key:\n                      name: CreateSubscriptionRequestTask\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: CreateSubscriptionRequestTask\n                        version: 0.0.1\n                      inputFields:\n                        entry:\n                        - key: albumID\n                          value:\n                            key: albumID\n                            fieldSchemaKey:\n                              name: UUIDType\n                              version: 0.0.1\n                            optional: false\n                        - key: payload\n                          value:\n                            key: payload\n                            fieldSchemaKey:\n                              name: CDSCreateSubscriptionPayloadType\n                              version: 0.0.1\n                            optional: false\n                      outputFields:\n                        entry:\n                        - key: actionIdentifiers\n                          value:\n                            key: actionIdentifiers\n                            fieldSchemaKey:\n                              name: CDSActionIdentifiersType\n                              version: 0.0.1\n                            optional: false\n                        - key: commonHeader\n                          value:\n                            key: commonHeader\n                            fieldSchemaKey:\n                              name: CDSRequestCommonHeaderType\n                              version: 0.0.1\n                            optional: false\n                        - key: payload\n                          value:\n                            key: payload\n                            fieldSchemaKey:\n                              name: CDSCreateSubscriptionPayloadType\n                              version: 0.0.1\n                            optional: false\n                      taskParameters:\n                        entry: []\n                      contextAlbumReference:\n                      - name: PMSubscriptionAlbum\n                        version: 0.0.1\n                      taskLogic:\n                        key: TaskLogic\n                        logicFlavour: JAVASCRIPT\n                        logic: |-\n                          /*\n                           * ============LICENSE_START=======================================================\n                           *  Copyright (C) 2020 Nordix. All rights reserved.\n                           * ================================================================================\n                           * Licensed under the Apache License, Version 2.0 (the \"License\");\n                           * you may not use this file except in compliance with the License.\n                           * You may obtain a copy of the License at\n                           *\n                           *      http://www.apache.org/licenses/LICENSE-2.0\n                           *\n                           * Unless required by applicable law or agreed to in writing, software\n                           * distributed under the License is distributed on an \"AS IS\" BASIS,\n                           * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n                           * See the License for the specific language governing permissions and\n                           * limitations under the License.\n                           *\n                           * SPDX-License-Identifier: Apache-2.0\n                           * ============LICENSE_END=========================================================\n                           */\n\n                          executor.logger.info(executor.subject.id);\n\n                          var pmSubscriptionInfo = executor.getContextAlbum(\"PMSubscriptionAlbum\").get(executor.inFields.get(\"albumID\").toString())\n\n                          var changeType = pmSubscriptionInfo.get(\"changeType\").toLowerCase()\n                          var blueprintName = pmSubscriptionInfo.get(\"blueprintName\").toLowerCase()\n                          var blueprintVersion = pmSubscriptionInfo.get(\"blueprintVersion\").toLowerCase()\n                          var payload = executor.inFields.get(\"payload\")\n                          var actionName = changeType + \"-subscription\"\n\n                          var commonHeader = executor.subject.getOutFieldSchemaHelper(\"commonHeader\").createNewInstance();\n                          commonHeader.put(\"originatorId\", \"sdnc\");\n                          commonHeader.put(\"requestId\", executor.inFields.get(\"albumID\").toString());\n                          commonHeader.put(\"subRequestId\", \"sub-123456-1000\");\n\n                          var actionIdentifiers = executor.subject.getOutFieldSchemaHelper(\"actionIdentifiers\").createNewInstance();\n                          actionIdentifiers.put(\"actionName\", actionName);\n                          actionIdentifiers.put(\"blueprintName\", blueprintName);\n                          actionIdentifiers.put(\"blueprintVersion\", blueprintVersion);\n                          actionIdentifiers.put(\"mode\", \"sync\");\n\n                          executor.outFields.put(\"commonHeader\", commonHeader);\n                          executor.outFields.put(\"actionIdentifiers\", actionIdentifiers);\n                          executor.outFields.put(\"payload\", payload);\n\n                          //var returnValue = executor.isTrue;\n                          true;\n                  - key:\n                      name: DeleteSubscriptionPayloadTask\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: DeleteSubscriptionPayloadTask\n                        version: 0.0.1\n                      inputFields:\n                        entry:\n                        - key: albumID\n                          value:\n                            key: albumID\n                            fieldSchemaKey:\n                              name: UUIDType\n                              version: 0.0.1\n                            optional: false\n                      outputFields:\n                        entry:\n                        - key: albumID\n                          value:\n                            key: albumID\n                            fieldSchemaKey:\n                              name: UUIDType\n                              version: 0.0.1\n                            optional: false\n                        - key: payload\n                          value:\n                            key: payload\n                            fieldSchemaKey:\n                              name: CDSDeleteSubscriptionPayloadType\n                              version: 0.0.1\n                            optional: false\n                      taskParameters:\n                        entry: []\n                      contextAlbumReference:\n                      - name: PMSubscriptionAlbum\n                        version: 0.0.1\n                      taskLogic:\n                        key: TaskLogic\n                        logicFlavour: JAVASCRIPT\n                        logic: |-\n                          /*\n                           * ============LICENSE_START=======================================================\n                           *  Copyright (C) 2020 Nordix. All rights reserved.\n                           * ================================================================================\n                           * Licensed under the Apache License, Version 2.0 (the \"License\");\n                           * you may not use this file except in compliance with the License.\n                           * You may obtain a copy of the License at\n                           *\n                           *      http://www.apache.org/licenses/LICENSE-2.0\n                           *\n                           * Unless required by applicable law or agreed to in writing, software\n                           * distributed under the License is distributed on an \"AS IS\" BASIS,\n                           * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n                           * See the License for the specific language governing permissions and\n                           * limitations under the License.\n                           *\n                           * SPDX-License-Identifier: Apache-2.0\n                           * ============LICENSE_END=========================================================\n                           */\n\n                          executor.logger.info(executor.subject.id);\n\n                          var pmSubscriptionInfo = executor.getContextAlbum(\"PMSubscriptionAlbum\").get(executor.inFields.get(\"albumID\").toString())\n\n                          var changeType = pmSubscriptionInfo.get(\"changeType\").toLowerCase()\n\n                          var payloadProperties = executor.subject.getOutFieldSchemaHelper(\"payload\").createNewSubInstance(changeType + \"_DasH_subscription_DasH_properties_record\");\n\n                          payloadProperties.put(\"nfName\",  pmSubscriptionInfo.get(\"nfName\"))\n                          payloadProperties.put(\"subscriptionName\",  pmSubscriptionInfo.get(\"subscription\").get(\"subscriptionName\"))\n                          payloadProperties.put(\"administrativeState\", pmSubscriptionInfo.get(\"subscription\").get(\"administrativeState\"))\n                          payloadProperties.put(\"fileBasedGP\",  pmSubscriptionInfo.get(\"subscription\").get(\"fileBasedGP\").toString())\n                          payloadProperties.put(\"fileLocation\", pmSubscriptionInfo.get(\"subscription\").get(\"fileLocation\"))\n                          payloadProperties.put(\"measurementGroups\", pmSubscriptionInfo.get(\"subscription\").get(\"measurementGroups\"))\n\n                          var payloadEntry = executor.subject.getOutFieldSchemaHelper(\"payload\").createNewSubInstance(\"CDSRequestPayloadEntry\");\n                          payloadEntry.put(changeType + \"_DasH_subscription_DasH_properties\", payloadProperties)\n\n                          var payload = executor.subject.getOutFieldSchemaHelper(\"payload\").createNewInstance();\n                          payload.put(changeType + \"_DasH_subscription_DasH_request\", payloadEntry);\n\n                          executor.outFields.put(\"albumID\", executor.inFields.get(\"albumID\"))\n                          executor.outFields.put(\"payload\", payload);\n\n                          //var returnValue = executor.isTrue;\n                          true;\n                  - key:\n                      name: DeleteSubscriptionRequestTask\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: DeleteSubscriptionRequestTask\n                        version: 0.0.1\n                      inputFields:\n                        entry:\n                        - key: albumID\n                          value:\n                            key: albumID\n                            fieldSchemaKey:\n                              name: UUIDType\n                              version: 0.0.1\n                            optional: false\n                        - key: payload\n                          value:\n                            key: payload\n                            fieldSchemaKey:\n                              name: CDSDeleteSubscriptionPayloadType\n                              version: 0.0.1\n                            optional: false\n                      outputFields:\n                        entry:\n                        - key: actionIdentifiers\n                          value:\n                            key: actionIdentifiers\n                            fieldSchemaKey:\n                              name: CDSActionIdentifiersType\n                              version: 0.0.1\n                            optional: false\n                        - key: commonHeader\n                          value:\n                            key: commonHeader\n                            fieldSchemaKey:\n                              name: CDSRequestCommonHeaderType\n                              version: 0.0.1\n                            optional: false\n                        - key: payload\n                          value:\n                            key: payload\n                            fieldSchemaKey:\n                              name: CDSDeleteSubscriptionPayloadType\n                              version: 0.0.1\n                            optional: false\n                      taskParameters:\n                        entry: []\n                      contextAlbumReference:\n                      - name: PMSubscriptionAlbum\n                        version: 0.0.1\n                      taskLogic:\n                        key: TaskLogic\n                        logicFlavour: JAVASCRIPT\n                        logic: |-\n                          /*\n                           * ============LICENSE_START=======================================================\n                           *  Copyright (C) 2020 Nordix. All rights reserved.\n                           * ================================================================================\n                           * Licensed under the Apache License, Version 2.0 (the \"License\");\n                           * you may not use this file except in compliance with the License.\n                           * You may obtain a copy of the License at\n                           *\n                           *      http://www.apache.org/licenses/LICENSE-2.0\n                           *\n                           * Unless required by applicable law or agreed to in writing, software\n                           * distributed under the License is distributed on an \"AS IS\" BASIS,\n                           * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n                           * See the License for the specific language governing permissions and\n                           * limitations under the License.\n                           *\n                           * SPDX-License-Identifier: Apache-2.0\n                           * ============LICENSE_END=========================================================\n                           */\n\n                          executor.logger.info(executor.subject.id);\n\n                          var pmSubscriptionInfo = executor.getContextAlbum(\"PMSubscriptionAlbum\").get(executor.inFields.get(\"albumID\").toString())\n\n                          var changeType = pmSubscriptionInfo.get(\"changeType\").toLowerCase()\n                          var blueprintName = pmSubscriptionInfo.get(\"blueprintName\").toLowerCase()\n                          var blueprintVersion = pmSubscriptionInfo.get(\"blueprintVersion\").toLowerCase()\n                          var payload = executor.inFields.get(\"payload\")\n                          var actionName = changeType + \"-subscription\"\n\n                          var commonHeader = executor.subject.getOutFieldSchemaHelper(\"commonHeader\").createNewInstance();\n                          commonHeader.put(\"originatorId\", \"sdnc\");\n                          commonHeader.put(\"requestId\", executor.inFields.get(\"albumID\").toString());\n                          commonHeader.put(\"subRequestId\", \"sub-123456-1000\");\n\n                          var actionIdentifiers = executor.subject.getOutFieldSchemaHelper(\"actionIdentifiers\").createNewInstance();\n                          actionIdentifiers.put(\"actionName\", actionName);\n                          actionIdentifiers.put(\"blueprintName\", blueprintName);\n                          actionIdentifiers.put(\"blueprintVersion\", blueprintVersion);\n                          actionIdentifiers.put(\"mode\", \"sync\");\n\n                          executor.outFields.put(\"commonHeader\", commonHeader);\n                          executor.outFields.put(\"actionIdentifiers\", actionIdentifiers);\n                          executor.outFields.put(\"payload\", payload);\n\n                          //var returnValue = executor.isTrue;\n                          true;\n                  - key:\n                      name: ReceiveSubscriptionTask\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: ReceiveSubscriptionTask\n                        version: 0.0.1\n                      inputFields:\n                        entry:\n                        - key: blueprintName\n                          value:\n                            key: blueprintName\n                            fieldSchemaKey:\n                              name: SimpleStringType\n                              version: 0.0.1\n                            optional: false\n                        - key: blueprintVersion\n                          value:\n                            key: blueprintVersion\n                            fieldSchemaKey:\n                              name: SimpleStringType\n                              version: 0.0.1\n                            optional: false\n                        - key: changeType\n                          value:\n                            key: changeType\n                            fieldSchemaKey:\n                              name: SimpleStringType\n                              version: 0.0.1\n                            optional: false\n                        - key: closedLoopControlName\n                          value:\n                            key: closedLoopControlName\n                            fieldSchemaKey:\n                              name: SimpleStringType\n                              version: 0.0.1\n                            optional: false\n                        - key: nfName\n                          value:\n                            key: nfName\n                            fieldSchemaKey:\n                              name: SimpleStringType\n                              version: 0.0.1\n                            optional: false\n                        - key: policyName\n                          value:\n                            key: policyName\n                            fieldSchemaKey:\n                              name: SimpleStringType\n                              version: 0.0.1\n                            optional: false\n                        - key: subscription\n                          value:\n                            key: subscription\n                            fieldSchemaKey:\n                              name: SubscriptionType\n                              version: 0.0.1\n                            optional: false\n                      outputFields:\n                        entry:\n                        - key: albumID\n                          value:\n                            key: albumID\n                            fieldSchemaKey:\n                              name: UUIDType\n                              version: 0.0.1\n                            optional: false\n                      taskParameters:\n                        entry: []\n                      contextAlbumReference:\n                      - name: PMSubscriptionAlbum\n                        version: 0.0.1\n                      taskLogic:\n                        key: TaskLogic\n                        logicFlavour: JAVASCRIPT\n                        logic: |-\n                          /*\n                           * ============LICENSE_START=======================================================\n                           *  Copyright (C) 2020 Nordix. All rights reserved.\n                           * ================================================================================\n                           * Licensed under the Apache License, Version 2.0 (the \"License\");\n                           * you may not use this file except in compliance with the License.\n                           * You may obtain a copy of the License at\n                           *\n                           *      http://www.apache.org/licenses/LICENSE-2.0\n                           *\n                           * Unless required by applicable law or agreed to in writing, software\n                           * distributed under the License is distributed on an \"AS IS\" BASIS,\n                           * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n                           * See the License for the specific language governing permissions and\n                           * limitations under the License.\n                           *\n                           * SPDX-License-Identifier: Apache-2.0\n                           * ============LICENSE_END=========================================================\n                           */\n                          var uuidType = java.util.UUID;\n\n                          executor.logger.info(executor.subject.id);\n\n                          //albumID will be used to fetch info from our album later\n                          var albumID = uuidType.randomUUID();\n                          var pmSubscriptionInfo = executor.getContextAlbum(\"PMSubscriptionAlbum\").getSchemaHelper().createNewInstance();\n                          var returnValue = true;\n\n                          if(executor.inFields.get(\"policyName\") != null) {\n                              executor.logger.info(\"nfName in receive sub event \" + executor.inFields.get(\"nfName\"));\n\n                              var changeType = executor.inFields.get(\"changeType\")\n                              var nfName = executor.inFields.get(\"nfName\")\n                              var policyName = executor.inFields.get(\"policyName\")\n                              var closedLoopControlName = executor.inFields.get(\"closedLoopControlName\")\n                              var subscription = executor.inFields.get(\"subscription\")\n                              var blueprintName = executor.inFields.get(\"blueprintName\")\n                              var blueprintVersion = executor.inFields.get(\"blueprintVersion\")\n\n                              pmSubscriptionInfo.put(\"nfName\", executor.inFields.get(\"nfName\"));\n                              pmSubscriptionInfo.put(\"changeType\", executor.inFields.get(\"changeType\"))\n                              pmSubscriptionInfo.put(\"policyName\", executor.inFields.get(\"policyName\"))\n                              pmSubscriptionInfo.put(\"closedLoopControlName\", executor.inFields.get(\"closedLoopControlName\"))\n                              pmSubscriptionInfo.put(\"subscription\", subscription)\n                              pmSubscriptionInfo.put(\"blueprintName\", blueprintName)\n                              pmSubscriptionInfo.put(\"blueprintVersion\", blueprintVersion)\n\n\n                              executor.getContextAlbum(\"PMSubscriptionAlbum\").put(albumID.toString(), pmSubscriptionInfo);\n\n                              executor.outFields.put(\"albumID\", albumID)\n                          } else {\n                              executor.message = \"Received invalid event\"\n                              returnValue = false;\n                          }\n\n                          returnValue;\n              events:\n                key:\n                  name: PMControlPolicy_Events\n                  version: 0.0.1\n                eventMap:\n                  entry:\n                  - key:\n                      name: CDSCreateResponseEvent\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: CDSCreateResponseEvent\n                        version: 0.0.1\n                      nameSpace: org.onap.policy.apex.onap.pmcontrol\n                      source: CDS\n                      target: APEX\n                      parameter:\n                        entry:\n                        - key: actionIdentifiers\n                          value:\n                            key: actionIdentifiers\n                            fieldSchemaKey:\n                              name: CDSActionIdentifiersType\n                              version: 0.0.1\n                            optional: false\n                        - key: commonHeader\n                          value:\n                            key: commonHeader\n                            fieldSchemaKey:\n                              name: CDSResponseCommonHeaderType\n                              version: 0.0.1\n                            optional: false\n                        - key: payload\n                          value:\n                            key: payload\n                            fieldSchemaKey:\n                              name: CDSCreateResponsePayloadType\n                              version: 0.0.1\n                            optional: false\n                        - key: status\n                          value:\n                            key: status\n                            fieldSchemaKey:\n                              name: CDSResponseStatusType\n                              version: 0.0.1\n                            optional: false\n                  - key:\n                      name: CDSCreateSubscriptionRequestEvent\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: CDSCreateSubscriptionRequestEvent\n                        version: 0.0.1\n                      nameSpace: org.onap.policy.apex.onap.pmcontrol\n                      source: APEX\n                      target: APEX\n                      parameter:\n                        entry:\n                        - key: actionIdentifiers\n                          value:\n                            key: actionIdentifiers\n                            fieldSchemaKey:\n                              name: CDSActionIdentifiersType\n                              version: 0.0.1\n                            optional: false\n                        - key: commonHeader\n                          value:\n                            key: commonHeader\n                            fieldSchemaKey:\n                              name: CDSRequestCommonHeaderType\n                              version: 0.0.1\n                            optional: false\n                        - key: payload\n                          value:\n                            key: payload\n                            fieldSchemaKey:\n                              name: CDSCreateSubscriptionPayloadType\n                              version: 0.0.1\n                            optional: false\n                  - key:\n                      name: CDSDeleteResponseEvent\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: CDSDeleteResponseEvent\n                        version: 0.0.1\n                      nameSpace: org.onap.policy.apex.onap.pmcontrol\n                      source: CDS\n                      target: APEX\n                      parameter:\n                        entry:\n                        - key: actionIdentifiers\n                          value:\n                            key: actionIdentifiers\n                            fieldSchemaKey:\n                              name: CDSActionIdentifiersType\n                              version: 0.0.1\n                            optional: false\n                        - key: commonHeader\n                          value:\n                            key: commonHeader\n                            fieldSchemaKey:\n                              name: CDSResponseCommonHeaderType\n                              version: 0.0.1\n                            optional: false\n                        - key: payload\n                          value:\n                            key: payload\n                            fieldSchemaKey:\n                              name: CDSDeleteResponsePayloadType\n                              version: 0.0.1\n                            optional: false\n                        - key: status\n                          value:\n                            key: status\n                            fieldSchemaKey:\n                              name: CDSResponseStatusType\n                              version: 0.0.1\n                            optional: false\n                  - key:\n                      name: CDSDeleteSubscriptionRequestEvent\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: CDSDeleteSubscriptionRequestEvent\n                        version: 0.0.1\n                      nameSpace: org.onap.policy.apex.onap.pmcontrol\n                      source: APEX\n                      target: APEX\n                      parameter:\n                        entry:\n                        - key: actionIdentifiers\n                          value:\n                            key: actionIdentifiers\n                            fieldSchemaKey:\n                              name: CDSActionIdentifiersType\n                              version: 0.0.1\n                            optional: false\n                        - key: commonHeader\n                          value:\n                            key: commonHeader\n                            fieldSchemaKey:\n                              name: CDSRequestCommonHeaderType\n                              version: 0.0.1\n                            optional: false\n                        - key: payload\n                          value:\n                            key: payload\n                            fieldSchemaKey:\n                              name: CDSDeleteSubscriptionPayloadType\n                              version: 0.0.1\n                            optional: false\n                  - key:\n                      name: CDSResponseStatusEvent\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: CDSResponseStatusEvent\n                        version: 0.0.1\n                      nameSpace: org.onap.policy.apex.onap.pmcontrol\n                      source: APEX\n                      target: DCAE\n                      parameter:\n                        entry:\n                        - key: status\n                          value:\n                            key: status\n                            fieldSchemaKey:\n                              name: SubscriptionStatusType\n                              version: 0.0.1\n                            optional: false\n                  - key:\n                      name: CreateSubscriptionPayloadEvent\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: CreateSubscriptionPayloadEvent\n                        version: 0.0.1\n                      nameSpace: org.onap.policy.apex.onap.pmcontrol\n                      source: APEX\n                      target: APEX\n                      parameter:\n                        entry:\n                        - key: albumID\n                          value:\n                            key: albumID\n                            fieldSchemaKey:\n                              name: UUIDType\n                              version: 0.0.1\n                            optional: false\n                        - key: payload\n                          value:\n                            key: payload\n                            fieldSchemaKey:\n                              name: CDSCreateSubscriptionPayloadType\n                              version: 0.0.1\n                            optional: false\n                  - key:\n                      name: DeleteSubscriptionPayloadEvent\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: DeleteSubscriptionPayloadEvent\n                        version: 0.0.1\n                      nameSpace: org.onap.policy.apex.onap.pmcontrol\n                      source: APEX\n                      target: APEX\n                      parameter:\n                        entry:\n                        - key: albumID\n                          value:\n                            key: albumID\n                            fieldSchemaKey:\n                              name: UUIDType\n                              version: 0.0.1\n                            optional: false\n                        - key: payload\n                          value:\n                            key: payload\n                            fieldSchemaKey:\n                              name: CDSDeleteSubscriptionPayloadType\n                              version: 0.0.1\n                            optional: false\n                  - key:\n                      name: MRResponseEvent\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: MRResponseEvent\n                        version: 0.0.1\n                      nameSpace: org.onap.policy.apex.onap.pmcontrol\n                      source: DCAE\n                      target: APEX\n                      parameter:\n                        entry:\n                        - key: count\n                          value:\n                            key: count\n                            fieldSchemaKey:\n                              name: SimpleIntType\n                              version: 0.0.1\n                            optional: false\n                        - key: serverTimeMs\n                          value:\n                            key: serverTimeMs\n                            fieldSchemaKey:\n                              name: SimpleIntType\n                              version: 0.0.1\n                            optional: false\n                  - key:\n                      name: PMSubscriptionOutputEvent\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: PMSubscriptionOutputEvent\n                        version: 0.0.1\n                      nameSpace: org.onap.policy.apex.onap.pmcontrol\n                      source: APEX\n                      target: APEX\n                      parameter:\n                        entry:\n                        - key: albumID\n                          value:\n                            key: albumID\n                            fieldSchemaKey:\n                              name: UUIDType\n                              version: 0.0.1\n                            optional: false\n                  - key:\n                      name: pmsh-operational-policy\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: pmsh-operational-policy\n                        version: 0.0.1\n                      nameSpace: org.onap.policy.apex.onap.pmcontrol\n                      source: DCAE\n                      target: APEX\n                      parameter:\n                        entry:\n                        - key: blueprintName\n                          value:\n                            key: blueprintName\n                            fieldSchemaKey:\n                              name: SimpleStringType\n                              version: 0.0.1\n                            optional: false\n                        - key: blueprintVersion\n                          value:\n                            key: blueprintVersion\n                            fieldSchemaKey:\n                              name: SimpleStringType\n                              version: 0.0.1\n                            optional: false\n                        - key: changeType\n                          value:\n                            key: changeType\n                            fieldSchemaKey:\n                              name: SimpleStringType\n                              version: 0.0.1\n                            optional: false\n                        - key: closedLoopControlName\n                          value:\n                            key: closedLoopControlName\n                            fieldSchemaKey:\n                              name: SimpleStringType\n                              version: 0.0.1\n                            optional: false\n                        - key: nfName\n                          value:\n                            key: nfName\n                            fieldSchemaKey:\n                              name: SimpleStringType\n                              version: 0.0.1\n                            optional: false\n                        - key: policyName\n                          value:\n                            key: policyName\n                            fieldSchemaKey:\n                              name: SimpleStringType\n                              version: 0.0.1\n                            optional: false\n                        - key: subscription\n                          value:\n                            key: subscription\n                            fieldSchemaKey:\n                              name: SubscriptionType\n                              version: 0.0.1\n                            optional: false\n              albums:\n                key:\n                  name: PMControlPolicy_Albums\n                  version: 0.0.1\n                albums:\n                  entry:\n                  - key:\n                      name: PMSubscriptionAlbum\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: PMSubscriptionAlbum\n                        version: 0.0.1\n                      scope: policy\n                      isWritable: true\n                      itemSchema:\n                        name: PMSubscriptionType\n                        version: 0.0.1\n              schemas:\n                key:\n                  name: PMControlPolicy_Schemas\n                  version: 0.0.1\n                schemas:\n                  entry:\n                  - key:\n                      name: CDSActionIdentifiersType\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: CDSActionIdentifiersType\n                        version: 0.0.1\n                      schemaFlavour: Avro\n                      schemaDefinition: |-\n                        {\n                            \"type\": \"record\",\n                            \"name\": \"ActionIdentifiers_Type\",\n                            \"namespace\": \"org.onap.policy.apex.onap.helloworld\",\n                            \"fields\": [\n                                {\n                                    \"name\": \"actionName\",\n                                    \"type\": \"string\"\n                                },\n                                {\n                                    \"name\": \"blueprintName\",\n                                    \"type\": \"string\"\n                                },\n                                {\n                                    \"name\": \"blueprintVersion\",\n                                    \"type\": \"string\"\n                                },\n                                {\n                                    \"name\": \"mode\",\n                                    \"type\": \"string\"\n                                }\n                            ]\n                        }\n                  - key:\n                      name: CDSCreateResponsePayloadType\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: CDSCreateResponsePayloadType\n                        version: 0.0.1\n                      schemaFlavour: Avro\n                      schemaDefinition: |-\n                        {\n                          \"name\": \"CreateResponsePayloadEntry\",\n                          \"type\": \"record\",\n                          \"namespace\": \"org.onap.policy.apex.onap.helloworld\",\n                          \"fields\": [\n                            {\n                              \"name\": \"create_DasH_subscription_DasH_response\",\n                              \"type\": {\n                                \"name\": \"create_DasH_subscription_DasH_response\",\n                                \"type\": \"record\",\n                                \"fields\": [\n                                  {\n                                    \"name\": \"odl_DasH_response\",\n                                    \"type\": {\n                                      \"name\": \"odl_DasH_response\",\n                                      \"type\": \"record\",\n                                      \"fields\": [\n                                          {\n                                            \"name\": \"status\",\n                                            \"type\": \"string\"\n                                          }\n                                      ]\n                                    }\n                                  }\n                                ]\n                              }\n                            }\n                          ]\n                        }\n                  - key:\n                      name: CDSCreateSubscriptionPayloadType\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: CDSCreateSubscriptionPayloadType\n                        version: 0.0.1\n                      schemaFlavour: Avro\n                      schemaDefinition: |-\n                        {\n                          \"type\": \"map\",\n                          \"values\": {\n                            \"type\": \"record\",\n                            \"name\": \"CDSRequestPayloadEntry\",\n                            \"fields\": [\n                              {\n                                \"name\": \"create_DasH_subscription_DasH_properties\",\n                                \"type\": {\n                                  \"name\": \"create_DasH_subscription_DasH_properties_record\",\n                                  \"type\": \"record\",\n                                  \"fields\": [\n                                    {\n                                      \"name\": \"nfName\",\n                                      \"type\": \"string\"\n                                    },\n                                    {\n                                      \"name\": \"subscriptionName\",\n                                      \"type\": \"string\"\n                                    },\n                                    {\n                                      \"name\": \"administrativeState\",\n                                      \"type\": \"string\"\n                                    },\n                                    {\n                                      \"name\": \"fileBasedGP\",\n                                      \"type\": \"string\"\n                                    },\n                                    {\n                                      \"name\": \"fileLocation\",\n                                      \"type\": \"string\"\n                                    },\n                                    {\n                                      \"name\": \"measurementGroups\",\n                                      \"type\": {\n                                        \"type\": \"array\",\n                                        \"items\": {\n                                          \"name\": \"measurementGroups_record\",\n                                          \"type\": \"record\",\n                                          \"fields\": [\n                                            {\n                                              \"name\": \"measurementGroup\",\n                                              \"type\": {\n                                                \"name\": \"measurementGroup\",\n                                                \"type\": \"record\",\n                                                \"fields\": [\n                                                  {\n                                                    \"name\": \"measurementTypes\",\n                                                    \"type\": {\n                                                      \"type\": \"array\",\n                                                      \"items\": {\n                                                        \"name\": \"measurementTypes_record\",\n                                                        \"type\": \"record\",\n                                                        \"fields\": [\n                                                          {\n                                                            \"name\": \"measurementType\",\n                                                            \"type\": \"string\"\n                                                          }\n                                                        ]\n                                                      }\n                                                    }\n                                                  },\n                                                  {\n                                                    \"name\": \"managedObjectDNsBasic\",\n                                                    \"type\": {\n                                                      \"type\": \"array\",\n                                                      \"items\": {\n                                                        \"name\": \"managedObjectDNsBasic_record\",\n                                                        \"type\": \"record\",\n                                                        \"fields\": [\n                                                          {\n                                                            \"name\": \"DN\",\n                                                            \"type\": \"string\"\n                                                          }\n                                                        ]\n                                                      }\n                                                    }\n                                                  }\n                                                ]\n                                              }\n                                            }\n                                          ]\n                                        }\n                                      }\n                                    }\n                                  ]\n                                }\n                              }\n                            ]\n                          }\n                        }\n                  - key:\n                      name: CDSDeleteResponsePayloadType\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: CDSDeleteResponsePayloadType\n                        version: 0.0.1\n                      schemaFlavour: Avro\n                      schemaDefinition: |-\n                        {\n                          \"name\": \"DeleteResponsePayloadEntry\",\n                          \"type\": \"record\",\n                          \"namespace\": \"com.acme.avro\",\n                          \"fields\": [\n                            {\n                              \"name\": \"delete_DasH_subscription_DasH_response\",\n                              \"type\": {\n                                \"name\": \"delete_DasH_subscription_DasH_response\",\n                                \"type\": \"record\",\n                                \"fields\": [\n                                  {\n                                    \"name\": \"odl_DasH_response\",\n                                    \"type\": {\n                                      \"name\": \"odl_DasH_response\",\n                                      \"type\": \"record\",\n                                      \"fields\": [\n                                          {\n                                            \"name\": \"status\",\n                                            \"type\": \"string\"\n                                          }\n                                      ]\n                                    }\n                                  }\n                                ]\n                              }\n                            }\n                          ]\n                        }\n                  - key:\n                      name: CDSDeleteSubscriptionPayloadType\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: CDSDeleteSubscriptionPayloadType\n                        version: 0.0.1\n                      schemaFlavour: Avro\n                      schemaDefinition: |-\n                        {\n                          \"type\": \"map\",\n                          \"values\": {\n                            \"type\": \"record\",\n                            \"name\": \"CDSRequestPayloadEntry\",\n                            \"fields\": [\n                              {\n                                \"name\": \"delete_DasH_subscription_DasH_properties\",\n                                \"type\": {\n                                  \"name\": \"delete_DasH_subscription_DasH_properties_record\",\n                                  \"type\": \"record\",\n                                  \"fields\": [\n                                    {\n                                      \"name\": \"nfName\",\n                                      \"type\": \"string\"\n                                    },\n                                    {\n                                      \"name\": \"subscriptionName\",\n                                      \"type\": \"string\"\n                                    },\n                                    {\n                                      \"name\": \"administrativeState\",\n                                      \"type\": \"string\"\n                                    },\n                                    {\n                                      \"name\": \"fileBasedGP\",\n                                      \"type\": \"string\"\n                                    },\n                                    {\n                                      \"name\": \"fileLocation\",\n                                      \"type\": \"string\"\n                                    },\n                                    {\n                                      \"name\": \"measurementGroups\",\n                                      \"type\": {\n                                        \"type\": \"array\",\n                                        \"items\": {\n                                          \"name\": \"measurementGroups_record\",\n                                          \"type\": \"record\",\n                                          \"fields\": [\n                                            {\n                                              \"name\": \"measurementGroup\",\n                                              \"type\": {\n                                                \"name\": \"measurementGroup\",\n                                                \"type\": \"record\",\n                                                \"fields\": [\n                                                  {\n                                                    \"name\": \"measurementTypes\",\n                                                    \"type\": {\n                                                      \"type\": \"array\",\n                                                      \"items\": {\n                                                        \"name\": \"measurementTypes_record\",\n                                                        \"type\": \"record\",\n                                                        \"fields\": [\n                                                          {\n                                                            \"name\": \"measurementType\",\n                                                            \"type\": \"string\"\n                                                          }\n                                                        ]\n                                                      }\n                                                    }\n                                                  },\n                                                  {\n                                                    \"name\": \"managedObjectDNsBasic\",\n                                                    \"type\": {\n                                                      \"type\": \"array\",\n                                                      \"items\": {\n                                                        \"name\": \"managedObjectDNsBasic_record\",\n                                                        \"type\": \"record\",\n                                                        \"fields\": [\n                                                          {\n                                                            \"name\": \"DN\",\n                                                            \"type\": \"string\"\n                                                          }\n                                                        ]\n                                                      }\n                                                    }\n                                                  }\n                                                ]\n                                              }\n                                            }\n                                          ]\n                                        }\n                                      }\n                                    }\n                                  ]\n                                }\n                              }\n                            ]\n                          }\n                        }\n                  - key:\n                      name: CDSRequestCommonHeaderType\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: CDSRequestCommonHeaderType\n                        version: 0.0.1\n                      schemaFlavour: Avro\n                      schemaDefinition: |-\n                        {\n                            \"type\": \"record\",\n                            \"name\": \"RequestCommonHeader_Type\",\n                            \"namespace\": \"org.onap.policy.apex.onap.helloworld\",\n                            \"fields\": [\n                                {\n                                    \"name\": \"originatorId\",\n                                    \"type\": \"string\"\n                                },\n                                {\n                                    \"name\": \"requestId\",\n                                    \"type\": \"string\"\n                                },\n                                {\n                                    \"name\": \"subRequestId\",\n                                    \"type\": \"string\"\n                                }\n                            ]\n                        }\n                  - key:\n                      name: CDSResponseCommonHeaderType\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: CDSResponseCommonHeaderType\n                        version: 0.0.1\n                      schemaFlavour: Avro\n                      schemaDefinition: |-\n                        {\n                            \"type\": \"record\",\n                            \"name\": \"ResponseCommonHeader_Type\",\n                            \"namespace\": \"org.onap.policy.apex.onap.helloworld\",\n                            \"fields\": [\n                                {\n                                    \"name\": \"originatorId\",\n                                    \"type\": \"string\"\n                                },\n                                {\n                                    \"name\": \"requestId\",\n                                    \"type\": \"string\"\n                                },\n                                {\n                                    \"name\": \"subRequestId\",\n                                    \"type\": \"string\"\n                                },\n                                {\n                                    \"name\": \"timestamp\",\n                                    \"type\": \"string\"\n                                },\n                                {\n                                    \"name\": \"flags\",\n                                    \"type\": [\"null\", \"string\"]\n                                }\n                            ]\n                        }\n                  - key:\n                      name: CDSResponseStatusType\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: CDSResponseStatusType\n                        version: 0.0.1\n                      schemaFlavour: Avro\n                      schemaDefinition: |-\n                        {\n                            \"type\": \"record\",\n                            \"name\": \"ResponseStatus_Type\",\n                            \"namespace\": \"org.onap.policy.apex.onap.helloworld\",\n                            \"fields\": [\n                                {\n                                    \"name\": \"code\",\n                                    \"type\": \"int\"\n                                },\n                                {\n                                    \"name\": \"eventType\",\n                                    \"type\": \"string\"\n                                },\n                                {\n                                    \"name\": \"timestamp\",\n                                    \"type\": \"string\"\n                                },\n                                {\n                                    \"name\": \"message\",\n                                    \"type\": \"string\"\n                                }\n                            ]\n                        }\n                  - key:\n                      name: PMSubscriptionType\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: PMSubscriptionType\n                        version: 0.0.1\n                      schemaFlavour: Avro\n                      schemaDefinition: \"{\\n\\t\\\"name\\\": \\\"PMSubscription\\\",\\n\\t\\\"type\\\": \\\"record\\\",\\n\\t\\\"namespace\\\": \\\"\\\n                        org.onap.policy.apex.onap.pmcontrol\\\",\\n\\t\\\"fields\\\": [\\n        {\\n            \\\"name\\\": \\\"nfName\\\"\\\n                        ,\\n            \\\"type\\\": \\\"string\\\"\\n        },\\n\\t    {\\n\\t\\t\\t\\\"name\\\": \\\"changeType\\\",\\n\\t\\t\\t\\\"\\\n                        type\\\": \\\"string\\\"\\n\\t\\t},\\n\\t\\t{\\n\\t\\t\\t\\\"name\\\": \\\"closedLoopControlName\\\",\\n\\t\\t\\t\\\"type\\\": \\\"\\\n                        string\\\"\\n\\t\\t},\\n\\t\\t{\\n\\t\\t\\t\\\"name\\\": \\\"policyName\\\",\\n\\t\\t\\t\\\"type\\\": \\\"string\\\"\\n\\t\\t},\\n\\t\\t\\\n                        {\\n\\t\\t    \\\"name\\\": \\\"blueprintName\\\",\\n\\t\\t    \\\"type\\\": \\\"string\\\"\\n\\t\\t},\\n\\t\\t{\\n\\t\\t    \\\"name\\\"\\\n                        : \\\"blueprintVersion\\\",\\n\\t\\t    \\\"type\\\": \\\"string\\\"\\n\\t\\t},\\n\\t\\t{\\n\\t\\t\\t\\\"name\\\": \\\"subscription\\\"\\\n                        ,\\n\\t\\t\\t\\\"type\\\": {\\n\\t\\t\\t\\t\\\"name\\\": \\\"subscription\\\",\\n\\t\\t\\t\\t\\\"type\\\": \\\"record\\\",\\n\\t\\t\\t\\t\\\n                        \\\"fields\\\": [{\\n\\t\\t\\t\\t\\t\\t\\\"name\\\": \\\"subscriptionName\\\",\\n\\t\\t\\t\\t\\t\\t\\\"type\\\": \\\"string\\\"\\n\\t\\t\\\n                        \\t\\t\\t},\\n\\t\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\t\\t\\\"name\\\": \\\"administrativeState\\\",\\n\\t\\t\\t\\t\\t\\t\\\"type\\\": \\\"string\\\"\\\n                        \\n\\t\\t\\t\\t\\t},\\n\\t\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\t\\t\\\"name\\\": \\\"fileBasedGP\\\",\\n\\t\\t\\t\\t\\t\\t\\\"type\\\": \\\"int\\\"\\\n                        \\n\\t\\t\\t\\t\\t},\\n\\t\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\t\\t\\\"name\\\": \\\"fileLocation\\\",\\n\\t\\t\\t\\t\\t\\t\\\"type\\\": \\\"string\\\"\\\n                        \\n\\t\\t\\t\\t\\t},\\n\\t\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\t\\t\\\"name\\\": \\\"measurementGroups\\\",\\n\\t\\t\\t\\t\\t\\t\\\"type\\\": {\\n\\\n                        \\t\\t\\t\\t\\t\\t\\t\\\"type\\\": \\\"array\\\",\\n\\t\\t\\t\\t\\t\\t\\t\\\"items\\\": {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\\"name\\\": \\\"Measurement_Groups_Type\\\"\\\n                        ,\\n\\t\\t\\t\\t\\t\\t\\t\\t\\\"type\\\": \\\"record\\\",\\n\\t\\t\\t\\t\\t\\t\\t\\t\\\"fields\\\": [{\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\\"name\\\"\\\n                        : \\\"measurementGroup\\\",\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\\"type\\\": {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\\"name\\\": \\\"Measurement_Group_Type\\\"\\\n                        ,\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\\"type\\\": \\\"record\\\",\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\\"fields\\\": [{\\n\\t\\t\\t\\t\\t\\t\\t\\t\\\n                        \\t\\t\\t\\t\\\"name\\\": \\\"measurementTypes\\\",\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\\"type\\\": {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\\n                        \\t\\t\\t\\\"type\\\": \\\"array\\\",\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\\"items\\\": {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\\"\\\n                        name\\\": \\\"Measurement_Types_Type\\\",\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\\"type\\\": \\\"record\\\",\\n\\t\\t\\t\\t\\t\\\n                        \\t\\t\\t\\t\\t\\t\\t\\t\\t\\\"fields\\\": [{\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\\"name\\\": \\\"measurementType\\\",\\n\\t\\\n                        \\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\\"type\\\": \\\"string\\\"\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t}]\\n\\t\\t\\t\\t\\t\\t\\t\\t\\\n                        \\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t},\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\\n                        \\t\\t\\t\\t\\t\\t\\t\\t\\\"name\\\": \\\"managedObjectDNsBasic\\\",\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\\"type\\\": {\\n\\t\\t\\t\\t\\\n                        \\t\\t\\t\\t\\t\\t\\t\\t\\t\\\"type\\\": \\\"array\\\",\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\\"items\\\": {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\\n                        \\t\\t\\t\\t\\t\\\"name\\\": \\\"Managed_Object_Dns_Basic_Type\\\",\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\\"type\\\": \\\"record\\\"\\\n                        ,\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\\"fields\\\": [{\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\\"name\\\": \\\"DN\\\",\\n\\t\\\n                        \\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\\"type\\\": \\\"string\\\"\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t}]\\n\\t\\t\\t\\t\\t\\t\\t\\t\\\n                        \\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t]\\n\\t\\t\\t\\t\\t\\\n                        \\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\t\\t}]\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t]\\n\\t\\t\\t}\\n\\t\\\n                        \\t}\\n\\t]\\n}\"\n                  - key:\n                      name: SimpleIntType\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: SimpleIntType\n                        version: 0.0.1\n                      schemaFlavour: Java\n                      schemaDefinition: java.lang.Integer\n                  - key:\n                      name: SimpleStringType\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: SimpleStringType\n                        version: 0.0.1\n                      schemaFlavour: Java\n                      schemaDefinition: java.lang.String\n                  - key:\n                      name: SubscriptionStatusType\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: SubscriptionStatusType\n                        version: 0.0.1\n                      schemaFlavour: Avro\n                      schemaDefinition: |-\n                        {\n                            \"type\": \"record\",\n                            \"name\": \"ActivateSubscriptionStatus_Type\",\n                            \"namespace\": \"org.onap.policy.apex.onap.helloworld\",\n                            \"fields\": [\n                                {\n                                    \"name\": \"subscriptionName\",\n                                    \"type\": \"string\"\n                                },\n                                {\n                                    \"name\": \"nfName\",\n                                    \"type\": \"string\"\n                                },\n                                {\n                                    \"name\": \"changeType\",\n                                    \"type\": \"string\"\n                                },\n                                {\n                                    \"name\": \"message\",\n                                    \"type\": \"string\"\n                                }\n                            ]\n                        }\n                  - key:\n                      name: SubscriptionType\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: SubscriptionType\n                        version: 0.0.1\n                      schemaFlavour: Avro\n                      schemaDefinition: \"{\\n\\t\\\"name\\\": \\\"subscription\\\",\\n\\t\\\"type\\\": \\\"record\\\",\\n\\t\\\"fields\\\": [{\\n\\t\\t\\\n                        \\t\\\"name\\\": \\\"subscriptionName\\\",\\n\\t\\t\\t\\\"type\\\": \\\"string\\\"\\n\\t\\t},\\n\\t\\t{\\n\\t\\t\\t\\\"name\\\": \\\"administrativeState\\\"\\\n                        ,\\n\\t\\t\\t\\\"type\\\": \\\"string\\\"\\n\\t\\t},\\n\\t\\t{\\n\\t\\t\\t\\\"name\\\": \\\"fileBasedGP\\\",\\n\\t\\t\\t\\\"type\\\": \\\"\\\n                        int\\\"\\n\\t\\t},\\n\\t\\t{\\n\\t\\t\\t\\\"name\\\": \\\"fileLocation\\\",\\n\\t\\t\\t\\\"type\\\": \\\"string\\\"\\n\\t\\t},\\n\\t\\t\\\n                        {\\n\\t\\t\\t\\\"name\\\": \\\"measurementGroups\\\",\\n\\t\\t\\t\\\"type\\\": {\\n\\t\\t\\t\\t\\\"type\\\": \\\"array\\\",\\n\\t\\t\\t\\\n                        \\t\\\"items\\\": {\\n\\t\\t\\t\\t\\t\\\"name\\\": \\\"Measurement_Groups_Type\\\",\\n\\t\\t\\t\\t\\t\\\"type\\\": \\\"record\\\",\\n\\\n                        \\t\\t\\t\\t\\t\\\"fields\\\": [{\\n\\t\\t\\t\\t\\t\\t\\\"name\\\": \\\"measurementGroup\\\",\\n\\t\\t\\t\\t\\t\\t\\\"type\\\": {\\n\\t\\\n                        \\t\\t\\t\\t\\t\\t\\\"name\\\": \\\"Measurement_Group_Type\\\",\\n\\t\\t\\t\\t\\t\\t\\t\\\"type\\\": \\\"record\\\",\\n\\t\\t\\t\\t\\t\\\n                        \\t\\t\\\"fields\\\": [{\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\\"name\\\": \\\"measurementTypes\\\",\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\\"type\\\"\\\n                        : {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\\"type\\\": \\\"array\\\",\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\\"items\\\": {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\\n                        \\t\\t\\\"name\\\": \\\"Measurement_Types_Type\\\",\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\\"type\\\": \\\"record\\\",\\n\\t\\t\\t\\t\\t\\\n                        \\t\\t\\t\\t\\t\\t\\\"fields\\\": [{\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\\"name\\\": \\\"measurementType\\\",\\n\\t\\t\\t\\t\\t\\t\\t\\\n                        \\t\\t\\t\\t\\t\\\"type\\\": \\\"string\\\"\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t}]\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\\n                        }\\n\\t\\t\\t\\t\\t\\t\\t\\t},\\n\\t\\t\\t\\t\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\\"name\\\": \\\"managedObjectDNsBasic\\\",\\n\\\n                        \\t\\t\\t\\t\\t\\t\\t\\t\\t\\\"type\\\": {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\\"type\\\": \\\"array\\\",\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\\"items\\\"\\\n                        : {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\\"name\\\": \\\"Managed_Object_Dns_Basic_Type\\\",\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\\"\\\n                        type\\\": \\\"record\\\",\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\\"fields\\\": [{\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\\"name\\\": \\\"DN\\\"\\\n                        ,\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\\"type\\\": \\\"string\\\"\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t}]\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\\n                        \\t\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\t]\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}]\\n\\t\\t\\t\\t}\\n\\t\\\n                        \\t\\t}\\n\\t\\t}\\n\\t]\\n}\"\n                  - key:\n                      name: UUIDType\n                      version: 0.0.1\n                    value:\n                      key:\n                        name: UUIDType\n                        version: 0.0.1\n                      schemaFlavour: Java\n                      schemaDefinition: java.util.UUID\n          engineParameters:\n            executorParameters:\n              JAVASCRIPT:\n                parameterClassName: org.onap.policy.apex.plugins.executor.javascript.JavascriptExecutorParameters\n            contextParameters:\n              parameterClassName: org.onap.policy.apex.context.parameters.ContextParameters\n              schemaParameters:\n                Avro:\n                  parameterClassName: org.onap.policy.apex.plugins.context.schema.avro.AvroSchemaHelperParameters\n                Java:\n                  parameterClassName: org.onap.policy.apex.context.impl.schema.java.JavaSchemaHelperParameters\n                  jsonAdapters:\n                    Instant:\n                      adaptedClass: java.time.Instant\n                      adaptorClass: org.onap.policy.controlloop.util.Serialization$GsonInstantAdapter\n        eventInputParameters:\n          DCAEConsumer:\n            carrierTechnologyParameters:\n              carrierTechnology: RESTCLIENT\n              parameterClassName: org.onap.policy.apex.plugins.event.carrier.restclient.RestClientCarrierTechnologyParameters\n              parameters:\n                consumerPollTime: '50'\n                url: https://message-router:3905/events/unauthenticated.DCAE_CL_OUTPUT/cg1/sg1\n            eventProtocolParameters:\n              eventProtocol: JSON\n              parameters:\n                nameAlias: policyName\n            eventName: pmsh-operational-policy\n            eventNameFilter: pmsh-operational-policy\n          CDSRequestConsumer:\n            carrierTechnologyParameters:\n              carrierTechnology: RESTREQUESTOR\n              parameterClassName: org.onap.policy.apex.plugins.event.carrier.restrequestor.RestRequestorCarrierTechnologyParameters\n              parameters:\n                url: http://10.10.10.184:30254/api/v1/execution-service/process\n                httpMethod: POST\n                restRequestTimeout: 2000\n                httpHeaders:\n                - - Authorization\n                  - Basic Y2NzZGthcHBzOmNjc2RrYXBwcw==\n            eventProtocolParameters:\n              eventProtocol: JSON\n            eventName: CDSCreateResponseEvent\n            eventNameFilter: CDSCreateResponseEvent\n            requestorMode: true\n            requestorPeer: CDSRequestProducer\n            requestorTimeout: 500\n          CDSDeleteRequestConsumer:\n            carrierTechnologyParameters:\n              carrierTechnology: RESTREQUESTOR\n              parameterClassName: org.onap.policy.apex.plugins.event.carrier.restrequestor.RestRequestorCarrierTechnologyParameters\n              parameters:\n                url: http://10.10.10.184:30254/api/v1/execution-service/process\n                httpMethod: POST\n                restRequestTimeout: 2000\n                httpHeaders:\n                - - Authorization\n                  - Basic Y2NzZGthcHBzOmNjc2RrYXBwcw==\n            eventProtocolParameters:\n              eventProtocol: JSON\n            eventName: CDSDeleteResponseEvent\n            eventNameFilter: CDSDeleteResponseEvent\n            requestorMode: true\n            requestorPeer: CDSDeleteRequestProducer\n            requestorTimeout: 500\n          CDSReplyConsumer:\n            carrierTechnologyParameters:\n              carrierTechnology: RESTREQUESTOR\n              parameterClassName: org.onap.policy.apex.plugins.event.carrier.restrequestor.RestRequestorCarrierTechnologyParameters\n              parameters:\n                url: https://message-router:3905/events/unauthenticated.PMSH_CL_INPUT\n                httpMethod: POST\n                restRequestTimeout: 2000\n            eventProtocolParameters:\n              eventProtocol: JSON\n            eventName: MRResponseEvent\n            eventNameFilter: MRResponseEvent\n            requestorMode: true\n            requestorPeer: CDSReplyProducer\n            requestorTimeout: 500\n        eventOutputParameters:\n          logOutputter:\n            carrierTechnologyParameters:\n              carrierTechnology: FILE\n              parameters:\n                fileName: /tmp/outputevents.log\n            eventProtocolParameters:\n              eventProtocol: JSON\n          StdOutOutputter:\n            carrierTechnologyParameters:\n              carrierTechnology: FILE\n              parameters:\n                standardIo: true\n            eventProtocolParameters:\n              eventProtocol: JSON\n          CDSRequestProducer:\n            carrierTechnologyParameters:\n              carrierTechnology: RESTREQUESTOR\n              parameterClassName: org.onap.policy.apex.plugins.event.carrier.restrequestor.RestRequestorCarrierTechnologyParameters\n            eventProtocolParameters:\n              eventProtocol: JSON\n            eventNameFilter: CDSCreateSubscriptionRequestEvent\n            requestorMode: true\n            requestorPeer: CDSRequestConsumer\n            requestorTimeout: 500\n          CDSDeleteRequestProducer:\n            carrierTechnologyParameters:\n              carrierTechnology: RESTREQUESTOR\n              parameterClassName: org.onap.policy.apex.plugins.event.carrier.restrequestor.RestRequestorCarrierTechnologyParameters\n            eventProtocolParameters:\n              eventProtocol: JSON\n            eventNameFilter: CDSDeleteSubscriptionRequestEvent\n            requestorMode: true\n            requestorPeer: CDSDeleteRequestConsumer\n            requestorTimeout: 500\n          CDSReplyProducer:\n            carrierTechnologyParameters:\n              carrierTechnology: RESTREQUESTOR\n              parameterClassName: org.onap.policy.apex.plugins.event.carrier.restrequestor.RestRequestorCarrierTechnologyParameters\n            eventProtocolParameters:\n              eventProtocol: JSON\n            eventNameFilter: CDSResponseStatusEvent\n            requestorMode: true\n            requestorPeer: CDSReplyConsumer\n            requestorTimeout: 500",
+					"options": {
+						"raw": {
+							"language": "text"
+						}
+					}
+				},
+				"url": {
+					"raw": "localhost:6969/onap/controlloop/v2/commission",
+					"host": [
+						"localhost"
+					],
+					"port": "6969",
+					"path": [
+						"onap",
+						"controlloop",
+						"v2",
+						"commission"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "Demo: Instantiation control loop definition (Full tosca try)",
+			"protocolProfileBehavior": {
+				"disabledSystemHeaders": {
+					"content-type": true
+				}
+			},
+			"request": {
+				"auth": {
+					"type": "basic",
+					"basic": [
+						{
+							"key": "password",
+							"value": "zb!XztG34",
+							"type": "string"
+						},
+						{
+							"key": "username",
+							"value": "healthcheck",
+							"type": "string"
+						}
+					]
+				},
+				"method": "POST",
+				"header": [
+					{
+						"key": "X-ONAP-RequestID",
+						"value": "709c62b3-8918-41b9-a747-d21eb79c6c20",
+						"type": "text"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json",
+						"type": "text"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n    \"controlLoopList\": [\n        {\n            \"name\": \"PMSHInstance0\",\n            \"version\": \"1.0.1\",\n            \"definition\": {\n                \"name\": \"org.onap.domain.pmsh.PMSHControlLoopDefinition\",\n                \"version\": \"1.2.3\"\n            },\n            \"state\": \"UNINITIALISED\",\n            \"orderedState\": \"UNINITIALISED\",\n            \"description\": \"PMSH control loop instance 0\",\n            \"elements\": {\n                \"709c62b3-8918-41b9-a747-d21eb79c6c20\": {\n                    \"id\": \"709c62b3-8918-41b9-a747-d21eb79c6c20\",\n                    \"definition\": {\n                        \"name\": \"org.onap.domain.pmsh.PMSH_DCAEMicroservice\",\n                        \"version\": \"1.2.3\"\n                    },\n                    \"participantType\": {\n                        \"name\": \"org.onap.dcae.controlloop.DCAEMicroserviceControlLoopParticipant\",\n                        \"version\": \"2.3.4\"\n                    },\n                    \"state\": \"UNINITIALISED\",\n                    \"orderedState\": \"UNINITIALISED\",\n                    \"description\": \"DCAE Control Loop Element for the PMSH instance 0 control loop\"\n                },\n                \"709c62b3-8918-41b9-a747-d21eb79c6c21\": {\n                    \"id\": \"709c62b3-8918-41b9-a747-d21eb79c6c21\",\n                    \"definition\": {\n                        \"name\": \"org.onap.domain.pmsh.PMSH_MonitoringPolicyControlLoopElement\",\n                        \"version\": \"1.2.3\"\n                    },\n                    \"participantType\": {\n                        \"name\": \"org.onap.policy.controlloop.PolicyControlLoopParticipant\",\n                        \"version\": \"2.3.1\"\n                    },\n                    \"state\": \"UNINITIALISED\",\n                    \"orderedState\": \"UNINITIALISED\",\n                    \"description\": \"Monitoring Policy Control Loop Element for the PMSH instance 0 control loop\"\n                },\n                \"709c62b3-8918-41b9-a747-d21eb79c6c22\": {\n                    \"id\": \"709c62b3-8918-41b9-a747-d21eb79c6c22\",\n                    \"definition\": {\n                        \"name\": \"org.onap.domain.pmsh.PMSH_OperationalPolicyControlLoopElement\",\n                        \"version\": \"1.2.3\"\n                    },\n                    \"participantType\": {\n                        \"name\": \"org.onap.policy.controlloop.PolicyControlLoopParticipant\",\n                        \"version\": \"2.3.1\"\n                    },\n                    \"state\": \"UNINITIALISED\",\n                    \"orderedState\": \"UNINITIALISED\",\n                    \"description\": \"Operational Policy Control Loop Element for the PMSH instance 0 control loop\"\n                }\n            }\n        }\n    ]\n}",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
+				},
+				"url": {
+					"raw": "localhost:6969/onap/controlloop/v2/instantiation",
+					"host": [
+						"localhost"
+					],
+					"port": "6969",
+					"path": [
+						"onap",
+						"controlloop",
+						"v2",
+						"instantiation"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "Demo: Instantiation control loop definition Command",
+			"protocolProfileBehavior": {
+				"disabledSystemHeaders": {
+					"content-type": true
+				}
+			},
+			"request": {
+				"auth": {
+					"type": "basic",
+					"basic": [
+						{
+							"key": "password",
+							"value": "zb!XztG34",
+							"type": "string"
+						},
+						{
+							"key": "username",
+							"value": "healthcheck",
+							"type": "string"
+						}
+					]
+				},
+				"method": "PUT",
+				"header": [
+					{
+						"key": "X-ONAP-RequestID",
+						"type": "text",
+						"value": "709c62b3-8918-41b9-a747-d21eb79c6c20"
+					},
+					{
+						"key": "Content-Type",
+						"type": "text",
+						"value": "application/json"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n    \"orderedState\": \"PASSIVE\",\n    \"controlLoopIdentifierList\": [\n        {\n            \"name\": \"PMSHInstance0\",\n            \"version\": \"1.0.1\"\n        }\n    ]\n}",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
+				},
+				"url": {
+					"raw": "localhost:6969/onap/controlloop/v2/instantiation/command",
+					"host": [
+						"localhost"
+					],
+					"port": "6969",
+					"path": [
+						"onap",
+						"controlloop",
+						"v2",
+						"instantiation",
+						"command"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "Demo: Get PolicyTypes Policy API",
+			"request": {
+				"auth": {
+					"type": "basic",
+					"basic": [
+						{
+							"key": "password",
+							"value": "zb!XztG34",
+							"type": "string"
+						},
+						{
+							"key": "username",
+							"value": "healthcheck",
+							"type": "string"
+						}
+					]
+				},
+				"method": "GET",
+				"header": [],
+				"url": {
+					"raw": "localhost:6968/policy/api/v1/policytypes/onap.policies.Sirisha",
+					"host": [
+						"localhost"
+					],
+					"port": "6968",
+					"path": [
+						"policy",
+						"api",
+						"v1",
+						"policytypes",
+						"onap.policies.Sirisha"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "Demo: Get Policies Policy API",
+			"request": {
+				"auth": {
+					"type": "basic",
+					"basic": [
+						{
+							"key": "password",
+							"value": "zb!XztG34",
+							"type": "string"
+						},
+						{
+							"key": "username",
+							"value": "healthcheck",
+							"type": "string"
+						}
+					]
+				},
+				"method": "GET",
+				"header": [],
+				"url": {
+					"raw": "localhost:6968/policy/api/v1/policies",
+					"host": [
+						"localhost"
+					],
+					"port": "6968",
+					"path": [
+						"policy",
+						"api",
+						"v1",
+						"policies"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "Demo: Get instantiated control loops",
+			"request": {
+				"auth": {
+					"type": "basic",
+					"basic": [
+						{
+							"key": "password",
+							"value": "zb!XztG34",
+							"type": "string"
+						},
+						{
+							"key": "username",
+							"value": "healthcheck",
+							"type": "string"
+						}
+					]
+				},
+				"method": "GET",
+				"header": [],
+				"url": {
+					"raw": "localhost:6969/onap/controlloop/v2/instantiation",
+					"host": [
+						"localhost"
+					],
+					"port": "6969",
+					"path": [
+						"onap",
+						"controlloop",
+						"v2",
+						"instantiation"
+					]
+				}
+			},
+			"response": []
+		}
+	]
+}
\ No newline at end of file
diff --git a/common/src/test/resources/demo/config/PolicyAPIConfig.json b/common/src/test/resources/demo/config/PolicyAPIConfig.json
new file mode 100644
index 0000000..48e89c5
--- /dev/null
+++ b/common/src/test/resources/demo/config/PolicyAPIConfig.json
@@ -0,0 +1,53 @@
+{
+    "name": "ApiGroup",
+    "restServerParameters": {
+        "host": "0.0.0.0",
+        "port": 6968,
+        "userName": "healthcheck",
+        "password": "zb!XztG34",
+        "https": false,
+        "aaf": false
+    },
+    "databaseProviderParameters": {
+        "name": "PolicyProviderParameterGroup",
+        "implementation": "org.onap.policy.models.provider.impl.DatabasePolicyModelsProviderImpl",
+        "databaseDriver": "org.mariadb.jdbc.Driver",
+        "databaseUrl": "jdbc:mariadb://localhost:3306/policyadmin",
+        "databaseUser": "policy",
+        "databasePassword": "P01icY",
+        "persistenceUnit": "PolicyMariaDb"
+    },
+    "preloadPolicyTypes": [
+        "policytypes/onap.policies.monitoring.tcagen2.yaml",
+        "policytypes/onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server.yaml",
+        "policytypes/onap.policies.monitoring.dcae-restconfcollector.yaml",
+        "policytypes/onap.policies.Optimization.yaml",
+        "policytypes/onap.policies.optimization.Resource.yaml",
+        "policytypes/onap.policies.optimization.Service.yaml",
+        "policytypes/onap.policies.optimization.resource.AffinityPolicy.yaml",
+        "policytypes/onap.policies.optimization.resource.DistancePolicy.yaml",
+        "policytypes/onap.policies.optimization.resource.HpaPolicy.yaml",
+        "policytypes/onap.policies.optimization.resource.OptimizationPolicy.yaml",
+        "policytypes/onap.policies.optimization.resource.PciPolicy.yaml",
+        "policytypes/onap.policies.optimization.service.QueryPolicy.yaml",
+        "policytypes/onap.policies.optimization.service.SubscriberPolicy.yaml",
+        "policytypes/onap.policies.optimization.resource.Vim_fit.yaml",
+        "policytypes/onap.policies.optimization.resource.VnfPolicy.yaml",
+        "policytypes/onap.policies.controlloop.guard.Common.yaml",
+        "policytypes/onap.policies.controlloop.guard.common.Blacklist.yaml",
+        "policytypes/onap.policies.controlloop.guard.common.FrequencyLimiter.yaml",
+        "policytypes/onap.policies.controlloop.guard.common.MinMax.yaml",
+        "policytypes/onap.policies.controlloop.guard.common.Filter.yaml",
+        "policytypes/onap.policies.controlloop.guard.coordination.FirstBlocksSecond.yaml",
+        "policytypes/onap.policies.Naming.yaml",
+        "policytypes/onap.policies.Match.yaml",
+        "policytypes/onap.policies.native.Drools.yaml",
+        "policytypes/onap.policies.native.Xacml.yaml",
+        "policytypes/onap.policies.native.Apex.yaml",
+        "policytypes/onap.policies.controlloop.operational.Common.yaml",
+        "policytypes/onap.policies.controlloop.operational.common.Drools.yaml"
+    ],
+    "preloadPolicies" : [
+        "policies/sdnc.policy.naming.input.tosca.yaml"
+    ]
+}
diff --git a/common/src/test/resources/demo/config/PolicyParticipantConfig.json b/common/src/test/resources/demo/config/PolicyParticipantConfig.json
new file mode 100644
index 0000000..f02fbdd
--- /dev/null
+++ b/common/src/test/resources/demo/config/PolicyParticipantConfig.json
@@ -0,0 +1,53 @@
+{
+    "name": "ControlLoopParticipantGroup",
+    "intermediaryParameters": {
+        "name": "Participant parameters",
+        "reportingTimeInterval": 120000,
+        "description": "Participant Description",
+        "participantType":{
+            "name": "org.onap.policy.controlloop.PolicyControlLoopParticipant",
+            "version":"2.3.1"
+        },
+        "participantId": {
+            "name": "org.onap.PM_Policy",
+            "version": "1.0.0"
+        },
+        "clampControlLoopTopics": {
+            "topicSources": [
+                {
+                    "topic": "POLICY-CLRUNTIME-PARTICIPANT",
+                    "servers": [
+                        "localhost"
+                    ],
+                    "topicCommInfrastructure": "dmaap",
+                    "fetchTimeout": 15000
+                }
+            ],
+            "topicSinks": [
+                {
+                    "topic": "POLICY-CLRUNTIME-PARTICIPANT",
+                    "servers": [
+                        "localhost"
+                    ],
+                    "topicCommInfrastructure": "dmaap"
+                },
+                {
+                    "topic": "POLICY-NOTIFICATION",
+                    "servers": [
+                        "localhost"
+                    ],
+                    "topicCommInfrastructure": "dmaap"
+                }
+            ]
+        }
+    },
+    "databaseProviderParameters": {
+        "name": "PolicyProviderParameterGroup",
+        "implementation": "org.onap.policy.models.provider.impl.DatabasePolicyModelsProviderImpl",
+        "databaseDriver": "org.mariadb.jdbc.Driver",
+        "databaseUrl": "jdbc:mariadb://localhost:3306/policyadmin",
+        "databaseUser": "policy",
+        "databasePassword": "P01icY",
+        "persistenceUnit": "ToscaConceptTest"
+    }
+}
diff --git a/common/src/test/resources/demo/config/RuntimeConfig.json b/common/src/test/resources/demo/config/RuntimeConfig.json
new file mode 100644
index 0000000..2c0127b
--- /dev/null
+++ b/common/src/test/resources/demo/config/RuntimeConfig.json
@@ -0,0 +1,79 @@
+{
+    "name": "ControlLoopRuntimeGroup",
+    "restServerParameters": {
+        "host": "0.0.0.0",
+        "port": 6969,
+        "userName": "healthcheck",
+        "password": "zb!XztG34",
+        "https": false,
+        "aaf": false
+    },
+    "participantParameters": {
+        "heartBeatMs": 120000,
+        "updateParameters": {
+            "maxRetryCount": 1,
+            "maxWaitMs": 30000
+        },
+        "stateChangeParameters": {
+            "maxRetryCount": 1,
+            "maxWaitMs": 30000
+        }
+    },
+    "databaseProviderParameters": {
+        "name": "PolicyProviderParameterGroup",
+        "implementation": "org.onap.policy.models.provider.impl.DatabasePolicyModelsProviderImpl",
+        "databaseDriver": "org.mariadb.jdbc.Driver",
+        "databaseUrl": "jdbc:mariadb://localhost:3306/controlloop",
+        "databaseUser": "policy",
+        "databasePassword": "P01icY",
+        "persistenceUnit": "CommissioningMariaDb"
+    },
+    "topicParameterGroup": {
+        "topicSources": [
+            {
+                "topic": "POLICY-CLRUNTIME-PARTICIPANT",
+                "servers": [
+                    "localhost"
+                ],
+                "topicCommInfrastructure": "dmaap",
+                "fetchTimeout": 15000
+            }
+        ],
+        "topicSinks": [
+            {
+                "topic": "POLICY-CLRUNTIME-PARTICIPANT",
+                "servers": [
+                    "localhost"
+                ],
+                "topicCommInfrastructure": "dmaap"
+            },
+            {
+                "topic": "POLICY-NOTIFICATION",
+                "servers": [
+                    "localhost"
+                ],
+                "topicCommInfrastructure": "dmaap"
+            }
+        ]
+    },
+    "healthCheckRestClientParameters": [
+        {
+            "clientName": "api",
+            "hostname": "policy-api",
+            "port": 6969,
+            "userName": "healthcheck",
+            "password": "zb!XztG34",
+            "useHttps": true,
+            "basePath": "policy/api/v1/healthcheck"
+        },
+        {
+            "clientName": "distribution",
+            "hostname": "policy-distribution",
+            "port": 6969,
+            "userName": "healthcheck",
+            "password": "zb!XztG34",
+            "useHttps": true,
+            "basePath": "healthcheck"
+        }
+    ]
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ClElementStatistics.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ClElementStatistics.java
new file mode 100644
index 0000000..4ef9bdc
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ClElementStatistics.java
@@ -0,0 +1,53 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.models.controlloop.concepts;
+
+import java.io.Serializable;
+import java.time.Instant;
+import java.util.UUID;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.NonNull;
+import lombok.ToString;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+@NoArgsConstructor
+@Data
+@ToString
+public class ClElementStatistics implements Serializable {
+
+    private static final long serialVersionUID = 3284285693112271055L;
+
+    @NonNull
+    private UUID id = UUID.randomUUID();
+
+    @NonNull
+    private ToscaConceptIdentifier participantId;
+
+    @NonNull
+    private Instant timeStamp;
+
+    @NonNull
+    private ControlLoopState controlLoopState;
+
+    private long clElementUptime;
+
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ClElementStatisticsList.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ClElementStatisticsList.java
new file mode 100644
index 0000000..166f1e4
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ClElementStatisticsList.java
@@ -0,0 +1,33 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.models.controlloop.concepts;
+
+import java.util.List;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+@Getter
+@Setter
+@ToString
+public class ClElementStatisticsList {
+    private List<ClElementStatistics> clElementStatistics;
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoop.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoop.java
new file mode 100644
index 0000000..d0d7927
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoop.java
@@ -0,0 +1,113 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.models.controlloop.concepts;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import java.util.stream.Collectors;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.NonNull;
+import org.apache.commons.collections4.MapUtils;
+import org.onap.policy.models.base.PfConceptKey;
+import org.onap.policy.models.base.PfUtils;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaEntity;
+
+/**
+ * Class to represent a control loop instance.
+ */
+@NoArgsConstructor
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class ControlLoop extends ToscaEntity implements Comparable<ControlLoop> {
+    @NonNull
+    private ToscaConceptIdentifier definition = new ToscaConceptIdentifier(PfConceptKey.getNullKey());
+
+    @NonNull
+    private ControlLoopState state = ControlLoopState.UNINITIALISED;
+
+    @NonNull
+    private ControlLoopOrderedState orderedState = ControlLoopOrderedState.UNINITIALISED;
+
+    private Map<UUID, ControlLoopElement> elements;
+
+    @Override
+    public String getType() {
+        return definition.getName();
+    }
+
+    @Override
+    public String getTypeVersion() {
+        return definition.getVersion();
+    }
+
+    /**
+     * Copy contructor, does a deep copy.
+     *
+     * @param otherControlLoop the other element to copy from
+     */
+    public ControlLoop(final ControlLoop otherControlLoop) {
+        super(otherControlLoop);
+        this.definition = new ToscaConceptIdentifier(otherControlLoop.definition);
+        this.state = otherControlLoop.state;
+        this.orderedState = otherControlLoop.orderedState;
+        this.elements = PfUtils.mapMap(otherControlLoop.elements, ControlLoopElement::new);
+    }
+
+    @Override
+    public int compareTo(final ControlLoop other) {
+        return compareNameVersion(this, other);
+    }
+
+    /**
+     * Set the ordered state on the control loop and on all its control loop elements.
+     *
+     * @param orderedState the state we want the control loop to transition to
+     */
+    public void setCascadedOrderedState(final ControlLoopOrderedState orderedState) {
+        this.orderedState = orderedState;
+
+        if (MapUtils.isEmpty(elements)) {
+            return;
+        }
+
+        elements.values().forEach(element -> element.setOrderedState(orderedState));
+    }
+
+    /**
+     * Get a list of control loop element statistics.
+     *
+     * @param controlLoop the control loop
+     * @return List of ClElementStatistics
+     */
+    public List<ClElementStatistics> getControlLoopElementStatisticsList(final ControlLoop controlLoop) {
+        if (MapUtils.isEmpty(controlLoop.elements)) {
+            return null;
+        }
+
+        return controlLoop.elements.values().stream().map(ControlLoopElement::getClElementStatistics)
+                .collect(Collectors.toList());
+    }
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoopElement.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoopElement.java
new file mode 100644
index 0000000..83f062c
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoopElement.java
@@ -0,0 +1,75 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.models.controlloop.concepts;
+
+import java.util.UUID;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.NonNull;
+import lombok.ToString;
+import org.onap.policy.models.base.PfConceptKey;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+/**
+ * Class to represent a control loop instance.
+ */
+@NoArgsConstructor
+@Data
+@ToString
+public class ControlLoopElement {
+    @NonNull
+    private UUID id = UUID.randomUUID();
+
+    @NonNull
+    private ToscaConceptIdentifier definition = new ToscaConceptIdentifier(PfConceptKey.getNullKey());
+
+    @NonNull
+    private ToscaConceptIdentifier participantType = new ToscaConceptIdentifier(PfConceptKey.getNullKey());
+
+    @NonNull
+    private ToscaConceptIdentifier participantId = new ToscaConceptIdentifier(PfConceptKey.getNullKey());
+
+    @NonNull
+    private ControlLoopState state = ControlLoopState.UNINITIALISED;
+
+    @NonNull
+    private ControlLoopOrderedState orderedState = ControlLoopOrderedState.UNINITIALISED;
+
+    private String description;
+
+    private ClElementStatistics clElementStatistics;
+
+    /**
+     * Copy constructor, does a deep copy but as all fields here are immutable, it's just a regular copy.
+     *
+     * @param otherElement the other element to copy from
+     */
+    public ControlLoopElement(final ControlLoopElement otherElement) {
+        this.id = otherElement.id;
+        this.definition = new ToscaConceptIdentifier(otherElement.definition);
+        this.participantType = new ToscaConceptIdentifier(otherElement.participantType);
+        this.participantId = new ToscaConceptIdentifier(otherElement.participantId);
+        this.state = otherElement.state;
+        this.orderedState = otherElement.orderedState;
+        this.description = otherElement.description;
+        this.clElementStatistics = otherElement.clElementStatistics;
+    }
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoopOrderedState.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoopOrderedState.java
new file mode 100644
index 0000000..91f9027
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoopOrderedState.java
@@ -0,0 +1,44 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.models.controlloop.concepts;
+
+public enum ControlLoopOrderedState {
+    /**
+     * The control loop or control loop element should become uninitialised on participants, it should not exist on
+     * participants.
+     */
+    UNINITIALISED,
+    /**
+     * The control loop or control loop element should initialised on the participants and be passive, that is, it is
+     * not handling control loop messages yet.
+     */
+    PASSIVE,
+    /** The control loop or control loop element should running and is executing control loops. */
+    RUNNING;
+
+    public boolean equalsControlLoopState(final ControlLoopState controlLoopState)  {
+        return this.name().equals(controlLoopState.name());
+    }
+
+    public ControlLoopState asState() {
+        return ControlLoopState.valueOf(this.name());
+    }
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoopState.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoopState.java
new file mode 100644
index 0000000..ff0d553
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoopState.java
@@ -0,0 +1,63 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.models.controlloop.concepts;
+
+public enum ControlLoopState {
+    /**
+     * The control loop or control loop element is not initialised on participants, it does not exist on participants.
+     */
+    UNINITIALISED,
+    /**
+     * The control loop or control loop element is changing from unitialised to passive, it is being initialised onto
+     * participants.
+     */
+    UNINITIALISED2PASSIVE,
+    /**
+     * The control loop or control loop element is initialised on the participants but is passive, that is, it is not
+     * handling control loop messages yet.
+     */
+    PASSIVE,
+    /**
+     * The control loop or control loop element is changing from passive to running, the participants are preparing to
+     * execute control loops.
+     */
+    PASSIVE2RUNNING,
+    /** The control loop or control loop element is running and is executing control loops. */
+    RUNNING,
+    /**
+     * The control loop or control loop element is completing execution of current control loops but will not start
+     * running any more control loops and will become passive.
+     */
+    RUNNING2PASSIVE,
+    /**
+     * The control loop or control loop element is changing from passive to unitialised, the control loop is being
+     * removed from participants.
+     */
+    PASSIVE2UNINITIALISED;
+
+    public boolean equalsControlLoopOrderedState(final ControlLoopOrderedState controlLoopOrderedState)  {
+        return this.name().equals(controlLoopOrderedState.name());
+    }
+
+    public ControlLoopOrderedState asOrderedState() {
+        return ControlLoopOrderedState.valueOf(this.name());
+    }
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoops.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoops.java
new file mode 100644
index 0000000..8edcc3c
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoops.java
@@ -0,0 +1,47 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.clamp.controlloop.models.controlloop.concepts;
+
+import java.util.List;
+import lombok.AllArgsConstructor;
+import lombok.EqualsAndHashCode;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import lombok.ToString;
+import org.onap.policy.models.base.PfUtils;
+
+@Getter
+@Setter
+@ToString
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode
+public class ControlLoops {
+    private List<ControlLoop> controlLoopList;
+
+    /**
+     * Copy contructor, does a deep copy.
+     *
+     * @param otherControlLoops the other element to copy from
+     */
+    public ControlLoops(final ControlLoops otherControlLoops) {
+        this.controlLoopList = PfUtils.mapList(controlLoopList, ControlLoop::new);
+    }
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/Participant.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/Participant.java
new file mode 100644
index 0000000..3130b6c
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/Participant.java
@@ -0,0 +1,73 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.models.controlloop.concepts;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.NonNull;
+import org.onap.policy.models.base.PfConceptKey;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaEntity;
+
+/**
+ * Class to represent details of a running participant instance.
+ */
+@NoArgsConstructor
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class Participant extends ToscaEntity implements Comparable<Participant> {
+    @NonNull
+    private ToscaConceptIdentifier definition = new ToscaConceptIdentifier(PfConceptKey.getNullKey());
+
+    @NonNull
+    private ParticipantState participantState = ParticipantState.UNKNOWN;
+
+    @NonNull
+    private ParticipantHealthStatus healthStatus = ParticipantHealthStatus.UNKNOWN;
+
+    @Override
+    public String getType() {
+        return definition.getName();
+    }
+
+    @Override
+    public String getTypeVersion() {
+        return definition.getVersion();
+    }
+
+    @Override
+    public int compareTo(final Participant other) {
+        return compareNameVersion(this, other);
+    }
+
+    /**
+     * Copy constructor.
+     *
+     * @param otherParticipant the participant to copy from
+     */
+    public Participant(Participant otherParticipant) {
+        super(otherParticipant);
+        this.definition = new ToscaConceptIdentifier(otherParticipant.definition);
+        this.participantState = otherParticipant.participantState;
+        this.healthStatus = otherParticipant.healthStatus;
+    }
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ParticipantHealthStatus.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ParticipantHealthStatus.java
new file mode 100644
index 0000000..0cf41c9
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ParticipantHealthStatus.java
@@ -0,0 +1,47 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.models.controlloop.concepts;
+
+/**
+ * Class to hold the possible values for health status of Participant.
+ */
+public enum ParticipantHealthStatus {
+
+    /**
+     * Participant is healthy and working fine.
+     */
+    HEALTHY,
+
+    /**
+     * Participant is not healthy.
+     */
+    NOT_HEALTHY,
+
+    /**
+     * Participant is currently under test state and performing tests.
+     */
+    TEST_IN_PROGRESS,
+
+    /**
+     * The health status of the Participant is unknown.
+     */
+    UNKNOWN
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ParticipantState.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ParticipantState.java
new file mode 100644
index 0000000..1af3266
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ParticipantState.java
@@ -0,0 +1,61 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.models.controlloop.concepts;
+
+/**
+ * Class to hold the possible values for mode of participant.
+ */
+public enum ParticipantState {
+
+    /**
+     * Control Loop execution is unknown.
+     */
+    UNKNOWN,
+
+    /**
+     * Control Loop execution is always rejected.
+     */
+    PASSIVE,
+
+    /**
+     * Control Loop execution execution proceeds, but changes to domain state or context are not carried out. The
+     * participant returns an indication that it is running in SAFE mode together with the action it would have
+     * performed if it was operating in ACTIVE mode.
+     */
+    SAFE,
+
+    /**
+     * Control Loop execution execution proceeds and changes to domain and state are carried out in a test environment.
+     * The participant returns an indication that it is running in TEST mode together with the action it has performed
+     * on the test environment.
+     */
+    TEST,
+
+    /**
+     * Control Loop execution execution is executed in the live environment by the participant.
+     */
+    ACTIVE,
+
+    /**
+     * Control Loop execution execution is terminated and not available.
+     */
+    TERMINATED
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ParticipantStatistics.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ParticipantStatistics.java
new file mode 100644
index 0000000..3a7b21f
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ParticipantStatistics.java
@@ -0,0 +1,52 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.models.controlloop.concepts;
+
+import java.io.Serializable;
+import java.time.Instant;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.NonNull;
+import lombok.ToString;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+@NoArgsConstructor
+@Data
+@ToString
+public class ParticipantStatistics implements Serializable {
+    private static final long serialVersionUID = 744036598792333124L;
+
+
+    @NonNull
+    private ToscaConceptIdentifier participantId;
+
+    @NonNull
+    private Instant timeStamp;
+
+    private ParticipantState state;
+    private ParticipantHealthStatus healthStatus;
+    private long eventCount;
+    private long lastExecutionTime;
+    private double averageExecutionTime;
+    private long upTime;
+    private long lastEnterTime;
+    private long lastStart;
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ParticipantStatisticsList.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ParticipantStatisticsList.java
new file mode 100644
index 0000000..a69f96f
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ParticipantStatisticsList.java
@@ -0,0 +1,33 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.models.controlloop.concepts;
+
+import java.util.List;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+@Getter
+@Setter
+@ToString
+public class ParticipantStatisticsList {
+    private List<ParticipantStatistics> statisticsList;
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaClElementStatistics.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaClElementStatistics.java
new file mode 100644
index 0000000..c5ce996
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaClElementStatistics.java
@@ -0,0 +1,194 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.models.controlloop.persistence.concepts;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.UUID;
+import javax.persistence.AttributeOverride;
+import javax.persistence.Column;
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.Table;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NonNull;
+import org.apache.commons.lang3.builder.CompareToBuilder;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ClElementStatistics;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopState;
+import org.onap.policy.common.parameters.annotations.NotNull;
+import org.onap.policy.models.base.PfAuthorative;
+import org.onap.policy.models.base.PfConcept;
+import org.onap.policy.models.base.PfConceptKey;
+import org.onap.policy.models.base.PfKey;
+import org.onap.policy.models.base.PfReferenceTimestampKey;
+import org.onap.policy.models.base.validation.annotations.VerifyKey;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+/**
+ * Class to represent a controlloop element statistics in the database.
+ *
+ * @author Ramesh Murugan Iyer (ramesh.murugan.iyer@est.tech)
+ */
+@Entity
+@Table(name = "ClElementStatistics")
+@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
+@Data
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = false)
+public class JpaClElementStatistics extends PfConcept implements PfAuthorative<ClElementStatistics>, Serializable {
+
+    private static final long serialVersionUID = 621426717868738629L;
+
+    @EmbeddedId
+    @VerifyKey
+    @NotNull
+    private PfReferenceTimestampKey key = new PfReferenceTimestampKey();
+
+
+    @VerifyKey
+    @NotNull
+    // @formatter:off
+    @AttributeOverride(name = "name",    column = @Column(name = "participant_name"))
+    @AttributeOverride(name = "version", column = @Column(name = "participant_version"))
+    private PfConceptKey participantId;
+    // @formatter: on
+
+    @Column
+    @NotNull
+    private ControlLoopState state;
+
+    @Column
+    private long clElementUptime;
+
+
+    /**
+     * The Default Constructor creates a {@link JpaClElementStatistics} object with a null key.
+     */
+    public JpaClElementStatistics() {
+        this(new PfReferenceTimestampKey());
+    }
+
+
+    /**
+     * The Key Constructor creates a {@link JpaClElementStatistics} object with the given Reference Timestamp key.
+     *
+     * @param key the key
+     */
+    public JpaClElementStatistics(@NonNull final PfReferenceTimestampKey key) {
+        this(key, new PfConceptKey(), ControlLoopState.PASSIVE, 0L);
+    }
+
+    /**
+     * The Key Constructor creates a {@link JpaClElementStatistics} object with all mandatory fields.
+     *
+     * @param key the key
+     * @param participantId the TOSCA definition of the control loop element
+     */
+    public JpaClElementStatistics(@NonNull final PfReferenceTimestampKey key,
+                                  @NonNull final PfConceptKey participantId) {
+        this.key = key;
+        this.participantId = participantId;
+    }
+
+    /**
+     * Copy constructor.
+     *
+     * @param copyConcept the concept to copy from
+     */
+    public JpaClElementStatistics(@NonNull final JpaClElementStatistics copyConcept) {
+        super(copyConcept);
+        this.key = new PfReferenceTimestampKey(copyConcept.key);
+        this.participantId = new PfConceptKey(copyConcept.participantId);
+        this.state = copyConcept.state;
+        this.clElementUptime = copyConcept.clElementUptime;
+    }
+
+
+    /**
+     * Authorative constructor.
+     *
+     * @param authorativeConcept the authorative concept to copy from
+     */
+    public JpaClElementStatistics(@NonNull final ClElementStatistics authorativeConcept) {
+        this.fromAuthorative(authorativeConcept);
+    }
+
+
+
+    @Override
+    public ClElementStatistics toAuthorative() {
+        ClElementStatistics clElementStatistics = new ClElementStatistics();
+        clElementStatistics.setId(UUID.fromString(getKey().getReferenceKey().getLocalName()));
+        clElementStatistics.setTimeStamp(key.getInstant());
+        clElementStatistics.setParticipantId(new ToscaConceptIdentifier(participantId));
+        clElementStatistics.setControlLoopState(state);
+        clElementStatistics.setClElementUptime(clElementUptime);
+
+        return clElementStatistics;
+    }
+
+    @Override
+    public void fromAuthorative(@NonNull ClElementStatistics clElementStatistics) {
+        // @formatter:off
+        if (this.key == null || this.getKey().isNullKey()) {
+            this.setKey(new PfReferenceTimestampKey(clElementStatistics.getParticipantId().getName(),
+                clElementStatistics.getParticipantId().getVersion(), clElementStatistics.getId().toString(),
+                clElementStatistics.getTimeStamp()));
+        }
+        // @formatter:on
+        this.setParticipantId(clElementStatistics.getParticipantId().asConceptKey());
+        this.setState(clElementStatistics.getControlLoopState());
+        this.setClElementUptime(clElementStatistics.getClElementUptime());
+    }
+
+    @Override
+    public List<PfKey> getKeys() {
+        return getKey().getKeys();
+    }
+
+    @Override
+    public void clean() {
+        key.clean();
+        participantId.clean();
+    }
+
+
+    @Override
+    public int compareTo(PfConcept otherConcept) {
+        if (otherConcept == null) {
+            return -1;
+        }
+        if (this == otherConcept) {
+            return 0;
+        }
+        if (getClass() != otherConcept.getClass()) {
+            return getClass().getName().compareTo(otherConcept.getClass().getName());
+        }
+
+        final JpaClElementStatistics other = (JpaClElementStatistics) otherConcept;
+        return new CompareToBuilder().append(this.key, other.key).append(this.state, other.state)
+                .append(this.clElementUptime, other.clElementUptime).toComparison();
+    }
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaControlLoop.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaControlLoop.java
new file mode 100644
index 0000000..cac405a
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaControlLoop.java
@@ -0,0 +1,258 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.models.controlloop.persistence.concepts;
+
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.UUID;
+import javax.persistence.AttributeOverride;
+import javax.persistence.AttributeOverrides;
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.ManyToMany;
+import javax.persistence.Table;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NonNull;
+import org.apache.commons.lang3.ObjectUtils;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoop;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopElement;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopOrderedState;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopState;
+import org.onap.policy.common.parameters.annotations.NotNull;
+import org.onap.policy.common.parameters.annotations.Valid;
+import org.onap.policy.models.base.PfAuthorative;
+import org.onap.policy.models.base.PfConcept;
+import org.onap.policy.models.base.PfConceptKey;
+import org.onap.policy.models.base.PfKey;
+import org.onap.policy.models.base.PfReferenceKey;
+import org.onap.policy.models.base.PfUtils;
+import org.onap.policy.models.base.validation.annotations.VerifyKey;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+/**
+ * Class to represent a control loop in the database.
+ *
+ * @author Liam Fallon (liam.fallon@est.tech)
+ */
+@Entity
+@Table(name = "ControlLoop")
+@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class JpaControlLoop extends PfConcept implements PfAuthorative<ControlLoop> {
+    private static final long serialVersionUID = -4725410933242154805L;
+
+    @EmbeddedId
+    @VerifyKey
+    @NotNull
+    private PfConceptKey key;
+
+    // @formatter:off
+    @VerifyKey
+    @NotNull
+    @AttributeOverrides({
+            @AttributeOverride(name = "name",    column = @Column(name = "definition_name")),
+            @AttributeOverride(name = "version", column = @Column(name = "definition_version"))
+        }
+    )
+    private PfConceptKey definition;
+    // @formatter:on
+
+    @Column
+    @NotNull
+    private ControlLoopState state;
+
+    @Column
+    @NotNull
+    private ControlLoopOrderedState orderedState;
+
+    @Column
+    private String description;
+
+    // @formatter:off
+    @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
+    @NotNull
+    private Map<@NotNull UUID, @NotNull @Valid JpaControlLoopElement> elements;
+
+    /**
+     * The Default Constructor creates a {@link JpaControlLoop} object with a null key.
+     */
+    public JpaControlLoop() {
+        this(new PfConceptKey());
+    }
+
+    /**
+     * The Key Constructor creates a {@link JpaControlLoop} object with the given concept key.
+     *
+     * @param key the key
+     */
+    public JpaControlLoop(@NonNull final PfConceptKey key) {
+        this(key, new PfConceptKey(), ControlLoopState.UNINITIALISED, new LinkedHashMap<>());
+    }
+
+    /**
+     * The Key Constructor creates a {@link JpaControlLoop} object with all mandatory fields.
+     *
+     * @param key the key
+     * @param definition the TOSCA definition of the control loop
+     * @param state the state of the control loop
+     * @param elements the elements of the control looop in participants
+     */
+    public JpaControlLoop(@NonNull final PfConceptKey key, @NonNull final PfConceptKey definition,
+            @NonNull final ControlLoopState state, @NonNull final Map<UUID, JpaControlLoopElement> elements) {
+        this.key = key;
+        this.definition = definition;
+        this.state = state;
+        this.elements = elements;
+    }
+
+    /**
+     * Copy constructor.
+     *
+     * @param copyConcept the concept to copy from
+     */
+    public JpaControlLoop(@NonNull final JpaControlLoop copyConcept) {
+        super(copyConcept);
+        this.key = new PfConceptKey(copyConcept.key);
+        this.definition = new PfConceptKey(copyConcept.definition);
+        this.state = copyConcept.state;
+        this.orderedState = copyConcept.orderedState;
+        this.description = copyConcept.description;
+        this.elements = PfUtils.mapMap(copyConcept.elements, JpaControlLoopElement::new, new LinkedHashMap<>(0));
+    }
+
+    /**
+     * Authorative constructor.
+     *
+     * @param authorativeConcept the authorative concept to copy from
+     */
+    public JpaControlLoop(@NonNull final ControlLoop authorativeConcept) {
+        this.fromAuthorative(authorativeConcept);
+    }
+
+    @Override
+    public ControlLoop toAuthorative() {
+        ControlLoop controlLoop = new ControlLoop();
+
+        controlLoop.setName(getKey().getName());
+        controlLoop.setVersion(getKey().getVersion());
+        controlLoop.setDefinition(new ToscaConceptIdentifier(definition));
+        controlLoop.setState(state);
+        controlLoop.setOrderedState(orderedState != null ? orderedState : state.asOrderedState());
+        controlLoop.setDescription(description);
+        controlLoop.setElements(PfUtils.mapMap(elements, JpaControlLoopElement::toAuthorative, new LinkedHashMap<>(0)));
+
+        return controlLoop;
+    }
+
+    @Override
+    public void fromAuthorative(@NonNull final ControlLoop controlLoop) {
+        if (this.key == null || this.getKey().isNullKey()) {
+            this.setKey(new PfConceptKey(controlLoop.getName(), controlLoop.getVersion()));
+        }
+
+        this.definition = controlLoop.getDefinition().asConceptKey();
+        this.state = controlLoop.getState();
+        this.orderedState = controlLoop.getOrderedState();
+        this.description = controlLoop.getDescription();
+
+        this.elements = new LinkedHashMap<>(controlLoop.getElements().size());
+        for (Entry<UUID, ControlLoopElement> elementEntry : controlLoop.getElements().entrySet()) {
+            JpaControlLoopElement jpaControlLoopElement = new JpaControlLoopElement();
+            jpaControlLoopElement.setKey(new PfReferenceKey(getKey(), elementEntry.getValue().getId().toString()));
+            jpaControlLoopElement.fromAuthorative(elementEntry.getValue());
+            this.elements.put(elementEntry.getKey(), jpaControlLoopElement);
+        }
+    }
+
+    @Override
+    public List<PfKey> getKeys() {
+        List<PfKey> keyList = getKey().getKeys();
+
+        keyList.add(definition);
+
+        for (JpaControlLoopElement element : elements.values()) {
+            keyList.addAll(element.getKeys());
+        }
+
+        return keyList;
+    }
+
+    @Override
+    public void clean() {
+        key.clean();
+        definition.clean();
+        description = (description == null ? null : description.trim());
+
+        for (JpaControlLoopElement element : elements.values()) {
+            element.clean();
+        }
+    }
+
+    @Override
+    public int compareTo(final PfConcept otherConcept) {
+        if (otherConcept == null) {
+            return -1;
+        }
+        if (this == otherConcept) {
+            return 0;
+        }
+        if (getClass() != otherConcept.getClass()) {
+            return this.getClass().getName().compareTo(otherConcept.getClass().getName());
+        }
+
+        final JpaControlLoop other = (JpaControlLoop) otherConcept;
+        int result = key.compareTo(other.key);
+        if (result != 0) {
+            return result;
+        }
+
+        result = definition.compareTo(other.definition);
+        if (result != 0) {
+            return result;
+        }
+
+        result = ObjectUtils.compare(state, other.state);
+        if (result != 0) {
+            return result;
+        }
+
+        result = ObjectUtils.compare(orderedState, other.orderedState);
+        if (result != 0) {
+            return result;
+        }
+
+        result = ObjectUtils.compare(description, other.description);
+        if (result != 0) {
+            return result;
+        }
+
+        return PfUtils.compareObjects(elements, other.elements);
+    }
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaControlLoopElement.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaControlLoopElement.java
new file mode 100644
index 0000000..911a520
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaControlLoopElement.java
@@ -0,0 +1,251 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.models.controlloop.persistence.concepts;
+
+import java.util.List;
+import java.util.UUID;
+import javax.persistence.AttributeOverride;
+import javax.persistence.Column;
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.Table;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NonNull;
+import org.apache.commons.lang3.ObjectUtils;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopElement;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopOrderedState;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopState;
+import org.onap.policy.common.parameters.annotations.NotNull;
+import org.onap.policy.models.base.PfAuthorative;
+import org.onap.policy.models.base.PfConcept;
+import org.onap.policy.models.base.PfConceptKey;
+import org.onap.policy.models.base.PfKey;
+import org.onap.policy.models.base.PfReferenceKey;
+import org.onap.policy.models.base.validation.annotations.VerifyKey;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+/**
+ * Class to represent a participant control loop element in the database.
+ *
+ * @author Liam Fallon (liam.fallon@est.tech)
+ */
+@Entity
+@Table(name = "ControlLoopElement")
+@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class JpaControlLoopElement extends PfConcept implements PfAuthorative<ControlLoopElement> {
+    private static final long serialVersionUID = -1791732273187890213L;
+
+    @EmbeddedId
+    @VerifyKey
+    @NotNull
+    private PfReferenceKey key;
+
+    // @formatter:off
+    @VerifyKey
+    @NotNull
+    @AttributeOverride(name = "name",    column = @Column(name = "definition_name"))
+    @AttributeOverride(name = "version", column = @Column(name = "definition_version"))
+    private PfConceptKey definition;
+
+    @VerifyKey
+    @NotNull
+    @AttributeOverride(name = "name",    column = @Column(name = "participant_type_name"))
+    @AttributeOverride(name = "version", column = @Column(name = "participant_type_version"))
+    private PfConceptKey participantType;
+
+    @NotNull
+    @AttributeOverride(name = "name",    column = @Column(name = "participant_name"))
+    @AttributeOverride(name = "version", column = @Column(name = "participant_version"))
+    private PfConceptKey participantId;
+    // @formatter:on
+
+    @Column
+    @NotNull
+    private ControlLoopState state;
+
+    @Column
+    @NotNull
+    private ControlLoopOrderedState orderedState;
+
+    @Column
+    private String description;
+
+    /**
+     * The Default Constructor creates a {@link JpaControlLoopElement} object with a null key.
+     */
+    public JpaControlLoopElement() {
+        this(new PfReferenceKey());
+    }
+
+    /**
+     * The Key Constructor creates a {@link JpaControlLoopElement} object with the given concept key.
+     *
+     * @param key the key
+     */
+    public JpaControlLoopElement(@NonNull final PfReferenceKey key) {
+        this(key, new PfConceptKey(), new PfConceptKey(), ControlLoopState.UNINITIALISED);
+    }
+
+    /**
+     * The Key Constructor creates a {@link JpaControlLoopElement} object with all mandatory fields.
+     *
+     * @param key the key
+     * @param definition the TOSCA definition of the control loop element
+     * @param participantType the TOSCA definition of the participant running the control loop element
+     * @param state the state of the control loop
+     */
+    public JpaControlLoopElement(@NonNull final PfReferenceKey key, @NonNull final PfConceptKey definition,
+            @NonNull final PfConceptKey participantType, @NonNull final ControlLoopState state) {
+        this.key = key;
+        this.definition = definition;
+        this.participantType = participantType;
+        this.state = state;
+    }
+
+    /**
+     * Copy constructor.
+     *
+     * @param copyConcept the concept to copy from
+     */
+    public JpaControlLoopElement(@NonNull final JpaControlLoopElement copyConcept) {
+        super(copyConcept);
+        this.key = new PfReferenceKey(copyConcept.key);
+        this.definition = new PfConceptKey(copyConcept.definition);
+        this.participantType = new PfConceptKey(copyConcept.participantType);
+        this.participantId = new PfConceptKey(copyConcept.participantId);
+        this.state = copyConcept.state;
+        this.orderedState = copyConcept.orderedState;
+        this.description = copyConcept.description;
+    }
+
+    /**
+     * Authorative constructor.
+     *
+     * @param authorativeConcept the authorative concept to copy from
+     */
+    public JpaControlLoopElement(@NonNull final ControlLoopElement authorativeConcept) {
+        this.fromAuthorative(authorativeConcept);
+    }
+
+    @Override
+    public ControlLoopElement toAuthorative() {
+        ControlLoopElement element = new ControlLoopElement();
+
+        element.setId(UUID.fromString(getKey().getLocalName()));
+        element.setDefinition(new ToscaConceptIdentifier(definition));
+        element.setParticipantType(new ToscaConceptIdentifier(participantType));
+        element.setParticipantId(new ToscaConceptIdentifier(participantId));
+        element.setState(state);
+        element.setOrderedState(orderedState != null ? orderedState : state.asOrderedState());
+        element.setDescription(description);
+
+        return element;
+    }
+
+    @Override
+    public void fromAuthorative(@NonNull final ControlLoopElement element) {
+        if (this.key == null || this.getKey().isNullKey()) {
+            this.setKey(new PfReferenceKey());
+            getKey().setLocalName(element.getId().toString());
+        }
+
+        this.definition = element.getDefinition().asConceptKey();
+        this.participantType = element.getParticipantType().asConceptKey();
+        this.participantId = element.getParticipantId().asConceptKey();
+        this.state = element.getState();
+        this.orderedState = element.getOrderedState();
+        this.description = element.getDescription();
+    }
+
+    @Override
+    public List<PfKey> getKeys() {
+        List<PfKey> keyList = getKey().getKeys();
+
+        keyList.add(definition);
+        keyList.add(participantType);
+        keyList.add(participantId);
+
+        return keyList;
+    }
+
+    @Override
+    public void clean() {
+        key.clean();
+        definition.clean();
+        participantType.clean();
+        participantId.clean();
+
+        if (description != null) {
+            description = description.trim();
+        }
+    }
+
+    @Override
+    public int compareTo(final PfConcept otherConcept) {
+        if (otherConcept == null) {
+            return -1;
+        }
+        if (this == otherConcept) {
+            return 0;
+        }
+        if (getClass() != otherConcept.getClass()) {
+            return this.getClass().getName().compareTo(otherConcept.getClass().getName());
+        }
+
+        final JpaControlLoopElement other = (JpaControlLoopElement) otherConcept;
+        int result = key.compareTo(other.key);
+        if (result != 0) {
+            return result;
+        }
+
+        result = definition.compareTo(other.definition);
+        if (result != 0) {
+            return result;
+        }
+
+        result = participantType.compareTo(other.participantType);
+        if (result != 0) {
+            return result;
+        }
+
+        result = participantId.compareTo(other.participantId);
+        if (result != 0) {
+            return result;
+        }
+
+        result = ObjectUtils.compare(state, other.state);
+        if (result != 0) {
+            return result;
+        }
+
+        result = ObjectUtils.compare(orderedState, other.orderedState);
+        if (result != 0) {
+            return result;
+        }
+
+        return ObjectUtils.compare(description, other.description);
+    }
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaParticipant.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaParticipant.java
new file mode 100644
index 0000000..69b5652
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaParticipant.java
@@ -0,0 +1,220 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.models.controlloop.persistence.concepts;
+
+import java.io.Serializable;
+import java.util.List;
+import javax.persistence.AttributeOverride;
+import javax.persistence.AttributeOverrides;
+import javax.persistence.Column;
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.Table;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NonNull;
+import org.apache.commons.lang3.ObjectUtils;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.Participant;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantHealthStatus;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantState;
+import org.onap.policy.common.parameters.annotations.NotNull;
+import org.onap.policy.models.base.PfAuthorative;
+import org.onap.policy.models.base.PfConcept;
+import org.onap.policy.models.base.PfConceptKey;
+import org.onap.policy.models.base.PfKey;
+import org.onap.policy.models.base.validation.annotations.VerifyKey;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+/**
+ * Class to represent a participant in the database.
+ *
+ * @author Liam Fallon (liam.fallon@est.tech)
+ */
+@Entity
+@Table(name = "Participant")
+@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class JpaParticipant extends PfConcept implements PfAuthorative<Participant>, Serializable {
+    private static final long serialVersionUID = -4697758484642403483L;
+
+    @EmbeddedId
+    @VerifyKey
+    @NotNull
+    private PfConceptKey key;
+
+    // @formatter:off
+    @VerifyKey
+    @NotNull
+    @AttributeOverrides({
+            @AttributeOverride(name = "name",    column = @Column(name = "definition_name")),
+            @AttributeOverride(name = "version", column = @Column(name = "definition_version"))
+        }
+    )
+    private PfConceptKey definition;
+    // @formatter:on
+
+    @Column
+    @NotNull
+    private ParticipantState participantState;
+
+    @Column
+    @NotNull
+    private ParticipantHealthStatus healthStatus;
+
+    @Column
+    private String description;
+
+    /**
+     * The Default Constructor creates a {@link JpaParticipant} object with a null key.
+     */
+    public JpaParticipant() {
+        this(new PfConceptKey());
+    }
+
+    /**
+     * The Key Constructor creates a {@link JpaParticipant} object with the given concept key.
+     *
+     * @param key the key
+     */
+    public JpaParticipant(@NonNull final PfConceptKey key) {
+        this(key, new PfConceptKey(), ParticipantState.PASSIVE, ParticipantHealthStatus.UNKNOWN);
+    }
+
+    /**
+     * The Key Constructor creates a {@link JpaParticipant} object with all mandatory fields.
+     *
+     * @param key the key
+     * @param definition the TOSCA definition of the participant
+     * @param participantState the state of the participant
+     * @param healthStatus the health state of the participant
+     */
+    public JpaParticipant(@NonNull final PfConceptKey key, @NonNull final PfConceptKey definition,
+            @NonNull final ParticipantState participantState, @NonNull ParticipantHealthStatus healthStatus) {
+        this.key = key;
+        this.definition = definition;
+        this.participantState = participantState;
+        this.healthStatus = healthStatus;
+    }
+
+    /**
+     * Copy constructor.
+     *
+     * @param copyConcept the concept to copy from
+     */
+    public JpaParticipant(@NonNull final JpaParticipant copyConcept) {
+        super(copyConcept);
+        this.key = new PfConceptKey(copyConcept.key);
+        this.definition = new PfConceptKey(copyConcept.definition);
+        this.participantState = copyConcept.participantState;
+        this.healthStatus = copyConcept.healthStatus;
+        this.description = copyConcept.description;
+    }
+
+    /**
+     * Authorative constructor.
+     *
+     * @param authorativeConcept the authorative concept to copy from
+     */
+    public JpaParticipant(@NonNull final Participant authorativeConcept) {
+        this.fromAuthorative(authorativeConcept);
+    }
+
+    @Override
+    public Participant toAuthorative() {
+        Participant participant = new Participant();
+
+        participant.setName(key.getName());
+        participant.setVersion(key.getVersion());
+        participant.setDefinition(new ToscaConceptIdentifier(definition));
+        participant.setParticipantState(participantState);
+        participant.setHealthStatus(healthStatus);
+        participant.setDescription(description);
+
+        return participant;
+    }
+
+    @Override
+    public void fromAuthorative(@NonNull final Participant participant) {
+        if (this.key == null || this.getKey().isNullKey()) {
+            this.setKey(new PfConceptKey(participant.getName(), participant.getVersion()));
+        }
+
+        this.definition = participant.getDefinition().asConceptKey();
+        this.setParticipantState(participant.getParticipantState());
+        this.setHealthStatus(participant.getHealthStatus());
+        this.setDescription(participant.getDescription());
+    }
+
+    @Override
+    public List<PfKey> getKeys() {
+        List<PfKey> keyList = getKey().getKeys();
+
+        keyList.add(definition);
+
+        return keyList;
+    }
+
+    @Override
+    public void clean() {
+        key.clean();
+        definition.clean();
+        description = (description == null ? null : description.trim());
+    }
+
+    @Override
+    public int compareTo(final PfConcept otherConcept) {
+        if (otherConcept == null) {
+            return -1;
+        }
+        if (this == otherConcept) {
+            return 0;
+        }
+        if (getClass() != otherConcept.getClass()) {
+            return getClass().getName().compareTo(otherConcept.getClass().getName());
+        }
+
+        final JpaParticipant other = (JpaParticipant) otherConcept;
+        int result = key.compareTo(other.key);
+        if (result != 0) {
+            return result;
+        }
+
+        result = definition.compareTo(other.definition);
+        if (result != 0) {
+            return result;
+        }
+
+        result = ObjectUtils.compare(participantState, other.participantState);
+        if (result != 0) {
+            return result;
+        }
+
+        result = ObjectUtils.compare(healthStatus, other.healthStatus);
+        if (result != 0) {
+            return result;
+        }
+
+        return ObjectUtils.compare(description, other.description);
+    }
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaParticipantStatistics.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaParticipantStatistics.java
new file mode 100644
index 0000000..b97f9ed
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaParticipantStatistics.java
@@ -0,0 +1,237 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.models.controlloop.persistence.concepts;
+
+import java.io.Serializable;
+import java.util.List;
+import javax.persistence.AttributeOverride;
+import javax.persistence.Column;
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.Table;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NonNull;
+import org.apache.commons.lang3.builder.CompareToBuilder;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantHealthStatus;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantState;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantStatistics;
+import org.onap.policy.common.parameters.annotations.NotNull;
+import org.onap.policy.models.base.PfAuthorative;
+import org.onap.policy.models.base.PfConcept;
+import org.onap.policy.models.base.PfConceptKey;
+import org.onap.policy.models.base.PfKey;
+import org.onap.policy.models.base.PfTimestampKey;
+import org.onap.policy.models.base.validation.annotations.VerifyKey;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+/**
+ * Class to represent a control loop statistics in the database.
+ *
+ * @author Ramesh Murugan Iyer (ramesh.murugan.iyer@est.tech)
+ */
+@Entity
+@Table(name = "ParticipantStatistics")
+@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
+@Data
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = false)
+public class JpaParticipantStatistics extends PfConcept implements PfAuthorative<ParticipantStatistics>, Serializable {
+
+    private static final long serialVersionUID = -5992214428190133190L;
+
+    @EmbeddedId
+    @VerifyKey
+    @NotNull
+    private PfTimestampKey key;
+
+    @VerifyKey
+    @NotNull
+    @AttributeOverride(name = "name", column = @Column(name = "participant_name"))
+    @AttributeOverride(name = "version", column = @Column(name = "participant_version"))
+    private PfConceptKey participantId;
+
+    @Column
+    @NotNull
+    private ParticipantState state;
+
+    @Column
+    @NotNull
+    private ParticipantHealthStatus healthStatus;
+
+    @Column
+    private long eventCount;
+
+    @Column
+    private long lastExecutionTime;
+
+    @Column
+    private double averageExecutionTime;
+
+    @Column
+    private long upTime;
+
+    @Column
+    private long lastEnterTime;
+
+    @Column
+    private long lastStart;
+
+
+    /**
+     * The Default Constructor creates a {@link JpaParticipantStatistics} object with a null key.
+     */
+    public JpaParticipantStatistics() {
+        this(new PfTimestampKey());
+    }
+
+    /**
+     * The Key Constructor creates a {@link JpaParticipantStatistics} object with the given Timestamp key.
+     *
+     * @param key the key
+     */
+    public JpaParticipantStatistics(@NonNull final PfTimestampKey key) {
+        this(key, new PfConceptKey(), ParticipantState.PASSIVE, ParticipantHealthStatus.HEALTHY, 0L, 0L, 0.0d, 0L, 0L,
+                0L);
+    }
+
+
+    /**
+     * The Key Constructor creates a {@link JpaParticipantStatistics} object with all mandatory fields.
+     *
+     * @param key the key
+     * @param participantId the TOSCA definition of the control loop participant
+     */
+    public JpaParticipantStatistics(@NonNull final PfTimestampKey key, @NonNull final PfConceptKey participantId) {
+        this.key = key;
+        this.participantId = participantId;
+    }
+
+
+    /**
+     * Copy constructor.
+     *
+     * @param copyConcept the concept to copy from
+     */
+    public JpaParticipantStatistics(@NonNull final JpaParticipantStatistics copyConcept) {
+        super(copyConcept);
+        this.key = new PfTimestampKey(copyConcept.key);
+        this.participantId = new PfConceptKey(copyConcept.participantId);
+        this.state = copyConcept.state;
+        this.healthStatus = copyConcept.healthStatus;
+        this.eventCount = copyConcept.eventCount;
+        this.lastExecutionTime = copyConcept.lastExecutionTime;
+        this.averageExecutionTime = copyConcept.averageExecutionTime;
+        this.upTime = copyConcept.upTime;
+        this.lastEnterTime = copyConcept.lastEnterTime;
+        this.lastStart = copyConcept.lastStart;
+    }
+
+    /**
+     * Authorative constructor.
+     *
+     * @param authorativeConcept the authorative concept to copy from
+     */
+    public JpaParticipantStatistics(@NonNull final ParticipantStatistics authorativeConcept) {
+        this.fromAuthorative(authorativeConcept);
+    }
+
+
+    @Override
+    public int compareTo(PfConcept otherConcept) {
+        if (otherConcept == null) {
+            return -1;
+        }
+        if (this == otherConcept) {
+            return 0;
+        }
+        if (getClass() != otherConcept.getClass()) {
+            return getClass().getName().compareTo(otherConcept.getClass().getName());
+        }
+
+        final JpaParticipantStatistics other = (JpaParticipantStatistics) otherConcept;
+        // @formatter:off
+        return new CompareToBuilder()
+                .append(this.key, other.key)
+                .append(this.participantId, other.participantId)
+                .append(this.state, other.state)
+                .append(this.healthStatus, other.healthStatus)
+                .append(this.eventCount, other.eventCount)
+                .append(this.lastExecutionTime, other.lastExecutionTime)
+                .append(this.averageExecutionTime, other.averageExecutionTime)
+                .append(this.upTime, other.upTime)
+                .append(this.lastEnterTime, other.lastEnterTime)
+                .append(this.lastStart, other.lastStart).toComparison();
+        // @formatter:on
+    }
+
+    @Override
+    public ParticipantStatistics toAuthorative() {
+        ParticipantStatistics participantStatistics = new ParticipantStatistics();
+        participantStatistics.setTimeStamp(key.getTimeStamp().toInstant());
+        participantStatistics.setParticipantId(new ToscaConceptIdentifier(participantId));
+        participantStatistics.setState(state);
+        participantStatistics.setHealthStatus(healthStatus);
+        participantStatistics.setAverageExecutionTime(averageExecutionTime);
+        participantStatistics.setEventCount(eventCount);
+        participantStatistics.setLastExecutionTime(lastExecutionTime);
+        participantStatistics.setUpTime(upTime);
+        participantStatistics.setLastEnterTime(lastEnterTime);
+        participantStatistics.setLastStart(lastStart);
+
+        return participantStatistics;
+    }
+
+    @Override
+    public void fromAuthorative(@NonNull final ParticipantStatistics participantStatistics) {
+        if (this.key == null || this.getKey().isNullKey()) {
+            this.setKey(new PfTimestampKey(participantStatistics.getParticipantId().getName(),
+                    participantStatistics.getParticipantId().getVersion(), participantStatistics.getTimeStamp()));
+        }
+        this.setParticipantId(participantStatistics.getParticipantId().asConceptKey());
+        this.setState(participantStatistics.getState());
+        this.setHealthStatus(participantStatistics.getHealthStatus());
+        this.setAverageExecutionTime(participantStatistics.getAverageExecutionTime());
+        this.setEventCount(participantStatistics.getEventCount());
+        this.setLastExecutionTime(participantStatistics.getLastExecutionTime());
+        this.setUpTime(participantStatistics.getUpTime());
+        this.setLastEnterTime(participantStatistics.getLastEnterTime());
+        this.setLastStart(participantStatistics.getLastStart());
+
+    }
+
+    @Override
+    public List<PfKey> getKeys() {
+        List<PfKey> keyList = getKey().getKeys();
+        keyList.addAll(participantId.getKeys());
+        return keyList;
+    }
+
+    @Override
+    public void clean() {
+        key.clean();
+        participantId.clean();
+    }
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ClElementStatisticsProvider.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ClElementStatisticsProvider.java
new file mode 100644
index 0000000..8a06cbf
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ClElementStatisticsProvider.java
@@ -0,0 +1,154 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.models.controlloop.persistence.provider;
+
+import java.time.Instant;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+import javax.ws.rs.core.Response;
+import lombok.NonNull;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ClElementStatistics;
+import org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaClElementStatistics;
+import org.onap.policy.common.parameters.BeanValidationResult;
+import org.onap.policy.models.base.PfModelException;
+import org.onap.policy.models.base.PfModelRuntimeException;
+import org.onap.policy.models.base.PfReferenceTimestampKey;
+import org.onap.policy.models.provider.PolicyModelsProviderParameters;
+import org.onap.policy.models.provider.impl.AbstractModelsProvider;
+
+/**
+ * This class provides the provision of information on control loop element statistics in the database to callers.
+ *
+ * @author Ramesh Murugan Iyer (ramesh.murugan.iyer@est.tech)
+ */
+public class ClElementStatisticsProvider extends AbstractModelsProvider {
+
+    /**
+     * Create a provider for control loop element statistics.
+     *
+     * @param parameters the parameters for database access
+     * @throws PfModelException on initiation errors
+     */
+    public ClElementStatisticsProvider(@NonNull PolicyModelsProviderParameters parameters) throws PfModelException {
+        super(parameters);
+        this.init();
+    }
+
+    /**
+     * Creates control loop element statistics.
+     *
+     * @param clElementStatisticsList a specification of the CL element statistics to create
+     * @return the clElement statistics created
+     * @throws PfModelException on errors creating clElement statistics
+     */
+    public List<ClElementStatistics> createClElementStatistics(
+            @NonNull final List<ClElementStatistics> clElementStatisticsList) throws PfModelException {
+
+        BeanValidationResult validationResult =
+                new BeanValidationResult("control loop element statistics list", clElementStatisticsList);
+        for (ClElementStatistics clElementStatistics : clElementStatisticsList) {
+            JpaClElementStatistics jpaClElementStatistics = new JpaClElementStatistics();
+            jpaClElementStatistics.fromAuthorative(clElementStatistics);
+
+            validationResult.addResult(jpaClElementStatistics.validate("control loop element statistics"));
+        }
+
+        if (!validationResult.isValid()) {
+            throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, validationResult.getResult());
+        }
+
+        for (ClElementStatistics clElementStatistics : clElementStatisticsList) {
+            JpaClElementStatistics jpaClElementStatistics = new JpaClElementStatistics();
+            jpaClElementStatistics.fromAuthorative(clElementStatistics);
+            getPfDao().create(jpaClElementStatistics);
+        }
+
+        // Return the created control loop element statistics
+        List<ClElementStatistics> elementStatistics = new ArrayList<>(clElementStatisticsList.size());
+
+        for (ClElementStatistics clElementStat : clElementStatisticsList) {
+            JpaClElementStatistics jpaClElementStatistics = getPfDao().get(JpaClElementStatistics.class,
+                new PfReferenceTimestampKey(clElementStat.getParticipantId().getName(),
+                    clElementStat.getParticipantId().getVersion(), clElementStat.getId().toString(),
+                    clElementStat.getTimeStamp()));
+            elementStatistics.add(jpaClElementStatistics.toAuthorative());
+        }
+
+        return elementStatistics;
+    }
+
+    /**
+     * Convert JPA clElement statistics list to clElement statistics list.
+     *
+     * @param jpaClElementStatistics the list to convert
+     * @return the clElement statistics list
+     */
+    private List<ClElementStatistics> asClElementStatisticsList(List<JpaClElementStatistics> jpaClElementStatistics) {
+        return jpaClElementStatistics.stream().map(JpaClElementStatistics::toAuthorative).collect(Collectors.toList());
+    }
+
+    /**
+     * Get clElement statistics.
+     *
+     * @param name the name of the participant
+     * @param version version of the participant
+     * @param id of the control loop element
+     * @param timestamp timestamp of the statistics
+     * @return the clElement statistics found
+     * @throws PfModelException on errors getting clElement statistics
+     */
+    public List<ClElementStatistics> getClElementStatistics(final String name, final String version, final String id,
+            final Instant timestamp) throws PfModelException {
+        List<ClElementStatistics> clElementStatistics = new ArrayList<>(1);
+        if (name != null && version != null && timestamp != null && id != null) {
+            clElementStatistics.add(getPfDao()
+                .get(JpaClElementStatistics.class, new PfReferenceTimestampKey(name, version, id, timestamp))
+                .toAuthorative());
+            return clElementStatistics;
+        } else if (name != null) {
+            clElementStatistics.addAll(getFilteredClElementStatistics(name, version, null, null, null,
+                "DESC", 0));
+        } else {
+            clElementStatistics.addAll(asClElementStatisticsList(getPfDao().getAll(JpaClElementStatistics.class)));
+        }
+        return  clElementStatistics;
+    }
+
+    /**
+     * Get filtered clElement statistics.
+     *
+     * @param name the clElement name for the statistics to get
+     * @param startTimeStamp startTimeStamp to filter statistics
+     * @param endTimeStamp endTimeStamp to filter statistics
+     * @param sortOrder sortOrder to query database
+     * @param getRecordNum Total query count from database
+     * @return the clElement statistics found
+     * @throws PfModelException on errors getting policies
+     */
+    public List<ClElementStatistics> getFilteredClElementStatistics(final String name, final String version,
+            final Instant startTimeStamp, final Instant endTimeStamp, Map<String, Object> filterMap,
+            final String sortOrder, final int getRecordNum) {
+        return asClElementStatisticsList(getPfDao().getFiltered(JpaClElementStatistics.class, name, version,
+                startTimeStamp, endTimeStamp, filterMap, sortOrder, getRecordNum));
+    }
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ControlLoopProvider.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ControlLoopProvider.java
new file mode 100644
index 0000000..520e9b8
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ControlLoopProvider.java
@@ -0,0 +1,248 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.models.controlloop.persistence.provider;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+import javax.ws.rs.core.Response;
+import lombok.NonNull;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoop;
+import org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaControlLoop;
+import org.onap.policy.common.parameters.BeanValidationResult;
+import org.onap.policy.models.base.PfAuthorative;
+import org.onap.policy.models.base.PfConceptKey;
+import org.onap.policy.models.base.PfKey;
+import org.onap.policy.models.base.PfModelException;
+import org.onap.policy.models.base.PfModelRuntimeException;
+import org.onap.policy.models.provider.PolicyModelsProviderParameters;
+import org.onap.policy.models.provider.impl.AbstractModelsProvider;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaEntity;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaTypedEntityFilter;
+import org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeTemplate;
+
+/**
+ * This class provides information on control loop concepts in the database to callers.
+ */
+public class ControlLoopProvider extends AbstractModelsProvider {
+
+    /**
+     * Create a provider for control loops.
+     *
+     * @param parameters the parameters for database access
+     * @throws PfModelException on initiation errors
+     */
+    public ControlLoopProvider(@NonNull PolicyModelsProviderParameters parameters) throws PfModelException {
+        super(parameters);
+        this.init();
+    }
+
+    /**
+     * Get Control Loop.
+     *
+     * @param controlLoopId the ID of the control loop to get
+     * @return the control loop found
+     * @throws PfModelException on errors getting the control loop
+     */
+    public ControlLoop getControlLoop(final ToscaConceptIdentifier controlLoopId) throws PfModelException {
+        JpaControlLoop jpaControlLoop = getPfDao().get(JpaControlLoop.class, controlLoopId.asConceptKey());
+
+        return jpaControlLoop == null ? null : jpaControlLoop.toAuthorative();
+    }
+
+    /**
+     * Update Control Loop.
+     *
+     * @param controlLoop the control loop to update
+     * @return the updated control loop
+     * @throws PfModelException on errors updating the control loop
+     */
+    public ControlLoop updateControlLoop(final ControlLoop controlLoop) throws PfModelException {
+        return updateControlLoops(Collections.singletonList(controlLoop)).get(0);
+    }
+
+    /**
+     * Get Control Loops.
+     *
+     * @param name the name of the control loop to get, null to get all control loops
+     * @param version the version of the control loop to get, null to get all control loops
+     * @return the control loops found
+     * @throws PfModelException on errors getting control loops
+     */
+    public List<ControlLoop> getControlLoops(final String name, final String version) throws PfModelException {
+
+        return asEntityList(getPfDao().getFiltered(JpaControlLoop.class, name, version));
+    }
+
+    /**
+     * Get filtered control loops.
+     *
+     * @param filter the filter for the control loops to get
+     * @return the control loops found
+     * @throws PfModelException on errors getting control loops
+     */
+    public List<ControlLoop> getFilteredControlLoops(@NonNull final ToscaTypedEntityFilter<ControlLoop> filter) {
+
+        return filter.filter(
+                asEntityList(getPfDao().getFiltered(JpaControlLoop.class, filter.getName(), PfKey.NULL_KEY_VERSION)));
+    }
+
+    /**
+     * Creates control loops.
+     *
+     * @param controlLoops a specification of the control loops to create
+     * @return the control loops created
+     * @throws PfModelException on errors creating control loops
+     */
+    public List<ControlLoop> createControlLoops(@NonNull final List<ControlLoop> controlLoops) throws PfModelException {
+
+        BeanValidationResult validationResult = new BeanValidationResult("control loops", controlLoops);
+
+        for (ControlLoop controlLoop : controlLoops) {
+            JpaControlLoop jpaControlLoop = new JpaControlLoop();
+            jpaControlLoop.fromAuthorative(controlLoop);
+
+            validationResult.addResult(jpaControlLoop.validate("control loop"));
+        }
+
+        if (!validationResult.isValid()) {
+            throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, validationResult.getResult());
+        }
+
+        for (ControlLoop controlLoop : controlLoops) {
+            JpaControlLoop jpaControlLoop = new JpaControlLoop();
+            jpaControlLoop.fromAuthorative(controlLoop);
+
+            getPfDao().create(jpaControlLoop);
+        }
+
+        // Return the created control loops
+        List<ControlLoop> returnControlLoops = new ArrayList<>(controlLoops.size());
+
+        for (ControlLoop controlLoop : controlLoops) {
+            JpaControlLoop jpaControlLoop = getPfDao().get(JpaControlLoop.class,
+                    new PfConceptKey(controlLoop.getName(), controlLoop.getVersion()));
+            returnControlLoops.add(jpaControlLoop.toAuthorative());
+        }
+
+        return returnControlLoops;
+    }
+
+    /**
+     * Updates control loops.
+     *
+     * @param controlLoops a specification of the control loops to update
+     * @return the control loops updated
+     * @throws PfModelException on errors updating control loops
+     */
+    public List<ControlLoop> updateControlLoops(@NonNull final List<ControlLoop> controlLoops) throws PfModelException {
+
+        BeanValidationResult validationResult = new BeanValidationResult("control loops", controlLoops);
+
+        for (ControlLoop controlLoop : controlLoops) {
+            JpaControlLoop jpaControlLoop = new JpaControlLoop();
+            jpaControlLoop.fromAuthorative(controlLoop);
+
+            validationResult.addResult(jpaControlLoop.validate("control loop"));
+        }
+
+        if (!validationResult.isValid()) {
+            throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, validationResult.getResult());
+        }
+
+        // Return the created control loops
+        List<ControlLoop> returnControlLoops = new ArrayList<>(controlLoops.size());
+
+        for (ControlLoop controlLoop : controlLoops) {
+            JpaControlLoop jpaControlLoop = new JpaControlLoop();
+            jpaControlLoop.fromAuthorative(controlLoop);
+
+            JpaControlLoop returnJpaControlLoop = getPfDao().update(jpaControlLoop);
+            returnControlLoops.add(returnJpaControlLoop.toAuthorative());
+        }
+
+        return returnControlLoops;
+    }
+
+    /**
+     * Delete a control loop.
+     *
+     * @param name the name of the control loop to delete
+     * @param version the version of the control loop to delete
+     * @return the control loop deleted
+     * @throws PfModelException on errors deleting the control loop
+     */
+    public ControlLoop deleteControlLoop(@NonNull final String name, @NonNull final String version) {
+
+        PfConceptKey controlLoopKey = new PfConceptKey(name, version);
+
+        JpaControlLoop jpaDeleteControlLoop = getPfDao().get(JpaControlLoop.class, controlLoopKey);
+
+        if (jpaDeleteControlLoop == null) {
+            String errorMessage =
+                    "delete of control loop \"" + controlLoopKey.getId() + "\" failed, control loop does not exist";
+            throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, errorMessage);
+        }
+
+        getPfDao().delete(jpaDeleteControlLoop);
+
+        return jpaDeleteControlLoop.toAuthorative();
+    }
+
+    /**
+     * Get Node Templates.
+     *
+     * @param name the name of the node template to get, null to get all node templates
+     * @param version the version of the node template to get, null to get all node templates
+     * @return the node templates found
+     * @throws PfModelException on errors getting node templates
+     */
+    public List<ToscaNodeTemplate> getNodeTemplates(final String name, final String version) {
+        return asEntityList(getPfDao().getFiltered(JpaToscaNodeTemplate.class, name, version));
+    }
+
+    /**
+     * Get filtered node templates.
+     *
+     * @param filter the filter for the node templates to get
+     * @return the node templates found
+     * @throws PfModelException on errors getting node templates
+     */
+    public List<ToscaNodeTemplate> getFilteredNodeTemplates(
+            @NonNull final ToscaTypedEntityFilter<ToscaNodeTemplate> filter) {
+
+        return filter.filter(asEntityList(
+                getPfDao().getFiltered(JpaToscaNodeTemplate.class, filter.getName(), filter.getVersion())));
+    }
+
+    /**
+     * Convert JPA control loop list to an authorative control loop list.
+     *
+     * @param jpaEntityList the list to convert
+     * @return the authorative list
+     */
+    private <T extends ToscaEntity, J extends PfAuthorative<T>> List<T> asEntityList(List<J> jpaEntityList) {
+        return jpaEntityList.stream().map(J::toAuthorative).collect(Collectors.toList());
+    }
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ParticipantProvider.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ParticipantProvider.java
new file mode 100644
index 0000000..e82956f
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ParticipantProvider.java
@@ -0,0 +1,195 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.models.controlloop.persistence.provider;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+import javax.ws.rs.core.Response;
+import lombok.NonNull;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.Participant;
+import org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaParticipant;
+import org.onap.policy.common.parameters.BeanValidationResult;
+import org.onap.policy.models.base.PfConceptKey;
+import org.onap.policy.models.base.PfModelException;
+import org.onap.policy.models.base.PfModelRuntimeException;
+import org.onap.policy.models.provider.PolicyModelsProviderParameters;
+import org.onap.policy.models.provider.impl.AbstractModelsProvider;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaTypedEntityFilter;
+
+/**
+ * This class provides information on participant concepts in the database to callers.
+ */
+public class ParticipantProvider extends AbstractModelsProvider {
+    /**
+     * Create a provider for participants.
+     *
+     * @param parameters the parameters for database access
+     * @throws PfModelException on initiation errors
+     */
+    public ParticipantProvider(@NonNull PolicyModelsProviderParameters parameters) throws PfModelException {
+        super(parameters);
+        this.init();
+    }
+
+    /**
+     * Get participants.
+     *
+     * @param name the name of the participant to get, null to get all participants
+     * @param version the version of the participant to get, null to get all participants
+     * @return the participants found
+     * @throws PfModelException on errors getting participants
+     */
+    public List<Participant> getParticipants(final String name, final String version) throws PfModelException {
+
+        return asParticipantList(getPfDao().getFiltered(JpaParticipant.class, name, version));
+    }
+
+    /**
+     * Get filtered participants.
+     *
+     * @param filter the filter for the participants to get
+     * @return the participants found
+     * @throws PfModelException on errors getting policies
+     */
+    public List<Participant> getFilteredParticipants(@NonNull final ToscaTypedEntityFilter<Participant> filter) {
+
+        return filter.filter(asParticipantList(
+                getPfDao().getFiltered(JpaParticipant.class, filter.getName(), filter.getVersion())));
+    }
+
+    /**
+     * Creates participants.
+     *
+     * @param participants a specification of the participants to create
+     * @return the participants created
+     * @throws PfModelException on errors creating participants
+     */
+    public List<Participant> createParticipants(@NonNull final List<Participant> participants) throws PfModelException {
+
+        BeanValidationResult validationResult = new BeanValidationResult("participants", participants);
+
+        for (Participant participant : participants) {
+            JpaParticipant jpaParticipant = new JpaParticipant();
+            jpaParticipant.fromAuthorative(participant);
+
+            validationResult.addResult(jpaParticipant.validate("participant"));
+        }
+
+        if (!validationResult.isValid()) {
+            throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, validationResult.getResult());
+        }
+
+        for (Participant participant : participants) {
+            JpaParticipant jpaParticipant = new JpaParticipant();
+            jpaParticipant.fromAuthorative(participant);
+
+            getPfDao().create(jpaParticipant);
+        }
+
+        // Return the created participants
+        List<Participant> returnParticipants = new ArrayList<>(participants.size());
+
+        for (Participant participant : participants) {
+            JpaParticipant jpaParticipant = getPfDao().get(JpaParticipant.class,
+                    new PfConceptKey(participant.getName(), participant.getVersion()));
+            returnParticipants.add(jpaParticipant.toAuthorative());
+        }
+
+        return returnParticipants;
+    }
+
+    /**
+     * Updates participants.
+     *
+     * @param participants a specification of the participants to update
+     * @return the participants updated
+     * @throws PfModelException on errors updating participants
+     */
+    public List<Participant> updateParticipants(@NonNull final List<Participant> participants) throws PfModelException {
+
+        BeanValidationResult validationResult = new BeanValidationResult("participants", participants);
+
+        for (Participant participant : participants) {
+            JpaParticipant jpaParticipant = new JpaParticipant();
+            jpaParticipant.fromAuthorative(participant);
+
+            validationResult.addResult(jpaParticipant.validate("participant"));
+        }
+
+        if (!validationResult.isValid()) {
+            throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, validationResult.getResult());
+        }
+
+        for (Participant participant : participants) {
+            JpaParticipant jpaParticipant = new JpaParticipant();
+            jpaParticipant.fromAuthorative(participant);
+
+            getPfDao().update(jpaParticipant);
+        }
+
+        // Return the created participants
+        List<Participant> returnParticipants = new ArrayList<>(participants.size());
+
+        for (Participant participant : participants) {
+            JpaParticipant jpaParticipant = getPfDao().get(JpaParticipant.class,
+                    new PfConceptKey(participant.getName(), participant.getVersion()));
+            returnParticipants.add(jpaParticipant.toAuthorative());
+        }
+
+        return returnParticipants;
+    }
+
+    /**
+     * Delete a participant.
+     *
+     * @param name the name of the participant to delete
+     * @param version the version of the participant to get
+     * @return the participant deleted
+     * @throws PfModelException on errors deleting participants
+     */
+    public Participant deleteParticipant(@NonNull final String name, @NonNull final String version) {
+
+        PfConceptKey participantKey = new PfConceptKey(name, version);
+
+        JpaParticipant jpaDeleteParticipant = getPfDao().get(JpaParticipant.class, participantKey);
+
+        if (jpaDeleteParticipant == null) {
+            String errorMessage =
+                    "delete of participant \"" + participantKey.getId() + "\" failed, participant does not exist";
+            throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, errorMessage);
+        }
+
+        getPfDao().delete(jpaDeleteParticipant);
+
+        return jpaDeleteParticipant.toAuthorative();
+    }
+
+    /**
+     * Convert JPA participant list to an authorative participant list.
+     *
+     * @param foundParticipants the list to convert
+     * @return the authorative list
+     */
+    private List<Participant> asParticipantList(List<JpaParticipant> jpaParticipantList) {
+        return jpaParticipantList.stream().map(JpaParticipant::toAuthorative).collect(Collectors.toList());
+    }
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ParticipantStatisticsProvider.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ParticipantStatisticsProvider.java
new file mode 100644
index 0000000..6b07527
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ParticipantStatisticsProvider.java
@@ -0,0 +1,159 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.models.controlloop.persistence.provider;
+
+import java.time.Instant;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+import javax.ws.rs.core.Response;
+import lombok.NonNull;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantStatistics;
+import org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaParticipantStatistics;
+import org.onap.policy.common.parameters.BeanValidationResult;
+import org.onap.policy.models.base.PfModelException;
+import org.onap.policy.models.base.PfModelRuntimeException;
+import org.onap.policy.models.base.PfTimestampKey;
+import org.onap.policy.models.provider.PolicyModelsProviderParameters;
+import org.onap.policy.models.provider.impl.AbstractModelsProvider;
+
+/**
+ * This class provides the provision of information on participant statistics in the database to callers.
+ *
+ * @author Ramesh Murugan Iyer (ramesh.murugan.iyer@est.tech)
+ */
+public class ParticipantStatisticsProvider extends AbstractModelsProvider {
+
+    /**
+     * Create a provider for control loops statistics.
+     *
+     * @param parameters the parameters for database access
+     * @throws PfModelException on initiation errors
+     */
+    public ParticipantStatisticsProvider(@NonNull PolicyModelsProviderParameters parameters) throws PfModelException {
+        super(parameters);
+        this.init();
+    }
+
+    /**
+     * Get Participant statistics.
+     *
+     * @param name the name of the participant statistics to get, null to get all stats
+     * @return the participant statistics found
+     * @throws PfModelException on errors getting participant statistics
+     */
+    public List<ParticipantStatistics> getParticipantStatistics(final String name, final String version,
+            final Instant timestamp) throws PfModelException {
+
+        if (name != null && version != null && timestamp != null) {
+            List<ParticipantStatistics> participantStatistics = new ArrayList<>(1);
+            participantStatistics.add(getPfDao()
+                    .get(JpaParticipantStatistics.class, new PfTimestampKey(name, version, timestamp)).toAuthorative());
+            return participantStatistics;
+        } else if (name != null) {
+            return getFilteredParticipantStatistics(name, version, timestamp, null, null,
+                "DESC", 0);
+        } else {
+            return asParticipantStatisticsList(getPfDao().getAll(JpaParticipantStatistics.class));
+        }
+    }
+
+
+    /**
+     * Get filtered participant statistics.
+     *
+     * @param name the participant name for the statistics to get
+     * @param startTimeStamp startTimeStamp to filter statistics
+     * @param endTimeStamp endTimeStamp to filter statistics
+     * @param sortOrder sortOrder to query database
+     * @param getRecordNum Total query count from database
+     * @return the participant statistics found
+     * @throws PfModelException on errors getting policies
+     */
+    public List<ParticipantStatistics> getFilteredParticipantStatistics(final String name, final String version,
+            final Instant startTimeStamp, final Instant endTimeStamp, Map<String, Object> filterMap,
+            final String sortOrder, final int getRecordNum) {
+
+        return asParticipantStatisticsList(getPfDao().getFiltered(JpaParticipantStatistics.class, name, version,
+                startTimeStamp, endTimeStamp, filterMap, sortOrder, getRecordNum));
+    }
+
+
+    /**
+     * Creates Participant statistics.
+     *
+     * @param participantStatisticsList a specification of the CL statistics to create
+     * @return the participant statistics created
+     * @throws PfModelException on errors creating participant statistics
+     */
+    public List<ParticipantStatistics> createParticipantStatistics(
+            @NonNull final List<ParticipantStatistics> participantStatisticsList) throws PfModelException {
+
+        BeanValidationResult validationResult =
+                new BeanValidationResult("participant statistics List", participantStatisticsList);
+
+        for (ParticipantStatistics participantStatistics : participantStatisticsList) {
+            JpaParticipantStatistics jpaParticipantStatistics = new JpaParticipantStatistics();
+            jpaParticipantStatistics.fromAuthorative(participantStatistics);
+
+            validationResult.addResult(jpaParticipantStatistics.validate("participant statistics"));
+        }
+
+        if (!validationResult.isValid()) {
+            throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, validationResult.getResult());
+        }
+
+        for (ParticipantStatistics participantStatistics : participantStatisticsList) {
+            JpaParticipantStatistics jpaParticipantStatistics = new JpaParticipantStatistics();
+            jpaParticipantStatistics.fromAuthorative(participantStatistics);
+
+            getPfDao().create(jpaParticipantStatistics);
+        }
+
+        // Return the created participant statistics
+        List<ParticipantStatistics> participantStatistics = new ArrayList<>(participantStatisticsList.size());
+
+        for (ParticipantStatistics participantStatisticsItem : participantStatisticsList) {
+            JpaParticipantStatistics jpaParticipantStatistics = getPfDao().get(JpaParticipantStatistics.class,
+                    new PfTimestampKey(participantStatisticsItem.getParticipantId().getName(),
+                            participantStatisticsItem.getParticipantId().getVersion(),
+                            participantStatisticsItem.getTimeStamp()));
+            participantStatistics.add(jpaParticipantStatistics.toAuthorative());
+        }
+
+        return participantStatistics;
+    }
+
+
+    /**
+     * Convert JPA participant statistics list to participant statistics list.
+     *
+     * @param jpaParticipantStatisticsList the list to convert
+     * @return the participant statistics list
+     */
+    private List<ParticipantStatistics> asParticipantStatisticsList(
+            List<JpaParticipantStatistics> jpaParticipantStatisticsList) {
+
+        return jpaParticipantStatisticsList.stream().map(JpaParticipantStatistics::toAuthorative)
+                .collect(Collectors.toList());
+    }
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/notification/ControlLoopNotification.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/notification/ControlLoopNotification.java
new file mode 100644
index 0000000..c6bbd81
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/notification/ControlLoopNotification.java
@@ -0,0 +1,56 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.clamp.controlloop.models.messages.dmaap.notification;
+
+import com.google.gson.annotations.SerializedName;
+import java.util.ArrayList;
+import java.util.List;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.commons.collections4.CollectionUtils;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class ControlLoopNotification {
+
+    /**
+     * Status of control loops that are being added to participants.
+     */
+    @SerializedName("deployed-control-loops")
+    private List<ControlLoopStatus> added = new ArrayList<>();
+
+    /**
+     * Status of policies that are being deleted from PDPs.
+     */
+    @SerializedName("undeployed-control-loops")
+    private List<ControlLoopStatus> deleted = new ArrayList<>();
+
+
+    /**
+     * Determines if the notification is empty (i.e., has no added or delete control loop
+     * notifications).
+     *
+     * @return {@code true} if the notification is empty, {@code false} otherwise
+     */
+    public boolean isEmpty() {
+        return (CollectionUtils.isEmpty(added) && CollectionUtils.isEmpty(deleted));
+    }
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/notification/ControlLoopStatus.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/notification/ControlLoopStatus.java
new file mode 100644
index 0000000..033843e
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/notification/ControlLoopStatus.java
@@ -0,0 +1,36 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.clamp.controlloop.models.messages.dmaap.notification;
+
+import com.google.gson.annotations.SerializedName;
+import java.util.UUID;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class ControlLoopStatus {
+    @SerializedName("control-loop-id")
+    private UUID id;
+
+    private ToscaConceptIdentifier definition;
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantControlLoopStateChange.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantControlLoopStateChange.java
new file mode 100644
index 0000000..1a9a891
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantControlLoopStateChange.java
@@ -0,0 +1,56 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.models.messages.dmaap.participant;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopOrderedState;
+
+/**
+ * Class to represent the PARTICIPANT_CONTROL_LOOP_STATE_CHANGE message that the control loop runtime will send to
+ * participants to change the state of a control loop they are running.
+ */
+@Getter
+@Setter
+@ToString(callSuper = true)
+public class ParticipantControlLoopStateChange extends ParticipantMessage {
+    private ControlLoopOrderedState orderedState;
+
+    /**
+     * Constructor for instantiating ParticipantControlLoopStateChange class with message name.
+     *
+     */
+    public ParticipantControlLoopStateChange() {
+        super(ParticipantMessageType.PARTICIPANT_CONTROL_LOOP_STATE_CHANGE);
+    }
+
+    /**
+     * Constructs the object, making a deep copy.
+     *
+     * @param source source from which to copy
+     */
+    public ParticipantControlLoopStateChange(ParticipantControlLoopStateChange source) {
+        super(source);
+
+        this.orderedState = source.orderedState;
+    }
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantControlLoopUpdate.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantControlLoopUpdate.java
new file mode 100644
index 0000000..ed729a6
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantControlLoopUpdate.java
@@ -0,0 +1,63 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.models.messages.dmaap.participant;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoop;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
+
+/**
+ * Class to represent the PARTICIPANT_CONTROL_LOOP_UPDATE message that the control loop runtime sends to a participant.
+ * When a participant receives this message, it creates the control loop elements contained in the message and sets them
+ * to state PASSIVE. subsequent PARTICIPANT_CONTROL_LOOP_STATE_CHANGE messages are used to activate the control loops.
+ */
+@Getter
+@Setter
+@ToString(callSuper = true)
+public class ParticipantControlLoopUpdate extends ParticipantMessage {
+    // The control loop
+    private ControlLoop controlLoop;
+
+    // A service template containing a complete definition of the control loop
+    private ToscaServiceTemplate controlLoopDefinition;
+
+    /**
+     * Constructor for instantiating ParticipantControlLoopUpdate class with message name.
+     *
+     */
+    public ParticipantControlLoopUpdate() {
+        super(ParticipantMessageType.PARTICIPANT_CONTROL_LOOP_UPDATE);
+    }
+
+    /**
+     * Constructs the object, making a deep copy.
+     *
+     * @param source source from which to copy
+     */
+    public ParticipantControlLoopUpdate(ParticipantControlLoopUpdate source) {
+        super(source);
+
+        this.controlLoop = new ControlLoop(source.controlLoop);
+        this.controlLoopDefinition = new ToscaServiceTemplate(source.controlLoopDefinition);
+    }
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantHealthCheck.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantHealthCheck.java
new file mode 100644
index 0000000..e472e15
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantHealthCheck.java
@@ -0,0 +1,56 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.models.messages.dmaap.participant;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantState;
+
+/**
+ * Class to represent the PARTICIPANT_HEALTHCHECK message that the control loop runtime will send to
+ * participants to change the state of a control loop they are running.
+ */
+@Getter
+@Setter
+@ToString(callSuper = true)
+public class ParticipantHealthCheck extends ParticipantMessage {
+    private ParticipantState state;
+
+    /**
+     * Constructor for instantiating ParticipantHealthCheck class with message name.
+     *
+     */
+    public ParticipantHealthCheck() {
+        super(ParticipantMessageType.PARTICIPANT_HEALTH_CHECK);
+    }
+
+    /**
+     * Constructs the object, making a deep copy.
+     *
+     * @param source source from which to copy
+     */
+    public ParticipantHealthCheck(ParticipantHealthCheck source) {
+        super(source);
+
+        this.state = source.state;
+    }
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantMessage.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantMessage.java
new file mode 100644
index 0000000..3ca4d3d
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantMessage.java
@@ -0,0 +1,113 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.models.messages.dmaap.participant;
+
+import java.time.Instant;
+import java.util.UUID;
+import lombok.AccessLevel;
+import lombok.Getter;
+import lombok.NonNull;
+import lombok.Setter;
+import lombok.ToString;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+/**
+ * Class to represent the base class for various messages that will be exchanged between the control loop runtime and
+ * participants.
+ */
+@Getter
+@Setter
+@ToString
+public class ParticipantMessage {
+    @Setter(AccessLevel.NONE)
+    private ParticipantMessageType messageType;
+
+    private UUID messageId = UUID.randomUUID();
+
+    /**
+     * Time-stamp, in milliseconds, when the message was created. Defaults to the current time.
+     */
+    private Instant timestamp = Instant.now();
+
+    /**
+     * Participant Type, or {@code null} for messages from participants.
+     */
+    private ToscaConceptIdentifier participantType;
+
+    /**
+     * Participant ID, or {@code null} for messages from participants.
+     */
+    private ToscaConceptIdentifier participantId;
+
+    /**
+     * Control loop ID, or {@code null} for messages to participants.
+     */
+    private ToscaConceptIdentifier controlLoopId;
+
+    /**
+     * Constructor for instantiating a participant message class.
+     *
+     * @param messageType the message type
+     */
+    public ParticipantMessage(final ParticipantMessageType messageType) {
+        this.messageType = messageType;
+    }
+
+    /**
+     * Constructs the object, making a deep copy. Does <i>not</i> copy the request id or the time stamp.
+     *
+     * @param source source from which to copy
+     */
+    public ParticipantMessage(final ParticipantMessage source) {
+        this.messageType = source.messageType;
+        this.participantType = source.participantType;
+        this.participantId = source.participantId;
+        this.controlLoopId = source.controlLoopId;
+    }
+
+    /**
+     * Determines if this message applies to this participant type.
+     *
+     * @param participantType type of the participant to match against
+     * @param participantId id of the participant to match against
+     * @return {@code true} if this message applies to this participant, {@code false} otherwise
+     */
+    public boolean appliesTo(@NonNull final ToscaConceptIdentifier participantType,
+            @NonNull final ToscaConceptIdentifier participantId) {
+        // Broadcast message to all participants
+        if (this.participantType == null) {
+            return true;
+        }
+
+        // Broadcast message to all control loop elements on this participant
+        if (participantType.equals(this.participantType) && this.participantId == null) {
+            return true;
+        }
+
+        // Targeted message at this specific participant
+        if (participantType.equals(this.participantType) && participantId.equals(this.participantId)) {
+            return true;
+        }
+
+        // Message is not for this participant
+        return false;
+    }
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantMessageType.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantMessageType.java
new file mode 100644
index 0000000..77a50bd
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantMessageType.java
@@ -0,0 +1,56 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.models.messages.dmaap.participant;
+
+/**
+ * Class to hold the possible values for the type of participant messages.
+ */
+public enum ParticipantMessageType {
+
+    /**
+     * Used by participants to report status to the control loop runtime.
+     */
+    PARTICIPANT_STATUS,
+
+    /**
+     * Used by the control loop runtime to change the state of participants, triggers a PARTICIPANT_STATUS message with
+     * the result of the PARTICIPANT_STATE_CHANGE operation.
+     */
+    PARTICIPANT_STATE_CHANGE,
+
+    /**
+     * Used by the control loop runtime to update the control loops running on participants, triggers a
+     * PARTICIPANT_STATUS message with the result of the PARTICIPANT_CONTROL_LOOP_UPDATE operation.
+     */
+    PARTICIPANT_CONTROL_LOOP_UPDATE,
+
+    /**
+     * Used by the control loop runtime to change the state of control loops in participants, triggers a
+     * PARTICIPANT_STATUS message with the result of the PARTICIPANT_CONTROL_LOOP_STATE_CHANGE operation.
+     */
+    PARTICIPANT_CONTROL_LOOP_STATE_CHANGE,
+
+    /**
+     * Used by the control loop runtime to order a health check on participants, triggers a PARTICIPANT_STATUS message
+     * with the result of the PARTICIPANT_HEALTH_CHECK operation.
+     */
+    PARTICIPANT_HEALTH_CHECK
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantResponseDetails.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantResponseDetails.java
new file mode 100644
index 0000000..4c771b4
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantResponseDetails.java
@@ -0,0 +1,64 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.models.messages.dmaap.participant;
+
+import java.util.UUID;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import lombok.ToString;
+
+/**
+ * Class to represent participant response details.
+ */
+@Getter
+@Setter
+@ToString
+@NoArgsConstructor
+public class ParticipantResponseDetails {
+
+    // The responseTo field should match the original request id in the request.
+    private UUID responseTo;
+    private ParticipantResponseStatus responseStatus;
+    private String responseMessage;
+
+    /**
+     * Constructs the object as a response to.
+     *
+     * @param triggerMessage the message to which this is a response
+     */
+    public ParticipantResponseDetails(ParticipantMessage triggerMessage) {
+        this.responseMessage = null;
+        this.responseStatus = ParticipantResponseStatus.FAIL;
+        this.responseTo = triggerMessage.getMessageId();
+    }
+
+    /**
+     * Constructs the object, making a deep copy.
+     *
+     * @param source source from which to copy
+     */
+    public ParticipantResponseDetails(ParticipantResponseDetails source) {
+        this.responseMessage = source.responseMessage;
+        this.responseStatus = source.responseStatus;
+        this.responseTo = source.responseTo;
+    }
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantResponseStatus.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantResponseStatus.java
new file mode 100644
index 0000000..f014529
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantResponseStatus.java
@@ -0,0 +1,42 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.models.messages.dmaap.participant;
+
+/**
+ * Class to hold the possible values for participant response status.
+ */
+public enum ParticipantResponseStatus {
+
+    /**
+     * participant operation was successful.
+     */
+    SUCCESS,
+
+    /**
+     * participant operation failed.
+     */
+    FAIL,
+
+    /**
+     * periodic response.
+     */
+    PERIODIC
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantStateChange.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantStateChange.java
new file mode 100644
index 0000000..5f51500
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantStateChange.java
@@ -0,0 +1,56 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.models.messages.dmaap.participant;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantState;
+
+/**
+ * Class to represent the PARTICIPANT_STATE_CHANGE message that the control loop runtime will send to participants
+ * to change their state.
+ */
+@Getter
+@Setter
+@ToString(callSuper = true)
+public class ParticipantStateChange extends ParticipantMessage {
+    private ParticipantState state;
+
+    /**
+     * Constructor for instantiating ParticipantStateChange class with message name.
+     *
+     */
+    public ParticipantStateChange() {
+        super(ParticipantMessageType.PARTICIPANT_STATE_CHANGE);
+    }
+
+    /**
+     * Constructs the object, making a deep copy.
+     *
+     * @param source source from which to copy
+     */
+    public ParticipantStateChange(ParticipantStateChange source) {
+        super(source);
+
+        this.state = source.state;
+    }
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantStatus.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantStatus.java
new file mode 100644
index 0000000..5b92842
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantStatus.java
@@ -0,0 +1,76 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.models.messages.dmaap.participant;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoops;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantHealthStatus;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantState;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantStatistics;
+
+/**
+ * Class to represent the PARTICIPANT_STATUS message that all the participants send to the control loop runtime.
+ */
+@Getter
+@Setter
+@ToString(callSuper = true)
+public class ParticipantStatus extends ParticipantMessage {
+    // The response should be completed if this message is a response to a request from the Control Loop Runtime
+    private ParticipantResponseDetails response;
+
+    // State and health status of the participant
+    private ParticipantState state;
+    private ParticipantHealthStatus healthStatus;
+
+    // Control Loops on the participant
+    private ControlLoops controlLoops;
+
+    // Participant statistics
+    private ParticipantStatistics participantStatistics;
+
+    // Description. May be left {@code null}.
+    private String message;
+
+    /**
+     * Constructor for instantiating ParticipantStatus class with message name.
+     *
+     */
+    public ParticipantStatus() {
+        super(ParticipantMessageType.PARTICIPANT_STATUS);
+    }
+
+    /**
+     * Constructs the object, making a deep copy.
+     *
+     * @param source source from which to copy
+     */
+    public ParticipantStatus(final ParticipantStatus source) {
+        super(source);
+
+        this.state = source.state;
+        this.healthStatus = source.healthStatus;
+        this.message = source.message;
+        this.controlLoops = (source.controlLoops == null ? null : new ControlLoops(source.controlLoops));
+        this.response = (source.response == null ? null : new ParticipantResponseDetails(source.response));
+    }
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/rest/SimpleResponse.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/rest/SimpleResponse.java
new file mode 100644
index 0000000..2bd09c6
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/rest/SimpleResponse.java
@@ -0,0 +1,37 @@
+/*
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.clamp.controlloop.models.messages.rest;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+/**
+ * Response returned when no extra output fields are needed.
+ */
+@Getter
+@Setter
+@ToString
+public class SimpleResponse {
+
+    /**
+     * Optional detailed message in error cases.
+     */
+    private String errorDetails;
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/rest/TypedSimpleResponse.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/rest/TypedSimpleResponse.java
new file mode 100644
index 0000000..199ac8e
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/rest/TypedSimpleResponse.java
@@ -0,0 +1,35 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.models.messages.rest;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+/**
+ * Response returned when no extra output fields are needed.
+ */
+@Getter
+@Setter
+@ToString
+public class TypedSimpleResponse<T> extends SimpleResponse {
+    private T response;
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/rest/commissioning/CommissioningResponse.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/rest/commissioning/CommissioningResponse.java
new file mode 100644
index 0000000..6363db8
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/rest/commissioning/CommissioningResponse.java
@@ -0,0 +1,38 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.models.messages.rest.commissioning;
+
+import java.util.List;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import org.onap.policy.clamp.controlloop.models.messages.rest.SimpleResponse;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+/**
+ * Response to Commissioning requests that affect a change.
+ */
+@Getter
+@Setter
+@ToString(callSuper = true)
+public class CommissioningResponse extends SimpleResponse {
+    private List<ToscaConceptIdentifier> affectedControlLoopDefinitions;
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/rest/instantiation/InstantiationCommand.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/rest/instantiation/InstantiationCommand.java
new file mode 100644
index 0000000..71b7ab9
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/rest/instantiation/InstantiationCommand.java
@@ -0,0 +1,35 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.models.messages.rest.instantiation;
+
+import java.util.List;
+import lombok.Data;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopOrderedState;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+@Data
+public class InstantiationCommand {
+    // The state to which the control loops are to be set
+    private ControlLoopOrderedState orderedState;
+
+    // The list of control loops on which the command is to be issued
+    private List<ToscaConceptIdentifier> controlLoopIdentifierList;
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/rest/instantiation/InstantiationResponse.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/rest/instantiation/InstantiationResponse.java
new file mode 100644
index 0000000..d932f29
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/rest/instantiation/InstantiationResponse.java
@@ -0,0 +1,38 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.models.messages.rest.instantiation;
+
+import java.util.List;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import org.onap.policy.clamp.controlloop.models.messages.rest.SimpleResponse;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+/**
+ * Response to Commissioning requests that affect a change.
+ */
+@Getter
+@Setter
+@ToString(callSuper = true)
+public class InstantiationResponse extends SimpleResponse {
+    private List<ToscaConceptIdentifier> affectedControlLoops;
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ClElementStatisticsTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ClElementStatisticsTest.java
new file mode 100644
index 0000000..0addc25
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ClElementStatisticsTest.java
@@ -0,0 +1,67 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.models.controlloop.concepts;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.time.Instant;
+import java.util.UUID;
+import org.junit.Test;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+public class ClElementStatisticsTest {
+    @Test
+    public void testClElementStatisticsLombok() {
+        assertNotNull(new ClElementStatistics());
+        ClElementStatistics cles0 = new ClElementStatistics();
+
+        assertThat(cles0.toString()).contains("ClElementStatistics(");
+        assertThat(cles0.hashCode()).isNotZero();
+        assertEquals(true, cles0.equals(cles0));
+        assertEquals(false, cles0.equals(null));
+
+
+        ClElementStatistics cles1 = new ClElementStatistics();
+        cles1.setParticipantId(new ToscaConceptIdentifier("defName", "0.0.1"));
+        cles1.setTimeStamp(Instant.now());
+
+        assertThat(cles1.toString()).contains("ClElementStatistics(");
+        assertEquals(false, cles1.hashCode() == 0);
+        assertEquals(false, cles1.equals(cles0));
+        assertEquals(false, cles1.equals(null));
+
+        assertNotEquals(cles1, cles0);
+
+        ClElementStatistics cles2 = new ClElementStatistics();
+        cles2.setId(UUID.randomUUID());
+
+        // @formatter:off
+        assertThatThrownBy(() -> cles2.setParticipantId(null)).isInstanceOf(NullPointerException.class);
+        assertThatThrownBy(() -> cles2.setTimeStamp(null)).isInstanceOf(NullPointerException.class);
+        // @formatter:on
+
+        assertNotEquals(cles2, cles0);
+    }
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoopConceptPojosTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoopConceptPojosTest.java
new file mode 100644
index 0000000..908c914
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoopConceptPojosTest.java
@@ -0,0 +1,62 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.models.controlloop.concepts;
+
+import com.openpojo.reflection.PojoClass;
+import com.openpojo.reflection.impl.PojoClassFactory;
+import com.openpojo.validation.Validator;
+import com.openpojo.validation.ValidatorBuilder;
+import com.openpojo.validation.rule.impl.EqualsAndHashCodeMatchRule;
+import com.openpojo.validation.rule.impl.GetterMustExistRule;
+import com.openpojo.validation.rule.impl.NoPublicFieldsExceptStaticFinalRule;
+import com.openpojo.validation.rule.impl.SetterMustExistRule;
+import com.openpojo.validation.test.impl.GetterTester;
+import com.openpojo.validation.test.impl.SetterTester;
+import java.util.List;
+import org.junit.Test;
+import org.onap.policy.common.utils.test.ToStringTester;
+
+/**
+ * Class to perform unit tests of all pojos.
+ */
+public class ControlLoopConceptPojosTest {
+
+    @Test
+    public void testPojos() {
+        List<PojoClass> pojoClasses =
+                PojoClassFactory.getPojoClasses(ControlLoopConceptPojosTest.class.getPackageName());
+
+        // @formatter:off
+        final Validator validator = ValidatorBuilder
+                .create()
+                .with(new SetterMustExistRule())
+                .with(new GetterMustExistRule())
+                .with(new EqualsAndHashCodeMatchRule())
+                .with(new NoPublicFieldsExceptStaticFinalRule())
+                .with(new SetterTester())
+                .with(new GetterTester())
+                .with(new ToStringTester())
+                .build();
+
+        validator.validate(pojoClasses);
+        // @formatter:on
+    }
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoopElementTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoopElementTest.java
new file mode 100644
index 0000000..2264f6d
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoopElementTest.java
@@ -0,0 +1,81 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.models.controlloop.concepts;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.util.UUID;
+import org.junit.Test;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+public class ControlLoopElementTest {
+    @Test
+    public void testControlLoopElement() {
+
+        ControlLoopElement cle0 = new ControlLoopElement();
+
+        ControlLoopElement cle1 = new ControlLoopElement(cle0);
+        assertEquals(cle0, cle1);
+    }
+
+    @Test
+    public void testControlLoopElementLombok() {
+        assertNotNull(new ControlLoopElement());
+        ControlLoopElement cle0 = new ControlLoopElement();
+
+        assertThat(cle0.toString()).contains("ControlLoopElement(");
+        assertThat(cle0.hashCode()).isNotZero();
+        assertEquals(true, cle0.equals(cle0));
+        assertEquals(false, cle0.equals(null));
+
+        ControlLoopElement cle1 = new ControlLoopElement();
+
+        cle1.setDefinition(new ToscaConceptIdentifier("defName", "0.0.1"));
+        cle1.setDescription("Description");
+        cle1.setId(UUID.randomUUID());
+        cle1.setOrderedState(ControlLoopOrderedState.UNINITIALISED);
+        cle1.setParticipantId(new ToscaConceptIdentifier("id", "1.2.3"));
+        cle1.setState(ControlLoopState.UNINITIALISED);
+
+        assertThat(cle1.toString()).contains("ControlLoopElement(");
+        assertEquals(false, cle1.hashCode() == 0);
+        assertEquals(false, cle1.equals(cle0));
+        assertEquals(false, cle1.equals(null));
+
+        assertNotEquals(cle1, cle0);
+
+        ControlLoopElement cle2 = new ControlLoopElement();
+
+        // @formatter:off
+        assertThatThrownBy(() -> cle2.setDefinition(null)).   isInstanceOf(NullPointerException.class);
+        assertThatThrownBy(() -> cle2.setId(null)).           isInstanceOf(NullPointerException.class);
+        assertThatThrownBy(() -> cle2.setOrderedState(null)). isInstanceOf(NullPointerException.class);
+        assertThatThrownBy(() -> cle2.setParticipantId(null)).isInstanceOf(NullPointerException.class);
+        assertThatThrownBy(() -> cle2.setState(null)).        isInstanceOf(NullPointerException.class);
+        // @formatter:on
+
+        assertNotEquals(cle2, cle0);
+    }
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoopTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoopTest.java
new file mode 100644
index 0000000..c865b76
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoopTest.java
@@ -0,0 +1,102 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.models.controlloop.concepts;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+
+import java.util.LinkedHashMap;
+import java.util.UUID;
+import org.junit.Test;
+import org.onap.policy.models.base.PfKey;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+public class ControlLoopTest {
+    @Test
+    public void testControlLoop() {
+        ControlLoop cl0 = new ControlLoop();
+        cl0.setDefinition(new ToscaConceptIdentifier("dfName", "1.2.3"));
+        assertEquals("dfName", cl0.getType());
+        assertEquals("1.2.3", cl0.getTypeVersion());
+
+        ControlLoop cl1 = new ControlLoop(cl0);
+        assertEquals(cl0, cl1);
+
+        assertEquals(0, cl0.compareTo(cl1));
+    }
+
+    @Test
+    public void testControlLoopLombok() {
+        assertNotNull(new ControlLoop());
+        ControlLoop cl0 = new ControlLoop();
+        cl0.setElements(new LinkedHashMap<>());
+
+        assertThat(cl0.toString()).contains("ControlLoop(");
+        assertThat(cl0.hashCode()).isNotZero();
+        assertEquals(true, cl0.equals(cl0));
+        assertEquals(false, cl0.equals(null));
+
+        ControlLoop cl1 = new ControlLoop();
+
+        cl1.setDefinition(new ToscaConceptIdentifier("defName", "0.0.1"));
+        cl1.setDescription("Description");
+        cl1.setElements(new LinkedHashMap<>());
+        cl1.setName("Name");
+        cl1.setOrderedState(ControlLoopOrderedState.UNINITIALISED);
+        cl1.setState(ControlLoopState.UNINITIALISED);
+        cl1.setVersion("0.0.1");
+
+        assertThat(cl1.toString()).contains("ControlLoop(");
+        assertEquals(false, cl1.hashCode() == 0);
+        assertEquals(false, cl1.equals(cl0));
+        assertEquals(false, cl1.equals(null));
+
+        assertNotEquals(cl1, cl0);
+
+        ControlLoop cl2 = new ControlLoop();
+        cl2.setElements(new LinkedHashMap<>());
+
+        // @formatter:off
+        assertThatThrownBy(() -> cl2.setDefinition(null)).  isInstanceOf(NullPointerException.class);
+        assertThatThrownBy(() -> cl2.setOrderedState(null)).isInstanceOf(NullPointerException.class);
+        assertThatThrownBy(() -> cl2.setState(null)).       isInstanceOf(NullPointerException.class);
+        // @formatter:on
+
+        assertEquals(cl2, cl0);
+
+        cl1.setCascadedOrderedState(ControlLoopOrderedState.PASSIVE);
+        assertEquals(ControlLoopOrderedState.PASSIVE, cl1.getOrderedState());
+
+        cl1.getElements().put(UUID.randomUUID(), new ControlLoopElement());
+        cl1.setCascadedOrderedState(ControlLoopOrderedState.RUNNING);
+        assertEquals(ControlLoopOrderedState.RUNNING, cl1.getOrderedState());
+        assertEquals(ControlLoopOrderedState.RUNNING, cl1.getElements().values().iterator().next().getOrderedState());
+
+        assertNull(cl0.getElements().get(UUID.randomUUID()));
+        assertNull(cl1.getElements().get(UUID.randomUUID()));
+
+        assertEquals(PfKey.NULL_KEY_NAME, cl0.getDefinition().getName());
+    }
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ParticipantStatisticsTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ParticipantStatisticsTest.java
new file mode 100644
index 0000000..54eaca0
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ParticipantStatisticsTest.java
@@ -0,0 +1,65 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.models.controlloop.concepts;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.time.Instant;
+import org.junit.Test;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+public class ParticipantStatisticsTest {
+    @Test
+    public void testParticipantStatisticsLombok() {
+        assertNotNull(new ParticipantStatistics());
+        ParticipantStatistics ps0 = new ParticipantStatistics();
+
+        assertThat(ps0.toString()).contains("ParticipantStatistics(");
+        assertThat(ps0.hashCode()).isNotZero();
+        assertEquals(true, ps0.equals(ps0));
+        assertEquals(false, ps0.equals(null));
+
+
+        ParticipantStatistics ps1 = new ParticipantStatistics();
+        ps1.setParticipantId(new ToscaConceptIdentifier("defName", "0.0.1"));
+        ps1.setTimeStamp(Instant.now());
+
+        assertThat(ps1.toString()).contains("ParticipantStatistics(");
+        assertEquals(false, ps1.hashCode() == 0);
+        assertEquals(false, ps1.equals(ps0));
+        assertEquals(false, ps1.equals(null));
+
+        assertNotEquals(ps1, ps0);
+
+        ParticipantStatistics ps2 = new ParticipantStatistics();
+
+        // @formatter:off
+        assertThatThrownBy(() -> ps2.setParticipantId(null)).isInstanceOf(NullPointerException.class);
+        assertThatThrownBy(() -> ps2.setTimeStamp(null)).    isInstanceOf(NullPointerException.class);
+        // @formatter:on
+
+        assertEquals(ps2, ps0);
+    }
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ParticipantTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ParticipantTest.java
new file mode 100644
index 0000000..1eb80db
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ParticipantTest.java
@@ -0,0 +1,84 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.models.controlloop.concepts;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotNull;
+
+import org.junit.Test;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+public class ParticipantTest {
+    @Test
+    public void testParticipant() {
+
+        Participant p0 = new Participant();
+        p0.setDefinition(new ToscaConceptIdentifier("dfName", "1.2.3"));
+        assertEquals("dfName", p0.getType());
+        assertEquals("1.2.3", p0.getTypeVersion());
+
+        Participant p1 = new Participant(p0);
+        assertEquals(p0, p1);
+
+        assertEquals(0, p0.compareTo(p1));
+    }
+
+    @Test
+    public void testParticipantLombok() {
+        assertNotNull(new Participant());
+        Participant p0 = new Participant();
+
+        assertThat(p0.toString()).contains("Participant(");
+        assertThat(p0.hashCode()).isNotZero();
+        assertEquals(true, p0.equals(p0));
+        assertEquals(false, p0.equals(null));
+
+
+        Participant p1 = new Participant();
+
+        p1.setDefinition(new ToscaConceptIdentifier("defName", "0.0.1"));
+        p1.setDescription("Description");
+        p1.setHealthStatus(ParticipantHealthStatus.HEALTHY);
+        p1.setName("Name");
+        p1.setParticipantState(ParticipantState.ACTIVE);
+        p1.setVersion("0.0.1");
+
+        assertThat(p1.toString()).contains("Participant(");
+        assertEquals(false, p1.hashCode() == 0);
+        assertEquals(false, p1.equals(p0));
+        assertEquals(false, p1.equals(null));
+
+        assertNotEquals(p1, p0);
+
+        Participant p2 = new Participant();
+
+        // @formatter:off
+        assertThatThrownBy(() -> p2.setDefinition(null)).      isInstanceOf(NullPointerException.class);
+        assertThatThrownBy(() -> p2.setHealthStatus(null)).    isInstanceOf(NullPointerException.class);
+        assertThatThrownBy(() -> p2.setParticipantState(null)).isInstanceOf(NullPointerException.class);
+        // @formatter:on
+
+        assertEquals(p2, p0);
+    }
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/DummyJpaClElementStatisticsChild.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/DummyJpaClElementStatisticsChild.java
new file mode 100644
index 0000000..b90ccba
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/DummyJpaClElementStatisticsChild.java
@@ -0,0 +1,28 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.models.controlloop.persistence.concepts;
+
+/**
+ * Test class for {@link JpaClElementStatistics} comparisons.
+ */
+public class DummyJpaClElementStatisticsChild extends JpaClElementStatistics {
+    private static final long serialVersionUID = -5101743610779424064L;
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/DummyJpaControlLoopChild.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/DummyJpaControlLoopChild.java
new file mode 100644
index 0000000..c4eb364
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/DummyJpaControlLoopChild.java
@@ -0,0 +1,28 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.models.controlloop.persistence.concepts;
+
+/**
+ * Test class for {@link JpaControlLoop} comparisons.
+ */
+public class DummyJpaControlLoopChild extends JpaControlLoop {
+    private static final long serialVersionUID = -5101743610779424064L;
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/DummyJpaControlLoopElementChild.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/DummyJpaControlLoopElementChild.java
new file mode 100644
index 0000000..2082ff4
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/DummyJpaControlLoopElementChild.java
@@ -0,0 +1,28 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.models.controlloop.persistence.concepts;
+
+/**
+ * Test class for {@link JpaControlLoopElement} comparisons.
+ */
+public class DummyJpaControlLoopElementChild extends JpaControlLoopElement {
+    private static final long serialVersionUID = -5101743610779424064L;
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/DummyJpaParticipantChild.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/DummyJpaParticipantChild.java
new file mode 100644
index 0000000..e6bc92e
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/DummyJpaParticipantChild.java
@@ -0,0 +1,28 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.models.controlloop.persistence.concepts;
+
+/**
+ * Test class for {@link JpaParticipant} comparisons.
+ */
+public class DummyJpaParticipantChild extends JpaParticipant {
+    private static final long serialVersionUID = -5101743610779424064L;
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/DummyJpaParticipantStatisticsChild.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/DummyJpaParticipantStatisticsChild.java
new file mode 100644
index 0000000..74dd400
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/DummyJpaParticipantStatisticsChild.java
@@ -0,0 +1,28 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.models.controlloop.persistence.concepts;
+
+/**
+ * Test class for {@link JpaParticipantStatistics} comparisons.
+ */
+public class DummyJpaParticipantStatisticsChild extends JpaParticipantStatistics {
+    private static final long serialVersionUID = -5101743610779424064L;
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaClElementStatisticsTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaClElementStatisticsTest.java
new file mode 100644
index 0000000..16c302f
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaClElementStatisticsTest.java
@@ -0,0 +1,189 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.models.controlloop.persistence.concepts;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.time.Instant;
+import java.util.UUID;
+import org.junit.Test;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ClElementStatistics;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopState;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.Participant;
+import org.onap.policy.models.base.PfConceptKey;
+import org.onap.policy.models.base.PfReferenceTimestampKey;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+/**
+ * Test the {@link JpaClElementStatistics} class.
+ */
+public class JpaClElementStatisticsTest {
+
+    private static final String NULL_KEY_ERROR = "key is marked .*ull but is null";
+
+    @Test
+    public void testJpaClElementStatisticsConstructor() {
+        assertThatThrownBy(() -> {
+            new JpaClElementStatistics((JpaClElementStatistics) null);
+        }).hasMessageMatching("copyConcept is marked .*ull but is null");
+
+        assertThatThrownBy(() -> {
+            new JpaClElementStatistics((PfReferenceTimestampKey) null);
+        }).hasMessageMatching(NULL_KEY_ERROR);
+
+        assertThatThrownBy(() -> {
+            new JpaClElementStatistics(null, null);
+        }).hasMessageMatching(NULL_KEY_ERROR);
+
+        assertThatThrownBy(() -> {
+            new JpaClElementStatistics(null, new PfConceptKey());
+        }).hasMessageMatching(NULL_KEY_ERROR);
+
+        assertThatThrownBy(() -> {
+            new JpaClElementStatistics(new PfReferenceTimestampKey(), null);
+        }).hasMessageMatching("participantId is marked .*ull but is null");
+
+        assertNotNull(new JpaClElementStatistics());
+        assertNotNull(new JpaClElementStatistics((new PfReferenceTimestampKey())));
+        assertNotNull(new JpaClElementStatistics(new PfReferenceTimestampKey(), new PfConceptKey()));
+    }
+
+    @Test
+    public void testJpaClElementStatistics() {
+        JpaClElementStatistics testJpaClElementStatistics = createJpaClElementStatisticsInstance();
+
+        ClElementStatistics cles = createClElementStatisticsInstance();
+        assertEquals(cles, testJpaClElementStatistics.toAuthorative());
+
+        assertThatThrownBy(() -> {
+            testJpaClElementStatistics.fromAuthorative(null);
+        }).hasMessageMatching("clElementStatistics is marked .*ull but is null");
+
+        assertThatThrownBy(() -> new JpaClElementStatistics((JpaClElementStatistics) null))
+                .isInstanceOf(NullPointerException.class);
+
+        JpaClElementStatistics testJpaClElementStatisticsFa = new JpaClElementStatistics();
+        testJpaClElementStatisticsFa.setKey(null);
+        testJpaClElementStatisticsFa.fromAuthorative(cles);
+        assertEquals(testJpaClElementStatistics, testJpaClElementStatisticsFa);
+        testJpaClElementStatisticsFa.setKey(PfReferenceTimestampKey.getNullKey());
+        testJpaClElementStatisticsFa.fromAuthorative(cles);
+        assertEquals(testJpaClElementStatistics, testJpaClElementStatisticsFa);
+        testJpaClElementStatisticsFa.setKey(new PfReferenceTimestampKey("elementName", "0.0.1",
+            "a95757ba-b34a-4049-a2a8-46773abcbe5e", Instant.ofEpochSecond(123456L)));
+        testJpaClElementStatisticsFa.fromAuthorative(cles);
+        assertEquals(testJpaClElementStatistics, testJpaClElementStatisticsFa);
+
+        testJpaClElementStatisticsFa = new JpaClElementStatistics(cles);
+        assertEquals(testJpaClElementStatistics, testJpaClElementStatisticsFa);
+
+        assertEquals(1, testJpaClElementStatistics.getKeys().size());
+
+        assertEquals("elementName", testJpaClElementStatistics.getKey().getReferenceKey().getParentKeyName());
+
+        testJpaClElementStatistics.clean();
+        assertEquals("elementName", testJpaClElementStatistics.getKey().getReferenceKey().getParentKeyName());
+
+        JpaClElementStatistics testJpaClElementStatistics2 = new JpaClElementStatistics(testJpaClElementStatistics);
+        assertEquals(testJpaClElementStatistics, testJpaClElementStatistics2);
+    }
+
+    @Test
+    public void testJpaClElementStatisticsValidation() {
+        JpaClElementStatistics testJpaClElementStatistics = createJpaClElementStatisticsInstance();
+
+        assertThatThrownBy(() -> {
+            testJpaClElementStatistics.validate(null);
+        }).hasMessageMatching("fieldName is marked .*ull but is null");
+
+        assertTrue(testJpaClElementStatistics.validate("").isValid());
+    }
+
+    @Test
+    public void testJpaClElementStatisticsCompareTo() {
+        JpaClElementStatistics testJpaClElementStatistics = createJpaClElementStatisticsInstance();
+
+        JpaClElementStatistics otherJpaClElementStatistics = new JpaClElementStatistics(testJpaClElementStatistics);
+        assertEquals(0, testJpaClElementStatistics.compareTo(otherJpaClElementStatistics));
+        assertEquals(-1, testJpaClElementStatistics.compareTo(null));
+        assertEquals(0, testJpaClElementStatistics.compareTo(testJpaClElementStatistics));
+        assertNotEquals(0, testJpaClElementStatistics.compareTo(new DummyJpaClElementStatisticsChild()));
+
+        testJpaClElementStatistics.setState(ControlLoopState.PASSIVE);
+        assertNotEquals(0, testJpaClElementStatistics.compareTo(otherJpaClElementStatistics));
+        testJpaClElementStatistics.setState(ControlLoopState.UNINITIALISED);
+        assertEquals(0, testJpaClElementStatistics.compareTo(otherJpaClElementStatistics));
+
+        assertEquals(testJpaClElementStatistics, new JpaClElementStatistics(testJpaClElementStatistics));
+    }
+
+    @Test
+    public void testJpaClElementStatisticsLombok() {
+        assertNotNull(new Participant());
+        JpaClElementStatistics cles0 = new JpaClElementStatistics();
+
+        assertThat(cles0.toString()).contains("JpaClElementStatistics(");
+        assertThat(cles0.hashCode()).isNotZero();
+        assertEquals(true, cles0.equals(cles0));
+        assertEquals(false, cles0.equals(null));
+
+
+        JpaClElementStatistics cles11 = new JpaClElementStatistics();
+
+        cles11.setState(ControlLoopState.UNINITIALISED);
+
+        assertThat(cles11.toString()).contains("JpaClElementStatistics(");
+        assertEquals(false, cles11.hashCode() == 0);
+        assertEquals(false, cles11.equals(cles0));
+        assertEquals(false, cles11.equals(null));
+
+        assertNotEquals(cles11, cles0);
+
+        JpaClElementStatistics cles2 = new JpaClElementStatistics();
+        assertEquals(cles2, cles0);
+    }
+
+    private JpaClElementStatistics createJpaClElementStatisticsInstance() {
+        ClElementStatistics testCles = createClElementStatisticsInstance();
+        JpaClElementStatistics testJpaClElementStatistics = new JpaClElementStatistics();
+        testJpaClElementStatistics.setKey(null);
+        testJpaClElementStatistics.fromAuthorative(testCles);
+        testJpaClElementStatistics.setKey(PfReferenceTimestampKey.getNullKey());
+        testJpaClElementStatistics.fromAuthorative(testCles);
+
+        return testJpaClElementStatistics;
+    }
+
+    private ClElementStatistics createClElementStatisticsInstance() {
+        ClElementStatistics clElementStatistics = new ClElementStatistics();
+        clElementStatistics.setParticipantId(new ToscaConceptIdentifier("elementName", "0.0.1"));
+        clElementStatistics.setId(UUID.fromString("a95757ba-b34a-4049-a2a8-46773abcbe5e"));
+        clElementStatistics.setTimeStamp(Instant.ofEpochSecond(123456L));
+        clElementStatistics.setControlLoopState(ControlLoopState.UNINITIALISED);
+
+        return clElementStatistics;
+    }
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaControlLoopElementTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaControlLoopElementTest.java
new file mode 100644
index 0000000..032d655
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaControlLoopElementTest.java
@@ -0,0 +1,300 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.models.controlloop.persistence.concepts;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.util.UUID;
+import org.junit.Test;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopElement;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopOrderedState;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopState;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.Participant;
+import org.onap.policy.common.utils.coder.CoderException;
+import org.onap.policy.common.utils.coder.StandardCoder;
+import org.onap.policy.models.base.PfConceptKey;
+import org.onap.policy.models.base.PfKey;
+import org.onap.policy.models.base.PfReferenceKey;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+/**
+ * Test the {@link JpaControlLoopElement} class.
+ */
+public class JpaControlLoopElementTest {
+
+    private static final String NULL_KEY_ERROR = "key is marked .*ull but is null";
+
+    @Test
+    public void testJpaControlLoopElementConstructor() {
+        assertThatThrownBy(() -> {
+            new JpaControlLoopElement((JpaControlLoopElement) null);
+        }).hasMessageMatching("copyConcept is marked .*ull but is null");
+
+        assertThatThrownBy(() -> {
+            new JpaControlLoopElement((PfReferenceKey) null);
+        }).hasMessageMatching(NULL_KEY_ERROR);
+
+        assertThatThrownBy(() -> {
+            new JpaControlLoopElement(null, null, null, null);
+        }).hasMessageMatching(NULL_KEY_ERROR);
+
+        assertThatThrownBy(() -> {
+            new JpaControlLoopElement(null, null, null, ControlLoopState.UNINITIALISED);
+        }).hasMessageMatching(NULL_KEY_ERROR);
+
+        assertThatThrownBy(() -> {
+            new JpaControlLoopElement(null, null, new PfConceptKey("participant", "0.0.1"), null);
+        }).hasMessageMatching(NULL_KEY_ERROR);
+
+        assertThatThrownBy(() -> {
+            new JpaControlLoopElement(null, null, new PfConceptKey("participant", "0.0.1"),
+                    ControlLoopState.UNINITIALISED);
+        }).hasMessageMatching(NULL_KEY_ERROR);
+
+        assertThatThrownBy(() -> {
+            new JpaControlLoopElement(null, new PfConceptKey(), null, null);
+        }).hasMessageMatching(NULL_KEY_ERROR);
+
+        assertThatThrownBy(() -> {
+            new JpaControlLoopElement(null, new PfConceptKey(), null, ControlLoopState.UNINITIALISED);
+        }).hasMessageMatching(NULL_KEY_ERROR);
+
+        assertThatThrownBy(() -> {
+            new JpaControlLoopElement(null, new PfConceptKey(), new PfConceptKey("participant", "0.0.1"), null);
+        }).hasMessageMatching(NULL_KEY_ERROR);
+
+        assertThatThrownBy(() -> {
+            new JpaControlLoopElement(null, new PfConceptKey(), new PfConceptKey("participant", "0.0.1"),
+                    ControlLoopState.UNINITIALISED);
+        }).hasMessageMatching(NULL_KEY_ERROR);
+
+        assertThatThrownBy(() -> {
+            new JpaControlLoopElement(new PfReferenceKey(), null, null, null);
+        }).hasMessageMatching("definition is marked .*ull but is null");
+
+        assertThatThrownBy(() -> {
+            new JpaControlLoopElement(new PfReferenceKey(), null, null, ControlLoopState.UNINITIALISED);
+        }).hasMessageMatching("definition is marked .*ull but is null");
+
+        assertThatThrownBy(() -> {
+            new JpaControlLoopElement(new PfReferenceKey(), null, new PfConceptKey("participant", "0.0.1"), null);
+        }).hasMessageMatching("definition is marked .*ull but is null");
+
+        assertThatThrownBy(() -> {
+            new JpaControlLoopElement(new PfReferenceKey(), null, new PfConceptKey("participant", "0.0.1"),
+                    ControlLoopState.UNINITIALISED);
+        }).hasMessageMatching("definition is marked .*ull but is null");
+
+        assertThatThrownBy(() -> {
+            new JpaControlLoopElement(new PfReferenceKey(), new PfConceptKey(), null, null);
+        }).hasMessageMatching("participantType is marked .*ull but is null");
+
+        assertThatThrownBy(() -> {
+            new JpaControlLoopElement(new PfReferenceKey(), new PfConceptKey(), null, ControlLoopState.UNINITIALISED);
+        }).hasMessageMatching("participantType is marked .*ull but is null");
+
+        assertThatThrownBy(() -> {
+            new JpaControlLoopElement(new PfReferenceKey(), new PfConceptKey(),
+                    new PfConceptKey("participant", "0.0.1"), null);
+        }).hasMessageMatching("state is marked .*ull but is null");
+
+        assertNotNull(new JpaControlLoopElement());
+        assertNotNull(new JpaControlLoopElement((new PfReferenceKey())));
+        assertNotNull(new JpaControlLoopElement(new PfReferenceKey(), new PfConceptKey(),
+                new PfConceptKey("participant", "0.0.1"), ControlLoopState.UNINITIALISED));
+    }
+
+    @Test
+    public void testJpaControlLoopElement() {
+        JpaControlLoopElement testJpaControlLoopElement = createJpaControlLoopElementInstance();
+
+        ControlLoopElement cle = createControlLoopElementInstance();
+        assertEquals(cle, testJpaControlLoopElement.toAuthorative());
+
+        assertThatThrownBy(() -> {
+            testJpaControlLoopElement.fromAuthorative(null);
+        }).hasMessageMatching("element is marked .*ull but is null");
+
+        assertThatThrownBy(() -> new JpaControlLoopElement((JpaControlLoopElement) null))
+                .isInstanceOf(NullPointerException.class);
+
+        JpaControlLoopElement testJpaControlLoopElementFa = new JpaControlLoopElement();
+        testJpaControlLoopElementFa.setKey(null);
+        testJpaControlLoopElementFa.fromAuthorative(cle);
+        assertEquals(testJpaControlLoopElement, testJpaControlLoopElementFa);
+        testJpaControlLoopElementFa.setKey(PfReferenceKey.getNullKey());
+        testJpaControlLoopElementFa.fromAuthorative(cle);
+        assertEquals(testJpaControlLoopElement, testJpaControlLoopElementFa);
+        testJpaControlLoopElementFa.setKey(new PfReferenceKey(PfKey.NULL_KEY_NAME, PfKey.NULL_KEY_VERSION,
+                "a95757ba-b34a-4049-a2a8-46773abcbe5e"));
+        testJpaControlLoopElementFa.fromAuthorative(cle);
+        assertEquals(testJpaControlLoopElement, testJpaControlLoopElementFa);
+
+        assertEquals("a95757ba-b34a-4049-a2a8-46773abcbe5e", testJpaControlLoopElement.getKey().getLocalName());
+        assertEquals("a95757ba-b34a-4049-a2a8-46773abcbe5e",
+                new JpaControlLoopElement(createControlLoopElementInstance()).getKey().getLocalName());
+        assertEquals("a95757ba-b34a-4049-a2a8-46773abcbe5e",
+                ((PfReferenceKey) new JpaControlLoopElement(createControlLoopElementInstance()).getKeys().get(0))
+                        .getLocalName());
+
+        testJpaControlLoopElement.clean();
+        assertEquals("a95757ba-b34a-4049-a2a8-46773abcbe5e", testJpaControlLoopElement.getKey().getLocalName());
+
+        testJpaControlLoopElement.setDescription(" A Message ");
+        testJpaControlLoopElement.clean();
+        assertEquals("A Message", testJpaControlLoopElement.getDescription());
+
+        JpaControlLoopElement testJpaControlLoopElement2 = new JpaControlLoopElement(testJpaControlLoopElement);
+        assertEquals(testJpaControlLoopElement, testJpaControlLoopElement2);
+    }
+
+    @Test
+    public void testJpaControlLoopElementOrderedState() throws CoderException {
+        ControlLoopElement testControlLoopElement = createControlLoopElementInstance();
+        JpaControlLoopElement testJpaControlLoopElement = createJpaControlLoopElementInstance();
+
+        testJpaControlLoopElement.setOrderedState(null);
+        assertEquals(testControlLoopElement, testJpaControlLoopElement.toAuthorative());
+        testJpaControlLoopElement.setOrderedState(ControlLoopOrderedState.UNINITIALISED);
+
+        ControlLoopElement noOrderedStateCle = new StandardCoder().decode(
+                new File("src/test/resources/json/ControlLoopElementNoOrderedState.json"), ControlLoopElement.class);
+
+        JpaControlLoopElement noOrderedStateJpaCle = new JpaControlLoopElement(noOrderedStateCle);
+        assertNull(noOrderedStateJpaCle.getOrderedState());
+        noOrderedStateCle.setOrderedState(ControlLoopOrderedState.UNINITIALISED);
+        noOrderedStateJpaCle = new JpaControlLoopElement(noOrderedStateCle);
+        assertEquals(testJpaControlLoopElement, noOrderedStateJpaCle);
+    }
+
+    @Test
+    public void testJpaControlLoopElementValidation() {
+        JpaControlLoopElement testJpaControlLoopElement = createJpaControlLoopElementInstance();
+
+        assertThatThrownBy(() -> {
+            testJpaControlLoopElement.validate(null);
+        }).hasMessageMatching("fieldName is marked .*ull but is null");
+
+        assertTrue(testJpaControlLoopElement.validate("").isValid());
+    }
+
+    @Test
+    public void testJpaControlLoopElementCompareTo() {
+        JpaControlLoopElement testJpaControlLoopElement = createJpaControlLoopElementInstance();
+
+        JpaControlLoopElement otherJpaControlLoopElement = new JpaControlLoopElement(testJpaControlLoopElement);
+        assertEquals(0, testJpaControlLoopElement.compareTo(otherJpaControlLoopElement));
+        assertEquals(-1, testJpaControlLoopElement.compareTo(null));
+        assertEquals(0, testJpaControlLoopElement.compareTo(testJpaControlLoopElement));
+        assertNotEquals(0, testJpaControlLoopElement.compareTo(new DummyJpaControlLoopElementChild()));
+
+        testJpaControlLoopElement
+                .setKey(new PfReferenceKey("BadValue", "0.0.1", "a95757ba-b34a-4049-a2a8-46773abcbe5e"));
+        assertNotEquals(0, testJpaControlLoopElement.compareTo(otherJpaControlLoopElement));
+        testJpaControlLoopElement.setKey(new PfReferenceKey(PfKey.NULL_KEY_NAME, PfKey.NULL_KEY_VERSION,
+                "a95757ba-b34a-4049-a2a8-46773abcbe5e"));
+        assertEquals(0, testJpaControlLoopElement.compareTo(otherJpaControlLoopElement));
+
+        testJpaControlLoopElement.setDefinition(new PfConceptKey("BadValue", "0.0.1"));
+        assertNotEquals(0, testJpaControlLoopElement.compareTo(otherJpaControlLoopElement));
+        testJpaControlLoopElement.setDefinition(new PfConceptKey("cleDef", "0.0.1"));
+        assertEquals(0, testJpaControlLoopElement.compareTo(otherJpaControlLoopElement));
+
+        testJpaControlLoopElement.setDescription("Description");
+        assertNotEquals(0, testJpaControlLoopElement.compareTo(otherJpaControlLoopElement));
+        testJpaControlLoopElement.setDescription(null);
+        assertEquals(0, testJpaControlLoopElement.compareTo(otherJpaControlLoopElement));
+
+        testJpaControlLoopElement.setOrderedState(ControlLoopOrderedState.PASSIVE);
+        assertNotEquals(0, testJpaControlLoopElement.compareTo(otherJpaControlLoopElement));
+        testJpaControlLoopElement.setOrderedState(ControlLoopOrderedState.UNINITIALISED);
+        assertEquals(0, testJpaControlLoopElement.compareTo(otherJpaControlLoopElement));
+
+        testJpaControlLoopElement.setState(ControlLoopState.PASSIVE);
+        assertNotEquals(0, testJpaControlLoopElement.compareTo(otherJpaControlLoopElement));
+        testJpaControlLoopElement.setState(ControlLoopState.UNINITIALISED);
+        assertEquals(0, testJpaControlLoopElement.compareTo(otherJpaControlLoopElement));
+
+        testJpaControlLoopElement.setParticipantType(new PfConceptKey("dummy", "0.0.1"));
+        assertNotEquals(0, testJpaControlLoopElement.compareTo(otherJpaControlLoopElement));
+        testJpaControlLoopElement.setParticipantType(new PfConceptKey("participantType", "0.0.1"));
+        assertEquals(0, testJpaControlLoopElement.compareTo(otherJpaControlLoopElement));
+
+        assertEquals(testJpaControlLoopElement, new JpaControlLoopElement(testJpaControlLoopElement));
+    }
+
+    @Test
+    public void testJpaControlLoopElementLombok() {
+        assertNotNull(new Participant());
+        JpaControlLoopElement cle0 = new JpaControlLoopElement();
+
+        assertThat(cle0.toString()).contains("JpaControlLoopElement(");
+        assertThat(cle0.hashCode()).isNotZero();
+        assertEquals(true, cle0.equals(cle0));
+        assertEquals(false, cle0.equals(null));
+
+
+        JpaControlLoopElement cle1 = new JpaControlLoopElement();
+
+        cle1.setDefinition(new PfConceptKey("defName", "0.0.1"));
+        cle1.setDescription("Description");
+        cle1.setOrderedState(ControlLoopOrderedState.UNINITIALISED);
+        cle1.setState(ControlLoopState.UNINITIALISED);
+        cle1.setParticipantId(new PfConceptKey("participant", "0.0.1"));
+
+        assertThat(cle1.toString()).contains("ControlLoopElement(");
+        assertEquals(false, cle1.hashCode() == 0);
+        assertEquals(false, cle1.equals(cle0));
+        assertEquals(false, cle1.equals(null));
+
+        assertNotEquals(cle1, cle0);
+
+        JpaControlLoopElement cle2 = new JpaControlLoopElement();
+        assertEquals(cle2, cle0);
+    }
+
+    private JpaControlLoopElement createJpaControlLoopElementInstance() {
+        ControlLoopElement testCle = createControlLoopElementInstance();
+        JpaControlLoopElement testJpaControlLoopElement = new JpaControlLoopElement();
+        testJpaControlLoopElement.setKey(null);
+        testJpaControlLoopElement.fromAuthorative(testCle);
+        testJpaControlLoopElement.setKey(PfReferenceKey.getNullKey());
+        testJpaControlLoopElement.fromAuthorative(testCle);
+
+        return testJpaControlLoopElement;
+    }
+
+    private ControlLoopElement createControlLoopElementInstance() {
+        ControlLoopElement controlLoopElement = new ControlLoopElement();
+        controlLoopElement.setId(UUID.fromString("a95757ba-b34a-4049-a2a8-46773abcbe5e"));
+        controlLoopElement.setDefinition(new ToscaConceptIdentifier("cleDef", "0.0.1"));
+        controlLoopElement.setParticipantType(new ToscaConceptIdentifier("participantType", "0.0.1"));
+
+        return controlLoopElement;
+    }
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaControlLoopTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaControlLoopTest.java
new file mode 100644
index 0000000..01062b0
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaControlLoopTest.java
@@ -0,0 +1,296 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.models.controlloop.persistence.concepts;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatCode;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.util.LinkedHashMap;
+import org.junit.Test;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoop;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopOrderedState;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopState;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoops;
+import org.onap.policy.common.utils.coder.CoderException;
+import org.onap.policy.common.utils.coder.StandardCoder;
+import org.onap.policy.models.base.PfConceptKey;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+/**
+ * Test the {@link JpaControlLoopTest} class.
+ */
+public class JpaControlLoopTest {
+
+    private static final String NULL_KEY_ERROR = "key is marked .*ull but is null";
+
+    @Test
+    public void testJpaControlLoopConstructor() {
+        assertThatThrownBy(() -> {
+            new JpaControlLoop((JpaControlLoop) null);
+        }).hasMessageMatching("copyConcept is marked .*ull but is null");
+
+        assertThatThrownBy(() -> {
+            new JpaControlLoop((PfConceptKey) null);
+        }).hasMessageMatching(NULL_KEY_ERROR);
+
+        assertThatThrownBy(() -> {
+            new JpaControlLoop(null, null, null, null);
+        }).hasMessageMatching(NULL_KEY_ERROR);
+
+        assertThatThrownBy(() -> {
+            new JpaControlLoop(null, null, null, new LinkedHashMap<>());
+        }).hasMessageMatching(NULL_KEY_ERROR);
+
+        assertThatThrownBy(() -> {
+            new JpaControlLoop(null, null, ControlLoopState.UNINITIALISED, null);
+        }).hasMessageMatching(NULL_KEY_ERROR);
+
+        assertThatThrownBy(() -> {
+            new JpaControlLoop(null, null, ControlLoopState.UNINITIALISED, new LinkedHashMap<>());
+        }).hasMessageMatching(NULL_KEY_ERROR);
+
+        assertThatThrownBy(() -> {
+            new JpaControlLoop(null, new PfConceptKey(), null, null);
+        }).hasMessageMatching(NULL_KEY_ERROR);
+
+        assertThatThrownBy(() -> {
+            new JpaControlLoop(null, new PfConceptKey(), null, new LinkedHashMap<>());
+        }).hasMessageMatching(NULL_KEY_ERROR);
+
+        assertThatThrownBy(() -> {
+            new JpaControlLoop(null, new PfConceptKey(), ControlLoopState.UNINITIALISED, null);
+        }).hasMessageMatching(NULL_KEY_ERROR);
+
+        assertThatThrownBy(() -> {
+            new JpaControlLoop(null, new PfConceptKey(), ControlLoopState.UNINITIALISED, new LinkedHashMap<>());
+        }).hasMessageMatching(NULL_KEY_ERROR);
+
+        assertThatThrownBy(() -> {
+            new JpaControlLoop(new PfConceptKey(), null, null, null);
+        }).hasMessageMatching("definition is marked .*ull but is null");
+
+        assertThatThrownBy(() -> {
+            new JpaControlLoop(new PfConceptKey(), null, null, new LinkedHashMap<>());
+        }).hasMessageMatching("definition is marked .*ull but is null");
+
+        assertThatThrownBy(() -> {
+            new JpaControlLoop(new PfConceptKey(), null, ControlLoopState.UNINITIALISED, null);
+        }).hasMessageMatching("definition is marked .*ull but is null");
+
+        assertThatThrownBy(() -> {
+            new JpaControlLoop(new PfConceptKey(), null, ControlLoopState.UNINITIALISED, new LinkedHashMap<>());
+        }).hasMessageMatching("definition is marked .*ull but is null");
+
+        assertThatThrownBy(() -> {
+            new JpaControlLoop(new PfConceptKey(), new PfConceptKey(), null, null);
+        }).hasMessageMatching("state is marked .*ull but is null");
+
+        assertThatThrownBy(() -> {
+            new JpaControlLoop(new PfConceptKey(), new PfConceptKey(), null, new LinkedHashMap<>());
+        }).hasMessageMatching("state is marked .*ull but is null");
+
+        assertThatThrownBy(() -> {
+            new JpaControlLoop(new PfConceptKey(), new PfConceptKey(), ControlLoopState.UNINITIALISED, null);
+        }).hasMessageMatching("elements is marked .*ull but is null");
+
+        assertNotNull(new JpaControlLoop());
+        assertNotNull(new JpaControlLoop((new PfConceptKey())));
+        assertNotNull(new JpaControlLoop(new PfConceptKey(), new PfConceptKey(), ControlLoopState.UNINITIALISED,
+                new LinkedHashMap<>()));
+    }
+
+    @Test
+    public void testJpaControlLoop() {
+        JpaControlLoop testJpaControlLoop = createJpaControlLoopInstance();
+
+        ControlLoop participant = createControlLoopInstance();
+        assertEquals(participant, testJpaControlLoop.toAuthorative());
+
+        assertThatThrownBy(() -> {
+            testJpaControlLoop.fromAuthorative(null);
+        }).hasMessageMatching("controlLoop is marked .*ull but is null");
+
+        assertThatThrownBy(() -> new JpaControlLoop((JpaControlLoop) null)).isInstanceOf(NullPointerException.class);
+
+        JpaControlLoop testJpaControlLoopFa = new JpaControlLoop();
+        testJpaControlLoopFa.setKey(null);
+        testJpaControlLoopFa.fromAuthorative(participant);
+        assertEquals(testJpaControlLoop, testJpaControlLoopFa);
+        testJpaControlLoopFa.setKey(PfConceptKey.getNullKey());
+        testJpaControlLoopFa.fromAuthorative(participant);
+        assertEquals(testJpaControlLoop, testJpaControlLoopFa);
+        testJpaControlLoopFa.setKey(new PfConceptKey("control-loop", "0.0.1"));
+        testJpaControlLoopFa.fromAuthorative(participant);
+        assertEquals(testJpaControlLoop, testJpaControlLoopFa);
+
+        assertEquals("control-loop", testJpaControlLoop.getKey().getName());
+        assertEquals("control-loop", new JpaControlLoop(createControlLoopInstance()).getKey().getName());
+        assertEquals("control-loop",
+                ((PfConceptKey) new JpaControlLoop(createControlLoopInstance()).getKeys().get(0)).getName());
+
+        testJpaControlLoop.clean();
+        assertEquals("control-loop", testJpaControlLoop.getKey().getName());
+
+        testJpaControlLoop.setDescription("   A Message   ");
+        testJpaControlLoop.clean();
+        assertEquals("A Message", testJpaControlLoop.getDescription());
+
+        JpaControlLoop testJpaControlLoop2 = new JpaControlLoop(testJpaControlLoop);
+        assertEquals(testJpaControlLoop, testJpaControlLoop2);
+    }
+
+    @Test
+    public void testJpaControlLoopElementOrderedState() throws CoderException {
+        ControlLoop testControlLoop = createControlLoopInstance();
+        JpaControlLoop testJpaControlLoop = createJpaControlLoopInstance();
+
+        testJpaControlLoop.setOrderedState(null);
+        assertEquals(testControlLoop, testJpaControlLoop.toAuthorative());
+        testJpaControlLoop.setOrderedState(ControlLoopOrderedState.UNINITIALISED);
+
+        ControlLoop noOrderedStateCl = new StandardCoder()
+                .decode(new File("src/test/resources/json/ControlLoopNoOrderedState.json"), ControlLoop.class);
+
+        JpaControlLoop noOrderedStateJpaCl = new JpaControlLoop(noOrderedStateCl);
+        assertNull(noOrderedStateJpaCl.getOrderedState());
+        noOrderedStateCl.setOrderedState(ControlLoopOrderedState.UNINITIALISED);
+        noOrderedStateJpaCl = new JpaControlLoop(noOrderedStateCl);
+        assertEquals(testJpaControlLoop, noOrderedStateJpaCl);
+
+        ControlLoops controlLoopsWithElements = new StandardCoder()
+                .decode(new File("src/test/resources/providers/TestControlLoops.json"), ControlLoops.class);
+
+        JpaControlLoop jpaControlLoopWithElements =
+                new JpaControlLoop(controlLoopsWithElements.getControlLoopList().get(0));
+        assertEquals(4, jpaControlLoopWithElements.getElements().size());
+        assertEquals(18, jpaControlLoopWithElements.getKeys().size());
+        assertThatCode(() -> jpaControlLoopWithElements.clean()).doesNotThrowAnyException();
+
+        assertEquals(controlLoopsWithElements.getControlLoopList().get(0), jpaControlLoopWithElements.toAuthorative());
+    }
+
+    @Test
+    public void testJpaControlLoopValidation() {
+        JpaControlLoop testJpaControlLoop = createJpaControlLoopInstance();
+
+        assertThatThrownBy(() -> {
+            testJpaControlLoop.validate(null);
+        }).hasMessageMatching("fieldName is marked .*ull but is null");
+
+        assertTrue(testJpaControlLoop.validate("").isValid());
+    }
+
+    @Test
+    public void testJpaControlLoopCompareTo() {
+        JpaControlLoop testJpaControlLoop = createJpaControlLoopInstance();
+
+        JpaControlLoop otherJpaControlLoop = new JpaControlLoop(testJpaControlLoop);
+        assertEquals(0, testJpaControlLoop.compareTo(otherJpaControlLoop));
+        assertEquals(-1, testJpaControlLoop.compareTo(null));
+        assertEquals(0, testJpaControlLoop.compareTo(testJpaControlLoop));
+        assertNotEquals(0, testJpaControlLoop.compareTo(new DummyJpaControlLoopChild()));
+
+        testJpaControlLoop.setKey(new PfConceptKey("BadValue", "0.0.1"));
+        assertNotEquals(0, testJpaControlLoop.compareTo(otherJpaControlLoop));
+        testJpaControlLoop.setKey(new PfConceptKey("control-loop", "0.0.1"));
+        assertEquals(0, testJpaControlLoop.compareTo(otherJpaControlLoop));
+
+        testJpaControlLoop.setDefinition(new PfConceptKey("BadValue", "0.0.1"));
+        assertNotEquals(0, testJpaControlLoop.compareTo(otherJpaControlLoop));
+        testJpaControlLoop.setDefinition(new PfConceptKey("controlLoopDefinitionName", "0.0.1"));
+        assertEquals(0, testJpaControlLoop.compareTo(otherJpaControlLoop));
+
+        testJpaControlLoop.setState(ControlLoopState.PASSIVE);
+        assertNotEquals(0, testJpaControlLoop.compareTo(otherJpaControlLoop));
+        testJpaControlLoop.setState(ControlLoopState.UNINITIALISED);
+        assertEquals(0, testJpaControlLoop.compareTo(otherJpaControlLoop));
+
+        testJpaControlLoop.setOrderedState(ControlLoopOrderedState.PASSIVE);
+        assertNotEquals(0, testJpaControlLoop.compareTo(otherJpaControlLoop));
+        testJpaControlLoop.setOrderedState(ControlLoopOrderedState.UNINITIALISED);
+        assertEquals(0, testJpaControlLoop.compareTo(otherJpaControlLoop));
+
+        testJpaControlLoop.setDescription("A description");
+        assertNotEquals(0, testJpaControlLoop.compareTo(otherJpaControlLoop));
+        testJpaControlLoop.setDescription(null);
+        assertEquals(0, testJpaControlLoop.compareTo(otherJpaControlLoop));
+
+        assertEquals(testJpaControlLoop, new JpaControlLoop(testJpaControlLoop));
+    }
+
+    @Test
+    public void testJpaControlLoopLombok() {
+        assertNotNull(new ControlLoop());
+        JpaControlLoop cl0 = new JpaControlLoop();
+
+        assertThat(cl0.toString()).contains("JpaControlLoop(");
+        assertThat(cl0.hashCode()).isNotZero();
+        assertEquals(true, cl0.equals(cl0));
+        assertEquals(false, cl0.equals(null));
+
+
+        JpaControlLoop cl1 = new JpaControlLoop();
+
+        cl1.setDefinition(new PfConceptKey("defName", "0.0.1"));
+        cl1.setDescription("Description");
+        cl1.setElements(new LinkedHashMap<>());
+        cl1.setKey(new PfConceptKey("participant", "0.0.1"));
+        cl1.setState(ControlLoopState.UNINITIALISED);
+
+        assertThat(cl1.toString()).contains("ControlLoop(");
+        assertEquals(false, cl1.hashCode() == 0);
+        assertEquals(false, cl1.equals(cl0));
+        assertEquals(false, cl1.equals(null));
+
+        assertNotEquals(cl1, cl0);
+
+        JpaControlLoop cl2 = new JpaControlLoop();
+        assertEquals(cl2, cl0);
+    }
+
+    private JpaControlLoop createJpaControlLoopInstance() {
+        ControlLoop testControlLoop = createControlLoopInstance();
+        JpaControlLoop testJpaControlLoop = new JpaControlLoop();
+        testJpaControlLoop.setKey(null);
+        testJpaControlLoop.fromAuthorative(testControlLoop);
+        testJpaControlLoop.setKey(PfConceptKey.getNullKey());
+        testJpaControlLoop.fromAuthorative(testControlLoop);
+
+        return testJpaControlLoop;
+    }
+
+    private ControlLoop createControlLoopInstance() {
+        ControlLoop testControlLoop = new ControlLoop();
+        testControlLoop.setName("control-loop");
+        testControlLoop.setVersion("0.0.1");
+        testControlLoop.setDefinition(new ToscaConceptIdentifier("controlLoopDefinitionName", "0.0.1"));
+        testControlLoop.setElements(new LinkedHashMap<>());
+
+        return testControlLoop;
+    }
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaParticipantStatisticsTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaParticipantStatisticsTest.java
new file mode 100644
index 0000000..7eedd24
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaParticipantStatisticsTest.java
@@ -0,0 +1,193 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.models.controlloop.persistence.concepts;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.time.Instant;
+import org.junit.Test;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.Participant;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantHealthStatus;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantState;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantStatistics;
+import org.onap.policy.common.parameters.BeanValidationResult;
+import org.onap.policy.models.base.PfConceptKey;
+import org.onap.policy.models.base.PfTimestampKey;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+/**
+ * Test the {@link JpaParticipantStatistics} class.
+ */
+public class JpaParticipantStatisticsTest {
+
+    private static final String NULL_KEY_ERROR = "key is marked .*ull but is null";
+
+    @Test
+    public void testJpaParticipantStatisticsConstructor() {
+        assertThatThrownBy(() -> {
+            new JpaParticipantStatistics((JpaParticipantStatistics) null);
+        }).hasMessageMatching("copyConcept is marked .*ull but is null");
+
+        assertThatThrownBy(() -> {
+            new JpaParticipantStatistics((PfTimestampKey) null);
+        }).hasMessageMatching(NULL_KEY_ERROR);
+
+        assertThatThrownBy(() -> {
+            new JpaParticipantStatistics(null, null);
+        }).hasMessageMatching(NULL_KEY_ERROR);
+
+        assertThatThrownBy(() -> {
+            new JpaParticipantStatistics(null, new PfConceptKey());
+        }).hasMessageMatching(NULL_KEY_ERROR);
+
+        assertThatThrownBy(() -> {
+            new JpaParticipantStatistics(new PfTimestampKey(), null);
+        }).hasMessageMatching("participantId is marked .*ull but is null");
+
+        assertNotNull(new JpaParticipantStatistics());
+        assertNotNull(new JpaParticipantStatistics((new PfTimestampKey())));
+        assertNotNull(new JpaParticipantStatistics(new PfTimestampKey(), new PfConceptKey()));
+    }
+
+    @Test
+    public void testJpaParticipantStatistics() {
+        JpaParticipantStatistics testJpaParticipantStatistics = createJpaParticipantStatisticsInstance();
+
+        ParticipantStatistics cles = createParticipantStatisticsInstance();
+        assertEquals(cles, testJpaParticipantStatistics.toAuthorative());
+
+        assertThatThrownBy(() -> {
+            testJpaParticipantStatistics.fromAuthorative(null);
+        }).hasMessageMatching("participantStatistics is marked .*ull but is null");
+
+        assertThatThrownBy(() -> new JpaParticipantStatistics((JpaParticipantStatistics) null))
+                .isInstanceOf(NullPointerException.class);
+
+        JpaParticipantStatistics testJpaParticipantStatisticsFa = new JpaParticipantStatistics();
+        testJpaParticipantStatisticsFa.setKey(null);
+        testJpaParticipantStatisticsFa.fromAuthorative(cles);
+        assertEquals(testJpaParticipantStatistics, testJpaParticipantStatisticsFa);
+        testJpaParticipantStatisticsFa.setKey(PfTimestampKey.getNullKey());
+        testJpaParticipantStatisticsFa.fromAuthorative(cles);
+        assertEquals(testJpaParticipantStatistics, testJpaParticipantStatisticsFa);
+        testJpaParticipantStatisticsFa
+                .setKey(new PfTimestampKey("participantName", "0.0.1", Instant.ofEpochMilli(123456L)));
+        testJpaParticipantStatisticsFa.fromAuthorative(cles);
+        assertEquals(testJpaParticipantStatistics, testJpaParticipantStatisticsFa);
+
+        testJpaParticipantStatisticsFa = new JpaParticipantStatistics(cles);
+        assertEquals(testJpaParticipantStatistics, testJpaParticipantStatisticsFa);
+
+        assertEquals(2, testJpaParticipantStatistics.getKeys().size());
+
+        assertEquals("participantName", testJpaParticipantStatistics.getKey().getName());
+
+        testJpaParticipantStatistics.clean();
+        assertEquals("participantName", testJpaParticipantStatistics.getKey().getName());
+
+        JpaParticipantStatistics testJpaParticipantStatistics2 =
+                new JpaParticipantStatistics(testJpaParticipantStatistics);
+        assertEquals(testJpaParticipantStatistics, testJpaParticipantStatistics2);
+    }
+
+    @Test
+    public void testJpaParticipantStatisticsValidation() {
+        JpaParticipantStatistics testJpaParticipantStatistics = createJpaParticipantStatisticsInstance();
+
+        assertThatThrownBy(() -> {
+            testJpaParticipantStatistics.validate(null);
+        }).hasMessageMatching("fieldName is marked .*ull but is null");
+
+        BeanValidationResult validationResult = testJpaParticipantStatistics.validate("");
+        assertTrue(validationResult.isValid());
+    }
+
+    @Test
+    public void testJpaParticipantStatisticsConmpareTo() {
+        JpaParticipantStatistics testJpaParticipantStatistics = createJpaParticipantStatisticsInstance();
+
+        JpaParticipantStatistics otherJpaParticipantStatistics =
+                new JpaParticipantStatistics(testJpaParticipantStatistics);
+        assertEquals(0, testJpaParticipantStatistics.compareTo(otherJpaParticipantStatistics));
+        assertEquals(-1, testJpaParticipantStatistics.compareTo(null));
+        assertEquals(0, testJpaParticipantStatistics.compareTo(testJpaParticipantStatistics));
+        assertNotEquals(0, testJpaParticipantStatistics.compareTo(new DummyJpaParticipantStatisticsChild()));
+
+        testJpaParticipantStatistics.setState(ParticipantState.UNKNOWN);
+        assertNotEquals(0, testJpaParticipantStatistics.compareTo(otherJpaParticipantStatistics));
+        testJpaParticipantStatistics.setState(ParticipantState.PASSIVE);
+        assertEquals(0, testJpaParticipantStatistics.compareTo(otherJpaParticipantStatistics));
+
+        assertEquals(testJpaParticipantStatistics, new JpaParticipantStatistics(testJpaParticipantStatistics));
+    }
+
+    @Test
+    public void testJpaParticipantStatisticsLombok() {
+        assertNotNull(new Participant());
+        JpaParticipantStatistics ps0 = new JpaParticipantStatistics();
+
+        assertThat(ps0.toString()).contains("JpaParticipantStatistics(");
+        assertThat(ps0.hashCode()).isNotZero();
+        assertEquals(true, ps0.equals(ps0));
+        assertEquals(false, ps0.equals(null));
+
+
+        JpaParticipantStatistics ps1 = new JpaParticipantStatistics();
+
+        ps1.setState(ParticipantState.UNKNOWN);
+
+        assertThat(ps1.toString()).contains("JpaParticipantStatistics(");
+        assertEquals(false, ps1.hashCode() == 0);
+        assertEquals(false, ps1.equals(ps0));
+        assertEquals(false, ps1.equals(null));
+
+        assertNotEquals(ps1, ps0);
+
+        JpaParticipantStatistics ps2 = new JpaParticipantStatistics();
+        assertEquals(ps2, ps0);
+    }
+
+    private JpaParticipantStatistics createJpaParticipantStatisticsInstance() {
+        ParticipantStatistics testCles = createParticipantStatisticsInstance();
+        JpaParticipantStatistics testJpaParticipantStatistics = new JpaParticipantStatistics();
+        testJpaParticipantStatistics.setKey(null);
+        testJpaParticipantStatistics.fromAuthorative(testCles);
+        testJpaParticipantStatistics.setKey(PfTimestampKey.getNullKey());
+        testJpaParticipantStatistics.fromAuthorative(testCles);
+
+        return testJpaParticipantStatistics;
+    }
+
+    private ParticipantStatistics createParticipantStatisticsInstance() {
+        ParticipantStatistics participantStatistics = new ParticipantStatistics();
+        participantStatistics.setParticipantId(new ToscaConceptIdentifier("participantName", "0.0.1"));
+        participantStatistics.setTimeStamp(Instant.ofEpochMilli(123456L));
+        participantStatistics.setState(ParticipantState.PASSIVE);
+        participantStatistics.setHealthStatus(ParticipantHealthStatus.HEALTHY);
+
+        return participantStatistics;
+    }
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaParticipantTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaParticipantTest.java
new file mode 100644
index 0000000..5c96df6
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaParticipantTest.java
@@ -0,0 +1,253 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.models.controlloop.persistence.concepts;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.Participant;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantHealthStatus;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantState;
+import org.onap.policy.models.base.PfConceptKey;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+/**
+ * Test the {@link JpaParticiant} class.
+ */
+public class JpaParticipantTest {
+
+    private static final String NULL_KEY_ERROR = "key is marked .*ull but is null";
+
+    @Test
+    public void testJpaParticipantConstructor() {
+        assertThatThrownBy(() -> {
+            new JpaParticipant((JpaParticipant) null);
+        }).hasMessageMatching("copyConcept is marked .*ull but is null");
+
+        assertThatThrownBy(() -> {
+            new JpaParticipant((PfConceptKey) null);
+        }).hasMessageMatching(NULL_KEY_ERROR);
+
+        assertThatThrownBy(() -> {
+            new JpaParticipant(null, null, null, null);
+        }).hasMessageMatching(NULL_KEY_ERROR);
+
+        assertThatThrownBy(() -> {
+            new JpaParticipant(null, null, null, ParticipantHealthStatus.HEALTHY);
+        }).hasMessageMatching(NULL_KEY_ERROR);
+
+        assertThatThrownBy(() -> {
+            new JpaParticipant(null, null, ParticipantState.ACTIVE, null);
+        }).hasMessageMatching(NULL_KEY_ERROR);
+
+        assertThatThrownBy(() -> {
+            new JpaParticipant(null, null, ParticipantState.ACTIVE, ParticipantHealthStatus.HEALTHY);
+        }).hasMessageMatching(NULL_KEY_ERROR);
+
+        assertThatThrownBy(() -> {
+            new JpaParticipant(null, new PfConceptKey(), null, null);
+        }).hasMessageMatching(NULL_KEY_ERROR);
+
+        assertThatThrownBy(() -> {
+            new JpaParticipant(null, new PfConceptKey(), null, ParticipantHealthStatus.HEALTHY);
+        }).hasMessageMatching(NULL_KEY_ERROR);
+
+        assertThatThrownBy(() -> {
+            new JpaParticipant(null, new PfConceptKey(), ParticipantState.ACTIVE, null);
+        }).hasMessageMatching(NULL_KEY_ERROR);
+
+        assertThatThrownBy(() -> {
+            new JpaParticipant(null, new PfConceptKey(), ParticipantState.ACTIVE, ParticipantHealthStatus.HEALTHY);
+        }).hasMessageMatching(NULL_KEY_ERROR);
+
+        assertThatThrownBy(() -> {
+            new JpaParticipant(new PfConceptKey(), null, null, null);
+        }).hasMessageMatching("definition is marked .*ull but is null");
+
+        assertThatThrownBy(() -> {
+            new JpaParticipant(new PfConceptKey(), null, null, ParticipantHealthStatus.HEALTHY);
+        }).hasMessageMatching("definition is marked .*ull but is null");
+
+        assertThatThrownBy(() -> {
+            new JpaParticipant(new PfConceptKey(), null, ParticipantState.ACTIVE, null);
+        }).hasMessageMatching("definition is marked .*ull but is null");
+
+        assertThatThrownBy(() -> {
+            new JpaParticipant(new PfConceptKey(), null, ParticipantState.ACTIVE, ParticipantHealthStatus.HEALTHY);
+        }).hasMessageMatching("definition is marked .*ull but is null");
+
+        assertThatThrownBy(() -> {
+            new JpaParticipant(new PfConceptKey(), new PfConceptKey(), null, null);
+        }).hasMessageMatching("participantState is marked .*ull but is null");
+
+        assertThatThrownBy(() -> {
+            new JpaParticipant(new PfConceptKey(), new PfConceptKey(), null, ParticipantHealthStatus.HEALTHY);
+        }).hasMessageMatching("participantState is marked .*ull but is null");
+
+        assertThatThrownBy(() -> {
+            new JpaParticipant(new PfConceptKey(), new PfConceptKey(), ParticipantState.ACTIVE, null);
+        }).hasMessageMatching("healthStatus is marked .*ull but is null");
+
+        assertNotNull(new JpaParticipant());
+        assertNotNull(new JpaParticipant((new PfConceptKey())));
+        assertNotNull(new JpaParticipant(new PfConceptKey(), new PfConceptKey(), ParticipantState.ACTIVE,
+                ParticipantHealthStatus.HEALTHY));
+    }
+
+    @Test
+    public void testJpaParticipant() {
+        JpaParticipant testJpaParticipant = createJpaParticipantInstance();
+
+        Participant participant = createParticipantInstance();
+        assertEquals(participant, testJpaParticipant.toAuthorative());
+
+        assertThatThrownBy(() -> {
+            testJpaParticipant.fromAuthorative(null);
+        }).hasMessageMatching("participant is marked .*ull but is null");
+
+        assertThatThrownBy(() -> new JpaParticipant((JpaParticipant) null)).isInstanceOf(NullPointerException.class);
+
+        JpaParticipant testJpaParticipantFa = new JpaParticipant();
+        testJpaParticipantFa.setKey(null);
+        testJpaParticipantFa.fromAuthorative(participant);
+        assertEquals(testJpaParticipant, testJpaParticipantFa);
+        testJpaParticipantFa.setKey(PfConceptKey.getNullKey());
+        testJpaParticipantFa.fromAuthorative(participant);
+        assertEquals(testJpaParticipant, testJpaParticipantFa);
+        testJpaParticipantFa.setKey(new PfConceptKey("participant", "0.0.1"));
+        testJpaParticipantFa.fromAuthorative(participant);
+        assertEquals(testJpaParticipant, testJpaParticipantFa);
+
+        assertEquals("participant", testJpaParticipant.getKey().getName());
+        assertEquals("participant", new JpaParticipant(createParticipantInstance()).getKey().getName());
+        assertEquals("participant",
+                ((PfConceptKey) new JpaParticipant(createParticipantInstance()).getKeys().get(0)).getName());
+
+        testJpaParticipant.clean();
+        assertEquals("participant", testJpaParticipant.getKey().getName());
+
+        testJpaParticipant.setDescription("   A Message   ");
+        testJpaParticipant.clean();
+        assertEquals("A Message", testJpaParticipant.getDescription());
+
+        JpaParticipant testJpaParticipant2 = new JpaParticipant(testJpaParticipant);
+        assertEquals(testJpaParticipant, testJpaParticipant2);
+    }
+
+    @Test
+    public void testJpaParticipantValidation() {
+        JpaParticipant testJpaParticipant = createJpaParticipantInstance();
+
+        assertThatThrownBy(() -> {
+            testJpaParticipant.validate(null);
+        }).hasMessageMatching("fieldName is marked .*ull but is null");
+
+        assertTrue(testJpaParticipant.validate("").isValid());
+    }
+
+    @Test
+    public void testJpaParticipantCompareTo() {
+        JpaParticipant testJpaParticipant = createJpaParticipantInstance();
+
+        JpaParticipant otherJpaParticipant = new JpaParticipant(testJpaParticipant);
+        assertEquals(0, testJpaParticipant.compareTo(otherJpaParticipant));
+        assertEquals(-1, testJpaParticipant.compareTo(null));
+        assertEquals(0, testJpaParticipant.compareTo(testJpaParticipant));
+        assertNotEquals(0, testJpaParticipant.compareTo(new DummyJpaParticipantChild()));
+
+        testJpaParticipant.setKey(new PfConceptKey("BadValue", "0.0.1"));
+        assertNotEquals(0, testJpaParticipant.compareTo(otherJpaParticipant));
+        testJpaParticipant.setKey(new PfConceptKey("participant", "0.0.1"));
+        assertEquals(0, testJpaParticipant.compareTo(otherJpaParticipant));
+
+        testJpaParticipant.setDefinition(new PfConceptKey("BadValue", "0.0.1"));
+        assertNotEquals(0, testJpaParticipant.compareTo(otherJpaParticipant));
+        testJpaParticipant.setDefinition(new PfConceptKey("participantDefinitionName", "0.0.1"));
+        assertEquals(0, testJpaParticipant.compareTo(otherJpaParticipant));
+
+        testJpaParticipant.setParticipantState(ParticipantState.PASSIVE);
+        assertNotEquals(0, testJpaParticipant.compareTo(otherJpaParticipant));
+        testJpaParticipant.setParticipantState(ParticipantState.UNKNOWN);
+        assertEquals(0, testJpaParticipant.compareTo(otherJpaParticipant));
+
+        testJpaParticipant.setHealthStatus(ParticipantHealthStatus.NOT_HEALTHY);
+        assertNotEquals(0, testJpaParticipant.compareTo(otherJpaParticipant));
+        testJpaParticipant.setHealthStatus(ParticipantHealthStatus.UNKNOWN);
+        assertEquals(0, testJpaParticipant.compareTo(otherJpaParticipant));
+
+        assertEquals(testJpaParticipant, new JpaParticipant(testJpaParticipant));
+    }
+
+    @Test
+    public void testJpaParticipantLombok() {
+        assertNotNull(new Participant());
+        JpaParticipant p0 = new JpaParticipant();
+
+        assertThat(p0.toString()).contains("JpaParticipant(");
+        assertThat(p0.hashCode()).isNotZero();
+        assertEquals(true, p0.equals(p0));
+        assertEquals(false, p0.equals(null));
+
+
+        JpaParticipant p1 = new JpaParticipant();
+
+        p1.setDefinition(new PfConceptKey("defName", "0.0.1"));
+        p1.setDescription("Description");
+        p1.setHealthStatus(ParticipantHealthStatus.HEALTHY);
+        p1.setKey(new PfConceptKey("participant", "0.0.1"));
+        p1.setParticipantState(ParticipantState.ACTIVE);
+
+        assertThat(p1.toString()).contains("Participant(");
+        assertEquals(false, p1.hashCode() == 0);
+        assertEquals(false, p1.equals(p0));
+        assertEquals(false, p1.equals(null));
+
+        assertNotEquals(p1, p0);
+
+        JpaParticipant p2 = new JpaParticipant();
+        assertEquals(p2, p0);
+    }
+
+    private JpaParticipant createJpaParticipantInstance() {
+        Participant testParticipant = createParticipantInstance();
+        JpaParticipant testJpaParticipant = new JpaParticipant();
+        testJpaParticipant.setKey(null);
+        testJpaParticipant.fromAuthorative(testParticipant);
+        testJpaParticipant.setKey(PfConceptKey.getNullKey());
+        testJpaParticipant.fromAuthorative(testParticipant);
+
+        return testJpaParticipant;
+    }
+
+    private Participant createParticipantInstance() {
+        Participant testParticipant = new Participant();
+        testParticipant.setName("participant");
+        testParticipant.setVersion("0.0.1");
+        testParticipant.setDefinition(new ToscaConceptIdentifier("participantDefinitionName", "0.0.1"));
+
+        return testParticipant;
+    }
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/PojosTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/PojosTest.java
new file mode 100644
index 0000000..9e21b21
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/PojosTest.java
@@ -0,0 +1,62 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.models.controlloop.persistence.concepts;
+
+import com.openpojo.reflection.PojoClass;
+import com.openpojo.reflection.impl.PojoClassFactory;
+import com.openpojo.validation.Validator;
+import com.openpojo.validation.ValidatorBuilder;
+import com.openpojo.validation.rule.impl.EqualsAndHashCodeMatchRule;
+import com.openpojo.validation.rule.impl.GetterMustExistRule;
+import com.openpojo.validation.rule.impl.NoPublicFieldsExceptStaticFinalRule;
+import com.openpojo.validation.rule.impl.SetterMustExistRule;
+import com.openpojo.validation.test.impl.GetterTester;
+import com.openpojo.validation.test.impl.SetterTester;
+import java.util.List;
+import org.junit.Test;
+import org.onap.policy.common.utils.test.ToStringTester;
+
+/**
+ * Class to perform unit tests of all pojos.
+ */
+public class PojosTest {
+
+    @Test
+    public void testPojos() {
+        List<PojoClass> pojoClasses =
+                PojoClassFactory.getPojoClasses(PojosTest.class.getPackageName());
+
+        // @formatter:off
+        final Validator validator = ValidatorBuilder
+                .create()
+                .with(new SetterMustExistRule())
+                .with(new GetterMustExistRule())
+                .with(new EqualsAndHashCodeMatchRule())
+                .with(new NoPublicFieldsExceptStaticFinalRule())
+                .with(new SetterTester())
+                .with(new GetterTester())
+                .with(new ToStringTester())
+                .build();
+
+        validator.validate(pojoClasses);
+        // @formatter:on
+    }
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ClElementStatisticsProviderTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ClElementStatisticsProviderTest.java
new file mode 100644
index 0000000..f5d094f
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ClElementStatisticsProviderTest.java
@@ -0,0 +1,115 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.models.controlloop.persistence.provider;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.junit.Assert.assertEquals;
+
+import java.time.Instant;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ClElementStatistics;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ClElementStatisticsList;
+import org.onap.policy.common.utils.coder.Coder;
+import org.onap.policy.common.utils.coder.StandardCoder;
+import org.onap.policy.common.utils.resources.ResourceUtils;
+import org.onap.policy.models.provider.PolicyModelsProviderParameters;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+public class ClElementStatisticsProviderTest {
+    private static final String LIST_IS_NULL = ".*. is marked .*ull but is null";
+    private static final Coder CODER = new StandardCoder();
+    private static final String CL_ELEMENT_STATS_JSON =
+        "src/test/resources/providers/TestClElementStatistics.json";
+
+    private static AtomicInteger dbNameCounter = new AtomicInteger();
+
+    private PolicyModelsProviderParameters parameters;
+    private ClElementStatisticsProvider clElementStatisticsProvider;
+    private ClElementStatisticsList inputClElementStats;
+    private String originalJson = ResourceUtils.getResourceAsString(CL_ELEMENT_STATS_JSON);
+
+    /**
+     * Set up test ClElement statistics provider.
+     */
+    @Before
+    public void setupDao() throws Exception {
+
+        parameters = new PolicyModelsProviderParameters();
+        parameters.setDatabaseDriver("org.h2.Driver");
+        parameters.setName("PolicyProviderParameterGroup");
+        parameters.setImplementation("org.onap.policy.models.provider.impl.DatabasePolicyModelsProviderImpl");
+        parameters.setDatabaseUrl("jdbc:h2:mem:clElementTestDb" + dbNameCounter.getAndIncrement());
+        parameters.setDatabaseUser("policy");
+        parameters.setDatabasePassword("P01icY");
+        parameters.setPersistenceUnit("ToscaConceptTest");
+
+        clElementStatisticsProvider = new ClElementStatisticsProvider(parameters);
+        inputClElementStats = CODER.decode(originalJson, ClElementStatisticsList.class);
+    }
+
+    @After
+    public void teardown() {
+        clElementStatisticsProvider.close();
+    }
+
+    @Test
+    public void testClElementStatisticsCreate() throws Exception {
+        assertThatThrownBy(() -> {
+            clElementStatisticsProvider.createClElementStatistics(null);
+        }).hasMessageMatching(LIST_IS_NULL);
+
+        ClElementStatisticsList createdClElementStats = new ClElementStatisticsList();
+        createdClElementStats.setClElementStatistics(clElementStatisticsProvider
+            .createClElementStatistics(inputClElementStats.getClElementStatistics()));
+
+        assertEquals(inputClElementStats.toString().replaceAll("\\s+", ""),
+            createdClElementStats.toString().replaceAll("\\s+", ""));
+    }
+
+    @Test
+    public void testGetClElementStatistics() throws Exception {
+
+        List<ClElementStatistics> getResponse;
+
+        //Return empty list when no data present in db
+        getResponse = clElementStatisticsProvider.getClElementStatistics(null, null, null,
+            null);
+        assertThat(getResponse).isEmpty();
+
+        clElementStatisticsProvider.createClElementStatistics(inputClElementStats
+            .getClElementStatistics());
+        ToscaConceptIdentifier identifier = inputClElementStats.getClElementStatistics().get(0)
+            .getParticipantId();
+        Instant instant = inputClElementStats.getClElementStatistics().get(0).getTimeStamp();
+        String id = inputClElementStats.getClElementStatistics().get(0).getId().toString();
+        assertEquals(1, clElementStatisticsProvider.getClElementStatistics(identifier.getName(),
+            identifier.getVersion(), id, instant).size());
+
+        assertEquals(1, clElementStatisticsProvider.getFilteredClElementStatistics("name2",
+            "1.0.1", null, null, null,
+            "DESC", 1).size());
+    }
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ControlLoopProviderTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ControlLoopProviderTest.java
new file mode 100644
index 0000000..96b63a2
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ControlLoopProviderTest.java
@@ -0,0 +1,160 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.models.controlloop.persistence.provider;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoop;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopOrderedState;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoops;
+import org.onap.policy.common.utils.coder.Coder;
+import org.onap.policy.common.utils.coder.StandardCoder;
+import org.onap.policy.common.utils.resources.ResourceUtils;
+import org.onap.policy.models.provider.PolicyModelsProviderParameters;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaTypedEntityFilter;
+
+public class ControlLoopProviderTest {
+
+    private static final String LIST_IS_NULL = "controlLoops is marked .*ull but is null";
+    private static final Coder CODER = new StandardCoder();
+    private static final String CONTROL_LOOP_JSON = "src/test/resources/providers/TestControlLoops.json";
+    private static final String UPDATE_CL_JSON = "src/test/resources/providers/UpdateControlLoops.json";
+
+    private static AtomicInteger dbNameCounter = new AtomicInteger();
+
+    private PolicyModelsProviderParameters parameters;
+    private ControlLoopProvider controlLoopProvider;
+    private ControlLoops inputControlLoops;
+    private ControlLoops updateControlLoops;
+    private String originalJson = ResourceUtils.getResourceAsString(CONTROL_LOOP_JSON);
+    private String updateClJson = ResourceUtils.getResourceAsString(UPDATE_CL_JSON);
+
+    /**
+     * Set up test control loop provider.
+     */
+    @Before
+    public void setupDao() throws Exception {
+
+        parameters = new PolicyModelsProviderParameters();
+        parameters.setDatabaseDriver("org.h2.Driver");
+        parameters.setName("PolicyProviderParameterGroup");
+        parameters.setImplementation("org.onap.policy.models.provider.impl.DatabasePolicyModelsProviderImpl");
+        parameters.setDatabaseUrl("jdbc:h2:mem:controlLoopProviderTestDb" + dbNameCounter.getAndDecrement());
+        parameters.setDatabaseUser("policy");
+        parameters.setDatabasePassword("P01icY");
+        parameters.setPersistenceUnit("ToscaConceptTest");
+
+        controlLoopProvider = new ControlLoopProvider(parameters);
+
+        inputControlLoops = CODER.decode(originalJson, ControlLoops.class);
+        updateControlLoops = CODER.decode(updateClJson, ControlLoops.class);
+    }
+
+    @After
+    public void teardown() {
+        controlLoopProvider.close();
+    }
+
+    @Test
+    public void testControlLoopCreate() throws Exception {
+        assertThatThrownBy(() -> {
+            controlLoopProvider.createControlLoops(null);
+        }).hasMessageMatching(LIST_IS_NULL);
+
+        ControlLoops createdControlLoops = new ControlLoops();
+        createdControlLoops
+                .setControlLoopList(controlLoopProvider.createControlLoops(inputControlLoops.getControlLoopList()));
+
+        assertEquals(inputControlLoops, createdControlLoops);
+    }
+
+    @Test
+    public void testGetControlLoops() throws Exception {
+
+        List<ControlLoop> getResponse;
+
+        // Return empty list when no data present in db
+        getResponse = controlLoopProvider.getControlLoops(null, null);
+        assertThat(getResponse).isEmpty();
+
+        controlLoopProvider.createControlLoops(inputControlLoops.getControlLoopList());
+        String name = inputControlLoops.getControlLoopList().get(0).getName();
+        String version = inputControlLoops.getControlLoopList().get(0).getVersion();
+        assertEquals(1, controlLoopProvider.getControlLoops(name, version).size());
+
+        ControlLoop cl = new ControlLoop();
+        cl = controlLoopProvider.getControlLoop(new ToscaConceptIdentifier("PMSHInstance1", "1.0.1"));
+        assertEquals(inputControlLoops.getControlLoopList().get(1), cl);
+
+        assertNull(controlLoopProvider.getControlLoop(new ToscaConceptIdentifier("invalid_name", "1.0.1")));
+
+        assertThatThrownBy(() -> {
+            controlLoopProvider.getFilteredControlLoops(null);
+        }).hasMessageMatching("filter is marked .*ull but is null");
+
+        final ToscaTypedEntityFilter<ControlLoop> filter = ToscaTypedEntityFilter.<ControlLoop>builder()
+                .type("org.onap.domain.pmsh.PMSHControlLoopDefinition").build();
+        assertEquals(2, controlLoopProvider.getFilteredControlLoops(filter).size());
+    }
+
+
+    @Test
+    public void testUpdateControlLoops() throws Exception {
+        assertThatThrownBy(() -> {
+            controlLoopProvider.updateControlLoops(null);
+        }).hasMessageMatching("controlLoops is marked .*ull but is null");
+
+        ControlLoops existingControlLoops = new ControlLoops();
+        existingControlLoops
+                .setControlLoopList(controlLoopProvider.createControlLoops(inputControlLoops.getControlLoopList()));
+        ControlLoop updateResponse = new ControlLoop();
+        updateResponse = controlLoopProvider.updateControlLoop(updateControlLoops.getControlLoopList().get(0));
+
+        assertEquals(ControlLoopOrderedState.RUNNING, updateResponse.getOrderedState());
+    }
+
+    @Test
+    public void testDeleteControlLoop() throws Exception {
+        assertThatThrownBy(() -> {
+            controlLoopProvider.deleteControlLoop("Invalid_name", "1.0.1");
+        }).hasMessageMatching(".*.failed, control loop does not exist");
+
+        ControlLoop deletedCl;
+        List<ControlLoop> clList = controlLoopProvider.createControlLoops(inputControlLoops.getControlLoopList());
+        String name = inputControlLoops.getControlLoopList().get(0).getName();
+        String version = inputControlLoops.getControlLoopList().get(0).getVersion();
+
+        deletedCl = controlLoopProvider.deleteControlLoop(name, version);
+        assertEquals(clList.get(0), deletedCl);
+
+    }
+}
+
+
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ParticipantProviderTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ParticipantProviderTest.java
new file mode 100644
index 0000000..7a86a49
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ParticipantProviderTest.java
@@ -0,0 +1,154 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.models.controlloop.persistence.provider;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.junit.Assert.assertEquals;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.Participant;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantState;
+import org.onap.policy.common.utils.coder.Coder;
+import org.onap.policy.common.utils.coder.StandardCoder;
+import org.onap.policy.common.utils.resources.ResourceUtils;
+import org.onap.policy.models.provider.PolicyModelsProviderParameters;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaTypedEntityFilter;
+
+public class ParticipantProviderTest {
+
+    private static final Coder CODER = new StandardCoder();
+    private static final String PARTICIPANT_JSON =
+        "src/test/resources/providers/TestParticipant.json";
+    private static final String LIST_IS_NULL = ".*. is marked .*ull but is null";
+
+    private static AtomicInteger dbNameCounter = new AtomicInteger();
+
+    private PolicyModelsProviderParameters parameters;
+    private ParticipantProvider participantProvider;
+    private List<Participant> inputParticipants = new ArrayList<>();
+    private Participant updateParticipants;
+    private String originalJson = ResourceUtils.getResourceAsString(PARTICIPANT_JSON);
+
+    /**
+     * Set up test Participant provider.
+     */
+    @Before
+    public void setupDao() throws Exception {
+
+        parameters = new PolicyModelsProviderParameters();
+        parameters.setDatabaseDriver("org.h2.Driver");
+        parameters.setName("PolicyProviderParameterGroup");
+        parameters.setImplementation("org.onap.policy.models.provider.impl.DatabasePolicyModelsProviderImpl");
+        parameters.setDatabaseUrl("jdbc:h2:mem:participantProviderTestDb" + dbNameCounter.getAndIncrement());
+        parameters.setDatabaseUser("policy");
+        parameters.setDatabasePassword("P01icY");
+        parameters.setPersistenceUnit("ToscaConceptTest");
+
+        participantProvider = new ParticipantProvider(parameters);
+        inputParticipants.add(CODER.decode(originalJson, Participant.class));
+
+    }
+
+    @After
+    public void teardown() {
+        participantProvider.close();
+    }
+
+    @Test
+    public void testParticipantCreate() throws Exception {
+        assertThatThrownBy(() -> {
+            participantProvider.createParticipants(null);
+        }).hasMessageMatching(LIST_IS_NULL);
+
+        List<Participant> createdParticipants = new ArrayList<>();
+        createdParticipants.addAll(participantProvider
+            .createParticipants(inputParticipants));
+
+        assertEquals(createdParticipants.get(0),
+            inputParticipants.get(0));
+    }
+
+
+    @Test
+    public void testGetControlLoops() throws Exception {
+
+        List<Participant> getResponse;
+
+        //Return empty list when no data present in db
+        getResponse = participantProvider.getParticipants(null, null);
+        assertThat(getResponse).isEmpty();
+
+        participantProvider.createParticipants(inputParticipants);
+        String name = inputParticipants.get(0).getName();
+        String version = inputParticipants.get(0).getVersion();
+        assertEquals(1, participantProvider.getParticipants(name, version).size());
+
+        assertThat(participantProvider.getParticipants("invalid_name",
+            "1.0.1")).isEmpty();
+
+        assertThatThrownBy(() -> {
+            participantProvider.getFilteredParticipants(null);
+        }).hasMessageMatching("filter is marked .*ull but is null");
+
+        final ToscaTypedEntityFilter<Participant> filter = ToscaTypedEntityFilter.<Participant>builder()
+            .type("org.onap.domain.pmsh.PMSHControlLoopDefinition").build();
+        assertEquals(1, participantProvider.getFilteredParticipants(filter).size());
+    }
+
+    @Test
+    public void testUpdateParticipant() throws Exception {
+        assertThatThrownBy(() -> {
+            participantProvider.updateParticipants(null);
+        }).hasMessageMatching("participants is marked .*ull but is null");
+
+        participantProvider.createParticipants(inputParticipants);
+        updateParticipants = inputParticipants.get(0);
+        updateParticipants.setParticipantState(ParticipantState.ACTIVE);
+        List<Participant> participantList = new ArrayList<>();
+        participantList.add(updateParticipants);
+        List<Participant> updateResponse = new ArrayList<>();
+        updateResponse = participantProvider.updateParticipants(participantList);
+
+        assertEquals(ParticipantState.ACTIVE, updateResponse.get(0).getParticipantState());
+    }
+
+    @Test
+    public void testDeleteParticipant() throws Exception {
+        assertThatThrownBy(() -> {
+            participantProvider.deleteParticipant("Invalid_name", "1.0.1");
+        }).hasMessageMatching(".*.failed, participant does not exist");
+
+        Participant deletedParticipant;
+        List<Participant> participantList = participantProvider.createParticipants(inputParticipants);
+        String name = inputParticipants.get(0).getName();
+        String version = inputParticipants.get(0).getVersion();
+
+        deletedParticipant = participantProvider.deleteParticipant(name, version);
+        assertEquals(participantList.get(0), deletedParticipant);
+
+    }
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ParticipantStatisticsProviderTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ParticipantStatisticsProviderTest.java
new file mode 100644
index 0000000..d4bc977
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ParticipantStatisticsProviderTest.java
@@ -0,0 +1,109 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.models.controlloop.persistence.provider;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.junit.Assert.assertEquals;
+
+import java.time.Instant;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantStatistics;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantStatisticsList;
+import org.onap.policy.common.utils.coder.Coder;
+import org.onap.policy.common.utils.coder.StandardCoder;
+import org.onap.policy.common.utils.resources.ResourceUtils;
+import org.onap.policy.models.provider.PolicyModelsProviderParameters;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+public class ParticipantStatisticsProviderTest {
+
+    private static final String LIST_IS_NULL = ".*. is marked .*ull but is null";
+    private static final Coder CODER = new StandardCoder();
+    private static final String PARTICIPANT_STATS_JSON = "src/test/resources/providers/TestParticipantStatistics.json";
+
+    private static AtomicInteger dbNameCounter = new AtomicInteger();
+
+    private PolicyModelsProviderParameters parameters;
+    private ParticipantStatisticsProvider participantStatisticsProvider;
+    private ParticipantStatisticsList inputParticipantStatistics;
+    private String originalJson = ResourceUtils.getResourceAsString(PARTICIPANT_STATS_JSON);
+
+    /**
+     * Set up test Participant statistics provider.
+     */
+    @Before
+    public void setupDao() throws Exception {
+
+        parameters = new PolicyModelsProviderParameters();
+        parameters.setDatabaseDriver("org.h2.Driver");
+        parameters.setName("PolicyProviderParameterGroup");
+        parameters.setImplementation("org.onap.policy.models.provider.impl.DatabasePolicyModelsProviderImpl");
+        parameters.setDatabaseUrl("jdbc:h2:mem:participantStatisticsProviderTestDb" + dbNameCounter.getAndIncrement());
+        parameters.setDatabaseUser("policy");
+        parameters.setDatabasePassword("P01icY");
+        parameters.setPersistenceUnit("ToscaConceptTest");
+
+        participantStatisticsProvider = new ParticipantStatisticsProvider(parameters);
+        inputParticipantStatistics = CODER.decode(originalJson, ParticipantStatisticsList.class);
+    }
+
+    @After
+    public void teardown() {
+        participantStatisticsProvider.close();
+    }
+
+    @Test
+    public void testParticipantStatisticsCreate() throws Exception {
+        assertThatThrownBy(() -> {
+            participantStatisticsProvider.createParticipantStatistics(null);
+        }).hasMessageMatching(LIST_IS_NULL);
+
+        ParticipantStatisticsList createdStatsList = new ParticipantStatisticsList();
+        createdStatsList.setStatisticsList(participantStatisticsProvider
+                .createParticipantStatistics(inputParticipantStatistics.getStatisticsList()));
+
+        assertEquals(inputParticipantStatistics.toString().replaceAll("\\s+", ""),
+                createdStatsList.toString().replaceAll("\\s+", ""));
+    }
+
+    @Test
+    public void testGetControlLoops() throws Exception {
+        List<ParticipantStatistics> getResponse;
+
+        // Return empty list when no data present in db
+        getResponse = participantStatisticsProvider.getParticipantStatistics(null, null, null);
+        assertThat(getResponse).isEmpty();
+
+        participantStatisticsProvider.createParticipantStatistics(inputParticipantStatistics.getStatisticsList());
+        ToscaConceptIdentifier identifier = inputParticipantStatistics.getStatisticsList().get(0).getParticipantId();
+        Instant instant = inputParticipantStatistics.getStatisticsList().get(0).getTimeStamp();
+        assertEquals(1, participantStatisticsProvider
+                .getParticipantStatistics(identifier.getName(), identifier.getVersion(), instant).size());
+
+        assertEquals(1, participantStatisticsProvider
+                .getFilteredParticipantStatistics("name2", "1.0.1", null, null, null, "DESC", 1).size());
+    }
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/notification/ControlLoopNotificationTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/notification/ControlLoopNotificationTest.java
new file mode 100644
index 0000000..d1e3dcf
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/notification/ControlLoopNotificationTest.java
@@ -0,0 +1,83 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.models.messages.dmaap.notification;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.junit.Test;
+
+public class ControlLoopNotificationTest {
+
+    @Test
+    public void testControlLoopNotification() {
+        ControlLoopNotification cln0 = new ControlLoopNotification();
+
+        List<ControlLoopStatus> addedList = new ArrayList<>();
+        addedList.add(new ControlLoopStatus());
+
+        List<ControlLoopStatus> deletedList = new ArrayList<>();
+        deletedList.add(new ControlLoopStatus());
+
+        assertEquals(true, cln0.isEmpty());
+
+        cln0.setAdded(addedList);
+        assertEquals(false, cln0.isEmpty());
+        cln0.setAdded(null);
+        assertEquals(true, cln0.isEmpty());
+
+        cln0.setDeleted(deletedList);
+        assertEquals(false, cln0.isEmpty());
+        cln0.setDeleted(null);
+        assertEquals(true, cln0.isEmpty());
+
+        cln0.setAdded(addedList);
+        cln0.setDeleted(deletedList);
+        assertEquals(false, cln0.isEmpty());
+        cln0.setAdded(null);
+        cln0.setDeleted(null);
+        assertEquals(true, cln0.isEmpty());
+    }
+
+    @Test
+    public void testControlLoopNotificationLombok() {
+        assertNotNull(new ControlLoopNotification());
+        assertNotNull(new ControlLoopNotification(new ArrayList<>(), new ArrayList<>()));
+
+        ControlLoopNotification cln0 = new ControlLoopNotification();
+
+        assertThat(cln0.toString()).contains("ControlLoopNotification(");
+        assertEquals(false, cln0.hashCode() == 0);
+        assertEquals(true, cln0.equals(cln0));
+        assertEquals(false, cln0.equals(null));
+
+
+        ControlLoopNotification cln1 = new ControlLoopNotification();
+
+        assertThat(cln1.toString()).contains("ControlLoopNotification(");
+        assertEquals(false, cln1.hashCode() == 0);
+        assertEquals(true, cln1.equals(cln0));
+        assertEquals(false, cln1.equals(null));
+    }
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/notification/ControlLoopStatusTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/notification/ControlLoopStatusTest.java
new file mode 100644
index 0000000..d1ddbf4
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/notification/ControlLoopStatusTest.java
@@ -0,0 +1,48 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.models.messages.dmaap.notification;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.util.UUID;
+import org.junit.Test;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+public class ControlLoopStatusTest {
+
+    @Test
+    public void testControlLoopStatusLombok() {
+        assertNotNull(new ControlLoopStatus());
+        assertNotNull(new ControlLoopStatus(UUID.randomUUID(), new ToscaConceptIdentifier()));
+
+        ControlLoopStatus cln0 = new ControlLoopStatus();
+
+        assertThat(cln0.toString()).contains("ControlLoopStatus(");
+        assertEquals(false, cln0.hashCode() == 0);
+        assertEquals(true, cln0.equals(cln0));
+        assertEquals(false, cln0.equals(null));
+
+        ControlLoopStatus cln1 = new ControlLoopStatus();
+        assertEquals(true, cln1.equals(cln0));
+    }
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/notification/NotificationPojosTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/notification/NotificationPojosTest.java
new file mode 100644
index 0000000..6ea07be
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/notification/NotificationPojosTest.java
@@ -0,0 +1,58 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.models.messages.dmaap.notification;
+
+import com.openpojo.reflection.PojoClass;
+import com.openpojo.reflection.impl.PojoClassFactory;
+import com.openpojo.validation.Validator;
+import com.openpojo.validation.ValidatorBuilder;
+import com.openpojo.validation.rule.impl.GetterMustExistRule;
+import com.openpojo.validation.rule.impl.SetterMustExistRule;
+import com.openpojo.validation.test.impl.GetterTester;
+import com.openpojo.validation.test.impl.SetterTester;
+import java.util.List;
+import org.junit.Test;
+import org.onap.policy.common.utils.test.ToStringTester;
+
+/**
+ * Class to perform unit tests of all pojos.
+ */
+public class NotificationPojosTest {
+
+    @Test
+    public void testPojos() {
+        List<PojoClass> pojoClasses =
+                PojoClassFactory.getPojoClasses(NotificationPojosTest.class.getPackageName());
+
+        // @formatter:off
+        final Validator validator = ValidatorBuilder
+                .create()
+                .with(new ToStringTester())
+                .with(new SetterMustExistRule())
+                .with(new GetterMustExistRule())
+                .with(new SetterTester())
+                .with(new GetterTester())
+                .build();
+
+        validator.validate(pojoClasses);
+        // @formatter:on
+    }
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantControlLoopStateChangeTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantControlLoopStateChangeTest.java
new file mode 100644
index 0000000..06d6ecf
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantControlLoopStateChangeTest.java
@@ -0,0 +1,61 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.models.messages.dmaap.participant;
+
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.junit.Assert.assertEquals;
+import static org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantMessageUtils.removeVariableFields;
+
+import java.time.Instant;
+import java.util.UUID;
+import org.junit.Test;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopOrderedState;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+/**
+ * Test the copy constructor and other methods.
+ */
+public class ParticipantControlLoopStateChangeTest {
+
+    @Test
+    public void testCopyConstructor() {
+        assertThatThrownBy(() -> new ParticipantStateChange(null)).isInstanceOf(NullPointerException.class);
+
+        ParticipantControlLoopStateChange orig = new ParticipantControlLoopStateChange();
+
+        // verify with null values
+        assertEquals(removeVariableFields(orig.toString()),
+                removeVariableFields(new ParticipantControlLoopStateChange(orig).toString()));
+
+        // verify with all values
+        ToscaConceptIdentifier id = new ToscaConceptIdentifier();
+        id.setName("id");
+        id.setVersion("1.2.3");
+        orig.setControlLoopId(id);
+        orig.setParticipantId(id);
+        orig.setMessageId(UUID.randomUUID());
+        orig.setOrderedState(ControlLoopOrderedState.RUNNING);
+        orig.setTimestamp(Instant.ofEpochMilli(3000));
+
+        assertEquals(removeVariableFields(orig.toString()),
+                removeVariableFields(new ParticipantControlLoopStateChange(orig).toString()));
+    }
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantControlLoopUpdateTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantControlLoopUpdateTest.java
new file mode 100644
index 0000000..4397bf1
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantControlLoopUpdateTest.java
@@ -0,0 +1,71 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.models.messages.dmaap.participant;
+
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotSame;
+import static org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantMessageUtils.removeVariableFields;
+
+import java.time.Instant;
+import java.util.UUID;
+import org.junit.Test;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoop;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
+
+/**
+ * Test the copy constructor.
+ */
+public class ParticipantControlLoopUpdateTest {
+    @Test
+    public void testCopyConstructor() {
+        assertThatThrownBy(() -> new ParticipantControlLoopUpdate(null)).isInstanceOf(NullPointerException.class);
+
+        ParticipantControlLoopUpdate orig = new ParticipantControlLoopUpdate();
+        // verify with all values
+        ToscaConceptIdentifier id = new ToscaConceptIdentifier();
+        id.setName("id");
+        id.setVersion("1.2.3");
+        orig.setControlLoopId(id);
+        orig.setParticipantId(id);
+        orig.setMessageId(UUID.randomUUID());
+        orig.setTimestamp(Instant.ofEpochMilli(3000));
+
+        ControlLoop controlLoop = new ControlLoop();
+        controlLoop.setName("controlLoop");
+        ToscaServiceTemplate toscaServiceTemplate = new ToscaServiceTemplate();
+        toscaServiceTemplate.setName("serviceTemplate");
+        toscaServiceTemplate.setDerivedFrom("parentServiceTemplate");
+        toscaServiceTemplate.setDescription("Description of serviceTemplate");
+        toscaServiceTemplate.setVersion("1.2.3");
+        orig.setControlLoopDefinition(toscaServiceTemplate);
+        orig.setControlLoop(controlLoop);
+
+        ParticipantControlLoopUpdate other = new ParticipantControlLoopUpdate(orig);
+
+        assertEquals(removeVariableFields(orig.toString()), removeVariableFields(other.toString()));
+
+        // ensure list and items are not the same object
+        assertNotSame(other.getControlLoop(), controlLoop);
+        assertNotSame(other.getControlLoopDefinition(), toscaServiceTemplate);
+    }
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantHealthCheckTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantHealthCheckTest.java
new file mode 100644
index 0000000..1cc3566
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantHealthCheckTest.java
@@ -0,0 +1,61 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.models.messages.dmaap.participant;
+
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.junit.Assert.assertEquals;
+import static org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantMessageUtils.removeVariableFields;
+
+import java.time.Instant;
+import java.util.UUID;
+import org.junit.Test;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantState;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+/**
+ * Test the copy constructor and other methods.
+ */
+public class ParticipantHealthCheckTest {
+
+    @Test
+    public void testCopyConstructor() {
+        assertThatThrownBy(() -> new ParticipantStateChange(null)).isInstanceOf(NullPointerException.class);
+
+        ParticipantHealthCheck orig = new ParticipantHealthCheck();
+
+        // verify with null values
+        assertEquals(removeVariableFields(orig.toString()),
+                removeVariableFields(new ParticipantHealthCheck(orig).toString()));
+
+        // verify with all values
+        ToscaConceptIdentifier id = new ToscaConceptIdentifier();
+        id.setName("id");
+        id.setVersion("1.2.3");
+        orig.setControlLoopId(id);
+        orig.setParticipantId(id);
+        orig.setMessageId(UUID.randomUUID());
+        orig.setState(ParticipantState.ACTIVE);
+        orig.setTimestamp(Instant.ofEpochMilli(3000));
+
+        assertEquals(removeVariableFields(orig.toString()),
+                        removeVariableFields(new ParticipantHealthCheck(orig).toString()));
+    }
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantMessageTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantMessageTest.java
new file mode 100644
index 0000000..d27d3a2
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantMessageTest.java
@@ -0,0 +1,103 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.models.messages.dmaap.participant;
+
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.time.Instant;
+import java.util.UUID;
+import org.junit.Test;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+public class ParticipantMessageTest {
+    private ParticipantMessage message;
+
+    @Test
+    public void testCopyConstructor() {
+        assertThatThrownBy(() -> new ParticipantMessage((ParticipantMessage) null))
+                .isInstanceOf(NullPointerException.class);
+
+        // verify with null values
+        message = new ParticipantMessage(ParticipantMessageType.PARTICIPANT_STATE_CHANGE);
+        ParticipantMessage newmsg = new ParticipantMessage(message);
+        newmsg.setMessageId(message.getMessageId());
+        newmsg.setTimestamp(message.getTimestamp());
+        assertEquals(message.toString(), newmsg.toString());
+
+        // verify with all values
+        message = makeMessage();
+        newmsg = new ParticipantMessage(message);
+        newmsg.setMessageId(message.getMessageId());
+        newmsg.setTimestamp(message.getTimestamp());
+        assertEquals(message.toString(), newmsg.toString());
+    }
+
+    @Test
+    public void testAppliesTo_NullParticipantId() {
+        message = makeMessage();
+
+        assertThatThrownBy(() -> message.appliesTo(null, null)).isInstanceOf(NullPointerException.class);
+        assertThatThrownBy(() -> message.appliesTo(new ToscaConceptIdentifier("PType", "4.5.6"), null))
+                .isInstanceOf(NullPointerException.class);
+        assertThatThrownBy(() -> message.appliesTo(null, new ToscaConceptIdentifier("id", "1.2.3")))
+                .isInstanceOf(NullPointerException.class);
+    }
+
+    @Test
+    public void testAppliesTo_ParticipantIdMatches() {
+        message = makeMessage();
+
+        // ParticipantId matches
+        assertTrue(message.appliesTo(new ToscaConceptIdentifier("PType", "4.5.6"),
+                new ToscaConceptIdentifier("id", "1.2.3")));
+        assertFalse(message.appliesTo(new ToscaConceptIdentifier("PType", "4.5.6"),
+                new ToscaConceptIdentifier("id", "1.2.4")));
+        assertFalse(message.appliesTo(new ToscaConceptIdentifier("PType", "4.5.7"),
+                new ToscaConceptIdentifier("id", "1.2.3")));
+    }
+
+    @Test
+    public void testAppliesTo_ParticipantIdNoMatch() {
+        message = makeMessage();
+
+        // ParticipantId does not match
+        ToscaConceptIdentifier id = new ToscaConceptIdentifier();
+        id.setName("id1111");
+        id.setVersion("3.2.1");
+        assertFalse(message.appliesTo(id, id));
+        message.setParticipantType(null);
+        assertTrue(message.appliesTo(id, id));
+    }
+
+    private ParticipantMessage makeMessage() {
+        ParticipantMessage msg = new ParticipantMessage(ParticipantMessageType.PARTICIPANT_STATE_CHANGE);
+
+        msg.setParticipantType(new ToscaConceptIdentifier("PType", "4.5.6"));
+        msg.setParticipantId(new ToscaConceptIdentifier("id", "1.2.3"));
+        msg.setMessageId(UUID.randomUUID());
+        msg.setTimestamp(Instant.ofEpochMilli(3000));
+
+        return msg;
+    }
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantMessageUtils.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantMessageUtils.java
new file mode 100644
index 0000000..dfbc25d
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantMessageUtils.java
@@ -0,0 +1,35 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.models.messages.dmaap.participant;
+
+/**
+ * Utility class for tests of ParticipantMessage subclasses.
+ */
+public class ParticipantMessageUtils {
+
+    private ParticipantMessageUtils() {
+
+    }
+
+    public static String removeVariableFields(String text) {
+        return text.replaceAll("messageId=[^,]*", "messageId=xxx").replaceAll("timestamp=[^,]*", "timestamp=nnn");
+    }
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantPojosTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantPojosTest.java
new file mode 100644
index 0000000..301f9ac
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantPojosTest.java
@@ -0,0 +1,61 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.models.messages.dmaap.participant;
+
+import com.openpojo.reflection.PojoClass;
+import com.openpojo.reflection.impl.PojoClassFactory;
+import com.openpojo.validation.Validator;
+import com.openpojo.validation.ValidatorBuilder;
+import com.openpojo.validation.rule.impl.GetterMustExistRule;
+import com.openpojo.validation.rule.impl.SetterMustExistRule;
+import com.openpojo.validation.test.impl.GetterTester;
+import com.openpojo.validation.test.impl.SetterTester;
+import java.util.List;
+import org.junit.Test;
+import org.onap.policy.common.utils.test.ToStringTester;
+
+/**
+ * Class to perform unit tests of all pojos.
+ */
+public class ParticipantPojosTest {
+
+    @Test
+    public void testPojos() {
+        List<PojoClass> pojoClasses =
+                PojoClassFactory.getPojoClasses(ParticipantPojosTest.class.getPackageName());
+
+        pojoClasses.remove(PojoClassFactory.getPojoClass(ParticipantMessage.class));
+        pojoClasses.remove(PojoClassFactory.getPojoClass(ParticipantMessageTest.class));
+
+        // @formatter:off
+        final Validator validator = ValidatorBuilder
+                .create()
+                .with(new ToStringTester())
+                .with(new SetterMustExistRule())
+                .with(new GetterMustExistRule())
+                .with(new SetterTester())
+                .with(new GetterTester())
+                .build();
+
+        validator.validate(pojoClasses);
+        // @formatter:on
+    }
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantStateChangeTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantStateChangeTest.java
new file mode 100644
index 0000000..2355326
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantStateChangeTest.java
@@ -0,0 +1,61 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.models.messages.dmaap.participant;
+
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.junit.Assert.assertEquals;
+import static org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantMessageUtils.removeVariableFields;
+
+import java.time.Instant;
+import java.util.UUID;
+import org.junit.Test;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantState;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+/**
+ * Test the copy constructor and the other methods.
+ */
+public class ParticipantStateChangeTest {
+
+    @Test
+    public void testCopyConstructor() {
+        assertThatThrownBy(() -> new ParticipantStateChange(null)).isInstanceOf(NullPointerException.class);
+
+        ParticipantStateChange orig = new ParticipantStateChange();
+
+        // verify with null values
+        assertEquals(removeVariableFields(orig.toString()),
+                removeVariableFields(new ParticipantStateChange(orig).toString()));
+
+        // verify with all values
+        ToscaConceptIdentifier id = new ToscaConceptIdentifier();
+        id.setName("id");
+        id.setVersion("1.2.3");
+        orig.setControlLoopId(id);
+        orig.setParticipantId(id);
+        orig.setMessageId(UUID.randomUUID());
+        orig.setState(ParticipantState.ACTIVE);
+        orig.setTimestamp(Instant.ofEpochMilli(3000));
+
+        assertEquals(removeVariableFields(orig.toString()),
+                removeVariableFields(new ParticipantStateChange(orig).toString()));
+    }
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantStatusTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantStatusTest.java
new file mode 100644
index 0000000..9b5722b
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantStatusTest.java
@@ -0,0 +1,62 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.models.messages.dmaap.participant;
+
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.junit.Assert.assertEquals;
+import static org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantMessageUtils.removeVariableFields;
+
+import java.time.Instant;
+import java.util.UUID;
+import org.junit.Test;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantState;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+public class ParticipantStatusTest {
+
+    @Test
+    public void testCopyConstructor() {
+        assertThatThrownBy(() -> new ParticipantStatus(null)).isInstanceOf(NullPointerException.class);
+
+        final ParticipantStatus orig = new ParticipantStatus();
+
+        // verify with null values
+        assertEquals(removeVariableFields(orig.toString()),
+                removeVariableFields(new ParticipantStatus(orig).toString()));
+
+        // verify with all values
+        ToscaConceptIdentifier id = new ToscaConceptIdentifier();
+        id.setName("id");
+        id.setVersion("1.2.3");
+        orig.setControlLoopId(id);
+        orig.setParticipantId(id);
+        orig.setMessageId(UUID.randomUUID());
+        orig.setState(ParticipantState.ACTIVE);
+        orig.setTimestamp(Instant.ofEpochMilli(3000));
+
+        final ParticipantResponseDetails resp = new ParticipantResponseDetails();
+        resp.setResponseMessage("my-response");
+        orig.setResponse(resp);
+
+        assertEquals(removeVariableFields(orig.toString()),
+                removeVariableFields(new ParticipantStatus(orig).toString()));
+    }
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/rest/MessagesRestPojosTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/rest/MessagesRestPojosTest.java
new file mode 100644
index 0000000..299a580
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/rest/MessagesRestPojosTest.java
@@ -0,0 +1,59 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.models.messages.rest;
+
+import com.openpojo.reflection.PojoClass;
+import com.openpojo.reflection.impl.PojoClassFactory;
+import com.openpojo.validation.Validator;
+import com.openpojo.validation.ValidatorBuilder;
+import com.openpojo.validation.rule.impl.GetterMustExistRule;
+import com.openpojo.validation.rule.impl.SetterMustExistRule;
+import com.openpojo.validation.test.impl.GetterTester;
+import com.openpojo.validation.test.impl.SetterTester;
+import java.util.List;
+import org.junit.Test;
+import org.onap.policy.common.utils.test.ToStringTester;
+
+/**
+ * Class to perform unit tests of all pojos.
+ */
+public class MessagesRestPojosTest {
+
+    @Test
+    public void testPojos() {
+        List<PojoClass> pojoClasses =
+                PojoClassFactory.getPojoClassesRecursively(MessagesRestPojosTest.class.getPackageName(), null);
+
+
+        // @formatter:off
+        final Validator validator = ValidatorBuilder
+                .create()
+                .with(new ToStringTester())
+                .with(new SetterMustExistRule())
+                .with(new GetterMustExistRule())
+                .with(new SetterTester())
+                .with(new GetterTester())
+                .build();
+
+        validator.validate(pojoClasses);
+        // @formatter:on
+    }
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/rest/instantiation/InstantiationCommandTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/rest/instantiation/InstantiationCommandTest.java
new file mode 100644
index 0000000..6bda3b7
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/rest/instantiation/InstantiationCommandTest.java
@@ -0,0 +1,60 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.models.messages.rest.instantiation;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.util.ArrayList;
+import org.junit.Test;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopOrderedState;
+
+public class InstantiationCommandTest {
+    @Test
+    public void testInstantiationCommandLombok() {
+        assertNotNull(new InstantiationCommand());
+        InstantiationCommand ic0 = new InstantiationCommand();
+
+        assertThat(ic0.toString()).contains("InstantiationCommand(");
+        assertEquals(false, ic0.hashCode() == 0);
+        assertEquals(true, ic0.equals(ic0));
+        assertEquals(false, ic0.equals(null));
+
+
+        InstantiationCommand ic1 = new InstantiationCommand();
+
+        ic1.setControlLoopIdentifierList(new ArrayList<>());
+        ic1.setOrderedState(ControlLoopOrderedState.UNINITIALISED);
+
+        assertThat(ic1.toString()).contains("InstantiationCommand(");
+        assertEquals(false, ic1.hashCode() == 0);
+        assertEquals(false, ic1.equals(ic0));
+        assertEquals(false, ic1.equals(null));
+
+        assertNotEquals(ic1, ic0);
+
+        InstantiationCommand ic2 = new InstantiationCommand();
+
+        assertEquals(ic2, ic0);
+    }
+}
diff --git a/models/src/test/resources/META-INF/persistence.xml b/models/src/test/resources/META-INF/persistence.xml
new file mode 100644
index 0000000..078d534
--- /dev/null
+++ b/models/src/test/resources/META-INF/persistence.xml
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ============LICENSE_START=======================================================
+   Copyright (C) 2021 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=========================================================
+-->
+<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
+    <persistence-unit name="CommissioningMariaDb" transaction-type="RESOURCE_LOCAL">
+        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
+
+        <class>org.onap.policy.models.base.PfConceptKey</class>
+        <class>org.onap.policy.models.dao.converters.CDataConditioner</class>
+        <class>org.onap.policy.models.dao.converters.Uuid2String</class>
+        <class>org.onap.policy.models.pdp.persistence.concepts.JpaPdp</class>
+        <class>org.onap.policy.models.pdp.persistence.concepts.JpaPdpGroup</class>
+        <class>org.onap.policy.models.pdp.persistence.concepts.JpaPdpStatistics</class>
+        <class>org.onap.policy.models.pdp.persistence.concepts.JpaPdpSubGroup</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaCapabilityAssignment</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaCapabilityAssignments</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaCapabilityType</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaCapabilityTypes</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaDataType</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaDataTypes</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeTemplate</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeTemplates</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeType</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeTypes</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaParameter</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicies</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicy</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicyType</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicyTypes</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaProperty</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaRelationshipType</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaRelationshipTypes</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaRequirement</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaRequirements</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaServiceTemplate</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaTopologyTemplate</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaTrigger</class>
+        <class>org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaControlLoop</class>
+        <class>org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaControlLoopElement</class>
+        <class>org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaParticipant</class>
+        <class>org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaParticipantStatistics</class>
+        <class>org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaClElementStatistics</class>
+
+        <properties>
+            <property name="eclipselink.ddl-generation" value="create-or-extend-tables" />
+            <property name="eclipselink.ddl-generation.output-mode" value="database" />
+            <property name="eclipselink.logging.level" value="INFO" />
+
+            <!-- property name="eclipselink.logging.level" value="ALL" />
+            <property name="eclipselink.logging.level.jpa" value="ALL" />
+            <property name="eclipselink.logging.level.ddl" value="ALL" />
+            <property name="eclipselink.logging.level.connection" value="ALL" />
+            <property name="eclipselink.logging.level.sql" value="ALL" />
+            <property name="eclipselink.logging.level.transaction" value="ALL" />
+            <property name="eclipselink.logging.level.sequencing" value="ALL" />
+            <property name="eclipselink.logging.level.server" value="ALL" />
+            <property name="eclipselink.logging.level.query" value="ALL" />
+            <property name="eclipselink.logging.level.properties" value="ALL" /-->
+        </properties>
+        <shared-cache-mode>NONE</shared-cache-mode>
+    </persistence-unit>
+
+    <persistence-unit name="ToscaConceptTest" transaction-type="RESOURCE_LOCAL">
+        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
+
+        <class>org.onap.policy.models.base.PfConceptKey</class>
+        <class>org.onap.policy.models.dao.converters.CDataConditioner</class>
+        <class>org.onap.policy.models.dao.converters.Uuid2String</class>
+        <class>org.onap.policy.models.pdp.persistence.concepts.JpaPdp</class>
+        <class>org.onap.policy.models.pdp.persistence.concepts.JpaPdpGroup</class>
+        <class>org.onap.policy.models.pdp.persistence.concepts.JpaPdpStatistics</class>
+        <class>org.onap.policy.models.pdp.persistence.concepts.JpaPdpSubGroup</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaCapabilityAssignment</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaCapabilityAssignments</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaCapabilityType</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaCapabilityTypes</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaDataType</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaDataTypes</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeTemplate</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeTemplates</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeType</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeTypes</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaParameter</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicies</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicy</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicyType</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicyTypes</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaProperty</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaRelationshipType</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaRelationshipTypes</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaRequirement</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaRequirements</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaServiceTemplate</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaTopologyTemplate</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaTrigger</class>
+        <class>org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaControlLoop</class>
+        <class>org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaControlLoopElement</class>
+        <class>org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaParticipant</class>
+        <class>org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaParticipantStatistics</class>
+        <class>org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaClElementStatistics</class>
+
+        <properties>
+            <property name="eclipselink.ddl-generation" value="drop-and-create-tables" />
+            <property name="eclipselink.ddl-generation.output-mode" value="database" />
+            <property name="eclipselink.logging.level" value="INFO" />
+
+          <!--  <property name="eclipselink.logging.level" value="ALL" />
+            <property name="eclipselink.logging.level.jpa" value="ALL" />
+            <property name="eclipselink.logging.level.ddl" value="ALL" />
+            <property name="eclipselink.logging.level.connection" value="ALL" />
+            <property name="eclipselink.logging.level.sql" value="ALL" />
+            <property name="eclipselink.logging.level.transaction" value="ALL" />
+            <property name="eclipselink.logging.level.sequencing" value="ALL" />
+            <property name="eclipselink.logging.level.server" value="ALL" />
+            <property name="eclipselink.logging.level.query" value="ALL" />
+            <property name="eclipselink.logging.level.properties" value="ALL"/> -->
+        </properties>
+        <shared-cache-mode>NONE</shared-cache-mode>
+    </persistence-unit>
+</persistence>
+
diff --git a/models/src/test/resources/json/ControlLoopElementNoOrderedState.json b/models/src/test/resources/json/ControlLoopElementNoOrderedState.json
new file mode 100644
index 0000000..33a63e6
--- /dev/null
+++ b/models/src/test/resources/json/ControlLoopElementNoOrderedState.json
@@ -0,0 +1,13 @@
+{
+    "id": "a95757ba-b34a-4049-a2a8-46773abcbe5e",
+    "definition": {
+        "name": "cleDef",
+        "version": "0.0.1"
+    },
+    "participantType": {
+        "name": "participantType",
+        "version": "0.0.1"
+    },
+    "state": "UNINITIALISED",
+    "orderedState": null
+}
diff --git a/models/src/test/resources/json/ControlLoopNoOrderedState.json b/models/src/test/resources/json/ControlLoopNoOrderedState.json
new file mode 100644
index 0000000..6bff975
--- /dev/null
+++ b/models/src/test/resources/json/ControlLoopNoOrderedState.json
@@ -0,0 +1,12 @@
+{
+    "definition": {
+        "name": "controlLoopDefinitionName",
+        "version": "0.0.1"
+    },
+    "state": "UNINITIALISED",
+    "orderedState": null,
+    "elements": [
+    ],
+    "name": "control-loop",
+    "version": "0.0.1"
+}
diff --git a/models/src/test/resources/providers/TestClElementStatistics.json b/models/src/test/resources/providers/TestClElementStatistics.json
new file mode 100644
index 0000000..ae19e56
--- /dev/null
+++ b/models/src/test/resources/providers/TestClElementStatistics.json
@@ -0,0 +1,24 @@
+{
+  "clElementStatistics":[
+    {
+      "participantId":{
+        "name":"name1",
+        "version":"1.001"
+      },
+      "id": "709c62b3-8918-41b9-a747-d21eb79c6c20",
+      "timeStamp": "2021-01-10T13:45:00.000Z",
+      "controlLoopState": "UNINITIALISED",
+      "clElementUptime":250
+    },
+    {
+      "participantId":{
+        "name":"name2",
+        "version":"1.001"
+      },
+      "id": "709c62b3-8918-41b9-a747-d21eb79c6c21",
+      "timeStamp": "2021-01-10T14:25:00.000Z",
+      "controlLoopState": "UNINITIALISED",
+      "clElementUptime":330
+    }
+  ]
+}
diff --git a/models/src/test/resources/providers/TestControlLoops.json b/models/src/test/resources/providers/TestControlLoops.json
new file mode 100644
index 0000000..fedda96
--- /dev/null
+++ b/models/src/test/resources/providers/TestControlLoops.json
@@ -0,0 +1,142 @@
+{
+    "controlLoopList": [
+        {
+            "definition": {
+                "name": "org.onap.domain.pmsh.PMSHControlLoopDefinition",
+                "version": "1.0.0"
+            },
+            "state": "UNINITIALISED",
+            "orderedState": "UNINITIALISED",
+            "elements": {
+                "709c62b3-8918-41b9-a747-e21eb79c6c20": {
+                    "id": "709c62b3-8918-41b9-a747-d21eb79c6c20",
+                    "definition": {
+                        "name": "org.onap.domain.pmsh.PMSH_DCAEMicroservice",
+                        "version": "1.2.3"
+                    },
+                    "participantType": {
+                        "name": "org.onap.dcae.controlloop.DCAEMicroserviceControlLoopParticipant",
+                        "version": "2.3.4"
+                    },
+                    "state": "UNINITIALISED",
+                    "orderedState": "UNINITIALISED",
+                    "description": "DCAE Control Loop Element for the PMSH instance 0 control loop"
+                },
+                "709c62b3-8918-41b9-a747-e21eb79c6c21": {
+                    "id": "709c62b3-8918-41b9-a747-d21eb79c6c21",
+                    "definition": {
+                        "name": "org.onap.domain.pmsh.PMSH_MonitoringPolicyControlLoopElement",
+                        "version": "1.2.3"
+                    },
+                    "participantType": {
+                        "name": "org.onap.policy.controlloop.PolicyControlLoopParticipant",
+                        "version": "2.3.1"
+                    },
+                    "state": "UNINITIALISED",
+                    "orderedState": "UNINITIALISED",
+                    "description": "Monitoring Policy Control Loop Element for the PMSH instance 0 control loop"
+                },
+                "709c62b3-8918-41b9-a747-e21eb79c6c22": {
+                    "id": "709c62b3-8918-41b9-a747-d21eb79c6c22",
+                    "definition": {
+                        "name": "org.onap.domain.pmsh.PMSH_OperationalPolicyControlLoopElement",
+                        "version": "1.2.3"
+                    },
+                    "participantType": {
+                        "name": "org.onap.policy.controlloop.PolicyControlLoopParticipant",
+                        "version": "2.3.1"
+                    },
+                    "state": "UNINITIALISED",
+                    "orderedState": "UNINITIALISED",
+                    "description": "Operational Policy Control Loop Element for the PMSH instance 0 control loop"
+                },
+                "709c62b3-8918-41b9-a747-e21eb79c6c23": {
+                    "id": "709c62b3-8918-41b9-a747-d21eb79c6c23",
+                    "definition": {
+                        "name": "org.onap.domain.pmsh.PMSH_CDS_ControlLoopElement",
+                        "version": "1.2.3"
+                    },
+                    "participantType": {
+                        "name": "org.onap.ccsdk.cds.controlloop.CdsControlLoopParticipant",
+                        "version": "2.2.1"
+                    },
+                    "state": "UNINITIALISED",
+                    "orderedState": "UNINITIALISED",
+                    "description": "CDS Control Loop Element for the PMSH instance 0 control loop"
+                }
+            },
+            "name": "PMSHInstance0",
+            "version": "1.0.1",
+            "description": "PMSH control loop instance 0"
+        },
+        {
+            "definition": {
+                "name": "org.onap.domain.pmsh.PMSHControlLoopDefinition",
+                "version": "1.0.0"
+            },
+            "state": "UNINITIALISED",
+            "orderedState": "UNINITIALISED",
+            "elements": {
+                "709c62b3-8918-41b9-a747-e21eb79c6c24": {
+                    "id": "709c62b3-8918-41b9-a747-e21eb79c6c24",
+                    "definition": {
+                        "name": "org.onap.domain.pmsh.PMSH_DCAEMicroservice",
+                        "version": "1.2.3"
+                    },
+                    "participantType": {
+                        "name": "org.onap.dcae.controlloop.DCAEMicroserviceControlLoopParticipant",
+                        "version": "2.3.4"
+                    },
+                    "state": "UNINITIALISED",
+                    "orderedState": "UNINITIALISED",
+                    "description": "DCAE Control Loop Element for the PMSH instance 1 control loop"
+                },
+                "709c62b3-8918-41b9-a747-e21eb79c6c25": {
+                    "id": "709c62b3-8918-41b9-a747-e21eb79c6c25",
+                    "definition": {
+                        "name": "org.onap.domain.pmsh.PMSH_MonitoringPolicyControlLoopElement",
+                        "version": "1.2.3"
+                    },
+                    "participantType": {
+                        "name": "org.onap.policy.controlloop.PolicyControlLoopParticipant",
+                        "version": "2.3.1"
+                    },
+                    "state": "UNINITIALISED",
+                    "orderedState": "UNINITIALISED",
+                    "description": "Monitoring Policy Control Loop Element for the PMSH instance 1 control loop"
+                },
+                "709c62b3-8918-41b9-a747-e21eb79c6c26": {
+                    "id": "709c62b3-8918-41b9-a747-e21eb79c6c26",
+                    "definition": {
+                        "name": "org.onap.domain.pmsh.PMSH_OperationalPolicyControlLoopElement",
+                        "version": "1.2.3"
+                    },
+                    "participantType": {
+                        "name": "org.onap.policy.controlloop.PolicyControlLoopParticipant",
+                        "version": "2.3.1"
+                    },
+                    "state": "UNINITIALISED",
+                    "orderedState": "UNINITIALISED",
+                    "description": "Operational Policy Control Loop Element for the PMSH instance 1 control loop"
+                },
+                "709c62b3-8918-41b9-a747-e21eb79c6c27": {
+                    "id": "709c62b3-8918-41b9-a747-e21eb79c6c27",
+                    "definition": {
+                        "name": "org.onap.domain.pmsh.PMSH_CDS_ControlLoopElement",
+                        "version": "1.2.3"
+                    },
+                    "participantType": {
+                        "name": "org.onap.ccsdk.cds.controlloop.CdsControlLoopParticipant",
+                        "version": "2.2.1"
+                    },
+                    "state": "UNINITIALISED",
+                    "orderedState": "UNINITIALISED",
+                    "description": "CDS Control Loop Element for the PMSH instance 1 control loop"
+                }
+            },
+            "name": "PMSHInstance1",
+            "version": "1.0.1",
+            "description": "PMSH control loop instance 1"
+        }
+    ]
+}
diff --git a/models/src/test/resources/providers/TestParticipant.json b/models/src/test/resources/providers/TestParticipant.json
new file mode 100644
index 0000000..c6965ce
--- /dev/null
+++ b/models/src/test/resources/providers/TestParticipant.json
@@ -0,0 +1,11 @@
+{
+  "name": "dummy_participant1",
+  "version": "1.0.1",
+  "definition":{
+    "name": "org.onap.domain.pmsh.PMSHControlLoopDefinition",
+    "version": "1.0.0"
+  },
+  "participantState": "PASSIVE",
+  "healthStatus": "HEALTHY",
+  "description": "A dummy PMSH participant1"
+}
diff --git a/models/src/test/resources/providers/TestParticipantStatistics.json b/models/src/test/resources/providers/TestParticipantStatistics.json
new file mode 100644
index 0000000..5cf6268
--- /dev/null
+++ b/models/src/test/resources/providers/TestParticipantStatistics.json
@@ -0,0 +1,32 @@
+{
+  "statisticsList":[
+    {
+      "participantId":{
+        "name":"name1",
+        "version":"1.001"
+      },
+      "timeStamp": "2021-01-10T13:45:00.000Z",
+      "state": "PASSIVE",
+      "healthStatus": "HEALTHY",
+      "eventCount":250,
+      "lastExecutionTime":100,
+      "averageExecutionTime":90,
+      "upTime":1000,
+      "lastStart":3000
+    },
+    {
+      "participantId":{
+        "name":"name2",
+        "version":"1.001"
+      },
+      "timeStamp": "2021-01-27T14:25:00.000Z",
+      "state": "PASSIVE",
+      "healthStatus": "HEALTHY",
+      "eventCount":245,
+      "lastExecutionTime":1020,
+      "averageExecutionTime":85,
+      "upTime":1050,
+      "lastStart":3100
+    }
+  ]
+}
diff --git a/models/src/test/resources/providers/UpdateControlLoops.json b/models/src/test/resources/providers/UpdateControlLoops.json
new file mode 100644
index 0000000..2d6bd07
--- /dev/null
+++ b/models/src/test/resources/providers/UpdateControlLoops.json
@@ -0,0 +1,73 @@
+{
+    "controlLoopList": [
+        {
+            "name": "PMSHInstance0",
+            "version": "1.0.1",
+            "definition": {
+                "name": "org.onap.domain.pmsh.PMSHControlLoopDefinition",
+                "version": "1.0.0"
+            },
+            "state": "RUNNING",
+            "orderedState": "RUNNING",
+            "description": "PMSH control loop instance 0",
+            "elements": {
+                "709c62b3-8918-41b9-a747-d21eb79c6c20": {
+                    "id": "709c62b3-8918-41b9-a747-d21eb79c6c20",
+                    "definition": {
+                        "name": "org.onap.domain.pmsh.PMSH_DCAEMicroservice",
+                        "version": "1.2.3"
+                    },
+                    "participantType": {
+                        "name": "org.onap.dcae.controlloop.DCAEMicroserviceControlLoopParticipant",
+                        "version": "2.3.4"
+                    },
+                    "state": "RUNNING",
+                    "orderedState": "RUNNING",
+                    "description": "DCAE Control Loop Element for the PMSH instance 0 control loop"
+                },
+                "709c62b3-8918-41b9-a747-d21eb79c6c21": {
+                    "id": "709c62b3-8918-41b9-a747-d21eb79c6c21",
+                    "definition": {
+                        "name": "org.onap.domain.pmsh.PMSH_MonitoringPolicyControlLoopElement",
+                        "version": "1.2.3"
+                    },
+                    "participantType": {
+                        "name": "org.onap.policy.controlloop.PolicyControlLoopParticipant",
+                        "version": "2.3.1"
+                    },
+                    "state": "RUNNING",
+                    "orderedState": "RUNNING",
+                    "description": "Monitoring Policy Control Loop Element for the PMSH instance 0 control loop"
+                },
+                "709c62b3-8918-41b9-a747-d21eb79c6c22": {
+                    "id": "709c62b3-8918-41b9-a747-d21eb79c6c22",
+                    "definition": {
+                        "name": "org.onap.domain.pmsh.PMSH_OperationalPolicyControlLoopElement",
+                        "version": "2.3.1"
+                    },
+                    "participantType": {
+                        "name": "org.onap.policy.controlloop.PolicyControlLoopParticipant",
+                        "version": "1.0.0"
+                    },
+                    "state": "RUNNING",
+                    "orderedState": "RUNNING",
+                    "description": "Operational Policy Control Loop Element for the PMSH instance 0 control loop"
+                },
+                "709c62b3-8918-41b9-a747-d21eb79c6c23": {
+                    "id": "709c62b3-8918-41b9-a747-d21eb79c6c23",
+                    "definition": {
+                        "name": "org.onap.domain.pmsh.PMSH_CDS_ControlLoopElement",
+                        "version": "1.2.3"
+                    },
+                    "participantType": {
+                        "name": "org.onap.ccsdk.cds.controlloop.CdsControlLoopParticipant",
+                        "version": "2.2.1"
+                    },
+                    "state": "RUNNING",
+                    "orderedState": "RUNNING",
+                    "description": "CDS Control Loop Element for the PMSH instance 0 control loop"
+                }
+            }
+        }
+    ]
+}
diff --git a/participant/participant-impl/participant-impl-dcae/pom.xml b/participant/participant-impl/participant-impl-dcae/pom.xml
index 6186ced..3080842 100644
--- a/participant/participant-impl/participant-impl-dcae/pom.xml
+++ b/participant/participant-impl/participant-impl-dcae/pom.xml
@@ -31,4 +31,23 @@
     <artifactId>policy-clamp-participant-impl-dcae</artifactId>
     <name>${project.artifactId}</name>
     <description>DCAE participant, that allows DCAE to partake in control loops</description>
+
+    <properties>
+        <mockserver.version>5.11.2</mockserver.version>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.mock-server</groupId>
+            <artifactId>mockserver-netty</artifactId>
+            <version>${mockserver.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.mock-server</groupId>
+            <artifactId>mockserver-client-java</artifactId>
+            <version>${mockserver.version}</version>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
 </project>
diff --git a/participant/participant-impl/participant-impl-dcae/src/main/java/org/onap/policy/clamp/controlloop/participant/dcae/httpclient/AbstractHttpClient.java b/participant/participant-impl/participant-impl-dcae/src/main/java/org/onap/policy/clamp/controlloop/participant/dcae/httpclient/AbstractHttpClient.java
new file mode 100644
index 0000000..b2d0b61
--- /dev/null
+++ b/participant/participant-impl/participant-impl-dcae/src/main/java/org/onap/policy/clamp/controlloop/participant/dcae/httpclient/AbstractHttpClient.java
@@ -0,0 +1,154 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.dcae.httpclient;
+
+import java.io.Closeable;
+import java.io.IOException;
+import javax.ws.rs.core.Response.Status;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpHost;
+import org.apache.http.HttpRequest;
+import org.apache.http.ParseException;
+import org.apache.http.auth.AuthScope;
+import org.apache.http.auth.UsernamePasswordCredentials;
+import org.apache.http.client.AuthCache;
+import org.apache.http.client.CredentialsProvider;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.client.methods.HttpPut;
+import org.apache.http.client.protocol.HttpClientContext;
+import org.apache.http.conn.ssl.NoopHostnameVerifier;
+import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
+import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
+import org.apache.http.impl.auth.BasicScheme;
+import org.apache.http.impl.client.BasicAuthCache;
+import org.apache.http.impl.client.BasicCredentialsProvider;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.ssl.SSLContextBuilder;
+import org.apache.http.util.EntityUtils;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopRuntimeException;
+import org.onap.policy.clamp.controlloop.participant.dcae.model.Loop;
+import org.onap.policy.common.endpoints.parameters.RestServerParameters;
+import org.onap.policy.common.utils.coder.Coder;
+import org.onap.policy.common.utils.coder.CoderException;
+import org.onap.policy.common.utils.coder.StandardCoder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public abstract class AbstractHttpClient implements Closeable {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(AbstractHttpClient.class);
+    private final HttpClientContext localContext;
+    private final CloseableHttpClient httpclient;
+    private final HttpHost target;
+    public static final Coder CODER = new StandardCoder();
+
+    /**
+     * Constructor.
+     */
+    protected AbstractHttpClient(RestServerParameters restServerParameters) {
+        try {
+            final String scheme = restServerParameters.isHttps() ? "https" : "http";
+            target = new HttpHost(restServerParameters.getHost(), restServerParameters.getPort(), scheme);
+
+            CredentialsProvider credsProvider = new BasicCredentialsProvider();
+            credsProvider.setCredentials(new AuthScope(target.getHostName(), target.getPort()),
+                    new UsernamePasswordCredentials(restServerParameters.getUserName(),
+                            restServerParameters.getPassword()));
+
+            AuthCache authCache = new BasicAuthCache();
+            BasicScheme basicAuth = new BasicScheme();
+            authCache.put(target, basicAuth);
+            localContext = HttpClientContext.create();
+            localContext.setAuthCache(authCache);
+
+            HttpClientBuilder builder = HttpClients.custom().setDefaultCredentialsProvider(credsProvider);
+            if (restServerParameters.isHttps()) {
+                final SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(new SSLContextBuilder()
+                        .loadTrustMaterial(null, new TrustSelfSignedStrategy()).setProtocol("TLSv1.2").build(),
+                        new NoopHostnameVerifier());
+                builder.setSSLSocketFactory(sslsf);
+            }
+            httpclient = builder.build();
+
+        } catch (final Exception e) {
+            throw new ControlLoopRuntimeException(Status.INTERNAL_SERVER_ERROR,
+                    restServerParameters.getName() + " Client failed to start", e);
+        }
+    }
+
+    CloseableHttpResponse execute(HttpRequest request) throws IOException {
+        return httpclient.execute(target, request, localContext);
+    }
+
+    protected boolean executePut(String path, int statusCode) {
+        try (CloseableHttpResponse response = execute(new HttpPut(path))) {
+            return response.getStatusLine().getStatusCode() == statusCode;
+        } catch (Exception e) {
+            return false;
+        }
+    }
+
+    protected Loop executePost(String path, int statusCode) {
+        try (CloseableHttpResponse response = execute(new HttpPost(path))) {
+            if (response.getStatusLine().getStatusCode() != statusCode) {
+                return null;
+            }
+            return entityToMap(response.getEntity());
+        } catch (Exception e) {
+            return null;
+        }
+    }
+
+    protected Loop executeGet(String path, int statusCode) {
+        try (CloseableHttpResponse response = execute(new HttpGet(path))) {
+            if (response.getStatusLine().getStatusCode() != statusCode) {
+                return null;
+            }
+            return entityToMap(response.getEntity());
+        } catch (Exception e) {
+            return null;
+        }
+    }
+
+    private Loop entityToMap(HttpEntity httpEntity) {
+        if (httpEntity == null) {
+            return new Loop();
+        }
+        try {
+            return CODER.convert(EntityUtils.toString(httpEntity), Loop.class);
+        } catch (ParseException | IOException e) {
+            LOGGER.error("error reading Entity", e);
+            return new Loop();
+        } catch (CoderException e) {
+            LOGGER.error("cannot convert to Loop Object", e);
+            return new Loop();
+        }
+    }
+
+    @Override
+    public void close() throws IOException {
+        httpclient.close();
+    }
+}
diff --git a/participant/participant-impl/participant-impl-dcae/src/main/java/org/onap/policy/clamp/controlloop/participant/dcae/httpclient/ClampHttpClient.java b/participant/participant-impl/participant-impl-dcae/src/main/java/org/onap/policy/clamp/controlloop/participant/dcae/httpclient/ClampHttpClient.java
new file mode 100644
index 0000000..eb80505
--- /dev/null
+++ b/participant/participant-impl/participant-impl-dcae/src/main/java/org/onap/policy/clamp/controlloop/participant/dcae/httpclient/ClampHttpClient.java
@@ -0,0 +1,140 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.dcae.httpclient;
+
+import org.apache.http.HttpStatus;
+import org.onap.policy.clamp.controlloop.participant.dcae.model.ExternalComponent;
+import org.onap.policy.clamp.controlloop.participant.dcae.model.Loop;
+import org.onap.policy.common.endpoints.parameters.RestServerParameters;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ClampHttpClient extends AbstractHttpClient {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(ClampHttpClient.class);
+
+    private static final String STATUS = "/restservices/clds/v2/loop/getstatus/";
+    private static final String CREATE = "/restservices/clds/v2/loop/create/%s?templateName=%s";
+    private static final String UPDATE = "/restservices/clds/v2/loop/updateMicroservicePolicy/";
+    private static final String DEPLOY = "/restservices/clds/v2/loop/deploy/";
+    private static final String STOP = "/restservices/clds/v2/loop/stop/";
+    private static final String DELETE = "/restservices/clds/v2/loop/delete/";
+    private static final String UNDEPLOY = "/restservices/clds/v2/loop/undeploy/";
+    public static final String STATUS_NOT_FOUND = "STATUS_NOT_FOUND";
+    public static final String POLICY_NOT_FOUND = "POLICY_NOT_FOUND";
+
+    /**
+     * Constructor.
+     */
+    public ClampHttpClient(RestServerParameters restServerParameters) {
+        super(restServerParameters);
+    }
+
+    /**
+     * Create.
+     *
+     * @param loopName the loopName
+     * @param templateName the templateName
+     * @return the Loop object or null if error occurred
+     */
+    public Loop create(String loopName, String templateName) {
+        return executePost(String.format(CREATE, loopName, templateName), HttpStatus.SC_OK);
+    }
+
+    /**
+     * Update.
+     *
+     * @param loopName the loopName
+     * @param jsonEntity the Json entity
+     * @return true
+     */
+    public boolean update(String loopName, String jsonEntity) {
+        return executePost(UPDATE + loopName, HttpStatus.SC_OK) != null;
+    }
+
+    /**
+     * Deploy.
+     *
+     * @param loopName the loopName
+     * @return true
+     */
+    public boolean deploy(String loopName) { // DCAE
+        return executePut(DEPLOY + loopName, HttpStatus.SC_ACCEPTED);
+    }
+
+    /**
+     * Get Status.
+     *
+     * @param loopName the loopName
+     * @return the Loop object or null if error occurred
+     */
+    public Loop getstatus(String loopName) {
+        return executeGet(STATUS + loopName, HttpStatus.SC_OK);
+    }
+
+    /**
+     * Undeploy.
+     *
+     * @param loopName the loopName
+     * @return true
+     */
+    public boolean undeploy(String loopName) {
+        return executePut(UNDEPLOY + loopName, HttpStatus.SC_ACCEPTED);
+    }
+
+    /**
+     * Stop.
+     *
+     * @param loopName the loopName
+     * @return true
+     */
+    public boolean stop(String loopName) {
+        return executePut(STOP + loopName, HttpStatus.SC_OK);
+    }
+
+    /**
+     * Delete.
+     *
+     * @param loopName the loopName
+     * @return true
+     */
+    public boolean delete(String loopName) {
+        return executePut(DELETE + loopName, HttpStatus.SC_OK);
+    }
+
+    /**
+     * return status from Loop object.
+     *
+     * @param loop Loop
+     * @return status
+     */
+    public static String getStatusCode(Loop loop) {
+        if (loop == null || loop.getComponents() == null || loop.getComponents().isEmpty()) {
+            return STATUS_NOT_FOUND;
+        }
+        ExternalComponent externalComponent = loop.getComponents().get("DCAE");
+        if (externalComponent == null || externalComponent.getComponentState() == null) {
+            return STATUS_NOT_FOUND;
+        }
+
+        return externalComponent.getComponentState().getStateName();
+    }
+}
diff --git a/participant/participant-impl/participant-impl-dcae/src/main/java/org/onap/policy/clamp/controlloop/participant/dcae/httpclient/ConsulDcaeHttpClient.java b/participant/participant-impl/participant-impl-dcae/src/main/java/org/onap/policy/clamp/controlloop/participant/dcae/httpclient/ConsulDcaeHttpClient.java
new file mode 100644
index 0000000..cd84a2f
--- /dev/null
+++ b/participant/participant-impl/participant-impl-dcae/src/main/java/org/onap/policy/clamp/controlloop/participant/dcae/httpclient/ConsulDcaeHttpClient.java
@@ -0,0 +1,46 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.dcae.httpclient;
+
+import org.apache.http.HttpStatus;
+import org.onap.policy.common.endpoints.parameters.RestServerParameters;
+
+public class ConsulDcaeHttpClient extends AbstractHttpClient {
+
+    private static final String DEPLOY = "/v1/kv/dcae-pmsh:policy";
+
+    /**
+     * constructor.
+     */
+    public ConsulDcaeHttpClient(RestServerParameters restServerParameters) {
+        super(restServerParameters);
+    }
+
+    /**
+     * call consult.
+     *
+     * @param jsonEntity the Entity
+     * @return true
+     */
+    public boolean deploy(String jsonEntity) {
+        return executePut(DEPLOY + jsonEntity, HttpStatus.SC_ACCEPTED);
+    }
+}
diff --git a/participant/participant-impl/participant-impl-dcae/src/main/java/org/onap/policy/clamp/controlloop/participant/dcae/main/handler/ControlLoopElementHandler.java b/participant/participant-impl/participant-impl-dcae/src/main/java/org/onap/policy/clamp/controlloop/participant/dcae/main/handler/ControlLoopElementHandler.java
new file mode 100644
index 0000000..96677f3
--- /dev/null
+++ b/participant/participant-impl/participant-impl-dcae/src/main/java/org/onap/policy/clamp/controlloop/participant/dcae/main/handler/ControlLoopElementHandler.java
@@ -0,0 +1,197 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.dcae.main.handler;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.time.Instant;
+import java.util.UUID;
+import java.util.concurrent.TimeUnit;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ClElementStatistics;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopElement;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopOrderedState;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopState;
+import org.onap.policy.clamp.controlloop.participant.dcae.httpclient.ClampHttpClient;
+import org.onap.policy.clamp.controlloop.participant.dcae.httpclient.ConsulDcaeHttpClient;
+import org.onap.policy.clamp.controlloop.participant.dcae.model.Loop;
+import org.onap.policy.clamp.controlloop.participant.intermediary.api.ControlLoopElementListener;
+import org.onap.policy.common.endpoints.parameters.RestServerParameters;
+import org.onap.policy.models.base.PfModelException;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * This class handles implementation of controlLoopElement updates.
+ */
+public class ControlLoopElementHandler implements ControlLoopElementListener, Closeable {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(ControlLoopElementHandler.class);
+    private final ClampHttpClient clampClient;
+    private final ConsulDcaeHttpClient consulClient;
+
+    private static final String LOOP = "pmsh_loop";
+    private static final String TEMPLATE = "LOOP_TEMPLATE_k8s_pmsh";
+
+    private static final String BLUEPRINT_DEPLOYED = "BLUEPRINT_DEPLOYED";
+    private static final String MICROSERVICE_INSTALLED_SUCCESSFULLY = "MICROSERVICE_INSTALLED_SUCCESSFULLY";
+    private static final int CHECK_COUNT = 10;
+
+    private static final String BODY_CONSUL =
+            "{ \"subscription\": { \"subscriptionName\": \"subscriptiona\", \"administrativeState\": \"UNLOCKED\", "
+                    + "\"fileBasedGP\": 15, \"fileLocation\": \"/pm/pm.xml\", \"nfFilter\": "
+                    + "{ \"nfNames\": [ \"^pnf1.*\" ], \"modelInvariantIDs\": "
+                    + "[ \"5845y423-g654-6fju-po78-8n53154532k6\", \"7129e420-d396-4efb-af02-6b83499b12f8\" ], "
+                    + "\"modelVersionIDs\": [ \"e80a6ae3-cafd-4d24-850d-e14c084a5ca9\" ] }, \"measurementGroups\": "
+                    + "[ { \"measurementGroup\": { \"measurementTypes\": [ { \"measurementType\": \"countera\" }, "
+                    + "{ \"measurementType\": \"counterb\" } ], \"managedObjectDNsBasic\": [ { \"DN\": \"dna\" }, "
+                    + "{ \"DN\": \"dnb\" } ] } }, { \"measurementGroup\": { \"measurementTypes\": "
+                    + "[ { \"measurementType\": \"counterc\" }, { \"measurementType\": \"counterd\" } ], "
+                    + "\"managedObjectDNsBasic\": " + "[ { \"DN\": \"dnc\" }, { \"DN\": \"dnd\" } ] } } ] } }";
+
+    /**
+     * Constructor.
+     */
+    public ControlLoopElementHandler(RestServerParameters clampParameters, RestServerParameters consulParameters) {
+        clampClient = new ClampHttpClient(clampParameters);
+        consulClient = new ConsulDcaeHttpClient(consulParameters);
+    }
+
+    /**
+     * Callback method to handle a control loop element state change.
+     *
+     * @param controlLoopElementId the ID of the control loop element
+     * @param currentState the current state of the control loop element
+     * @param newState the state to which the control loop element is changing to
+     */
+    @Override
+    public void controlLoopElementStateChange(UUID controlLoopElementId, ControlLoopState currentState,
+            ControlLoopOrderedState newState) {
+        switch (newState) {
+            case UNINITIALISED:
+                Loop loop = clampClient.getstatus(LOOP);
+                if (loop != null) {
+                    clampClient.undeploy(LOOP);
+                    DcaeHandler.getInstance().getDcaeProvider().getIntermediaryApi()
+                        .updateControlLoopElementState(controlLoopElementId, newState, ControlLoopState.UNINITIALISED);
+                }
+                break;
+            case PASSIVE:
+                DcaeHandler.getInstance().getDcaeProvider().getIntermediaryApi()
+                    .updateControlLoopElementState(controlLoopElementId, newState, ControlLoopState.PASSIVE);
+                break;
+            case RUNNING:
+                DcaeHandler.getInstance().getDcaeProvider().getIntermediaryApi()
+                    .updateControlLoopElementState(controlLoopElementId, newState, ControlLoopState.RUNNING);
+                break;
+            default:
+                LOGGER.debug("Unknown orderedstate {}", newState);
+                break;
+        }
+    }
+
+    private Loop getStatus() throws PfModelException {
+        Loop loop = clampClient.getstatus(LOOP);
+        if (loop == null) {
+            loop = clampClient.create(LOOP, TEMPLATE);
+        }
+        if (loop == null) {
+            throw new PfModelException(null, "");
+        }
+        return loop;
+    }
+
+    private void deploy() throws PfModelException {
+        if (!consulClient.deploy(BODY_CONSUL)) {
+            throw new PfModelException(null, "deploy to consul failed");
+        }
+        if (!clampClient.deploy(LOOP)) {
+            throw new PfModelException(null, "deploy failed");
+        }
+    }
+
+    /**
+     * Callback method to handle an update on a control loop element.
+     *
+     * @param element the information on the control loop element
+     * @param controlLoopDefinition toscaServiceTemplate
+     * @throws PfModelException in case of an exception
+     */
+    @Override
+    public void controlLoopElementUpdate(ControlLoopElement element, ToscaServiceTemplate controlLoopDefinition)
+            throws PfModelException {
+        try {
+            Loop loop = getStatus();
+
+            if (BLUEPRINT_DEPLOYED.equals(ClampHttpClient.getStatusCode(loop))) {
+                deploy();
+                boolean deployedFlag = false;
+                for (int i = 0; i < CHECK_COUNT; i++) {
+                    //sleep 10 seconds
+                    TimeUnit.SECONDS.sleep(CHECK_COUNT);
+                    loop = getStatus();
+                    String status = ClampHttpClient.getStatusCode(loop);
+                    if (MICROSERVICE_INSTALLED_SUCCESSFULLY.equals(status)) {
+                        DcaeHandler.getInstance().getDcaeProvider().getIntermediaryApi()
+                            .updateControlLoopElementState(element.getId(), element.getOrderedState(),
+                                            ControlLoopState.PASSIVE);
+                        deployedFlag = true;
+                        break;
+                    }
+                }
+                if (!deployedFlag) {
+                    LOGGER.warn("DCAE is not deployed properly, ClElement state will be UNINITIALISED2PASSIVE");
+                    DcaeHandler.getInstance().getDcaeProvider().getIntermediaryApi()
+                        .updateControlLoopElementState(element.getId(), element.getOrderedState(),
+                                      ControlLoopState.UNINITIALISED2PASSIVE);
+                }
+            }
+        } catch (PfModelException e) {
+            throw e;
+        } catch (Exception e) {
+            throw new PfModelException(null, e.getMessage(), e);
+        }
+    }
+
+    /**
+     * Handle controlLoopElement statistics.
+     *
+     * @param controlLoopElementId controlloop element id
+     */
+    @Override
+    public void handleStatistics(UUID controlLoopElementId) {
+        ControlLoopElement clElement = DcaeHandler.getInstance().getDcaeProvider()
+                .getIntermediaryApi().getControlLoopElement(controlLoopElementId);
+        if (clElement != null) {
+            ClElementStatistics clElementStatistics = new ClElementStatistics();
+            clElementStatistics.setControlLoopState(clElement.getState());
+            clElementStatistics.setTimeStamp(Instant.now());
+            DcaeHandler.getInstance().getDcaeProvider().getIntermediaryApi()
+                .updateControlLoopElementStatistics(controlLoopElementId, clElementStatistics);
+        }
+    }
+
+    @Override
+    public void close() throws IOException {
+        clampClient.close();
+        consulClient.close();
+    }
+}
diff --git a/participant/participant-impl/participant-impl-dcae/src/main/java/org/onap/policy/clamp/controlloop/participant/dcae/main/handler/DcaeHandler.java b/participant/participant-impl/participant-impl-dcae/src/main/java/org/onap/policy/clamp/controlloop/participant/dcae/main/handler/DcaeHandler.java
new file mode 100644
index 0000000..1963e38
--- /dev/null
+++ b/participant/participant-impl/participant-impl-dcae/src/main/java/org/onap/policy/clamp/controlloop/participant/dcae/main/handler/DcaeHandler.java
@@ -0,0 +1,82 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.dcae.main.handler;
+
+import java.io.IOException;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+import javax.ws.rs.core.Response;
+import lombok.Getter;
+import org.onap.policy.clamp.controlloop.common.handler.ControlLoopHandler;
+import org.onap.policy.clamp.controlloop.participant.dcae.main.parameters.ParticipantDcaeParameters;
+import org.onap.policy.common.endpoints.event.comm.TopicSink;
+import org.onap.policy.common.endpoints.listeners.MessageTypeDispatcher;
+import org.onap.policy.common.utils.services.Registry;
+import org.onap.policy.models.base.PfModelRuntimeException;
+
+/**
+ * This class handles dcae of participants and control loop elements.
+ *
+ * </p>
+ * It is effectively a singleton that is started at system start.
+ */
+public class DcaeHandler extends ControlLoopHandler {
+
+    private final ParticipantDcaeParameters parameters;
+    @Getter
+    private DcaeProvider dcaeProvider;
+
+    /**
+     * Create a handler.
+     *
+     * @param parameters the parameters for access to the database
+     */
+    public DcaeHandler(ParticipantDcaeParameters parameters) {
+        super(parameters.getDatabaseProviderParameters());
+        this.parameters = parameters;
+    }
+
+    public static DcaeHandler getInstance() {
+        return Registry.get(DcaeHandler.class.getName());
+    }
+
+    @Override
+    public Set<Class<?>> getProviderClasses() {
+        return Collections.emptySet();
+    }
+
+    @Override
+    public void startProviders() {
+        dcaeProvider = new DcaeProvider(parameters);
+    }
+
+    @Override
+    public void stopProviders() {
+        try {
+            dcaeProvider.close();
+        } catch (IOException e) {
+            throw new PfModelRuntimeException(Response.Status.INTERNAL_SERVER_ERROR, e.getMessage());
+        } finally {
+            dcaeProvider = null;
+        }
+    }
+}
diff --git a/participant/participant-impl/participant-impl-dcae/src/main/java/org/onap/policy/clamp/controlloop/participant/dcae/main/handler/DcaeProvider.java b/participant/participant-impl/participant-impl-dcae/src/main/java/org/onap/policy/clamp/controlloop/participant/dcae/main/handler/DcaeProvider.java
new file mode 100644
index 0000000..afaf1c7
--- /dev/null
+++ b/participant/participant-impl/participant-impl-dcae/src/main/java/org/onap/policy/clamp/controlloop/participant/dcae/main/handler/DcaeProvider.java
@@ -0,0 +1,133 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.participant.dcae.main.handler;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import lombok.Getter;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopException;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopRuntimeException;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopElement;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoops;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.Participant;
+import org.onap.policy.clamp.controlloop.models.messages.rest.TypedSimpleResponse;
+import org.onap.policy.clamp.controlloop.participant.dcae.main.parameters.ParticipantDcaeParameters;
+import org.onap.policy.clamp.controlloop.participant.intermediary.api.ParticipantIntermediaryApi;
+import org.onap.policy.clamp.controlloop.participant.intermediary.api.ParticipantIntermediaryFactory;
+
+/**
+ * This provider class dcae of participants and control loop elements.
+ */
+public class DcaeProvider implements Closeable {
+    @Getter
+    private final ParticipantIntermediaryApi intermediaryApi;
+
+    private final ControlLoopElementHandler clElementHandler;
+
+    /**
+     * Create a participant dcae provider.
+     *
+     * @throws ControlLoopRuntimeException on errors creating the provider
+     */
+    public DcaeProvider(ParticipantDcaeParameters parameters) throws ControlLoopRuntimeException {
+        intermediaryApi = new ParticipantIntermediaryFactory().createApiImplementation();
+        intermediaryApi.init(parameters.getIntermediaryParameters());
+        clElementHandler = new ControlLoopElementHandler(parameters.getClampClientParameters(),
+                parameters.getConsulClientParameters());
+        intermediaryApi.registerControlLoopElementListener(clElementHandler);
+    }
+
+    @Override
+    public void close() throws IOException {
+        intermediaryApi.close();
+        clElementHandler.close();
+    }
+
+    /**
+     * Get the control loops.
+     *
+     * @param name the controlLoop, null to get all
+     * @param version the controlLoop, null to get all
+     * @return the control loops
+     * @throws ControlLoopException on errors getting the control loops
+     */
+    public ControlLoops getControlLoops(String name, String version) throws ControlLoopException {
+        return intermediaryApi.getControlLoops(name, version);
+    }
+
+    /**
+     * Get the dcae control loop elements.
+     *
+     * @param name the controlLoopElement, null to get all
+     * @param version the controlLoopElement, null to get all
+     * @return the control loop elements
+     * @throws ControlLoopException on errors getting the control loop elements
+     */
+    public Map<UUID, ControlLoopElement> getControlLoopElements(String name, String version)
+            throws ControlLoopException {
+        return intermediaryApi.getControlLoopElements(name, version);
+    }
+
+    /**
+     * Update the given control loop element in the dcae.
+     *
+     * @param element the control loop element to update
+     * @return response simple response returned
+     * @throws ControlLoopException on errors updating the control loop element
+     */
+    public TypedSimpleResponse<ControlLoopElement> updateControlLoopElement(ControlLoopElement element)
+            throws ControlLoopException {
+        TypedSimpleResponse<ControlLoopElement> response = new TypedSimpleResponse<>();
+        response.setResponse(intermediaryApi.updateControlLoopElementState(element.getId(),
+                element.getOrderedState(), element.getState()));
+        return response;
+    }
+
+    /**
+     * Get the current dcae participants.
+     *
+     * @param name the participant, null to get all
+     * @param version the participant, null to get all
+     * @return the list of participants
+     * @throws ControlLoopException on errors getting the participants
+     */
+    public List<Participant> getParticipants(String name, String version) throws ControlLoopException {
+        return intermediaryApi.getParticipants(name, version);
+    }
+
+    /**
+     * Update a dcae participant.
+     *
+     * @param participant the participant to update
+     * @return TypedSimpleResponse simple response
+     * @throws ControlLoopException on errors updating the participant
+     */
+
+    public TypedSimpleResponse<Participant> updateParticipant(Participant participant) throws ControlLoopException {
+        TypedSimpleResponse<Participant> response = new TypedSimpleResponse<>();
+        response.setResponse(
+                intermediaryApi.updateParticipantState(participant.getDefinition(), participant.getParticipantState()));
+        return response;
+    }
+}
diff --git a/participant/participant-impl/participant-impl-dcae/src/main/java/org/onap/policy/clamp/controlloop/participant/dcae/main/parameters/ParticipantDcaeParameterHandler.java b/participant/participant-impl/participant-impl-dcae/src/main/java/org/onap/policy/clamp/controlloop/participant/dcae/main/parameters/ParticipantDcaeParameterHandler.java
new file mode 100644
index 0000000..8d9bef9
--- /dev/null
+++ b/participant/participant-impl/participant-impl-dcae/src/main/java/org/onap/policy/clamp/controlloop/participant/dcae/main/parameters/ParticipantDcaeParameterHandler.java
@@ -0,0 +1,78 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.dcae.main.parameters;
+
+import java.io.File;
+import javax.ws.rs.core.Response;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopException;
+import org.onap.policy.clamp.controlloop.participant.dcae.main.startstop.ParticipantDcaeCommandLineArguments;
+import org.onap.policy.common.parameters.ValidationResult;
+import org.onap.policy.common.utils.coder.Coder;
+import org.onap.policy.common.utils.coder.CoderException;
+import org.onap.policy.common.utils.coder.StandardCoder;
+
+/**
+ * This class handles reading, parsing and validating of control loop runtime parameters from JSON files.
+ */
+public class ParticipantDcaeParameterHandler {
+
+    private static final Coder CODER = new StandardCoder();
+
+    /**
+     * Read the parameters from the parameter file.
+     *
+     * @param arguments the arguments passed to dcae
+     * @return the parameters read from the configuration file
+     * @throws ControlLoopException on parameter exceptions
+     */
+    public ParticipantDcaeParameters getParameters(final ParticipantDcaeCommandLineArguments arguments)
+            throws ControlLoopException {
+        ParticipantDcaeParameters parameters = null;
+
+        // Read the parameters
+        try {
+            // Read the parameters from JSON
+            File file = new File(arguments.getFullConfigurationFilePath());
+            parameters = CODER.decode(file, ParticipantDcaeParameters.class);
+        } catch (final CoderException e) {
+            final String errorMessage = "error reading parameters from \"" + arguments.getConfigurationFilePath()
+                    + "\"\n" + "(" + e.getClass().getSimpleName() + ")";
+            throw new ControlLoopException(Response.Status.NOT_ACCEPTABLE, errorMessage, e);
+        }
+
+        // The JSON processing returns null if there is an empty file
+        if (parameters == null) {
+            final String errorMessage = "no parameters found in \"" + arguments.getConfigurationFilePath() + "\"";
+            throw new ControlLoopException(Response.Status.NOT_ACCEPTABLE, errorMessage);
+        }
+
+        // validate the parameters
+        final ValidationResult validationResult = parameters.validate();
+        if (!validationResult.isValid()) {
+            String returnMessage =
+                    "validation error(s) on parameters from \"" + arguments.getConfigurationFilePath() + "\"\n";
+            returnMessage += validationResult.getResult();
+            throw new ControlLoopException(Response.Status.NOT_ACCEPTABLE, returnMessage);
+        }
+
+        return parameters;
+    }
+}
diff --git a/participant/participant-impl/participant-impl-dcae/src/main/java/org/onap/policy/clamp/controlloop/participant/dcae/main/parameters/ParticipantDcaeParameters.java b/participant/participant-impl/participant-impl-dcae/src/main/java/org/onap/policy/clamp/controlloop/participant/dcae/main/parameters/ParticipantDcaeParameters.java
new file mode 100644
index 0000000..beb2730
--- /dev/null
+++ b/participant/participant-impl/participant-impl-dcae/src/main/java/org/onap/policy/clamp/controlloop/participant/dcae/main/parameters/ParticipantDcaeParameters.java
@@ -0,0 +1,93 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.dcae.main.parameters;
+
+import javax.validation.constraints.NotBlank;
+import lombok.Getter;
+import org.apache.commons.lang3.StringUtils;
+import org.onap.policy.clamp.controlloop.participant.intermediary.parameters.ParticipantIntermediaryParameters;
+import org.onap.policy.common.endpoints.parameters.RestServerParameters;
+import org.onap.policy.common.parameters.BeanValidationResult;
+import org.onap.policy.common.parameters.ParameterGroupImpl;
+import org.onap.policy.common.parameters.ValidationStatus;
+import org.onap.policy.common.parameters.annotations.NotNull;
+import org.onap.policy.common.parameters.annotations.Valid;
+import org.onap.policy.models.provider.PolicyModelsProviderParameters;
+
+/**
+ * Class to hold all parameters needed for the participant dcae.
+ *
+ */
+@NotNull
+@NotBlank
+@Getter
+public class ParticipantDcaeParameters extends ParameterGroupImpl {
+    @Valid
+    private RestServerParameters clampClientParameters;
+
+    @Valid
+    private RestServerParameters consulClientParameters;
+
+    private ParticipantIntermediaryParameters intermediaryParameters;
+    private PolicyModelsProviderParameters databaseProviderParameters;
+
+    /**
+     * Create the participant dcae parameter group.
+     *
+     * @param name the parameter group name
+     */
+    public ParticipantDcaeParameters(final String name) {
+        super(name);
+    }
+
+    /**
+     * {@inheritDoc}.
+     */
+    @Override
+    public BeanValidationResult validate() {
+        BeanValidationResult result = super.validate();
+        if (result.isValid()) {
+            result.addResult(checkMissingMandatoryParams(clampClientParameters));
+            result.addResult(checkMissingMandatoryParams(consulClientParameters));
+        }
+        return result;
+    }
+
+    private BeanValidationResult checkMissingMandatoryParams(RestServerParameters clientParameters) {
+        BeanValidationResult result = new BeanValidationResult(clientParameters.getName(), clientParameters);
+        if (StringUtils.isBlank(clientParameters.getHost())) {
+            result.addResult("Host", clientParameters.getHost(), ValidationStatus.INVALID, "is blank");
+        }
+        if (StringUtils.isBlank(clientParameters.getName())) {
+            result.addResult("Name", clientParameters.getName(), ValidationStatus.INVALID, "is blank");
+        }
+        if (StringUtils.isBlank(clientParameters.getPassword())) {
+            result.addResult("Password", clientParameters.getPassword(), ValidationStatus.INVALID, "is blank");
+        }
+        if (StringUtils.isBlank(clientParameters.getUserName())) {
+            result.addResult("UserName", clientParameters.getUserName(), ValidationStatus.INVALID, "is blank");
+        }
+        if (clientParameters.getPort() <= 0 || clientParameters.getPort() >= 65535) {
+            result.addResult("Port", clientParameters.getPort(), ValidationStatus.INVALID, "is not valid");
+        }
+        return result;
+    }
+}
diff --git a/participant/participant-impl/participant-impl-dcae/src/main/java/org/onap/policy/clamp/controlloop/participant/dcae/main/startstop/Main.java b/participant/participant-impl/participant-impl-dcae/src/main/java/org/onap/policy/clamp/controlloop/participant/dcae/main/startstop/Main.java
new file mode 100644
index 0000000..2b47a2c
--- /dev/null
+++ b/participant/participant-impl/participant-impl-dcae/src/main/java/org/onap/policy/clamp/controlloop/participant/dcae/main/startstop/Main.java
@@ -0,0 +1,151 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.participant.dcae.main.startstop;
+
+import java.util.Arrays;
+import javax.ws.rs.core.Response;
+import lombok.Getter;
+import org.onap.policy.clamp.controlloop.common.ControlLoopConstants;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopException;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopRuntimeException;
+import org.onap.policy.clamp.controlloop.participant.dcae.main.parameters.ParticipantDcaeParameterHandler;
+import org.onap.policy.clamp.controlloop.participant.dcae.main.parameters.ParticipantDcaeParameters;
+import org.onap.policy.common.utils.resources.MessageConstants;
+import org.onap.policy.common.utils.services.Registry;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * This class initiates ONAP Policy Framework Control Loop participant component.
+ */
+public class Main {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(Main.class);
+
+    private ParticipantDcaeActivator activator;
+
+    @Getter
+    private ParticipantDcaeParameters parameterGroup;
+
+    /**
+     * Instantiates the control loop participant service.
+     *
+     * @param args the command line arguments
+     */
+    public Main(final String[] args) {
+        final String argumentString = Arrays.toString(args);
+        LOGGER.info("Starting the control loop participant service with arguments - {}", argumentString);
+
+        // Check the arguments
+        final ParticipantDcaeCommandLineArguments arguments = new ParticipantDcaeCommandLineArguments();
+        try {
+            // The arguments return a string if there is a message to print and we should exit
+            final String argumentMessage = arguments.parse(args);
+            if (argumentMessage != null) {
+                LOGGER.info(argumentMessage);
+                return;
+            }
+            // Validate that the arguments are sane
+            arguments.validate();
+
+            // Read the parameters
+            parameterGroup = new ParticipantDcaeParameterHandler().getParameters(arguments);
+
+            // Now, create the activator for the service
+            activator = new ParticipantDcaeActivator(parameterGroup);
+            Registry.register(ControlLoopConstants.REG_CLRUNTIME_ACTIVATOR, activator);
+
+            // Start the activator
+            activator.start();
+        } catch (Exception exp) {
+            if (null != activator) {
+                Registry.unregister(ControlLoopConstants.REG_CLRUNTIME_ACTIVATOR);
+            }
+            throw new ControlLoopRuntimeException(Response.Status.BAD_REQUEST,
+                String.format(MessageConstants.START_FAILURE_MSG, MessageConstants.POLICY_CLAMP), exp);
+        }
+
+        // Add a shutdown hook to shut everything down in an orderly manner
+        Runtime.getRuntime().addShutdownHook(new ClRuntimeShutdownHookClass());
+        String successMsg = String.format(MessageConstants.START_SUCCESS_MSG, MessageConstants.POLICY_CLAMP);
+        LOGGER.info(successMsg);
+    }
+
+    /**
+     * Check if main is running.
+     */
+    public boolean isRunning() {
+        return activator != null && activator.isAlive();
+    }
+
+    /**
+     * Shut down Execution.
+     *
+     * @throws ControlLoopException on shutdown errors
+     */
+    public void shutdown() throws ControlLoopException {
+        // clear the parameterGroup variable
+        parameterGroup = null;
+
+        // clear the cl participant activator
+        if (activator != null) {
+            activator.stop();
+        }
+    }
+
+    /**
+     * The Class ClRuntimeShutdownHookClass terminates the control loop participant service
+     * when its run method is called.
+     */
+    private class ClRuntimeShutdownHookClass extends Thread {
+        /*
+         * (non-Javadoc)
+         *
+         * @see java.lang.Runnable#run()
+         */
+        @Override
+        public void run() {
+            if (!activator.isAlive()) {
+                return;
+            }
+
+            try {
+                // Shutdown the control loop participant service and wait for everything to stop
+                activator.stop();
+            } catch (final RuntimeException e) {
+                LOGGER.warn("error occured during shut down of the control loop participant service", e);
+            }
+        }
+    }
+
+    /**
+     * The main method.
+     *
+     * @param args the arguments
+     */
+    public static void main(final String[] args) {      // NOSONAR
+        /*
+         * NOTE: arguments are validated by the constructor, thus sonar is disabled.
+         */
+
+        new Main(args);
+    }
+}
diff --git a/participant/participant-impl/participant-impl-dcae/src/main/java/org/onap/policy/clamp/controlloop/participant/dcae/main/startstop/ParticipantDcaeActivator.java b/participant/participant-impl/participant-impl-dcae/src/main/java/org/onap/policy/clamp/controlloop/participant/dcae/main/startstop/ParticipantDcaeActivator.java
new file mode 100644
index 0000000..d485895
--- /dev/null
+++ b/participant/participant-impl/participant-impl-dcae/src/main/java/org/onap/policy/clamp/controlloop/participant/dcae/main/startstop/ParticipantDcaeActivator.java
@@ -0,0 +1,58 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.dcae.main.startstop;
+
+import java.util.concurrent.atomic.AtomicReference;
+import lombok.Getter;
+import org.onap.policy.clamp.controlloop.participant.dcae.main.handler.DcaeHandler;
+import org.onap.policy.clamp.controlloop.participant.dcae.main.parameters.ParticipantDcaeParameters;
+import org.onap.policy.common.utils.services.ServiceManagerContainer;
+
+/**
+ * This class activates the control loop runtime component as a complete service together with all its controllers,
+ * listeners & handlers.
+ */
+public class ParticipantDcaeActivator extends ServiceManagerContainer {
+    @Getter
+    private final ParticipantDcaeParameters parameters;
+
+    /**
+     * Instantiate the activator for the dcae as a complete service.
+     *
+     * @param parameters the parameters for the control loop runtime service
+     */
+    public ParticipantDcaeActivator(final ParticipantDcaeParameters parameters) {
+        this.parameters = parameters;
+
+        final AtomicReference<DcaeHandler> dcaeHandler = new AtomicReference<>();
+
+        // @formatter:off
+        addAction("Dcae Handler",
+            () -> dcaeHandler.set(new DcaeHandler(parameters)),
+            () -> dcaeHandler.get().close());
+
+        addAction("Dcae Providers",
+            () -> dcaeHandler.get().startProviders(),
+            () -> dcaeHandler.get().stopProviders());
+
+        // @formatter:on
+    }
+}
diff --git a/participant/participant-impl/participant-impl-dcae/src/main/java/org/onap/policy/clamp/controlloop/participant/dcae/main/startstop/ParticipantDcaeCommandLineArguments.java b/participant/participant-impl/participant-impl-dcae/src/main/java/org/onap/policy/clamp/controlloop/participant/dcae/main/startstop/ParticipantDcaeCommandLineArguments.java
new file mode 100644
index 0000000..0bf382a
--- /dev/null
+++ b/participant/participant-impl/participant-impl-dcae/src/main/java/org/onap/policy/clamp/controlloop/participant/dcae/main/startstop/ParticipantDcaeCommandLineArguments.java
@@ -0,0 +1,151 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.dcae.main.startstop;
+
+import java.io.File;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.net.URL;
+import java.util.Arrays;
+import javax.ws.rs.core.Response;
+import lombok.Getter;
+import lombok.Setter;
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.DefaultParser;
+import org.apache.commons.cli.HelpFormatter;
+import org.apache.commons.cli.Option;
+import org.apache.commons.cli.Options;
+import org.apache.commons.cli.ParseException;
+import org.apache.commons.lang3.StringUtils;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopException;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopRuntimeException;
+import org.onap.policy.clamp.controlloop.common.startstop.CommonCommandLineArguments;
+import org.onap.policy.common.utils.resources.ResourceUtils;
+
+/**
+ * This class reads and handles command line parameters for the control loop runtime service.
+ *
+ */
+public class ParticipantDcaeCommandLineArguments {
+    private static final String FILE_MESSAGE_PREAMBLE = " file \"";
+    private static final int HELP_LINE_LENGTH = 120;
+
+    private final Options options;
+    private final CommonCommandLineArguments commonCommandLineArguments;
+
+    @Getter()
+    @Setter()
+    private String configurationFilePath = null;
+
+    /**
+     * Construct the options for the dcae participant.
+     */
+    public ParticipantDcaeCommandLineArguments() {
+        options = new Options();
+        commonCommandLineArguments = new CommonCommandLineArguments(options);
+    }
+
+    /**
+     * Construct the options for the CLI editor and parse in the given arguments.
+     *
+     * @param args The command line arguments
+     */
+    public ParticipantDcaeCommandLineArguments(final String[] args) {
+        // Set up the options with the default constructor
+        this();
+
+        // Parse the arguments
+        try {
+            parse(args);
+        } catch (final ControlLoopException e) {
+            throw new ControlLoopRuntimeException(Response.Status.NOT_ACCEPTABLE,
+                    "parse error on dcae participant parameters", e);
+        }
+    }
+
+    /**
+     * Parse the command line options.
+     *
+     * @param args The command line arguments
+     * @return a string with a message for help and version, or null if there is no message
+     * @throws ControlLoopException on command argument errors
+     */
+    public String parse(final String[] args) throws ControlLoopException {
+        // Clear all our arguments
+        setConfigurationFilePath(null);
+        CommandLine commandLine = null;
+        try {
+            commandLine = new DefaultParser().parse(options, args);
+        } catch (final ParseException e) {
+            throw new ControlLoopException(Response.Status.NOT_ACCEPTABLE,
+                    "invalid command line arguments specified : " + e.getMessage());
+        }
+
+        // Arguments left over after Commons CLI does its stuff
+        final String[] remainingArgs = commandLine.getArgs();
+
+        if (remainingArgs.length > 0) {
+            throw new ControlLoopException(Response.Status.NOT_ACCEPTABLE,
+                    "too many command line arguments specified : " + Arrays.toString(args));
+        }
+
+        if (commandLine.hasOption('h')) {
+            return commonCommandLineArguments.help(Main.class.getName(), options);
+        }
+
+        if (commandLine.hasOption('v')) {
+            return commonCommandLineArguments.version();
+        }
+
+        if (commandLine.hasOption('c')) {
+            setConfigurationFilePath(commandLine.getOptionValue('c'));
+        }
+
+        return null;
+    }
+
+    /**
+     * Validate the command line options.
+     *
+     * @throws ControlLoopException on command argument validation errors
+     */
+    public void validate() throws ControlLoopException {
+        commonCommandLineArguments.validate(configurationFilePath);
+    }
+
+    /**
+     * Gets the full expanded configuration file path.
+     *
+     * @return the configuration file path
+     */
+    public String getFullConfigurationFilePath() {
+        return ResourceUtils.getFilePath4Resource(getConfigurationFilePath());
+    }
+
+    /**
+     * Check set configuration file path.
+     *
+     * @return true, if check set configuration file path
+     */
+    public boolean checkSetConfigurationFilePath() {
+        return !StringUtils.isEmpty(configurationFilePath);
+    }
+}
diff --git a/participant/participant-impl/participant-impl-dcae/src/main/java/org/onap/policy/clamp/controlloop/participant/dcae/model/ExternalComponent.java b/participant/participant-impl/participant-impl-dcae/src/main/java/org/onap/policy/clamp/controlloop/participant/dcae/model/ExternalComponent.java
new file mode 100644
index 0000000..01a514f
--- /dev/null
+++ b/participant/participant-impl/participant-impl-dcae/src/main/java/org/onap/policy/clamp/controlloop/participant/dcae/model/ExternalComponent.java
@@ -0,0 +1,35 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.dcae.model;
+
+import java.io.Serializable;
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class ExternalComponent implements Serializable {
+
+    private static final long serialVersionUID = -10;
+
+    private ExternalComponentState componentState;
+
+}
diff --git a/participant/participant-impl/participant-impl-dcae/src/main/java/org/onap/policy/clamp/controlloop/participant/dcae/model/ExternalComponentState.java b/participant/participant-impl/participant-impl-dcae/src/main/java/org/onap/policy/clamp/controlloop/participant/dcae/model/ExternalComponentState.java
new file mode 100644
index 0000000..da7360a
--- /dev/null
+++ b/participant/participant-impl/participant-impl-dcae/src/main/java/org/onap/policy/clamp/controlloop/participant/dcae/model/ExternalComponentState.java
@@ -0,0 +1,34 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.dcae.model;
+
+import java.io.Serializable;
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class ExternalComponentState implements Serializable {
+
+    private static final long serialVersionUID = -10;
+
+    private String stateName;
+}
diff --git a/participant/participant-impl/participant-impl-dcae/src/main/java/org/onap/policy/clamp/controlloop/participant/dcae/model/Loop.java b/participant/participant-impl/participant-impl-dcae/src/main/java/org/onap/policy/clamp/controlloop/participant/dcae/model/Loop.java
new file mode 100644
index 0000000..d842705
--- /dev/null
+++ b/participant/participant-impl/participant-impl-dcae/src/main/java/org/onap/policy/clamp/controlloop/participant/dcae/model/Loop.java
@@ -0,0 +1,36 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.dcae.model;
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Map;
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class Loop implements Serializable {
+
+    private static final long serialVersionUID = -10;
+
+    private Map<String, ExternalComponent> components = new HashMap<>();
+}
diff --git a/participant/participant-impl/participant-impl-dcae/src/main/resources/config/DCAEParticipantConfig.json b/participant/participant-impl/participant-impl-dcae/src/main/resources/config/DCAEParticipantConfig.json
new file mode 100644
index 0000000..863c135
--- /dev/null
+++ b/participant/participant-impl/participant-impl-dcae/src/main/resources/config/DCAEParticipantConfig.json
@@ -0,0 +1,71 @@
+{
+    "name": "ControlLoopParticipantDcae",
+    "clampClientParameters": {
+        "name": "Clamp",
+        "host": "0.0.0.0",
+        "port": 8443,
+        "userName": "admin",
+        "password": "password",
+        "https": true,
+        "aaf": false
+    },
+    "consulClientParameters": {
+        "name": "Consul",
+        "host": "consul",
+        "port": 31321,
+        "userName": "admin",
+        "password": "password",
+        "https": false,
+        "aaf": false
+    },
+    "intermediaryParameters": {
+        "name": "Participant parameters",
+        "reportingTimeInterval": 120000,
+        "description": "Participant Description",
+        "participantId": {
+            "name": "DCAEParticipant0",
+            "version": "1.0.0"
+        },
+        "participantType": {
+            "name": "org.onap.dcae.controlloop.DCAEMicroserviceControlLoopParticipant",
+            "version": "2.3.4"
+        },
+        "clampControlLoopTopics": {
+            "topicSources": [
+                {
+                    "topic": "POLICY-CLRUNTIME-PARTICIPANT",
+                    "servers": [
+                        "localhost"
+                    ],
+                    "topicCommInfrastructure": "dmaap",
+                    "fetchTimeout": 15000
+                }
+            ],
+            "topicSinks": [
+                {
+                    "topic": "POLICY-CLRUNTIME-PARTICIPANT",
+                    "servers": [
+                        "localhost"
+                    ],
+                    "topicCommInfrastructure": "dmaap"
+                },
+                {
+                    "topic": "POLICY-NOTIFICATION",
+                    "servers": [
+                        "localhost"
+                    ],
+                    "topicCommInfrastructure": "dmaap"
+                }
+            ]
+        }
+    },
+    "databaseProviderParameters": {
+        "name": "PolicyProviderParameterGroup",
+        "implementation": "org.onap.policy.models.provider.impl.DatabasePolicyModelsProviderImpl",
+        "databaseDriver": "org.h2.Driver",
+        "databaseUrl": "jdbc:h2:mem:testdb",
+        "databaseUser": "policy",
+        "databasePassword": "P01icY",
+        "persistenceUnit": "ToscaConceptTest"
+    }
+}
diff --git a/participant/participant-impl/participant-impl-dcae/src/main/resources/version.txt b/participant/participant-impl/participant-impl-dcae/src/main/resources/version.txt
new file mode 100644
index 0000000..dbd6758
--- /dev/null
+++ b/participant/participant-impl/participant-impl-dcae/src/main/resources/version.txt
@@ -0,0 +1,4 @@
+ONAP Tosca defined control loop Participant
+Version: ${project.version}
+Built (UTC): ${maven.build.timestamp}
+ONAP https://wiki.onap.org
diff --git a/participant/participant-impl/participant-impl-dcae/src/test/java/org/onap/policy/clamp/controlloop/participant/dcae/httpclient/ClampHttpClientTest.java b/participant/participant-impl/participant-impl-dcae/src/test/java/org/onap/policy/clamp/controlloop/participant/dcae/httpclient/ClampHttpClientTest.java
new file mode 100644
index 0000000..040b33f
--- /dev/null
+++ b/participant/participant-impl/participant-impl-dcae/src/test/java/org/onap/policy/clamp/controlloop/participant/dcae/httpclient/ClampHttpClientTest.java
@@ -0,0 +1,128 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.dcae.httpclient;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.fail;
+import static org.junit.Assert.assertTrue;
+import static org.mockserver.model.HttpRequest.request;
+import static org.mockserver.model.HttpResponse.response;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.mockserver.integration.ClientAndServer;
+import org.onap.policy.clamp.controlloop.participant.dcae.main.parameters.CommonTestData;
+import org.onap.policy.clamp.controlloop.participant.dcae.main.parameters.ParticipantDcaeParameters;
+import org.onap.policy.clamp.controlloop.participant.dcae.model.Loop;
+import org.onap.policy.common.utils.coder.Coder;
+import org.onap.policy.common.utils.coder.StandardCoder;
+
+/**
+ * Class to perform unit test of {@link ClampHttpClient}.
+ *
+ */
+public class ClampHttpClientTest {
+
+    private static final String LOOP = "pmsh_loop";
+    private static final String BLUEPRINT_DEPLOYED = "BLUEPRINT_DEPLOYED";
+
+    private static ClientAndServer mockServer;
+    private static ParticipantDcaeParameters parameters;
+    public static final Coder CODER = new StandardCoder();
+
+    /**
+     * Set up.
+     */
+    @BeforeClass
+    public static void setUp() {
+        CommonTestData commonTestData = new CommonTestData();
+
+        parameters = commonTestData.toObject(
+                commonTestData.getParticipantParameterGroupMap(CommonTestData.PARTICIPANT_GROUP_NAME),
+                ParticipantDcaeParameters.class);
+
+        mockServer = ClientAndServer.startClientAndServer(parameters.getClampClientParameters().getPort());
+
+        mockServer.when(request().withMethod("GET").withPath("/restservices/clds/v2/loop/getstatus/" + LOOP))
+                .respond(response().withBody(CommonTestData.createJsonStatus(BLUEPRINT_DEPLOYED)).withStatusCode(200));
+
+        mockServer.when(request().withMethod("PUT").withPath("/restservices/clds/v2/loop/deploy/" + LOOP))
+                .respond(response().withStatusCode(202));
+
+        mockServer.when(request().withMethod("PUT").withPath("/restservices/clds/v2/loop/undeploy/" + LOOP))
+                .respond(response().withStatusCode(202));
+    }
+
+    @AfterClass
+    public static void stopServer() {
+        mockServer.stop();
+        mockServer = null;
+    }
+
+    @Test
+    public void test_getstatus() throws Exception {
+        try (ClampHttpClient client = new ClampHttpClient(parameters.getClampClientParameters())) {
+
+            Loop status = client.getstatus(LOOP);
+
+            String json = CommonTestData.createJsonStatus(BLUEPRINT_DEPLOYED);
+            Loop loop = CODER.convert(json, Loop.class);
+
+            assertThat(ClampHttpClient.getStatusCode(status)).isEqualTo(ClampHttpClient.getStatusCode(loop));
+
+        } catch (Exception e) {
+            fail(e.getMessage());
+        }
+    }
+
+    @Test
+    public void test_deploy() throws Exception {
+        try (ClampHttpClient client = new ClampHttpClient(parameters.getClampClientParameters())) {
+
+            assertTrue(client.deploy(LOOP));
+
+        } catch (Exception e) {
+            fail(e.getMessage());
+        }
+    }
+
+    @Test
+    public void test_undeploy() throws Exception {
+        try (ClampHttpClient client = new ClampHttpClient(parameters.getClampClientParameters())) {
+
+            assertTrue(client.undeploy(LOOP));
+
+        } catch (Exception e) {
+            fail(e.getMessage());
+        }
+    }
+
+    @Test
+    public void test_getStatusCodeNull() {
+        assertThat(ClampHttpClient.getStatusCode(null)).isEqualTo(ClampHttpClient.STATUS_NOT_FOUND);
+    }
+
+    @Test
+    public void test_getStatusEmptyMap() {
+        assertThat(ClampHttpClient.getStatusCode(new Loop())).isEqualTo(ClampHttpClient.STATUS_NOT_FOUND);
+    }
+}
diff --git a/participant/participant-impl/participant-impl-dcae/src/test/java/org/onap/policy/clamp/controlloop/participant/dcae/main/parameters/CommonTestData.java b/participant/participant-impl/participant-impl-dcae/src/test/java/org/onap/policy/clamp/controlloop/participant/dcae/main/parameters/CommonTestData.java
new file mode 100644
index 0000000..bcfaf8b
--- /dev/null
+++ b/participant/participant-impl/participant-impl-dcae/src/test/java/org/onap/policy/clamp/controlloop/participant/dcae/main/parameters/CommonTestData.java
@@ -0,0 +1,294 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.dcae.main.parameters;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+import javax.ws.rs.core.Response;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopRuntimeException;
+import org.onap.policy.common.endpoints.parameters.TopicParameters;
+import org.onap.policy.common.parameters.ParameterGroup;
+import org.onap.policy.common.utils.coder.Coder;
+import org.onap.policy.common.utils.coder.CoderException;
+import org.onap.policy.common.utils.coder.StandardCoder;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+/**
+ * Class to hold/create all parameters for test cases.
+ */
+public class CommonTestData {
+    public static final String PARTICIPANT_GROUP_NAME = "ControlLoopParticipantGroup";
+    public static final String DESCRIPTION = "Participant description";
+    public static final long TIME_INTERVAL = 2000;
+    public static final List<TopicParameters> TOPIC_PARAMS = Arrays.asList(getTopicParams());
+    private static final String REST_CLIENT_PASSWORD = "password";
+    private static final String REST_CLIENT_USER = "admin";
+    private static final int REST_CLAMP_PORT = 8443;
+    private static final int REST_CONSUL_PORT = 31321;
+    private static final String REST_CLAMP_HOST = "localhost";
+    private static final String REST_CONSUL_HOST = "consul";
+    private static final boolean REST_CLAMP_HTTPS = false;
+    private static final boolean REST_CONSUL_HTTPS = false;
+    private static final boolean REST_CLIENT_AAF = false;
+
+    public static final Coder coder = new StandardCoder();
+
+    /**
+     * Converts the contents of a map to a parameter class.
+     *
+     * @param source property map
+     * @param clazz class of object to be created from the map
+     * @return a new object represented by the map
+     */
+    public <T extends ParameterGroup> T toObject(final Map<String, Object> source, final Class<T> clazz) {
+        try {
+            return coder.convert(source, clazz);
+
+        } catch (final CoderException e) {
+            throw new RuntimeException("cannot create " + clazz.getName() + " from map", e);
+        }
+    }
+
+    /**
+     * Returns a property map for a ApexStarterParameterGroup map for test cases.
+     *
+     * @param name name of the parameters
+     *
+     * @return a property map suitable for constructing an object
+     */
+    public Map<String, Object> getParticipantParameterGroupMap(final String name) {
+        final Map<String, Object> map = new TreeMap<>();
+
+        map.put("name", name);
+        map.put("clampClientParameters", getClampClientParametersMap(false));
+        map.put("consulClientParameters", getConsulClientParametersMap(false));
+        map.put("intermediaryParameters", getIntermediaryParametersMap(false));
+        map.put("databaseProviderParameters", getDatabaseProviderParametersMap(false));
+        return map;
+    }
+
+    /**
+     * Returns a property map for a RestServerParameters map for test cases.
+     *
+     * @param isEmpty boolean value to represent that object created should be empty or not
+     * @return a property map suitable for constructing an object
+     */
+    public Map<String, Object> getClampClientParametersMap(final boolean isEmpty) {
+        final Map<String, Object> map = new TreeMap<>();
+        map.put("https", REST_CLAMP_HTTPS);
+        map.put("aaf", REST_CLIENT_AAF);
+
+        if (!isEmpty) {
+            map.put("host", REST_CLAMP_HOST);
+            map.put("port", REST_CLAMP_PORT);
+            map.put("userName", REST_CLIENT_USER);
+            map.put("password", REST_CLIENT_PASSWORD);
+        }
+
+        return map;
+    }
+
+    /**
+     * Returns a property map for a RestServerParameters map for test cases.
+     *
+     * @param isEmpty boolean value to represent that object created should be empty or not
+     * @return a property map suitable for constructing an object
+     */
+    public Map<String, Object> getConsulClientParametersMap(final boolean isEmpty) {
+        final Map<String, Object> map = new TreeMap<>();
+        map.put("https", REST_CONSUL_HTTPS);
+        map.put("aaf", REST_CLIENT_AAF);
+
+        if (!isEmpty) {
+            map.put("host", REST_CONSUL_HOST);
+            map.put("port", REST_CONSUL_PORT);
+            map.put("userName", REST_CLIENT_USER);
+            map.put("password", REST_CLIENT_PASSWORD);
+        }
+
+        return map;
+    }
+
+    /**
+     * Returns a property map for a databaseProviderParameters map for test cases.
+     *
+     * @param isEmpty boolean value to represent that object created should be empty or not
+     * @return a property map suitable for constructing an object
+     */
+    public Map<String, Object> getDatabaseProviderParametersMap(final boolean isEmpty) {
+        final Map<String, Object> map = new TreeMap<>();
+        if (!isEmpty) {
+            map.put("name", "PolicyProviderParameterGroup");
+            map.put("implementation", "org.onap.policy.models.provider.impl.DatabasePolicyModelsProviderImpl");
+            map.put("databaseDriver", "org.h2.Driver");
+            map.put("databaseUrl", "jdbc:h2:mem:testdb");
+            map.put("databaseUser", "policy");
+            map.put("databasePassword", "P01icY");
+            map.put("persistenceUnit", "ToscaConceptTest");
+        }
+
+        return map;
+    }
+
+    /**
+     * Returns a property map for a intermediaryParameters map for test cases.
+     *
+     * @param isEmpty boolean value to represent that object created should be empty or not
+     * @return a property map suitable for constructing an object
+     */
+    public Map<String, Object> getIntermediaryParametersMap(final boolean isEmpty) {
+        final Map<String, Object> map = new TreeMap<>();
+        if (!isEmpty) {
+            map.put("name", "Participant parameters");
+            map.put("reportingTimeInterval", TIME_INTERVAL);
+            map.put("description", DESCRIPTION);
+            map.put("participantId", getParticipantId());
+            map.put("participantType", getParticipantId());
+            map.put("clampControlLoopTopics", getTopicParametersMap(false));
+        }
+
+        return map;
+    }
+
+    /**
+     * Returns a property map for a TopicParameters map for test cases.
+     *
+     * @param isEmpty boolean value to represent that object created should be empty or not
+     * @return a property map suitable for constructing an object
+     */
+    public Map<String, Object> getTopicParametersMap(final boolean isEmpty) {
+        final Map<String, Object> map = new TreeMap<>();
+        if (!isEmpty) {
+            map.put("topicSources", TOPIC_PARAMS);
+            map.put("topicSinks", TOPIC_PARAMS);
+        }
+        return map;
+    }
+
+    /**
+     * Returns topic parameters for test cases.
+     *
+     * @return topic parameters
+     */
+    public static TopicParameters getTopicParams() {
+        final TopicParameters topicParams = new TopicParameters();
+        topicParams.setTopic("POLICY-CLRUNTIME-PARTICIPANT");
+        topicParams.setTopicCommInfrastructure("dmaap");
+        topicParams.setServers(Arrays.asList("localhost"));
+        return topicParams;
+    }
+
+    /**
+     * Returns participantId for test cases.
+     *
+     * @return participant Id
+     */
+    public static ToscaConceptIdentifier getParticipantId() {
+        final ToscaConceptIdentifier participantId = new ToscaConceptIdentifier();
+        participantId.setName("CDSParticipant0");
+        participantId.setVersion("1.0.0");
+        return participantId;
+    }
+
+    /**
+     * Gets the standard participant parameters.
+     *
+     * @param port port to be inserted into the parameters
+     * @return the standard participant parameters
+     */
+    public ParticipantDcaeParameters getParticipantParameterGroup(int port) {
+        try {
+            return coder.decode(getParticipantParameterGroupAsString(port), ParticipantDcaeParameters.class);
+
+        } catch (CoderException e) {
+            throw new ControlLoopRuntimeException(Response.Status.NOT_ACCEPTABLE, "cannot read participant parameters",
+                    e);
+        }
+    }
+
+    /**
+     * Gets the standard participant parameters, as a String.
+     *
+     * @param port port to be inserted into the parameters
+     * @return the standard participant parameters
+     */
+    public static String getParticipantParameterGroupAsString(int port) {
+
+        try {
+            File file = new File(getParamFile());
+            String json = new String(Files.readAllBytes(file.toPath()), StandardCharsets.UTF_8);
+
+            json = json.replace("${port}", String.valueOf(port));
+            json = json.replace("${dbName}", "jdbc:h2:mem:testdb");
+
+            return json;
+
+        } catch (IOException e) {
+            throw new ControlLoopRuntimeException(Response.Status.NOT_ACCEPTABLE, "cannot read participant parameters",
+                    e);
+
+        }
+    }
+
+    /**
+     * Gets the full path to the parameter file, which may vary depending on whether or
+     * not this is an end-to-end test.
+     *
+     * @return the parameter file name
+     */
+    private static String getParamFile() {
+        return "src/test/resources/parameters/TestParametersStd.json";
+    }
+
+    /**
+     * Nulls out a field within a JSON string.
+     *
+     * @param json JSON string
+     * @param field field to be nulled out
+     * @return a new JSON string with the field nulled out
+     */
+    public String nullifyField(String json, String field) {
+        return json.replace(field + "\"", field + "\":null, \"" + field + "Xxx\"");
+    }
+
+    /**
+     * create Json response from getstatus call.
+     *
+     * @param status the status of Partecipant
+     * @return the JSON
+     */
+    public static String createJsonStatus(String status) {
+        try {
+            File file = new File("src/test/resources/rest/status.json");
+            String json = new String(Files.readAllBytes(file.toPath()), StandardCharsets.UTF_8);
+            return json.replace("${status}", status);
+
+        } catch (IOException e) {
+            throw new ControlLoopRuntimeException(Response.Status.NOT_ACCEPTABLE, "cannot read json file", e);
+        }
+    }
+}
diff --git a/participant/participant-impl/participant-impl-dcae/src/test/java/org/onap/policy/clamp/controlloop/participant/dcae/main/parameters/TestParticipantDcaeParameterHandler.java b/participant/participant-impl/participant-impl-dcae/src/test/java/org/onap/policy/clamp/controlloop/participant/dcae/main/parameters/TestParticipantDcaeParameterHandler.java
new file mode 100644
index 0000000..058a3da
--- /dev/null
+++ b/participant/participant-impl/participant-impl-dcae/src/test/java/org/onap/policy/clamp/controlloop/participant/dcae/main/parameters/TestParticipantDcaeParameterHandler.java
@@ -0,0 +1,102 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.dcae.main.parameters;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.io.FileNotFoundException;
+import org.junit.Test;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopException;
+import org.onap.policy.clamp.controlloop.participant.dcae.main.parameters.ParticipantDcaeParameterHandler;
+import org.onap.policy.clamp.controlloop.participant.dcae.main.parameters.ParticipantDcaeParameters;
+import org.onap.policy.clamp.controlloop.participant.dcae.main.startstop.ParticipantDcaeCommandLineArguments;
+import org.onap.policy.common.utils.coder.CoderException;
+
+/**
+ * Class to perform unit test of {@link ParticipantParameterHandler}.
+ *
+ */
+public class TestParticipantDcaeParameterHandler {
+
+    @Test
+    public void testParameterHandlerNoParameterFile() throws ControlLoopException {
+        final String[] emptyArgumentString = { "-c", "src/test/resources/parameters/NoParametersFile.json" };
+
+        final ParticipantDcaeCommandLineArguments emptyArguments = new ParticipantDcaeCommandLineArguments();
+        emptyArguments.parse(emptyArgumentString);
+
+        assertThatThrownBy(() -> new ParticipantDcaeParameterHandler().getParameters(emptyArguments))
+            .hasCauseInstanceOf(CoderException.class)
+            .hasRootCauseInstanceOf(FileNotFoundException.class);
+    }
+
+    @Test
+    public void testParameterHandlerInvalidParameters() throws ControlLoopException {
+        final String[] invalidArgumentString = { "-c", "src/test/resources/parameters/InvalidParameters.json" };
+
+        final ParticipantDcaeCommandLineArguments invalidArguments =
+                new ParticipantDcaeCommandLineArguments();
+        invalidArguments.parse(invalidArgumentString);
+
+        assertThatThrownBy(() -> new ParticipantDcaeParameterHandler().getParameters(invalidArguments))
+            .hasMessageStartingWith("error reading parameters from")
+            .hasCauseInstanceOf(CoderException.class);
+    }
+
+    @Test
+    public void testParticipantParameterGroup() throws ControlLoopException {
+        final String[] participantConfigParameters = { "-c", "src/test/resources/parameters/TestParameters.json" };
+
+        final ParticipantDcaeCommandLineArguments arguments = new ParticipantDcaeCommandLineArguments();
+        arguments.parse(participantConfigParameters);
+
+        final ParticipantDcaeParameters parGroup = new ParticipantDcaeParameterHandler()
+                .getParameters(arguments);
+        assertTrue(arguments.checkSetConfigurationFilePath());
+        assertEquals(CommonTestData.PARTICIPANT_GROUP_NAME, parGroup.getName());
+    }
+
+    @Test
+    public void testParticipantVersion() throws ControlLoopException {
+        final String[] participantConfigParameters = { "-v" };
+        final ParticipantDcaeCommandLineArguments arguments = new ParticipantDcaeCommandLineArguments();
+        assertThat(arguments.parse(participantConfigParameters)).startsWith(
+                "ONAP Tosca defined control loop Participant");
+    }
+
+    @Test
+    public void testParticipantHelp() throws ControlLoopException {
+        final String[] participantConfigParameters = { "-h" };
+        final ParticipantDcaeCommandLineArguments arguments = new ParticipantDcaeCommandLineArguments();
+        assertThat(arguments.parse(participantConfigParameters)).startsWith("usage:");
+    }
+
+    @Test
+    public void testParticipantInvalidOption() throws ControlLoopException {
+        final String[] participantConfigParameters = { "-d" };
+        final ParticipantDcaeCommandLineArguments arguments = new ParticipantDcaeCommandLineArguments();
+        assertThatThrownBy(() -> arguments.parse(participantConfigParameters))
+            .hasMessageStartingWith("invalid command line arguments specified");
+    }
+}
diff --git a/participant/participant-impl/participant-impl-dcae/src/test/java/org/onap/policy/clamp/controlloop/participant/dcae/main/parameters/TestParticipantDcaeParameters.java b/participant/participant-impl/participant-impl-dcae/src/test/java/org/onap/policy/clamp/controlloop/participant/dcae/main/parameters/TestParticipantDcaeParameters.java
new file mode 100644
index 0000000..edb4293
--- /dev/null
+++ b/participant/participant-impl/participant-impl-dcae/src/test/java/org/onap/policy/clamp/controlloop/participant/dcae/main/parameters/TestParticipantDcaeParameters.java
@@ -0,0 +1,90 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.dcae.main.parameters;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Map;
+import org.junit.Test;
+import org.onap.policy.clamp.controlloop.participant.intermediary.parameters.ParticipantIntermediaryParameters;
+import org.onap.policy.common.endpoints.parameters.TopicParameterGroup;
+import org.onap.policy.common.parameters.ValidationResult;
+
+/**
+ * Class to perform unit test of {@link ParticipantParameterGroup}.
+ *
+ */
+public class TestParticipantDcaeParameters {
+    CommonTestData commonTestData = new CommonTestData();
+
+    @Test
+    public void testParticipantParameterGroup_Named() {
+        final ParticipantDcaeParameters participantParameters = new ParticipantDcaeParameters("my-name");
+        assertEquals("my-name", participantParameters.getName());
+    }
+
+    @Test
+    public void testParticipantParameterGroup() {
+        final ParticipantDcaeParameters participantParameters = commonTestData.toObject(
+                commonTestData.getParticipantParameterGroupMap(CommonTestData.PARTICIPANT_GROUP_NAME),
+                ParticipantDcaeParameters.class);
+        final ParticipantIntermediaryParameters participantIntermediaryParameters = participantParameters
+                .getIntermediaryParameters();
+        final TopicParameterGroup topicParameterGroup  = participantParameters.getIntermediaryParameters()
+                .getClampControlLoopTopics();
+        final ValidationResult validationResult = participantParameters.validate();
+        assertTrue(validationResult.isValid());
+        assertEquals(CommonTestData.PARTICIPANT_GROUP_NAME, participantParameters.getName());
+        assertEquals(CommonTestData.TIME_INTERVAL, participantIntermediaryParameters.getReportingTimeInterval());
+        assertEquals(CommonTestData.DESCRIPTION, participantIntermediaryParameters.getDescription());
+        assertEquals(CommonTestData.TOPIC_PARAMS, topicParameterGroup.getTopicSinks());
+        assertEquals(CommonTestData.TOPIC_PARAMS, topicParameterGroup.getTopicSources());
+    }
+
+    @Test
+    public void testParticipantParameterGroup_EmptyParticipantIntermediaryParameters() {
+        final Map<String, Object> map =
+                commonTestData.getParticipantParameterGroupMap(CommonTestData.PARTICIPANT_GROUP_NAME);
+        map.replace("intermediaryParameters", commonTestData.getIntermediaryParametersMap(true));
+        final ParticipantDcaeParameters participantParameters =
+                commonTestData.toObject(map, ParticipantDcaeParameters.class);
+        final ValidationResult validationResult = participantParameters.validate();
+        assertNull(validationResult.getResult());
+    }
+
+    @Test
+    public void testParticipantParameterGroup_EmptyTopicParameters() {
+        final Map<String, Object> map =
+                commonTestData.getParticipantParameterGroupMap(CommonTestData.PARTICIPANT_GROUP_NAME);
+        final Map<String, Object> intermediaryParametersMap = commonTestData.getIntermediaryParametersMap(false);
+        intermediaryParametersMap.put("clampControlLoopTopics", commonTestData.getTopicParametersMap(true));
+        map.replace("intermediaryParameters", intermediaryParametersMap);
+
+        final ParticipantDcaeParameters participantParameters =
+                commonTestData.toObject(map, ParticipantDcaeParameters.class);
+        final ValidationResult validationResult = participantParameters.validate();
+        assertNull(validationResult.getResult());
+    }
+}
diff --git a/participant/participant-impl/participant-impl-dcae/src/test/java/org/onap/policy/clamp/controlloop/participant/dcae/main/rest/TestListenerUtils.java b/participant/participant-impl/participant-impl-dcae/src/test/java/org/onap/policy/clamp/controlloop/participant/dcae/main/rest/TestListenerUtils.java
new file mode 100644
index 0000000..c3cc8b7
--- /dev/null
+++ b/participant/participant-impl/participant-impl-dcae/src/test/java/org/onap/policy/clamp/controlloop/participant/dcae/main/rest/TestListenerUtils.java
@@ -0,0 +1,255 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.dcae.main.rest;
+
+import java.io.File;
+import java.time.Instant;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.UUID;
+import lombok.Getter;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoop;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopElement;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopOrderedState;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopState;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantState;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantControlLoopStateChange;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantControlLoopUpdate;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantHealthCheck;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantStateChange;
+import org.onap.policy.clamp.controlloop.participant.dcae.main.handler.DcaeProvider;
+import org.onap.policy.clamp.controlloop.participant.dcae.main.parameters.CommonTestData;
+import org.onap.policy.clamp.controlloop.participant.dcae.main.parameters.ParticipantDcaeParameters;
+import org.onap.policy.clamp.controlloop.participant.intermediary.handler.ParticipantHandler;
+import org.onap.policy.common.utils.coder.Coder;
+import org.onap.policy.common.utils.coder.CoderException;
+import org.onap.policy.common.utils.coder.StandardCoder;
+import org.onap.policy.common.utils.coder.YamlJsonTranslator;
+import org.onap.policy.common.utils.resources.ResourceUtils;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
+
+public class TestListenerUtils {
+
+    private static final YamlJsonTranslator yamlTranslator = new YamlJsonTranslator();
+    private static final Coder CODER = new StandardCoder();
+    private static final String TOSCA_TEMPLATE_YAML = "examples/controlloop/PMSubscriptionHandling.yaml";
+    static CommonTestData commonTestData = new CommonTestData();
+
+    @Getter
+    private static ParticipantHandler participantHandler;
+
+    /**
+     * Method to initialize participantHandler.
+     */
+    public static void initParticipantHandler() {
+
+        final ParticipantDcaeParameters parameters = commonTestData.toObject(
+                commonTestData.getParticipantParameterGroupMap(CommonTestData.PARTICIPANT_GROUP_NAME),
+                ParticipantDcaeParameters.class);
+
+        DcaeProvider dcaeProvider = new DcaeProvider(parameters);
+
+        participantHandler = dcaeProvider.getIntermediaryApi().getParticipantHandler();
+    }
+
+    /**
+     * Method to create a controlLoop from a yaml file.
+     *
+     * @return ControlLoop controlloop
+     */
+    public static ControlLoop createControlLoop() {
+        ControlLoop controlLoop = new ControlLoop();
+        Map<UUID, ControlLoopElement> elements = new LinkedHashMap<>();
+        ToscaServiceTemplate toscaServiceTemplate = testControlLoopRead();
+        Map<String, ToscaNodeTemplate> nodeTemplatesMap =
+                toscaServiceTemplate.getToscaTopologyTemplate().getNodeTemplates();
+        for (Map.Entry<String, ToscaNodeTemplate> toscaInputEntry : nodeTemplatesMap.entrySet()) {
+            ControlLoopElement clElement = new ControlLoopElement();
+            clElement.setId(UUID.randomUUID());
+
+            ToscaConceptIdentifier clElementParticipantId = new ToscaConceptIdentifier();
+            clElementParticipantId.setName(toscaInputEntry.getKey());
+            clElementParticipantId.setVersion(toscaInputEntry.getValue().getVersion());
+            clElement.setParticipantId(clElementParticipantId);
+
+            clElement.setDefinition(clElementParticipantId);
+            clElement.setState(ControlLoopState.UNINITIALISED);
+            clElement.setDescription(toscaInputEntry.getValue().getDescription());
+            clElement.setOrderedState(ControlLoopOrderedState.UNINITIALISED);
+            elements.put(clElement.getId(), clElement);
+        }
+        controlLoop.setElements(elements);
+        controlLoop.setName("PMSHInstance0");
+        controlLoop.setVersion("1.0.0");
+
+        ToscaConceptIdentifier definition = new ToscaConceptIdentifier();
+        definition.setName("PMSHInstance0");
+        definition.setVersion("1.0.0");
+        controlLoop.setDefinition(definition);
+
+        return controlLoop;
+    }
+
+    /**
+     * Method to create ParticipantStateChange message from the arguments passed.
+     *
+     * @param participantState participant State
+     *
+     * @return ParticipantStateChange message
+     */
+    public static ParticipantStateChange createParticipantStateChangeMsg(final ParticipantState participantState) {
+        final ParticipantStateChange participantStateChangeMsg = new ParticipantStateChange();
+        ToscaConceptIdentifier participantId = new ToscaConceptIdentifier();
+        participantId.setName("CDSParticipant0");
+        participantId.setVersion("1.0.0");
+
+        participantStateChangeMsg.setParticipantId(participantId);
+        participantStateChangeMsg.setTimestamp(Instant.now());
+        participantStateChangeMsg.setState(participantState);
+
+        return participantStateChangeMsg;
+    }
+
+    /**
+     * Method to create ControlLoopStateChange message from the arguments passed.
+     *
+     * @param controlLoopOrderedState controlLoopOrderedState
+     *
+     * @return ParticipantControlLoopStateChange message
+     */
+    public static ParticipantControlLoopStateChange createControlLoopStateChangeMsg(
+            final ControlLoopOrderedState controlLoopOrderedState) {
+        final ParticipantControlLoopStateChange participantClStateChangeMsg = new ParticipantControlLoopStateChange();
+
+        ToscaConceptIdentifier controlLoopId = new ToscaConceptIdentifier();
+        controlLoopId.setName("PMSHInstance0");
+        controlLoopId.setVersion("1.0.0");
+
+        ToscaConceptIdentifier participantId = new ToscaConceptIdentifier();
+        participantId.setName("CDSParticipant0");
+        participantId.setVersion("1.0.0");
+
+        participantClStateChangeMsg.setControlLoopId(controlLoopId);
+        participantClStateChangeMsg.setParticipantId(participantId);
+        participantClStateChangeMsg.setTimestamp(Instant.now());
+        participantClStateChangeMsg.setOrderedState(controlLoopOrderedState);
+
+        return participantClStateChangeMsg;
+    }
+
+    /**
+     * Method to create ControlLoopUpdateMsg.
+     *
+     * @return ParticipantControlLoopUpdate message
+     */
+    public static ParticipantControlLoopUpdate createControlLoopUpdateMsg() {
+        final ParticipantControlLoopUpdate clUpdateMsg = new ParticipantControlLoopUpdate();
+        ToscaConceptIdentifier controlLoopId = new ToscaConceptIdentifier();
+        controlLoopId.setName("PMSHInstance0");
+        controlLoopId.setVersion("1.0.0");
+
+        ToscaConceptIdentifier participantId = new ToscaConceptIdentifier();
+        participantId.setName("CDSParticipant0");
+        participantId.setVersion("1.0.0");
+
+        clUpdateMsg.setControlLoopId(controlLoopId);
+        clUpdateMsg.setParticipantId(participantId);
+
+        ControlLoop controlLoop = new ControlLoop();
+        Map<UUID, ControlLoopElement> elements = new LinkedHashMap<>();
+        ToscaServiceTemplate toscaServiceTemplate = testControlLoopRead();
+        Map<String, ToscaNodeTemplate> nodeTemplatesMap =
+                toscaServiceTemplate.getToscaTopologyTemplate().getNodeTemplates();
+        for (Map.Entry<String, ToscaNodeTemplate> toscaInputEntry : nodeTemplatesMap.entrySet()) {
+            ControlLoopElement clElement = new ControlLoopElement();
+            clElement.setId(UUID.randomUUID());
+
+            ToscaConceptIdentifier clElementParticipantId = new ToscaConceptIdentifier();
+            clElementParticipantId.setName(toscaInputEntry.getKey());
+            clElementParticipantId.setVersion(toscaInputEntry.getValue().getVersion());
+            clElement.setParticipantId(clElementParticipantId);
+
+            clElement.setDefinition(clElementParticipantId);
+            clElement.setState(ControlLoopState.UNINITIALISED);
+            clElement.setDescription(toscaInputEntry.getValue().getDescription());
+            clElement.setOrderedState(ControlLoopOrderedState.UNINITIALISED);
+            elements.put(clElement.getId(), clElement);
+        }
+        controlLoop.setElements(elements);
+        controlLoop.setName("PMSHInstance0");
+        controlLoop.setVersion("1.0.0");
+        controlLoop.setDefinition(controlLoopId);
+        clUpdateMsg.setControlLoop(controlLoop);
+        clUpdateMsg.setControlLoopDefinition(toscaServiceTemplate);
+
+        return clUpdateMsg;
+    }
+
+    /**
+     * Method to create ParticipantHealthCheck message.
+     *
+     * @return ParticipantHealthCheck message
+     */
+    public static ParticipantHealthCheck createParticipantHealthCheckMsg() {
+        ToscaConceptIdentifier participantId = new ToscaConceptIdentifier();
+        participantId.setName("CDSParticipant0");
+        participantId.setVersion("1.0.0");
+
+        ToscaConceptIdentifier controlLoopId = new ToscaConceptIdentifier();
+        controlLoopId.setName("PMSHInstance0");
+        controlLoopId.setVersion("1.0.0");
+
+        final ParticipantHealthCheck participantHealthCheckMsg = new ParticipantHealthCheck();
+        participantHealthCheckMsg.setParticipantId(participantId);
+        participantHealthCheckMsg.setControlLoopId(controlLoopId);
+        participantHealthCheckMsg.setTimestamp(Instant.now());
+        participantHealthCheckMsg.setState(ParticipantState.PASSIVE);
+
+        return participantHealthCheckMsg;
+    }
+
+    /**
+     * Method to create ParticipantControlLoopUpdate using the arguments passed.
+     *
+     * @param jsonFilePath the path of the controlloop content
+     *
+     * @return ParticipantControlLoopUpdate message
+     * @throws CoderException exception while reading the file to object
+     */
+    public static ParticipantControlLoopUpdate createParticipantClUpdateMsgFromJson(String jsonFilePath)
+            throws CoderException {
+        ParticipantControlLoopUpdate participantControlLoopUpdateMsg =
+                CODER.decode(new File(jsonFilePath), ParticipantControlLoopUpdate.class);
+        return participantControlLoopUpdateMsg;
+    }
+
+    private static ToscaServiceTemplate testControlLoopRead() {
+        return testControlLoopYamlSerialization(TOSCA_TEMPLATE_YAML);
+    }
+
+    private static ToscaServiceTemplate testControlLoopYamlSerialization(String controlLoopFilePath) {
+        String controlLoopString = ResourceUtils.getResourceAsString(controlLoopFilePath);
+        ToscaServiceTemplate serviceTemplate = yamlTranslator.fromYaml(controlLoopString, ToscaServiceTemplate.class);
+        return serviceTemplate;
+    }
+}
diff --git a/participant/participant-impl/participant-impl-dcae/src/test/java/org/onap/policy/clamp/controlloop/participant/dcae/main/startstop/TestMain.java b/participant/participant-impl/participant-impl-dcae/src/test/java/org/onap/policy/clamp/controlloop/participant/dcae/main/startstop/TestMain.java
new file mode 100644
index 0000000..f779f3a
--- /dev/null
+++ b/participant/participant-impl/participant-impl-dcae/src/test/java/org/onap/policy/clamp/controlloop/participant/dcae/main/startstop/TestMain.java
@@ -0,0 +1,151 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.dcae.main.startstop;
+
+import static org.assertj.core.api.Assertions.assertThatCode;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.onap.policy.clamp.controlloop.common.ControlLoopConstants;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopRuntimeException;
+import org.onap.policy.clamp.controlloop.participant.dcae.main.startstop.Main;
+import org.onap.policy.clamp.controlloop.participant.dcae.main.startstop.ParticipantDcaeActivator;
+import org.onap.policy.common.utils.resources.MessageConstants;
+import org.onap.policy.common.utils.services.Registry;
+
+/**
+ * Class to perform unit test of {@link Main}}.
+ */
+public class TestMain {
+
+    /**
+     * Set up.
+     */
+    @BeforeClass
+    public static void setUp() {
+        Registry.newRegistry();
+    }
+
+    /**
+     * Shuts "main" down.
+     *
+     * @throws Exception if an error occurs
+     */
+    @AfterClass
+    public static void tearDown() throws Exception {
+        // shut down activator
+        final ParticipantDcaeActivator activator =
+            Registry.getOrDefault(ControlLoopConstants.REG_CLRUNTIME_ACTIVATOR,
+                            ParticipantDcaeActivator.class, null);
+        if (activator != null && activator.isAlive()) {
+            activator.shutdown();
+        }
+    }
+
+    @Test
+    public void testMain_Help() {
+        final String[] configParameters = {"-h"};
+        Main main = new Main(configParameters);
+        assertFalse(main.isRunning());
+    }
+
+    @Test
+    public void testMain_Version() {
+        final String[] configParameters = {"-v"};
+        Main main = new Main(configParameters);
+        assertFalse(main.isRunning());
+    }
+
+    @Test
+    public void testMain_Valid() {
+        final String[] configParameters = {"-c", "src/test/resources/parameters/TestParameters.json"};
+        Main main = new Main(configParameters);
+        assertTrue(main.isRunning());
+
+        // ensure items were added to the registry
+        assertNotNull(Registry.get(ControlLoopConstants.REG_CLRUNTIME_ACTIVATOR, ParticipantDcaeActivator.class));
+
+        assertThatCode(() -> main.shutdown()).doesNotThrowAnyException();
+
+        assertFalse(main.isRunning());
+    }
+
+    @Test
+    public void testMain_NoParameter() {
+        assertThatConfigParameterThrownException(new String[] {});
+    }
+
+    @Test
+    public void testMain_FilePathNotDefined() {
+        assertThatConfigParameterThrownException(new String[] {"-c"});
+    }
+
+    @Test
+    public void testMain_TooManyCommand() {
+        assertThatConfigParameterThrownException(new String[] {"-h", "d"});
+    }
+
+    @Test
+    public void testMain_WrongParameter() {
+        assertThatConfigParameterThrownException(new String[] {"-d"});
+    }
+
+    private void assertThatConfigParameterThrownException(final String[] configParameters) {
+        assertThatThrownBy(() -> Main.main(configParameters)).isInstanceOf(ControlLoopRuntimeException.class)
+                .hasMessage(String.format(MessageConstants.START_FAILURE_MSG, MessageConstants.POLICY_CLAMP));
+    }
+
+    @Test
+    public void testParticipant_NoFileWithThisName() {
+        assertThatConfigFileThrownException("src/test/resources/parameters/NoFileWithThisName.json");
+    }
+
+    @Test
+    public void testParticipant_NotValidFile() {
+        assertThatConfigFileThrownException("src/test/resources/parameters");
+    }
+
+    @Test
+    public void testParticipant_NoParameters() {
+        assertThatConfigFileThrownException("src/test/resources/parameters/NoParameters.json");
+    }
+
+    @Test
+    public void testParticipant_InvalidParameters() {
+        assertThatConfigFileThrownException("src/test/resources/parameters/InvalidParameters.json");
+    }
+
+    @Test
+    public void testParticipant_WrongJsonFormat() {
+        assertThatConfigFileThrownException("src/test/resources/parameters/Unreadable.json");
+    }
+
+    private void assertThatConfigFileThrownException(final String configFilePath) {
+        final String[] configParameters = new String[] {"-c", configFilePath};
+        assertThatThrownBy(() -> new Main(configParameters)).isInstanceOf(ControlLoopRuntimeException.class)
+                .hasMessage(String.format(MessageConstants.START_FAILURE_MSG, MessageConstants.POLICY_CLAMP));
+    }
+}
diff --git a/participant/participant-impl/participant-impl-dcae/src/test/java/org/onap/policy/clamp/controlloop/participant/dcae/main/startstop/TestParticipantDcaeActivator.java b/participant/participant-impl/participant-impl-dcae/src/test/java/org/onap/policy/clamp/controlloop/participant/dcae/main/startstop/TestParticipantDcaeActivator.java
new file mode 100644
index 0000000..1903868
--- /dev/null
+++ b/participant/participant-impl/participant-impl-dcae/src/test/java/org/onap/policy/clamp/controlloop/participant/dcae/main/startstop/TestParticipantDcaeActivator.java
@@ -0,0 +1,94 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.dcae.main.startstop;
+
+import static org.assertj.core.api.Assertions.assertThatIllegalStateException;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.onap.policy.clamp.controlloop.participant.dcae.main.parameters.CommonTestData;
+import org.onap.policy.clamp.controlloop.participant.dcae.main.parameters.ParticipantDcaeParameterHandler;
+import org.onap.policy.clamp.controlloop.participant.dcae.main.parameters.ParticipantDcaeParameters;
+import org.onap.policy.clamp.controlloop.participant.dcae.main.startstop.ParticipantDcaeActivator;
+import org.onap.policy.clamp.controlloop.participant.dcae.main.startstop.ParticipantDcaeCommandLineArguments;
+import org.onap.policy.common.utils.services.Registry;
+
+/**
+ * Class to perform unit test of {@link ParticipantDcaeActivator}}.
+ *
+ */
+public class TestParticipantDcaeActivator {
+
+    private static ParticipantDcaeActivator activator;
+
+    /**
+     * Initializes an activator.
+     *
+     * @throws Exception if an error occurs
+     */
+    @BeforeClass
+    public static void setUp() throws Exception {
+        Registry.newRegistry();
+        final String[] participantConfigParameters = { "-c", "src/test/resources/parameters/TestParameters.json"};
+        final ParticipantDcaeCommandLineArguments arguments =
+                new ParticipantDcaeCommandLineArguments(participantConfigParameters);
+        final ParticipantDcaeParameters parGroup =
+                new ParticipantDcaeParameterHandler().getParameters(arguments);
+        activator = new ParticipantDcaeActivator(parGroup);
+    }
+
+    /**
+     * Method for cleanup after each test.
+     *
+     * @throws Exception if an error occurs
+     */
+    @AfterClass
+    public static void teardown() throws Exception {
+        // shut down activator
+        if (activator != null && activator.isAlive()) {
+            activator.shutdown();
+        }
+    }
+
+    @Test
+    public void testParticipantActivator() {
+        activator.start();
+        assertTrue(activator.isAlive());
+        assertTrue(activator.getParameters().isValid());
+        assertEquals(CommonTestData.PARTICIPANT_GROUP_NAME, activator.getParameters().getName());
+
+        // repeat - should throw an exception
+        assertThatIllegalStateException().isThrownBy(() -> activator.start());
+        assertTrue(activator.isAlive());
+        assertTrue(activator.getParameters().isValid());
+
+        activator.shutdown();
+        assertFalse(activator.isAlive());
+
+        // repeat - should throw an exception
+        assertThatIllegalStateException().isThrownBy(() -> activator.shutdown());
+        assertFalse(activator.isAlive());
+    }
+}
diff --git a/participant/participant-impl/participant-impl-dcae/src/test/resources/parameters/InvalidParameters.json b/participant/participant-impl/participant-impl-dcae/src/test/resources/parameters/InvalidParameters.json
new file mode 100644
index 0000000..1035ccb
--- /dev/null
+++ b/participant/participant-impl/participant-impl-dcae/src/test/resources/parameters/InvalidParameters.json
@@ -0,0 +1,3 @@
+{
+  "name": "
+}
diff --git a/participant/participant-impl/participant-impl-dcae/src/test/resources/parameters/MinimumParametersH2.json b/participant/participant-impl/participant-impl-dcae/src/test/resources/parameters/MinimumParametersH2.json
new file mode 100644
index 0000000..1ee2955
--- /dev/null
+++ b/participant/participant-impl/participant-impl-dcae/src/test/resources/parameters/MinimumParametersH2.json
@@ -0,0 +1,61 @@
+{
+    "name": "ControlLoopParticipantGroup",
+    "restServerParameters": {
+        "host": "0.0.0.0",
+        "port": 6969,
+        "userName": "healthcheck",
+        "password": "zb!XztG34",
+        "https": false,
+        "aaf": false
+    },
+    "intermediaryParameters": {
+        "name": "Participant parameters",
+        "reportingTimeInterval": 120000,
+        "description": "Participant Description",
+        "participantId": {
+            "name": "DCAEParticipant0",
+            "version": "1.0.0"
+        },
+        "participantType": {
+            "name": "org.onap.dcae.controlloop.DCAEMicroserviceControlLoopParticipant",
+            "version": "2.3.4"
+        },
+        "clampControlLoopTopics": {
+            "topicSources": [
+                {
+                    "topic": "POLICY-CLRUNTIME-PARTICIPANT",
+                    "servers": [
+                        "localhost"
+                    ],
+                    "topicCommInfrastructure": "dmaap",
+                    "fetchTimeout": 15000
+                }
+            ],
+            "topicSinks": [
+                {
+                    "topic": "POLICY-CLRUNTIME-PARTICIPANT",
+                    "servers": [
+                        "localhost"
+                    ],
+                    "topicCommInfrastructure": "dmaap"
+                },
+                {
+                    "topic": "POLICY-NOTIFICATION",
+                    "servers": [
+                        "localhost"
+                    ],
+                    "topicCommInfrastructure": "dmaap"
+                }
+            ]
+        }
+    },
+    "databaseProviderParameters": {
+        "name": "PolicyProviderParameterGroup",
+        "implementation": "org.onap.policy.models.provider.impl.DatabasePolicyModelsProviderImpl",
+        "databaseDriver": "org.h2.Driver",
+        "databaseUrl": "jdbc:h2:mem:testdb",
+        "databaseUser": "policy",
+        "databasePassword": "P01icY",
+        "persistenceUnit": "ToscaConceptTest"
+    }
+}
diff --git a/participant/participant-impl/participant-impl-dcae/src/test/resources/parameters/NoParameters.json b/participant/participant-impl/participant-impl-dcae/src/test/resources/parameters/NoParameters.json
new file mode 100644
index 0000000..7a73a41
--- /dev/null
+++ b/participant/participant-impl/participant-impl-dcae/src/test/resources/parameters/NoParameters.json
@@ -0,0 +1,2 @@
+{
+}
\ No newline at end of file
diff --git a/participant/participant-impl/participant-impl-dcae/src/test/resources/parameters/TestCLParams.json b/participant/participant-impl/participant-impl-dcae/src/test/resources/parameters/TestCLParams.json
new file mode 100644
index 0000000..a425862
--- /dev/null
+++ b/participant/participant-impl/participant-impl-dcae/src/test/resources/parameters/TestCLParams.json
@@ -0,0 +1,160 @@
+tosca_definitions_version: tosca_simple_yaml_1_3
+data_types:
+  onap.datatypes.ToscaConceptIdentifier:
+    derived_from: tosca.datatypes.Root
+    properties:
+      name:
+        type: string
+        required: true
+      version:
+        type: string
+        required: true
+node_types:
+  org.onap.policy.clamp.controlloop.Participant:
+    version: 1.0.1
+    derived_from: tosca.nodetypes.Root
+    properties:
+      provider:
+        type: string
+        requred: false
+  org.onap.policy.clamp.controlloop.ControlLoopElement:
+    version: 1.0.1
+    derived_from: tosca.nodetypes.Root
+    properties:
+      provider:
+        type: string
+        requred: false
+      participant_id:
+        type: onap.datatypes.ToscaConceptIdentifier
+        requred: true
+  org.onap.policy.clamp.controlloop.ControlLoop:
+    version: 1.0.1
+    derived_from: tosca.nodetypes.Root
+    properties:
+      provider:
+        type: string
+        requred: false
+      elements:
+        type: list
+        required: true
+        entry_schema:
+          type: onap.datatypes.ToscaConceptIdentifier
+  org.onap.policy.clamp.controlloop.DCAEMicroserviceControlLoopElement:
+    version: 1.0.1
+    derived_from: org.onap.policy.clamp.controlloop.ControlLoopElement
+    properties:
+      dcae_blueprint_id:
+        type: onap.datatypes.ToscaConceptIdentifier
+        requred: true
+  org.onap.policy.clamp.controlloop.PolicyTypeControlLoopElement:
+    version: 1.0.1
+    derived_from: org.onap.policy.clamp.controlloop.ControlLoopElement
+    properties:
+      policy_type_id:
+        type: onap.datatypes.ToscaConceptIdentifier
+        requred: true
+  org.onap.policy.clamp.controlloop.CDSControlLoopElement:
+    version: 1.0.1
+    derived_from: org.onap.policy.clamp.controlloop.ControlLoopElement
+    properties:
+      cds_blueprint_id:
+        type: onap.datatypes.ToscaConceptIdentifier
+        requred: true
+topology_template:
+  node_templates:
+    org.onap.dcae.controlloop.DCAEMicroserviceControlLoopParticipant:
+      version: 2.3.4
+      type: org.onap.policy.clamp.controlloop.Participant
+      type_version: 1.0.1
+      description: Participant for DCAE microservices
+      properties:
+        provider: ONAP
+    org.onap.policy.controlloop.MonitoringPolicyControlLoopParticipant:
+      version: 2.3.1
+      type: org.onap.policy.clamp.controlloop.Participant
+      type_version: 1.0.1
+      description: Participant for DCAE microservices
+      properties:
+        provider: ONAP
+    org.onap.policy.controlloop.OperationalPolicyControlLoopParticipant:
+      version: 3.2.1
+      type: org.onap.policy.clamp.controlloop.Participant
+      type_version: 1.0.1
+      description: Participant for DCAE microservices
+      properties:
+        provider: ONAP
+    org.onap.ccsdk.cds.controlloop.CdsControlLoopParticipant:
+      version: 2.2.1
+      type: org.onap.policy.clamp.controlloop.Participant
+      type_version: 1.0.1
+      description: Participant for DCAE microservices
+      properties:
+        provider: ONAP
+    org.onap.domain.pmsh.PMSH_DCAEMicroservice:
+      version: 1.2.3
+      type: org.onap.policy.clamp.controlloop.DCAEMicroserviceControlLoopElement
+      type_version: 1.0.0
+      description: Control loop element for the DCAE microservice for Performance Management Subscription Handling
+      properties:
+        provider: Ericsson
+        participant_id:
+          name: org.onap.dcae.controlloop.DCAEMicroserviceControlLoopParticipant
+          version: 2.3.4
+        dcae_blueprint_id:
+          name: org.onap.dcae.blueprints.PMSHBlueprint
+          version: 1.0.0
+    org.onap.domain.pmsh.PMSH_MonitoringPolicyControlLoopElement:
+      version: 1.2.3
+      type: org.onap.policy.clamp.controlloop.PolicyTypeControlLoopElement
+      type_version: 1.0.0
+      description: Control loop element for the monitoring policy for Performance Management Subscription Handling
+      properties:
+        provider: Ericsson
+        participant_id:
+          name: org.onap.policy.controlloop.MonitoringPolicyControlLoopParticipant
+          version: 2.3.1
+        policy_type_id:
+          name: onap.policies.monitoring.pm-subscription-handler
+          version: 1.0.0
+    org.onap.domain.pmsh.PMSH_OperationalPolicyControlLoopElement:
+      version: 1.2.3
+      type: org.onap.policy.clamp.controlloop.PolicyTypeControlLoopElement
+      type_version: 1.0.0
+      description: Control loop element for the operational policy for Performance Management Subscription Handling
+      properties:
+        provider: Ericsson
+        participant_id:
+          name: org.onap.policy.controlloop.OperationalPolicyControlLoopParticipant
+          version: 2.2.1
+        policy_type_id:
+          name: onap.policies.operational.pm-subscription-handler
+          version: 1.0.0
+    org.onap.domain.pmsh.PMSH_CDS_ControlLoopElement:
+      version: 1.2.3
+      type: org.onap.policy.clamp.controlloop.ControlLoopElement
+      type_version: 1.0.0
+      description: Control loop element for CDS for Performance Management Subscription Handling
+      properties:
+        provider: Ericsson
+        participant_Id:
+          name: org.onap.ccsdk.cds.controlloop.CdsControlLoopParticipant
+          version: 3.2.1
+        cds_blueprint_id:
+          name: org.onap.ccsdk.cds.PMSHCdsBlueprint
+          version: 1.0.0
+    org.onap.domain.pmsh.PMSHControlLoopDefinition:
+      version: 1.2.3
+      type: org.onap.policy.clamp.controlloop.ControlLoop
+      type_version: 1.0.0
+      description: Control loop for Performance Management Subscription Handling
+      properties:
+        provider: Ericsson
+        elements:
+        - name: org.onap.domain.pmsh.PMSH_DCAEMicroservice
+          version: 1.2.3
+        - name: org.onap.domain.pmsh.PMSH_MonitoringPolicyControlLoopElement
+          version: 1.2.3
+        - name: org.onap.domain.pmsh.PMSH_OperationalPolicyControlLoopElement
+          version: 1.2.3
+        - name: org.onap.domain.pmsh.PMSH_CDS_ControlLoopElement
+          version: 1.2.3
diff --git a/participant/participant-impl/participant-impl-dcae/src/test/resources/parameters/TestParameters.json b/participant/participant-impl/participant-impl-dcae/src/test/resources/parameters/TestParameters.json
new file mode 100644
index 0000000..789fc7b
--- /dev/null
+++ b/participant/participant-impl/participant-impl-dcae/src/test/resources/parameters/TestParameters.json
@@ -0,0 +1,71 @@
+{
+    "name": "ControlLoopParticipantGroup",
+    "clampClientParameters": {
+        "name": "Clamp",
+        "host": "0.0.0.0",
+        "port": 8443,
+        "userName": "admin",
+        "password": "password",
+        "https": true,
+        "aaf": false
+    },
+    "consulClientParameters": {
+        "name": "Clamp",
+        "host": "consul",
+        "port": 31321,
+        "userName": "admin",
+        "password": "password",
+        "https": false,
+        "aaf": false
+    },
+    "intermediaryParameters": {
+        "name": "Participant parameters",
+        "reportingTimeInterval": 120000,
+        "description": "Participant Description",
+        "participantId": {
+            "name": "DCAEParticipant0",
+            "version": "1.0.0"
+        },
+        "participantType": {
+            "name": "org.onap.dcae.controlloop.DCAEMicroserviceControlLoopParticipant",
+            "version": "2.3.4"
+        },
+        "clampControlLoopTopics": {
+            "topicSources": [
+                {
+                    "topic": "POLICY-CLRUNTIME-PARTICIPANT",
+                    "servers": [
+                        "localhost"
+                    ],
+                    "topicCommInfrastructure": "dmaap",
+                    "fetchTimeout": 15000
+                }
+            ],
+            "topicSinks": [
+                {
+                    "topic": "POLICY-CLRUNTIME-PARTICIPANT",
+                    "servers": [
+                        "localhost"
+                    ],
+                    "topicCommInfrastructure": "dmaap"
+                },
+                {
+                    "topic": "POLICY-NOTIFICATION",
+                    "servers": [
+                        "localhost"
+                    ],
+                    "topicCommInfrastructure": "dmaap"
+                }
+            ]
+        }
+    },
+    "databaseProviderParameters": {
+        "name": "PolicyProviderParameterGroup",
+        "implementation": "org.onap.policy.models.provider.impl.DatabasePolicyModelsProviderImpl",
+        "databaseDriver": "org.h2.Driver",
+        "databaseUrl": "jdbc:h2:mem:testdb",
+        "databaseUser": "policy",
+        "databasePassword": "P01icY",
+        "persistenceUnit": "ToscaConceptTest"
+    }
+}
diff --git a/participant/participant-impl/participant-impl-dcae/src/test/resources/parameters/TestParametersStd.json b/participant/participant-impl/participant-impl-dcae/src/test/resources/parameters/TestParametersStd.json
new file mode 100644
index 0000000..789fc7b
--- /dev/null
+++ b/participant/participant-impl/participant-impl-dcae/src/test/resources/parameters/TestParametersStd.json
@@ -0,0 +1,71 @@
+{
+    "name": "ControlLoopParticipantGroup",
+    "clampClientParameters": {
+        "name": "Clamp",
+        "host": "0.0.0.0",
+        "port": 8443,
+        "userName": "admin",
+        "password": "password",
+        "https": true,
+        "aaf": false
+    },
+    "consulClientParameters": {
+        "name": "Clamp",
+        "host": "consul",
+        "port": 31321,
+        "userName": "admin",
+        "password": "password",
+        "https": false,
+        "aaf": false
+    },
+    "intermediaryParameters": {
+        "name": "Participant parameters",
+        "reportingTimeInterval": 120000,
+        "description": "Participant Description",
+        "participantId": {
+            "name": "DCAEParticipant0",
+            "version": "1.0.0"
+        },
+        "participantType": {
+            "name": "org.onap.dcae.controlloop.DCAEMicroserviceControlLoopParticipant",
+            "version": "2.3.4"
+        },
+        "clampControlLoopTopics": {
+            "topicSources": [
+                {
+                    "topic": "POLICY-CLRUNTIME-PARTICIPANT",
+                    "servers": [
+                        "localhost"
+                    ],
+                    "topicCommInfrastructure": "dmaap",
+                    "fetchTimeout": 15000
+                }
+            ],
+            "topicSinks": [
+                {
+                    "topic": "POLICY-CLRUNTIME-PARTICIPANT",
+                    "servers": [
+                        "localhost"
+                    ],
+                    "topicCommInfrastructure": "dmaap"
+                },
+                {
+                    "topic": "POLICY-NOTIFICATION",
+                    "servers": [
+                        "localhost"
+                    ],
+                    "topicCommInfrastructure": "dmaap"
+                }
+            ]
+        }
+    },
+    "databaseProviderParameters": {
+        "name": "PolicyProviderParameterGroup",
+        "implementation": "org.onap.policy.models.provider.impl.DatabasePolicyModelsProviderImpl",
+        "databaseDriver": "org.h2.Driver",
+        "databaseUrl": "jdbc:h2:mem:testdb",
+        "databaseUser": "policy",
+        "databasePassword": "P01icY",
+        "persistenceUnit": "ToscaConceptTest"
+    }
+}
diff --git a/participant/participant-impl/participant-impl-dcae/src/test/resources/parameters/Unreadable.json b/participant/participant-impl/participant-impl-dcae/src/test/resources/parameters/Unreadable.json
new file mode 100644
index 0000000..581ce8f
--- /dev/null
+++ b/participant/participant-impl/participant-impl-dcae/src/test/resources/parameters/Unreadable.json
@@ -0,0 +1,81 @@
+{
+    "name": "ControlLoopRuntimeGroup",
+    "restServerParameters": {
+        "host": "0.0.0.0",
+        "port": ${port},
+        "userName": "healthcheck",
+        "password": "zb!XztG34",
+        "https": false,
+        "aaf": false
+    },
+    "participantParameters": {
+        "heartBeatMs": 120000,
+        "updateParameters": {
+            "maxRetryCount": 1,
+            "maxWaitMs": 30000
+        },
+        "stateChangeParameters": {
+            "maxRetryCount": 1,
+            "maxWaitMs": 30000
+        }
+    },
+    "databaseProviderParameters": {
+        "name": "PolicyProviderParameterGroup",
+        "implementation": "org.onap.policy.models.provider.impl.DatabasePolicyModelsProviderImpl",
+        "databaseDriver": "org.h2.Driver",
+        "databaseUrl": "${dbName}",
+        "databaseUser": "policy",
+        "databasePassword": "P01icY",
+        "persistenceUnit": "ToscaConceptTest"
+    },
+    "topicParameterGroup": {
+        "topicSources": [
+            {
+                "topic": "POLICY-CLRUNTIME-PARTICIPANT",
+                "servers": [
+                    "localhost"
+                ],
+                "topicCommInfrastructure": "dmaap",
+                "fetchTimeout": 15000
+            }
+        ],
+        "topicSinks": [
+            {
+                "topic": "POLICY-CLRUNTIME-PARTICIPANT",
+                "servers": [
+                    "localhost"
+                ],
+                "topicCommInfrastructure": "dmaap"
+            },
+            {
+                "topic": "POLICY-NOTIFICATION",
+                "servers": [
+                    "localhost"
+                ],
+                "topicCommInfrastructure": "dmaap"
+            }
+        ]
+    },
+    "healthCheckRestClientParameters": [
+        {
+            "clientName": "api",
+            "hostname": "policy-api",
+            "port": 6969,
+            "userName": "healthcheck",
+            "password": "zb!XztG34",
+            "useHttps": true,
+            "basePath": "policy/api/v1/healthcheck"
+        },
+        {
+            "clientName": "distribution",
+            "hostname": "policy-distribution",
+            "port": 6969,
+            "userName": "healthcheck",
+            "password": "zb!XztG34",
+            "useHttps": true,
+            "basePath": "healthcheck"
+        }
+    ]
+}
+
+
diff --git a/participant/participant-impl/participant-impl-dcae/src/test/resources/parameters/logback-test.xml b/participant/participant-impl/participant-impl-dcae/src/test/resources/parameters/logback-test.xml
new file mode 100644
index 0000000..cf6b89e
--- /dev/null
+++ b/participant/participant-impl/participant-impl-dcae/src/test/resources/parameters/logback-test.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ============LICENSE_START=======================================================
+   Copyright (C) 2021 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=========================================================
+-->
+
+<configuration>
+
+    <contextName>Participant</contextName>
+    <statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />
+    <property name="LOG_DIR" value="${java.io.tmpdir}/clamp_logging/" />
+
+    <!-- USE FOR STD OUT ONLY -->
+    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <Pattern>%d %contextName [%t] %level %logger{36} - %msg%n</Pattern>
+        </encoder>
+    </appender>
+
+    <root level="info">
+        <appender-ref ref="STDOUT" />
+    </root>
+
+    <logger name="org.onap.policy.clamp.controlloop.participant" level="trace" additivity="false">
+        <appender-ref ref="STDOUT" />
+    </logger>
+</configuration>
diff --git a/participant/participant-impl/participant-impl-dcae/src/test/resources/rest/servicetemplates/pm_control_loop_tosca.yaml b/participant/participant-impl/participant-impl-dcae/src/test/resources/rest/servicetemplates/pm_control_loop_tosca.yaml
new file mode 100644
index 0000000..01f825f
--- /dev/null
+++ b/participant/participant-impl/participant-impl-dcae/src/test/resources/rest/servicetemplates/pm_control_loop_tosca.yaml
@@ -0,0 +1,452 @@
+tosca_definitions_version: tosca_simple_yaml_1_3
+capability_types:
+  org.onap.EventProducer:
+    properties:
+      carrier_protocol_type:
+        type: string
+        required: true
+        constraints:
+        - valid_values:
+          - DMAAP_message_router
+          - SOMETHING_ELSE
+          - REST
+      data_format:
+        type: string
+        required: true
+        constraints:
+        - valid_values:
+          - JSON
+          - YAML
+          - JMS
+      event_format:
+        type: string
+        required: true
+      event_format_version:
+        type: string
+        required: false
+      config_keys:
+        type: list
+        required: false
+        entry_schema:
+          type: string
+          constraints:
+          - valid_values:
+            - all valid values should be added here
+            - if not specified, events of any config key may be generated
+            - 'examples for config_key: ves-measurement, ves-syslog, tca_handle_out,
+              etc.'
+    version: 0.0.1
+    derived_from: tosca.capabilities.Root
+  org.onap.EventConsumer:
+    properties:
+      responding_capability:
+        type: string
+        required: false
+      carrier_protocol_type:
+        type: string
+        required: true
+        constraints:
+        - valid_values:
+          - DMAAP_message_router
+          - SOMETHING_ELSE
+          - REST
+      data_format:
+        type: string
+        required: true
+        constraints:
+        - valid_values:
+          - JSON
+          - YAML
+          - JMS
+          - all valid values should be added here
+      event_format:
+        type: string
+        description: 'examples for event_format: Ves_specification, LinkUp, VnfConfigured,
+          etc.'
+        required: true
+      event_format_version:
+        type: string
+        description: 'examples for event_format_version: 5.28.4, 7.30.1, etc.'
+        required: false
+      config_keys:
+        type: list
+        required: false
+        entry_schema:
+          type: string
+          constraints:
+          - valid_values:
+            - all valid values should be added here
+            - if not specified, events of any config key may be generated
+            - 'examples for config_key: ves-measurement, ves-syslog, tca_handle_out,
+              etc.'
+    version: 0.0.1
+    derived_from: tosca.capabilities.Root
+node_types:
+  org.onap.DynamicConfig:
+    properties:
+      application_name:
+        type: string
+        description: Value used to tie the config to an application ? should we be
+          using a relationship here instead?
+        required: true
+      application_version:
+        type: string
+        required: true
+      application_provider:
+        type: string
+        required: false
+      data_types:
+        type: object
+        required: false
+      schema:
+        type: object
+        required: false
+    version: 0.0.1
+    derived_from: tosca.nodes.Root
+  org.onap.APP:
+    properties:
+      application_name:
+        type: string
+        description: Human readable name for the application Product
+        required: false
+      provider:
+        type: string
+        description: Provider of the application and of the descriptor
+        required: true
+      application_version:
+        type: string
+        description: Software version of the application
+        required: true
+      blueprint_id:
+        type: string
+        description: A reference to the app blueprint
+        required: false
+      monitoring_policy:
+        type: string
+        description: A reference to the monitoring policy
+        required: false
+    requirements:
+    - receive:
+        capability: org.onap.EventProducer
+        relationship: org.onap.PropagateEvent
+        occurrences:
+        - 0.0
+        - UNBOUNDED
+        version: 0.0.0
+    - send:
+        capability: org.onap.EventConsumer
+        relationship: org.onap.PropagateEvent
+        occurrences:
+        - 0.0
+        - UNBOUNDED
+        version: 0.0.0
+    version: 0.0.1
+    derived_from: tosca.nodes.Root
+  org.onap.EventRelay:
+    properties:
+      event_format:
+        type: string
+        description: 'examples for event_format: Ves_specification, etc.'
+        required: true
+      event_format_version:
+        type: string
+        description: 'examples for event_format_version: 5.28.4, 7.30.1, etc.'
+        required: true
+      config_keys:
+        type: list
+        required: false
+        entry_schema:
+          type: string
+          constraints:
+          - valid_values:
+            - all valid values should be added here
+            - if not specified, events of any config key is relayed
+            - 'examples for config_key: ves-measurement, ves-syslog, tca_handle_out,
+              etc.'
+      supported_carrier_protocols:
+        type: map
+        description: 'A map describing supported carrier protocols and translations.
+          The tuples define what protocol combinations are supported on the producer
+          and consumer side: e.g. { REST: REST, DMAAP: REST, DMAAP: DMAAP}'
+        required: true
+        key_schema:
+          type: string
+          constraints:
+          - valid_values:
+            - DMAAP_message_router
+            - SOMETHING_ELSE
+            - REST
+            - all valid values should be added here
+        entry_schema:
+          type: string
+          constraints:
+          - valid_values:
+            - DMAAP_message_router
+            - SOMETHING_ELSE
+            - REST
+            - all valid values should be added here
+      supported_data_formats:
+        type: map
+        description: 'Is a map describing supported data formats and translation.
+          The tuples define what protocol combinations are supported on the producer
+          and consumer side: e.g. { JSON: JSON, JMS: JSON, YAML:YAML }'
+        required: true
+        key_schema:
+          type: string
+          constraints:
+          - valid_values:
+            - JSON
+            - JMS
+            - YAML
+            - etc
+            - all valid values should be added here
+        entry_schema:
+          type: string
+          constraints:
+          - valid_values:
+            - JSON
+            - JMS
+            - YAML
+            - etc
+            - all valid values should be added here
+    requirements:
+    - receive:
+        capability: org.onap.EventProducer
+        relationship: org.onap.PropagateEvent
+        occurrences:
+        - 0.0
+        - UNBOUNDED
+        version: 0.0.0
+    - send:
+        capability: org.onap.EventConsumer
+        relationship: org.onap.PropagateEvent
+        occurrences:
+        - 0.0
+        - UNBOUNDED
+        version: 0.0.0
+    version: 0.0.1
+    derived_from: tosca.nodes.Root
+relationship_types:
+  org.onap.PropagateEvent:
+    properties:
+      config_keys:
+        type: list
+        description: The relationship type used on requirements to org.onap.EventProducer
+          and org.onap.EventConsumer capabilities. Filters events by specific config_keys
+          to be transferred by this relationship. That is, any event with a specific
+          config_key found in the list is transferred. If list is not defined or is
+          empty, events with all config_keys are transferred.
+        required: false
+        entry_schema:
+          type: string
+    version: 0.0.1
+    derived_from: tosca.relationships.Root
+topology_template:
+  inputs:
+    pm_subscription_topic:
+      type: string
+    pm_subscription_response_topic:
+      type: string
+    pm_subscription_handler_blueprint_id:
+      type: string
+    pm_subscription_operational_policy_id:
+      type: string
+    pm_subscription_cds_blueprint_id:
+      type: string
+    enable_tls:
+      type: string
+  node_templates:
+    org.onap.PM_Subscription_Handler:
+      type: org.onap.APP
+      properties:
+        application_name: PM Subscription Handler
+        provider: Ericsson
+        application_version: 1.0.0
+        artifact_id:
+          get_input: pm_subscription_handler_blueprint_id
+          description: Is this a reference to the DCAE Cloudify Blueprint that is
+            already stored(or will be stored before CL configuration & instatiation)
+            in DCAE Inventory?
+        artifact_config:
+          enable_tls:
+            get_input: enable_tls
+          pmsh_publish_topic_name:
+            get_input: pm_subscription_topic
+      capabilities:
+        pm-subscription-event-publisher:
+          properties:
+            carrier_protocol_type: DMAAP_message_router
+            data_format: JSON
+            event_format: pm-subscription-event-format
+            event_format_version: 1.0.0
+          attributes:
+            type: org.onap.EventProducer
+          occurrences:
+          - 0.0
+          - UNBOUNDED
+          version: 0.0.0
+        pm-subscription-event-receiver:
+          properties:
+            carrier_protocol_type: DMAAP_message_router
+            data_format: JSON
+            event_format: pm-subscription-event-response-format
+            event_format_version: 1.0.0
+            relationships:
+            - type: tosca.relationships.DependsOn
+            - description: any ideas on a better realtionship ? or is it better to
+                just use the root realtionship ?
+            - target: org.onap.PM_Monitoring_Policy
+          attributes:
+            type: org.onap.EventConsumer
+          occurrences:
+          - 0.0
+          - UNBOUNDED
+          version: 0.0.0
+      version: 0.0.0
+    org.onap.PM_Monitoring_Policy:
+      type: org.onap.DynamicConfig
+      properties:
+        application_name: PM Subscription Handler
+        application_version: 1.0.0
+        provider: Ericsson
+        data_types:
+          measurementType:
+            type: string
+          DN:
+            type: string
+          nfFilter:
+            properties:
+              nfNames:
+                type: list
+                entry_schema: string
+              modelInvariantIDs:
+                type: list
+                entry_schema:
+                  type: string
+              modelVersionIDs:
+                type: list
+                entry_schema:
+                  type: string
+          measurementGroup:
+            properties:
+              masurementTypes:
+                type: list
+                entry_schema:
+                  type: measurementType
+              managedObjectDNsBasic:
+                type: list
+                entry_schema:
+                  type: DN
+        schema:
+          subscription:
+            subscriptionName:
+              type: string
+              required: true
+            administrativeState:
+              type: string
+              required: true
+            filebasedGP:
+              type: integer
+              required: true
+            fileLocation:
+              type: string
+              required: true
+            nfFilter:
+              type: nfFilter
+            measurementGroups:
+              type: list
+              entry_schema:
+                type: measurementGroup
+      version: 0.0.0
+      description: Should I be showing a dependency between PM Subscription Handler
+        and the PM Monitoring Policy
+    org.onap.PM_Policy:
+      type: org.onap.APP
+      properties:
+        application_name: PM Subscription Operational Policy
+        provider: Ericsson
+        application_version: 1.0.0
+        artifact_id:
+          get_input: pm_subscription_operational_policy_id
+        artifact_config: NOT_DEFINED
+      requirements:
+      - receive_0:
+          capability: pm-subscription-event-publisher
+          node: org.onap.PM_Subscription_Handler
+          relationship: NOT_DEFINED
+          properties:
+            config_keys:
+            - topic_name:
+                get_input: pm_subscription_topic
+          version: 0.0.0
+      - send_0:
+          capability: cds-rest-receive
+          node: org.onap.CDS
+          version: 0.0.0
+      - receive_1:
+          capability: cds-rest-response
+          node: org.onap.CDS
+          version: 0.0.0
+      - send_1:
+          capability: pm-subscription-event-receiver
+          node: org.onap.PM_Subscription_Handler
+          relationship: NOT_DEFINED
+          properties:
+            config_keys:
+            - topic_name:
+                get_input: pm_subscription_response_topic
+          version: 0.0.0
+      capabilities:
+        pm-subscription-response-event-publisher:
+          properties:
+            type: org.onap.EventProducer
+            carrier_protocol_type: DMAAP_message_router
+            data_format: JSON
+            event_format: pm-subscription-event-response-format
+            event_format_version: 1.0.0
+          occurrences:
+          - 0.0
+          - UNBOUNDED
+          version: 0.0.0
+      version: 0.0.0
+    org.onap.PM_CDS_Blueprint:
+      type: org.onap.APP
+      properties:
+        application_name: PM Subscription CDS Blueprint
+        provider: Ericsson
+        application_version: 1.0.0
+        artifact_id:
+          get_input: pm_subscription_cds_blueprint_id
+      capabilities:
+        cds-rest-receive:
+          properties:
+            type: org.onap.EventConsumer
+            protocol_type: REST
+            data_format: JSON
+            event_format: cds_action_format
+            event_format_version: 1.0.0
+            responding_capability: cds-rest-response
+          occurrences:
+          - 0.0
+          - UNBOUNDED
+          version: 0.0.0
+        cds-rest-response:
+          properties:
+            type: org.onap.EventProducer
+            protocol_type: REST
+            data_format: JSON
+            event_format: cds_action_response_format
+            event_format_version: 1.0.0
+          occurrences:
+          - 0.0
+          version: 0.0.0
+      version: 0.0.0
+    org.onap.controlloop0:
+      type: org.onap.APP
+      properties:
+        application_name: Test Control Loop
+        provider: Ericsson
+        application_version: 1.0.0
+        status: NOT_DEPLOYED
+      version: 0.0.0
+version: 0.0.0
diff --git a/participant/participant-impl/participant-impl-dcae/src/test/resources/rest/status.json b/participant/participant-impl/participant-impl-dcae/src/test/resources/rest/status.json
new file mode 100644
index 0000000..143ef63
--- /dev/null
+++ b/participant/participant-impl/participant-impl-dcae/src/test/resources/rest/status.json
@@ -0,0 +1,3918 @@
+{
+    "name": "pmsh_loop",
+    "globalPropertiesJson": {
+        "dcaeDeployParameters": {
+            "uniqueBlueprintParameters": {
+                "tag_version": "nexus3.onap.org:10001/onap/org.onap.dcaegen2.services.pmsh:1.1.2",
+                "replicas": 1,
+                "operational_policy_name": "pmsh-operational-policy",
+                "control_loop_name": "pmsh-control-loop",
+                "pmsh_publish_topic_name": "unauthenticated.DCAE_CL_OUTPUT",
+                "policy_feedback_topic_name": "unauthenticated.PMSH_CL_INPUT",
+                "aai_notification_topic_name": "AAI-EVENT",
+                "publisher_client_role": "org.onap.dcae.pmPublisher",
+                "subscriber_client_role": "org.onap.dcae.pmSubscriber",
+                "dcae_location": "san-francisco",
+                "cpu_limit": "1000m",
+                "cpu_request": "1000m",
+                "memory_limit": "1024Mi",
+                "memory_request": "1024Mi",
+                "pgaas_cluster_name": "dcae-pg-primary.onap",
+                "enable_tls": true,
+                "protocol": "https",
+                "policy_model_id": "onap.policies.monitoring.dcae-pm-subscription-handler",
+                "policy_id": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh"
+            }
+        }
+    },
+    "modelService": {
+        "serviceDetails": {
+            "serviceType": "",
+            "serviceRole": "",
+            "description": "vLBMS",
+            "type": "Service",
+            "instantiationType": "A-la-carte",
+            "namingPolicy": "",
+            "serviceEcompNaming": "true",
+            "environmentContext": "General_Revenue-Bearing",
+            "name": "vLoadBalancerMS",
+            "invariantUUID": "30ec5b59-4799-48d8-ac5f-1058a6b0e48f",
+            "ecompGeneratedNaming": "true",
+            "UUID": "63cac700-ab9a-4115-a74f-7eac85e3fce0",
+            "category": "Network L4+"
+        },
+        "resourceDetails": {
+            "CP": {},
+            "VL": {},
+            "VF": {
+                "vLoadBalancerMS 0": {
+                    "resourceVendor": "Test",
+                    "name": "vLoadBalancerMS",
+                    "resourceVendorModelNumber": "",
+                    "description": "vLBMS",
+                    "invariantUUID": "1a31b9f2-e50d-43b7-89b3-a040250cf506",
+                    "UUID": "b4c4f3d7-929e-4b6d-a1cd-57e952ddc3e6",
+                    "type": "VF",
+                    "category": "Application L4+",
+                    "subcategory": "Load Balancer",
+                    "version": "1.0",
+                    "customizationUUID": "465246dc-7748-45f4-a013-308d92922552",
+                    "resourceVendorRelease": "1.0",
+                    "controllerProperties": {
+                        "sdnc_model_name": "baseconfiguration",
+                        "sdnc_model_version": "1.0.0",
+                        "workflows": {
+                            "resource-assignment": {
+                                "inputs": {
+                                    "resource-assignment-properties": {
+                                        "type": "object",
+                                        "properties": {
+                                            "request-id": {
+                                                "required": true,
+                                                "type": "string",
+                                                "input-param": true
+                                            },
+                                            "service-instance-id": {
+                                                "required": true,
+                                                "type": "string",
+                                                "input-param": true
+                                            },
+                                            "hostname": {
+                                                "required": true,
+                                                "type": "string",
+                                                "input-param": true
+                                            },
+                                            "request-info": {
+                                                "type": "object",
+                                                "properties": {
+                                                    "prop1": {
+                                                        "required": true,
+                                                        "type": "string",
+                                                        "input-param": true
+                                                    },
+                                                    "prop2": {
+                                                        "required": true,
+                                                        "type": "string",
+                                                        "input-param": true
+                                                    }
+                                                }
+                                            }
+                                        }
+                                    }
+                                }
+                            },
+                            "activate": {
+                                "inputs": {
+                                    "resource-assignment-properties": {
+                                        "type": "object",
+                                        "properties": {
+                                            "request-id": {
+                                                "required": true,
+                                                "type": "string",
+                                                "input-param": true
+                                            },
+                                            "service-instance-id": {
+                                                "required": true,
+                                                "type": "string",
+                                                "input-param": true
+                                            },
+                                            "hostname": {
+                                                "required": true,
+                                                "type": "string",
+                                                "input-param": true
+                                            },
+                                            "request-info": {
+                                                "type": "object",
+                                                "properties": {
+                                                    "prop1": {
+                                                        "required": true,
+                                                        "type": "string",
+                                                        "input-param": true
+                                                    },
+                                                    "prop2": {
+                                                        "required": true,
+                                                        "type": "string",
+                                                        "input-param": true
+                                                    }
+                                                }
+                                            }
+                                        }
+                                    }
+                                }
+                            },
+                            "activate-restconf": {
+                                "inputs": {
+                                    "resource-assignment-properties": {
+                                        "type": "object",
+                                        "properties": {
+                                            "request-id": {
+                                                "required": true,
+                                                "type": "string",
+                                                "input-param": true
+                                            },
+                                            "service-instance-id": {
+                                                "required": true,
+                                                "type": "string",
+                                                "input-param": true
+                                            },
+                                            "hostname": {
+                                                "required": true,
+                                                "type": "string",
+                                                "input-param": true
+                                            },
+                                            "request-info": {
+                                                "type": "object",
+                                                "properties": {
+                                                    "prop1": {
+                                                        "required": true,
+                                                        "type": "string",
+                                                        "input-param": true
+                                                    },
+                                                    "prop2": {
+                                                        "required": true,
+                                                        "type": "string",
+                                                        "input-param": true
+                                                    }
+                                                }
+                                            }
+                                        }
+                                    }
+                                }
+                            },
+                            "activate-cli": {
+                                "inputs": {
+                                    "resource-assignment-properties": {
+                                        "type": "object",
+                                        "properties": {
+                                            "request-id": {
+                                                "required": true,
+                                                "type": "string",
+                                                "input-param": true
+                                            },
+                                            "service-instance-id": {
+                                                "required": true,
+                                                "type": "string",
+                                                "input-param": true
+                                            },
+                                            "hostname": {
+                                                "required": true,
+                                                "type": "string",
+                                                "input-param": true
+                                            },
+                                            "request-info": {
+                                                "type": "object",
+                                                "properties": {
+                                                    "prop1": {
+                                                        "required": true,
+                                                        "type": "string",
+                                                        "input-param": true
+                                                    },
+                                                    "prop2": {
+                                                        "required": true,
+                                                        "type": "string",
+                                                        "input-param": true
+                                                    }
+                                                }
+                                            }
+                                        }
+                                    }
+                                }
+                            },
+                            "assign-activate": {
+                                "inputs": {
+                                    "resource-assignment-properties": {
+                                        "type": "object",
+                                        "properties": {
+                                            "request-id": {
+                                                "required": true,
+                                                "type": "string",
+                                                "input-param": true
+                                            },
+                                            "service-instance-id": {
+                                                "required": true,
+                                                "type": "string",
+                                                "input-param": true
+                                            },
+                                            "hostname": {
+                                                "required": true,
+                                                "type": "string",
+                                                "input-param": true
+                                            },
+                                            "request-info": {
+                                                "type": "object",
+                                                "properties": {
+                                                    "prop1": {
+                                                        "required": true,
+                                                        "type": "string",
+                                                        "input-param": true
+                                                    },
+                                                    "prop2": {
+                                                        "required": true,
+                                                        "type": "string",
+                                                        "input-param": true
+                                                    }
+                                                }
+                                            }
+                                        }
+                                    }
+                                }
+                            },
+                            "imperative-test-wf": {
+                                "inputs": {
+                                    "resource-assignment-properties": {
+                                        "type": "object",
+                                        "properties": {
+                                            "request-id": {
+                                                "required": true,
+                                                "type": "string",
+                                                "input-param": true
+                                            },
+                                            "service-instance-id": {
+                                                "required": true,
+                                                "type": "string",
+                                                "input-param": true
+                                            },
+                                            "hostname": {
+                                                "required": true,
+                                                "type": "string",
+                                                "input-param": true
+                                            },
+                                            "request-info": {
+                                                "type": "object",
+                                                "properties": {
+                                                    "prop1": {
+                                                        "required": true,
+                                                        "type": "string",
+                                                        "input-param": true
+                                                    },
+                                                    "prop2": {
+                                                        "required": true,
+                                                        "type": "string",
+                                                        "input-param": true
+                                                    }
+                                                }
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            },
+            "CR": {},
+            "VFC": {},
+            "PNF": {},
+            "Service": {},
+            "CVFC": {},
+            "Service Proxy": {},
+            "Configuration": {},
+            "AllottedResource": {},
+            "VFModule": {
+                "Vloadbalancerms..vpkg..module-1": {
+                    "vfModuleModelInvariantUUID": "ca052563-eb92-4b5b-ad41-9111768ce043",
+                    "vfModuleModelVersion": "1",
+                    "vfModuleModelName": "Vloadbalancerms..vpkg..module-1",
+                    "vfModuleModelUUID": "1e725ccc-b823-4f67-82b9-4f4367070dbc",
+                    "vfModuleModelCustomizationUUID": "1bffdc31-a37d-4dee-b65c-dde623a76e52",
+                    "min_vf_module_instances": 0,
+                    "vf_module_label": "vpkg",
+                    "max_vf_module_instances": 1,
+                    "vf_module_type": "Expansion",
+                    "isBase": false,
+                    "initial_count": 0,
+                    "volume_group": false
+                },
+                "Vloadbalancerms..vdns..module-3": {
+                    "vfModuleModelInvariantUUID": "4c10ba9b-f88f-415e-9de3-5d33336047fa",
+                    "vfModuleModelVersion": "1",
+                    "vfModuleModelName": "Vloadbalancerms..vdns..module-3",
+                    "vfModuleModelUUID": "4fa73b49-8a6c-493e-816b-eb401567b720",
+                    "vfModuleModelCustomizationUUID": "bafcdab0-801d-4d81-9ead-f464640a38b1",
+                    "min_vf_module_instances": 0,
+                    "vf_module_label": "vdns",
+                    "max_vf_module_instances": 50,
+                    "vf_module_type": "Expansion",
+                    "isBase": false,
+                    "initial_count": 0,
+                    "volume_group": false
+                },
+                "Vloadbalancerms..base_template..module-0": {
+                    "vfModuleModelInvariantUUID": "921f7c96-ebdd-42e6-81b9-1cfc0c9796f3",
+                    "vfModuleModelVersion": "1",
+                    "vfModuleModelName": "Vloadbalancerms..base_template..module-0",
+                    "vfModuleModelUUID": "63734409-f745-4e4d-a38b-131638a0edce",
+                    "vfModuleModelCustomizationUUID": "86baddea-c730-4fb8-9410-cd2e17fd7f27",
+                    "min_vf_module_instances": 1,
+                    "vf_module_label": "base_template",
+                    "max_vf_module_instances": 1,
+                    "vf_module_type": "Base",
+                    "isBase": true,
+                    "initial_count": 1,
+                    "volume_group": false
+                },
+                "Vloadbalancerms..vlb..module-2": {
+                    "vfModuleModelInvariantUUID": "a772a1f4-0064-412c-833d-4749b15828dd",
+                    "vfModuleModelVersion": "1",
+                    "vfModuleModelName": "Vloadbalancerms..vlb..module-2",
+                    "vfModuleModelUUID": "0f5c3f6a-650a-4303-abb6-fff3e573a07a",
+                    "vfModuleModelCustomizationUUID": "96a78aad-4ffb-4ef0-9c4f-deb03bf1d806",
+                    "min_vf_module_instances": 0,
+                    "vf_module_label": "vlb",
+                    "max_vf_module_instances": 1,
+                    "vf_module_type": "Expansion",
+                    "isBase": false,
+                    "initial_count": 0,
+                    "volume_group": false
+                }
+            }
+        }
+    },
+    "lastComputedState": "DESIGN",
+    "components": {
+        "POLICY": {
+            "componentState": {
+                "stateName": "NOT_SENT",
+                "description": "The policies defined have NOT yet been created on the policy engine"
+            }
+        },
+        "DCAE": {
+            "componentState": {
+                "stateName": "${status}",
+                "description": "The DCAE blueprint has been found in the DCAE inventory but not yet instancianted for this loop"
+            }
+        }
+    },
+    "operationalPolicies": [],
+    "microServicePolicies": [
+        {
+            "name": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh",
+            "shared": false,
+            "jsonRepresentation": {
+                "title": "onap.policies.monitoring.dcae-pm-subscription-handler",
+                "type": "object",
+                "required": [],
+                "properties": {
+                    "pmsh_policy": {
+                        "title": "onap.datatypes.monitoring.subscription",
+                        "type": "object",
+                        "required": [
+                            "measurementGroups",
+                            "fileBasedGP",
+                            "fileLocation",
+                            "subscriptionName",
+                            "administrativeState",
+                            "nfFilter"
+                        ],
+                        "properties": {
+                            "measurementGroups": {
+                                "type": "array",
+                                "description": "Measurement Groups",
+                                "items": {
+                                    "title": "onap.datatypes.monitoring.measurementGroups",
+                                    "type": "object",
+                                    "required": [
+                                        "measurementGroup"
+                                    ],
+                                    "properties": {
+                                        "measurementGroup": {
+                                            "type": "object",
+                                            "description": "Measurement Group",
+                                            "properties": {
+                                                "onap.datatypes.monitoring.measurementGroup": {
+                                                    "title": "onap.datatypes.monitoring.measurementGroup",
+                                                    "type": "object",
+                                                    "required": [
+                                                        "measurementTypes",
+                                                        "managedObjectDNsBasic"
+                                                    ],
+                                                    "properties": {
+                                                        "measurementTypes": {
+                                                            "type": "array",
+                                                            "description": "List of measurement types",
+                                                            "items": {
+                                                                "title": "onap.datatypes.monitoring.measurementTypes",
+                                                                "type": "object",
+                                                                "required": [
+                                                                    "measurementType"
+                                                                ],
+                                                                "properties": {
+                                                                    "measurementType": {
+                                                                        "type": "object",
+                                                                        "description": "Measurement type object",
+                                                                        "properties": {
+                                                                            "onap.datatypes.monitoring.measurementType": {
+                                                                                "title": "onap.datatypes.monitoring.measurementType",
+                                                                                "type": "object",
+                                                                                "required": [
+                                                                                    "measurementType"
+                                                                                ],
+                                                                                "properties": {
+                                                                                    "measurementType": {
+                                                                                        "type": "string",
+                                                                                        "description": "Measurement type"
+                                                                                    }
+                                                                                }
+                                                                            }
+                                                                        }
+                                                                    }
+                                                                }
+                                                            },
+                                                            "format": "tabs-top"
+                                                        },
+                                                        "managedObjectDNsBasic": {
+                                                            "type": "array",
+                                                            "description": "List of managed object distinguished names",
+                                                            "items": {
+                                                                "title": "onap.datatypes.monitoring.managedObjectDNsBasics",
+                                                                "type": "object",
+                                                                "required": [
+                                                                    "managedObjectDNsBasic"
+                                                                ],
+                                                                "properties": {
+                                                                    "managedObjectDNsBasic": {
+                                                                        "type": "object",
+                                                                        "description": "Managed object distinguished name object",
+                                                                        "properties": {
+                                                                            "onap.datatypes.monitoring.managedObjectDNsBasic": {
+                                                                                "title": "onap.datatypes.monitoring.managedObjectDNsBasic",
+                                                                                "type": "object",
+                                                                                "required": [
+                                                                                    "DN"
+                                                                                ],
+                                                                                "properties": {
+                                                                                    "DN": {
+                                                                                        "type": "string",
+                                                                                        "description": "Managed object distinguished name"
+                                                                                    }
+                                                                                }
+                                                                            }
+                                                                        }
+                                                                    }
+                                                                }
+                                                            },
+                                                            "format": "tabs-top"
+                                                        }
+                                                    }
+                                                }
+                                            }
+                                        }
+                                    }
+                                },
+                                "format": "tabs-top"
+                            },
+                            "fileBasedGP": {
+                                "type": "integer",
+                                "description": "File based granularity period"
+                            },
+                            "fileLocation": {
+                                "type": "string",
+                                "description": "ROP file location"
+                            },
+                            "subscriptionName": {
+                                "type": "string",
+                                "description": "Name of the subscription"
+                            },
+                            "administrativeState": {
+                                "type": "string",
+                                "description": "State of the subscription",
+                                "enum": [
+                                    "LOCKED",
+                                    "UNLOCKED"
+                                ]
+                            },
+                            "nfFilter": {
+                                "type": "object",
+                                "description": "Network function filter",
+                                "properties": {
+                                    "onap.datatypes.monitoring.nfFilter": {
+                                        "title": "onap.datatypes.monitoring.nfFilter",
+                                        "type": "object",
+                                        "required": [
+                                            "modelVersionIDs",
+                                            "modelInvariantIDs",
+                                            "modelNames",
+                                            "nfNames"
+                                        ],
+                                        "properties": {
+                                            "modelVersionIDs": {
+                                                "type": "array",
+                                                "description": "List of model version IDs",
+                                                "items": {
+                                                    "type": "string"
+                                                },
+                                                "format": "tabs-top"
+                                            },
+                                            "modelInvariantIDs": {
+                                                "type": "array",
+                                                "description": "List of model invariant IDs",
+                                                "items": {
+                                                    "type": "string"
+                                                },
+                                                "format": "tabs-top"
+                                            },
+                                            "modelNames": {
+                                                "type": "array",
+                                                "description": "List of model names",
+                                                "items": {
+                                                    "type": "string"
+                                                },
+                                                "format": "tabs-top"
+                                            },
+                                            "nfNames": {
+                                                "type": "array",
+                                                "description": "List of network functions",
+                                                "items": {
+                                                    "type": "string"
+                                                },
+                                                "format": "tabs-top"
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            },
+            "loopElementModel": {
+                "name": "onap.policies.monitoring.dcae-pm-subscription-handler",
+                "loopElementType": "MICRO_SERVICE_TYPE",
+                "policyModels": [
+                    {
+                        "policyModelType": "onap.policies.monitoring.dcae-pm-subscription-handler",
+                        "version": "1.0.0",
+                        "policyAcronym": "dcae-pm-subscription-handler",
+                        "policyPdpGroup": {
+                            "supportedPdpGroups": [
+                                {
+                                    "ControlLoopGroup": [
+                                        "apex",
+                                        "xacml"
+                                    ]
+                                },
+                                {
+                                    "defaultGroup": [
+                                        "xacml"
+                                    ]
+                                }
+                            ]
+                        },
+                        "createdDate": "2021-03-30T09:55:52.261232Z",
+                        "updatedDate": "2021-03-30T09:56:17.502284Z",
+                        "updatedBy": "Not found",
+                        "createdBy": "Not found"
+                    }
+                ],
+                "createdDate": "2021-03-30T08:48:21Z",
+                "updatedDate": "2021-03-30T08:48:21Z",
+                "updatedBy": "Not found",
+                "createdBy": "Not found"
+            },
+            "policyModel": {
+                "policyModelType": "onap.policies.monitoring.dcae-pm-subscription-handler",
+                "version": "1.0.0",
+                "policyAcronym": "dcae-pm-subscription-handler",
+                "policyPdpGroup": {
+                    "supportedPdpGroups": [
+                        {
+                            "ControlLoopGroup": [
+                                "apex",
+                                "xacml"
+                            ]
+                        },
+                        {
+                            "defaultGroup": [
+                                "xacml"
+                            ]
+                        }
+                    ]
+                },
+                "createdDate": "2021-03-30T09:55:52.261232Z",
+                "updatedDate": "2021-03-30T09:56:17.502284Z",
+                "updatedBy": "Not found",
+                "createdBy": "Not found"
+            },
+            "createdDate": "2021-03-30T13:07:07.960379Z",
+            "updatedDate": "2021-03-30T13:07:07.960379Z",
+            "updatedBy": "admin",
+            "createdBy": "admin"
+        }
+    ],
+    "loopLogs": [
+        {
+            "id": 478,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request successfully executed",
+            "logInstant": "2021-05-07T09:32:44Z"
+        },
+        {
+            "id": 477,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "New loop state is: DESIGN",
+            "logInstant": "2021-05-07T09:32:44Z"
+        },
+        {
+            "id": 476,
+            "logType": "INFO",
+            "logComponent": "DCAE",
+            "message": "DCAE state set to: BLUEPRINT_DEPLOYED - message: ",
+            "logInstant": "2021-05-07T09:32:43Z"
+        },
+        {
+            "id": 475,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "Policy state set to: NOT_SENT",
+            "logInstant": "2021-05-07T09:32:43Z"
+        },
+        {
+            "id": 474,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET Policy deployment\n                        status -  : ",
+            "logInstant": "2021-05-07T09:32:43Z"
+        },
+        {
+            "id": 473,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-05-07T09:32:43Z"
+        },
+        {
+            "id": 472,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET\n                        Policy status -  : ",
+            "logInstant": "2021-05-07T09:32:39Z"
+        },
+        {
+            "id": 471,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-05-07T09:32:39Z"
+        },
+        {
+            "id": 470,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request",
+            "logInstant": "2021-05-07T09:32:35Z"
+        },
+        {
+            "id": 451,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request successfully executed",
+            "logInstant": "2021-04-07T13:34:30Z"
+        },
+        {
+            "id": 450,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "New loop state is: DESIGN",
+            "logInstant": "2021-04-07T13:34:30Z"
+        },
+        {
+            "id": 449,
+            "logType": "INFO",
+            "logComponent": "DCAE",
+            "message": "DCAE state set to: BLUEPRINT_DEPLOYED - message: ",
+            "logInstant": "2021-04-07T13:34:30Z"
+        },
+        {
+            "id": 448,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "Policy state set to: NOT_SENT",
+            "logInstant": "2021-04-07T13:34:30Z"
+        },
+        {
+            "id": 447,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET Policy deployment\n                        status -  : ",
+            "logInstant": "2021-04-07T13:34:30Z"
+        },
+        {
+            "id": 446,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-04-07T13:34:30Z"
+        },
+        {
+            "id": 445,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET\n                        Policy status -  : ",
+            "logInstant": "2021-04-07T13:34:26Z"
+        },
+        {
+            "id": 444,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-04-07T13:34:26Z"
+        },
+        {
+            "id": 443,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request",
+            "logInstant": "2021-04-07T13:34:22Z"
+        },
+        {
+            "id": 442,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "PDP Group remove ALL status -  : ",
+            "logInstant": "2021-04-07T08:32:06Z"
+        },
+        {
+            "id": 441,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "STOP request",
+            "logInstant": "2021-04-07T08:32:02Z"
+        },
+        {
+            "id": 440,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request successfully executed",
+            "logInstant": "2021-04-07T08:23:46Z"
+        },
+        {
+            "id": 439,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "New loop state is: DESIGN",
+            "logInstant": "2021-04-07T08:23:46Z"
+        },
+        {
+            "id": 438,
+            "logType": "INFO",
+            "logComponent": "DCAE",
+            "message": "DCAE state set to: BLUEPRINT_DEPLOYED - message: ",
+            "logInstant": "2021-04-07T08:23:46Z"
+        },
+        {
+            "id": 437,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "Policy state set to: NOT_SENT",
+            "logInstant": "2021-04-07T08:23:46Z"
+        },
+        {
+            "id": 436,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET Policy deployment\n                        status -  : ",
+            "logInstant": "2021-04-07T08:23:46Z"
+        },
+        {
+            "id": 435,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-04-07T08:23:46Z"
+        },
+        {
+            "id": 434,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET\n                        Policy status -  : ",
+            "logInstant": "2021-04-07T08:23:42Z"
+        },
+        {
+            "id": 433,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-04-07T08:23:41Z"
+        },
+        {
+            "id": 432,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request",
+            "logInstant": "2021-04-07T08:23:37Z"
+        },
+        {
+            "id": 431,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request successfully executed",
+            "logInstant": "2021-04-06T15:06:27Z"
+        },
+        {
+            "id": 430,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "New loop state is: DESIGN",
+            "logInstant": "2021-04-06T15:06:27Z"
+        },
+        {
+            "id": 429,
+            "logType": "INFO",
+            "logComponent": "DCAE",
+            "message": "DCAE state set to: BLUEPRINT_DEPLOYED - message: ",
+            "logInstant": "2021-04-06T15:06:27Z"
+        },
+        {
+            "id": 428,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "Policy state set to: NOT_SENT",
+            "logInstant": "2021-04-06T15:06:27Z"
+        },
+        {
+            "id": 427,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET Policy deployment\n                        status -  : ",
+            "logInstant": "2021-04-06T15:06:27Z"
+        },
+        {
+            "id": 426,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-04-06T15:06:27Z"
+        },
+        {
+            "id": 425,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET\n                        Policy status -  : ",
+            "logInstant": "2021-04-06T15:06:22Z"
+        },
+        {
+            "id": 424,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-04-06T15:06:22Z"
+        },
+        {
+            "id": 423,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request",
+            "logInstant": "2021-04-06T15:06:18Z"
+        },
+        {
+            "id": 422,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "PDP Group remove ALL status -  : ",
+            "logInstant": "2021-04-06T15:06:04Z"
+        },
+        {
+            "id": 421,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "STOP request",
+            "logInstant": "2021-04-06T15:06:00Z"
+        },
+        {
+            "id": 420,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request successfully executed",
+            "logInstant": "2021-04-06T15:05:28Z"
+        },
+        {
+            "id": 419,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "New loop state is: DESIGN",
+            "logInstant": "2021-04-06T15:05:28Z"
+        },
+        {
+            "id": 418,
+            "logType": "INFO",
+            "logComponent": "DCAE",
+            "message": "DCAE state set to: BLUEPRINT_DEPLOYED - message: ",
+            "logInstant": "2021-04-06T15:05:28Z"
+        },
+        {
+            "id": 417,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "Policy state set to: NOT_SENT",
+            "logInstant": "2021-04-06T15:05:28Z"
+        },
+        {
+            "id": 416,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET Policy deployment\n                        status -  : ",
+            "logInstant": "2021-04-06T15:05:28Z"
+        },
+        {
+            "id": 415,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-04-06T15:05:28Z"
+        },
+        {
+            "id": 414,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET\n                        Policy status -  : ",
+            "logInstant": "2021-04-06T15:05:24Z"
+        },
+        {
+            "id": 413,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-04-06T15:05:23Z"
+        },
+        {
+            "id": 412,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request",
+            "logInstant": "2021-04-06T15:05:19Z"
+        },
+        {
+            "id": 411,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "UNDEPLOY request successfully executed",
+            "logInstant": "2021-04-06T15:05:07Z"
+        },
+        {
+            "id": 410,
+            "logType": "WARNING",
+            "logComponent": "CLAMP",
+            "message": "Cannot Undeploy for the loop: pmsh_loop, the Deployment ID does not exist !",
+            "logInstant": "2021-04-06T15:05:07Z"
+        },
+        {
+            "id": 409,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "DCAE UNDEPLOY request",
+            "logInstant": "2021-04-06T15:05:07Z"
+        },
+        {
+            "id": 408,
+            "logType": "INFO",
+            "logComponent": "DCAE",
+            "message": "DEPLOY loop status\n                        (Dep-id:CLAMP_7ae6f14d-80c8-4403-a174-ecb215d04c81,\n                        StatusUrl:) -  : ",
+            "logInstant": "2021-04-06T15:02:46Z"
+        },
+        {
+            "id": 407,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "DCAE DEPLOY request",
+            "logInstant": "2021-04-06T15:02:42Z"
+        },
+        {
+            "id": 406,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request successfully executed",
+            "logInstant": "2021-04-06T15:02:26Z"
+        },
+        {
+            "id": 405,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "New loop state is: DESIGN",
+            "logInstant": "2021-04-06T15:02:26Z"
+        },
+        {
+            "id": 404,
+            "logType": "INFO",
+            "logComponent": "DCAE",
+            "message": "DCAE state set to: BLUEPRINT_DEPLOYED - message: ",
+            "logInstant": "2021-04-06T15:02:26Z"
+        },
+        {
+            "id": 403,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "Policy state set to: NOT_SENT",
+            "logInstant": "2021-04-06T15:02:26Z"
+        },
+        {
+            "id": 402,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET Policy deployment\n                        status -  : ",
+            "logInstant": "2021-04-06T15:02:25Z"
+        },
+        {
+            "id": 401,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-04-06T15:02:25Z"
+        },
+        {
+            "id": 400,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET\n                        Policy status -  : ",
+            "logInstant": "2021-04-06T15:02:21Z"
+        },
+        {
+            "id": 399,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-04-06T15:02:21Z"
+        },
+        {
+            "id": 398,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request",
+            "logInstant": "2021-04-06T15:02:17Z"
+        },
+        {
+            "id": 397,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request successfully executed",
+            "logInstant": "2021-04-06T14:32:53Z"
+        },
+        {
+            "id": 396,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "New loop state is: DESIGN",
+            "logInstant": "2021-04-06T14:32:53Z"
+        },
+        {
+            "id": 395,
+            "logType": "INFO",
+            "logComponent": "DCAE",
+            "message": "DCAE state set to: BLUEPRINT_DEPLOYED - message: ",
+            "logInstant": "2021-04-06T14:32:53Z"
+        },
+        {
+            "id": 394,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "Policy state set to: NOT_SENT",
+            "logInstant": "2021-04-06T14:32:53Z"
+        },
+        {
+            "id": 393,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET Policy deployment\n                        status -  : ",
+            "logInstant": "2021-04-06T14:32:53Z"
+        },
+        {
+            "id": 392,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-04-06T14:32:53Z"
+        },
+        {
+            "id": 391,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET\n                        Policy status -  : ",
+            "logInstant": "2021-04-06T14:32:49Z"
+        },
+        {
+            "id": 390,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-04-06T14:32:49Z"
+        },
+        {
+            "id": 389,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request",
+            "logInstant": "2021-04-06T14:32:44Z"
+        },
+        {
+            "id": 388,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request successfully executed",
+            "logInstant": "2021-04-06T14:31:37Z"
+        },
+        {
+            "id": 387,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "New loop state is: DESIGN",
+            "logInstant": "2021-04-06T14:31:37Z"
+        },
+        {
+            "id": 386,
+            "logType": "INFO",
+            "logComponent": "DCAE",
+            "message": "DCAE state set to: BLUEPRINT_DEPLOYED - message: ",
+            "logInstant": "2021-04-06T14:31:37Z"
+        },
+        {
+            "id": 385,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "Policy state set to: NOT_SENT",
+            "logInstant": "2021-04-06T14:31:37Z"
+        },
+        {
+            "id": 384,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET Policy deployment\n                        status -  : ",
+            "logInstant": "2021-04-06T14:31:37Z"
+        },
+        {
+            "id": 383,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-04-06T14:31:37Z"
+        },
+        {
+            "id": 382,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET\n                        Policy status -  : ",
+            "logInstant": "2021-04-06T14:31:33Z"
+        },
+        {
+            "id": 381,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-04-06T14:31:33Z"
+        },
+        {
+            "id": 380,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request",
+            "logInstant": "2021-04-06T14:31:28Z"
+        },
+        {
+            "id": 379,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request successfully executed",
+            "logInstant": "2021-04-06T14:30:35Z"
+        },
+        {
+            "id": 378,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "New loop state is: DESIGN",
+            "logInstant": "2021-04-06T14:30:35Z"
+        },
+        {
+            "id": 377,
+            "logType": "INFO",
+            "logComponent": "DCAE",
+            "message": "DCAE state set to: BLUEPRINT_DEPLOYED - message: ",
+            "logInstant": "2021-04-06T14:30:34Z"
+        },
+        {
+            "id": 376,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "Policy state set to: NOT_SENT",
+            "logInstant": "2021-04-06T14:30:34Z"
+        },
+        {
+            "id": 375,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET Policy deployment\n                        status -  : ",
+            "logInstant": "2021-04-06T14:30:34Z"
+        },
+        {
+            "id": 374,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-04-06T14:30:34Z"
+        },
+        {
+            "id": 373,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET\n                        Policy status -  : ",
+            "logInstant": "2021-04-06T14:30:30Z"
+        },
+        {
+            "id": 372,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-04-06T14:30:30Z"
+        },
+        {
+            "id": 371,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request",
+            "logInstant": "2021-04-06T14:30:26Z"
+        },
+        {
+            "id": 370,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "PDP Group remove ALL status -  : ",
+            "logInstant": "2021-04-06T14:04:21Z"
+        },
+        {
+            "id": 369,
+            "logType": "WARNING",
+            "logComponent": "CLAMP",
+            "message": "Cannot Undeploy for the loop: pmsh_loop, the Deployment ID does not exist !",
+            "logInstant": "2021-04-06T14:04:17Z"
+        },
+        {
+            "id": 368,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "DELETE request",
+            "logInstant": "2021-04-06T14:04:17Z"
+        },
+        {
+            "id": 367,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request successfully executed",
+            "logInstant": "2021-04-06T14:03:52Z"
+        },
+        {
+            "id": 366,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "New loop state is: DESIGN",
+            "logInstant": "2021-04-06T14:03:52Z"
+        },
+        {
+            "id": 365,
+            "logType": "INFO",
+            "logComponent": "DCAE",
+            "message": "DCAE state set to: BLUEPRINT_DEPLOYED - message: ",
+            "logInstant": "2021-04-06T14:03:51Z"
+        },
+        {
+            "id": 364,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "Policy state set to: NOT_SENT",
+            "logInstant": "2021-04-06T14:03:51Z"
+        },
+        {
+            "id": 363,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET Policy deployment\n                        status -  : ",
+            "logInstant": "2021-04-06T14:03:51Z"
+        },
+        {
+            "id": 362,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-04-06T14:03:51Z"
+        },
+        {
+            "id": 361,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET\n                        Policy status -  : ",
+            "logInstant": "2021-04-06T14:03:47Z"
+        },
+        {
+            "id": 360,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-04-06T14:03:47Z"
+        },
+        {
+            "id": 359,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request",
+            "logInstant": "2021-04-06T14:03:43Z"
+        },
+        {
+            "id": 358,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "UNDEPLOY request successfully executed",
+            "logInstant": "2021-04-06T14:03:35Z"
+        },
+        {
+            "id": 357,
+            "logType": "WARNING",
+            "logComponent": "CLAMP",
+            "message": "Cannot Undeploy for the loop: pmsh_loop, the Deployment ID does not exist !",
+            "logInstant": "2021-04-06T14:03:35Z"
+        },
+        {
+            "id": 356,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "DCAE UNDEPLOY request",
+            "logInstant": "2021-04-06T14:03:35Z"
+        },
+        {
+            "id": 355,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request successfully executed",
+            "logInstant": "2021-04-06T13:57:38Z"
+        },
+        {
+            "id": 354,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "New loop state is: DESIGN",
+            "logInstant": "2021-04-06T13:57:38Z"
+        },
+        {
+            "id": 353,
+            "logType": "INFO",
+            "logComponent": "DCAE",
+            "message": "DCAE state set to: BLUEPRINT_DEPLOYED - message: ",
+            "logInstant": "2021-04-06T13:57:38Z"
+        },
+        {
+            "id": 352,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "Policy state set to: NOT_SENT",
+            "logInstant": "2021-04-06T13:57:38Z"
+        },
+        {
+            "id": 351,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET Policy deployment\n                        status -  : ",
+            "logInstant": "2021-04-06T13:57:37Z"
+        },
+        {
+            "id": 350,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-04-06T13:57:37Z"
+        },
+        {
+            "id": 349,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET\n                        Policy status -  : ",
+            "logInstant": "2021-04-06T13:57:33Z"
+        },
+        {
+            "id": 348,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-04-06T13:57:33Z"
+        },
+        {
+            "id": 347,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request",
+            "logInstant": "2021-04-06T13:57:29Z"
+        },
+        {
+            "id": 346,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "PDP Group remove ALL status -  : ",
+            "logInstant": "2021-04-06T13:57:21Z"
+        },
+        {
+            "id": 345,
+            "logType": "WARNING",
+            "logComponent": "CLAMP",
+            "message": "Cannot Undeploy for the loop: pmsh_loop, the Deployment ID does not exist !",
+            "logInstant": "2021-04-06T13:57:16Z"
+        },
+        {
+            "id": 344,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "DELETE request",
+            "logInstant": "2021-04-06T13:57:16Z"
+        },
+        {
+            "id": 343,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request successfully executed",
+            "logInstant": "2021-04-06T13:16:29Z"
+        },
+        {
+            "id": 342,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "New loop state is: DESIGN",
+            "logInstant": "2021-04-06T13:16:29Z"
+        },
+        {
+            "id": 341,
+            "logType": "INFO",
+            "logComponent": "DCAE",
+            "message": "DCAE state set to: BLUEPRINT_DEPLOYED - message: ",
+            "logInstant": "2021-04-06T13:16:29Z"
+        },
+        {
+            "id": 340,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "Policy state set to: NOT_SENT",
+            "logInstant": "2021-04-06T13:16:29Z"
+        },
+        {
+            "id": 339,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET Policy deployment\n                        status -  : ",
+            "logInstant": "2021-04-06T13:16:29Z"
+        },
+        {
+            "id": 338,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-04-06T13:16:29Z"
+        },
+        {
+            "id": 337,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET\n                        Policy status -  : ",
+            "logInstant": "2021-04-06T13:16:24Z"
+        },
+        {
+            "id": 336,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-04-06T13:16:24Z"
+        },
+        {
+            "id": 335,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request",
+            "logInstant": "2021-04-06T13:16:20Z"
+        },
+        {
+            "id": 334,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "Micro Service policies UPDATED",
+            "logInstant": "2021-04-01T16:12:47Z"
+        },
+        {
+            "id": 333,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request successfully executed",
+            "logInstant": "2021-04-01T16:09:36Z"
+        },
+        {
+            "id": 332,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "New loop state is: DESIGN",
+            "logInstant": "2021-04-01T16:09:36Z"
+        },
+        {
+            "id": 331,
+            "logType": "INFO",
+            "logComponent": "DCAE",
+            "message": "DCAE state set to: BLUEPRINT_DEPLOYED - message: ",
+            "logInstant": "2021-04-01T16:09:36Z"
+        },
+        {
+            "id": 330,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "Policy state set to: NOT_SENT",
+            "logInstant": "2021-04-01T16:09:36Z"
+        },
+        {
+            "id": 329,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET Policy deployment\n                        status -  : ",
+            "logInstant": "2021-04-01T16:09:36Z"
+        },
+        {
+            "id": 328,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-04-01T16:09:36Z"
+        },
+        {
+            "id": 327,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET\n                        Policy status -  : ",
+            "logInstant": "2021-04-01T16:09:32Z"
+        },
+        {
+            "id": 326,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-04-01T16:09:32Z"
+        },
+        {
+            "id": 325,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request",
+            "logInstant": "2021-04-01T16:09:27Z"
+        },
+        {
+            "id": 324,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "Micro Service policies UPDATED",
+            "logInstant": "2021-04-01T15:16:20Z"
+        },
+        {
+            "id": 323,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request successfully executed",
+            "logInstant": "2021-04-01T15:15:57Z"
+        },
+        {
+            "id": 322,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "New loop state is: DESIGN",
+            "logInstant": "2021-04-01T15:15:57Z"
+        },
+        {
+            "id": 321,
+            "logType": "INFO",
+            "logComponent": "DCAE",
+            "message": "DCAE state set to: BLUEPRINT_DEPLOYED - message: ",
+            "logInstant": "2021-04-01T15:15:57Z"
+        },
+        {
+            "id": 320,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "Policy state set to: NOT_SENT",
+            "logInstant": "2021-04-01T15:15:57Z"
+        },
+        {
+            "id": 319,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET Policy deployment\n                        status -  : ",
+            "logInstant": "2021-04-01T15:15:57Z"
+        },
+        {
+            "id": 318,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-04-01T15:15:57Z"
+        },
+        {
+            "id": 317,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET\n                        Policy status -  : ",
+            "logInstant": "2021-04-01T15:15:52Z"
+        },
+        {
+            "id": 316,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-04-01T15:15:52Z"
+        },
+        {
+            "id": 315,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request",
+            "logInstant": "2021-04-01T15:15:48Z"
+        },
+        {
+            "id": 314,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request successfully executed",
+            "logInstant": "2021-04-01T15:14:19Z"
+        },
+        {
+            "id": 313,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "New loop state is: DESIGN",
+            "logInstant": "2021-04-01T15:14:19Z"
+        },
+        {
+            "id": 312,
+            "logType": "INFO",
+            "logComponent": "DCAE",
+            "message": "DCAE state set to: BLUEPRINT_DEPLOYED - message: ",
+            "logInstant": "2021-04-01T15:14:19Z"
+        },
+        {
+            "id": 311,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "Policy state set to: NOT_SENT",
+            "logInstant": "2021-04-01T15:14:19Z"
+        },
+        {
+            "id": 310,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET Policy deployment\n                        status -  : ",
+            "logInstant": "2021-04-01T15:14:19Z"
+        },
+        {
+            "id": 309,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-04-01T15:14:19Z"
+        },
+        {
+            "id": 308,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET\n                        Policy status -  : ",
+            "logInstant": "2021-04-01T15:14:15Z"
+        },
+        {
+            "id": 307,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-04-01T15:14:15Z"
+        },
+        {
+            "id": 306,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request",
+            "logInstant": "2021-04-01T15:14:10Z"
+        },
+        {
+            "id": 305,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request successfully executed",
+            "logInstant": "2021-04-01T15:10:59Z"
+        },
+        {
+            "id": 304,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "New loop state is: DESIGN",
+            "logInstant": "2021-04-01T15:10:59Z"
+        },
+        {
+            "id": 303,
+            "logType": "INFO",
+            "logComponent": "DCAE",
+            "message": "DCAE state set to: BLUEPRINT_DEPLOYED - message: ",
+            "logInstant": "2021-04-01T15:10:59Z"
+        },
+        {
+            "id": 302,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "Policy state set to: NOT_SENT",
+            "logInstant": "2021-04-01T15:10:59Z"
+        },
+        {
+            "id": 301,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET Policy deployment\n                        status -  : ",
+            "logInstant": "2021-04-01T15:10:59Z"
+        },
+        {
+            "id": 300,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-04-01T15:10:59Z"
+        },
+        {
+            "id": 299,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET\n                        Policy status -  : ",
+            "logInstant": "2021-04-01T15:10:55Z"
+        },
+        {
+            "id": 298,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-04-01T15:10:54Z"
+        },
+        {
+            "id": 297,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request",
+            "logInstant": "2021-04-01T15:10:50Z"
+        },
+        {
+            "id": 287,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request successfully executed",
+            "logInstant": "2021-04-01T14:31:38Z"
+        },
+        {
+            "id": 286,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "New loop state is: DESIGN",
+            "logInstant": "2021-04-01T14:31:38Z"
+        },
+        {
+            "id": 285,
+            "logType": "INFO",
+            "logComponent": "DCAE",
+            "message": "DCAE state set to: BLUEPRINT_DEPLOYED - message: ",
+            "logInstant": "2021-04-01T14:31:37Z"
+        },
+        {
+            "id": 284,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "Policy state set to: NOT_SENT",
+            "logInstant": "2021-04-01T14:31:37Z"
+        },
+        {
+            "id": 283,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET Policy deployment\n                        status -  : ",
+            "logInstant": "2021-04-01T14:31:37Z"
+        },
+        {
+            "id": 282,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-04-01T14:31:37Z"
+        },
+        {
+            "id": 281,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET\n                        Policy status -  : ",
+            "logInstant": "2021-04-01T14:31:33Z"
+        },
+        {
+            "id": 280,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-04-01T14:31:33Z"
+        },
+        {
+            "id": 279,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "Micro Service policies UPDATED",
+            "logInstant": "2021-04-01T14:31:32Z"
+        },
+        {
+            "id": 278,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request successfully executed",
+            "logInstant": "2021-04-01T14:31:31Z"
+        },
+        {
+            "id": 277,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "New loop state is: DESIGN",
+            "logInstant": "2021-04-01T14:31:31Z"
+        },
+        {
+            "id": 276,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request successfully executed",
+            "logInstant": "2021-04-01T14:31:30Z"
+        },
+        {
+            "id": 275,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "New loop state is: DESIGN",
+            "logInstant": "2021-04-01T14:31:30Z"
+        },
+        {
+            "id": 274,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request successfully executed",
+            "logInstant": "2021-04-01T14:31:29Z"
+        },
+        {
+            "id": 273,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "New loop state is: DESIGN",
+            "logInstant": "2021-04-01T14:31:29Z"
+        },
+        {
+            "id": 272,
+            "logType": "INFO",
+            "logComponent": "DCAE",
+            "message": "DCAE state set to: BLUEPRINT_DEPLOYED - message: ",
+            "logInstant": "2021-04-01T14:31:29Z"
+        },
+        {
+            "id": 271,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "Policy state set to: NOT_SENT",
+            "logInstant": "2021-04-01T14:31:29Z"
+        },
+        {
+            "id": 270,
+            "logType": "INFO",
+            "logComponent": "DCAE",
+            "message": "DCAE state set to: BLUEPRINT_DEPLOYED - message: ",
+            "logInstant": "2021-04-01T14:31:29Z"
+        },
+        {
+            "id": 269,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET Policy deployment\n                        status -  : ",
+            "logInstant": "2021-04-01T14:31:29Z"
+        },
+        {
+            "id": 268,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connection is still allocated",
+            "logInstant": "2021-04-01T14:31:29Z"
+        },
+        {
+            "id": 267,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "Policy state set to: NOT_SENT",
+            "logInstant": "2021-04-01T14:31:29Z"
+        },
+        {
+            "id": 266,
+            "logType": "INFO",
+            "logComponent": "DCAE",
+            "message": "DCAE state set to: BLUEPRINT_DEPLOYED - message: ",
+            "logInstant": "2021-04-01T14:31:29Z"
+        },
+        {
+            "id": 265,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET Policy deployment\n                        status -  : ",
+            "logInstant": "2021-04-01T14:31:29Z"
+        },
+        {
+            "id": 264,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET\n                        Policy status -  : ",
+            "logInstant": "2021-04-01T14:31:29Z"
+        },
+        {
+            "id": 263,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "Policy state set to: NOT_SENT",
+            "logInstant": "2021-04-01T14:31:29Z"
+        },
+        {
+            "id": 262,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connection is still allocated",
+            "logInstant": "2021-04-01T14:31:29Z"
+        },
+        {
+            "id": 261,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connection is still allocated",
+            "logInstant": "2021-04-01T14:31:29Z"
+        },
+        {
+            "id": 260,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET Policy deployment\n                        status -  : ",
+            "logInstant": "2021-04-01T14:31:29Z"
+        },
+        {
+            "id": 259,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connection is still allocated",
+            "logInstant": "2021-04-01T14:31:29Z"
+        },
+        {
+            "id": 258,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET\n                        Policy status -  : ",
+            "logInstant": "2021-04-01T14:31:29Z"
+        },
+        {
+            "id": 257,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connection is still allocated",
+            "logInstant": "2021-04-01T14:31:28Z"
+        },
+        {
+            "id": 256,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request",
+            "logInstant": "2021-04-01T14:31:28Z"
+        },
+        {
+            "id": 255,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET\n                        Policy status -  : ",
+            "logInstant": "2021-04-01T14:31:28Z"
+        },
+        {
+            "id": 254,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connection is still allocated",
+            "logInstant": "2021-04-01T14:31:28Z"
+        },
+        {
+            "id": 253,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request",
+            "logInstant": "2021-04-01T14:31:28Z"
+        },
+        {
+            "id": 252,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request",
+            "logInstant": "2021-04-01T14:31:28Z"
+        },
+        {
+            "id": 251,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request",
+            "logInstant": "2021-04-01T14:31:28Z"
+        },
+        {
+            "id": 250,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "Micro Service policies UPDATED",
+            "logInstant": "2021-04-01T12:39:55Z"
+        },
+        {
+            "id": 249,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request successfully executed",
+            "logInstant": "2021-04-01T12:38:31Z"
+        },
+        {
+            "id": 248,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "New loop state is: DESIGN",
+            "logInstant": "2021-04-01T12:38:31Z"
+        },
+        {
+            "id": 247,
+            "logType": "INFO",
+            "logComponent": "DCAE",
+            "message": "DCAE state set to: BLUEPRINT_DEPLOYED - message: ",
+            "logInstant": "2021-04-01T12:38:30Z"
+        },
+        {
+            "id": 246,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "Policy state set to: NOT_SENT",
+            "logInstant": "2021-04-01T12:38:30Z"
+        },
+        {
+            "id": 245,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET Policy deployment\n                        status -  : ",
+            "logInstant": "2021-04-01T12:38:30Z"
+        },
+        {
+            "id": 244,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-04-01T12:38:30Z"
+        },
+        {
+            "id": 243,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET\n                        Policy status -  : ",
+            "logInstant": "2021-04-01T12:38:26Z"
+        },
+        {
+            "id": 242,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-04-01T12:38:26Z"
+        },
+        {
+            "id": 241,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request",
+            "logInstant": "2021-04-01T12:38:22Z"
+        },
+        {
+            "id": 240,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "Micro Service policies UPDATED",
+            "logInstant": "2021-04-01T12:37:20Z"
+        },
+        {
+            "id": 239,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request successfully executed",
+            "logInstant": "2021-04-01T12:37:19Z"
+        },
+        {
+            "id": 238,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "New loop state is: DESIGN",
+            "logInstant": "2021-04-01T12:37:19Z"
+        },
+        {
+            "id": 237,
+            "logType": "INFO",
+            "logComponent": "DCAE",
+            "message": "DCAE state set to: BLUEPRINT_DEPLOYED - message: ",
+            "logInstant": "2021-04-01T12:37:19Z"
+        },
+        {
+            "id": 236,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "Policy state set to: NOT_SENT",
+            "logInstant": "2021-04-01T12:37:19Z"
+        },
+        {
+            "id": 235,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET Policy deployment\n                        status -  : ",
+            "logInstant": "2021-04-01T12:37:19Z"
+        },
+        {
+            "id": 234,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-04-01T12:37:19Z"
+        },
+        {
+            "id": 233,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET\n                        Policy status -  : ",
+            "logInstant": "2021-04-01T12:37:14Z"
+        },
+        {
+            "id": 232,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-04-01T12:37:14Z"
+        },
+        {
+            "id": 231,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request",
+            "logInstant": "2021-04-01T12:37:10Z"
+        },
+        {
+            "id": 221,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "Micro Service policies UPDATED",
+            "logInstant": "2021-04-01T11:57:59Z"
+        },
+        {
+            "id": 220,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request successfully executed",
+            "logInstant": "2021-04-01T11:57:34Z"
+        },
+        {
+            "id": 219,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "New loop state is: DESIGN",
+            "logInstant": "2021-04-01T11:57:34Z"
+        },
+        {
+            "id": 218,
+            "logType": "INFO",
+            "logComponent": "DCAE",
+            "message": "DCAE state set to: BLUEPRINT_DEPLOYED - message: ",
+            "logInstant": "2021-04-01T11:57:34Z"
+        },
+        {
+            "id": 217,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "Policy state set to: NOT_SENT",
+            "logInstant": "2021-04-01T11:57:33Z"
+        },
+        {
+            "id": 216,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET Policy deployment\n                        status -  : ",
+            "logInstant": "2021-04-01T11:57:33Z"
+        },
+        {
+            "id": 215,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-04-01T11:57:33Z"
+        },
+        {
+            "id": 214,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET\n                        Policy status -  : ",
+            "logInstant": "2021-04-01T11:57:29Z"
+        },
+        {
+            "id": 213,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-04-01T11:57:29Z"
+        },
+        {
+            "id": 212,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request",
+            "logInstant": "2021-04-01T11:57:25Z"
+        },
+        {
+            "id": 211,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request successfully executed",
+            "logInstant": "2021-03-31T15:50:20Z"
+        },
+        {
+            "id": 210,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "New loop state is: DESIGN",
+            "logInstant": "2021-03-31T15:50:20Z"
+        },
+        {
+            "id": 209,
+            "logType": "INFO",
+            "logComponent": "DCAE",
+            "message": "DCAE state set to: BLUEPRINT_DEPLOYED - message: ",
+            "logInstant": "2021-03-31T15:50:20Z"
+        },
+        {
+            "id": 208,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "Policy state set to: NOT_SENT",
+            "logInstant": "2021-03-31T15:50:20Z"
+        },
+        {
+            "id": 207,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET Policy deployment\n                        status -  : ",
+            "logInstant": "2021-03-31T15:50:20Z"
+        },
+        {
+            "id": 206,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-03-31T15:50:20Z"
+        },
+        {
+            "id": 205,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET\n                        Policy status -  : ",
+            "logInstant": "2021-03-31T15:50:16Z"
+        },
+        {
+            "id": 204,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-03-31T15:50:16Z"
+        },
+        {
+            "id": 203,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request",
+            "logInstant": "2021-03-31T15:50:11Z"
+        },
+        {
+            "id": 202,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request successfully executed",
+            "logInstant": "2021-03-31T15:49:39Z"
+        },
+        {
+            "id": 201,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "New loop state is: DESIGN",
+            "logInstant": "2021-03-31T15:49:39Z"
+        },
+        {
+            "id": 200,
+            "logType": "INFO",
+            "logComponent": "DCAE",
+            "message": "DCAE state set to: BLUEPRINT_DEPLOYED - message: ",
+            "logInstant": "2021-03-31T15:49:39Z"
+        },
+        {
+            "id": 199,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "Policy state set to: NOT_SENT",
+            "logInstant": "2021-03-31T15:49:39Z"
+        },
+        {
+            "id": 198,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET Policy deployment\n                        status -  : ",
+            "logInstant": "2021-03-31T15:49:39Z"
+        },
+        {
+            "id": 197,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-03-31T15:49:39Z"
+        },
+        {
+            "id": 196,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET\n                        Policy status -  : ",
+            "logInstant": "2021-03-31T15:49:35Z"
+        },
+        {
+            "id": 195,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-03-31T15:49:35Z"
+        },
+        {
+            "id": 194,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request",
+            "logInstant": "2021-03-31T15:49:30Z"
+        },
+        {
+            "id": 193,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request successfully executed",
+            "logInstant": "2021-03-31T15:49:06Z"
+        },
+        {
+            "id": 192,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "New loop state is: DESIGN",
+            "logInstant": "2021-03-31T15:49:06Z"
+        },
+        {
+            "id": 191,
+            "logType": "INFO",
+            "logComponent": "DCAE",
+            "message": "DCAE state set to: BLUEPRINT_DEPLOYED - message: ",
+            "logInstant": "2021-03-31T15:49:06Z"
+        },
+        {
+            "id": 190,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "Policy state set to: NOT_SENT",
+            "logInstant": "2021-03-31T15:49:06Z"
+        },
+        {
+            "id": 189,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET Policy deployment\n                        status -  : ",
+            "logInstant": "2021-03-31T15:49:06Z"
+        },
+        {
+            "id": 188,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-03-31T15:49:06Z"
+        },
+        {
+            "id": 187,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET\n                        Policy status -  : ",
+            "logInstant": "2021-03-31T15:49:01Z"
+        },
+        {
+            "id": 186,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-03-31T15:49:01Z"
+        },
+        {
+            "id": 185,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request",
+            "logInstant": "2021-03-31T15:48:57Z"
+        },
+        {
+            "id": 184,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request successfully executed",
+            "logInstant": "2021-03-31T15:47:28Z"
+        },
+        {
+            "id": 183,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "New loop state is: DESIGN",
+            "logInstant": "2021-03-31T15:47:28Z"
+        },
+        {
+            "id": 182,
+            "logType": "INFO",
+            "logComponent": "DCAE",
+            "message": "DCAE state set to: BLUEPRINT_DEPLOYED - message: ",
+            "logInstant": "2021-03-31T15:47:28Z"
+        },
+        {
+            "id": 181,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "Policy state set to: NOT_SENT",
+            "logInstant": "2021-03-31T15:47:28Z"
+        },
+        {
+            "id": 180,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET Policy deployment\n                        status -  : ",
+            "logInstant": "2021-03-31T15:47:27Z"
+        },
+        {
+            "id": 179,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-03-31T15:47:27Z"
+        },
+        {
+            "id": 178,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET\n                        Policy status -  : ",
+            "logInstant": "2021-03-31T15:47:23Z"
+        },
+        {
+            "id": 177,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-03-31T15:47:23Z"
+        },
+        {
+            "id": 176,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request",
+            "logInstant": "2021-03-31T15:47:19Z"
+        },
+        {
+            "id": 175,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request successfully executed",
+            "logInstant": "2021-03-31T15:43:41Z"
+        },
+        {
+            "id": 174,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "New loop state is: DESIGN",
+            "logInstant": "2021-03-31T15:43:41Z"
+        },
+        {
+            "id": 173,
+            "logType": "INFO",
+            "logComponent": "DCAE",
+            "message": "DCAE state set to: BLUEPRINT_DEPLOYED - message: ",
+            "logInstant": "2021-03-31T15:43:41Z"
+        },
+        {
+            "id": 172,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "Policy state set to: NOT_SENT",
+            "logInstant": "2021-03-31T15:43:41Z"
+        },
+        {
+            "id": 171,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET Policy deployment\n                        status -  : ",
+            "logInstant": "2021-03-31T15:43:41Z"
+        },
+        {
+            "id": 170,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-03-31T15:43:41Z"
+        },
+        {
+            "id": 169,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET\n                        Policy status -  : ",
+            "logInstant": "2021-03-31T15:43:36Z"
+        },
+        {
+            "id": 168,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-03-31T15:43:36Z"
+        },
+        {
+            "id": 167,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request successfully executed",
+            "logInstant": "2021-03-31T15:43:34Z"
+        },
+        {
+            "id": 166,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request successfully executed",
+            "logInstant": "2021-03-31T15:43:34Z"
+        },
+        {
+            "id": 165,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request successfully executed",
+            "logInstant": "2021-03-31T15:43:34Z"
+        },
+        {
+            "id": 164,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "New loop state is: DESIGN",
+            "logInstant": "2021-03-31T15:43:34Z"
+        },
+        {
+            "id": 163,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "New loop state is: DESIGN",
+            "logInstant": "2021-03-31T15:43:34Z"
+        },
+        {
+            "id": 162,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "New loop state is: DESIGN",
+            "logInstant": "2021-03-31T15:43:34Z"
+        },
+        {
+            "id": 161,
+            "logType": "INFO",
+            "logComponent": "DCAE",
+            "message": "DCAE state set to: BLUEPRINT_DEPLOYED - message: ",
+            "logInstant": "2021-03-31T15:43:33Z"
+        },
+        {
+            "id": 160,
+            "logType": "INFO",
+            "logComponent": "DCAE",
+            "message": "DCAE state set to: BLUEPRINT_DEPLOYED - message: ",
+            "logInstant": "2021-03-31T15:43:33Z"
+        },
+        {
+            "id": 159,
+            "logType": "INFO",
+            "logComponent": "DCAE",
+            "message": "DCAE state set to: BLUEPRINT_DEPLOYED - message: ",
+            "logInstant": "2021-03-31T15:43:33Z"
+        },
+        {
+            "id": 158,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "Policy state set to: NOT_SENT",
+            "logInstant": "2021-03-31T15:43:33Z"
+        },
+        {
+            "id": 157,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "Policy state set to: NOT_SENT",
+            "logInstant": "2021-03-31T15:43:33Z"
+        },
+        {
+            "id": 156,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "Policy state set to: NOT_SENT",
+            "logInstant": "2021-03-31T15:43:33Z"
+        },
+        {
+            "id": 155,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET Policy deployment\n                        status -  : ",
+            "logInstant": "2021-03-31T15:43:33Z"
+        },
+        {
+            "id": 154,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET Policy deployment\n                        status -  : ",
+            "logInstant": "2021-03-31T15:43:33Z"
+        },
+        {
+            "id": 153,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET Policy deployment\n                        status -  : ",
+            "logInstant": "2021-03-31T15:43:33Z"
+        },
+        {
+            "id": 152,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connection is still allocated",
+            "logInstant": "2021-03-31T15:43:33Z"
+        },
+        {
+            "id": 151,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connection is still allocated",
+            "logInstant": "2021-03-31T15:43:33Z"
+        },
+        {
+            "id": 150,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connection is still allocated",
+            "logInstant": "2021-03-31T15:43:33Z"
+        },
+        {
+            "id": 149,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET\n                        Policy status -  : ",
+            "logInstant": "2021-03-31T15:43:32Z"
+        },
+        {
+            "id": 148,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET\n                        Policy status -  : ",
+            "logInstant": "2021-03-31T15:43:32Z"
+        },
+        {
+            "id": 147,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET\n                        Policy status -  : ",
+            "logInstant": "2021-03-31T15:43:32Z"
+        },
+        {
+            "id": 146,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connection is still allocated",
+            "logInstant": "2021-03-31T15:43:32Z"
+        },
+        {
+            "id": 145,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connection is still allocated",
+            "logInstant": "2021-03-31T15:43:32Z"
+        },
+        {
+            "id": 144,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connection is still allocated",
+            "logInstant": "2021-03-31T15:43:32Z"
+        },
+        {
+            "id": 143,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request",
+            "logInstant": "2021-03-31T15:43:32Z"
+        },
+        {
+            "id": 142,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request",
+            "logInstant": "2021-03-31T15:43:32Z"
+        },
+        {
+            "id": 141,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request",
+            "logInstant": "2021-03-31T15:43:32Z"
+        },
+        {
+            "id": 140,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request",
+            "logInstant": "2021-03-31T15:43:32Z"
+        },
+        {
+            "id": 139,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request successfully executed",
+            "logInstant": "2021-03-31T10:13:01Z"
+        },
+        {
+            "id": 138,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "New loop state is: DESIGN",
+            "logInstant": "2021-03-31T10:13:01Z"
+        },
+        {
+            "id": 137,
+            "logType": "INFO",
+            "logComponent": "DCAE",
+            "message": "DCAE state set to: BLUEPRINT_DEPLOYED - message: ",
+            "logInstant": "2021-03-31T10:13:00Z"
+        },
+        {
+            "id": 136,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "Policy state set to: NOT_SENT",
+            "logInstant": "2021-03-31T10:13:00Z"
+        },
+        {
+            "id": 135,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET Policy deployment\n                        status -  : ",
+            "logInstant": "2021-03-31T10:13:00Z"
+        },
+        {
+            "id": 134,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-03-31T10:13:00Z"
+        },
+        {
+            "id": 133,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET\n                        Policy status -  : ",
+            "logInstant": "2021-03-31T10:12:56Z"
+        },
+        {
+            "id": 132,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-03-31T10:12:56Z"
+        },
+        {
+            "id": 131,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request",
+            "logInstant": "2021-03-31T10:12:52Z"
+        },
+        {
+            "id": 130,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request successfully executed",
+            "logInstant": "2021-03-31T09:55:12Z"
+        },
+        {
+            "id": 129,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "New loop state is: DESIGN",
+            "logInstant": "2021-03-31T09:55:12Z"
+        },
+        {
+            "id": 128,
+            "logType": "INFO",
+            "logComponent": "DCAE",
+            "message": "DCAE state set to: BLUEPRINT_DEPLOYED - message: ",
+            "logInstant": "2021-03-31T09:55:12Z"
+        },
+        {
+            "id": 127,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "Policy state set to: NOT_SENT",
+            "logInstant": "2021-03-31T09:55:12Z"
+        },
+        {
+            "id": 126,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET Policy deployment\n                        status -  : ",
+            "logInstant": "2021-03-31T09:55:12Z"
+        },
+        {
+            "id": 125,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-03-31T09:55:12Z"
+        },
+        {
+            "id": 124,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET\n                        Policy status -  : ",
+            "logInstant": "2021-03-31T09:55:08Z"
+        },
+        {
+            "id": 123,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-03-31T09:55:07Z"
+        },
+        {
+            "id": 122,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request",
+            "logInstant": "2021-03-31T09:55:03Z"
+        },
+        {
+            "id": 121,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request successfully executed",
+            "logInstant": "2021-03-31T09:46:18Z"
+        },
+        {
+            "id": 120,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "New loop state is: DESIGN",
+            "logInstant": "2021-03-31T09:46:18Z"
+        },
+        {
+            "id": 119,
+            "logType": "INFO",
+            "logComponent": "DCAE",
+            "message": "DCAE state set to: BLUEPRINT_DEPLOYED - message: ",
+            "logInstant": "2021-03-31T09:46:18Z"
+        },
+        {
+            "id": 118,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "Policy state set to: NOT_SENT",
+            "logInstant": "2021-03-31T09:46:18Z"
+        },
+        {
+            "id": 117,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET Policy deployment\n                        status -  : ",
+            "logInstant": "2021-03-31T09:46:18Z"
+        },
+        {
+            "id": 116,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-03-31T09:46:18Z"
+        },
+        {
+            "id": 115,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET\n                        Policy status -  : ",
+            "logInstant": "2021-03-31T09:46:13Z"
+        },
+        {
+            "id": 114,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-03-31T09:46:13Z"
+        },
+        {
+            "id": 113,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request",
+            "logInstant": "2021-03-31T09:46:09Z"
+        },
+        {
+            "id": 112,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request successfully executed",
+            "logInstant": "2021-03-31T09:45:56Z"
+        },
+        {
+            "id": 111,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "New loop state is: DESIGN",
+            "logInstant": "2021-03-31T09:45:56Z"
+        },
+        {
+            "id": 110,
+            "logType": "INFO",
+            "logComponent": "DCAE",
+            "message": "DCAE state set to: BLUEPRINT_DEPLOYED - message: ",
+            "logInstant": "2021-03-31T09:45:56Z"
+        },
+        {
+            "id": 109,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "Policy state set to: NOT_SENT",
+            "logInstant": "2021-03-31T09:45:56Z"
+        },
+        {
+            "id": 108,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET Policy deployment\n                        status -  : ",
+            "logInstant": "2021-03-31T09:45:56Z"
+        },
+        {
+            "id": 107,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-03-31T09:45:55Z"
+        },
+        {
+            "id": 106,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET\n                        Policy status -  : ",
+            "logInstant": "2021-03-31T09:45:51Z"
+        },
+        {
+            "id": 105,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-03-31T09:45:51Z"
+        },
+        {
+            "id": 104,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request",
+            "logInstant": "2021-03-31T09:45:47Z"
+        },
+        {
+            "id": 103,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request successfully executed",
+            "logInstant": "2021-03-30T16:00:55Z"
+        },
+        {
+            "id": 102,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "New loop state is: DESIGN",
+            "logInstant": "2021-03-30T16:00:55Z"
+        },
+        {
+            "id": 101,
+            "logType": "INFO",
+            "logComponent": "DCAE",
+            "message": "DCAE state set to: BLUEPRINT_DEPLOYED - message: ",
+            "logInstant": "2021-03-30T16:00:55Z"
+        },
+        {
+            "id": 100,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "Policy state set to: NOT_SENT",
+            "logInstant": "2021-03-30T16:00:55Z"
+        },
+        {
+            "id": 99,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET Policy deployment\n                        status -  : ",
+            "logInstant": "2021-03-30T16:00:55Z"
+        },
+        {
+            "id": 98,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-03-30T16:00:54Z"
+        },
+        {
+            "id": 97,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET\n                        Policy status -  : ",
+            "logInstant": "2021-03-30T16:00:50Z"
+        },
+        {
+            "id": 96,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-03-30T16:00:50Z"
+        },
+        {
+            "id": 95,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request",
+            "logInstant": "2021-03-30T16:00:46Z"
+        },
+        {
+            "id": 94,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request successfully executed",
+            "logInstant": "2021-03-30T15:58:05Z"
+        },
+        {
+            "id": 93,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "New loop state is: DESIGN",
+            "logInstant": "2021-03-30T15:58:05Z"
+        },
+        {
+            "id": 92,
+            "logType": "INFO",
+            "logComponent": "DCAE",
+            "message": "DCAE state set to: BLUEPRINT_DEPLOYED - message: ",
+            "logInstant": "2021-03-30T15:58:05Z"
+        },
+        {
+            "id": 91,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "Policy state set to: NOT_SENT",
+            "logInstant": "2021-03-30T15:58:05Z"
+        },
+        {
+            "id": 90,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET Policy deployment\n                        status -  : ",
+            "logInstant": "2021-03-30T15:58:05Z"
+        },
+        {
+            "id": 89,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-03-30T15:58:05Z"
+        },
+        {
+            "id": 88,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET\n                        Policy status -  : ",
+            "logInstant": "2021-03-30T15:58:00Z"
+        },
+        {
+            "id": 87,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-03-30T15:58:00Z"
+        },
+        {
+            "id": 86,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request",
+            "logInstant": "2021-03-30T15:57:56Z"
+        },
+        {
+            "id": 85,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request successfully executed",
+            "logInstant": "2021-03-30T15:00:21Z"
+        },
+        {
+            "id": 84,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "New loop state is: DESIGN",
+            "logInstant": "2021-03-30T15:00:21Z"
+        },
+        {
+            "id": 83,
+            "logType": "INFO",
+            "logComponent": "DCAE",
+            "message": "DCAE state set to: BLUEPRINT_DEPLOYED - message: ",
+            "logInstant": "2021-03-30T15:00:21Z"
+        },
+        {
+            "id": 82,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "Policy state set to: NOT_SENT",
+            "logInstant": "2021-03-30T15:00:21Z"
+        },
+        {
+            "id": 81,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET Policy deployment\n                        status -  : ",
+            "logInstant": "2021-03-30T15:00:21Z"
+        },
+        {
+            "id": 80,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-03-30T15:00:21Z"
+        },
+        {
+            "id": 79,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET\n                        Policy status -  : ",
+            "logInstant": "2021-03-30T15:00:17Z"
+        },
+        {
+            "id": 78,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-03-30T15:00:17Z"
+        },
+        {
+            "id": 77,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request",
+            "logInstant": "2021-03-30T15:00:12Z"
+        },
+        {
+            "id": 76,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request successfully executed",
+            "logInstant": "2021-03-30T14:51:24Z"
+        },
+        {
+            "id": 75,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "New loop state is: DESIGN",
+            "logInstant": "2021-03-30T14:51:23Z"
+        },
+        {
+            "id": 74,
+            "logType": "INFO",
+            "logComponent": "DCAE",
+            "message": "DCAE state set to: BLUEPRINT_DEPLOYED - message: ",
+            "logInstant": "2021-03-30T14:51:23Z"
+        },
+        {
+            "id": 73,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "Policy state set to: NOT_SENT",
+            "logInstant": "2021-03-30T14:51:23Z"
+        },
+        {
+            "id": 72,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET Policy deployment\n                        status -  : ",
+            "logInstant": "2021-03-30T14:51:23Z"
+        },
+        {
+            "id": 71,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-03-30T14:51:23Z"
+        },
+        {
+            "id": 70,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET\n                        Policy status -  : ",
+            "logInstant": "2021-03-30T14:51:19Z"
+        },
+        {
+            "id": 69,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-03-30T14:51:19Z"
+        },
+        {
+            "id": 68,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request",
+            "logInstant": "2021-03-30T14:51:15Z"
+        },
+        {
+            "id": 67,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request successfully executed",
+            "logInstant": "2021-03-30T14:45:06Z"
+        },
+        {
+            "id": 66,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "New loop state is: DESIGN",
+            "logInstant": "2021-03-30T14:45:06Z"
+        },
+        {
+            "id": 65,
+            "logType": "INFO",
+            "logComponent": "DCAE",
+            "message": "DCAE state set to: BLUEPRINT_DEPLOYED - message: ",
+            "logInstant": "2021-03-30T14:45:06Z"
+        },
+        {
+            "id": 64,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "Policy state set to: NOT_SENT",
+            "logInstant": "2021-03-30T14:45:06Z"
+        },
+        {
+            "id": 63,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET Policy deployment\n                        status -  : ",
+            "logInstant": "2021-03-30T14:45:06Z"
+        },
+        {
+            "id": 62,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-03-30T14:45:06Z"
+        },
+        {
+            "id": 61,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET\n                        Policy status -  : ",
+            "logInstant": "2021-03-30T14:45:02Z"
+        },
+        {
+            "id": 60,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-03-30T14:45:02Z"
+        },
+        {
+            "id": 59,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request",
+            "logInstant": "2021-03-30T14:44:57Z"
+        },
+        {
+            "id": 58,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request successfully executed",
+            "logInstant": "2021-03-30T14:44:31Z"
+        },
+        {
+            "id": 57,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "New loop state is: DESIGN",
+            "logInstant": "2021-03-30T14:44:31Z"
+        },
+        {
+            "id": 56,
+            "logType": "INFO",
+            "logComponent": "DCAE",
+            "message": "DCAE state set to: BLUEPRINT_DEPLOYED - message: ",
+            "logInstant": "2021-03-30T14:44:31Z"
+        },
+        {
+            "id": 55,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "Policy state set to: NOT_SENT",
+            "logInstant": "2021-03-30T14:44:31Z"
+        },
+        {
+            "id": 54,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET Policy deployment\n                        status -  : ",
+            "logInstant": "2021-03-30T14:44:31Z"
+        },
+        {
+            "id": 53,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-03-30T14:44:31Z"
+        },
+        {
+            "id": 52,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET\n                        Policy status -  : ",
+            "logInstant": "2021-03-30T14:44:27Z"
+        },
+        {
+            "id": 51,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-03-30T14:44:26Z"
+        },
+        {
+            "id": 50,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request",
+            "logInstant": "2021-03-30T14:44:22Z"
+        },
+        {
+            "id": 49,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request successfully executed",
+            "logInstant": "2021-03-30T14:32:12Z"
+        },
+        {
+            "id": 48,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "New loop state is: DESIGN",
+            "logInstant": "2021-03-30T14:32:12Z"
+        },
+        {
+            "id": 47,
+            "logType": "INFO",
+            "logComponent": "DCAE",
+            "message": "DCAE state set to: BLUEPRINT_DEPLOYED - message: ",
+            "logInstant": "2021-03-30T14:32:12Z"
+        },
+        {
+            "id": 46,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "Policy state set to: NOT_SENT",
+            "logInstant": "2021-03-30T14:32:12Z"
+        },
+        {
+            "id": 45,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET Policy deployment\n                        status -  : ",
+            "logInstant": "2021-03-30T14:32:12Z"
+        },
+        {
+            "id": 44,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-03-30T14:32:11Z"
+        },
+        {
+            "id": 43,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET\n                        Policy status -  : ",
+            "logInstant": "2021-03-30T14:32:07Z"
+        },
+        {
+            "id": 42,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-03-30T14:32:07Z"
+        },
+        {
+            "id": 41,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request",
+            "logInstant": "2021-03-30T14:32:03Z"
+        },
+        {
+            "id": 40,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request successfully executed",
+            "logInstant": "2021-03-30T13:07:24Z"
+        },
+        {
+            "id": 39,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "New loop state is: DESIGN",
+            "logInstant": "2021-03-30T13:07:24Z"
+        },
+        {
+            "id": 38,
+            "logType": "INFO",
+            "logComponent": "DCAE",
+            "message": "DCAE state set to: BLUEPRINT_DEPLOYED - message: ",
+            "logInstant": "2021-03-30T13:07:24Z"
+        },
+        {
+            "id": 37,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "Policy state set to: NOT_SENT",
+            "logInstant": "2021-03-30T13:07:24Z"
+        },
+        {
+            "id": 36,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET Policy deployment\n                        status -  : ",
+            "logInstant": "2021-03-30T13:07:24Z"
+        },
+        {
+            "id": 35,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-03-30T13:07:24Z"
+        },
+        {
+            "id": 34,
+            "logType": "INFO",
+            "logComponent": "POLICY",
+            "message": "MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0_mHh GET\n                        Policy status -  : ",
+            "logInstant": "2021-03-30T13:07:19Z"
+        },
+        {
+            "id": 33,
+            "logType": "ERROR",
+            "logComponent": "CLAMP",
+            "message": "GET policy request failed, Error reported: Connect to localhost:8085 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect",
+            "logInstant": "2021-03-30T13:07:19Z"
+        },
+        {
+            "id": 32,
+            "logType": "INFO",
+            "logComponent": "CLAMP",
+            "message": "GET STATUS request",
+            "logInstant": "2021-03-30T13:07:15Z"
+        }
+    ],
+    "loopTemplate": {
+        "name": "LOOP_TEMPLATE_k8s_pmsh",
+        "dcaeBlueprintId": "9dc5dba0-e685-4d5a-b144-8f4d84cfa01f",
+        "loopElementModelsUsed": [
+            {
+                "loopElementModel": {
+                    "name": "onap.policies.monitoring.dcae-pm-subscription-handler",
+                    "loopElementType": "MICRO_SERVICE_TYPE",
+                    "policyModels": [
+                        {
+                            "policyModelType": "onap.policies.monitoring.dcae-pm-subscription-handler",
+                            "version": "1.0.0",
+                            "policyAcronym": "dcae-pm-subscription-handler",
+                            "policyPdpGroup": {
+                                "supportedPdpGroups": [
+                                    {
+                                        "ControlLoopGroup": [
+                                            "apex",
+                                            "xacml"
+                                        ]
+                                    },
+                                    {
+                                        "defaultGroup": [
+                                            "xacml"
+                                        ]
+                                    }
+                                ]
+                            },
+                            "createdDate": "2021-03-30T09:55:52.261232Z",
+                            "updatedDate": "2021-03-30T09:56:17.502284Z",
+                            "updatedBy": "Not found",
+                            "createdBy": "Not found"
+                        }
+                    ],
+                    "createdDate": "2021-03-30T08:48:21Z",
+                    "updatedDate": "2021-03-30T08:48:21Z",
+                    "updatedBy": "Not found",
+                    "createdBy": "Not found"
+                },
+                "flowOrder": 0
+            }
+        ],
+        "modelService": {
+            "serviceDetails": {
+                "serviceType": "",
+                "serviceRole": "",
+                "description": "vLBMS",
+                "type": "Service",
+                "instantiationType": "A-la-carte",
+                "namingPolicy": "",
+                "serviceEcompNaming": "true",
+                "environmentContext": "General_Revenue-Bearing",
+                "name": "vLoadBalancerMS",
+                "invariantUUID": "30ec5b59-4799-48d8-ac5f-1058a6b0e48f",
+                "ecompGeneratedNaming": "true",
+                "UUID": "63cac700-ab9a-4115-a74f-7eac85e3fce0",
+                "category": "Network L4+"
+            },
+            "resourceDetails": {
+                "CP": {},
+                "VL": {},
+                "VF": {
+                    "vLoadBalancerMS 0": {
+                        "resourceVendor": "Test",
+                        "name": "vLoadBalancerMS",
+                        "resourceVendorModelNumber": "",
+                        "description": "vLBMS",
+                        "invariantUUID": "1a31b9f2-e50d-43b7-89b3-a040250cf506",
+                        "UUID": "b4c4f3d7-929e-4b6d-a1cd-57e952ddc3e6",
+                        "type": "VF",
+                        "category": "Application L4+",
+                        "subcategory": "Load Balancer",
+                        "version": "1.0",
+                        "customizationUUID": "465246dc-7748-45f4-a013-308d92922552",
+                        "resourceVendorRelease": "1.0",
+                        "controllerProperties": {
+                            "sdnc_model_name": "baseconfiguration",
+                            "sdnc_model_version": "1.0.0",
+                            "workflows": {
+                                "resource-assignment": {
+                                    "inputs": {
+                                        "resource-assignment-properties": {
+                                            "type": "object",
+                                            "properties": {
+                                                "request-id": {
+                                                    "required": true,
+                                                    "type": "string",
+                                                    "input-param": true
+                                                },
+                                                "service-instance-id": {
+                                                    "required": true,
+                                                    "type": "string",
+                                                    "input-param": true
+                                                },
+                                                "hostname": {
+                                                    "required": true,
+                                                    "type": "string",
+                                                    "input-param": true
+                                                },
+                                                "request-info": {
+                                                    "type": "object",
+                                                    "properties": {
+                                                        "prop1": {
+                                                            "required": true,
+                                                            "type": "string",
+                                                            "input-param": true
+                                                        },
+                                                        "prop2": {
+                                                            "required": true,
+                                                            "type": "string",
+                                                            "input-param": true
+                                                        }
+                                                    }
+                                                }
+                                            }
+                                        }
+                                    }
+                                },
+                                "activate": {
+                                    "inputs": {
+                                        "resource-assignment-properties": {
+                                            "type": "object",
+                                            "properties": {
+                                                "request-id": {
+                                                    "required": true,
+                                                    "type": "string",
+                                                    "input-param": true
+                                                },
+                                                "service-instance-id": {
+                                                    "required": true,
+                                                    "type": "string",
+                                                    "input-param": true
+                                                },
+                                                "hostname": {
+                                                    "required": true,
+                                                    "type": "string",
+                                                    "input-param": true
+                                                },
+                                                "request-info": {
+                                                    "type": "object",
+                                                    "properties": {
+                                                        "prop1": {
+                                                            "required": true,
+                                                            "type": "string",
+                                                            "input-param": true
+                                                        },
+                                                        "prop2": {
+                                                            "required": true,
+                                                            "type": "string",
+                                                            "input-param": true
+                                                        }
+                                                    }
+                                                }
+                                            }
+                                        }
+                                    }
+                                },
+                                "activate-restconf": {
+                                    "inputs": {
+                                        "resource-assignment-properties": {
+                                            "type": "object",
+                                            "properties": {
+                                                "request-id": {
+                                                    "required": true,
+                                                    "type": "string",
+                                                    "input-param": true
+                                                },
+                                                "service-instance-id": {
+                                                    "required": true,
+                                                    "type": "string",
+                                                    "input-param": true
+                                                },
+                                                "hostname": {
+                                                    "required": true,
+                                                    "type": "string",
+                                                    "input-param": true
+                                                },
+                                                "request-info": {
+                                                    "type": "object",
+                                                    "properties": {
+                                                        "prop1": {
+                                                            "required": true,
+                                                            "type": "string",
+                                                            "input-param": true
+                                                        },
+                                                        "prop2": {
+                                                            "required": true,
+                                                            "type": "string",
+                                                            "input-param": true
+                                                        }
+                                                    }
+                                                }
+                                            }
+                                        }
+                                    }
+                                },
+                                "activate-cli": {
+                                    "inputs": {
+                                        "resource-assignment-properties": {
+                                            "type": "object",
+                                            "properties": {
+                                                "request-id": {
+                                                    "required": true,
+                                                    "type": "string",
+                                                    "input-param": true
+                                                },
+                                                "service-instance-id": {
+                                                    "required": true,
+                                                    "type": "string",
+                                                    "input-param": true
+                                                },
+                                                "hostname": {
+                                                    "required": true,
+                                                    "type": "string",
+                                                    "input-param": true
+                                                },
+                                                "request-info": {
+                                                    "type": "object",
+                                                    "properties": {
+                                                        "prop1": {
+                                                            "required": true,
+                                                            "type": "string",
+                                                            "input-param": true
+                                                        },
+                                                        "prop2": {
+                                                            "required": true,
+                                                            "type": "string",
+                                                            "input-param": true
+                                                        }
+                                                    }
+                                                }
+                                            }
+                                        }
+                                    }
+                                },
+                                "assign-activate": {
+                                    "inputs": {
+                                        "resource-assignment-properties": {
+                                            "type": "object",
+                                            "properties": {
+                                                "request-id": {
+                                                    "required": true,
+                                                    "type": "string",
+                                                    "input-param": true
+                                                },
+                                                "service-instance-id": {
+                                                    "required": true,
+                                                    "type": "string",
+                                                    "input-param": true
+                                                },
+                                                "hostname": {
+                                                    "required": true,
+                                                    "type": "string",
+                                                    "input-param": true
+                                                },
+                                                "request-info": {
+                                                    "type": "object",
+                                                    "properties": {
+                                                        "prop1": {
+                                                            "required": true,
+                                                            "type": "string",
+                                                            "input-param": true
+                                                        },
+                                                        "prop2": {
+                                                            "required": true,
+                                                            "type": "string",
+                                                            "input-param": true
+                                                        }
+                                                    }
+                                                }
+                                            }
+                                        }
+                                    }
+                                },
+                                "imperative-test-wf": {
+                                    "inputs": {
+                                        "resource-assignment-properties": {
+                                            "type": "object",
+                                            "properties": {
+                                                "request-id": {
+                                                    "required": true,
+                                                    "type": "string",
+                                                    "input-param": true
+                                                },
+                                                "service-instance-id": {
+                                                    "required": true,
+                                                    "type": "string",
+                                                    "input-param": true
+                                                },
+                                                "hostname": {
+                                                    "required": true,
+                                                    "type": "string",
+                                                    "input-param": true
+                                                },
+                                                "request-info": {
+                                                    "type": "object",
+                                                    "properties": {
+                                                        "prop1": {
+                                                            "required": true,
+                                                            "type": "string",
+                                                            "input-param": true
+                                                        },
+                                                        "prop2": {
+                                                            "required": true,
+                                                            "type": "string",
+                                                            "input-param": true
+                                                        }
+                                                    }
+                                                }
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                },
+                "CR": {},
+                "VFC": {},
+                "PNF": {},
+                "Service": {},
+                "CVFC": {},
+                "Service Proxy": {},
+                "Configuration": {},
+                "AllottedResource": {},
+                "VFModule": {
+                    "Vloadbalancerms..vpkg..module-1": {
+                        "vfModuleModelInvariantUUID": "ca052563-eb92-4b5b-ad41-9111768ce043",
+                        "vfModuleModelVersion": "1",
+                        "vfModuleModelName": "Vloadbalancerms..vpkg..module-1",
+                        "vfModuleModelUUID": "1e725ccc-b823-4f67-82b9-4f4367070dbc",
+                        "vfModuleModelCustomizationUUID": "1bffdc31-a37d-4dee-b65c-dde623a76e52",
+                        "min_vf_module_instances": 0,
+                        "vf_module_label": "vpkg",
+                        "max_vf_module_instances": 1,
+                        "vf_module_type": "Expansion",
+                        "isBase": false,
+                        "initial_count": 0,
+                        "volume_group": false
+                    },
+                    "Vloadbalancerms..vdns..module-3": {
+                        "vfModuleModelInvariantUUID": "4c10ba9b-f88f-415e-9de3-5d33336047fa",
+                        "vfModuleModelVersion": "1",
+                        "vfModuleModelName": "Vloadbalancerms..vdns..module-3",
+                        "vfModuleModelUUID": "4fa73b49-8a6c-493e-816b-eb401567b720",
+                        "vfModuleModelCustomizationUUID": "bafcdab0-801d-4d81-9ead-f464640a38b1",
+                        "min_vf_module_instances": 0,
+                        "vf_module_label": "vdns",
+                        "max_vf_module_instances": 50,
+                        "vf_module_type": "Expansion",
+                        "isBase": false,
+                        "initial_count": 0,
+                        "volume_group": false
+                    },
+                    "Vloadbalancerms..base_template..module-0": {
+                        "vfModuleModelInvariantUUID": "921f7c96-ebdd-42e6-81b9-1cfc0c9796f3",
+                        "vfModuleModelVersion": "1",
+                        "vfModuleModelName": "Vloadbalancerms..base_template..module-0",
+                        "vfModuleModelUUID": "63734409-f745-4e4d-a38b-131638a0edce",
+                        "vfModuleModelCustomizationUUID": "86baddea-c730-4fb8-9410-cd2e17fd7f27",
+                        "min_vf_module_instances": 1,
+                        "vf_module_label": "base_template",
+                        "max_vf_module_instances": 1,
+                        "vf_module_type": "Base",
+                        "isBase": true,
+                        "initial_count": 1,
+                        "volume_group": false
+                    },
+                    "Vloadbalancerms..vlb..module-2": {
+                        "vfModuleModelInvariantUUID": "a772a1f4-0064-412c-833d-4749b15828dd",
+                        "vfModuleModelVersion": "1",
+                        "vfModuleModelName": "Vloadbalancerms..vlb..module-2",
+                        "vfModuleModelUUID": "0f5c3f6a-650a-4303-abb6-fff3e573a07a",
+                        "vfModuleModelCustomizationUUID": "96a78aad-4ffb-4ef0-9c4f-deb03bf1d806",
+                        "min_vf_module_instances": 0,
+                        "vf_module_label": "vlb",
+                        "max_vf_module_instances": 1,
+                        "vf_module_type": "Expansion",
+                        "isBase": false,
+                        "initial_count": 0,
+                        "volume_group": false
+                    }
+                }
+            }
+        },
+        "maximumInstancesAllowed": 0,
+        "uniqueBlueprint": true,
+        "allowedLoopType": "CLOSED",
+        "createdDate": "2021-03-30T08:48:21Z",
+        "updatedDate": "2021-03-30T08:48:21Z",
+        "updatedBy": "Not found",
+        "createdBy": "Not found"
+    },
+    "createdDate": "2021-03-30T13:07:07.901081Z",
+    "updatedDate": "2021-03-30T13:07:07.901081Z",
+    "updatedBy": "admin",
+    "createdBy": "admin"
+}
diff --git a/participant/participant-impl/participant-impl-policy/src/main/java/org/onap/policy/clamp/controlloop/participant/policy/main/handler/ControlLoopElementHandler.java b/participant/participant-impl/participant-impl-policy/src/main/java/org/onap/policy/clamp/controlloop/participant/policy/main/handler/ControlLoopElementHandler.java
new file mode 100644
index 0000000..932ebbe
--- /dev/null
+++ b/participant/participant-impl/participant-impl-policy/src/main/java/org/onap/policy/clamp/controlloop/participant/policy/main/handler/ControlLoopElementHandler.java
@@ -0,0 +1,159 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.policy.main.handler;
+
+import java.time.Instant;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.UUID;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ClElementStatistics;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopElement;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopOrderedState;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopState;
+import org.onap.policy.clamp.controlloop.participant.intermediary.api.ControlLoopElementListener;
+import org.onap.policy.models.base.PfModelException;
+import org.onap.policy.models.base.PfModelRuntimeException;
+import org.onap.policy.models.provider.PolicyModelsProvider;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyType;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * This class handles implementation of controlLoopElement updates.
+ */
+public class ControlLoopElementHandler implements ControlLoopElementListener {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(ControlLoopElementHandler.class);
+    private static final Map<String, String> policyTypeMap = new LinkedHashMap<>();
+    private static final Map<String, String> policyMap = new LinkedHashMap<>();
+
+    /**
+     * Callback method to handle a control loop element state change.
+     *
+     * @param controlLoopElementId the ID of the control loop element
+     * @param currentState the current state of the control loop element
+     * @param newState the state to which the control loop element is changing to
+     * @throws PfModelException in case of an exception
+    */
+    @Override
+    public void controlLoopElementStateChange(UUID controlLoopElementId,
+            ControlLoopState currentState,
+            ControlLoopOrderedState newState) throws PfModelException {
+        PolicyProvider policyProvider = PolicyHandler.getInstance().getPolicyProvider();
+        switch (newState) {
+            case UNINITIALISED:
+                try {
+                    deletePolicyData(controlLoopElementId, newState);
+                } catch (PfModelRuntimeException e) {
+                    LOGGER.debug("Delete policytpes failed", e);
+                }
+                break;
+            case PASSIVE:
+                policyProvider.getIntermediaryApi()
+                    .updateControlLoopElementState(controlLoopElementId, newState,
+                            ControlLoopState.PASSIVE);
+                break;
+            case RUNNING:
+                policyProvider.getIntermediaryApi()
+                    .updateControlLoopElementState(controlLoopElementId, newState,
+                            ControlLoopState.RUNNING);
+                break;
+            default:
+                LOGGER.debug("Unknown orderedstate {}", newState);
+                break;
+        }
+    }
+
+    private void deletePolicyData(UUID controlLoopElementId,
+            ControlLoopOrderedState newState) throws PfModelException {
+        PolicyModelsProvider dbProvider = PolicyHandler.getInstance().getDatabaseProvider();
+        PolicyProvider policyProvider = PolicyHandler.getInstance().getPolicyProvider();
+        if (policyMap != null) {
+            // Delete all policies of this controlLoop from policy framework
+            for (Entry<String, String> policy : policyMap.entrySet()) {
+                dbProvider.deletePolicy(policy.getKey(), policy.getValue());
+            }
+        }
+        if (policyTypeMap != null) {
+            // Delete all policy types of this control loop from policy framework
+            for (Entry<String, String> policy : policyTypeMap.entrySet()) {
+                dbProvider.deletePolicyType(policy.getKey(), policy.getValue());
+            }
+        }
+        policyProvider.getIntermediaryApi()
+            .updateControlLoopElementState(controlLoopElementId, newState,
+                    ControlLoopState.UNINITIALISED);
+    }
+
+    /**
+     * Callback method to handle an update on a control loop element.
+     *
+     * @param element the information on the control loop element
+     * @param controlLoopDefinition toscaServiceTemplate
+     * @throws PfModelException in case of an exception
+     */
+    @Override
+    public void controlLoopElementUpdate(ControlLoopElement element,
+            ToscaServiceTemplate controlLoopDefinition) throws PfModelException {
+        PolicyModelsProvider dbProvider = PolicyHandler.getInstance().getDatabaseProvider();
+        PolicyProvider policyProvider = PolicyHandler.getInstance().getPolicyProvider();
+
+        policyProvider.getIntermediaryApi()
+            .updateControlLoopElementState(element.getId(), element.getOrderedState(), ControlLoopState.PASSIVE);
+        if (controlLoopDefinition.getPolicyTypes() != null) {
+            for (ToscaPolicyType policyType : controlLoopDefinition.getPolicyTypes().values()) {
+                policyTypeMap.put(policyType.getName(), policyType.getVersion());
+            }
+            dbProvider.createPolicyTypes(controlLoopDefinition);
+        }
+        if (controlLoopDefinition.getToscaTopologyTemplate().getPolicies() != null) {
+            for (Map<String, ToscaPolicy> foundPolicyMap : controlLoopDefinition
+                            .getToscaTopologyTemplate().getPolicies()) {
+                for (ToscaPolicy policy : foundPolicyMap.values()) {
+                    policyMap.put(policy.getName(), policy.getVersion());
+                }
+            }
+            dbProvider.createPolicies(controlLoopDefinition);
+        }
+    }
+
+    /**
+     * Handle controlLoopElement statistics.
+     *
+     * @param controlLoopElementId controlloop element id
+     */
+    @Override
+    public void handleStatistics(UUID controlLoopElementId) {
+        PolicyProvider policyProvider = PolicyHandler.getInstance().getPolicyProvider();
+        ControlLoopElement clElement = policyProvider.getIntermediaryApi()
+               .getControlLoopElement(controlLoopElementId);
+        if (clElement != null) {
+            ClElementStatistics clElementStatistics = new ClElementStatistics();
+            clElementStatistics.setControlLoopState(clElement.getState());
+            clElementStatistics.setTimeStamp(Instant.now());
+            policyProvider.getIntermediaryApi()
+                .updateControlLoopElementStatistics(controlLoopElementId, clElementStatistics);
+        }
+    }
+}
diff --git a/participant/participant-impl/participant-impl-policy/src/main/java/org/onap/policy/clamp/controlloop/participant/policy/main/handler/PolicyHandler.java b/participant/participant-impl/participant-impl-policy/src/main/java/org/onap/policy/clamp/controlloop/participant/policy/main/handler/PolicyHandler.java
new file mode 100644
index 0000000..d62e5f9
--- /dev/null
+++ b/participant/participant-impl/participant-impl-policy/src/main/java/org/onap/policy/clamp/controlloop/participant/policy/main/handler/PolicyHandler.java
@@ -0,0 +1,100 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.policy.main.handler;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Set;
+import javax.ws.rs.core.Response;
+import lombok.Getter;
+import org.onap.policy.clamp.controlloop.common.handler.ControlLoopHandler;
+import org.onap.policy.clamp.controlloop.participant.intermediary.parameters.ParticipantIntermediaryParameters;
+import org.onap.policy.clamp.controlloop.participant.policy.main.parameters.ParticipantPolicyParameters;
+import org.onap.policy.common.endpoints.event.comm.TopicSink;
+import org.onap.policy.common.endpoints.listeners.MessageTypeDispatcher;
+import org.onap.policy.common.utils.services.Registry;
+import org.onap.policy.models.base.PfModelException;
+import org.onap.policy.models.base.PfModelRuntimeException;
+import org.onap.policy.models.provider.PolicyModelsProvider;
+import org.onap.policy.models.provider.PolicyModelsProviderFactory;
+
+/**
+ * This class handles policy participant and control loop elements.
+ *
+ * <p/>It is effectively a singleton that is started at system start.
+ */
+public class PolicyHandler extends ControlLoopHandler {
+
+    private final ParticipantIntermediaryParameters participantParameters;
+    private final ParticipantPolicyParameters policyParameters;
+
+    @Getter
+    private PolicyProvider policyProvider;
+    @Getter
+    private PolicyModelsProvider databaseProvider;
+
+    /**
+     * Create a handler.
+     *
+     * @param parameters the parameters for access to the database
+     * @throws PfModelException in case of an exception
+     */
+    public PolicyHandler(ParticipantPolicyParameters parameters) throws PfModelException {
+        super(parameters.getDatabaseProviderParameters());
+        participantParameters = parameters.getIntermediaryParameters();
+        policyParameters = parameters;
+    }
+
+    public static PolicyHandler getInstance() {
+        return Registry.get(PolicyHandler.class.getName());
+    }
+
+    @Override
+    public Set<Class<?>> getProviderClasses() {
+        return null;
+    }
+
+    @Override
+    public void startProviders() {
+        try {
+            policyProvider = new PolicyProvider(participantParameters);
+            databaseProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(
+                                         policyParameters.getDatabaseProviderParameters());
+        } catch (PfModelException e) {
+            throw new PfModelRuntimeException(Response.Status.INTERNAL_SERVER_ERROR, "Start providers failed ", e);
+        }
+    }
+
+    @Override
+    public void stopProviders() {
+        try {
+            policyProvider.close();
+        } catch (IOException e) {
+            throw new PfModelRuntimeException(Response.Status.INTERNAL_SERVER_ERROR, "Stop providers failed ", e);
+        }
+
+        try {
+            databaseProvider.close();
+        } catch (PfModelException e) {
+            throw new PfModelRuntimeException(Response.Status.INTERNAL_SERVER_ERROR, "Stop providers failed ", e);
+        }
+    }
+}
diff --git a/participant/participant-impl/participant-impl-policy/src/main/java/org/onap/policy/clamp/controlloop/participant/policy/main/handler/PolicyProvider.java b/participant/participant-impl/participant-impl-policy/src/main/java/org/onap/policy/clamp/controlloop/participant/policy/main/handler/PolicyProvider.java
new file mode 100644
index 0000000..420c77e
--- /dev/null
+++ b/participant/participant-impl/participant-impl-policy/src/main/java/org/onap/policy/clamp/controlloop/participant/policy/main/handler/PolicyProvider.java
@@ -0,0 +1,57 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.participant.policy.main.handler;
+
+import java.io.Closeable;
+import java.io.IOException;
+import lombok.Getter;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopRuntimeException;
+import org.onap.policy.clamp.controlloop.participant.intermediary.api.ParticipantIntermediaryApi;
+import org.onap.policy.clamp.controlloop.participant.intermediary.api.ParticipantIntermediaryFactory;
+import org.onap.policy.clamp.controlloop.participant.intermediary.parameters.ParticipantIntermediaryParameters;
+
+/**
+ * Provider class for policy participant.
+ */
+public class PolicyProvider implements Closeable {
+    @Getter
+    private final ParticipantIntermediaryApi intermediaryApi;
+
+    private final ControlLoopElementHandler controlLoopElementHandler;
+
+    /**
+     * Create a policy participant provider.
+     *
+     * @throws ControlLoopRuntimeException on errors creating the provider
+     */
+    public PolicyProvider(ParticipantIntermediaryParameters participantParameters)
+                     throws ControlLoopRuntimeException {
+        intermediaryApi = new ParticipantIntermediaryFactory().createApiImplementation();
+        intermediaryApi.init(participantParameters);
+        controlLoopElementHandler = new ControlLoopElementHandler();
+        intermediaryApi.registerControlLoopElementListener(controlLoopElementHandler);
+    }
+
+    @Override
+    public void close() throws IOException {
+        intermediaryApi.close();
+    }
+}
diff --git a/participant/participant-impl/participant-impl-policy/src/main/java/org/onap/policy/clamp/controlloop/participant/policy/main/parameters/ParticipantPolicyParameterHandler.java b/participant/participant-impl/participant-impl-policy/src/main/java/org/onap/policy/clamp/controlloop/participant/policy/main/parameters/ParticipantPolicyParameterHandler.java
new file mode 100644
index 0000000..98cea82
--- /dev/null
+++ b/participant/participant-impl/participant-impl-policy/src/main/java/org/onap/policy/clamp/controlloop/participant/policy/main/parameters/ParticipantPolicyParameterHandler.java
@@ -0,0 +1,79 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.policy.main.parameters;
+
+import java.io.File;
+import javax.ws.rs.core.Response;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopException;
+import org.onap.policy.clamp.controlloop.participant.policy.main.startstop.ParticipantPolicyCommandLineArguments;
+import org.onap.policy.common.parameters.ValidationResult;
+import org.onap.policy.common.utils.coder.Coder;
+import org.onap.policy.common.utils.coder.CoderException;
+import org.onap.policy.common.utils.coder.StandardCoder;
+
+/**
+ * This class handles reading, parsing and validating of policy participant parameters from JSON files.
+ */
+public class ParticipantPolicyParameterHandler {
+
+    private static final Coder CODER = new StandardCoder();
+
+    /**
+     * Read the parameters from the parameter file.
+     *
+     * @param arguments the arguments passed to policy
+     * @return the parameters read from the configuration file
+     * @throws ControlLoopException on parameter exceptions
+     */
+    public ParticipantPolicyParameters getParameters(final ParticipantPolicyCommandLineArguments arguments)
+            throws ControlLoopException {
+        ParticipantPolicyParameters parameters = null;
+
+        // Read the parameters
+        try {
+            // Read the parameters from JSON
+            File file = new File(arguments.getFullConfigurationFilePath());
+            parameters = CODER.decode(file, ParticipantPolicyParameters.class);
+        } catch (final CoderException e) {
+            final String errorMessage = "error reading parameters from \"" + arguments.getConfigurationFilePath()
+                    + "\"\n" + "(" + e.getClass().getSimpleName() + ")";
+            throw new ControlLoopException(Response.Status.NOT_ACCEPTABLE, errorMessage, e);
+        }
+
+        // The JSON processing returns null if there is an empty file
+        if (parameters == null) {
+            final String errorMessage = "no parameters found in \"" + arguments.getConfigurationFilePath() + "\"";
+            throw new ControlLoopException(Response.Status.NOT_ACCEPTABLE, errorMessage);
+        }
+
+        // validate the parameters
+        final ValidationResult validationResult = parameters.validate();
+        if (!validationResult.isValid()) {
+            String returnMessage =
+                    "validation error(s) on parameters from \"" + arguments.getConfigurationFilePath() + "\"\n";
+            returnMessage += validationResult.getResult();
+
+            throw new ControlLoopException(Response.Status.NOT_ACCEPTABLE, returnMessage);
+        }
+
+        return parameters;
+    }
+}
diff --git a/participant/participant-impl/participant-impl-policy/src/main/java/org/onap/policy/clamp/controlloop/participant/policy/main/parameters/ParticipantPolicyParameters.java b/participant/participant-impl/participant-impl-policy/src/main/java/org/onap/policy/clamp/controlloop/participant/policy/main/parameters/ParticipantPolicyParameters.java
new file mode 100644
index 0000000..13d89fa
--- /dev/null
+++ b/participant/participant-impl/participant-impl-policy/src/main/java/org/onap/policy/clamp/controlloop/participant/policy/main/parameters/ParticipantPolicyParameters.java
@@ -0,0 +1,49 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.policy.main.parameters;
+
+import javax.validation.constraints.NotBlank;
+import lombok.Getter;
+import org.onap.policy.clamp.controlloop.participant.intermediary.parameters.ParticipantIntermediaryParameters;
+import org.onap.policy.common.parameters.ParameterGroupImpl;
+import org.onap.policy.common.parameters.annotations.NotNull;
+import org.onap.policy.models.provider.PolicyModelsProviderParameters;
+
+/**
+ * Class to hold all parameters needed for the policy participant.
+ *
+ */
+@NotNull
+@NotBlank
+@Getter
+public class ParticipantPolicyParameters extends ParameterGroupImpl {
+    private ParticipantIntermediaryParameters intermediaryParameters;
+    private PolicyModelsProviderParameters databaseProviderParameters;
+
+    /**
+     * Create the policy participant parameter group.
+     *
+     * @param name the parameter group name
+     */
+    public ParticipantPolicyParameters(final String name) {
+        super(name);
+    }
+}
diff --git a/participant/participant-impl/participant-impl-policy/src/main/java/org/onap/policy/clamp/controlloop/participant/policy/main/startstop/Main.java b/participant/participant-impl/participant-impl-policy/src/main/java/org/onap/policy/clamp/controlloop/participant/policy/main/startstop/Main.java
new file mode 100644
index 0000000..9a6bfdf
--- /dev/null
+++ b/participant/participant-impl/participant-impl-policy/src/main/java/org/onap/policy/clamp/controlloop/participant/policy/main/startstop/Main.java
@@ -0,0 +1,141 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.participant.policy.main.startstop;
+
+import java.util.Arrays;
+import javax.ws.rs.core.Response;
+import lombok.Getter;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopException;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopRuntimeException;
+import org.onap.policy.clamp.controlloop.participant.policy.main.parameters.ParticipantPolicyParameterHandler;
+import org.onap.policy.clamp.controlloop.participant.policy.main.parameters.ParticipantPolicyParameters;
+import org.onap.policy.common.utils.resources.MessageConstants;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * This class initiates Policy Participant.
+ */
+public class Main {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(Main.class);
+
+    private ParticipantPolicyActivator activator;
+
+    @Getter
+    private ParticipantPolicyParameters parameterGroup;
+
+    /**
+     * Instantiates policy participant.
+     *
+     * @param args the command line arguments
+     */
+    public Main(final String[] args) {
+        final String argumentString = Arrays.toString(args);
+        LOGGER.info("Starting the control loop participant service with arguments - {}", argumentString);
+
+        // Check the arguments
+        final ParticipantPolicyCommandLineArguments arguments = new ParticipantPolicyCommandLineArguments();
+        try {
+            // The arguments return a string if there is a message to print and we should exit
+            final String argumentMessage = arguments.parse(args);
+            if (argumentMessage != null) {
+                LOGGER.info(argumentMessage);
+                return;
+            }
+            // Validate that the arguments are sane
+            arguments.validate();
+
+            // Read the parameters
+            parameterGroup = new ParticipantPolicyParameterHandler().getParameters(arguments);
+
+            // Now, create the activator for the service
+            activator = new ParticipantPolicyActivator(parameterGroup);
+
+            // Start the activator
+            activator.start();
+        } catch (Exception exp) {
+            throw new ControlLoopRuntimeException(Response.Status.BAD_REQUEST,
+                String.format(MessageConstants.START_FAILURE_MSG, MessageConstants.POLICY_CLAMP), exp);
+        }
+
+        // Add a shutdown hook to shut everything down in an orderly manner
+        Runtime.getRuntime().addShutdownHook(new ClRuntimeShutdownHookClass());
+        String successMsg = String.format(MessageConstants.START_SUCCESS_MSG, MessageConstants.POLICY_CLAMP);
+        LOGGER.info(successMsg);
+    }
+
+    /**
+     * Check if main is running.
+     */
+    public boolean isRunning() {
+        return activator != null && activator.isAlive();
+    }
+
+    /**
+     * Shut down Execution.
+     *
+     * @throws ControlLoopException on shutdown errors
+     */
+    public void shutdown() throws ControlLoopException {
+        // clear the parameterGroup variable
+        parameterGroup = null;
+
+        // clear the cl participant activator
+        if (activator != null) {
+            activator.stop();
+        }
+    }
+
+    /**
+     * The Class ClRuntimeShutdownHookClass terminates the policy participant
+     * when its run method is called.
+     */
+    private class ClRuntimeShutdownHookClass extends Thread {
+        /*
+         * (non-Javadoc)
+         *
+         * @see java.lang.Runnable#run()
+         */
+        @Override
+        public void run() {
+            try {
+                // Shutdown the control loop participant service and wait for everything to stop
+                shutdown();
+            } catch (final RuntimeException | ControlLoopException e) {
+                LOGGER.warn("error occured during shut down of the policy participant", e);
+            }
+        }
+    }
+
+    /**
+     * The main method.
+     *
+     * @param args the arguments
+     */
+    public static void main(final String[] args) {      // NOSONAR
+        /*
+         * NOTE: arguments are validated by the constructor, thus sonar is disabled.
+         */
+
+        new Main(args);
+    }
+}
diff --git a/participant/participant-impl/participant-impl-policy/src/main/java/org/onap/policy/clamp/controlloop/participant/policy/main/startstop/ParticipantPolicyActivator.java b/participant/participant-impl/participant-impl-policy/src/main/java/org/onap/policy/clamp/controlloop/participant/policy/main/startstop/ParticipantPolicyActivator.java
new file mode 100644
index 0000000..760f826
--- /dev/null
+++ b/participant/participant-impl/participant-impl-policy/src/main/java/org/onap/policy/clamp/controlloop/participant/policy/main/startstop/ParticipantPolicyActivator.java
@@ -0,0 +1,57 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.policy.main.startstop;
+
+import java.util.concurrent.atomic.AtomicReference;
+import lombok.Getter;
+import org.onap.policy.clamp.controlloop.participant.policy.main.handler.PolicyHandler;
+import org.onap.policy.clamp.controlloop.participant.policy.main.parameters.ParticipantPolicyParameters;
+import org.onap.policy.common.utils.services.ServiceManagerContainer;
+
+/**
+ * This class activates the policy participant.
+ *
+ */
+public class ParticipantPolicyActivator extends ServiceManagerContainer {
+    @Getter
+    private final ParticipantPolicyParameters parameters;
+
+    /**
+     * Instantiate the activator for the policy participant.
+     *
+     * @param parameters the parameters for the policy participant
+     */
+    public ParticipantPolicyActivator(final ParticipantPolicyParameters parameters) {
+        this.parameters = parameters;
+
+        final AtomicReference<PolicyHandler> policyHandler = new AtomicReference<>();
+
+        // @formatter:off
+        addAction("Policy Handler",
+            () -> policyHandler.set(new PolicyHandler(parameters)),
+            () -> policyHandler.get().close());
+
+        addAction("Policy Providers",
+            () -> policyHandler.get().startProviders(),
+            () -> policyHandler.get().stopProviders());
+        // @formatter:on
+    }
+}
diff --git a/participant/participant-impl/participant-impl-policy/src/main/java/org/onap/policy/clamp/controlloop/participant/policy/main/startstop/ParticipantPolicyCommandLineArguments.java b/participant/participant-impl/participant-impl-policy/src/main/java/org/onap/policy/clamp/controlloop/participant/policy/main/startstop/ParticipantPolicyCommandLineArguments.java
new file mode 100644
index 0000000..af7a189
--- /dev/null
+++ b/participant/participant-impl/participant-impl-policy/src/main/java/org/onap/policy/clamp/controlloop/participant/policy/main/startstop/ParticipantPolicyCommandLineArguments.java
@@ -0,0 +1,145 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.policy.main.startstop;
+
+import java.util.Arrays;
+import javax.ws.rs.core.Response;
+import lombok.Getter;
+import lombok.Setter;
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.DefaultParser;
+import org.apache.commons.cli.Options;
+import org.apache.commons.cli.ParseException;
+import org.apache.commons.lang3.StringUtils;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopException;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopRuntimeException;
+import org.onap.policy.clamp.controlloop.common.startstop.CommonCommandLineArguments;
+import org.onap.policy.common.utils.resources.ResourceUtils;
+
+/**
+ * This class reads and handles command line parameters for the policy participant.
+ *
+ */
+public class ParticipantPolicyCommandLineArguments {
+    private static final String FILE_MESSAGE_PREAMBLE = " file \"";
+    private static final int HELP_LINE_LENGTH = 120;
+
+    private final Options options;
+    private final CommonCommandLineArguments commonCommandLineArguments;
+
+    @Getter()
+    @Setter()
+    private String configurationFilePath = null;
+
+    /**
+     * Construct the options for the policy participant.
+     */
+    public ParticipantPolicyCommandLineArguments() {
+        options = new Options();
+        commonCommandLineArguments = new CommonCommandLineArguments(options);
+    }
+
+    /**
+     * Construct the options for the CLI editor and parse in the given arguments.
+     *
+     * @param args The command line arguments
+     */
+    public ParticipantPolicyCommandLineArguments(final String[] args) {
+        // Set up the options with the default constructor
+        this();
+
+        // Parse the arguments
+        try {
+            parse(args);
+        } catch (final ControlLoopException e) {
+            throw new ControlLoopRuntimeException(Response.Status.NOT_ACCEPTABLE,
+                    "parse error on policy participant parameters", e);
+        }
+    }
+
+    /**
+     * Parse the command line options.
+     *
+     * @param args The command line arguments
+     * @return a string with a message for help and version, or null if there is no message
+     * @throws ControlLoopException on command argument errors
+     */
+    public String parse(final String[] args) throws ControlLoopException {
+        // Clear all our arguments
+        setConfigurationFilePath(null);
+        CommandLine commandLine = null;
+        try {
+            commandLine = new DefaultParser().parse(options, args);
+        } catch (final ParseException e) {
+            throw new ControlLoopException(Response.Status.NOT_ACCEPTABLE,
+                    "invalid command line arguments specified : " + e.getMessage());
+        }
+
+        // Arguments left over after Commons CLI does its stuff
+        final String[] remainingArgs = commandLine.getArgs();
+
+        if (remainingArgs.length > 0) {
+            throw new ControlLoopException(Response.Status.NOT_ACCEPTABLE,
+                    "too many command line arguments specified : " + Arrays.toString(args));
+        }
+
+        if (commandLine.hasOption('h')) {
+            return commonCommandLineArguments.help(Main.class.getName(), options);
+        }
+
+        if (commandLine.hasOption('v')) {
+            return commonCommandLineArguments.version();
+        }
+
+        if (commandLine.hasOption('c')) {
+            setConfigurationFilePath(commandLine.getOptionValue('c'));
+        }
+
+        return null;
+    }
+
+    /**
+     * Validate the command line options.
+     *
+     * @throws ControlLoopException on command argument validation errors
+     */
+    public void validate() throws ControlLoopException {
+        commonCommandLineArguments.validate(configurationFilePath);
+    }
+
+    /**
+     * Gets the full expanded configuration file path.
+     *
+     * @return the configuration file path
+     */
+    public String getFullConfigurationFilePath() {
+        return ResourceUtils.getFilePath4Resource(getConfigurationFilePath());
+    }
+
+    /**
+     * Check set configuration file path.
+     *
+     * @return true, if check set configuration file path
+     */
+    public boolean checkSetConfigurationFilePath() {
+        return !StringUtils.isEmpty(configurationFilePath);
+    }
+}
diff --git a/participant/participant-impl/participant-impl-policy/src/main/resources/META-INF/persistence.xml b/participant/participant-impl/participant-impl-policy/src/main/resources/META-INF/persistence.xml
new file mode 100644
index 0000000..46db712
--- /dev/null
+++ b/participant/participant-impl/participant-impl-policy/src/main/resources/META-INF/persistence.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ============LICENSE_START=======================================================
+   Copyright (C) 2021 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=========================================================
+-->
+<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
+    <persistence-unit name="ToscaConceptTest" transaction-type="RESOURCE_LOCAL">
+        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
+
+        <class>org.onap.policy.models.base.PfConceptKey</class>
+        <class>org.onap.policy.models.dao.converters.CDataConditioner</class>
+        <class>org.onap.policy.models.dao.converters.Uuid2String</class>
+        <class>org.onap.policy.models.pdp.persistence.concepts.JpaPdp</class>
+        <class>org.onap.policy.models.pdp.persistence.concepts.JpaPdpGroup</class>
+        <class>org.onap.policy.models.pdp.persistence.concepts.JpaPdpStatistics</class>
+        <class>org.onap.policy.models.pdp.persistence.concepts.JpaPdpSubGroup</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaCapabilityAssignment</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaCapabilityAssignments</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaCapabilityType</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaCapabilityTypes</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaDataType</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaDataTypes</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeTemplate</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeTemplates</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeType</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeTypes</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaParameter</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicies</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicy</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicyType</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicyTypes</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaProperty</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaRelationshipType</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaRelationshipTypes</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaRequirement</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaRequirements</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaServiceTemplate</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaTopologyTemplate</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaTrigger</class>
+        <class>org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaControlLoop</class>
+        <class>org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaControlLoopElement</class>
+        <class>org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaParticipant</class>
+        <class>org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaParticipantStatistics</class>
+        <class>org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaClElementStatistics</class>
+        <properties>
+            <property name="eclipselink.ddl-generation" value="drop-and-create-tables" />
+            <property name="eclipselink.ddl-generation.output-mode" value="database" />
+            <property name="eclipselink.logging.level" value="INFO" />
+
+            <!-- property name="eclipselink.logging.level" value="ALL" />
+            <property name="eclipselink.logging.level.jpa" value="ALL" />
+            <property name="eclipselink.logging.level.ddl" value="ALL" />
+            <property name="eclipselink.logging.level.connection" value="ALL" />
+            <property name="eclipselink.logging.level.sql" value="ALL" />
+            <property name="eclipselink.logging.level.transaction" value="ALL" />
+            <property name="eclipselink.logging.level.sequencing" value="ALL" />
+            <property name="eclipselink.logging.level.server" value="ALL" />
+            <property name="eclipselink.logging.level.query" value="ALL" />
+            <property name="eclipselink.logging.level.properties" value="ALL" /-->
+        </properties>
+        <shared-cache-mode>NONE</shared-cache-mode>
+    </persistence-unit>
+</persistence>
+
diff --git a/participant/participant-impl/participant-impl-policy/src/main/resources/config/PolicyParticipantConfig.json b/participant/participant-impl/participant-impl-policy/src/main/resources/config/PolicyParticipantConfig.json
new file mode 100644
index 0000000..e6b3c8e
--- /dev/null
+++ b/participant/participant-impl/participant-impl-policy/src/main/resources/config/PolicyParticipantConfig.json
@@ -0,0 +1,31 @@
+{
+    "name":"ParticipantParameterGroup",
+    "participantStatusParameters":{
+        "timeIntervalMs":10000,
+        "description":"Participant Status",
+        "participantId":{
+            "name": "PolicyParticipant0",
+            "version":"1.0.0"
+        },
+        "participantType":{
+            "name": "org.onap.policy.controlloop.PolicyControlLoopParticipant",
+            "version":"2.3.1"
+        },
+        "participantDefinition":{
+            "name": "org.onap.policy.controlloop.PolicyControlLoopParticipant",
+            "version":"2.3.1"
+        }
+    },
+    "topicParameterGroup": {
+        "topicSources" : [{
+            "topic" : "POLICY-CLRUNTIME-PARTICIPANT",
+            "servers" : [ "127.0.0.1:3904" ],
+            "topicCommInfrastructure" : "dmaap"
+        }],
+        "topicSinks" : [{
+            "topic" : "POLICY-CLRUNTIME-PARTICIPANT",
+            "servers" : [ "127.0.0.1:3904" ],
+            "topicCommInfrastructure" : "dmaap"
+        }]
+    }
+}
diff --git a/participant/participant-impl/participant-impl-policy/src/main/resources/version.txt b/participant/participant-impl/participant-impl-policy/src/main/resources/version.txt
new file mode 100644
index 0000000..dbd6758
--- /dev/null
+++ b/participant/participant-impl/participant-impl-policy/src/main/resources/version.txt
@@ -0,0 +1,4 @@
+ONAP Tosca defined control loop Participant
+Version: ${project.version}
+Built (UTC): ${maven.build.timestamp}
+ONAP https://wiki.onap.org
diff --git a/participant/participant-impl/participant-impl-policy/src/test/java/org/onap/policy/clamp/controlloop/participant/policy/main/handler/TestPolicyHandler.java b/participant/participant-impl/participant-impl-policy/src/test/java/org/onap/policy/clamp/controlloop/participant/policy/main/handler/TestPolicyHandler.java
new file mode 100644
index 0000000..abc3e71
--- /dev/null
+++ b/participant/participant-impl/participant-impl-policy/src/test/java/org/onap/policy/clamp/controlloop/participant/policy/main/handler/TestPolicyHandler.java
@@ -0,0 +1,134 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.policy.main.handler;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.onap.policy.clamp.controlloop.common.ControlLoopConstants;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopOrderedState;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantControlLoopStateChange;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantControlLoopUpdate;
+import org.onap.policy.clamp.controlloop.participant.intermediary.comm.ControlLoopStateChangeListener;
+import org.onap.policy.clamp.controlloop.participant.intermediary.comm.ControlLoopUpdateListener;
+import org.onap.policy.clamp.controlloop.participant.policy.main.parameters.CommonTestData;
+import org.onap.policy.clamp.controlloop.participant.policy.main.startstop.Main;
+import org.onap.policy.clamp.controlloop.participant.policy.main.startstop.ParticipantPolicyActivator;
+import org.onap.policy.clamp.controlloop.participant.policy.main.utils.TestListenerUtils;
+import org.onap.policy.common.endpoints.event.comm.Topic.CommInfrastructure;
+import org.onap.policy.common.utils.services.Registry;
+
+public class TestPolicyHandler {
+
+    private static ControlLoopUpdateListener clUpdateListener;
+    private ControlLoopStateChangeListener clStateChangeListener;
+    private static ParticipantControlLoopUpdate participantControlLoopUpdateMsg;
+    private ParticipantControlLoopStateChange participantControlLoopStateChangeMsg;
+    private static final String PARTICIPANTS_ENDPOINT = "participants";
+    private static final String ELEMENTS_ENDPOINT = "elements";
+    private static final CommInfrastructure INFRA = CommInfrastructure.NOOP;
+    private static final String TOPIC = "my-topic";
+    private static final Object lockit = new Object();
+    static CommonTestData commonTestData = new CommonTestData();
+
+    /**
+     * Setup before class, instantiate Main.
+     *
+     */
+    @BeforeClass
+    public static void setUpBeforeClass() throws Exception {
+        Registry.newRegistry();
+        final String[] configParameters = {"-c", "src/test/resources/parameters/TestParameters.json"};
+        Main main = new Main(configParameters);
+        assertTrue(main.isRunning());
+        TestListenerUtils.initParticipantHandler();
+
+        clUpdateListener = new ControlLoopUpdateListener(
+                PolicyHandler.getInstance()
+                .getPolicyProvider()
+                .getIntermediaryApi()
+                .getParticipantHandler());
+        participantControlLoopUpdateMsg =
+                TestListenerUtils.createControlLoopUpdateMsg();
+        participantControlLoopUpdateMsg.getControlLoop().setOrderedState(ControlLoopOrderedState.PASSIVE);
+    }
+
+    @Test
+    public void testUpdatePolicyTypes() throws Exception {
+        // Verify that the ToscaServicetemplate has policy_types
+        assertNotNull(participantControlLoopUpdateMsg.getControlLoopDefinition().getPolicyTypes());
+
+        synchronized (lockit) {
+            clUpdateListener.onTopicEvent(INFRA, TOPIC, null, participantControlLoopUpdateMsg);
+        }
+        // Verify the result of GET participants with what is stored
+        assertEquals("org.onap.PM_Policy",
+                TestListenerUtils.getParticipantHandler().getParticipantId().getName());
+    }
+
+    @Test
+    public void testUpdatePolicies() throws Exception {
+        // Add policies to the toscaServiceTemplate
+        TestListenerUtils.addPoliciesToToscaServiceTemplate(participantControlLoopUpdateMsg.getControlLoopDefinition());
+
+        // Verify that the ToscaServicetemplate has policies
+        assertNotNull(participantControlLoopUpdateMsg.getControlLoopDefinition()
+                .getToscaTopologyTemplate().getPolicies());
+
+        synchronized (lockit) {
+            clUpdateListener.onTopicEvent(INFRA, TOPIC, null, participantControlLoopUpdateMsg);
+        }
+        // Verify the result of GET participants with what is stored
+        assertEquals("org.onap.PM_Policy",
+                TestListenerUtils.getParticipantHandler().getParticipantId().getName());
+    }
+
+    @Test
+    public void testDeletePoliciesAndPolicyTypes() throws Exception {
+        // Add policies to the toscaServiceTemplate
+        TestListenerUtils.addPoliciesToToscaServiceTemplate(participantControlLoopUpdateMsg.getControlLoopDefinition());
+
+        // Verify that the ToscaServicetemplate has policies
+        assertNotNull(participantControlLoopUpdateMsg.getControlLoopDefinition()
+                .getToscaTopologyTemplate().getPolicies());
+
+        synchronized (lockit) {
+            clUpdateListener.onTopicEvent(INFRA, TOPIC, null, participantControlLoopUpdateMsg);
+        }
+        // Verify the result of GET participants with what is stored
+        assertEquals("org.onap.PM_Policy",
+                TestListenerUtils.getParticipantHandler().getParticipantId().getName());
+
+        clStateChangeListener = new ControlLoopStateChangeListener(TestListenerUtils.getParticipantHandler());
+        participantControlLoopStateChangeMsg =
+                TestListenerUtils.createControlLoopStateChangeMsg(ControlLoopOrderedState.UNINITIALISED);
+        participantControlLoopStateChangeMsg.setOrderedState(ControlLoopOrderedState.UNINITIALISED);
+        clStateChangeListener.onTopicEvent(INFRA, TOPIC, null, participantControlLoopStateChangeMsg);
+
+        // Verify the result of GET participants with what is stored
+        assertEquals("org.onap.PM_Policy",
+                TestListenerUtils.getParticipantHandler().getParticipantId().getName());
+    }
+}
diff --git a/participant/participant-impl/participant-impl-policy/src/test/java/org/onap/policy/clamp/controlloop/participant/policy/main/parameters/CommonTestData.java b/participant/participant-impl/participant-impl-policy/src/test/java/org/onap/policy/clamp/controlloop/participant/policy/main/parameters/CommonTestData.java
new file mode 100644
index 0000000..e3d7e3a
--- /dev/null
+++ b/participant/participant-impl/participant-impl-policy/src/test/java/org/onap/policy/clamp/controlloop/participant/policy/main/parameters/CommonTestData.java
@@ -0,0 +1,221 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.policy.main.parameters;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+import javax.ws.rs.core.Response;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopRuntimeException;
+import org.onap.policy.common.endpoints.parameters.TopicParameters;
+import org.onap.policy.common.parameters.ParameterGroup;
+import org.onap.policy.common.utils.coder.Coder;
+import org.onap.policy.common.utils.coder.CoderException;
+import org.onap.policy.common.utils.coder.StandardCoder;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+/**
+ * Class to hold/create all parameters for test cases.
+ */
+public class CommonTestData {
+    public static final String PARTICIPANT_GROUP_NAME = "ControlLoopParticipantGroup";
+    public static final String DESCRIPTION = "Participant description";
+    public static final long TIME_INTERVAL = 2000;
+    public static final List<TopicParameters> TOPIC_PARAMS = Arrays.asList(getTopicParams());
+
+    public static final Coder coder = new StandardCoder();
+
+    /**
+     * Converts the contents of a map to a parameter class.
+     *
+     * @param source property map
+     * @param clazz class of object to be created from the map
+     * @return a new object represented by the map
+     */
+    public <T extends ParameterGroup> T toObject(final Map<String, Object> source, final Class<T> clazz) {
+        try {
+            return coder.convert(source, clazz);
+        } catch (final CoderException e) {
+            throw new RuntimeException("cannot create " + clazz.getName() + " from map", e);
+        }
+    }
+
+    /**
+     * Returns a property map for a ParticipantPolicyParameters map for test cases.
+     *
+     * @param name name of the parameters
+     *
+     * @return a property map suitable for constructing an object
+     */
+    public Map<String, Object> getParticipantPolicyParametersMap(final String name) {
+        final Map<String, Object> map = new TreeMap<>();
+
+        map.put("name", name);
+        map.put("intermediaryParameters", getIntermediaryParametersMap(false));
+        map.put("databaseProviderParameters", getDatabaseProviderParametersMap(false));
+        return map;
+    }
+
+    /**
+     * Returns a property map for a databaseProviderParameters map for test cases.
+     *
+     * @param isEmpty boolean value to represent that object created should be empty or not
+     * @return a property map suitable for constructing an object
+     */
+    public Map<String, Object> getDatabaseProviderParametersMap(final boolean isEmpty) {
+        final Map<String, Object> map = new TreeMap<>();
+        if (!isEmpty) {
+            map.put("name", "PolicyProviderParameterGroup");
+            map.put("implementation", "org.onap.policy.models.provider.impl.DatabasePolicyModelsProviderImpl");
+            map.put("databaseDriver", "org.h2.Driver");
+            map.put("databaseUrl", "jdbc:h2:mem:testdb");
+            map.put("databaseUser", "policy");
+            map.put("databasePassword", "P01icY");
+            map.put("persistenceUnit", "ToscaConceptTest");
+        }
+
+        return map;
+    }
+
+    /**
+     * Returns a property map for a intermediaryParameters map for test cases.
+     *
+     * @param isEmpty boolean value to represent that object created should be empty or not
+     * @return a property map suitable for constructing an object
+     */
+    public Map<String, Object> getIntermediaryParametersMap(final boolean isEmpty) {
+        final Map<String, Object> map = new TreeMap<>();
+        if (!isEmpty) {
+            map.put("name", "Participant parameters");
+            map.put("reportingTimeInterval", TIME_INTERVAL);
+            map.put("description", DESCRIPTION);
+            map.put("participantId", getParticipantId());
+            map.put("participantType", getParticipantId());
+            map.put("clampControlLoopTopics", getTopicParametersMap(false));
+        }
+
+        return map;
+    }
+
+    /**
+     * Returns a property map for a TopicParameters map for test cases.
+     *
+     * @param isEmpty boolean value to represent that object created should be empty or not
+     * @return a property map suitable for constructing an object
+     */
+    public Map<String, Object> getTopicParametersMap(final boolean isEmpty) {
+        final Map<String, Object> map = new TreeMap<>();
+        if (!isEmpty) {
+            map.put("topicSources", TOPIC_PARAMS);
+            map.put("topicSinks", TOPIC_PARAMS);
+        }
+        return map;
+    }
+
+    /**
+     * Returns topic parameters for test cases.
+     *
+     * @return topic parameters
+     */
+    public static TopicParameters getTopicParams() {
+        final TopicParameters topicParams = new TopicParameters();
+        topicParams.setTopic("POLICY-CLRUNTIME-PARTICIPANT");
+        topicParams.setTopicCommInfrastructure("dmaap");
+        topicParams.setServers(Arrays.asList("localhost"));
+        return topicParams;
+    }
+
+    /**
+     * Returns participantId for test cases.
+     *
+     * @return participant Id
+     */
+    public static ToscaConceptIdentifier getParticipantId() {
+        final ToscaConceptIdentifier participantId = new ToscaConceptIdentifier("org.onap.PM_Policy", "0.0.0");
+        return participantId;
+    }
+
+    /**
+     * Gets the standard participant parameters.
+     *
+     * @param port port to be inserted into the parameters
+     * @return the standard participant parameters
+     */
+    public ParticipantPolicyParameters getParticipantPolicyParameters(int port) {
+        try {
+            return coder.decode(getParticipantPolicyParametersAsString(port), ParticipantPolicyParameters.class);
+
+        } catch (CoderException e) {
+            throw new ControlLoopRuntimeException(Response.Status.NOT_ACCEPTABLE,
+                    "cannot read participant parameters", e);
+        }
+    }
+
+    /**
+     * Gets the standard participant parameters, as a String.
+     *
+     * @param port port to be inserted into the parameters
+     * @return the standard participant parameters
+     */
+    public static String getParticipantPolicyParametersAsString(int port) {
+
+        try {
+            File file = new File(getParamFile());
+            String json = new String(Files.readAllBytes(file.toPath()), StandardCharsets.UTF_8);
+
+            json = json.replace("${port}", String.valueOf(port));
+            json = json.replace("${dbName}", "jdbc:h2:mem:testdb");
+
+            return json;
+
+        } catch (IOException e) {
+            throw new ControlLoopRuntimeException(Response.Status.NOT_ACCEPTABLE,
+                    "cannot read participant parameters", e);
+
+        }
+    }
+
+    /**
+     * Gets the full path to the parameter file, which may vary depending on whether or
+     * not this is an end-to-end test.
+     *
+     * @return the parameter file name
+     */
+    private static String getParamFile() {
+        String paramFile = "src/test/resources/parameters/TestParametersStd.json";
+        return paramFile;
+    }
+
+    /**
+     * Nulls out a field within a JSON string.
+     * @param json JSON string
+     * @param field field to be nulled out
+     * @return a new JSON string with the field nulled out
+     */
+    public String nullifyField(String json, String field) {
+        return json.replace(field + "\"", field + "\":null, \"" + field + "Xxx\"");
+    }
+}
diff --git a/participant/participant-impl/participant-impl-policy/src/test/java/org/onap/policy/clamp/controlloop/participant/policy/main/parameters/TestParticipantPolicyParameterHandler.java b/participant/participant-impl/participant-impl-policy/src/test/java/org/onap/policy/clamp/controlloop/participant/policy/main/parameters/TestParticipantPolicyParameterHandler.java
new file mode 100644
index 0000000..dd62dbf
--- /dev/null
+++ b/participant/participant-impl/participant-impl-policy/src/test/java/org/onap/policy/clamp/controlloop/participant/policy/main/parameters/TestParticipantPolicyParameterHandler.java
@@ -0,0 +1,98 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.policy.main.parameters;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.io.FileNotFoundException;
+import org.apache.commons.io.DirectoryWalker.CancelException;
+import org.junit.Test;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopException;
+import org.onap.policy.clamp.controlloop.participant.policy.main.startstop.ParticipantPolicyCommandLineArguments;
+import org.onap.policy.common.utils.coder.CoderException;
+
+public class TestParticipantPolicyParameterHandler {
+
+    @Test
+    public void testParameterHandlerNoParameterFile() throws ControlLoopException {
+        final String[] emptyArgumentString = { "-c", "src/test/resources/parameters/NoParametersFile.json" };
+
+        final ParticipantPolicyCommandLineArguments emptyArguments = new ParticipantPolicyCommandLineArguments();
+        emptyArguments.parse(emptyArgumentString);
+
+        assertThatThrownBy(() -> new ParticipantPolicyParameterHandler().getParameters(emptyArguments))
+            .hasCauseInstanceOf(CoderException.class)
+            .hasRootCauseInstanceOf(FileNotFoundException.class);
+    }
+
+    @Test
+    public void testParameterHandlerInvalidParameters() throws ControlLoopException {
+        final String[] invalidArgumentString = { "-c", "src/test/resources/parameters/InvalidParameters.json" };
+
+        final ParticipantPolicyCommandLineArguments invalidArguments =
+                new ParticipantPolicyCommandLineArguments();
+        invalidArguments.parse(invalidArgumentString);
+
+        assertThatThrownBy(() -> new ParticipantPolicyParameterHandler().getParameters(invalidArguments))
+            .hasMessageStartingWith("error reading parameters from")
+            .hasCauseInstanceOf(CoderException.class);
+    }
+
+    @Test
+    public void testParticipantPolicyParameters() throws ControlLoopException {
+        final String[] participantConfigParameters = { "-c", "src/test/resources/parameters/TestParameters.json" };
+
+        final ParticipantPolicyCommandLineArguments arguments = new ParticipantPolicyCommandLineArguments();
+        arguments.parse(participantConfigParameters);
+
+        final ParticipantPolicyParameters parGroup = new ParticipantPolicyParameterHandler()
+                .getParameters(arguments);
+        assertTrue(arguments.checkSetConfigurationFilePath());
+        assertEquals(CommonTestData.PARTICIPANT_GROUP_NAME, parGroup.getName());
+    }
+
+    @Test
+    public void testParticipantVersion() throws ControlLoopException {
+        final String[] participantConfigParameters = { "-v" };
+        final ParticipantPolicyCommandLineArguments arguments = new ParticipantPolicyCommandLineArguments();
+        final String version = arguments.parse(participantConfigParameters);
+        assertThat(arguments.parse(participantConfigParameters)).startsWith(
+                        "ONAP Tosca defined control loop Participant");
+    }
+
+    @Test
+    public void testParticipantHelp() throws ControlLoopException {
+        final String[] participantConfigParameters = { "-h" };
+        final ParticipantPolicyCommandLineArguments arguments = new ParticipantPolicyCommandLineArguments();
+        assertThat(arguments.parse(participantConfigParameters)).startsWith("usage:");
+    }
+
+    @Test
+    public void testParticipantInvalidOption() throws ControlLoopException {
+        final String[] participantConfigParameters = { "-d" };
+        final ParticipantPolicyCommandLineArguments arguments = new ParticipantPolicyCommandLineArguments();
+        assertThatThrownBy(() -> arguments.parse(participantConfigParameters))
+            .hasMessageStartingWith("invalid command line arguments specified");
+    }
+}
diff --git a/participant/participant-impl/participant-impl-policy/src/test/java/org/onap/policy/clamp/controlloop/participant/policy/main/parameters/TestParticipantPolicyParameters.java b/participant/participant-impl/participant-impl-policy/src/test/java/org/onap/policy/clamp/controlloop/participant/policy/main/parameters/TestParticipantPolicyParameters.java
new file mode 100644
index 0000000..5ffe510
--- /dev/null
+++ b/participant/participant-impl/participant-impl-policy/src/test/java/org/onap/policy/clamp/controlloop/participant/policy/main/parameters/TestParticipantPolicyParameters.java
@@ -0,0 +1,106 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.policy.main.parameters;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+
+import java.util.Map;
+import org.junit.Test;
+import org.onap.policy.common.parameters.ValidationResult;
+
+public class TestParticipantPolicyParameters {
+    CommonTestData commonTestData = new CommonTestData();
+
+    @Test
+    public void testParticipantPolicyParameters_Named() {
+        final ParticipantPolicyParameters participantParameters = new ParticipantPolicyParameters("my-name");
+        assertEquals("my-name", participantParameters.getName());
+    }
+
+    @Test
+    public void testParticipantPolicyParameters() {
+        final ParticipantPolicyParameters participantParameters = commonTestData.toObject(
+                commonTestData.getParticipantPolicyParametersMap(CommonTestData.PARTICIPANT_GROUP_NAME),
+                ParticipantPolicyParameters.class);
+        assertThat(participantParameters.validate().isValid()).isTrue();
+    }
+
+    @Test
+    public void testParticipantPolicyParameters_NullName() {
+        final ParticipantPolicyParameters participantParameters = commonTestData
+                .toObject(commonTestData.getParticipantPolicyParametersMap(null),
+                        ParticipantPolicyParameters.class);
+        final ValidationResult validationResult = participantParameters.validate();
+        assertFalse(validationResult.isValid());
+        assertEquals(null, participantParameters.getName());
+        assertThat(validationResult.getResult()).contains("is null");
+    }
+
+    @Test
+    public void testParticipantPolicyParameters_EmptyName() {
+        final ParticipantPolicyParameters participantParameters = commonTestData
+                .toObject(commonTestData.getParticipantPolicyParametersMap(""),
+                                ParticipantPolicyParameters.class);
+        final ValidationResult validationResult = participantParameters.validate();
+        assertFalse(validationResult.isValid());
+        assertEquals("", participantParameters.getName());
+        assertThat(validationResult.getResult()).contains(
+                "item \"name\" value \"\" INVALID, " + "is blank");
+    }
+
+    @Test
+    public void testParticipantPolicyParameters_SetName() {
+        final ParticipantPolicyParameters participantParameters = commonTestData.toObject(
+                commonTestData.getParticipantPolicyParametersMap(CommonTestData.PARTICIPANT_GROUP_NAME),
+                ParticipantPolicyParameters.class);
+        participantParameters.setName("ParticipantNewGroup");
+        assertThat(participantParameters.validate().isValid()).isTrue();
+        assertEquals("ParticipantNewGroup", participantParameters.getName());
+    }
+
+    @Test
+    public void testParticipantPolicyParameters_EmptyParticipantIntermediaryParameters() {
+        final Map<String, Object> map =
+                commonTestData.getParticipantPolicyParametersMap(CommonTestData.PARTICIPANT_GROUP_NAME);
+        map.replace("intermediaryParameters", commonTestData.getIntermediaryParametersMap(true));
+        final ParticipantPolicyParameters participantParameters =
+                commonTestData.toObject(map, ParticipantPolicyParameters.class);
+        final ValidationResult validationResult = participantParameters.validate();
+        assertNull(validationResult.getResult());
+    }
+
+    @Test
+    public void testParticipantPolicyParametersp_EmptyTopicParameters() {
+        final Map<String, Object> map =
+                commonTestData.getParticipantPolicyParametersMap(CommonTestData.PARTICIPANT_GROUP_NAME);
+        final Map<String, Object> intermediaryParametersMap = commonTestData.getIntermediaryParametersMap(false);
+        intermediaryParametersMap.put("clampControlLoopTopics", commonTestData.getTopicParametersMap(true));
+        map.replace("intermediaryParameters", intermediaryParametersMap);
+
+        final ParticipantPolicyParameters participantParameters =
+                commonTestData.toObject(map, ParticipantPolicyParameters.class);
+        final ValidationResult validationResult = participantParameters.validate();
+        assertNull(validationResult.getResult());
+    }
+}
diff --git a/participant/participant-impl/participant-impl-policy/src/test/java/org/onap/policy/clamp/controlloop/participant/policy/main/startstop/TestMain.java b/participant/participant-impl/participant-impl-policy/src/test/java/org/onap/policy/clamp/controlloop/participant/policy/main/startstop/TestMain.java
new file mode 100644
index 0000000..f77b678
--- /dev/null
+++ b/participant/participant-impl/participant-impl-policy/src/test/java/org/onap/policy/clamp/controlloop/participant/policy/main/startstop/TestMain.java
@@ -0,0 +1,143 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.policy.main.startstop;
+
+import static org.assertj.core.api.Assertions.assertThatCode;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.onap.policy.clamp.controlloop.common.ControlLoopConstants;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopRuntimeException;
+import org.onap.policy.common.utils.resources.MessageConstants;
+import org.onap.policy.common.utils.services.Registry;
+
+public class TestMain {
+
+    /**
+     * Set up.
+     */
+    @BeforeClass
+    public static void setUp() {
+        Registry.newRegistry();
+    }
+
+    /**
+     * Shuts "main" down.
+     *
+     * @throws Exception if an error occurs
+     */
+    @AfterClass
+    public static void tearDown() throws Exception {
+        // shut down activator
+        final ParticipantPolicyActivator activator =
+            Registry.getOrDefault(ControlLoopConstants.REG_CLRUNTIME_ACTIVATOR,
+                            ParticipantPolicyActivator.class, null);
+        if (activator != null && activator.isAlive()) {
+            activator.shutdown();
+        }
+    }
+
+    @Test
+    public void testMain_Help() {
+        final String[] configParameters = {"-h"};
+        Main main = new Main(configParameters);
+        assertFalse(main.isRunning());
+    }
+
+    @Test
+    public void testMain_Version() {
+        final String[] configParameters = {"-v"};
+        Main main = new Main(configParameters);
+        assertFalse(main.isRunning());
+    }
+
+    @Test
+    public void testMain_Valid() {
+        final String[] configParameters = {"-c", "src/test/resources/parameters/TestParameters.json"};
+        Main main = new Main(configParameters);
+        assertTrue(main.isRunning());
+
+        assertThatCode(() -> main.shutdown()).doesNotThrowAnyException();
+
+        assertFalse(main.isRunning());
+    }
+
+    @Test
+    public void testMain_NoParameter() {
+        assertThatConfigParameterThrownException(new String[] {});
+    }
+
+    @Test
+    public void testMain_FilePathNotDefined() {
+        assertThatConfigParameterThrownException(new String[] {"-c"});
+    }
+
+    @Test
+    public void testMain_TooManyCommand() {
+        assertThatConfigParameterThrownException(new String[] {"-h", "d"});
+    }
+
+    @Test
+    public void testMain_WrongParameter() {
+        assertThatConfigParameterThrownException(new String[] {"-d"});
+    }
+
+    private void assertThatConfigParameterThrownException(final String[] configParameters) {
+        assertThatThrownBy(() -> Main.main(configParameters)).isInstanceOf(ControlLoopRuntimeException.class)
+                .hasMessage(String.format(MessageConstants.START_FAILURE_MSG, MessageConstants.POLICY_CLAMP));
+    }
+
+    @Test
+    public void testParticipant_NoFileWithThisName() {
+        assertThatConfigFileThrownException("src/test/resources/parameters/NoFileWithThisName.json");
+    }
+
+    @Test
+    public void testParticipant_NotValidFile() {
+        assertThatConfigFileThrownException("src/test/resources/parameters");
+    }
+
+    @Test
+    public void testParticipant_NoParameters() {
+        assertThatConfigFileThrownException("src/test/resources/parameters/NoParameters.json");
+    }
+
+    @Test
+    public void testParticipant_InvalidParameters() {
+        assertThatConfigFileThrownException("src/test/resources/parameters/InvalidParameters.json");
+    }
+
+    @Test
+    public void testParticipant_WrongJsonFormat() {
+        assertThatConfigFileThrownException("src/test/resources/parameters/Unreadable.json");
+    }
+
+    private void assertThatConfigFileThrownException(final String configFilePath) {
+        final String[] configParameters = new String[] {"-c", configFilePath};
+        assertThatThrownBy(() -> new Main(configParameters)).isInstanceOf(ControlLoopRuntimeException.class)
+                .hasMessage(String.format(MessageConstants.START_FAILURE_MSG, MessageConstants.POLICY_CLAMP));
+    }
+}
diff --git a/participant/participant-impl/participant-impl-policy/src/test/java/org/onap/policy/clamp/controlloop/participant/policy/main/startstop/TestParticipantPolicyActivator.java b/participant/participant-impl/participant-impl-policy/src/test/java/org/onap/policy/clamp/controlloop/participant/policy/main/startstop/TestParticipantPolicyActivator.java
new file mode 100644
index 0000000..afb0f6c
--- /dev/null
+++ b/participant/participant-impl/participant-impl-policy/src/test/java/org/onap/policy/clamp/controlloop/participant/policy/main/startstop/TestParticipantPolicyActivator.java
@@ -0,0 +1,88 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.policy.main.startstop;
+
+import static org.assertj.core.api.Assertions.assertThatIllegalStateException;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.onap.policy.clamp.controlloop.participant.policy.main.parameters.CommonTestData;
+import org.onap.policy.clamp.controlloop.participant.policy.main.parameters.ParticipantPolicyParameterHandler;
+import org.onap.policy.clamp.controlloop.participant.policy.main.parameters.ParticipantPolicyParameters;
+import org.onap.policy.common.utils.services.Registry;
+
+public class TestParticipantPolicyActivator {
+
+    private static ParticipantPolicyActivator activator;
+
+    /**
+     * Initializes an activator.
+     *
+     * @throws Exception if an error occurs
+     */
+    @BeforeClass
+    public static void setUp() throws Exception {
+        Registry.newRegistry();
+        final String[] participantConfigParameters = { "-c", "src/test/resources/parameters/TestParameters.json"};
+        final ParticipantPolicyCommandLineArguments arguments =
+                new ParticipantPolicyCommandLineArguments(participantConfigParameters);
+        final ParticipantPolicyParameters parGroup =
+                new ParticipantPolicyParameterHandler().getParameters(arguments);
+        activator = new ParticipantPolicyActivator(parGroup);
+    }
+
+    /**
+     * Method for cleanup after each test.
+     *
+     * @throws Exception if an error occurs
+     */
+    @AfterClass
+    public static void teardown() throws Exception {
+        // shut down activator
+        if (activator != null && activator.isAlive()) {
+            activator.shutdown();
+        }
+    }
+
+    @Test
+    public void testParticipantActivator() {
+        activator.start();
+        assertTrue(activator.isAlive());
+        assertTrue(activator.getParameters().isValid());
+        assertEquals(CommonTestData.PARTICIPANT_GROUP_NAME, activator.getParameters().getName());
+
+        // repeat - should throw an exception
+        assertThatIllegalStateException().isThrownBy(() -> activator.start());
+        assertTrue(activator.isAlive());
+        assertTrue(activator.getParameters().isValid());
+
+        activator.shutdown();
+        assertFalse(activator.isAlive());
+
+        // repeat - should throw an exception
+        assertThatIllegalStateException().isThrownBy(() -> activator.shutdown());
+        assertFalse(activator.isAlive());
+    }
+}
diff --git a/participant/participant-impl/participant-impl-policy/src/test/java/org/onap/policy/clamp/controlloop/participant/policy/main/utils/TestListenerUtils.java b/participant/participant-impl/participant-impl-policy/src/test/java/org/onap/policy/clamp/controlloop/participant/policy/main/utils/TestListenerUtils.java
new file mode 100644
index 0000000..4f3d6d6
--- /dev/null
+++ b/participant/participant-impl/participant-impl-policy/src/test/java/org/onap/policy/clamp/controlloop/participant/policy/main/utils/TestListenerUtils.java
@@ -0,0 +1,343 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.policy.main.utils;
+
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.time.Instant;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+import lombok.Getter;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoop;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopElement;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopOrderedState;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopState;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantState;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantControlLoopStateChange;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantControlLoopUpdate;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantHealthCheck;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantStateChange;
+import org.onap.policy.clamp.controlloop.participant.intermediary.handler.ParticipantHandler;
+import org.onap.policy.clamp.controlloop.participant.policy.main.handler.PolicyProvider;
+import org.onap.policy.clamp.controlloop.participant.policy.main.parameters.CommonTestData;
+import org.onap.policy.clamp.controlloop.participant.policy.main.parameters.ParticipantPolicyParameters;
+import org.onap.policy.common.utils.coder.Coder;
+import org.onap.policy.common.utils.coder.CoderException;
+import org.onap.policy.common.utils.coder.StandardCoder;
+import org.onap.policy.common.utils.coder.YamlJsonTranslator;
+import org.onap.policy.common.utils.resources.ResourceUtils;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class TestListenerUtils {
+
+    private static final YamlJsonTranslator yamlTranslator = new YamlJsonTranslator();
+    private static final Coder CODER = new StandardCoder();
+    static CommonTestData commonTestData = new CommonTestData();
+    private static final Logger LOGGER = LoggerFactory.getLogger(TestListenerUtils.class);
+
+    @Getter
+    private static ParticipantHandler participantHandler;
+
+    private TestListenerUtils() {}
+
+    /**
+     * Method to initialize participantHandler.
+     */
+    public static void initParticipantHandler() {
+
+        final ParticipantPolicyParameters participantParameters = commonTestData.toObject(
+                commonTestData.getParticipantPolicyParametersMap(CommonTestData.PARTICIPANT_GROUP_NAME),
+                ParticipantPolicyParameters.class);
+
+        PolicyProvider policyProvider =
+                new PolicyProvider(participantParameters.getIntermediaryParameters());
+
+        participantHandler = policyProvider.getIntermediaryApi().getParticipantHandler();
+    }
+
+    /**
+     * Method to create a controlLoop from a yaml file.
+     *
+     * @return ControlLoop controlloop
+     */
+    public static ControlLoop createControlLoop() {
+        ControlLoop controlLoop = new ControlLoop();
+        Map<UUID, ControlLoopElement> elements = new LinkedHashMap<>();
+        ToscaServiceTemplate toscaServiceTemplate = testControlLoopRead();
+        Map<String, ToscaNodeTemplate> nodeTemplatesMap =
+                toscaServiceTemplate.getToscaTopologyTemplate().getNodeTemplates();
+        for (Map.Entry<String, ToscaNodeTemplate> toscaInputEntry : nodeTemplatesMap.entrySet()) {
+            ControlLoopElement clElement = new ControlLoopElement();
+            clElement.setId(UUID.randomUUID());
+
+            ToscaConceptIdentifier clElementParticipantId = new ToscaConceptIdentifier();
+            clElementParticipantId.setName(toscaInputEntry.getKey());
+            clElementParticipantId.setVersion(toscaInputEntry.getValue().getVersion());
+            clElement.setParticipantId(clElementParticipantId);
+
+            clElement.setDefinition(clElementParticipantId);
+            clElement.setState(ControlLoopState.UNINITIALISED);
+            clElement.setDescription(toscaInputEntry.getValue().getDescription());
+            clElement.setOrderedState(ControlLoopOrderedState.UNINITIALISED);
+            elements.put(clElement.getId(), clElement);
+        }
+        controlLoop.setElements(elements);
+        controlLoop.setName("PMSHInstance0");
+        controlLoop.setVersion("1.0.0");
+
+        ToscaConceptIdentifier definition = new ToscaConceptIdentifier();
+        definition.setName("PMSHInstance0");
+        definition.setVersion("1.0.0");
+        controlLoop.setDefinition(definition);
+
+        return controlLoop;
+    }
+
+    /**
+     * Method to create ParticipantStateChange message from the arguments passed.
+     *
+     * @param participantState participant State
+     *
+     * @return ParticipantStateChange message
+     */
+    public static ParticipantStateChange createParticipantStateChangeMsg(final ParticipantState participantState) {
+        final ParticipantStateChange participantStateChangeMsg = new ParticipantStateChange();
+        ToscaConceptIdentifier participantId = new ToscaConceptIdentifier();
+        participantId.setName("org.onap.PM_Policy");
+        participantId.setVersion("0.0.0");
+
+        participantStateChangeMsg.setParticipantId(participantId);
+        participantStateChangeMsg.setTimestamp(Instant.now());
+        participantStateChangeMsg.setState(participantState);
+
+        return participantStateChangeMsg;
+    }
+
+    /**
+     * Method to create ControlLoopStateChange message from the arguments passed.
+     *
+     * @param controlLoopOrderedState controlLoopOrderedState
+     *
+     * @return ParticipantControlLoopStateChange message
+     */
+    public static ParticipantControlLoopStateChange createControlLoopStateChangeMsg(
+            final ControlLoopOrderedState controlLoopOrderedState) {
+        final ParticipantControlLoopStateChange participantClStateChangeMsg = new ParticipantControlLoopStateChange();
+
+        ToscaConceptIdentifier controlLoopId = new ToscaConceptIdentifier();
+        controlLoopId.setName("PMSHInstance0");
+        controlLoopId.setVersion("1.0.0");
+
+        ToscaConceptIdentifier participantId = new ToscaConceptIdentifier();
+        participantId.setName("org.onap.PM_Policy");
+        participantId.setVersion("0.0.0");
+
+        participantClStateChangeMsg.setControlLoopId(controlLoopId);
+        participantClStateChangeMsg.setParticipantId(participantId);
+        participantClStateChangeMsg.setTimestamp(Instant.now());
+        participantClStateChangeMsg.setOrderedState(controlLoopOrderedState);
+
+        return participantClStateChangeMsg;
+    }
+
+    /**
+     * Method to create ControlLoopUpdateMsg.
+     *
+     * @return ParticipantControlLoopUpdate message
+     */
+    public static ParticipantControlLoopUpdate createControlLoopUpdateMsg() {
+        final ParticipantControlLoopUpdate clUpdateMsg = new ParticipantControlLoopUpdate();
+        ToscaConceptIdentifier controlLoopId = new ToscaConceptIdentifier();
+        controlLoopId.setName("PMSHInstance0");
+        controlLoopId.setVersion("1.0.0");
+
+        ToscaConceptIdentifier participantId = new ToscaConceptIdentifier();
+        participantId.setName("org.onap.PM_Policy");
+        participantId.setVersion("0.0.0");
+
+        clUpdateMsg.setControlLoopId(controlLoopId);
+        clUpdateMsg.setParticipantId(participantId);
+
+        ControlLoop controlLoop = new ControlLoop();
+        Map<UUID, ControlLoopElement> elements = new LinkedHashMap<>();
+        ToscaServiceTemplate toscaServiceTemplate = testControlLoopRead();
+        Map<String, ToscaNodeTemplate> nodeTemplatesMap =
+                toscaServiceTemplate.getToscaTopologyTemplate().getNodeTemplates();
+        for (Map.Entry<String, ToscaNodeTemplate> toscaInputEntry : nodeTemplatesMap.entrySet()) {
+            ControlLoopElement clElement = new ControlLoopElement();
+            clElement.setId(UUID.randomUUID());
+
+            ToscaConceptIdentifier clElementParticipantId = new ToscaConceptIdentifier();
+            clElementParticipantId.setName(toscaInputEntry.getKey());
+            clElementParticipantId.setVersion(toscaInputEntry.getValue().getVersion());
+            clElement.setParticipantId(clElementParticipantId);
+
+            clElement.setDefinition(clElementParticipantId);
+            clElement.setState(ControlLoopState.UNINITIALISED);
+            clElement.setDescription(toscaInputEntry.getValue().getDescription());
+            clElement.setOrderedState(ControlLoopOrderedState.UNINITIALISED);
+            elements.put(clElement.getId(), clElement);
+        }
+        controlLoop.setElements(elements);
+        controlLoop.setName("PMSHInstance0");
+        controlLoop.setVersion("1.0.0");
+        controlLoop.setDefinition(controlLoopId);
+        clUpdateMsg.setControlLoop(controlLoop);
+        clUpdateMsg.setControlLoopDefinition(toscaServiceTemplate);
+
+        return clUpdateMsg;
+    }
+
+    /**
+     * Method to create ParticipantHealthCheck message.
+     *
+     * @return ParticipantHealthCheck message
+     */
+    public static ParticipantHealthCheck createParticipantHealthCheckMsg() {
+        ToscaConceptIdentifier participantId = new ToscaConceptIdentifier();
+        participantId.setName("org.onap.PM_Policy");
+        participantId.setVersion("0.0.0");
+
+        ToscaConceptIdentifier controlLoopId = new ToscaConceptIdentifier();
+        controlLoopId.setName("PMSHInstance0");
+        controlLoopId.setVersion("1.0.0");
+
+        final ParticipantHealthCheck participantHealthCheckMsg = new ParticipantHealthCheck();
+        participantHealthCheckMsg.setParticipantId(participantId);
+        participantHealthCheckMsg.setControlLoopId(controlLoopId);
+        participantHealthCheckMsg.setTimestamp(Instant.now());
+        participantHealthCheckMsg.setState(ParticipantState.PASSIVE);
+
+        return participantHealthCheckMsg;
+    }
+
+    /**
+     * Method to create ParticipantControlLoopUpdate using the arguments passed.
+     *
+     * @param jsonFilePath the path of the controlloop content
+     *
+     * @return ParticipantControlLoopUpdate message
+     * @throws CoderException exception while reading the file to object
+     */
+    public static ParticipantControlLoopUpdate createParticipantClUpdateMsgFromJson(String jsonFilePath)
+            throws CoderException {
+        ParticipantControlLoopUpdate participantControlLoopUpdateMsg =
+                CODER.decode(new File(jsonFilePath), ParticipantControlLoopUpdate.class);
+        return participantControlLoopUpdateMsg;
+    }
+
+    private static ToscaServiceTemplate testControlLoopRead() {
+        Set<String> controlLoopDirectoryContents =
+                ResourceUtils.getDirectoryContents("src/test/resources/utils/servicetemplates");
+
+        boolean atLeastOneControlLoopTested = false;
+        ToscaServiceTemplate toscaServiceTemplate = null;
+
+        for (String controlLoopFilePath : controlLoopDirectoryContents) {
+            if (!controlLoopFilePath.endsWith(".yaml")) {
+                continue;
+            }
+            atLeastOneControlLoopTested = true;
+            toscaServiceTemplate = testControlLoopYamlSerialization(controlLoopFilePath);
+        }
+
+        // Add policy_types to the toscaServiceTemplate
+        addPolicyTypesToToscaServiceTemplate(toscaServiceTemplate);
+
+        assertTrue(atLeastOneControlLoopTested);
+        return toscaServiceTemplate;
+    }
+
+    private static void addPolicyTypesToToscaServiceTemplate(
+            ToscaServiceTemplate toscaServiceTemplate) {
+        Set<String> policyTypeDirectoryContents = ResourceUtils.getDirectoryContents("policytypes");
+
+        for (String policyTypeFilePath : policyTypeDirectoryContents) {
+            String policyTypeString = ResourceUtils.getResourceAsString(policyTypeFilePath);
+
+            ToscaServiceTemplate foundPolicyTypeSt =
+                yamlTranslator.fromYaml(policyTypeString, ToscaServiceTemplate.class);
+
+            toscaServiceTemplate.setDerivedFrom(foundPolicyTypeSt.getDerivedFrom());
+            toscaServiceTemplate.setDescription(foundPolicyTypeSt.getDescription());
+            toscaServiceTemplate.setMetadata(foundPolicyTypeSt.getMetadata());
+            toscaServiceTemplate.setName(foundPolicyTypeSt.getName());
+            toscaServiceTemplate.setToscaDefinitionsVersion(foundPolicyTypeSt.getToscaDefinitionsVersion());
+            toscaServiceTemplate.setVersion(foundPolicyTypeSt.getVersion());
+
+            if (foundPolicyTypeSt.getDataTypes() != null) {
+                if (toscaServiceTemplate.getDataTypes() == null) {
+                    toscaServiceTemplate.setDataTypes(foundPolicyTypeSt.getDataTypes());
+                } else {
+                    toscaServiceTemplate.getDataTypes().putAll(foundPolicyTypeSt.getDataTypes());
+                }
+            }
+
+            if (toscaServiceTemplate.getPolicyTypes() == null) {
+                toscaServiceTemplate.setPolicyTypes(foundPolicyTypeSt.getPolicyTypes());
+            } else {
+                toscaServiceTemplate.getPolicyTypes().putAll(foundPolicyTypeSt.getPolicyTypes());
+            }
+        }
+    }
+
+    /**
+     * Method to add polcies to the toscaServiceTemplate.
+     *
+     * @param toscaServiceTemplate to add policies
+     */
+    public static void addPoliciesToToscaServiceTemplate(ToscaServiceTemplate toscaServiceTemplate) {
+        Set<String> policiesDirectoryContents = ResourceUtils.getDirectoryContents("policies");
+
+        for (String policiesFilePath : policiesDirectoryContents) {
+            String policiesString = ResourceUtils.getResourceAsString(policiesFilePath);
+
+            ToscaServiceTemplate foundPoliciesSt =
+                yamlTranslator.fromYaml(policiesString, ToscaServiceTemplate.class);
+            toscaServiceTemplate.getToscaTopologyTemplate().setPolicies(
+                    foundPoliciesSt.getToscaTopologyTemplate().getPolicies());
+        }
+    }
+
+    private static ToscaServiceTemplate testControlLoopYamlSerialization(String controlLoopFilePath) {
+        try {
+            String controlLoopString = ResourceUtils.getResourceAsString(controlLoopFilePath);
+            if (controlLoopString == null) {
+                throw new FileNotFoundException(controlLoopFilePath);
+            }
+
+            ToscaServiceTemplate serviceTemplate = yamlTranslator.fromYaml(
+                        controlLoopString, ToscaServiceTemplate.class);
+            return serviceTemplate;
+        } catch (FileNotFoundException e) {
+            LOGGER.error("cannot find YAML file", controlLoopFilePath);
+            throw new IllegalArgumentException(e);
+        }
+    }
+}
diff --git a/participant/participant-impl/participant-impl-policy/src/test/resources/parameters/InvalidParameters.json b/participant/participant-impl/participant-impl-policy/src/test/resources/parameters/InvalidParameters.json
new file mode 100644
index 0000000..1035ccb
--- /dev/null
+++ b/participant/participant-impl/participant-impl-policy/src/test/resources/parameters/InvalidParameters.json
@@ -0,0 +1,3 @@
+{
+  "name": "
+}
diff --git a/participant/participant-impl/participant-impl-policy/src/test/resources/parameters/MinimumParametersH2.json b/participant/participant-impl/participant-impl-policy/src/test/resources/parameters/MinimumParametersH2.json
new file mode 100644
index 0000000..30250be
--- /dev/null
+++ b/participant/participant-impl/participant-impl-policy/src/test/resources/parameters/MinimumParametersH2.json
@@ -0,0 +1,53 @@
+{
+    "name": "ControlLoopParticipantGroup",
+    "intermediaryParameters": {
+        "name": "Participant parameters",
+        "reportingTimeInterval": 120000,
+        "description": "Participant Description",
+        "participantType":{
+            "name": "org.onap.policy.controlloop.PolicyControlLoopParticipant",
+            "version":"2.3.1"
+        },
+        "participantId": {
+            "name": "org.onap.PM_Policy",
+            "version": "1.0.0"
+        },
+        "clampControlLoopTopics": {
+            "topicSources": [
+                {
+                    "topic": "POLICY-CLRUNTIME-PARTICIPANT",
+                    "servers": [
+                        "localhost"
+                    ],
+                    "topicCommInfrastructure": "dmaap",
+                    "fetchTimeout": 15000
+                }
+            ],
+            "topicSinks": [
+                {
+                    "topic": "POLICY-CLRUNTIME-PARTICIPANT",
+                    "servers": [
+                        "localhost"
+                    ],
+                    "topicCommInfrastructure": "dmaap"
+                },
+                {
+                    "topic": "POLICY-NOTIFICATION",
+                    "servers": [
+                        "localhost"
+                    ],
+                    "topicCommInfrastructure": "dmaap"
+                }
+            ]
+        }
+    },
+    "databaseProviderParameters": {
+        "name": "PolicyProviderParameterGroup",
+        "implementation": "org.onap.policy.models.provider.impl.DatabasePolicyModelsProviderImpl",
+        "databaseDriver": "org.h2.Driver",
+        "databaseUrl": "jdbc:h2:mem:testdb",
+        "databaseUser": "policy",
+        "databasePassword": "P01icY",
+        "persistenceUnit": "ToscaConceptTest"
+    }
+}
diff --git a/participant/participant-impl/participant-impl-policy/src/test/resources/parameters/NoParameters.json b/participant/participant-impl/participant-impl-policy/src/test/resources/parameters/NoParameters.json
new file mode 100644
index 0000000..7a73a41
--- /dev/null
+++ b/participant/participant-impl/participant-impl-policy/src/test/resources/parameters/NoParameters.json
@@ -0,0 +1,2 @@
+{
+}
\ No newline at end of file
diff --git a/participant/participant-impl/participant-impl-policy/src/test/resources/parameters/TestCLParams.yaml b/participant/participant-impl/participant-impl-policy/src/test/resources/parameters/TestCLParams.yaml
new file mode 100644
index 0000000..c2ffb40
--- /dev/null
+++ b/participant/participant-impl/participant-impl-policy/src/test/resources/parameters/TestCLParams.yaml
@@ -0,0 +1,161 @@
+tosca_definitions_version: "tosca_simple_yaml_1_3"
+data_types:
+  onap.datatypes.ToscaConceptIdentifier:
+    derived_from: tosca.datatypes.Root
+    properties:
+      name:
+        type: string
+        required: true
+      version:
+        type: string
+        required: true
+node_types:
+  org.onap.policy.clamp.controlloop.Participant:
+    version: 1.0.1
+    derived_from: tosca.nodetypes.Root
+    properties:
+      provider:
+        type: string
+        requred: false
+  org.onap.policy.clamp.controlloop.ControlLoopElement:
+    version: 1.0.1
+    derived_from: tosca.nodetypes.Root
+    properties:
+      provider:
+        type: string
+        requred: false
+      participant_id:
+        type: onap.datatypes.ToscaConceptIdentifier
+        requred: true
+  org.onap.policy.clamp.controlloop.ControlLoop:
+    version: 1.0.1
+    derived_from: tosca.nodetypes.Root
+    properties:
+      provider:
+        type: string
+        requred: false
+      elements:
+        type: list
+        required: true
+        entry_schema:
+          type: onap.datatypes.ToscaConceptIdentifier
+  org.onap.policy.clamp.controlloop.DCAEMicroserviceControlLoopElement:
+    version: 1.0.1
+    derived_from: org.onap.policy.clamp.controlloop.ControlLoopElement
+    properties:
+      dcae_blueprint_id:
+        type: onap.datatypes.ToscaConceptIdentifier
+        requred: true
+  org.onap.policy.clamp.controlloop.PolicyTypeControlLoopElement:
+    version: 1.0.1
+    derived_from: org.onap.policy.clamp.controlloop.ControlLoopElement
+    properties:
+      policy_type_id:
+        type: onap.datatypes.ToscaConceptIdentifier
+        requred: true
+  org.onap.policy.clamp.controlloop.CDSControlLoopElement:
+    version: 1.0.1
+    derived_from: org.onap.policy.clamp.controlloop.ControlLoopElement
+    properties:
+      cds_blueprint_id:
+        type: onap.datatypes.ToscaConceptIdentifier
+        requred: true
+topology_template:
+  node_templates:
+    org.onap.dcae.controlloop.DCAEMicroserviceControlLoopParticipant:
+      version: 2.3.4
+      type: org.onap.policy.clamp.controlloop.Participant
+      type_version: 1.0.1
+      description: Participant for DCAE microservices
+      properties:
+        provider: ONAP
+    org.onap.policy.controlloop.MonitoringPolicyControlLoopParticipant:
+      version: 2.3.1
+      type: org.onap.policy.clamp.controlloop.Participant
+      type_version: 1.0.1
+      description: Participant for DCAE microservices
+      properties:
+        provider: ONAP
+    org.onap.policy.controlloop.OperationalPolicyControlLoopParticipant:
+      version: 3.2.1
+      type: org.onap.policy.clamp.controlloop.Participant
+      type_version: 1.0.1
+      description: Participant for DCAE microservices
+      properties:
+        provider: ONAP
+    org.onap.ccsdk.cds.controlloop.CdsControlLoopParticipant:
+      version: 2.2.1
+      type: org.onap.policy.clamp.controlloop.Participant
+      type_version: 1.0.1
+      description: Participant for DCAE microservices
+      properties:
+        provider: ONAP
+    org.onap.domain.pmsh.PMSH_DCAEMicroservice:
+      version: 1.2.3
+      type: org.onap.policy.clamp.controlloop.DCAEMicroserviceControlLoopElement
+      type_version: 1.0.0
+      description: Control loop element for the DCAE microservice for Performance Management Subscription Handling
+      properties:
+        provider: Ericsson
+        participant_id:
+          name: org.onap.dcae.controlloop.DCAEMicroserviceControlLoopParticipant
+          version: 2.3.4
+        dcae_blueprint_id:
+          name: org.onap.dcae.blueprints.PMSHBlueprint
+          version: 1.0.0
+    org.onap.domain.pmsh.PMSH_MonitoringPolicyControlLoopElement:
+      version: 1.2.3
+      type: org.onap.policy.clamp.controlloop.PolicyTypeControlLoopElement
+      type_version: 1.0.0
+      description: Control loop element for the monitoring policy for Performance Management Subscription Handling
+      properties:
+        provider: Ericsson
+        participant_id:
+          name: org.onap.policy.controlloop.MonitoringPolicyControlLoopParticipant
+          version: 2.3.1
+        policy_type_id:
+          name: onap.policies.monitoring.pm-subscription-handler
+          version: 1.0.0
+    org.onap.domain.pmsh.PMSH_OperationalPolicyControlLoopElement:
+      version: 1.2.3
+      type: org.onap.policy.clamp.controlloop.PolicyTypeControlLoopElement
+      type_version: 1.0.0
+      description: Control loop element for the operational policy for Performance Management Subscription Handling
+      properties:
+        provider: Ericsson
+        participant_id:
+          name: org.onap.policy.controlloop.OperationalPolicyControlLoopParticipant
+          version: 2.2.1
+        policy_type_id:
+          name: onap.policies.operational.pm-subscription-handler
+          version: 1.0.0
+    org.onap.domain.pmsh.PMSH_CDS_ControlLoopElement:
+      version: 1.2.3
+      type: org.onap.policy.clamp.controlloop.ControlLoopElement
+      type_version: 1.0.0
+      description: Control loop element for CDS for Performance Management Subscription Handling
+      properties:
+        provider: Ericsson
+        participant_Id:
+          name: org.onap.ccsdk.cds.controlloop.CdsControlLoopParticipant
+          version: 3.2.1
+        cds_blueprint_id:
+          name: org.onap.ccsdk.cds.PMSHCdsBlueprint
+          version: 1.0.0
+    org.onap.domain.pmsh.PMSHControlLoopDefinition:
+      version: 1.2.3
+      type: org.onap.policy.clamp.controlloop.ControlLoop
+      type_version: 1.0.0
+      description: Control loop for Performance Management Subscription Handling
+      properties:
+        provider: Ericsson
+        elements:
+        - name: org.onap.domain.pmsh.PMSH_DCAEMicroservice
+          version: 1.2.3
+        - name: org.onap.domain.pmsh.PMSH_MonitoringPolicyControlLoopElement
+          version: 1.2.3
+        - name: org.onap.domain.pmsh.PMSH_OperationalPolicyControlLoopElement
+          version: 1.2.3
+        - name: org.onap.domain.pmsh.PMSH_CDS_ControlLoopElement
+          version: 1.2.3
+
diff --git a/participant/participant-impl/participant-impl-policy/src/test/resources/parameters/TestParameters.json b/participant/participant-impl/participant-impl-policy/src/test/resources/parameters/TestParameters.json
new file mode 100644
index 0000000..30250be
--- /dev/null
+++ b/participant/participant-impl/participant-impl-policy/src/test/resources/parameters/TestParameters.json
@@ -0,0 +1,53 @@
+{
+    "name": "ControlLoopParticipantGroup",
+    "intermediaryParameters": {
+        "name": "Participant parameters",
+        "reportingTimeInterval": 120000,
+        "description": "Participant Description",
+        "participantType":{
+            "name": "org.onap.policy.controlloop.PolicyControlLoopParticipant",
+            "version":"2.3.1"
+        },
+        "participantId": {
+            "name": "org.onap.PM_Policy",
+            "version": "1.0.0"
+        },
+        "clampControlLoopTopics": {
+            "topicSources": [
+                {
+                    "topic": "POLICY-CLRUNTIME-PARTICIPANT",
+                    "servers": [
+                        "localhost"
+                    ],
+                    "topicCommInfrastructure": "dmaap",
+                    "fetchTimeout": 15000
+                }
+            ],
+            "topicSinks": [
+                {
+                    "topic": "POLICY-CLRUNTIME-PARTICIPANT",
+                    "servers": [
+                        "localhost"
+                    ],
+                    "topicCommInfrastructure": "dmaap"
+                },
+                {
+                    "topic": "POLICY-NOTIFICATION",
+                    "servers": [
+                        "localhost"
+                    ],
+                    "topicCommInfrastructure": "dmaap"
+                }
+            ]
+        }
+    },
+    "databaseProviderParameters": {
+        "name": "PolicyProviderParameterGroup",
+        "implementation": "org.onap.policy.models.provider.impl.DatabasePolicyModelsProviderImpl",
+        "databaseDriver": "org.h2.Driver",
+        "databaseUrl": "jdbc:h2:mem:testdb",
+        "databaseUser": "policy",
+        "databasePassword": "P01icY",
+        "persistenceUnit": "ToscaConceptTest"
+    }
+}
diff --git a/participant/participant-impl/participant-impl-policy/src/test/resources/parameters/TestParametersStd.json b/participant/participant-impl/participant-impl-policy/src/test/resources/parameters/TestParametersStd.json
new file mode 100644
index 0000000..7954063
--- /dev/null
+++ b/participant/participant-impl/participant-impl-policy/src/test/resources/parameters/TestParametersStd.json
@@ -0,0 +1,53 @@
+{
+    "name": "ControlLoopParticipantGroup",
+    "intermediaryParameters": {
+        "name": "Participant parameters",
+        "reportingTimeInterval": 120000,
+        "description": "Participant Description",
+        "participantType": {
+            "name": "org.onap.policy.controlloop.PolicyControlLoopParticipant",
+            "version": "2.3.1"
+        },
+        "participantId": {
+            "name": "org.onap.PM_Policy",
+            "version": "1.0.0"
+        },
+        "clampControlLoopTopics": {
+            "topicSources": [
+                {
+                    "topic": "POLICY-CLRUNTIME-PARTICIPANT",
+                    "servers": [
+                        "localhost"
+                    ],
+                    "topicCommInfrastructure": "dmaap",
+                    "fetchTimeout": 15000
+                }
+            ],
+            "topicSinks": [
+                {
+                    "topic": "POLICY-CLRUNTIME-PARTICIPANT",
+                    "servers": [
+                        "localhost"
+                    ],
+                    "topicCommInfrastructure": "dmaap"
+                },
+                {
+                    "topic": "POLICY-NOTIFICATION",
+                    "servers": [
+                        "localhost"
+                    ],
+                    "topicCommInfrastructure": "dmaap"
+                }
+            ]
+        }
+    },
+    "databaseProviderParameters": {
+        "name": "PolicyProviderParameterGroup",
+        "implementation": "org.onap.policy.models.provider.impl.DatabasePolicyModelsProviderImpl",
+        "databaseDriver": "org.h2.Driver",
+	"databaseUrl": "jdbc:h2:mem:testdb",
+        "databaseUser": "policy",
+        "databasePassword": "P01icY",
+        "persistenceUnit": "ToscaConceptTest"
+    }
+}
diff --git a/participant/participant-impl/participant-impl-policy/src/test/resources/parameters/Unreadable.json b/participant/participant-impl/participant-impl-policy/src/test/resources/parameters/Unreadable.json
new file mode 100644
index 0000000..efbfbe2
--- /dev/null
+++ b/participant/participant-impl/participant-impl-policy/src/test/resources/parameters/Unreadable.json
@@ -0,0 +1,73 @@
+{
+    "name": "ControlLoopRuntimeGroup",
+    "participantParameters": {
+        "heartBeatMs": 120000,
+        "updateParameters": {
+            "maxRetryCount": 1,
+            "maxWaitMs": 30000
+        },
+        "stateChangeParameters": {
+            "maxRetryCount": 1,
+            "maxWaitMs": 30000
+        }
+    },
+    "databaseProviderParameters": {
+        "name": "PolicyProviderParameterGroup",
+        "implementation": "org.onap.policy.models.provider.impl.DatabasePolicyModelsProviderImpl",
+        "databaseDriver": "org.h2.Driver",
+        "databaseUrl": "jdbc:h2:mem:testdb",
+        "databaseUser": "policy",
+        "databasePassword": "P01icY",
+        "persistenceUnit": "ToscaConceptTest"
+    },
+    "topicParameterGroup": {
+        "topicSources": [
+            {
+                "topic": "POLICY-CLRUNTIME-PARTICIPANT",
+                "servers": [
+                    "localhost"
+                ],
+                "topicCommInfrastructure": "dmaap",
+                "fetchTimeout": 15000
+            }
+        ],
+        "topicSinks": [
+            {
+                "topic": "POLICY-CLRUNTIME-PARTICIPANT",
+                "servers": [
+                    "localhost"
+                ],
+                "topicCommInfrastructure": "dmaap"
+            },
+            {
+                "topic": "POLICY-NOTIFICATION",
+                "servers": [
+                    "localhost"
+                ],
+                "topicCommInfrastructure": "dmaap"
+            }
+        ]
+    },
+    "healthCheckRestClientParameters": [
+        {
+            "clientName": "api",
+            "hostname": "policy-api",
+            "port": 6969,
+            "userName": "healthcheck",
+            "password": "zb!XztG34",
+            "useHttps": true,
+            "basePath": "policy/api/v1/healthcheck"
+        },
+        {
+            "clientName": "distribution",
+            "hostname": "policy-distribution",
+            "port": 6969,
+            "userName": "healthcheck",
+            "password": "zb!XztG34",
+            "useHttps": true,
+            "basePath": "healthcheck"
+        }
+    ]
+}
+
+
diff --git a/participant/participant-impl/participant-impl-policy/src/test/resources/parameters/logback-test.xml b/participant/participant-impl/participant-impl-policy/src/test/resources/parameters/logback-test.xml
new file mode 100644
index 0000000..cf6b89e
--- /dev/null
+++ b/participant/participant-impl/participant-impl-policy/src/test/resources/parameters/logback-test.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ============LICENSE_START=======================================================
+   Copyright (C) 2021 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=========================================================
+-->
+
+<configuration>
+
+    <contextName>Participant</contextName>
+    <statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />
+    <property name="LOG_DIR" value="${java.io.tmpdir}/clamp_logging/" />
+
+    <!-- USE FOR STD OUT ONLY -->
+    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <Pattern>%d %contextName [%t] %level %logger{36} - %msg%n</Pattern>
+        </encoder>
+    </appender>
+
+    <root level="info">
+        <appender-ref ref="STDOUT" />
+    </root>
+
+    <logger name="org.onap.policy.clamp.controlloop.participant" level="trace" additivity="false">
+        <appender-ref ref="STDOUT" />
+    </logger>
+</configuration>
diff --git a/participant/participant-impl/participant-impl-policy/src/test/resources/policies/vCPE.policies.optimization.input.tosca.yaml b/participant/participant-impl/participant-impl-policy/src/test/resources/policies/vCPE.policies.optimization.input.tosca.yaml
new file mode 100644
index 0000000..126e8e6
--- /dev/null
+++ b/participant/participant-impl/participant-impl-policy/src/test/resources/policies/vCPE.policies.optimization.input.tosca.yaml
@@ -0,0 +1,348 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+topology_template:
+  policies:
+    -
+        OSDF_CASABLANCA.Affinity_Default:
+            type: onap.policies.optimization.resource.AffinityPolicy
+            version: 1.0.0
+            type_version: 1.0.0
+            name: OSDF_CASABLANCA.Affinity_Default
+            metadata:
+                policy-id: OSDF_CASABLANCA.Affinity_Default
+                policy-version: 1
+            properties:
+                scope: []
+                services: []
+                resources: []
+                geography: []
+                identity: affinity_vCPE
+                applicableResources: any
+                affinityProperties:
+                    qualifier: same
+                    category: complex
+    -
+        OSDF_CASABLANCA.Affinity_Default_US:
+            type: onap.policies.optimization.resource.AffinityPolicy
+            version: 1.0.0
+            type_version: 1.0.0
+            name: OSDF_CASABLANCA.Affinity_Default_US
+            metadata:
+                policy-id: OSDF_CASABLANCA.Affinity_Default_US
+                policy-version: 1
+            properties:
+                scope: []
+                services: []
+                resources: []
+                geography: [US]
+                identity: affinity_vCPE
+                applicableResources: any
+                affinityProperties:
+                    qualifier: same
+                    category: complex
+    -
+        OSDF_CASABLANCA.Affinity_Default_vCPE_US_0:
+            type: onap.policies.optimization.resource.AffinityPolicy
+            version: 1.0.0
+            type_version: 1.0.0
+            name: OSDF_CASABLANCA.Affinity_Default_vCPE_US_0
+            metadata:
+                policy-id: OSDF_CASABLANCA.Affinity_Default_vCPE_US_0
+                policy-version: 1
+            properties:
+                scope: []
+                services: [vCPE]
+                resources: []
+                geography: [US]
+                identity: affinity_vCPE
+                applicableResources: any
+                affinityProperties:
+                    qualifier: different
+                    category: complex
+    -
+        OSDF_CASABLANCA.Affinity_vCPE_US_Gold_1:
+            type: onap.policies.optimization.resource.AffinityPolicy
+            version: 1.0.0
+            type_version: 1.0.0
+            name: OSDF_CASABLANCA.Affinity_vCPE_US_Gold_1
+            metadata:
+                policy-id: OSDF_CASABLANCA.Affinity_vCPE_1
+                policy-version: 1
+            properties:
+                scope: [gold]
+                services: [vCPE]
+                resources: [vGMuxInfra, vG]
+                geography: [US, INTERNATIONAL]
+                identity: affinity_vCPE
+                applicableResources: any
+                affinityProperties:
+                    qualifier: same
+                    category: availabilityZone
+    -
+        OSDF_CASABLANCA.Affinity_vCPE_US_Platinum_1:
+            type: onap.policies.optimization.resource.AffinityPolicy
+            version: 1.0.0
+            type_version: 1.0.0
+            name: OSDF_CASABLANCA.Affinity_vCPE_US_Platinum_1
+            metadata:
+                policy-id: OSDF_CASABLANCA.Affinity_vCPE_1
+                policy-version: 1
+            properties:
+                scope: [platinum]
+                services: [vCPE]
+                resources: [vGMuxInfra, vG]
+                geography: [US, INTERNATIONAL]
+                identity: affinity_vCPE
+                applicableResources: any
+                affinityProperties:
+                    qualifier: different
+                    category: availabilityZone
+    -
+        OSDF_CASABLANCA.Capacity_vG_1:
+            type: onap.policies.optimization.resource.Vim_fit
+            version: 1.0.0
+            type_version: 1.0.0
+            name: OSDF_CASABLANCA.Capacity_vG_1
+            metadata:
+                policy-id: OSDF_CASABLANCA.Capacity_vG_1
+                policy-version: 1
+            properties:
+                scope: []
+                services: [vCPE]
+                resources: [vG]
+                geography: [US, INTERNATIONAL]
+                identity: capacity_vG
+                applicableResources: any
+                capacityProperty:
+                   controller: multicloud
+                   request: "{\"vCPU\": 10, \"Memory\": {\"quantity\": {\"get_param\": \"REQUIRED_MEM\"}, \"unit\": \"GB\"}, \"Storage\": {\"quantity\": {\"get_param\": \"REQUIRED_DISK\"}, \"unit\": \"GB\"}}"
+    -
+        OSDF_CASABLANCA.Capacity_vG_2:
+            type: onap.policies.optimization.resource.Vim_fit
+            version: 1.0.0
+            type_version: 1.0.0
+            name: OSDF_CASABLANCA.Capacity_vG_2
+            metadata:
+                policy-id: OSDF_CASABLANCA.Capacity_vG_2
+                policy-version: 1
+            properties:
+                scope: []
+                services: [vCPE]
+                resources: [vG]
+                geography: [US, INTERNATIONAL]
+                identity: capacity_vG
+                applicableResources: any
+                capacityProperty:
+                   controller: multicloud
+                   request: "{\"vCPU\": 15, \"Memory\": {\"quantity\": {\"get_param\": \"REQUIRED_MEM\"}, \"unit\": \"MB\"}, \"Storage\": {\"quantity\": {\"get_param\": \"REQUIRED_DISK\"}, \"unit\": \"GB\"}}"
+    -
+        OSDF_CASABLANCA.Distance_vG_1:
+            type: onap.policies.optimization.resource.DistancePolicy
+            version: 1.0.0
+            type_version: 1.0.0
+            name: OSDF_CASABLANCA.Distance_vG_1
+            metadata:
+                policy-id: OSDF_CASABLANCA.Distance_vG_1
+                policy-version: 1
+            properties:
+                scope: [platinum]
+                services: [vCPE]
+                resources: [vG]
+                geography: [US, INTERNATIONAL]
+                identity: distance-vG
+                applicableResources: any
+                distanceProperties:
+                    locationInfo: customer_loc
+                    distance:
+                        value: 1500
+                        operator: "<"
+                        unit: km
+    -
+        OSDF_CASABLANCA.hpa_policy_Default:
+            type: onap.policies.optimization.resource.HpaPolicy
+            version: 1.0.0
+            type_version: 1.0.0
+            name: OSDF_CASABLANCA.hpa_policy_Default
+            metadata:
+                policy-id: OSDF_CASABLANCA.hpa_policy_Default
+                policy-version: 1
+            properties:
+                scope: []
+                services: []
+                resources: []
+                geography: []
+                identity: hpa-vG
+                flavorFeatures:
+                    -
+                         id: vg_1
+                         type: vnfc
+                         directives:
+                             -    type: flavor_directives
+                                  attributes:
+                                      -    attribute_name: flavor_label_vm_01
+                                           attribute_value: ""
+                         flavorProperties:
+                             -
+                                  hpa-feature: basicCapabilities
+                                  mandatory: True
+                                  architecture: generic
+                                  directives: []
+                                  hpa-feature-attributes:
+                                      -    hpa-attribute-key: numVirtualCpu
+                                           hpa-attribute-value: 8
+                                           operator: ['>=']
+                                           unit: ""
+                                      -    hpa-attribute-key: virtualMemSize
+                                           hpa-attribute-value: 6
+                                           operator: ['<=']
+                                           unit: ""
+                             -
+                                  hpa-feature: ovsDpdk
+                                  mandatory: False
+                                  architecture: generic
+                                  directives: []
+                                  hpa-feature-attributes:
+                                      -    hpa-attribute-key: dataProcessingAccelerationLibrary
+                                           hpa-attribute-value: ovsDpdk_version
+                                           operator: [=]
+                                           unit: ""
+    -
+        OSDF_CASABLANCA.hpa_policy_vG_1:
+            type: onap.policies.optimization.resource.HpaPolicy
+            version: 1.0.0
+            type_version: 1.0.0
+            name: OSDF_CASABLANCA.hpa_policy_vG_1
+            metadata:
+                policy-id: OSDF_CASABLANCA.hpa_policy_vG_1
+                policy-version: 1
+            properties:
+                scope: []
+                services: [vCPE, vOtherService]
+                resources: [vG]
+                geography: []
+                identity: hpa-vG
+                flavorFeatures:
+                    -
+                         id: vg_1
+                         type: vnfc
+                         directives:
+                             -    type: flavor_directives
+                                  attributes:
+                                      -    attribute_name: flavor_label_vm_01
+                                           attribute_value: ""
+                         flavorProperties:
+                             -
+                                  hpa-feature: basicCapabilities
+                                  mandatory: True
+                                  architecture: generic
+                                  directives: []
+                                  hpa-feature-attributes:
+                                      -    hpa-attribute-key: numVirtualCpu
+                                           hpa-attribute-value: 6
+                                           operator: ['>=']
+                                           unit: ""
+                                      -    hpa-attribute-key: virtualMemSize
+                                           hpa-attribute-value: 4
+                                           operator: ['<=']
+                                           unit: ""
+                             -
+                                  hpa-feature: ovsDpdk
+                                  mandatory: False
+                                  architecture: generic
+                                  directives: []
+                                  hpa-feature-attributes:
+                                      -    hpa-attribute-key: dataProcessingAccelerationLibrary
+                                           hpa-attribute-value: ovsDpdk_version
+                                           operator: [=]
+                                           unit: ""
+    -
+        OSDF_CASABLANCA.queryPolicy_vCPE:
+            type: onap.policies.optimization.service.QueryPolicy
+            version: 1.0.0
+            type_version: 1.0.0
+            name: OSDF_CASABLANCA.queryPolicy_vCPE
+            metadata:
+                policy-id: OSDF_CASABLANCA.queryPolicy_vCPE
+                policy-version: 1
+            properties:
+                scope: []
+                services: [vCPE]
+                geography: [US, INTERNATIONAL]
+                identity: vCPE_Query_Policy
+                queryProperties:
+                    -
+                        attribute: locationId
+                        attribute_location: customerLocation
+                        value: ""
+                    -
+                        attribute: id
+                        attribute_location: "vpnInfo.vpnId"
+                        value: ""
+                    -
+                        attribute: upstreamBW
+                        attribute_location: "vpnInfo.upstreamBW"
+                        value: ""
+                    -
+                        attribute: customerLatitude
+                        attribute_location: customerLatitude
+                        value: 1.1
+                    - 
+                        attribute: customerLongitude
+                        attribute_location: customerLongitude
+                        value: 2.2
+    -
+        OSDF_CASABLANCA.SubscriberPolicy_v1:
+            type: onap.policies.optimization.service.SubscriberPolicy
+            version: 1.0.0
+            type_version: 1.0.0
+            name: OSDF_CASABLANCA.SubscriberPolicy_v1
+            metadata:
+                policy-id: OSDF_CASABLANCA.SubscriberPolicy_v1
+                policy-version: 1
+            properties:
+                scope: []
+                services: [vCPE]
+                identity: subscriber_vCPE
+                subscriberProperties:
+                    subscriberName: [subscriber_x, subscriber_y]
+                    subscriberRole: [platinum]
+                    provStatus: [CAPPED]
+    -
+        OSDF_CASABLANCA.SubscriberPolicy_v2:
+            type: onap.policies.optimization.service.SubscriberPolicy
+            version: 1.0.0
+            type_version: 1.0.0
+            name: OSDF_CASABLANCA.SubscriberPolicy_v2
+            metadata:
+                policy-id: OSDF_CASABLANCA.SubscriberPolicy_v2
+                policy-version: 1
+            properties:
+                scope: []
+                services: [vCPE]
+                identity: subscriber_vCPE
+                subscriberProperties:
+                    subscriberName: [subscriber_a, subscriber_b]
+                    subscriberRole: [gold]
+                    provStatus: [CAPPED]
+    -
+        OSDF_CASABLANCA.vnfPolicy_vG:
+            type: onap.policies.optimization.resource.VnfPolicy
+            version: 1.0.0
+            type_version: 1.0.0
+            name: OSDF_CASABLANCA.vnfPolicy_vG
+            metadata:
+                policy-id: OSDF_CASABLANCA.vnfPolicy_vG
+                policy-version: 1
+            properties:
+                scope: []
+                services: [vCPE]
+                resources: [vG]
+                geography: [US, INTERNATIONAL]
+                identity: vnf_vG
+                applicableResources: any
+                vnfProperties:
+                    -
+                        inventoryProvider: aai
+                        serviceType: ""
+                        inventoryType: cloudRegionId
+                        customerId: ""
+
diff --git a/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.Match.yaml b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.Match.yaml
new file mode 100644
index 0000000..88b8705
--- /dev/null
+++ b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.Match.yaml
@@ -0,0 +1,8 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+    onap.policies.Match:
+        derived_from: tosca.policies.Root
+        version: 1.0.0
+        name: onap.policies.Match
+        description: Base Policy Type for matchable Policies
+
diff --git a/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.Naming.yaml b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.Naming.yaml
new file mode 100644
index 0000000..bde730c
--- /dev/null
+++ b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.Naming.yaml
@@ -0,0 +1,102 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+    onap.policies.Naming:
+        derived_from: tosca.policies.Root
+        version: 1.0.0
+        name: onap.policies.Naming
+        description: Virtual policy node for naming
+        properties:
+            policy-instance-name:
+                type: string
+            naming-models:
+                type: list
+                entry_schema:
+                    type: policy.data.naming-model-entity
+data_types:
+    policy.data.naming-model-entity:
+        derived_from: tosca.datatypes.Root
+        properties:
+            nfRole:
+                type: string
+                required: false
+                metadata:
+                    matchable: true
+            naming-type:
+                type: string
+                required: true
+                metadata:
+                    matchable: true
+            naming-recipe:
+                type: string
+                required: true
+            name-operation:
+                type: string
+                required: false
+            naming-properties:
+                type: list
+                required: true
+                entry_schema:
+                    type: policy.data.naming-property
+    policy.data.naming-property:
+        derived_from: tosca.datatypes.Root
+        properties:
+            property-name:
+                type: string
+                required: true
+                metadata:
+                    matchable: true
+            property-value:
+                type: string
+                required: false
+            property-operation:
+                type: string
+                required: false
+            source-system:
+                type: string
+                required: false
+            source-endpoint:
+                type: string
+                required: false
+            increment-sequence:
+                type: policy.data.increment-sequence
+                required: false
+    policy.data.increment-sequence:
+        derived_from: tosca.datatypes.Root
+        properties:
+            scope:
+                type: list
+                required: true
+                entry_schema:
+                    type: string
+                    constraints:
+                    -   valid_values:
+                        - CLOUD_REGION_ID
+                        - LOCATION_CLLI
+                        - VNF
+                        - VM
+                        - VFMODULE
+                        - PRECEEDING
+                        - TRAILING
+                        - ENTIRETY
+            sequence-type:
+                type: string
+                require: true
+                entry_schema:
+                    type: string
+                    constraints:
+                    -   valid_values:
+                        - numeric
+                        - alpha-numeric
+            start-value:
+                type: string
+                required: true
+            max:
+                type: string
+                required: false
+            increment:
+                type: string
+                required: true
+            length:
+                type: string
+                required: true
+
diff --git a/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.Optimization.yaml b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.Optimization.yaml
new file mode 100644
index 0000000..7fe0e59
--- /dev/null
+++ b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.Optimization.yaml
@@ -0,0 +1,33 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+   onap.policies.Optimization:
+      derived_from: tosca.policies.Root
+      version: 1.0.0
+      name: onap.policies.Optimization
+      description: The base policy type for all policies that govern optimization
+      properties:
+         scope:
+            description: Scope for the policy - could be for a specific release.
+            type: list
+            metadata:
+               matchable: true
+            required: true
+            entry_schema:
+               type: string
+         geography:
+            description: One or more geographic regions
+            type: list
+            metadata:
+               matchable: true
+            required: true
+            entry_schema:
+               type: string
+               constraints:
+               -  valid_values:
+                  - US
+                  - International
+         identity:
+            description: Used internally for identification
+            type: string
+            required: true
+
diff --git a/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.controlloop.guard.Common.yaml b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.controlloop.guard.Common.yaml
new file mode 100644
index 0000000..3dc9792
--- /dev/null
+++ b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.controlloop.guard.Common.yaml
@@ -0,0 +1,28 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+    onap.policies.controlloop.guard.Common:
+        derived_from: tosca.policies.Root
+        version: 1.0.0
+        name: onap.policies.controlloop.guard.Common
+        description: |
+            This is the base Policy Type for Guard policies that guard the execution of Operational
+            Policies.
+        properties:
+            actor:
+                type: string
+                description: Specifies the Actor the guard applies to.
+                required: true
+            operation:
+                type: string
+                description: Specified the operation that the actor is performing the guard applies to.
+                required: true
+            timeRange:
+                type: tosca.datatypes.TimeInterval
+                description: |
+                    An optional range of time during the day the guard policy is valid for.
+                required: false
+            id:
+                type: string
+                description: The Control Loop id this applies to.
+                required: false
+
diff --git a/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.controlloop.guard.common.Blacklist.yaml b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.controlloop.guard.common.Blacklist.yaml
new file mode 100644
index 0000000..f2b67e1
--- /dev/null
+++ b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.controlloop.guard.common.Blacklist.yaml
@@ -0,0 +1,16 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+    onap.policies.controlloop.guard.common.Blacklist:
+        derived_from: onap.policies.controlloop.guard.Common
+        type_version: 1.0.0
+        version: 1.0.0
+        name: onap.policies.controlloop.guard.common.Blacklist
+        description: Supports blacklist of entity id's from performing control loop actions on.
+        properties:
+            blacklist:
+                type: list
+                description: List of entity id's not allowed to have control loop operations on.
+                required: true
+                entry_schema:
+                    type: string
+
diff --git a/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.controlloop.guard.common.Filter.yaml b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.controlloop.guard.common.Filter.yaml
new file mode 100644
index 0000000..ea8e92a
--- /dev/null
+++ b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.controlloop.guard.common.Filter.yaml
@@ -0,0 +1,66 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+   onap.policies.controlloop.guard.common.Filter:
+      derived_from: onap.policies.controlloop.guard.Common
+      type_version: 1.0.0
+      version: 1.0.0
+      name: onap.policies.controlloop.guard.common.Filter
+      description: Supports filtering of A&AI entities such as vnf-id, type, service, geographic region, etc.
+      properties:
+         algorithm:
+            type: string
+            description: Designates the precendence of blacklist vs whitelist
+            required: true
+            default: blacklist-overrides
+            constraints:
+            - valid_values: ["blacklist-overrides", "whitelist-overrides"]
+         filters:
+            type: list
+            description: List of filters to be applied.
+            required: true
+            entry_schema:
+               type: onap.datatypes.guard.filter
+data_types:
+   onap.datatypes.guard.filter:
+      derived_from: tosca.nodes.Root
+      properties:
+         field:
+            type: string
+            description: Name of the field to perform the filter on using the A&AI <node>.<property> syntax.
+            required: true
+            constraints:
+               - valid_values:
+                  - generic-vnf.vnf-name
+                  - generic-vnf.vnf-id
+                  - generic-vnf.vnf-type
+                  - generic-vnf.nf-naming-code
+                  - vserver.vserver-id
+                  - cloud-region.cloud-region-id
+         filter:
+            type: string
+            description: The filter value itself. For example, "RegionOne" "vFWCL*"
+            required: true
+         function:
+            type: string
+            description: The function applied to the filter.
+            required: true
+            constraints:
+               - valid_values:
+                  - string-equal
+                  - string-equal-ignore-case
+                  - string-regexp-match
+                  - string-contains
+                  - string-greater-than
+                  - string-greater-than-or-equal
+                  - string-less-than
+                  - string-less-than-or-equal
+                  - string-starts-with
+                  - string-ends-with
+         blacklist:
+            type: boolean
+            description: |
+               Indicates if the filter should be treated as a blacklist (true)
+               or whitelist (false).
+            required: true
+            default: true
+
diff --git a/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.controlloop.guard.common.FrequencyLimiter.yaml b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.controlloop.guard.common.FrequencyLimiter.yaml
new file mode 100644
index 0000000..3e31ec2
--- /dev/null
+++ b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.controlloop.guard.common.FrequencyLimiter.yaml
@@ -0,0 +1,26 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+    onap.policies.controlloop.guard.common.FrequencyLimiter:
+        derived_from: onap.policies.controlloop.guard.Common
+        type_version: 1.0.0
+        version: 1.0.0
+        name: onap.policies.controlloop.guard.common.FrequencyLimiter
+        description: Supports limiting the frequency of actions being taken by a Actor.
+        properties:
+            timeWindow:
+                type: integer
+                description: The time window to count the actions against.
+                required: true
+            timeUnits:
+                type: string
+                description: The units of time the window is counting.
+                required: true
+                constraints:
+                - valid_values: ["second", "minute", "hour", "day", "week", "month", "year"]
+            limit:
+                type: integer
+                description: The limit
+                required: true
+                constraints:
+                -   greater_than: 0
+
diff --git a/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.controlloop.guard.common.MinMax.yaml b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.controlloop.guard.common.MinMax.yaml
new file mode 100644
index 0000000..8f93572
--- /dev/null
+++ b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.controlloop.guard.common.MinMax.yaml
@@ -0,0 +1,24 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+    onap.policies.controlloop.guard.common.MinMax:
+        derived_from: onap.policies.controlloop.guard.Common
+        type_version: 1.0.0
+        version: 1.0.0
+        name: onap.policies.controlloop.guard.common.MinMax
+        description: |
+            Supports Min/Max number of entity for scaling operations. Although min and max fields are marked as not
+            required, you need to have at least one or the other.
+        properties:
+            target:
+                type: string
+                required: true
+                description: The target entity that has scaling restricted
+            min:
+                type: integer
+                required: false
+                description: The minimum instances of this entity
+            max:
+                type: integer
+                required: false
+                description: The maximum instances of this entity
+
diff --git a/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.controlloop.guard.coordination.FirstBlocksSecond.yaml b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.controlloop.guard.coordination.FirstBlocksSecond.yaml
new file mode 100644
index 0000000..eaeee60
--- /dev/null
+++ b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.controlloop.guard.coordination.FirstBlocksSecond.yaml
@@ -0,0 +1,27 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+   onap.policies.controlloop.Guard:
+      derived_from: tosca.policies.Root
+      version: 1.0.0
+      name: onap.policies.controlloop.Guard
+      description: Guard Policies for Control Loop Operational Policies
+   onap.policies.controlloop.guard.Coordination:
+      derived_from: onap.policies.controlloop.Guard
+      version: 1.0.0
+      name: onap.policies.controlloop.guard.Coordination
+      description: Guard Policies for Control Loop Coordination
+   onap.policies.controlloop.guard.coordination.FirstBlocksSecond:
+      derived_from: onap.policies.controlloop.guard.Coordination
+      version: 1.0.0
+      name: onap.policies.controlloop.guard.coordination.FirstBlocksSecond
+      description: Supports one Control Loop blocking another
+      properties:
+         controlLoop:
+            type: list
+            description: Specific Control Loops to which to apply this guard
+            required: true
+            constraint:
+               length: 2
+            entry_schema:
+               type: string
+
diff --git a/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.controlloop.operational.Common.yaml b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.controlloop.operational.Common.yaml
new file mode 100644
index 0000000..9b3b057
--- /dev/null
+++ b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.controlloop.operational.Common.yaml
@@ -0,0 +1,143 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+    onap.policies.controlloop.operational.Common:
+        derived_from: tosca.policies.Root
+        version: 1.0.0
+        name: onap.policies.controlloop.operational.Common
+        description: |
+            Operational Policy for Control Loop execution. Originated in Frankfurt to support TOSCA Compliant
+            Policy Types. This does NOT support the legacy Policy YAML policy type.
+        properties:
+            id:
+                type: string
+                description: The unique control loop id.
+                required: true
+            timeout:
+                type: integer
+                description: |
+                    Overall timeout for executing all the operations. This timeout should equal or exceed the total
+                    timeout for each operation listed.
+                required: true
+            abatement:
+                type: boolean
+                description: Whether an abatement event message will be expected for the control loop from DCAE.
+                required: true
+                default: false
+            trigger:
+                type: string
+                description: Initial operation to execute upon receiving an Onset event message for the Control Loop.
+                required: true
+            operations:
+                type: list
+                description: List of operations to be performed when Control Loop is triggered.
+                required: true
+                entry_schema:
+                    type: onap.datatype.controlloop.Operation
+
+data_types:
+    onap.datatype.controlloop.Target:
+        derived_from: tosca.datatypes.Root
+        description: Definition for a entity in A&AI to perform a control loop operation on
+        properties:
+            targetType:
+                type: string
+                description: Category for the target type
+                required: true
+                constraints:
+                - valid_values: [VNF, VM, VFMODULE, PNF]
+            entityIds:
+                type: map
+                description: |
+                    Map of values that identify the resource. If none are provided, it is assumed that the
+                    entity that generated the ONSET event will be the target.
+                required: false
+                metadata:
+                    clamp_possible_values: ClampExecution:CSAR_RESOURCES
+                entry_schema:
+                    type: string
+
+    onap.datatype.controlloop.Actor:
+        derived_from: tosca.datatypes.Root
+        description: An actor/operation/target definition
+        properties:
+            actor:
+                type: string
+                description: The actor performing the operation.
+                required: true
+                metadata:
+                    clamp_possible_values: Dictionary:DefaultActors,ClampExecution:CDS/actor
+            operation:
+                type: string
+                description: The operation the actor is performing.
+                metadata:
+                    clamp_possible_values: Dictionary:DefaultOperations,ClampExecution:CDS/operation
+                required: true
+            target:
+                type: onap.datatype.controlloop.Target
+                description: The resource the operation should be performed on.
+                required: true
+            payload:
+                type: map
+                description: Name/value pairs of payload information passed by Policy to the actor
+                required: false
+                metadata:
+                    clamp_possible_values: ClampExecution:CDS/payload
+                entry_schema:
+                    type: string
+
+    onap.datatype.controlloop.Operation:
+        derived_from: tosca.datatypes.Root
+        description: An operation supported by an actor
+        properties:
+            id:
+                type: string
+                description: Unique identifier for the operation
+                required: true
+            description:
+                type: string
+                description: A user-friendly description of the intent for the operation
+                required: false
+            operation:
+                type: onap.datatype.controlloop.Actor
+                description: The definition of the operation to be performed.
+                required: true
+            timeout:
+                type: integer
+                description: The amount of time for the actor to perform the operation.
+                required: true
+            retries:
+                type: integer
+                description: The number of retries the actor should attempt to perform the operation.
+                required: true
+                default: 0
+            success:
+                type: string
+                description: Points to the operation to invoke on success. A value of "final_success" indicates and end to the operation.
+                required: false
+                default: final_success
+            failure:
+                type: string
+                description: Points to the operation to invoke on Actor operation failure.
+                required: false
+                default: final_failure
+            failure_timeout:
+                type: string
+                description: Points to the operation to invoke when the time out for the operation occurs.
+                required: false
+                default: final_failure_timeout
+            failure_retries:
+                type: string
+                description: Points to the operation to invoke when the current operation has exceeded its max retries.
+                required: false
+                default: final_failure_retries
+            failure_exception:
+                type: string
+                description: Points to the operation to invoke when the current operation causes an exception.
+                required: false
+                default: final_failure_exception
+            failure_guard:
+                type: string
+                description: Points to the operation to invoke when the current operation is blocked due to guard policy enforcement.
+                required: false
+                default: final_failure_guard
+
diff --git a/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.controlloop.operational.common.Apex.yaml b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.controlloop.operational.common.Apex.yaml
new file mode 100644
index 0000000..a0c5b24
--- /dev/null
+++ b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.controlloop.operational.common.Apex.yaml
@@ -0,0 +1,26 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+    onap.policies.controlloop.operational.common.Apex:
+        derived_from: onap.policies.controlloop.operational.Common
+        type_version: 1.0.0
+        version: 1.0.0
+        name: onap.policies.controlloop.operational.common.Apex
+        description: Operational policies for Apex PDP
+        properties:
+            engineServiceParameters:
+                type: string
+                description: The engine parameters like name, instanceCount, policy implementation, parameters etc.
+                required: true
+            eventInputParameters:
+                type: string
+                description: The event input parameters.
+                required: true
+            eventOutputParameters:
+                type: string
+                description: The event output parameters.
+                required: true
+            javaProperties:
+                type: string
+                description: Name/value pairs of properties to be set for APEX if needed.
+                required: false
+
diff --git a/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.controlloop.operational.common.Drools.yaml b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.controlloop.operational.common.Drools.yaml
new file mode 100644
index 0000000..69d73db
--- /dev/null
+++ b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.controlloop.operational.common.Drools.yaml
@@ -0,0 +1,14 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+    onap.policies.controlloop.operational.common.Drools:
+        derived_from: onap.policies.controlloop.operational.Common
+        type_version: 1.0.0
+        version: 1.0.0
+        name: onap.policies.controlloop.operational.common.Drools
+        description: Operational policies for Drools PDP
+        properties:
+            controllerName:
+                type: string
+                description: Drools controller properties
+                required: false
+
diff --git a/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.monitoring.dcae-pm-mapper.yaml b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.monitoring.dcae-pm-mapper.yaml
new file mode 100644
index 0000000..c50392e
--- /dev/null
+++ b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.monitoring.dcae-pm-mapper.yaml
@@ -0,0 +1,50 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+   onap.policies.Monitoring:
+      derived_from: tosca.policies.Root
+      version: 1.0.0
+      name: onap.policies.Monitoring
+      description: a base policy type for all policies that govern monitoring provisioning
+   onap.policies.monitoring.dcae-pm-mapper:
+      derived_from: onap.policies.Monitoring
+      version: 1.0.0
+      properties:
+         pm-mapper-filter:
+            type: map
+            description: PM mapper filter on measInfo, measInfoId, measType, instanceId
+            entry_schema:
+               type: onap.datatypes.monitoring.pm-mapper-filter
+data_types:
+   onap.datatypes.monitoring.pm-mapper-filter:
+      derived_from: tosca.datatypes.Root
+      properties:
+         filters:
+            type: list
+            description: Filter configuration
+            #default: []
+            required: true
+            entry_schema:
+               type: onap.datatypes.monitoring.filters
+   onap.datatypes.monitoring.filters:
+      derived_from: tosca.datatypes.Root
+      properties:
+         pmDefVsn:
+            type: string
+            description: PM Dictionary version
+            required: true
+         nfType:
+            type: string
+            description: NF type
+            required: true
+         vendor:
+            type: string
+            description: Vendor name
+            required: true
+         measTypes:
+            type: list
+            description: Measurement types to collect
+            #default: []
+            required: true
+            entry_schema:
+               type: string
+
diff --git a/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.monitoring.dcae-pm-subscription-handler.yaml b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.monitoring.dcae-pm-subscription-handler.yaml
new file mode 100644
index 0000000..8ac9b74
--- /dev/null
+++ b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.monitoring.dcae-pm-subscription-handler.yaml
@@ -0,0 +1,132 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+   onap.policies.Monitoring:
+      derived_from: tosca.policies.Root
+      version: 1.0.0
+      name: onap.policies.Monitoring
+      description: a base policy type for all policies that govern monitoring provisioning
+   onap.policies.monitoring.dcae-pm-subscription-handler:
+      derived_from: onap.policies.Monitoring
+      version: 1.0.0
+      properties:
+         subscription:
+            type: map
+            description: PM Subscription Handler Subscription
+            entry_schema:
+               type: onap.datatypes.monitoring.subscription
+data_types:
+   onap.datatypes.monitoring.subscription:
+      derived_from: tosca.datatypes.Root
+      properties:
+         subscriptionName:
+            type: string
+            description: Name of the subscription
+            required: true
+         administrativeState:
+            type: string
+            description: State of the subscription
+            required: true
+            constraints:
+            -  valid_values:
+               - LOCKED
+               - UNLOCKED
+         fileBasedGP:
+            type: integer
+            description: File based granularity period
+            required: true
+         fileLocation:
+            type: string
+            description: ROP file location
+            required: true
+         nfTypeModelInvariantId:
+            type: string
+            description: Network function invariant ID
+            required: true
+         nfFilter:
+            type: map
+            description: Network function filter
+            required: true
+            entry_schema:
+               type: onap.datatypes.monitoring.nfFilter
+         measurementGroups:
+            type: list
+            description: Measurement Groups
+            required: true
+            entry_schema:
+               type: onap.datatypes.monitoring.measurementGroups
+   onap.datatypes.monitoring.nfFilter:
+      derived_from: tosca.datatypes.Root
+      properties:
+         nfNames:
+            type: list
+            description: List of network functions
+            required: true
+            #default: []
+            entry_schema:
+               type: string
+         swVersions:
+            type: list
+            description: List of software versions
+            required: true
+            #default: []
+            entry_schema:
+               type: string
+   onap.datatypes.monitoring.measurementGroups:
+      derived_from: tosca.datatypes.Root
+      properties:
+         measurementGroup:
+            type: map
+            description: Measurement Group
+            required: true
+            entry_schema:
+               type: onap.datatypes.monitoring.measurementGroup
+   onap.datatypes.monitoring.measurementGroup:
+      derived_from: tosca.datatypes.Root
+      properties:
+         measurementTypes:
+            type: list
+            description: List of measurement types
+            required: true
+            #default: []
+            entry_schema:
+               type: onap.datatypes.monitoring.measurementTypes
+         managedObjectDNsBasic:
+            type: list
+            description: List of managed object distinguished names
+            required: true
+            #default: []
+            entry_schema:
+               type: onap.datatypes.monitoring.managedObjectDNsBasics
+   onap.datatypes.monitoring.measurementTypes:
+      derived_from: tosca.datatypes.Root
+      properties:
+         measurementType:
+            type: map
+            description: Measurement type object
+            required: true
+            entry_schema:
+               type: onap.datatypes.monitoring.measurementType
+   onap.datatypes.monitoring.measurementType:
+      derived_from: tosca.datatypes.Root
+      properties:
+         measurementType:
+            type: string
+            description: Measurement type
+            required: true
+   onap.datatypes.monitoring.managedObjectDNsBasics:
+      derived_from: tosca.datatypes.Root
+      properties:
+         managedObjectDNsBasic:
+            type: map
+            description: Managed object distinguished name object
+            required: true
+            entry_schema:
+               type: onap.datatypes.monitoring.managedObjectDNsBasic
+   onap.datatypes.monitoring.managedObjectDNsBasic:
+      derived_from: tosca.datatypes.Root
+      properties:
+         DN:
+            type: string
+            description: Managed object distinguished name
+            required: true
+
diff --git a/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.monitoring.dcae-restconfcollector.yaml b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.monitoring.dcae-restconfcollector.yaml
new file mode 100644
index 0000000..58e60e9
--- /dev/null
+++ b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.monitoring.dcae-restconfcollector.yaml
@@ -0,0 +1,128 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+   onap.policies.Monitoring:
+      derived_from: tosca.policies.Root
+      version: 1.0.0
+      name: onap.policies.Monitoring
+      description: a base policy type for all policies that govern monitoring provisioning
+   onap.policies.monitoring.dcae-restconfcollector:
+      derived_from: onap.policies.Monitoring
+      version: 1.0.0
+      properties:
+         rcc_policy:
+            type: list
+            description: RCC Policy JSON
+            entry_schema:
+               type: onap.datatypes.monitoring.rcc_policy
+data_types:
+   onap.datatypes.monitoring.rcc_policy:
+      derived_from: tosca.datatypes.Root
+      properties:
+         controller_name:
+            type: string
+            description: Name of controller
+            required: true
+         controller_restapiUrl:
+            type: string
+            description: Controller's ip and port
+            required: true
+         controller_restapiUser:
+            type: string
+            description: Controller's username
+            required: true
+         controller_restapiPassword:
+            type: string
+            description: Controller's password
+            required: true
+         controller_accessTokenUrl:
+            type: string
+            description: URL to get access token
+            required: true
+         controller_accessTokenFile:
+            type: string
+            description: Access token file path
+            required: true
+         controller_accessTokenMethod:
+            type: string
+            description: Access token method POST/GET/PUT etc
+            required: true
+            constraints:
+            -  valid_values:
+               - post
+               - get
+               - put
+         controller_subsMethod:
+            type: string
+            description: Subscription method POST/GET/PUT etc
+            required: true
+            default: post
+            constraints:
+            -  valid_values:
+               - post
+               - get
+               - put
+         controller_subscriptionUrl:
+            type: string
+            description: URL to establish subscription
+            required: true
+         controller_disableSsl:
+            type: boolean
+            description: Option to disable ssl
+            required: true
+            default: true
+         event_details:
+            type: list
+            description: event details
+            required: true
+            entry_schema:
+               type: onap.datatypes.monitoring.rcc_event_details
+   onap.datatypes.monitoring.rcc_event_details:
+      derived_from: tosca.datatypes.Root
+      properties:
+         event_name:
+            type: string
+            description: event name
+            required: true
+         event_description:
+            type: string
+            description: description of event
+            required: false
+         event_sseventUrlEmbed:
+            type: boolean
+            description: Whether SSE url is embedded in subscription response
+            required: true
+            default: true
+         event_sseventsField:
+            type: string
+            description: Field name to access SSE url in subscription response
+            required: true
+         event_sseventsUrl:
+            type: string
+            description: Explicit SSE url
+            required: true
+         event_subscriptionTemplate:
+            type: string
+            description: Subscription template file path
+            required: true
+         event_unSubscriptionTemplate:
+            type: string
+            description: Unsubscription template file path
+            required: false
+         event_ruleId:
+            type: integer
+            description: Rule Id
+            required: false
+         modifyData:
+            type: boolean
+            description: Whether to modify the received SSE event
+            required: true
+            default: false
+         modifyMethod:
+            type: string
+            description: The java method name to modify data
+            required: false
+         userData:
+            type: string
+            description: The user specific data
+            required: false
+
diff --git a/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server.yaml b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server.yaml
new file mode 100644
index 0000000..408e8cd
--- /dev/null
+++ b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server.yaml
@@ -0,0 +1,19 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+   onap.policies.Monitoring:
+      derived_from: tosca.policies.Root
+      description: a base policy type for all policies that govern monitoring provisioning
+      version: 1.0.0
+      name: onap.policies.Monitoring
+   onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server:
+      derived_from: onap.policies.Monitoring
+      version: 1.0.0
+      name: onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server
+      properties:
+         buscontroller_feed_publishing_endpoint:
+            type: string
+            description: DMAAP Bus Controller feed endpoint
+         datafile.policy:
+            type: string
+            description: datafile Policy JSON as string
+
diff --git a/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.monitoring.tcagen2.yaml b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.monitoring.tcagen2.yaml
new file mode 100644
index 0000000..04026b3
--- /dev/null
+++ b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.monitoring.tcagen2.yaml
@@ -0,0 +1,161 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+   onap.policies.Monitoring:
+      derived_from: tosca.policies.Root
+      version: 1.0.0
+      name: onap.policies.Monitoring
+      description: a base policy type for all policies that govern monitoring provisioning
+   onap.policies.monitoring.tcagen2:
+      derived_from: onap.policies.Monitoring
+      version: 1.0.0
+      name: onap.policies.monitoring.tcagen2
+      properties:
+         tca.policy:
+            type: onap.datatypes.monitoring.tca_policy
+            description: TCA Policy JSON
+            required: true
+data_types:
+   onap.datatypes.monitoring.metricsPerEventName:
+      derived_from: tosca.datatypes.Root
+      properties:
+         controlLoopSchemaType:
+            type: string
+            required: true
+            description: Specifies Control Loop Schema Type for the event Name e.g. VNF, VM
+            constraints:
+            -  valid_values:
+               - VM
+               - VNF
+         eventName:
+            type: string
+            required: true
+            description: Event name to which thresholds need to be applied
+         policyName:
+            type: string
+            required: true
+            description: TCA Policy Scope Name
+         policyScope:
+            type: string
+            required: true
+            description: TCA Policy Scope
+         policyVersion:
+            type: string
+            required: true
+            description: TCA Policy Scope Version
+         thresholds:
+            type: list
+            required: true
+            description: Thresholds associated with eventName
+            entry_schema:
+               type: onap.datatypes.monitoring.thresholds
+   onap.datatypes.monitoring.tca_policy:
+      derived_from: tosca.datatypes.Root
+      properties:
+         domain:
+            type: string
+            required: true
+            description: Domain name to which TCA needs to be applied
+            default: measurementsForVfScaling
+            constraints:
+            -  equal: measurementsForVfScaling
+         metricsPerEventName:
+            type: list
+            required: true
+            description: Contains eventName and threshold details that need to be applied to given eventName
+            entry_schema:
+               type: onap.datatypes.monitoring.metricsPerEventName
+   onap.datatypes.monitoring.thresholds:
+      derived_from: tosca.datatypes.Root
+      properties:
+         closedLoopControlName:
+            type: string
+            required: true
+            description: Closed Loop Control Name associated with the threshold
+         closedLoopEventStatus:
+            type: string
+            required: true
+            description: Closed Loop Event Status of the threshold
+            constraints:
+            -  valid_values:
+               - ONSET
+               - ABATED
+         direction:
+            type: string
+            required: true
+            description: Direction of the threshold
+            constraints:
+            -  valid_values:
+               - LESS
+               - LESS_OR_EQUAL
+               - GREATER
+               - GREATER_OR_EQUAL
+               - EQUAL
+         fieldPath:
+            type: string
+            required: true
+            description: Json field Path as per CEF message which needs to be analyzed for TCA
+            constraints:
+            -  valid_values:
+               - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedTotalPacketsDelta
+               - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedOctetsDelta
+               - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedUnicastPacketsDelta
+               - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedMulticastPacketsDelta
+               - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedBroadcastPacketsDelta
+               - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedDiscardedPacketsDelta
+               - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedErrorPacketsDelta
+               - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedTotalPacketsAccumulated
+               - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedOctetsAccumulated
+               - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedUnicastPacketsAccumulated
+               - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedMulticastPacketsAccumulated
+               - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedBroadcastPacketsAccumulated
+               - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedDiscardedPacketsAccumulated
+               - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedErrorPacketsAccumulated
+               - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedTotalPacketsDelta
+               - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedOctetsDelta
+               - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedUnicastPacketsDelta
+               - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedMulticastPacketsDelta
+               - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedBroadcastPacketsDelta
+               - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedDiscardedPacketsDelta
+               - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedErrorPacketsDelta
+               - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedTotalPacketsAccumulated
+               - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedOctetsAccumulated
+               - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedUnicastPacketsAccumulated
+               - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedMulticastPacketsAccumulated
+               - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedBroadcastPacketsAccumulated
+               - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedDiscardedPacketsAccumulated
+               - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedErrorPacketsAccumulated
+               - $.event.measurementsForVfScalingFields.cpuUsageArray[*].cpuIdle
+               - $.event.measurementsForVfScalingFields.cpuUsageArray[*].cpuUsageInterrupt
+               - $.event.measurementsForVfScalingFields.cpuUsageArray[*].cpuUsageNice
+               - $.event.measurementsForVfScalingFields.cpuUsageArray[*].cpuUsageSoftIrq
+               - $.event.measurementsForVfScalingFields.cpuUsageArray[*].cpuUsageSteal
+               - $.event.measurementsForVfScalingFields.cpuUsageArray[*].cpuUsageSystem
+               - $.event.measurementsForVfScalingFields.cpuUsageArray[*].cpuWait
+               - $.event.measurementsForVfScalingFields.cpuUsageArray[*].percentUsage
+               - $.event.measurementsForVfScalingFields.meanRequestLatency
+               - $.event.measurementsForVfScalingFields.memoryUsageArray[*].memoryBuffered
+               - $.event.measurementsForVfScalingFields.memoryUsageArray[*].memoryCached
+               - $.event.measurementsForVfScalingFields.memoryUsageArray[*].memoryConfigured
+               - $.event.measurementsForVfScalingFields.memoryUsageArray[*].memoryFree
+               - $.event.measurementsForVfScalingFields.memoryUsageArray[*].memoryUsed
+               - $.event.measurementsForVfScalingFields.additionalMeasurements[*].arrayOfFields[0].value
+         severity:
+            type: string
+            required: true
+            description: Threshold Event Severity
+            constraints:
+            -  valid_values:
+               - CRITICAL
+               - MAJOR
+               - MINOR
+               - WARNING
+               - NORMAL
+         thresholdValue:
+            type: integer
+            required: true
+            description: Threshold value for the field Path inside CEF message
+         version:
+            type: string
+            required: true
+            description: Version number associated with the threshold
+
diff --git a/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.native.Apex.yaml b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.native.Apex.yaml
new file mode 100644
index 0000000..d2a7632
--- /dev/null
+++ b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.native.Apex.yaml
@@ -0,0 +1,203 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+    onap.policies.Native:
+        derived_from: tosca.policies.Root
+        description: a base policy type for all native PDP policies
+        version: 1.0.0
+        name: onap.policies.Native
+    onap.policies.native.Apex:
+        derived_from: onap.policies.Native
+        description: a policy type for native apex policies
+        version: 1.0.0
+        name: onap.policies.native.Apex
+        properties:
+            engine_service:
+                type: onap.datatypes.native.apex.EngineService
+                description: APEX Engine Service Parameters
+            inputs:
+                type: map
+                description: Inputs for handling events coming into the APEX engine
+                entry_schema:
+                    type: onap.datatypes.native.apex.EventHandler
+            outputs:
+                type: map
+                description: Outputs for handling events going out of the APEX engine
+                entry_schema:
+                    type: onap.datatypes.native.apex.EventHandler
+            environment:
+                type: list
+                description: Envioronmental parameters for the APEX engine
+                entry_schema:
+                    type: onap.datatypes.native.apex.Environment
+
+data_types:
+    onap.datatypes.native.apex.EngineService:
+        derived_from: tosca.datatypes.Root
+        properties:
+            name:
+                type: string
+                description: Specifies the engine name
+                required: false
+                default: "ApexEngineService"
+            version:
+                type: string
+                description: Specifies the engine version in double dotted format
+                required: false
+                default: "1.0.0"
+            id:
+                type: integer
+                description: Specifies the engine id
+                required: true
+            instance_count:
+                type: integer
+                description: Specifies the number of engine threads that should be run
+                required: true
+            deployment_port:
+                type: integer
+                description: Specifies the port to connect to for engine administration
+                required: false
+                default: 1
+            policy_model_file_name:
+                type: string
+                description: The name of the file from which to read the APEX policy model
+                required: false
+            policy_type_impl:
+                type: string
+                description: The policy type implementation from which to read the APEX policy model
+                required: false
+            periodic_event_period:
+                type: string
+                description: The time interval in milliseconds for the periodic scanning event, 0 means don't scan
+                required: false
+            engine:
+                type: onap.datatypes.native.apex.engineservice.Engine
+                description: The parameters for all engines in the APEX engine service
+                required: true
+    onap.datatypes.native.apex.EventHandler:
+        derived_from: tosca.datatypes.Root
+        properties:
+            name:
+                type: string
+                description: Specifies the event handler name, if not specified this is set to the key name
+                required: false
+            carrier_technology:
+                type: onap.datatypes.native.apex.CarrierTechnology
+                description: Specifies the carrier technology of the event handler (such as REST/Web Socket/Kafka)
+                required: true
+            event_protocol:
+                type: onap.datatypes.native.apex.EventProtocol
+                description: Specifies the event protocol of events for the event handler (such as Yaml/JSON/XML/POJO)
+                required: true
+            event_name:
+                type: string
+                description: Specifies the event name for events on this event handler, if not specified, the event name is read from or written to the event being received or sent
+                required: false
+            event_name_filter:
+                type: string
+                description: Specifies a filter as a regular expression, events that do not match the filter are dropped, the default is to let all events through
+                required: false
+            synchronous_mode:
+                type: boolean
+                description: Specifies the event handler is syncronous (receive event and send response)
+                required: false
+                default: false
+            synchronous_peer:
+                type: string
+                description: The peer event handler (output for input or input for output) of this event handler in synchronous mode, this parameter is mandatory if the event handler is in synchronous mode
+                required: false
+            synchronous_timeout:
+                type: integer
+                description: The timeout in milliseconds for responses to be issued by APEX torequests, this parameter is mandatory if the event handler is in synchronous mode
+                required: false
+            requestor_mode:
+                type: boolean
+                description: Specifies the event handler is in requestor mode (send event and wait for response mode)
+                required: false
+                default: false
+            requestor_peer:
+                type: string
+                description: The peer event handler (output for input or input for output) of this event handler in requestor mode, this parameter is mandatory if the event handler is in requestor mode
+                required: false
+            requestor_timeout:
+                type: integer
+                description: The timeout in milliseconds for wait for responses to requests, this parameter is mandatory if the event handler is in requestor mode
+                required: false
+    onap.datatypes.native.apex.CarrierTechnology:
+        derived_from: tosca.datatypes.Root
+        properties:
+            label:
+                type: string
+                description: The label (name) of the carrier technology (such as REST, Kafka, WebSocket)
+                required: true
+            plugin_parameter_class_name:
+                type: string
+                description: The class name of the class that overrides default handling of event input or output for this carrier technology, defaults to the supplied input or output class
+                required: false
+    onap.datatypes.native.apex.EventProtocol:
+        derived_from: tosca.datatypes.Root
+        properties:
+            label:
+                type: string
+                description: The label (name) of the event protocol (such as Yaml, JSON, XML, or POJO)
+                required: true
+            event_protocol_plugin_class:
+                type: string
+                description: The class name of the class that overrides default handling of the event protocol for this carrier technology, defaults to the supplied event protocol class
+                required: false
+    onap.datatypes.native.apex.Environment:
+        derived_from: tosca.datatypes.Root
+        properties:
+            name:
+                type: string
+                description: The name of the environment variable
+                required: true
+            value:
+                type: string
+                description: The value of the environment variable
+                required: true
+    onap.datatypes.native.apex.engineservice.Engine:
+        derived_from: tosca.datatypes.Root
+        properties:
+            context:
+                type: onap.datatypes.native.apex.engineservice.engine.Context
+                description: The properties for handling context in APEX engines, defaults to using Java maps for context
+                required: false
+            executors:
+                type: map
+                description: The plugins for policy executors used in engines such as javascript, MVEL, Jython
+                required: true
+                entry_schema:
+                    description: The plugin class path for this policy executor
+                    type: string
+    onap.datatypes.native.apex.engineservice.engine.Context:
+        derived_from: tosca.datatypes.Root
+        properties:
+            distributor:
+                type: onap.datatypes.native.apex.Plugin
+                description: The plugin to be used for distributing context between APEX PDPs at runtime
+                required: false
+            schemas:
+                type: map
+                description: The plugins for context schemas available in APEX PDPs such as Java and Avro
+                required: false
+                entry_schema:
+                    type: onap.datatypes.native.apex.Plugin
+            locking:
+                type: onap.datatypes.native.apex.Plugin
+                description: The plugin to be used for locking context in and between APEX PDPs at runtime
+                required: false
+            persistence:
+                type: onap.datatypes.native.apex.Plugin
+                description: The plugin to be used for persisting context for APEX PDPs at runtime
+                required: false
+    onap.datatypes.native.apex.Plugin:
+        derived_from: tosca.datatypes.Root
+        properties:
+            name:
+                type: string
+                description: The name of the executor such as Javascript, Jython or MVEL
+                required: true
+            plugin_class_name:
+                type: string
+                description: The class path of the plugin class for this executor
+
diff --git a/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.native.Drools.yaml b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.native.Drools.yaml
new file mode 100644
index 0000000..0ae96db
--- /dev/null
+++ b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.native.Drools.yaml
@@ -0,0 +1,118 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+    onap.policies.Native:
+        derived_from: tosca.policies.Root
+        description: a base policy type for all native PDP policies
+        version: 1.0.0
+        name: onap.policies.Native
+    onap.policies.native.Drools:
+        derived_from: onap.policies.Native
+        description: a base policy type for all native PDP policies
+        version: 1.0.0
+        name: onap.policies.native.Drools
+    onap.policies.native.drools.Controller:
+        derived_from: onap.policies.native.Drools
+        description: a policy type for a drools controller configuration
+        version: 1.0.0
+        name: onap.policies.native.drools.Controller
+        properties:
+            controllerName:
+                type: string
+                required: true
+                description: the drools controller name
+            sourceTopics:
+                type: list
+                required: false
+                description: source topics and applicable events
+                entry_schema:
+                    type: onap.datatypes.dmaap.topic
+            sinkTopics:
+                type: list
+                required: false
+                description: sink topics and applicable events
+                entry_schema:
+                    type: onap.datatypes.dmaap.topic
+            customConfig:
+                type: map
+                required: false
+                description: any use case specific configurations relevant to the drools controller
+                entry_schema:
+                    type: string
+    onap.policies.native.drools.Artifact:
+        derived_from: onap.policies.native.Drools
+        description: a policy type for native drools artifact policies
+        version: 1.0.0
+        name: onap.policies.native.drools.Artifact
+        properties:
+            rulesArtifact:
+                type: onap.datatypes.native.rules_artifact
+                required: true
+                description: the GAV information of the maven artifact
+            controller:
+                type: onap.datatypes.drools.controller.relation
+                required: true
+                description: the drools controller to which the current native policy is assigned
+
+data_types:
+    onap.datatypes.dmaap.topic:
+        derived_from: tosca.datatypes.Root
+        properties:
+            topicName:
+                type: string
+                required: true
+                description: the dmaap topic name
+            events:
+                type: list
+                required: true
+                description: events used by this topic
+                entry_schema:
+                    type: onap.datatypes.dmaap.events
+    onap.datatypes.dmaap.events:
+        derived_from: tosca.datatypes.Root
+        properties:
+            eventClass:
+                type: string
+                required: true
+                description: the event canonical class for serialization
+            eventFilter:
+                type: string
+                required: false
+                description: the JSONPath based condition to filter out the events to serialize
+            customSerialization:
+                type: onap.datatypes.dmaap.custom_serialization
+                required: false
+                description:  overrides the default serialization/deserialization mechanisms with custom ones
+    onap.datatypes.dmaap.custom_serialization:
+        derived_from: tosca.datatypes.Root
+        properties:
+            customSerializerClass:
+                type: string
+                required: true
+                description: the class that contains the JSON parser serializer/deserializer.
+            jsonParser:
+                type: string
+                required: true
+                description: static field in customSerialized class with the json parser (currently only gson supported)
+    onap.datatypes.native.rules_artifact:
+        derived_from: tosca.datatypes.Root
+        properties:
+            groupId:
+                type: string
+                required: true
+                description: the groupId of the maven artifact
+            artifactId:
+                type: string
+                required: true
+                description: the artifactId of the maven artifact
+            version:
+                type: string
+                required: true
+                description: the version of the maven artifact
+    onap.datatypes.drools.controller.relation:
+        derived_from: tosca.datatypes.Root
+        properties:
+            name:
+                type: string
+                required: true
+                description: the name of drools controller policy
+
diff --git a/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.native.Xacml.yaml b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.native.Xacml.yaml
new file mode 100644
index 0000000..eb25cdb
--- /dev/null
+++ b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.native.Xacml.yaml
@@ -0,0 +1,20 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+    onap.policies.Native:
+        derived_from: tosca.policies.Root
+        description: a base policy type for all native PDP policies
+        version: 1.0.0
+        name: onap.policies.Native
+    onap.policies.native.Xacml:
+        derived_from: onap.policies.Native
+        description: a policy type for native xacml policies
+        version: 1.0.0
+        name: onap.policies.native.Xacml
+        properties:
+            policy:
+                type: string
+                required: true
+                description: The XML XACML 3.0 PolicySet or Policy
+                metadata:
+                    encoding: Base64
+
diff --git a/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.Resource.yaml b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.Resource.yaml
new file mode 100644
index 0000000..6b3a246
--- /dev/null
+++ b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.Resource.yaml
@@ -0,0 +1,25 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+   onap.policies.optimization.Resource:
+      derived_from: onap.policies.Optimization
+      version: 1.0.0
+      name: onap.policies.optimization.Resource
+      description: The base policy type for all policies that govern optimization for a Resource in a Service.
+      properties:
+         services:
+            description: One or more services that the policy applies to.
+            type: list
+            metadata:
+               matchable: true
+            required: true
+            entry_schema:
+               type: string
+         resources:
+            description: One or more VNF resources that the policy applies to.
+            type: list
+            metadata:
+               matchable: true
+            required: true
+            entry_schema:
+               type: string
+
diff --git a/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.Service.yaml b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.Service.yaml
new file mode 100644
index 0000000..8b37a67
--- /dev/null
+++ b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.Service.yaml
@@ -0,0 +1,17 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+   onap.policies.optimization.Service:
+      derived_from: onap.policies.Optimization
+      version: 1.0.0
+      name: onap.policies.optimization.Service
+      description: The base policy type for all policies that govern optimization for a Service.
+      properties:
+         services:
+            description: One or more services that the policy applies to.
+            type: list
+            metadata:
+               matchable: true
+            required: true
+            entry_schema:
+               type: string
+
diff --git a/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.resource.AffinityPolicy.yaml b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.resource.AffinityPolicy.yaml
new file mode 100644
index 0000000..bb6adb0
--- /dev/null
+++ b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.resource.AffinityPolicy.yaml
@@ -0,0 +1,33 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+   onap.policies.optimization.resource.AffinityPolicy:
+      derived_from: onap.policies.optimization.Resource
+      version: 1.0.0
+      name: onap.policies.optimization.resource.AffinityPolicy
+      properties:
+         applicableResources:
+            type: list
+            required: true
+            entry_schema:
+               type: string
+               constraints:
+               -  valid_values:
+                  - any
+                  - all
+         affinityProperties:
+            type: policy.data.affinityProperties_properties
+            required: true
+data_types:
+   policy.data.affinityProperties_properties:
+      derived_from: tosca.nodes.Root
+      properties:
+         qualifier:
+            type: string
+            constraints:
+            -  valid_values:
+               - same
+               - different
+         category:
+            type: string
+            required: true
+
diff --git a/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.resource.DistancePolicy.yaml b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.resource.DistancePolicy.yaml
new file mode 100644
index 0000000..f41dcfd
--- /dev/null
+++ b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.resource.DistancePolicy.yaml
@@ -0,0 +1,58 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+   onap.policies.optimization.resource.DistancePolicy:
+      derived_from: onap.policies.optimization.Resource
+      version: 1.0.0
+      name: onap.policies.optimization.resource.DistancePolicy
+      properties:
+         applicableResources:
+            type: list
+            required: true
+            entry_schema:
+               type: string
+               constraints:
+               -  valid_values:
+                  - any
+                  - all
+         distanceProperties:
+            type: policy.data.distanceProperties_properties
+            required: true
+data_types:
+   policy.data.distanceProperties_properties:
+      derived_from: tosca.nodes.Root
+      properties:
+         locationInfo:
+            type: string
+            required: true
+         distance:
+            type: policy.data.distance_properties
+            required: true
+            entry_schema:
+               type: policy.data.distance_properties
+   policy.data.distance_properties:
+      derived_from: tosca.nodes.Root
+      properties:
+         value:
+            type: string
+            required: true
+         operator:
+            type: list
+            required: true
+            entry_schema:
+               type: string
+               constraints:
+               -  valid_values:
+                  - <
+                  - <=
+                  - '>'
+                  - '>='
+                  - =
+         unit:
+            type: list
+            required: true
+            entry_schema:
+               type: string
+               constraints:
+               -  valid_values:
+                  - km
+
diff --git a/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.resource.HpaPolicy.yaml b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.resource.HpaPolicy.yaml
new file mode 100644
index 0000000..dfe3077
--- /dev/null
+++ b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.resource.HpaPolicy.yaml
@@ -0,0 +1,105 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+   onap.policies.optimization.resource.HpaPolicy:
+      derived_from: onap.policies.optimization.Resource
+      version: 1.0.0
+      name: onap.policies.optimization.resource.HpaPolicy
+      properties:
+         flavorFeatures:
+            type: list
+            required: true
+            entry_schema:
+               type: policy.data.flavorFeatures_properties
+data_types:
+   policy.data.flavorFeatures_properties:
+      derived_from: tosca.nodes.Root
+      properties:
+         id:
+            type: string
+            required: true
+         type:
+            type: string
+            required: true
+         directives:
+            type: list
+            required: true
+            entry_schema:
+               type: policy.data.directives_properties
+         flavorProperties:
+            type: list
+            required: true
+            entry_schema:
+               type: policy.data.flavorProperties_properties
+   policy.data.directives_properties:
+      derived_from: tosca.nodes.Root
+      properties:
+         type:
+            type: string
+         attributes:
+            type: list
+            entry_schema:
+               type: policy.data.directives_attributes_properties
+   policy.data.directives_attributes_properties:
+      derived_from: tosca.nodes.Root
+      properties:
+         attribute_name:
+            type: string
+         attribute_value:
+            type: string
+   policy.data.flavorProperties_properties:
+      derived_from: tosca.nodes.Root
+      properties:
+         hpa-feature:
+            type: string
+            required: true
+         mandatory:
+            type: string
+            required: true
+         score:
+            type: string
+            required: false
+         architecture:
+            type: string
+            required: true
+         hpa-version:
+            type: string
+            required: true
+         directives:
+            type: list
+            required: true
+            entry_schema:
+               type: policy.data.directives_properties
+         hpa-feature-attributes:
+            type: list
+            required: true
+            entry_schema:
+               type: policy.data.hpa-feature-attributes_properties
+   policy.data.hpa-feature-attributes_properties:
+      derived_from: tosca.nodes.Root
+      properties:
+         hpa-attribute-key:
+            type: string
+            required: true
+         hpa-attribute-value:
+            type: string
+            required: true
+         operator:
+            type: list
+            required: true
+            entry_schema:
+               type: string
+               constraints:
+               -  valid_values:
+                  - <
+                  - <=
+                  - '>'
+                  - '>='
+                  - =
+                  - '!='
+                  - any
+                  - all
+                  - subset
+         unit:
+            type: string
+            required: false
+
diff --git a/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.resource.OptimizationPolicy.yaml b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.resource.OptimizationPolicy.yaml
new file mode 100644
index 0000000..b0f77d6
--- /dev/null
+++ b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.resource.OptimizationPolicy.yaml
@@ -0,0 +1,68 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+   onap.policies.optimization.resource.OptimizationPolicy:
+      derived_from: onap.policies.optimization.Resource
+      version: 1.0.0
+      name: onap.policies.optimization.resource.OptimizationPolicy
+      properties:
+         objective:
+            type: list
+            required: true
+            entry_schema:
+               type: string
+               constraints:
+               -  valid_values:
+                  - minimize
+                  - maximize
+         objectiveParameter:
+            type: policy.data.objectiveParameter_properties
+            required: true
+data_types:
+   policy.data.objectiveParameter_properties:
+      derived_from: tosca.nodes.Root
+      properties:
+         parameterAttributes:
+            type: list
+            required: true
+            entry_schema:
+               type: policy.data.parameterAttributes_properties
+         operator:
+            type: list
+            required: true
+            entry_schema:
+               type: string
+               constraints:
+               -  valid_values:
+                  - '*'
+                  - +
+                  - '-'
+                  - /
+                  - '%'
+   policy.data.parameterAttributes_properties:
+      derived_from: tosca.nodes.Root
+      properties:
+         resources:
+            type: string
+            required: true
+         customerLocationInfo:
+            type: string
+            required: true
+         parameter:
+            type: string
+            required: true
+         weight:
+            type: string
+            required: true
+         operator:
+            type: list
+            required: true
+            entry_schema:
+               type: string
+               constraints:
+               -  valid_values:
+                  - '*'
+                  - +
+                  - '-'
+                  - /
+                  - '%'
+
diff --git a/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.resource.PciPolicy.yaml b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.resource.PciPolicy.yaml
new file mode 100644
index 0000000..e636582
--- /dev/null
+++ b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.resource.PciPolicy.yaml
@@ -0,0 +1,32 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+   onap.policies.optimization.resource.PciPolicy:
+      derived_from: onap.policies.optimization.Resource
+      version: 1.0.0
+      name: onap.policies.optimization.resource.PciPolicy
+      properties:
+         pciProperties:
+            type: list
+            required: false
+            entry_schema:
+               type: policy.data.pciProperties_properties
+data_types:
+   policy.data.pciProperties_properties:
+      derived_from: tosca.nodes.Root
+      properties:
+         algoCategory:
+            type: string
+            required: false
+         pciOptmizationAlgoName:
+            type: string
+            required: false
+         pciOptimizationNwConstraint:
+            type: string
+            required: false
+         pciOptimizationPriority:
+            type: string
+            required: false
+         pciOptimizationTimeConstraint:
+            type: string
+            required: false
+
diff --git a/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.resource.Vim_fit.yaml b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.resource.Vim_fit.yaml
new file mode 100644
index 0000000..cb387dd
--- /dev/null
+++ b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.resource.Vim_fit.yaml
@@ -0,0 +1,30 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+   onap.policies.optimization.resource.Vim_fit:
+      derived_from: onap.policies.optimization.Resource
+      version: 1.0.0
+      name: onap.policies.optimization.resource.Vim_fit
+      properties:
+         applicableResources:
+            type: list
+            required: true
+            entry_schema:
+               type: string
+               constraints:
+               -  valid_values:
+                  - any
+                  - all
+         capacityProperties:
+            type: policy.data.capacityProperties_properties
+            required: true
+data_types:
+   policy.data.capacityProperties_properties:
+      derived_from: tosca.nodes.Root
+      properties:
+         controller:
+            type: string
+            required: true
+         request:
+            type: string
+            required: true
+
diff --git a/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.resource.VnfPolicy.yaml b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.resource.VnfPolicy.yaml
new file mode 100644
index 0000000..30b8b72
--- /dev/null
+++ b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.resource.VnfPolicy.yaml
@@ -0,0 +1,46 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+   onap.policies.optimization.resource.VnfPolicy:
+      derived_from: onap.policies.optimization.Resource
+      version: 1.0.0
+      name: onap.policies.optimization.resource.VnfPolicy
+      properties:
+         applicableResources:
+            type: list
+            required: true
+            entry_schema:
+               type: string
+               constraints:
+               -  valid_values:
+                  - any
+                  - all
+         vnfProperties:
+            type: list
+            required: true
+            entry_schema:
+               type: policy.data.vnfProperties_properties
+data_types:
+   policy.data.vnfProperties_properties:
+      derived_from: tosca.nodes.Root
+      properties:
+         inventoryProvider:
+            type: string
+            required: true
+         serviceType:
+            type: string
+            required: true
+         inventoryType:
+            type: list
+            required: true
+            entry_schema:
+               type: string
+               constraints:
+               -  valid_values:
+                  - serviceInstanceId
+                  - vnfName
+                  - cloudRegionId
+                  - vimId
+         customerId:
+            type: string
+            required: true
+
diff --git a/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.service.QueryPolicy.yaml b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.service.QueryPolicy.yaml
new file mode 100644
index 0000000..2ff263b
--- /dev/null
+++ b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.service.QueryPolicy.yaml
@@ -0,0 +1,26 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+   onap.policies.optimization.service.QueryPolicy:
+      derived_from: onap.policies.optimization.Service
+      version: 1.0.0
+      name: onap.policies.optimization.service.QueryPolicy
+      properties:
+         queryProperties:
+            type: list
+            required: true
+            entry_schema:
+               type: policy.data.queryProperties_properties
+data_types:
+   policy.data.queryProperties_properties:
+      derived_from: tosca.nodes.Root
+      properties:
+         attribute:
+            type: string
+            required: true
+         value:
+            type: string
+            required: true
+         attribute_location:
+            type: string
+            required: true
+
diff --git a/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.service.SubscriberPolicy.yaml b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.service.SubscriberPolicy.yaml
new file mode 100644
index 0000000..81dea2c
--- /dev/null
+++ b/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.service.SubscriberPolicy.yaml
@@ -0,0 +1,36 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+    onap.policies.optimization.service.SubscriberPolicy:
+        derived_from: onap.policies.optimization.Service
+        version: 1.0.0
+        name: onap.policies.optimization.service.SubscriberPolicy
+        properties:
+            subscriberProperties:
+                type: policy.data.subscriberProperties_properties
+                required: true
+data_types:
+    policy.data.subscriberProperties_properties:
+        derived_from: tosca.nodes.Root
+        properties:
+            subscriberName:
+                type: list
+                required: true
+                metadata:
+                    contextProvider: true
+                entry_schema:
+                    type: string
+            subscriberRole:
+                type: list
+                required: true
+                metadata:
+                    contextMatchable: scope
+                entry_schema:
+                    type: string
+            provStatus:
+                type: list
+                required: true
+                metadata:
+                    contextAttribute: true
+                entry_schema:
+                    type: string
+
diff --git a/participant/participant-impl/participant-impl-policy/src/test/resources/utils/servicetemplates/pm_control_loop_tosca.yaml b/participant/participant-impl/participant-impl-policy/src/test/resources/utils/servicetemplates/pm_control_loop_tosca.yaml
new file mode 100644
index 0000000..7d92a08
--- /dev/null
+++ b/participant/participant-impl/participant-impl-policy/src/test/resources/utils/servicetemplates/pm_control_loop_tosca.yaml
@@ -0,0 +1,614 @@
+tosca_definitions_version: tosca_simple_yaml_1_3
+policy_types:
+   onap.policies.Monitoring:
+      derived_from: tosca.policies.Root
+      version: 1.0.0
+      name: onap.policies.Monitoring
+      description: a base policy type for all policies that govern monitoring provisioning
+   onap.policies.monitoring.dcae-pm-subscription-handler:
+      derived_from: onap.policies.Monitoring
+      version: 1.0.0
+      properties:
+         subscription:
+            type: map
+            description: PM Subscription Handler Subscription
+            entry_schema:
+               type: onap.datatypes.monitoring.subscription
+data_types:
+   onap.datatypes.monitoring.subscription:
+      derived_from: tosca.datatypes.Root
+      properties:
+         subscriptionName:
+            type: string
+            description: Name of the subscription
+            required: true
+         administrativeState:
+            type: string
+            description: State of the subscription
+            required: true
+            constraints:
+            -  valid_values:
+               - LOCKED
+               - UNLOCKED
+         fileBasedGP:
+            type: integer
+            description: File based granularity period
+            required: true
+         fileLocation:
+            type: string
+            description: ROP file location
+            required: true
+         nfTypeModelInvariantId:
+            type: string
+            description: Network function invariant ID
+            required: true
+         nfFilter:
+            type: map
+            description: Network function filter
+            required: true
+            entry_schema:
+               type: onap.datatypes.monitoring.nfFilter
+         measurementGroups:
+            type: list
+            description: Measurement Groups
+            required: true
+            entry_schema:
+               type: onap.datatypes.monitoring.measurementGroups
+   onap.datatypes.monitoring.nfFilter:
+      derived_from: tosca.datatypes.Root
+      properties:
+         nfNames:
+            type: list
+            description: List of network functions
+            required: true
+            #default: []
+            entry_schema:
+               type: string
+         swVersions:
+            type: list
+            description: List of software versions
+            required: true
+            #default: []
+            entry_schema:
+               type: string
+   onap.datatypes.monitoring.measurementGroups:
+      derived_from: tosca.datatypes.Root
+      properties:
+         measurementGroup:
+            type: map
+            description: Measurement Group
+            required: true
+            entry_schema:
+               type: onap.datatypes.monitoring.measurementGroup
+   onap.datatypes.monitoring.measurementGroup:
+      derived_from: tosca.datatypes.Root
+      properties:
+         measurementTypes:
+            type: list
+            description: List of measurement types
+            required: true
+            #default: []
+            entry_schema:
+               type: onap.datatypes.monitoring.measurementTypes
+         managedObjectDNsBasic:
+            type: list
+            description: List of managed object distinguished names
+            required: true
+            #default: []
+            entry_schema:
+               type: onap.datatypes.monitoring.managedObjectDNsBasics
+   onap.datatypes.monitoring.measurementTypes:
+      derived_from: tosca.datatypes.Root
+      properties:
+         measurementType:
+            type: map
+            description: Measurement type object
+            required: true
+            entry_schema:
+               type: onap.datatypes.monitoring.measurementType
+   onap.datatypes.monitoring.measurementType:
+      derived_from: tosca.datatypes.Root
+      properties:
+         measurementType:
+            type: string
+            description: Measurement type
+            required: true
+   onap.datatypes.monitoring.managedObjectDNsBasics:
+      derived_from: tosca.datatypes.Root
+      properties:
+         managedObjectDNsBasic:
+            type: map
+            description: Managed object distinguished name object
+            required: true
+            entry_schema:
+               type: onap.datatypes.monitoring.managedObjectDNsBasic
+   onap.datatypes.monitoring.managedObjectDNsBasic:
+      derived_from: tosca.datatypes.Root
+      properties:
+         DN:
+            type: string
+            description: Managed object distinguished name
+            required: true
+capability_types:
+  org.onap.EventProducer:
+    properties:
+      carrier_protocol_type:
+        type: string
+        required: true
+        constraints:
+        - valid_values:
+          - DMAAP_message_router
+          - SOMETHING_ELSE
+          - REST
+      data_format:
+        type: string
+        required: true
+        constraints:
+        - valid_values:
+          - JSON
+          - YAML
+          - JMS
+      event_format:
+        type: string
+        required: true
+      event_format_version:
+        type: string
+        required: false
+      config_keys:
+        type: list
+        required: false
+        entry_schema:
+          type: string
+          constraints:
+          - valid_values:
+            - all valid values should be added here
+            - if not specified, events of any config key may be generated
+            - 'examples for config_key: ves-measurement, ves-syslog, tca_handle_out,
+              etc.'
+    version: 0.0.1
+    derived_from: tosca.capabilities.Root
+  org.onap.EventConsumer:
+    properties:
+      responding_capability:
+        type: string
+        required: false
+      carrier_protocol_type:
+        type: string
+        required: true
+        constraints:
+        - valid_values:
+          - DMAAP_message_router
+          - SOMETHING_ELSE
+          - REST
+      data_format:
+        type: string
+        required: true
+        constraints:
+        - valid_values:
+          - JSON
+          - YAML
+          - JMS
+          - all valid values should be added here
+      event_format:
+        type: string
+        description: 'examples for event_format: Ves_specification, LinkUp, VnfConfigured,
+          etc.'
+        required: true
+      event_format_version:
+        type: string
+        description: 'examples for event_format_version: 5.28.4, 7.30.1, etc.'
+        required: false
+      config_keys:
+        type: list
+        required: false
+        entry_schema:
+          type: string
+          constraints:
+          - valid_values:
+            - all valid values should be added here
+            - if not specified, events of any config key may be generated
+            - 'examples for config_key: ves-measurement, ves-syslog, tca_handle_out,
+              etc.'
+    version: 0.0.1
+    derived_from: tosca.capabilities.Root
+node_types:
+  org.onap.DynamicConfig:
+    properties:
+      application_name:
+        type: string
+        description: Value used to tie the config to an application ? should we be
+          using a relationship here instead?
+        required: true
+      application_version:
+        type: string
+        required: true
+      application_provider:
+        type: string
+        required: false
+      data_types:
+        type: object
+        required: false
+      schema:
+        type: object
+        required: false
+    version: 0.0.1
+    derived_from: tosca.nodes.Root
+  org.onap.APP:
+    properties:
+      application_name:
+        type: string
+        description: Human readable name for the application Product
+        required: false
+      provider:
+        type: string
+        description: Provider of the application and of the descriptor
+        required: true
+      application_version:
+        type: string
+        description: Software version of the application
+        required: true
+      blueprint_id:
+        type: string
+        description: A reference to the app blueprint
+        required: false
+      monitoring_policy:
+        type: string
+        description: A reference to the monitoring policy
+        required: false
+    requirements:
+    - receive:
+        capability: org.onap.EventProducer
+        relationship: org.onap.PropagateEvent
+        occurrences:
+        - 0.0
+        - UNBOUNDED
+        type: string
+        type_version: 0.0.0
+        version: 0.0.0
+    - send:
+        capability: org.onap.EventConsumer
+        relationship: org.onap.PropagateEvent
+        occurrences:
+        - 0.0
+        - UNBOUNDED
+        type: string
+        type_version: 0.0.0
+        version: 0.0.0
+    version: 0.0.1
+    derived_from: tosca.nodes.Root
+  org.onap.EventRelay:
+    properties:
+      event_format:
+        type: string
+        description: 'examples for event_format: Ves_specification, etc.'
+        required: true
+      event_format_version:
+        type: string
+        description: 'examples for event_format_version: 5.28.4, 7.30.1, etc.'
+        required: true
+      config_keys:
+        type: list
+        required: false
+        entry_schema:
+          type: string
+          constraints:
+          - valid_values:
+            - all valid values should be added here
+            - if not specified, events of any config key is relayed
+            - 'examples for config_key: ves-measurement, ves-syslog, tca_handle_out,
+              etc.'
+      supported_carrier_protocols:
+        type: map
+        description: 'A map describing supported carrier protocols and translations.
+          The tuples define what protocol combinations are supported on the producer
+          and consumer side: e.g. { REST: REST, DMAAP: REST, DMAAP: DMAAP}'
+        required: true
+        key_schema:
+          type: string
+          constraints:
+          - valid_values:
+            - DMAAP_message_router
+            - SOMETHING_ELSE
+            - REST
+            - all valid values should be added here
+        entry_schema:
+          type: string
+          constraints:
+          - valid_values:
+            - DMAAP_message_router
+            - SOMETHING_ELSE
+            - REST
+            - all valid values should be added here
+      supported_data_formats:
+        type: map
+        description: 'Is a map describing supported data formats and translation.
+          The tuples define what protocol combinations are supported on the producer
+          and consumer side: e.g. { JSON: JSON, JMS: JSON, YAML:YAML }'
+        required: true
+        key_schema:
+          type: string
+          constraints:
+          - valid_values:
+            - JSON
+            - JMS
+            - YAML
+            - etc
+            - all valid values should be added here
+        entry_schema:
+          type: string
+          constraints:
+          - valid_values:
+            - JSON
+            - JMS
+            - YAML
+            - etc
+            - all valid values should be added here
+    requirements:
+    - receive:
+        capability: org.onap.EventProducer
+        relationship: org.onap.PropagateEvent
+        occurrences:
+        - 0.0
+        - UNBOUNDED
+        type: string
+        type_version: 0.0.0
+        version: 0.0.0
+    - send:
+        capability: org.onap.EventConsumer
+        relationship: org.onap.PropagateEvent
+        occurrences:
+        - 0.0
+        - UNBOUNDED
+        type: string
+        type_version: 0.0.0
+        version: 0.0.0
+    version: 0.0.1
+    derived_from: tosca.nodes.Root
+relationship_types:
+  org.onap.PropagateEvent:
+    properties:
+      config_keys:
+        type: list
+        description: The relationship type used on requirements to org.onap.EventProducer
+          and org.onap.EventConsumer capabilities. Filters events by specific config_keys
+          to be transferred by this relationship. That is, any event with a specific
+          config_key found in the list is transferred. If list is not defined or is
+          empty, events with all config_keys are transferred.
+        required: false
+        entry_schema:
+          type: string
+    version: 0.0.1
+    derived_from: tosca.relationships.Root
+topology_template:
+  inputs:
+    pm_subscription_topic:
+      type: string
+    pm_subscription_response_topic:
+      type: string
+    pm_subscription_handler_blueprint_id:
+      type: string
+    pm_subscription_operational_policy_id:
+      type: string
+    pm_subscription_cds_blueprint_id:
+      type: string
+    enable_tls:
+      type: string
+  node_templates:
+    org.onap.PM_Subscription_Handler:
+      type: org.onap.APP
+      type_version: 0.0.0
+      properties:
+        application_name: PM Subscription Handler
+        provider: Ericsson
+        application_version: 1.0.0
+        artifact_id:
+          get_input: pm_subscription_handler_blueprint_id
+          description: Is this a reference to the DCAE Cloudify Blueprint that is
+            already stored(or will be stored before CL configuration & instatiation)
+            in DCAE Inventory?
+        artifact_config:
+          enable_tls:
+            get_input: enable_tls
+          pmsh_publish_topic_name:
+            get_input: pm_subscription_topic
+      capabilities:
+        pm-subscription-event-publisher:
+          properties:
+            carrier_protocol_type: DMAAP_message_router
+            data_format: JSON
+            event_format: pm-subscription-event-format
+            event_format_version: 1.0.0
+          attributes:
+            type: org.onap.EventProducer
+          occurrences:
+          - 0.0
+          - UNBOUNDED
+          type: string
+          type_version: 0.0.0
+          version: 0.0.0
+        pm-subscription-event-receiver:
+          properties:
+            carrier_protocol_type: DMAAP_message_router
+            data_format: JSON
+            event_format: pm-subscription-event-response-format
+            event_format_version: 1.0.0
+            relationships:
+            - type: tosca.relationships.DependsOn
+            - description: any ideas on a better realtionship ? or is it better to
+                just use the root realtionship ?
+            - target: org.onap.PM_Monitoring_Policy
+          attributes:
+            type: org.onap.EventConsumer
+          occurrences:
+          - 0.0
+          - UNBOUNDED
+          type: string
+          type_version: 0.0.0
+          version: 0.0.0
+      version: 0.0.0
+    org.onap.PM_Monitoring_Policy:
+      type: org.onap.DynamicConfig
+      type_version: 0.0.0
+      properties:
+        application_name: PM Subscription Handler
+        application_version: 1.0.0
+        provider: Ericsson
+        data_types:
+          measurementType:
+            type: string
+          DN:
+            type: string
+          nfFilter:
+            properties:
+              nfNames:
+                type: list
+                entry_schema: string
+              modelInvariantIDs:
+                type: list
+                entry_schema:
+                  type: string
+              modelVersionIDs:
+                type: list
+                entry_schema:
+                  type: string
+          measurementGroup:
+            properties:
+              masurementTypes:
+                type: list
+                entry_schema:
+                  type: measurementType
+              managedObjectDNsBasic:
+                type: list
+                entry_schema:
+                  type: DN
+        schema:
+          subscription:
+            subscriptionName:
+              type: string
+              required: true
+            administrativeState:
+              type: string
+              required: true
+            filebasedGP:
+              type: integer
+              required: true
+            fileLocation:
+              type: string
+              required: true
+            nfFilter:
+              type: nfFilter
+            measurementGroups:
+              type: list
+              entry_schema:
+                type: measurementGroup
+      version: 0.0.0
+      description: Should I be showing a dependency between PM Subscription Handler
+        and the PM Monitoring Policy
+    org.onap.PM_Policy:
+      type: org.onap.APP
+      type_version: 0.0.0
+      properties:
+        application_name: PM Subscription Operational Policy
+        provider: Ericsson
+        application_version: 1.0.0
+        artifact_id:
+          get_input: pm_subscription_operational_policy_id
+        artifact_config: NOT_DEFINED
+      requirements:
+      - receive_0:
+          capability: pm-subscription-event-publisher
+          node: org.onap.PM_Subscription_Handler
+          relationship: NOT_DEFINED
+          properties:
+            config_keys:
+            - topic_name:
+                get_input: pm_subscription_topic
+          type: string
+          type_version: 0.0.0
+          version: 0.0.0
+      - send_0:
+          capability: cds-rest-receive
+          node: org.onap.CDS
+          type: string
+          type_version: 0.0.0
+          version: 0.0.0
+      - receive_1:
+          capability: cds-rest-response
+          node: org.onap.CDS
+          type: string
+          type_version: 0.0.0
+          version: 0.0.0
+      - send_1:
+          capability: pm-subscription-event-receiver
+          node: org.onap.PM_Subscription_Handler
+          relationship: NOT_DEFINED
+          properties:
+            config_keys:
+            - topic_name:
+                get_input: pm_subscription_response_topic
+          type: string
+          type_version: 0.0.0
+          version: 0.0.0
+      capabilities:
+        pm-subscription-response-event-publisher:
+          properties:
+            type: org.onap.EventProducer
+            carrier_protocol_type: DMAAP_message_router
+            data_format: JSON
+            event_format: pm-subscription-event-response-format
+            event_format_version: 1.0.0
+          occurrences:
+          - 0.0
+          - UNBOUNDED
+          type: string
+          type_version: 0.0.0
+          version: 0.0.0
+      version: 0.0.0
+    org.onap.PM_CDS_Blueprint:
+      type: org.onap.APP
+      type_version: 0.0.0
+      properties:
+        application_name: PM Subscription CDS Blueprint
+        provider: Ericsson
+        application_version: 1.0.0
+        artifact_id:
+          get_input: pm_subscription_cds_blueprint_id
+      capabilities:
+        cds-rest-receive:
+          properties:
+            type: org.onap.EventConsumer
+            protocol_type: REST
+            data_format: JSON
+            event_format: cds_action_format
+            event_format_version: 1.0.0
+            responding_capability: cds-rest-response
+          occurrences:
+          - 0.0
+          - UNBOUNDED
+          type: string
+          type_version: 0.0.0
+          version: 0.0.0
+        cds-rest-response:
+          properties:
+            type: org.onap.EventProducer
+            protocol_type: REST
+            data_format: JSON
+            event_format: cds_action_response_format
+            event_format_version: 1.0.0
+          occurrences:
+          - 0.0
+          type: string
+          type_version: 0.0.0
+          version: 0.0.0
+      version: 0.0.0
+    org.onap.controlloop0:
+      type: org.onap.APP
+      type_version: 0.0.0
+      properties:
+        application_name: Test Control Loop
+        provider: Ericsson
+        application_version: 1.0.0
+        status: NOT_DEPLOYED
+      version: 0.0.0
+version: 0.0.0
+
diff --git a/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/controlloop/participant/simulator/main/parameters/ParticipantSimulatorParameterHandler.java b/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/controlloop/participant/simulator/main/parameters/ParticipantSimulatorParameterHandler.java
new file mode 100644
index 0000000..42f4586
--- /dev/null
+++ b/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/controlloop/participant/simulator/main/parameters/ParticipantSimulatorParameterHandler.java
@@ -0,0 +1,78 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.simulator.main.parameters;
+
+import java.io.File;
+import javax.ws.rs.core.Response;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopException;
+import org.onap.policy.clamp.controlloop.participant.simulator.main.startstop.ParticipantSimulatorCommandLineArguments;
+import org.onap.policy.common.parameters.ValidationResult;
+import org.onap.policy.common.utils.coder.Coder;
+import org.onap.policy.common.utils.coder.CoderException;
+import org.onap.policy.common.utils.coder.StandardCoder;
+
+/**
+ * This class handles reading, parsing and validating of participant simulator parameters from JSON files.
+ */
+public class ParticipantSimulatorParameterHandler {
+
+    private static final Coder CODER = new StandardCoder();
+
+    /**
+     * Read the parameters from the parameter file.
+     *
+     * @param arguments the arguments passed to simulator
+     * @return the parameters read from the configuration file
+     * @throws ControlLoopException on parameter exceptions
+     */
+    public ParticipantSimulatorParameters getParameters(final ParticipantSimulatorCommandLineArguments arguments)
+            throws ControlLoopException {
+        ParticipantSimulatorParameters parameters = null;
+
+        // Read the parameters
+        try {
+            // Read the parameters from JSON
+            File file = new File(arguments.getFullConfigurationFilePath());
+            parameters = CODER.decode(file, ParticipantSimulatorParameters.class);
+        } catch (final CoderException e) {
+            final String errorMessage = "error reading parameters from \"" + arguments.getConfigurationFilePath()
+                    + "\"\n" + "(" + e.getClass().getSimpleName() + ")";
+            throw new ControlLoopException(Response.Status.NOT_ACCEPTABLE, errorMessage, e);
+        }
+
+        // The JSON processing returns null if there is an empty file
+        if (parameters == null) {
+            final String errorMessage = "no parameters found in \"" + arguments.getConfigurationFilePath() + "\"";
+            throw new ControlLoopException(Response.Status.NOT_ACCEPTABLE, errorMessage);
+        }
+
+        // validate the parameters
+        final ValidationResult validationResult = parameters.validate();
+        if (!validationResult.isValid()) {
+            String returnMessage =
+                    "validation error(s) on parameters from \"" + arguments.getConfigurationFilePath() + "\"\n";
+            returnMessage += validationResult.getResult();
+            throw new ControlLoopException(Response.Status.NOT_ACCEPTABLE, returnMessage);
+        }
+
+        return parameters;
+    }
+}
diff --git a/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/controlloop/participant/simulator/main/parameters/ParticipantSimulatorParameters.java b/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/controlloop/participant/simulator/main/parameters/ParticipantSimulatorParameters.java
new file mode 100644
index 0000000..a4e62b4
--- /dev/null
+++ b/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/controlloop/participant/simulator/main/parameters/ParticipantSimulatorParameters.java
@@ -0,0 +1,51 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.simulator.main.parameters;
+
+import javax.validation.constraints.NotBlank;
+import lombok.Getter;
+import org.onap.policy.clamp.controlloop.participant.intermediary.parameters.ParticipantIntermediaryParameters;
+import org.onap.policy.common.endpoints.parameters.RestServerParameters;
+import org.onap.policy.common.parameters.ParameterGroupImpl;
+import org.onap.policy.common.parameters.annotations.NotNull;
+import org.onap.policy.models.provider.PolicyModelsProviderParameters;
+
+/**
+ * Class to hold all parameters needed for the participant simulator.
+ *
+ */
+@NotNull
+@NotBlank
+@Getter
+public class ParticipantSimulatorParameters extends ParameterGroupImpl {
+    private RestServerParameters restServerParameters;
+    private ParticipantIntermediaryParameters intermediaryParameters;
+    private PolicyModelsProviderParameters databaseProviderParameters;
+
+    /**
+     * Create the participant simulator parameter group.
+     *
+     * @param name the parameter group name
+     */
+    public ParticipantSimulatorParameters(final String name) {
+        super(name);
+    }
+}
diff --git a/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/controlloop/participant/simulator/main/rest/ParticipantSimulatorAafFilter.java b/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/controlloop/participant/simulator/main/rest/ParticipantSimulatorAafFilter.java
new file mode 100644
index 0000000..f200f97
--- /dev/null
+++ b/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/controlloop/participant/simulator/main/rest/ParticipantSimulatorAafFilter.java
@@ -0,0 +1,38 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.participant.simulator.main.rest;
+
+import org.onap.policy.common.endpoints.http.server.aaf.AafGranularAuthFilter;
+import org.onap.policy.common.utils.resources.MessageConstants;
+
+/**
+ * Class to manage AAF filters for the participant simulator component.
+ */
+public class ParticipantSimulatorAafFilter extends AafGranularAuthFilter {
+
+    public static final String AAF_NODETYPE = MessageConstants.POLICY_CLAMP + "-participant-simulator";
+    public static final String AAF_ROOT_PERMISSION = DEFAULT_NAMESPACE + "." + AAF_NODETYPE;
+
+    @Override
+    public String getPermissionTypeRoot() {
+        return AAF_ROOT_PERMISSION;
+    }
+}
diff --git a/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/controlloop/participant/simulator/main/rest/RestController.java b/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/controlloop/participant/simulator/main/rest/RestController.java
new file mode 100644
index 0000000..444f378
--- /dev/null
+++ b/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/controlloop/participant/simulator/main/rest/RestController.java
@@ -0,0 +1,130 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.participant.simulator.main.rest;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.BasicAuthDefinition;
+import io.swagger.annotations.Info;
+import io.swagger.annotations.SecurityDefinition;
+import io.swagger.annotations.SwaggerDefinition;
+import io.swagger.annotations.Tag;
+import java.net.HttpURLConnection;
+import java.util.UUID;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response.ResponseBuilder;
+import lombok.AccessLevel;
+import lombok.Getter;
+import org.onap.policy.clamp.controlloop.participant.simulator.simulation.SimulationHandler;
+import org.onap.policy.clamp.controlloop.participant.simulator.simulation.SimulationProvider;
+
+/**
+ * Common superclass to provide REST endpoints for the participant simulator.
+ */
+// @formatter:off
+@Path("/onap/participantsim/v2")
+@Api(value = "Participant Simulator API")
+@Produces({MediaType.APPLICATION_JSON, RestController.APPLICATION_YAML})
+@SwaggerDefinition(
+    info = @Info(description =
+                    "Participant Simulator", version = "v1.0",
+                    title = "Participant Simulator"),
+    consumes = {MediaType.APPLICATION_JSON, RestController.APPLICATION_YAML},
+    produces = {MediaType.APPLICATION_JSON, RestController.APPLICATION_YAML},
+    schemes = {SwaggerDefinition.Scheme.HTTP, SwaggerDefinition.Scheme.HTTPS},
+    tags = {@Tag(name = "participantsim", description = "Participant Simulator")},
+    securityDefinition = @SecurityDefinition(basicAuthDefinitions = {@BasicAuthDefinition(key = "basicAuth")}))
+// @formatter:on
+public class RestController {
+    public static final String APPLICATION_YAML = "application/yaml";
+
+    public static final String EXTENSION_NAME = "interface info";
+
+    public static final String API_VERSION_NAME = "api-version";
+    public static final String API_VERSION = "1.0.0";
+
+    public static final String LAST_MOD_NAME = "last-mod-release";
+    public static final String LAST_MOD_RELEASE = "Dublin";
+
+    public static final String VERSION_MINOR_NAME = "X-MinorVersion";
+    public static final String VERSION_MINOR_DESCRIPTION =
+            "Used to request or communicate a MINOR version back from the client"
+                    + " to the server, and from the server back to the client";
+
+    public static final String VERSION_PATCH_NAME = "X-PatchVersion";
+    public static final String VERSION_PATCH_DESCRIPTION = "Used only to communicate a PATCH version in a response for"
+            + " troubleshooting purposes only, and will not be provided by" + " the client on request";
+
+    public static final String VERSION_LATEST_NAME = "X-LatestVersion";
+    public static final String VERSION_LATEST_DESCRIPTION = "Used only to communicate an API's latest version";
+
+    public static final String REQUEST_ID_NAME = "X-ONAP-RequestID";
+    public static final String REQUEST_ID_HDR_DESCRIPTION = "Used to track REST transactions for logging purpose";
+    public static final String REQUEST_ID_PARAM_DESCRIPTION = "RequestID for http transaction";
+
+    public static final String AUTHORIZATION_TYPE = "basicAuth";
+
+    public static final int AUTHENTICATION_ERROR_CODE = HttpURLConnection.HTTP_UNAUTHORIZED;
+    public static final int AUTHORIZATION_ERROR_CODE = HttpURLConnection.HTTP_FORBIDDEN;
+    public static final int SERVER_ERROR_CODE = HttpURLConnection.HTTP_INTERNAL_ERROR;
+
+    public static final String AUTHENTICATION_ERROR_MESSAGE = "Authentication Error";
+    public static final String AUTHORIZATION_ERROR_MESSAGE = "Authorization Error";
+    public static final String SERVER_ERROR_MESSAGE = "Internal Server Error";
+    @Getter(AccessLevel.PROTECTED)
+    // The provider for simulation requests
+    private SimulationProvider simulationProvider;
+
+
+    /**
+     * create a Rest Controller.
+     */
+    public RestController() {
+        simulationProvider = SimulationHandler.getInstance().getSimulationProvider();
+    }
+
+    /**
+     * Adds version headers to the response.
+     *
+     * @param respBuilder response builder
+     * @return the response builder, with version headers
+     */
+    public ResponseBuilder addVersionControlHeaders(ResponseBuilder respBuilder) {
+        return respBuilder.header(VERSION_MINOR_NAME, "0").header(VERSION_PATCH_NAME, "0").header(VERSION_LATEST_NAME,
+                API_VERSION);
+    }
+
+    /**
+     * Adds logging headers to the response.
+     *
+     * @param respBuilder response builder
+     * @return the response builder, with version logging
+     */
+    public ResponseBuilder addLoggingHeaders(ResponseBuilder respBuilder, UUID requestId) {
+        if (requestId == null) {
+            // Generate a random uuid if client does not embed requestId in rest request
+            return respBuilder.header(REQUEST_ID_NAME, UUID.randomUUID());
+        }
+
+        return respBuilder.header(REQUEST_ID_NAME, requestId);
+    }
+}
diff --git a/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/controlloop/participant/simulator/main/startstop/Main.java b/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/controlloop/participant/simulator/main/startstop/Main.java
new file mode 100644
index 0000000..e6c93d5
--- /dev/null
+++ b/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/controlloop/participant/simulator/main/startstop/Main.java
@@ -0,0 +1,141 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.participant.simulator.main.startstop;
+
+import java.util.Arrays;
+import javax.ws.rs.core.Response;
+import lombok.Getter;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopException;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopRuntimeException;
+import org.onap.policy.clamp.controlloop.participant.simulator.main.parameters.ParticipantSimulatorParameterHandler;
+import org.onap.policy.clamp.controlloop.participant.simulator.main.parameters.ParticipantSimulatorParameters;
+import org.onap.policy.common.utils.resources.MessageConstants;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * This class initiates participant simulator.
+ */
+public class Main {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(Main.class);
+
+    private ParticipantSimulatorActivator activator;
+
+    @Getter
+    private ParticipantSimulatorParameters parameterGroup;
+
+    /**
+     * Instantiates the control loop participant service.
+     *
+     * @param args the command line arguments
+     */
+    public Main(final String[] args) {
+        final String argumentString = Arrays.toString(args);
+        LOGGER.info("Starting the participant service with arguments - {}", argumentString);
+
+        // Check the arguments
+        final ParticipantSimulatorCommandLineArguments arguments = new ParticipantSimulatorCommandLineArguments();
+        try {
+            // The arguments return a string if there is a message to print and we should exit
+            final String argumentMessage = arguments.parse(args);
+            if (argumentMessage != null) {
+                LOGGER.info(argumentMessage);
+                return;
+            }
+            // Validate that the arguments are sane
+            arguments.validate();
+
+            // Read the parameters
+            parameterGroup = new ParticipantSimulatorParameterHandler().getParameters(arguments);
+
+            // Now, create the activator for the service
+            activator = new ParticipantSimulatorActivator(parameterGroup);
+
+            // Start the activator
+            activator.start();
+        } catch (Exception exp) {
+            throw new ControlLoopRuntimeException(Response.Status.BAD_REQUEST,
+                String.format(MessageConstants.START_FAILURE_MSG, MessageConstants.POLICY_CLAMP), exp);
+        }
+
+        // Add a shutdown hook to shut everything down in an orderly manner
+        Runtime.getRuntime().addShutdownHook(new ClParticipantSimulatorShutdownHookClass());
+        String successMsg = String.format(MessageConstants.START_SUCCESS_MSG, MessageConstants.POLICY_CLAMP);
+        LOGGER.info(successMsg);
+    }
+
+    /**
+     * Check if main is running.
+     */
+    public boolean isRunning() {
+        return activator != null && activator.isAlive();
+    }
+
+    /**
+     * Shut down Execution.
+     *
+     * @throws ControlLoopException on shutdown errors
+     */
+    public void shutdown() throws ControlLoopException {
+        // clear the parameterGroup variable
+        parameterGroup = null;
+
+        // clear the cl participant activator
+        if (activator != null) {
+            activator.stop();
+        }
+    }
+
+    /**
+     * The Class ClParticipantSimulatorShutdownHookClass terminates the control loop participant service
+     * when its run method is called.
+     */
+    private class ClParticipantSimulatorShutdownHookClass extends Thread {
+        /*
+         * (non-Javadoc)
+         *
+         * @see java.lang.Runnable#run()
+         */
+        @Override
+        public void run() {
+            try {
+                // Shutdown the participant simulator and wait for everything to stop
+                shutdown();
+            } catch (final RuntimeException | ControlLoopException e) {
+                LOGGER.warn("error occured during shut down of the participant simulator", e);
+            }
+        }
+    }
+
+    /**
+     * The main method.
+     *
+     * @param args the arguments
+     */
+    public static void main(final String[] args) {      // NOSONAR
+        /*
+         * NOTE: arguments are validated by the constructor, thus sonar is disabled.
+         */
+
+        new Main(args);
+    }
+}
diff --git a/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/controlloop/participant/simulator/main/startstop/ParticipantSimulatorActivator.java b/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/controlloop/participant/simulator/main/startstop/ParticipantSimulatorActivator.java
new file mode 100644
index 0000000..4daa039
--- /dev/null
+++ b/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/controlloop/participant/simulator/main/startstop/ParticipantSimulatorActivator.java
@@ -0,0 +1,75 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.simulator.main.startstop;
+
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicReference;
+import lombok.Getter;
+import org.onap.policy.clamp.controlloop.participant.simulator.main.parameters.ParticipantSimulatorParameters;
+import org.onap.policy.clamp.controlloop.participant.simulator.main.rest.ParticipantSimulatorAafFilter;
+import org.onap.policy.clamp.controlloop.participant.simulator.simulation.SimulationHandler;
+import org.onap.policy.common.endpoints.http.server.RestServer;
+import org.onap.policy.common.utils.services.ServiceManagerContainer;
+
+/**
+ * This class activates the participant simulator component as a complete service together with all its controllers,
+ * listeners and handlers.
+ */
+public class ParticipantSimulatorActivator extends ServiceManagerContainer {
+    @Getter
+    private final ParticipantSimulatorParameters parameters;
+
+    /**
+     * Instantiate the activator for the simulator as a complete service.
+     *
+     * @param parameters the parameters for the participant service
+     */
+    public ParticipantSimulatorActivator(final ParticipantSimulatorParameters parameters) {
+        this.parameters = parameters;
+
+        final AtomicReference<SimulationHandler> simulationHandler = new AtomicReference<>();
+        final AtomicReference<RestServer> restServer = new AtomicReference<>();
+
+        // @formatter:off
+        addAction("Simulation Handler",
+            () -> simulationHandler.set(new SimulationHandler(parameters)),
+            () -> simulationHandler.get().close());
+
+        addAction("Simulation Providers",
+            () -> simulationHandler.get().startProviders(),
+            () -> simulationHandler.get().stopProviders());
+
+        parameters.getRestServerParameters().setName(parameters.getName());
+
+        addAction("REST server",
+            () -> {
+                Set<Class<?>> providerClasses = simulationHandler.get().getProviderClasses();
+
+                RestServer server = new RestServer(parameters.getRestServerParameters(),
+                        ParticipantSimulatorAafFilter.class,
+                        providerClasses.toArray(new Class<?>[providerClasses.size()]));
+                restServer.set(server);
+                restServer.get().start();
+            },
+            () -> restServer.get().stop());
+        // @formatter:on
+    }
+}
diff --git a/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/controlloop/participant/simulator/main/startstop/ParticipantSimulatorCommandLineArguments.java b/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/controlloop/participant/simulator/main/startstop/ParticipantSimulatorCommandLineArguments.java
new file mode 100644
index 0000000..51ac3a4
--- /dev/null
+++ b/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/controlloop/participant/simulator/main/startstop/ParticipantSimulatorCommandLineArguments.java
@@ -0,0 +1,151 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.simulator.main.startstop;
+
+import java.io.File;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.net.URL;
+import java.util.Arrays;
+import javax.ws.rs.core.Response;
+import lombok.Getter;
+import lombok.Setter;
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.DefaultParser;
+import org.apache.commons.cli.HelpFormatter;
+import org.apache.commons.cli.Option;
+import org.apache.commons.cli.Options;
+import org.apache.commons.cli.ParseException;
+import org.apache.commons.lang3.StringUtils;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopException;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopRuntimeException;
+import org.onap.policy.clamp.controlloop.common.startstop.CommonCommandLineArguments;
+import org.onap.policy.common.utils.resources.ResourceUtils;
+
+/**
+ * This class reads and handles command line parameters for the participant simulator service.
+ *
+ */
+public class ParticipantSimulatorCommandLineArguments {
+    private static final String FILE_MESSAGE_PREAMBLE = " file \"";
+    private static final int HELP_LINE_LENGTH = 120;
+
+    private final Options options;
+    private final CommonCommandLineArguments commonCommandLineArguments;
+
+    @Getter()
+    @Setter()
+    private String configurationFilePath = null;
+
+    /**
+     * Construct the options for the participant component.
+     */
+    public ParticipantSimulatorCommandLineArguments() {
+        options = new Options();
+        commonCommandLineArguments = new CommonCommandLineArguments(options);
+    }
+
+    /**
+     * Construct the options for the participant component and parse in the given arguments.
+     *
+     * @param args The command line arguments
+     */
+    public ParticipantSimulatorCommandLineArguments(final String[] args) {
+        // Set up the options with the default constructor
+        this();
+
+        // Parse the arguments
+        try {
+            parse(args);
+        } catch (final ControlLoopException e) {
+            throw new ControlLoopRuntimeException(Response.Status.NOT_ACCEPTABLE,
+                    "parse error on participant parameters", e);
+        }
+    }
+
+    /**
+     * Parse the command line options.
+     *
+     * @param args The command line arguments
+     * @return a string with a message for help and version, or null if there is no message
+     * @throws ControlLoopException on command argument errors
+     */
+    public String parse(final String[] args) throws ControlLoopException {
+        // Clear all our arguments
+        setConfigurationFilePath(null);
+        CommandLine commandLine = null;
+        try {
+            commandLine = new DefaultParser().parse(options, args);
+        } catch (final ParseException e) {
+            throw new ControlLoopException(Response.Status.NOT_ACCEPTABLE,
+                    "invalid command line arguments specified : " + e.getMessage());
+        }
+
+        // Arguments left over after Commons CLI does its stuff
+        final String[] remainingArgs = commandLine.getArgs();
+
+        if (remainingArgs.length > 0) {
+            throw new ControlLoopException(Response.Status.NOT_ACCEPTABLE,
+                    "too many command line arguments specified : " + Arrays.toString(args));
+        }
+
+        if (commandLine.hasOption('h')) {
+            return commonCommandLineArguments.help(Main.class.getName(), options);
+        }
+
+        if (commandLine.hasOption('v')) {
+            return commonCommandLineArguments.version();
+        }
+
+        if (commandLine.hasOption('c')) {
+            setConfigurationFilePath(commandLine.getOptionValue('c'));
+        }
+
+        return null;
+    }
+
+    /**
+     * Validate the command line options.
+     *
+     * @throws ControlLoopException on command argument validation errors
+     */
+    public void validate() throws ControlLoopException {
+        commonCommandLineArguments.validate(configurationFilePath);
+    }
+
+    /**
+     * Gets the full expanded configuration file path.
+     *
+     * @return the configuration file path
+     */
+    public String getFullConfigurationFilePath() {
+        return ResourceUtils.getFilePath4Resource(getConfigurationFilePath());
+    }
+
+    /**
+     * Check set configuration file path.
+     *
+     * @return true, if check set configuration file path
+     */
+    public boolean checkSetConfigurationFilePath() {
+        return !StringUtils.isEmpty(configurationFilePath);
+    }
+}
diff --git a/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/controlloop/participant/simulator/simulation/SimulationHandler.java b/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/controlloop/participant/simulator/simulation/SimulationHandler.java
new file mode 100644
index 0000000..df7f2a6
--- /dev/null
+++ b/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/controlloop/participant/simulator/simulation/SimulationHandler.java
@@ -0,0 +1,81 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.simulator.simulation;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Set;
+import javax.ws.rs.core.Response;
+import lombok.Getter;
+import org.onap.policy.clamp.controlloop.common.handler.ControlLoopHandler;
+import org.onap.policy.clamp.controlloop.participant.intermediary.parameters.ParticipantIntermediaryParameters;
+import org.onap.policy.clamp.controlloop.participant.simulator.main.parameters.ParticipantSimulatorParameters;
+import org.onap.policy.clamp.controlloop.participant.simulator.simulation.rest.SimulationElementController;
+import org.onap.policy.clamp.controlloop.participant.simulator.simulation.rest.SimulationParticipantController;
+import org.onap.policy.common.endpoints.event.comm.TopicSink;
+import org.onap.policy.common.endpoints.listeners.MessageTypeDispatcher;
+import org.onap.policy.common.utils.services.Registry;
+import org.onap.policy.models.base.PfModelRuntimeException;
+
+/**
+ * This class handles simulation of participants and control loop elements.
+ *
+ * <p/>It is effectively a singleton that is started at system start.
+ */
+public class SimulationHandler extends ControlLoopHandler {
+    private final ParticipantIntermediaryParameters participantParameters;
+
+    @Getter
+    private SimulationProvider simulationProvider;
+
+    /**
+     * Create a handler.
+     *
+     * @param parameters the parameters for access to the database
+     */
+    public SimulationHandler(ParticipantSimulatorParameters parameters) {
+        super(parameters.getDatabaseProviderParameters());
+        participantParameters = parameters.getIntermediaryParameters();
+    }
+
+    public static SimulationHandler getInstance() {
+        return Registry.get(SimulationHandler.class.getName());
+    }
+
+    @Override
+    public Set<Class<?>> getProviderClasses() {
+        return Set.of(SimulationElementController.class, SimulationParticipantController.class);
+    }
+
+    @Override
+    public void startProviders() {
+        simulationProvider = new SimulationProvider(participantParameters);
+    }
+
+    @Override
+    public void stopProviders() {
+        try {
+            simulationProvider.close();
+        } catch (IOException e) {
+            throw new PfModelRuntimeException(Response.Status.INTERNAL_SERVER_ERROR, "Stop providers failed ", e);
+        }
+    }
+}
diff --git a/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/controlloop/participant/simulator/simulation/SimulationProvider.java b/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/controlloop/participant/simulator/simulation/SimulationProvider.java
new file mode 100644
index 0000000..1fcbba3
--- /dev/null
+++ b/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/controlloop/participant/simulator/simulation/SimulationProvider.java
@@ -0,0 +1,129 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.participant.simulator.simulation;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import lombok.Getter;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopException;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopRuntimeException;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoop;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopElement;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoops;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.Participant;
+import org.onap.policy.clamp.controlloop.models.messages.rest.TypedSimpleResponse;
+import org.onap.policy.clamp.controlloop.participant.intermediary.api.ParticipantIntermediaryApi;
+import org.onap.policy.clamp.controlloop.participant.intermediary.api.ParticipantIntermediaryFactory;
+import org.onap.policy.clamp.controlloop.participant.intermediary.parameters.ParticipantIntermediaryParameters;
+
+/**
+ * This provider class simulation of participants and control loop elements.
+ */
+public class SimulationProvider implements Closeable {
+    @Getter
+    private final ParticipantIntermediaryApi intermediaryApi;
+
+    /**
+     * Create a participant simulation provider.
+     *
+     * @throws ControlLoopRuntimeException on errors creating the provider
+     */
+    public SimulationProvider(ParticipantIntermediaryParameters participantParameters)
+                     throws ControlLoopRuntimeException {
+        intermediaryApi = new ParticipantIntermediaryFactory().createApiImplementation();
+        intermediaryApi.init(participantParameters);
+    }
+
+    @Override
+    public void close() throws IOException {
+        intermediaryApi.close();
+    }
+
+    /**
+     * Get the control loops.
+     *
+     * @param name the controlLoop, null to get all
+     * @param version the controlLoop, null to get all
+     * @return the control loops
+     * @throws ControlLoopException on errors getting the control loops
+     */
+    public ControlLoops getControlLoops(String name, String version) throws ControlLoopException {
+        return intermediaryApi.getControlLoops(name, version);
+    }
+
+    /**
+     * Get the simulated control loop elements.
+     *
+     * @param name the controlLoopElement, null to get all
+     * @param version the controlLoopElement, null to get all
+     * @return the control loop elements
+     * @throws ControlLoopException on errors getting the control loop elements
+     */
+    public Map<UUID, ControlLoopElement> getControlLoopElements(String name, String version)
+                    throws ControlLoopException {
+        return intermediaryApi.getControlLoopElements(name, version);
+    }
+
+    /**
+     * Update the given control loop element in the simulator.
+     *
+     * @param element the control loop element to update
+     * @return response simple response returned
+     * @throws ControlLoopException on errors updating the control loop element
+     */
+    public TypedSimpleResponse<ControlLoopElement> updateControlLoopElement(ControlLoopElement element)
+            throws ControlLoopException {
+        TypedSimpleResponse<ControlLoopElement> response = new TypedSimpleResponse<>();
+        response.setResponse(intermediaryApi.updateControlLoopElementState(
+                element.getId(), element.getOrderedState(), element.getState()));
+        return response;
+    }
+
+    /**
+     * Get the current simulated participants.
+     *
+     * @param name the participant, null to get all
+     * @param version the participant, null to get all
+     * @return the list of participants
+     * @throws ControlLoopException on errors getting the participants
+     */
+    public List<Participant> getParticipants(String name, String version) throws ControlLoopException {
+        return intermediaryApi.getParticipants(name, version);
+    }
+
+    /**
+     * Update a simulated participant.
+     *
+     * @param participant the participant to update
+     * @return TypedSimpleResponse simple response
+     * @throws ControlLoopException on errors updating the participant
+     */
+
+    public TypedSimpleResponse<Participant> updateParticipant(Participant participant) throws ControlLoopException {
+        TypedSimpleResponse<Participant> response = new TypedSimpleResponse<>();
+        response.setResponse(intermediaryApi.updateParticipantState(
+                participant.getDefinition(), participant.getParticipantState()));
+        return response;
+    }
+}
diff --git a/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/controlloop/participant/simulator/simulation/rest/SimulationElementController.java b/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/controlloop/participant/simulator/simulation/rest/SimulationElementController.java
new file mode 100644
index 0000000..1869047
--- /dev/null
+++ b/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/controlloop/participant/simulator/simulation/rest/SimulationElementController.java
@@ -0,0 +1,195 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.simulator.simulation.rest;
+
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import io.swagger.annotations.Authorization;
+import io.swagger.annotations.Extension;
+import io.swagger.annotations.ExtensionProperty;
+import io.swagger.annotations.ResponseHeader;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import javax.ws.rs.GET;
+import javax.ws.rs.HeaderParam;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopException;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopElement;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoops;
+import org.onap.policy.clamp.controlloop.models.messages.rest.SimpleResponse;
+import org.onap.policy.clamp.controlloop.models.messages.rest.TypedSimpleResponse;
+import org.onap.policy.clamp.controlloop.participant.simulator.main.rest.RestController;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Class to provide REST end points for participant simulator to query/update details of controlLoopElements.
+ */
+public class SimulationElementController extends RestController {
+    private static final Logger LOGGER = LoggerFactory.getLogger(SimulationElementController.class);
+
+    /**
+     * Queries details of all control loop element within the simulator.
+     *
+     * @param requestId request ID used in ONAP logging
+     * @param name the name of the Control Loop element to get, null to get all
+     * @param version the version of the Control Loop element to get, null to get all
+     * @return the control loop elements
+     */
+    // @formatter:off
+    @GET
+    @Path("/elements/{name}/{version}")
+    @ApiOperation(value = "Query details of the requested simulated control loop elements",
+            notes = "Queries details of the requested simulated control loop elements, "
+                    + "returning all control loop element details",
+            response = ControlLoops.class,
+            tags = {
+                "Clamp Control Loop Participant Simulator API"
+            },
+            authorizations = @Authorization(value = AUTHORIZATION_TYPE),
+            responseHeaders = {
+                    @ResponseHeader(
+                            name = VERSION_MINOR_NAME, description = VERSION_MINOR_DESCRIPTION,
+                            response = String.class),
+                    @ResponseHeader(name = VERSION_PATCH_NAME, description = VERSION_PATCH_DESCRIPTION,
+                            response = String.class),
+                    @ResponseHeader(name = VERSION_LATEST_NAME, description = VERSION_LATEST_DESCRIPTION,
+                            response = String.class),
+                    @ResponseHeader(name = REQUEST_ID_NAME, description = REQUEST_ID_HDR_DESCRIPTION,
+                            response = UUID.class)},
+            extensions = {
+                    @Extension(
+                            name = EXTENSION_NAME,
+                            properties = {
+                                    @ExtensionProperty(name = API_VERSION_NAME, value = API_VERSION),
+                                    @ExtensionProperty(name = LAST_MOD_NAME, value = LAST_MOD_RELEASE)
+                            }
+                    )
+            }
+    )
+    @ApiResponses(
+            value = {
+                    @ApiResponse(code = AUTHENTICATION_ERROR_CODE, message = AUTHENTICATION_ERROR_MESSAGE),
+                    @ApiResponse(code = AUTHORIZATION_ERROR_CODE, message = AUTHORIZATION_ERROR_MESSAGE),
+                    @ApiResponse(code = SERVER_ERROR_CODE, message = SERVER_ERROR_MESSAGE)
+            }
+    )
+    // @formatter:on
+    public Response elements(@HeaderParam(REQUEST_ID_NAME) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId,
+            @ApiParam(value = "Control loop element name", required = true) @PathParam("name") String name,
+            @ApiParam(value = "Control loop element version", required = true) @PathParam("version") String version) {
+
+        try {
+            Map<UUID, ControlLoopElement> response = getSimulationProvider().getControlLoopElements(name, version);
+            return addLoggingHeaders(addVersionControlHeaders(Response.status(Status.OK)), requestId).entity(response)
+                    .build();
+
+        } catch (ControlLoopException cle) {
+            LOGGER.warn("get of control loop elements failed", cle);
+            SimpleResponse resp = new SimpleResponse();
+            resp.setErrorDetails(cle.getErrorResponse().getErrorMessage());
+            return addLoggingHeaders(
+                    addVersionControlHeaders(Response.status(cle.getErrorResponse().getResponseCode())), requestId)
+                            .entity(resp).build();
+        }
+
+    }
+
+    /**
+     * Updates a control loop element in the simulator.
+     *
+     * @param requestId request ID used in ONAP logging
+     * @param body the body of a control loop element
+     * @return a response
+     */
+    // @formatter:off
+    @PUT
+    @Path("/elements")
+    @ApiOperation(
+            value = "Updates simulated control loop elements",
+            notes = "Updates simulated control loop elements, returning the updated control loop definition IDs",
+            response = TypedSimpleResponse.class,
+            tags = {
+                "Clamp Control Loop Participant Simulator API"
+                },
+            authorizations = @Authorization(value = AUTHORIZATION_TYPE),
+            responseHeaders = {
+                    @ResponseHeader(
+                            name = VERSION_MINOR_NAME,
+                            description = VERSION_MINOR_DESCRIPTION,
+                            response = String.class),
+                    @ResponseHeader(
+                            name = VERSION_PATCH_NAME,
+                            description = VERSION_PATCH_DESCRIPTION,
+                            response = String.class),
+                    @ResponseHeader(
+                            name = VERSION_LATEST_NAME,
+                            description = VERSION_LATEST_DESCRIPTION,
+                            response = String.class),
+                    @ResponseHeader(
+                            name = REQUEST_ID_NAME,
+                            description = REQUEST_ID_HDR_DESCRIPTION,
+                            response = UUID.class)
+                },
+            extensions = {
+                @Extension(
+                    name = EXTENSION_NAME,
+                    properties = {
+                            @ExtensionProperty(name = API_VERSION_NAME, value = API_VERSION),
+                            @ExtensionProperty(name = LAST_MOD_NAME, value = LAST_MOD_RELEASE)
+                    }
+                )
+            }
+        )
+    @ApiResponses(
+            value = {
+                @ApiResponse(code = AUTHENTICATION_ERROR_CODE, message = AUTHENTICATION_ERROR_MESSAGE),
+                @ApiResponse(code = AUTHORIZATION_ERROR_CODE, message = AUTHORIZATION_ERROR_MESSAGE),
+                @ApiResponse(code = SERVER_ERROR_CODE, message = SERVER_ERROR_MESSAGE)
+            }
+        )
+    // @formatter:on
+    public Response update(@HeaderParam(REQUEST_ID_NAME) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId,
+            @ApiParam(value = "Body of a control loop element", required = true) ControlLoopElement body) {
+
+        try {
+            TypedSimpleResponse<ControlLoopElement> response =
+                    getSimulationProvider().updateControlLoopElement(body);
+            return addLoggingHeaders(addVersionControlHeaders(Response.status(Status.OK)), requestId).entity(response)
+                    .build();
+
+        } catch (ControlLoopException cle) {
+            LOGGER.warn("update of control loop element failed", cle);
+            TypedSimpleResponse<ControlLoopElement> resp = new TypedSimpleResponse<>();
+            resp.setErrorDetails(cle.getErrorResponse().getErrorMessage());
+            return addLoggingHeaders(
+                    addVersionControlHeaders(Response.status(cle.getErrorResponse().getResponseCode())), requestId)
+                            .entity(resp).build();
+        }
+    }
+}
diff --git a/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/controlloop/participant/simulator/simulation/rest/SimulationParticipantController.java b/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/controlloop/participant/simulator/simulation/rest/SimulationParticipantController.java
new file mode 100644
index 0000000..d6ca6d0
--- /dev/null
+++ b/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/controlloop/participant/simulator/simulation/rest/SimulationParticipantController.java
@@ -0,0 +1,192 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.simulator.simulation.rest;
+
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import io.swagger.annotations.Authorization;
+import io.swagger.annotations.Extension;
+import io.swagger.annotations.ExtensionProperty;
+import io.swagger.annotations.ResponseHeader;
+import java.util.List;
+import java.util.UUID;
+import javax.ws.rs.GET;
+import javax.ws.rs.HeaderParam;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopException;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.Participant;
+import org.onap.policy.clamp.controlloop.models.messages.rest.SimpleResponse;
+import org.onap.policy.clamp.controlloop.models.messages.rest.TypedSimpleResponse;
+import org.onap.policy.clamp.controlloop.participant.simulator.main.rest.RestController;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Class to provide REST end points for participant simulator to query/update details of all participants.
+ */
+public class SimulationParticipantController extends RestController {
+    private static final Logger LOGGER = LoggerFactory.getLogger(SimulationParticipantController.class);
+
+    /**
+     * Queries details of all participants within the simulator.
+     *
+     * @param requestId request ID used in ONAP logging
+     * @param name the name of the participant to get, null to get all
+     * @param version the version of the participant to get, null to get all
+     * @return the participants
+     */
+    // @formatter:off
+    @GET
+    @Path("/participants/{name}/{version}")
+    @ApiOperation(value = "Query details of the requested simulated participants",
+            notes = "Queries details of the requested simulated participants, "
+                    + "returning all participant details",
+            response = List.class,
+            tags = {
+                "Clamp Control Loop Participant Simulator API"
+            },
+            authorizations = @Authorization(value = AUTHORIZATION_TYPE),
+            responseHeaders = {
+                    @ResponseHeader(
+                            name = VERSION_MINOR_NAME, description = VERSION_MINOR_DESCRIPTION,
+                            response = String.class),
+                    @ResponseHeader(name = VERSION_PATCH_NAME, description = VERSION_PATCH_DESCRIPTION,
+                            response = String.class),
+                    @ResponseHeader(name = VERSION_LATEST_NAME, description = VERSION_LATEST_DESCRIPTION,
+                            response = String.class),
+                    @ResponseHeader(name = REQUEST_ID_NAME, description = REQUEST_ID_HDR_DESCRIPTION,
+                            response = UUID.class)},
+            extensions = {
+                    @Extension(
+                            name = EXTENSION_NAME,
+                            properties = {
+                                    @ExtensionProperty(name = API_VERSION_NAME, value = API_VERSION),
+                                    @ExtensionProperty(name = LAST_MOD_NAME, value = LAST_MOD_RELEASE)
+                            }
+                    )
+            }
+    )
+    @ApiResponses(
+            value = {
+                    @ApiResponse(code = AUTHENTICATION_ERROR_CODE, message = AUTHENTICATION_ERROR_MESSAGE),
+                    @ApiResponse(code = AUTHORIZATION_ERROR_CODE, message = AUTHORIZATION_ERROR_MESSAGE),
+                    @ApiResponse(code = SERVER_ERROR_CODE, message = SERVER_ERROR_MESSAGE)
+            }
+    )
+    // @formatter:on
+    public Response participants(@HeaderParam(REQUEST_ID_NAME) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId,
+            @ApiParam(value = "Participant name", required = true) @PathParam("name") String name,
+            @ApiParam(value = "Participant version", required = true) @PathParam("version") String version) {
+
+        try {
+            List<Participant> response = getSimulationProvider().getParticipants(name, version);
+            return addLoggingHeaders(addVersionControlHeaders(Response.status(Status.OK)), requestId).entity(response)
+                    .build();
+
+        } catch (ControlLoopException cle) {
+            LOGGER.warn("get of participants failed", cle);
+            SimpleResponse resp = new SimpleResponse();
+            resp.setErrorDetails(cle.getErrorResponse().getErrorMessage());
+            return addLoggingHeaders(
+                    addVersionControlHeaders(Response.status(cle.getErrorResponse().getResponseCode())), requestId)
+                            .entity(resp).build();
+        }
+
+    }
+
+    /**
+     * Updates a participant in the simulator.
+     *
+     * @param requestId request ID used in ONAP logging
+     * @param body the body of a participant
+     * @return a response
+     */
+    // @formatter:off
+    @PUT
+    @Path("/participants")
+    @ApiOperation(
+            value = "Updates simulated participants",
+            notes = "Updates simulated participants, returning the updated control loop definition IDs",
+            response = TypedSimpleResponse.class,
+            tags = {
+                "Clamp Control Loop Participant Simulator API"
+                },
+            authorizations = @Authorization(value = AUTHORIZATION_TYPE),
+            responseHeaders = {
+                    @ResponseHeader(
+                            name = VERSION_MINOR_NAME,
+                            description = VERSION_MINOR_DESCRIPTION,
+                            response = String.class),
+                    @ResponseHeader(
+                            name = VERSION_PATCH_NAME,
+                            description = VERSION_PATCH_DESCRIPTION,
+                            response = String.class),
+                    @ResponseHeader(
+                            name = VERSION_LATEST_NAME,
+                            description = VERSION_LATEST_DESCRIPTION,
+                            response = String.class),
+                    @ResponseHeader(
+                            name = REQUEST_ID_NAME,
+                            description = REQUEST_ID_HDR_DESCRIPTION,
+                            response = UUID.class)
+                },
+            extensions = {
+                @Extension(
+                    name = EXTENSION_NAME,
+                    properties = {
+                            @ExtensionProperty(name = API_VERSION_NAME, value = API_VERSION),
+                            @ExtensionProperty(name = LAST_MOD_NAME, value = LAST_MOD_RELEASE)
+                    }
+                )
+            }
+        )
+    @ApiResponses(
+            value = {
+                @ApiResponse(code = AUTHENTICATION_ERROR_CODE, message = AUTHENTICATION_ERROR_MESSAGE),
+                @ApiResponse(code = AUTHORIZATION_ERROR_CODE, message = AUTHORIZATION_ERROR_MESSAGE),
+                @ApiResponse(code = SERVER_ERROR_CODE, message = SERVER_ERROR_MESSAGE)
+            }
+        )
+    // @formatter:on
+    public Response update(@HeaderParam(REQUEST_ID_NAME) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId,
+            @ApiParam(value = "Body of a participant", required = true) Participant body) {
+
+        try {
+            TypedSimpleResponse<Participant> response = getSimulationProvider().updateParticipant(body);
+            return addLoggingHeaders(addVersionControlHeaders(Response.status(Status.OK)), requestId).entity(response)
+                    .build();
+
+        } catch (ControlLoopException cle) {
+            LOGGER.warn("update of participant failed", cle);
+            TypedSimpleResponse<Participant> resp = new TypedSimpleResponse<>();
+            resp.setErrorDetails(cle.getErrorResponse().getErrorMessage());
+            return addLoggingHeaders(
+                    addVersionControlHeaders(Response.status(cle.getErrorResponse().getResponseCode())), requestId)
+                            .entity(resp).build();
+        }
+    }
+}
diff --git a/participant/participant-impl/participant-impl-simulator/src/main/resources/config/CDSParticipantConfig.json b/participant/participant-impl/participant-impl-simulator/src/main/resources/config/CDSParticipantConfig.json
new file mode 100644
index 0000000..3eca876
--- /dev/null
+++ b/participant/participant-impl/participant-impl-simulator/src/main/resources/config/CDSParticipantConfig.json
@@ -0,0 +1,31 @@
+{
+    "name":"ParticipantParameterGroup",
+    "participantStatusParameters":{
+        "timeIntervalMs": 10000,
+        "description":"Participant Status",
+        "participantType":{
+            "name": "org.onap.ccsdk.cds.controlloop.CdsControlLoopParticipant",
+            "version":"2.2.1"
+        },
+        "participantId":{
+            "name": "CDSParticipant0",
+            "version":"1.0.0"
+        },
+        "participantDefinition":{
+            "name": "org.onap.ccsdk.cds.controlloop.CdsControlLoopParticipant",
+            "version":"3.2.1"
+        }
+    },
+    "topicParameterGroup": {
+        "topicSources" : [{
+            "topic" : "POLICY-CLRUNTIME-PARTICIPANT",
+            "servers" : [ "127.0.0.1:3904" ],
+            "topicCommInfrastructure" : "dmaap"
+        }],
+        "topicSinks" : [{
+            "topic" : "POLICY-CLRUNTIME-PARTICIPANT",
+            "servers" : [ "127.0.0.1:3904" ],
+            "topicCommInfrastructure" : "dmaap"
+        }]
+    }
+}
diff --git a/participant/participant-impl/participant-impl-simulator/src/main/resources/config/DCAEParticipantConfig.json b/participant/participant-impl/participant-impl-simulator/src/main/resources/config/DCAEParticipantConfig.json
new file mode 100644
index 0000000..e80570f
--- /dev/null
+++ b/participant/participant-impl/participant-impl-simulator/src/main/resources/config/DCAEParticipantConfig.json
@@ -0,0 +1,31 @@
+{
+    "name":"ParticipantParameterGroup",
+    "participantStatusParameters":{
+        "timeIntervalMs": 10000,
+        "description":"Participant Status",
+        "participantType":{
+            "name": "org.onap.dcae.controlloop.DCAEMicroserviceControlLoopParticipant",
+            "version":"2.3.4"
+        },
+        "participantId":{
+            "name": "DCAEParticipant0",
+            "version":"1.0.0"
+        },
+        "participantDefinition":{
+            "name": "org.onap.dcae.controlloop.DCAEMicroserviceControlLoopParticipant",
+            "version":"2.3.4"
+        }
+    },
+    "topicParameterGroup": {
+        "topicSources" : [{
+            "topic" : "POLICY-CLRUNTIME-PARTICIPANT",
+            "servers" : [ "127.0.0.1:3904" ],
+            "topicCommInfrastructure" : "dmaap"
+        }],
+        "topicSinks" : [{
+            "topic" : "POLICY-CLRUNTIME-PARTICIPANT",
+            "servers" : [ "127.0.0.1:3904" ],
+            "topicCommInfrastructure" : "dmaap"
+        }]
+    }
+}
diff --git a/participant/participant-impl/participant-impl-simulator/src/main/resources/config/PolicyParticipantConfig.json b/participant/participant-impl/participant-impl-simulator/src/main/resources/config/PolicyParticipantConfig.json
new file mode 100644
index 0000000..8c8fa33
--- /dev/null
+++ b/participant/participant-impl/participant-impl-simulator/src/main/resources/config/PolicyParticipantConfig.json
@@ -0,0 +1,31 @@
+{
+    "name":"ParticipantParameterGroup",
+    "participantStatusParameters":{
+        "timeIntervalMs":10000,
+        "description":"Participant Status",
+        "participantType":{
+            "name": "org.onap.policy.controlloop.PolicyControlLoopParticipant",
+            "version":"2.3.1"
+        },
+        "participantId":{
+            "name": "PolicyParticipant0",
+            "version":"1.0.0"
+        },
+        "participantDefinition":{
+            "name": "org.onap.policy.controlloop.PolicyControlLoopParticipant",
+            "version":"2.3.1"
+        }
+    },
+    "topicParameterGroup": {
+        "topicSources" : [{
+            "topic" : "POLICY-CLRUNTIME-PARTICIPANT",
+            "servers" : [ "127.0.0.1:3904" ],
+            "topicCommInfrastructure" : "dmaap"
+        }],
+        "topicSinks" : [{
+            "topic" : "POLICY-CLRUNTIME-PARTICIPANT",
+            "servers" : [ "127.0.0.1:3904" ],
+            "topicCommInfrastructure" : "dmaap"
+        }]
+    }
+}
diff --git a/participant/participant-impl/participant-impl-simulator/src/main/resources/version.txt b/participant/participant-impl/participant-impl-simulator/src/main/resources/version.txt
new file mode 100644
index 0000000..dbd6758
--- /dev/null
+++ b/participant/participant-impl/participant-impl-simulator/src/main/resources/version.txt
@@ -0,0 +1,4 @@
+ONAP Tosca defined control loop Participant
+Version: ${project.version}
+Built (UTC): ${maven.build.timestamp}
+ONAP https://wiki.onap.org
diff --git a/participant/participant-impl/participant-impl-simulator/src/test/java/org/onap/policy/clamp/controlloop/participant/simulator/main/intermediary/TestControlLoopUpdateListener.java b/participant/participant-impl/participant-impl-simulator/src/test/java/org/onap/policy/clamp/controlloop/participant/simulator/main/intermediary/TestControlLoopUpdateListener.java
new file mode 100644
index 0000000..a307d34
--- /dev/null
+++ b/participant/participant-impl/participant-impl-simulator/src/test/java/org/onap/policy/clamp/controlloop/participant/simulator/main/intermediary/TestControlLoopUpdateListener.java
@@ -0,0 +1,91 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.simulator.main.intermediary;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopException;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopOrderedState;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantControlLoopUpdate;
+import org.onap.policy.clamp.controlloop.participant.intermediary.comm.ControlLoopUpdateListener;
+import org.onap.policy.clamp.controlloop.participant.simulator.main.parameters.CommonTestData;
+import org.onap.policy.clamp.controlloop.participant.simulator.main.rest.TestListenerUtils;
+import org.onap.policy.common.endpoints.event.comm.Topic.CommInfrastructure;
+import org.onap.policy.common.utils.coder.CoderException;
+
+/**
+ * Class to perform unit test of {@link ControlLoopUpdateListener}.
+ */
+public class TestControlLoopUpdateListener {
+    private static ControlLoopUpdateListener clUpdateListener;
+    private static final CommInfrastructure INFRA = CommInfrastructure.NOOP;
+    private static final String TOPIC = "my-topic";
+    static CommonTestData commonTestData = new CommonTestData();
+
+    /**
+     * Method for setup.
+     *
+     * @throws ParticipantException if some error occurs while starting up the participant
+     * @throws FileNotFoundException if the file is missing
+     * @throws IOException if IO exception occurs
+     */
+    @BeforeClass
+    public static void setUp() throws ControlLoopException, FileNotFoundException, IOException {
+        TestListenerUtils.initParticipantHandler();
+        clUpdateListener = new ControlLoopUpdateListener(TestListenerUtils.getParticipantHandler());
+    }
+
+    @Test
+    public void testControlLoopUpdateListener_ParticipantIdNoMatch() throws CoderException {
+        ParticipantControlLoopUpdate participantControlLoopUpdateMsg = prepareMsg("DummyName");
+        clUpdateListener.onTopicEvent(INFRA, TOPIC, null, participantControlLoopUpdateMsg);
+
+        // Verify the content in participantHandler
+        assertNotEquals(participantControlLoopUpdateMsg.getParticipantId().getName(),
+                TestListenerUtils.getParticipantHandler().getParticipantId().getName());
+    }
+
+    @Test
+    public void testControlLoopUpdateListener() throws CoderException {
+        ParticipantControlLoopUpdate participantControlLoopUpdateMsg = prepareMsg("org.onap.PM_CDS_Blueprint");
+        clUpdateListener.onTopicEvent(INFRA, TOPIC, null, participantControlLoopUpdateMsg);
+
+        // Verify the content in participantHandler
+        assertEquals(TestListenerUtils.getParticipantHandler().getParticipantId(),
+                participantControlLoopUpdateMsg.getParticipantId());
+        assertThat(TestListenerUtils.getParticipantHandler().getControlLoopHandler().getControlLoops()
+                .getControlLoopList()).hasSize(1);
+    }
+
+    private ParticipantControlLoopUpdate prepareMsg(final String participantName) {
+        ParticipantControlLoopUpdate participantControlLoopUpdateMsg;
+        participantControlLoopUpdateMsg = TestListenerUtils.createControlLoopUpdateMsg();
+        participantControlLoopUpdateMsg.getParticipantId().setName(participantName);
+        participantControlLoopUpdateMsg.getControlLoop().setOrderedState(ControlLoopOrderedState.PASSIVE);
+        return participantControlLoopUpdateMsg;
+    }
+}
diff --git a/participant/participant-impl/participant-impl-simulator/src/test/java/org/onap/policy/clamp/controlloop/participant/simulator/main/parameters/CommonTestData.java b/participant/participant-impl/participant-impl-simulator/src/test/java/org/onap/policy/clamp/controlloop/participant/simulator/main/parameters/CommonTestData.java
new file mode 100644
index 0000000..0a87542
--- /dev/null
+++ b/participant/participant-impl/participant-impl-simulator/src/test/java/org/onap/policy/clamp/controlloop/participant/simulator/main/parameters/CommonTestData.java
@@ -0,0 +1,249 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.simulator.main.parameters;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+import javax.ws.rs.core.Response;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopRuntimeException;
+import org.onap.policy.common.endpoints.parameters.TopicParameters;
+import org.onap.policy.common.parameters.ParameterGroup;
+import org.onap.policy.common.utils.coder.Coder;
+import org.onap.policy.common.utils.coder.CoderException;
+import org.onap.policy.common.utils.coder.StandardCoder;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+/**
+ * Class to hold/create all parameters for test cases.
+ */
+public class CommonTestData {
+    public static final String PARTICIPANT_GROUP_NAME = "ControlLoopParticipantGroup";
+    public static final String DESCRIPTION = "Participant description";
+    public static final long TIME_INTERVAL = 2000;
+    public static final List<TopicParameters> TOPIC_PARAMS = Arrays.asList(getTopicParams());
+    private static final String REST_SERVER_PASSWORD = "zb!XztG34";
+    private static final String REST_SERVER_USER = "healthcheck";
+    private static final int REST_SERVER_PORT = 6969;
+    private static final String REST_SERVER_HOST = "0.0.0.0";
+    private static final boolean REST_SERVER_HTTPS = true;
+    private static final boolean REST_SERVER_AAF = false;
+
+    public static final Coder coder = new StandardCoder();
+
+    /**
+     * Converts the contents of a map to a parameter class.
+     *
+     * @param source property map
+     * @param clazz class of object to be created from the map
+     * @return a new object represented by the map
+     */
+    public <T extends ParameterGroup> T toObject(final Map<String, Object> source, final Class<T> clazz) {
+        try {
+            return coder.convert(source, clazz);
+        } catch (final CoderException e) {
+            throw new RuntimeException("cannot create " + clazz.getName() + " from map", e);
+        }
+    }
+
+    /**
+     * Returns a property map for a ApexStarterParameterGroup map for test cases.
+     *
+     * @param name name of the parameters
+     *
+     * @return a property map suitable for constructing an object
+     */
+    public Map<String, Object> getParticipantParameterGroupMap(final String name) {
+        final Map<String, Object> map = new TreeMap<>();
+
+        map.put("name", name);
+        map.put("restServerParameters", getRestServerParametersMap(false));
+        map.put("intermediaryParameters", getIntermediaryParametersMap(false));
+        map.put("databaseProviderParameters", getDatabaseProviderParametersMap(false));
+        return map;
+    }
+
+    /**
+     * Returns a property map for a RestServerParameters map for test cases.
+     *
+     * @param isEmpty boolean value to represent that object created should be empty or not
+     * @return a property map suitable for constructing an object
+     */
+    public Map<String, Object> getRestServerParametersMap(final boolean isEmpty) {
+        final Map<String, Object> map = new TreeMap<>();
+        map.put("https", REST_SERVER_HTTPS);
+        map.put("aaf", REST_SERVER_AAF);
+
+        if (!isEmpty) {
+            map.put("host", REST_SERVER_HOST);
+            map.put("port", REST_SERVER_PORT);
+            map.put("userName", REST_SERVER_USER);
+            map.put("password", REST_SERVER_PASSWORD);
+        }
+
+        return map;
+    }
+
+    /**
+     * Returns a property map for a databaseProviderParameters map for test cases.
+     *
+     * @param isEmpty boolean value to represent that object created should be empty or not
+     * @return a property map suitable for constructing an object
+     */
+    public Map<String, Object> getDatabaseProviderParametersMap(final boolean isEmpty) {
+        final Map<String, Object> map = new TreeMap<>();
+        if (!isEmpty) {
+            map.put("name", "PolicyProviderParameterGroup");
+            map.put("implementation", "org.onap.policy.models.provider.impl.DatabasePolicyModelsProviderImpl");
+            map.put("databaseDriver", "org.h2.Driver");
+            map.put("databaseUrl", "jdbc:h2:mem:testdb");
+            map.put("databaseUser", "policy");
+            map.put("databasePassword", "P01icY");
+            map.put("persistenceUnit", "ToscaConceptTest");
+        }
+
+        return map;
+    }
+
+    /**
+     * Returns a property map for a intermediaryParameters map for test cases.
+     *
+     * @param isEmpty boolean value to represent that object created should be empty or not
+     * @return a property map suitable for constructing an object
+     */
+    public Map<String, Object> getIntermediaryParametersMap(final boolean isEmpty) {
+        final Map<String, Object> map = new TreeMap<>();
+        if (!isEmpty) {
+            map.put("name", "Participant parameters");
+            map.put("reportingTimeInterval", TIME_INTERVAL);
+            map.put("description", DESCRIPTION);
+            map.put("participantId", getParticipantId());
+            map.put("participantType", getParticipantId());
+            map.put("clampControlLoopTopics", getTopicParametersMap(false));
+        }
+
+        return map;
+    }
+
+    /**
+     * Returns a property map for a TopicParameters map for test cases.
+     *
+     * @param isEmpty boolean value to represent that object created should be empty or not
+     * @return a property map suitable for constructing an object
+     */
+    public Map<String, Object> getTopicParametersMap(final boolean isEmpty) {
+        final Map<String, Object> map = new TreeMap<>();
+        if (!isEmpty) {
+            map.put("topicSources", TOPIC_PARAMS);
+            map.put("topicSinks", TOPIC_PARAMS);
+        }
+        return map;
+    }
+
+    /**
+     * Returns topic parameters for test cases.
+     *
+     * @return topic parameters
+     */
+    public static TopicParameters getTopicParams() {
+        final TopicParameters topicParams = new TopicParameters();
+        topicParams.setTopic("POLICY-CLRUNTIME-PARTICIPANT");
+        topicParams.setTopicCommInfrastructure("dmaap");
+        topicParams.setServers(Arrays.asList("localhost"));
+        return topicParams;
+    }
+
+    /**
+     * Returns participantId for test cases.
+     *
+     * @return participant Id
+     */
+    public static ToscaConceptIdentifier getParticipantId() {
+        final ToscaConceptIdentifier participantId = new ToscaConceptIdentifier("org.onap.PM_CDS_Blueprint", "1.0.0");
+        return participantId;
+    }
+
+    /**
+     * Gets the standard participant parameters.
+     *
+     * @param port port to be inserted into the parameters
+     * @return the standard participant parameters
+     */
+    public ParticipantSimulatorParameters getParticipantParameterGroup(int port) {
+        try {
+            return coder.decode(getParticipantParameterGroupAsString(port), ParticipantSimulatorParameters.class);
+
+        } catch (CoderException e) {
+            throw new ControlLoopRuntimeException(Response.Status.NOT_ACCEPTABLE,
+                    "cannot read participant parameters", e);
+        }
+    }
+
+    /**
+     * Gets the standard participant parameters, as a String.
+     *
+     * @param port port to be inserted into the parameters
+     * @return the standard participant parameters
+     */
+    public static String getParticipantParameterGroupAsString(int port) {
+
+        try {
+            File file = new File(getParamFile());
+            String json = new String(Files.readAllBytes(file.toPath()), StandardCharsets.UTF_8);
+
+            json = json.replace("${port}", String.valueOf(port));
+            json = json.replace("${dbName}", "jdbc:h2:mem:testdb");
+
+            return json;
+
+        } catch (IOException e) {
+            throw new ControlLoopRuntimeException(Response.Status.NOT_ACCEPTABLE,
+                    "cannot read participant parameters", e);
+
+        }
+    }
+
+    /**
+     * Gets the full path to the parameter file, which may vary depending on whether or
+     * not this is an end-to-end test.
+     *
+     * @return the parameter file name
+     */
+    private static String getParamFile() {
+        String paramFile = "src/test/resources/parameters/TestParametersStd.json";
+        return paramFile;
+    }
+
+    /**
+     * Nulls out a field within a JSON string.
+     * @param json JSON string
+     * @param field field to be nulled out
+     * @return a new JSON string with the field nulled out
+     */
+    public String nullifyField(String json, String field) {
+        return json.replace(field + "\"", field + "\":null, \"" + field + "Xxx\"");
+    }
+}
diff --git a/participant/participant-impl/participant-impl-simulator/src/test/java/org/onap/policy/clamp/controlloop/participant/simulator/main/parameters/TestParticipantSimulatorParameterHandler.java b/participant/participant-impl/participant-impl-simulator/src/test/java/org/onap/policy/clamp/controlloop/participant/simulator/main/parameters/TestParticipantSimulatorParameterHandler.java
new file mode 100644
index 0000000..e94939a
--- /dev/null
+++ b/participant/participant-impl/participant-impl-simulator/src/test/java/org/onap/policy/clamp/controlloop/participant/simulator/main/parameters/TestParticipantSimulatorParameterHandler.java
@@ -0,0 +1,120 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.simulator.main.parameters;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.io.FileNotFoundException;
+import org.apache.commons.io.DirectoryWalker.CancelException;
+import org.junit.Test;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopException;
+import org.onap.policy.clamp.controlloop.participant.simulator.main.startstop.ParticipantSimulatorCommandLineArguments;
+import org.onap.policy.common.utils.coder.CoderException;
+
+/**
+ * Class to perform unit test of {@link ParticipantParameterHandler}.
+ */
+public class TestParticipantSimulatorParameterHandler {
+
+    @Test
+    public void testParameterHandlerNoParameterFile() throws ControlLoopException {
+        final String[] emptyArgumentString = { "-c", "src/test/resources/parameters/NoParametersFile.json" };
+
+        final ParticipantSimulatorCommandLineArguments emptyArguments = new ParticipantSimulatorCommandLineArguments();
+        emptyArguments.parse(emptyArgumentString);
+
+        assertThatThrownBy(() -> new ParticipantSimulatorParameterHandler().getParameters(emptyArguments))
+            .hasCauseInstanceOf(CoderException.class)
+            .hasRootCauseInstanceOf(FileNotFoundException.class);
+    }
+
+    @Test
+    public void testParameterHandlerInvalidParameters() throws ControlLoopException {
+        final String[] invalidArgumentString = { "-c", "src/test/resources/parameters/InvalidParameters.json" };
+
+        final ParticipantSimulatorCommandLineArguments invalidArguments =
+                new ParticipantSimulatorCommandLineArguments();
+        invalidArguments.parse(invalidArgumentString);
+
+        assertThatThrownBy(() -> new ParticipantSimulatorParameterHandler().getParameters(invalidArguments))
+            .hasMessageStartingWith("error reading parameters from")
+            .hasCauseInstanceOf(CoderException.class);
+    }
+
+    @Test
+    public void testParameterHandlerNoParameters() throws CancelException, ControlLoopException {
+        final String[] noArgumentString = { "-c", "src/test/resources/parameters/EmptyParameters.json" };
+
+        final ParticipantSimulatorCommandLineArguments noArguments = new ParticipantSimulatorCommandLineArguments();
+        noArguments.parse(noArgumentString);
+
+        assertThatThrownBy(() -> new ParticipantSimulatorParameterHandler().getParameters(noArguments))
+            .hasMessageContaining("no parameters found");
+    }
+
+    @Test
+    public void testParticipantParameterGroup() throws ControlLoopException {
+        final String[] participantConfigParameters = { "-c", "src/test/resources/parameters/TestParameters.json"};
+
+        final ParticipantSimulatorCommandLineArguments arguments = new ParticipantSimulatorCommandLineArguments();
+        arguments.parse(participantConfigParameters);
+
+        final ParticipantSimulatorParameters parGroup = new ParticipantSimulatorParameterHandler()
+                .getParameters(arguments);
+        assertTrue(arguments.checkSetConfigurationFilePath());
+        assertEquals(CommonTestData.PARTICIPANT_GROUP_NAME, parGroup.getName());
+    }
+
+    @Test
+    public void testParticipantVersion() throws ControlLoopException {
+        final String[] participantConfigParameters = { "-v" };
+        final ParticipantSimulatorCommandLineArguments arguments = new ParticipantSimulatorCommandLineArguments();
+        assertThat(arguments.parse(participantConfigParameters)).startsWith(
+                        "ONAP Tosca defined control loop Participant");
+    }
+
+    @Test
+    public void testParticipantHelp() throws ControlLoopException {
+        final String[] participantConfigParameters = { "-h" };
+        final ParticipantSimulatorCommandLineArguments arguments = new ParticipantSimulatorCommandLineArguments();
+        assertThat(arguments.parse(participantConfigParameters)).startsWith("usage:");
+    }
+
+    @Test
+    public void testParticipant_TooManyArguments() throws ControlLoopException {
+        final String[] participantConfigParameters = { "-c", "src/test/resources/parameters/TestParameters.json",
+                                                       "TooMany"};
+        final ParticipantSimulatorCommandLineArguments arguments = new ParticipantSimulatorCommandLineArguments();
+        assertThatThrownBy(() -> arguments.parse(participantConfigParameters))
+            .hasMessageStartingWith("too many command line arguments specified");
+    }
+
+    @Test
+    public void testParticipantInvalidOption() throws ControlLoopException {
+        final String[] participantConfigParameters = { "-d" };
+        final ParticipantSimulatorCommandLineArguments arguments = new ParticipantSimulatorCommandLineArguments();
+        assertThatThrownBy(() -> arguments.parse(participantConfigParameters))
+            .hasMessageStartingWith("invalid command line arguments specified");
+    }
+}
diff --git a/participant/participant-impl/participant-impl-simulator/src/test/java/org/onap/policy/clamp/controlloop/participant/simulator/main/parameters/TestParticipantSimulatorParameters.java b/participant/participant-impl/participant-impl-simulator/src/test/java/org/onap/policy/clamp/controlloop/participant/simulator/main/parameters/TestParticipantSimulatorParameters.java
new file mode 100644
index 0000000..8027d6f
--- /dev/null
+++ b/participant/participant-impl/participant-impl-simulator/src/test/java/org/onap/policy/clamp/controlloop/participant/simulator/main/parameters/TestParticipantSimulatorParameters.java
@@ -0,0 +1,110 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.simulator.main.parameters;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+
+import java.util.Map;
+import org.junit.Test;
+import org.onap.policy.common.parameters.ValidationResult;
+
+/**
+ * Class to perform unit test of {@link ParticipantParameterGroup}.
+ */
+public class TestParticipantSimulatorParameters {
+    CommonTestData commonTestData = new CommonTestData();
+
+    @Test
+    public void testParticipantParameterGroup_Named() {
+        final ParticipantSimulatorParameters participantParameters = new ParticipantSimulatorParameters("my-name");
+        assertEquals("my-name", participantParameters.getName());
+    }
+
+    @Test
+    public void testParticipantParameterGroup() {
+        final ParticipantSimulatorParameters participantParameters = commonTestData.toObject(
+                commonTestData.getParticipantParameterGroupMap(CommonTestData.PARTICIPANT_GROUP_NAME),
+                ParticipantSimulatorParameters.class);
+        assertThat(participantParameters.validate().isValid()).isTrue();
+        assertEquals(CommonTestData.PARTICIPANT_GROUP_NAME, participantParameters.getName());
+    }
+
+    @Test
+    public void testParticipantParameterGroup_NullName() {
+        final ParticipantSimulatorParameters participantParameters = commonTestData
+                .toObject(commonTestData.getParticipantParameterGroupMap(null),
+                        ParticipantSimulatorParameters.class);
+        final ValidationResult validationResult = participantParameters.validate();
+        assertFalse(validationResult.isValid());
+        assertEquals(null, participantParameters.getName());
+        assertThat(validationResult.getResult()).contains("is null");
+    }
+
+    @Test
+    public void testParticipantParameterGroup_EmptyName() {
+        final ParticipantSimulatorParameters participantParameters = commonTestData
+                .toObject(commonTestData.getParticipantParameterGroupMap(""),
+                                ParticipantSimulatorParameters.class);
+        final ValidationResult validationResult = participantParameters.validate();
+        assertFalse(validationResult.isValid());
+        assertEquals("", participantParameters.getName());
+        assertThat(validationResult.getResult()).contains(
+                "item \"name\" value \"\" INVALID, " + "is blank");
+    }
+
+    @Test
+    public void testParticipantParameterGroup_SetName() {
+        final ParticipantSimulatorParameters participantParameters = commonTestData.toObject(
+                commonTestData.getParticipantParameterGroupMap(CommonTestData.PARTICIPANT_GROUP_NAME),
+                ParticipantSimulatorParameters.class);
+        participantParameters.setName("ParticipantNewGroup");
+        assertThat(participantParameters.validate().isValid()).isTrue();
+        assertEquals("ParticipantNewGroup", participantParameters.getName());
+    }
+
+    @Test
+    public void testParticipantParameterGroup_EmptyParticipantIntermediaryParameters() {
+        final Map<String, Object> map =
+                commonTestData.getParticipantParameterGroupMap(CommonTestData.PARTICIPANT_GROUP_NAME);
+        map.replace("intermediaryParameters", commonTestData.getIntermediaryParametersMap(true));
+        final ParticipantSimulatorParameters participantParameters =
+                commonTestData.toObject(map, ParticipantSimulatorParameters.class);
+        final ValidationResult validationResult = participantParameters.validate();
+        assertNull(validationResult.getResult());
+    }
+
+    @Test
+    public void testParticipantParameterGroupp_EmptyTopicParameters() {
+        final Map<String, Object> map =
+                commonTestData.getParticipantParameterGroupMap(CommonTestData.PARTICIPANT_GROUP_NAME);
+        final Map<String, Object> intermediaryParametersMap = commonTestData.getIntermediaryParametersMap(false);
+        intermediaryParametersMap.put("clampControlLoopTopics", commonTestData.getTopicParametersMap(true));
+        map.replace("intermediaryParameters", intermediaryParametersMap);
+
+        final ParticipantSimulatorParameters participantParameters =
+                commonTestData.toObject(map, ParticipantSimulatorParameters.class);
+        final ValidationResult validationResult = participantParameters.validate();
+        assertNull(validationResult.getResult());
+    }
+}
diff --git a/participant/participant-impl/participant-impl-simulator/src/test/java/org/onap/policy/clamp/controlloop/participant/simulator/main/rest/CommonParticipantRestServer.java b/participant/participant-impl/participant-impl-simulator/src/test/java/org/onap/policy/clamp/controlloop/participant/simulator/main/rest/CommonParticipantRestServer.java
new file mode 100644
index 0000000..ae004de
--- /dev/null
+++ b/participant/participant-impl/participant-impl-simulator/src/test/java/org/onap/policy/clamp/controlloop/participant/simulator/main/rest/CommonParticipantRestServer.java
@@ -0,0 +1,227 @@
+
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.simulator.main.rest;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.ClientBuilder;
+import javax.ws.rs.client.Invocation;
+import javax.ws.rs.client.WebTarget;
+import javax.ws.rs.core.MediaType;
+import org.glassfish.jersey.client.ClientProperties;
+import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopException;
+import org.onap.policy.clamp.controlloop.participant.simulator.main.parameters.CommonTestData;
+import org.onap.policy.clamp.controlloop.participant.simulator.main.startstop.Main;
+import org.onap.policy.common.endpoints.event.comm.TopicEndpointManager;
+import org.onap.policy.common.endpoints.http.server.HttpServletServerFactoryInstance;
+import org.onap.policy.common.gson.GsonMessageBodyHandler;
+import org.onap.policy.common.utils.network.NetworkUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Class to perform Rest unit tests.
+ *
+ */
+
+public class CommonParticipantRestServer {
+
+    private static final String CONFIG_FILE = "src/test/resources/parameters/TestConfigParameters.json";
+    private static final Logger LOGGER = LoggerFactory.getLogger(CommonParticipantRestServer.class);
+    public static final String SELF = NetworkUtil.getHostname();
+    public static final String ENDPOINT_PREFIX = "onap/participantsim/v2/";
+    private static int port;
+    private static String httpPrefix;
+    private static Main main;
+
+    /**
+     * Allocates a port for the server, writes a config file, and then starts Main.
+     *
+     * @throws Exception if an error occurs
+     */
+    @BeforeClass
+    public static void setUpBeforeClass() throws Exception {
+        setUpBeforeClass(true);
+    }
+
+    /**
+     * Allocates a port for the server, writes a config file, and then starts Main, if
+     * specified.
+     *
+     * @param shouldStart {@code true} if Main should be started, {@code false} otherwise
+     * @throws Exception if an error occurs
+     */
+    public static void setUpBeforeClass(boolean shouldStart) throws Exception {
+        port = NetworkUtil.allocPort();
+        httpPrefix = "http://localhost:" + port + "/";
+
+        makeConfigFile();
+        HttpServletServerFactoryInstance.getServerFactory().destroy();
+        TopicEndpointManager.getManager().shutdown();
+
+        if (shouldStart) {
+            startMain();
+        }
+    }
+
+    /**
+     * Stops Main.
+     */
+    @AfterClass
+    public static void teardownAfterClass() {
+        try {
+            stopMain();
+
+        } catch (ControlLoopException exp) {
+            LOGGER.error("cannot stop main", exp);
+        }
+    }
+
+    /**
+     * Set up.
+     *
+     * @throws Exception if an error occurs
+     */
+    @Before
+    public void setUp() throws Exception {
+        // restart, if not currently running
+        if (main == null) {
+            startMain();
+        }
+    }
+
+    /**
+     * Verifies that an endpoint appears within the swagger response.
+     *
+     * @param endpoint the endpoint of interest
+     * @throws Exception if an error occurs
+     */
+    protected void testSwagger(final String endpoint) throws Exception {
+        final Invocation.Builder invocationBuilder = sendFqeRequest(httpPrefix + "swagger.yaml", true);
+        assertThat(invocationBuilder.get(String.class)).contains(ENDPOINT_PREFIX + endpoint + ":");
+    }
+
+    /**
+     * Makes a parameter configuration file.
+     *
+     * @throws IOException if an error occurs writing the configuration file
+     * @throws FileNotFoundException if an error occurs writing the configuration file
+     *
+     * @throws Exception if an error occurs
+     */
+    private static void makeConfigFile() throws FileNotFoundException, IOException {
+        String json = CommonTestData.getParticipantParameterGroupAsString(port);
+        File file = new File(String.format(CONFIG_FILE, port));
+        file.deleteOnExit();
+        try (FileOutputStream output = new FileOutputStream(file)) {
+            output.write(json.getBytes(StandardCharsets.UTF_8));
+        }
+    }
+
+    /**
+     * Starts the "Main".
+     *
+     * @throws InterruptedException
+     *
+     * @throws Exception if an error occurs
+     */
+    protected static void startMain() throws InterruptedException {
+        // make sure port is available
+        if (NetworkUtil.isTcpPortOpen("localhost", port, 1, 1L)) {
+            throw new IllegalStateException("port " + port + " is still in use");
+        }
+
+        final String[] configParameters = { "-c", CONFIG_FILE };
+
+        main = new Main(configParameters);
+
+        if (!NetworkUtil.isTcpPortOpen("localhost", port, 40, 250L)) {
+            throw new IllegalStateException("server is not listening on port " + port);
+        }
+    }
+
+    /**
+     * Stops the "Main".
+     *
+     * @throws ControlLoopException
+     *
+     * @throws Exception if an error occurs
+     */
+    private static void stopMain() throws ControlLoopException {
+        if (main != null) {
+            main.shutdown();
+            main = null;
+        }
+    }
+
+    /**
+     * Sends a request to an endpoint.
+     *
+     * @param endpoint the target endpoint
+     * @return a request builder
+     * @throws Exception if an error occurs
+     */
+    protected Invocation.Builder sendRequest(final String endpoint) throws Exception {
+        return sendFqeRequest(httpPrefix + ENDPOINT_PREFIX + endpoint, true);
+    }
+
+    /**
+     * Sends a request to an endpoint, without any authorization header.
+     *
+     * @param endpoint the target endpoint
+     * @return a request builder
+     * @throws Exception if an error occurs
+     */
+    protected Invocation.Builder sendNoAuthRequest(final String endpoint) throws Exception {
+        return sendFqeRequest(httpPrefix + ENDPOINT_PREFIX + endpoint, false);
+    }
+
+    /**
+     * Sends a request to a fully qualified endpoint.
+     *
+     * @param fullyQualifiedEndpoint the fully qualified target endpoint
+     * @param includeAuth if authorization header should be included
+     * @return a request builder
+     * @throws Exception if an error occurs
+     */
+    protected Invocation.Builder sendFqeRequest(final String fullyQualifiedEndpoint, boolean includeAuth)
+            throws Exception {
+        final Client client = ClientBuilder.newBuilder().build();
+        client.property(ClientProperties.METAINF_SERVICES_LOOKUP_DISABLE, "true");
+        client.register(GsonMessageBodyHandler.class);
+        if (includeAuth) {
+            client.register(HttpAuthenticationFeature.basic("healthcheck", "zb!XztG34"));
+        }
+        final WebTarget webTarget = client.target(fullyQualifiedEndpoint);
+        return webTarget.request(MediaType.APPLICATION_JSON);
+    }
+}
diff --git a/participant/participant-impl/participant-impl-simulator/src/test/java/org/onap/policy/clamp/controlloop/participant/simulator/main/rest/RestControllerTest.java b/participant/participant-impl/participant-impl-simulator/src/test/java/org/onap/policy/clamp/controlloop/participant/simulator/main/rest/RestControllerTest.java
new file mode 100644
index 0000000..1311eee
--- /dev/null
+++ b/participant/participant-impl/participant-impl-simulator/src/test/java/org/onap/policy/clamp/controlloop/participant/simulator/main/rest/RestControllerTest.java
@@ -0,0 +1,95 @@
+/*
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.clamp.controlloop.participant.simulator.main.rest;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.util.UUID;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.ResponseBuilder;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.mockito.Mockito;
+import org.onap.policy.clamp.controlloop.participant.simulator.simulation.SimulationHandler;
+import org.onap.policy.common.utils.services.Registry;
+
+public class RestControllerTest {
+
+    private RestController ctlr;
+    private ResponseBuilder bldr;
+
+    /**
+     * Setup before class, instantiate SimulationHandler.
+     *
+     */
+    @BeforeClass
+    public static void setUpBeforeClass() throws Exception {
+        Registry.newRegistry();
+        Registry.register(SimulationHandler.class.getName(), Mockito.mock(SimulationHandler.class));
+    }
+
+    @AfterClass
+    public static void teardownAfterClass() throws Exception {
+        Registry.unregister(SimulationHandler.class.getName());
+    }
+
+    /**
+     * set Up.
+     */
+    @Before
+    public void setUp() {
+        ctlr = new RestController();
+        bldr = Response.status(Response.Status.OK);
+    }
+
+    @Test
+    public void testProduces() {
+        Produces annotation = RestController.class.getAnnotation(Produces.class);
+        assertNotNull(annotation);
+        assertThat(annotation.value()).contains(MediaType.APPLICATION_JSON)
+                        .contains(RestController.APPLICATION_YAML);
+    }
+
+    @Test
+    public void testAddVersionControlHeaders() {
+        Response resp = ctlr.addVersionControlHeaders(bldr).build();
+        assertEquals("0", resp.getHeaderString(RestController.VERSION_MINOR_NAME));
+        assertEquals("0", resp.getHeaderString(RestController.VERSION_PATCH_NAME));
+        assertEquals("1.0.0", resp.getHeaderString(RestController.VERSION_LATEST_NAME));
+    }
+
+    @Test
+    public void testAddLoggingHeaders_Null() {
+        Response resp = ctlr.addLoggingHeaders(bldr, null).build();
+        assertNotNull(resp.getHeaderString(RestController.REQUEST_ID_NAME));
+    }
+
+    @Test
+    public void testAddLoggingHeaders_NonNull() {
+        UUID uuid = UUID.randomUUID();
+        Response resp = ctlr.addLoggingHeaders(bldr, uuid).build();
+        assertEquals(uuid.toString(), resp.getHeaderString(RestController.REQUEST_ID_NAME));
+    }
+}
diff --git a/participant/participant-impl/participant-impl-simulator/src/test/java/org/onap/policy/clamp/controlloop/participant/simulator/main/rest/TestListenerUtils.java b/participant/participant-impl/participant-impl-simulator/src/test/java/org/onap/policy/clamp/controlloop/participant/simulator/main/rest/TestListenerUtils.java
new file mode 100644
index 0000000..9c20ffe
--- /dev/null
+++ b/participant/participant-impl/participant-impl-simulator/src/test/java/org/onap/policy/clamp/controlloop/participant/simulator/main/rest/TestListenerUtils.java
@@ -0,0 +1,258 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.simulator.main.rest;
+
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.time.Instant;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+import lombok.Getter;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoop;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopElement;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopOrderedState;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopState;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantState;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantControlLoopStateChange;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantControlLoopUpdate;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantStateChange;
+import org.onap.policy.clamp.controlloop.participant.intermediary.handler.ParticipantHandler;
+import org.onap.policy.clamp.controlloop.participant.simulator.main.parameters.CommonTestData;
+import org.onap.policy.clamp.controlloop.participant.simulator.main.parameters.ParticipantSimulatorParameters;
+import org.onap.policy.clamp.controlloop.participant.simulator.simulation.SimulationProvider;
+import org.onap.policy.common.utils.coder.Coder;
+import org.onap.policy.common.utils.coder.CoderException;
+import org.onap.policy.common.utils.coder.StandardCoder;
+import org.onap.policy.common.utils.coder.YamlJsonTranslator;
+import org.onap.policy.common.utils.resources.ResourceUtils;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class TestListenerUtils {
+
+    private static final YamlJsonTranslator yamlTranslator = new YamlJsonTranslator();
+    private static final Coder CODER = new StandardCoder();
+    static CommonTestData commonTestData = new CommonTestData();
+    private static final Logger LOGGER = LoggerFactory.getLogger(TestListenerUtils.class);
+
+    private TestListenerUtils() {}
+
+    @Getter
+    private static ParticipantHandler participantHandler;
+
+    /**
+     * Method to initialize participantHandler.
+     */
+    public static void initParticipantHandler() {
+
+        final ParticipantSimulatorParameters participantParameters = commonTestData.toObject(
+                commonTestData.getParticipantParameterGroupMap(CommonTestData.PARTICIPANT_GROUP_NAME),
+                ParticipantSimulatorParameters.class);
+
+        SimulationProvider simulationProvider =
+                new SimulationProvider(participantParameters.getIntermediaryParameters());
+
+        participantHandler = simulationProvider.getIntermediaryApi().getParticipantHandler();
+    }
+
+    /**
+     * Method to create a controlLoop from a yaml file.
+     *
+     * @return ControlLoop controlloop
+     */
+    public static ControlLoop createControlLoop() {
+        ControlLoop controlLoop = new ControlLoop();
+        Map<UUID, ControlLoopElement> elements = new LinkedHashMap<>();
+        ToscaServiceTemplate toscaServiceTemplate = testControlLoopRead();
+        Map<String, ToscaNodeTemplate> nodeTemplatesMap =
+                toscaServiceTemplate.getToscaTopologyTemplate().getNodeTemplates();
+        for (Map.Entry<String, ToscaNodeTemplate> toscaInputEntry : nodeTemplatesMap.entrySet()) {
+            ControlLoopElement clElement = new ControlLoopElement();
+            clElement.setId(UUID.randomUUID());
+
+            ToscaConceptIdentifier clElementParticipantId = new ToscaConceptIdentifier();
+            clElementParticipantId.setName(toscaInputEntry.getKey());
+            clElementParticipantId.setVersion(toscaInputEntry.getValue().getVersion());
+            clElement.setParticipantId(clElementParticipantId);
+            clElement.setParticipantType(clElementParticipantId);
+
+            clElement.setDefinition(clElementParticipantId);
+            clElement.setState(ControlLoopState.UNINITIALISED);
+            clElement.setDescription(toscaInputEntry.getValue().getDescription());
+            clElement.setOrderedState(ControlLoopOrderedState.UNINITIALISED);
+            elements.put(clElement.getId(), clElement);
+        }
+        controlLoop.setElements(elements);
+        controlLoop.setName("PMSHInstance0");
+        controlLoop.setVersion("1.0.0");
+
+        ToscaConceptIdentifier definition = new ToscaConceptIdentifier();
+        definition.setName("PMSHInstance0");
+        definition.setVersion("1.0.0");
+        controlLoop.setDefinition(definition);
+
+        return controlLoop;
+    }
+
+    /**
+     * Method to create ParticipantStateChange message from the arguments passed.
+     *
+     * @param participantState participant State
+     *
+     * @return ParticipantStateChange message
+     */
+    public static ParticipantStateChange createParticipantStateChangeMsg(final ParticipantState participantState) {
+        final ParticipantStateChange participantStateChangeMsg = new ParticipantStateChange();
+        ToscaConceptIdentifier participantId = new ToscaConceptIdentifier("org.onap.PM_CDS_Blueprint", "1.0.0");
+
+        participantStateChangeMsg.setParticipantId(participantId);
+        participantStateChangeMsg.setTimestamp(Instant.now());
+        participantStateChangeMsg.setState(participantState);
+
+        return participantStateChangeMsg;
+    }
+
+    /**
+     * Method to create ControlLoopStateChange message from the arguments passed.
+     *
+     * @param controlLoopOrderedState controlLoopOrderedState
+     *
+     * @return ParticipantControlLoopStateChange message
+     */
+    public static ParticipantControlLoopStateChange createControlLoopStateChangeMsg(
+            final ControlLoopOrderedState controlLoopOrderedState) {
+        final ParticipantControlLoopStateChange participantClStateChangeMsg = new ParticipantControlLoopStateChange();
+
+        ToscaConceptIdentifier controlLoopId = new ToscaConceptIdentifier("PMSHInstance0", "1.0.0");
+        ToscaConceptIdentifier participantId = new ToscaConceptIdentifier("org.onap.PM_CDS_Blueprint", "1.0.0");
+
+        participantClStateChangeMsg.setControlLoopId(controlLoopId);
+        participantClStateChangeMsg.setParticipantId(participantId);
+        participantClStateChangeMsg.setTimestamp(Instant.now());
+        participantClStateChangeMsg.setOrderedState(controlLoopOrderedState);
+
+        return participantClStateChangeMsg;
+    }
+
+    /**
+     * Method to create ControlLoopUpdateMsg.
+     *
+     * @return ParticipantControlLoopUpdate message
+     */
+    public static ParticipantControlLoopUpdate createControlLoopUpdateMsg() {
+        final ParticipantControlLoopUpdate clUpdateMsg = new ParticipantControlLoopUpdate();
+        ToscaConceptIdentifier controlLoopId = new ToscaConceptIdentifier("PMSHInstance0", "1.0.0");
+        ToscaConceptIdentifier participantId = new ToscaConceptIdentifier("org.onap.PM_CDS_Blueprint", "1.0.0");
+
+        clUpdateMsg.setControlLoopId(controlLoopId);
+        clUpdateMsg.setParticipantId(participantId);
+        clUpdateMsg.setParticipantType(participantId);
+
+        ControlLoop controlLoop = new ControlLoop();
+        Map<UUID, ControlLoopElement> elements = new LinkedHashMap<>();
+        ToscaServiceTemplate toscaServiceTemplate = testControlLoopRead();
+        Map<String, ToscaNodeTemplate> nodeTemplatesMap =
+                toscaServiceTemplate.getToscaTopologyTemplate().getNodeTemplates();
+        for (Map.Entry<String, ToscaNodeTemplate> toscaInputEntry : nodeTemplatesMap.entrySet()) {
+            ControlLoopElement clElement = new ControlLoopElement();
+            clElement.setId(UUID.randomUUID());
+
+            ToscaConceptIdentifier clElementParticipantId = new ToscaConceptIdentifier();
+            clElementParticipantId.setName(toscaInputEntry.getKey());
+            clElementParticipantId.setVersion(toscaInputEntry.getValue().getVersion());
+            clElement.setParticipantId(clElementParticipantId);
+            clElement.setParticipantType(clElementParticipantId);
+
+            clElement.setDefinition(clElementParticipantId);
+            clElement.setState(ControlLoopState.UNINITIALISED);
+            clElement.setDescription(toscaInputEntry.getValue().getDescription());
+            clElement.setOrderedState(ControlLoopOrderedState.UNINITIALISED);
+            elements.put(clElement.getId(), clElement);
+        }
+        controlLoop.setElements(elements);
+        controlLoop.setName("PMSHInstance0");
+        controlLoop.setVersion("1.0.0");
+        controlLoop.setDefinition(controlLoopId);
+        clUpdateMsg.setControlLoop(controlLoop);
+        clUpdateMsg.setControlLoopDefinition(toscaServiceTemplate);
+
+        return clUpdateMsg;
+    }
+
+    /**
+     * Method to create ParticipantControlLoopUpdate using the arguments passed.
+     *
+     * @param jsonFilePath the path of the controlloop content
+     *
+     * @return ParticipantControlLoopUpdate message
+     * @throws CoderException exception while reading the file to object
+     */
+    public static ParticipantControlLoopUpdate createParticipantClUpdateMsgFromJson(String jsonFilePath)
+            throws CoderException {
+        ParticipantControlLoopUpdate participantControlLoopUpdateMsg =
+                CODER.decode(new File(jsonFilePath), ParticipantControlLoopUpdate.class);
+        return participantControlLoopUpdateMsg;
+    }
+
+    private static ToscaServiceTemplate testControlLoopRead() {
+        Set<String> controlLoopDirectoryContents =
+                ResourceUtils.getDirectoryContents("src/test/resources/rest/servicetemplates");
+
+        boolean atLeastOneControlLoopTested = false;
+        ToscaServiceTemplate toscaServiceTemplate = null;
+
+        for (String controlLoopFilePath : controlLoopDirectoryContents) {
+            if (!controlLoopFilePath.endsWith(".yaml")) {
+                continue;
+            }
+            atLeastOneControlLoopTested = true;
+            toscaServiceTemplate = testControlLoopYamlSerialization(controlLoopFilePath);
+        }
+
+        assertTrue(atLeastOneControlLoopTested);
+        return toscaServiceTemplate;
+    }
+
+    private static ToscaServiceTemplate testControlLoopYamlSerialization(String controlLoopFilePath) {
+        try {
+            String controlLoopString = ResourceUtils.getResourceAsString(controlLoopFilePath);
+            if (controlLoopString == null) {
+                throw new FileNotFoundException(controlLoopFilePath);
+            }
+
+            ToscaServiceTemplate serviceTemplate = yamlTranslator.fromYaml(
+                            controlLoopString, ToscaServiceTemplate.class);
+            return serviceTemplate;
+        } catch (FileNotFoundException e) {
+            LOGGER.error("cannot find YAML file", controlLoopFilePath);
+            throw new IllegalArgumentException(e);
+        }
+    }
+}
diff --git a/participant/participant-impl/participant-impl-simulator/src/test/java/org/onap/policy/clamp/controlloop/participant/simulator/main/rest/TestSimulationRestController.java b/participant/participant-impl/participant-impl-simulator/src/test/java/org/onap/policy/clamp/controlloop/participant/simulator/main/rest/TestSimulationRestController.java
new file mode 100644
index 0000000..472b4be
--- /dev/null
+++ b/participant/participant-impl/participant-impl-simulator/src/test/java/org/onap/policy/clamp/controlloop/participant/simulator/main/rest/TestSimulationRestController.java
@@ -0,0 +1,186 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.simulator.main.rest;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.client.Invocation;
+import javax.ws.rs.core.GenericType;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoop;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopElement;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopOrderedState;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.Participant;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantState;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantControlLoopUpdate;
+import org.onap.policy.clamp.controlloop.models.messages.rest.TypedSimpleResponse;
+import org.onap.policy.clamp.controlloop.participant.intermediary.comm.ControlLoopUpdateListener;
+import org.onap.policy.clamp.controlloop.participant.simulator.main.parameters.CommonTestData;
+import org.onap.policy.clamp.controlloop.participant.simulator.simulation.SimulationHandler;
+import org.onap.policy.clamp.controlloop.participant.simulator.simulation.SimulationProvider;
+import org.onap.policy.common.endpoints.event.comm.Topic.CommInfrastructure;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate;
+
+/**
+ * Class to perform unit test of {@link TestSimulationRestController}.
+ */
+public class TestSimulationRestController extends CommonParticipantRestServer {
+
+    private static ControlLoopUpdateListener clUpdateListener;
+    private static final String PARTICIPANTS_ENDPOINT = "participants";
+    private static final String ELEMENTS_ENDPOINT = "elements";
+    private static final CommInfrastructure INFRA = CommInfrastructure.NOOP;
+    private static final String TOPIC = "my-topic";
+    static CommonTestData commonTestData = new CommonTestData();
+
+    /**
+     * Setup before class.
+     *
+     */
+    @BeforeClass
+    public static void setUpBeforeClass() throws Exception {
+        CommonParticipantRestServer.setUpBeforeClass();
+        clUpdateListener = new ControlLoopUpdateListener(
+                SimulationHandler.getInstance()
+                .getSimulationProvider()
+                .getIntermediaryApi()
+                .getParticipantHandler());
+        ParticipantControlLoopUpdate participantControlLoopUpdateMsg =
+                TestListenerUtils.createControlLoopUpdateMsg();
+        participantControlLoopUpdateMsg.getControlLoop().setOrderedState(ControlLoopOrderedState.PASSIVE);
+        clUpdateListener.onTopicEvent(INFRA, TOPIC, null, participantControlLoopUpdateMsg);
+    }
+
+    @AfterClass
+    public static void teardownAfterClass() {
+        CommonParticipantRestServer.teardownAfterClass();
+    }
+
+    @Test
+    public void testSwagger() throws Exception {
+        super.testSwagger(ELEMENTS_ENDPOINT);
+    }
+
+    @Test
+    public void testQuery_Unauthorized() throws Exception {
+        Invocation.Builder invocationBuilder = super.sendNoAuthRequest(ELEMENTS_ENDPOINT);
+        Response rawresp = invocationBuilder.buildGet().invoke();
+        assertEquals(Response.Status.UNAUTHORIZED.getStatusCode(), rawresp.getStatus());
+    }
+
+    @Test
+    public void testQueryParticipants() throws Exception {
+        Participant participant = new Participant();
+        ToscaConceptIdentifier participantId = CommonTestData.getParticipantId();
+        participant.setDefinition(participantId);
+        participant.setName(participantId.getName());
+        participant.setVersion(participantId.getVersion());
+
+        // GET REST call for querying the participants
+        Invocation.Builder invocationBuilder =
+            super.sendRequest(PARTICIPANTS_ENDPOINT + "/" + participant.getKey().getName()
+                    + "/" + participant.getVersion());
+
+        Response rawresp = invocationBuilder.buildGet().invoke();
+        assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus());
+        List<Participant> returnValue = rawresp.readEntity(new GenericType<List<Participant>>() {});
+        assertNotNull(returnValue);
+        assertThat(returnValue).hasSize(1);
+        // Verify the result of GET participants with what is stored
+        assertEquals(participant.getDefinition(), returnValue.get(0).getDefinition());
+    }
+
+    @Test
+    public void testQueryControlLoopElements() throws Exception {
+        // GET REST call for querying the controlLoop elements
+        Invocation.Builder invocationBuilder = super.sendRequest(ELEMENTS_ENDPOINT + "/"
+                                                        + "PMSHInstance0" + "/" + "1.0.0");
+
+        Response rawresp = invocationBuilder.buildGet().invoke();
+        assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus());
+        Map<UUID, ControlLoopElement> returnValue =
+                        rawresp.readEntity(new GenericType<Map<UUID, ControlLoopElement>>() {});
+        assertNotNull(returnValue);
+        // Verify the result of GET controlloop elements with what is stored
+        assertThat(returnValue).hasSize(1);
+        returnValue.values().forEach(element -> assertEquals("org.onap.PM_CDS_Blueprint",
+                                element.getDefinition().getName()));
+    }
+
+    @Test
+    public void testUpdateParticipant() throws Exception {
+        SimulationProvider provider = SimulationHandler.getInstance().getSimulationProvider();
+        List<Participant> participants = provider.getParticipants(CommonTestData.getParticipantId().getName(),
+                CommonTestData.getParticipantId().getVersion());
+        assertEquals(ParticipantState.UNKNOWN, participants.get(0).getParticipantState());
+        // Change the state of the participant to PASSIVE from UNKNOWN
+        participants.get(0).setParticipantState(ParticipantState.PASSIVE);
+        Entity<Participant> entParticipant = Entity.entity(participants.get(0), MediaType.APPLICATION_JSON);
+
+        // PUT REST call for updating Participant
+        Invocation.Builder invocationBuilder = sendRequest(PARTICIPANTS_ENDPOINT);
+        Response rawresp = invocationBuilder.put(entParticipant);
+        TypedSimpleResponse<Participant> resp = rawresp.readEntity(TypedSimpleResponse.class);
+        assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus());
+        assertNotNull(resp.getResponse());
+        // Verify the response and state returned by PUT REST call for updating participants
+        assertThat(resp.toString()).contains("definition={name=org.onap.PM_CDS_Blueprint, version=1.0.0}");
+        assertThat(resp.toString()).contains("participantState=PASSIVE");
+    }
+
+    @Test
+    public void testUpdateControlLoopElement() throws Exception {
+        ControlLoop controlLoop = TestListenerUtils.createControlLoop();
+        SimulationProvider provider = SimulationHandler.getInstance().getSimulationProvider();
+        Map<UUID, ControlLoopElement> controlLoopElements = provider.getControlLoopElements(
+                controlLoop.getDefinition().getName(), controlLoop.getDefinition().getVersion());
+
+        for (Map.Entry<UUID, ControlLoopElement> clElement : controlLoopElements.entrySet()) {
+            // Check the initial state on the ControlLoopElement, which is UNINITIALISED
+            assertEquals(ControlLoopOrderedState.UNINITIALISED, clElement.getValue().getOrderedState());
+            // Change the state of the ControlLoopElement to PASSIVE from UNINITIALISED
+            clElement.getValue().setOrderedState(ControlLoopOrderedState.PASSIVE);
+            Entity<ControlLoopElement> entClElement = Entity.entity(clElement.getValue(), MediaType.APPLICATION_JSON);
+
+            // PUT REST call for updating ControlLoopElement
+            Invocation.Builder invocationBuilder = sendRequest(ELEMENTS_ENDPOINT);
+            Response rawresp = invocationBuilder.put(entClElement);
+            TypedSimpleResponse<ControlLoopElement> resp = rawresp.readEntity(TypedSimpleResponse.class);
+            assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus());
+            assertNotNull(resp.getResponse());
+            // Verify the response and state returned by PUT REST call for updating participants
+            assertThat(resp.toString()).contains("definition={name=org.onap.PM_CDS_Blueprint, version=1.0.0}");
+            assertThat(resp.toString()).contains("orderedState=PASSIVE");
+        }
+    }
+}
diff --git a/participant/participant-impl/participant-impl-simulator/src/test/java/org/onap/policy/clamp/controlloop/participant/simulator/main/startstop/TestMain.java b/participant/participant-impl/participant-impl-simulator/src/test/java/org/onap/policy/clamp/controlloop/participant/simulator/main/startstop/TestMain.java
new file mode 100644
index 0000000..5a5ad89
--- /dev/null
+++ b/participant/participant-impl/participant-impl-simulator/src/test/java/org/onap/policy/clamp/controlloop/participant/simulator/main/startstop/TestMain.java
@@ -0,0 +1,117 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.simulator.main.startstop;
+
+import static org.assertj.core.api.Assertions.assertThatCode;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopRuntimeException;
+import org.onap.policy.common.utils.resources.MessageConstants;
+
+/**
+ * Class to perform unit test of {@link Main}}.
+ */
+public class TestMain {
+
+    @Test
+    public void testMain_Help() {
+        final String[] configParameters = {"-h"};
+        Main main = new Main(configParameters);
+        assertFalse(main.isRunning());
+    }
+
+    @Test
+    public void testMain_Version() {
+        final String[] configParameters = {"-v"};
+        Main main = new Main(configParameters);
+        assertFalse(main.isRunning());
+    }
+
+    @Test
+    public void testMain_Valid() {
+        final String[] configParameters = {"-c", "src/test/resources/parameters/TestParameters.json"};
+        Main main = new Main(configParameters);
+        assertTrue(main.isRunning());
+
+        assertThatCode(() -> main.shutdown()).doesNotThrowAnyException();
+
+        assertFalse(main.isRunning());
+    }
+
+    @Test
+    public void testMain_NoParameter() {
+        assertThatConfigParameterThrownException(new String[] {});
+    }
+
+    @Test
+    public void testMain_FilePathNotDefined() {
+        assertThatConfigParameterThrownException(new String[] {"-c"});
+    }
+
+    @Test
+    public void testMain_TooManyCommand() {
+        assertThatConfigParameterThrownException(new String[] {"-h", "d"});
+    }
+
+    @Test
+    public void testMain_WrongParameter() {
+        assertThatConfigParameterThrownException(new String[] {"-d"});
+    }
+
+    private void assertThatConfigParameterThrownException(final String[] configParameters) {
+        assertThatThrownBy(() -> Main.main(configParameters)).isInstanceOf(ControlLoopRuntimeException.class)
+                .hasMessage(String.format(MessageConstants.START_FAILURE_MSG, MessageConstants.POLICY_CLAMP));
+    }
+
+    @Test
+    public void testParticipant_NoFileWithThisName() {
+        assertThatConfigFileThrownException("src/test/resources/parameters/NoFileWithThisName.json");
+    }
+
+    @Test
+    public void testParticipant_NotValidFile() {
+        assertThatConfigFileThrownException("src/test/resources/parameters");
+    }
+
+    @Test
+    public void testParticipant_FileEmpty() {
+        assertThatConfigFileThrownException("src/test/resources/parameters/EmptyParameters.json");
+    }
+
+    @Test
+    public void testParticipant_NoParameters() {
+        assertThatConfigFileThrownException("src/test/resources/parameters/NoParameters.json");
+    }
+
+    @Test
+    public void testParticipant_InvalidParameters() {
+        assertThatConfigFileThrownException("src/test/resources/parameters/InvalidParameters.json");
+    }
+
+    private void assertThatConfigFileThrownException(final String configFilePath) {
+        final String[] configParameters = new String[] {"-c", configFilePath};
+        assertThatThrownBy(() -> new Main(configParameters)).isInstanceOf(ControlLoopRuntimeException.class)
+                .hasMessage(String.format(MessageConstants.START_FAILURE_MSG, MessageConstants.POLICY_CLAMP));
+    }
+}
diff --git a/participant/participant-impl/participant-impl-simulator/src/test/java/org/onap/policy/clamp/controlloop/participant/simulator/main/startstop/TestParticipantSimulatorActivator.java b/participant/participant-impl/participant-impl-simulator/src/test/java/org/onap/policy/clamp/controlloop/participant/simulator/main/startstop/TestParticipantSimulatorActivator.java
new file mode 100644
index 0000000..c695d5f
--- /dev/null
+++ b/participant/participant-impl/participant-impl-simulator/src/test/java/org/onap/policy/clamp/controlloop/participant/simulator/main/startstop/TestParticipantSimulatorActivator.java
@@ -0,0 +1,89 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.simulator.main.startstop;
+
+import static org.assertj.core.api.Assertions.assertThatIllegalStateException;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.onap.policy.clamp.controlloop.participant.simulator.main.parameters.CommonTestData;
+import org.onap.policy.clamp.controlloop.participant.simulator.main.parameters.ParticipantSimulatorParameterHandler;
+import org.onap.policy.clamp.controlloop.participant.simulator.main.parameters.ParticipantSimulatorParameters;
+
+/**
+ * Class to perform unit test of {@link ParticipantActivator}}.
+ */
+public class TestParticipantSimulatorActivator {
+
+    private static ParticipantSimulatorActivator activator;
+
+    /**
+     * Initializes an activator.
+     *
+     * @throws Exception if an error occurs
+     */
+    @BeforeClass
+    public static void setUp() throws Exception {
+        final String[] participantConfigParameters = { "-c", "src/test/resources/parameters/TestParameters.json"};
+        final ParticipantSimulatorCommandLineArguments arguments =
+                new ParticipantSimulatorCommandLineArguments(participantConfigParameters);
+        final ParticipantSimulatorParameters parGroup =
+                new ParticipantSimulatorParameterHandler().getParameters(arguments);
+        activator = new ParticipantSimulatorActivator(parGroup);
+    }
+
+    /**
+     * Method for cleanup after each test.
+     *
+     * @throws Exception if an error occurs
+     */
+    @AfterClass
+    public static void teardown() throws Exception {
+        // shut down activator
+        if (activator != null && activator.isAlive()) {
+            activator.shutdown();
+        }
+    }
+
+    @Test
+    public void testParticipantActivator() {
+        activator.start();
+        assertTrue(activator.isAlive());
+        assertTrue(activator.getParameters().isValid());
+        assertEquals(CommonTestData.PARTICIPANT_GROUP_NAME, activator.getParameters().getName());
+
+        // repeat - should throw an exception
+        assertThatIllegalStateException().isThrownBy(() -> activator.start());
+        assertTrue(activator.isAlive());
+        assertTrue(activator.getParameters().isValid());
+
+        activator.shutdown();
+        assertFalse(activator.isAlive());
+
+        // repeat - should throw an exception
+        assertThatIllegalStateException().isThrownBy(() -> activator.shutdown());
+        assertFalse(activator.isAlive());
+    }
+}
diff --git a/participant/participant-impl/participant-impl-simulator/src/test/resources/parameters/EmptyParameters.json b/participant/participant-impl/participant-impl-simulator/src/test/resources/parameters/EmptyParameters.json
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/participant/participant-impl/participant-impl-simulator/src/test/resources/parameters/EmptyParameters.json
diff --git a/participant/participant-impl/participant-impl-simulator/src/test/resources/parameters/InvalidParameters.json b/participant/participant-impl/participant-impl-simulator/src/test/resources/parameters/InvalidParameters.json
new file mode 100644
index 0000000..1035ccb
--- /dev/null
+++ b/participant/participant-impl/participant-impl-simulator/src/test/resources/parameters/InvalidParameters.json
@@ -0,0 +1,3 @@
+{
+  "name": "
+}
diff --git a/participant/participant-impl/participant-impl-simulator/src/test/resources/parameters/NoParameters.json b/participant/participant-impl/participant-impl-simulator/src/test/resources/parameters/NoParameters.json
new file mode 100644
index 0000000..7a73a41
--- /dev/null
+++ b/participant/participant-impl/participant-impl-simulator/src/test/resources/parameters/NoParameters.json
@@ -0,0 +1,2 @@
+{
+}
\ No newline at end of file
diff --git a/participant/participant-impl/participant-impl-simulator/src/test/resources/parameters/TestParameters.json b/participant/participant-impl/participant-impl-simulator/src/test/resources/parameters/TestParameters.json
new file mode 100644
index 0000000..8c59404
--- /dev/null
+++ b/participant/participant-impl/participant-impl-simulator/src/test/resources/parameters/TestParameters.json
@@ -0,0 +1,61 @@
+{
+    "name": "ControlLoopParticipantGroup",
+    "restServerParameters": {
+        "host": "0.0.0.0",
+        "port": 6969,
+        "userName": "healthcheck",
+        "password": "zb!XztG34",
+        "https": false,
+        "aaf": false
+    },
+    "intermediaryParameters": {
+        "name": "Participant parameters",
+        "reportingTimeInterval": 120000,
+        "description": "Participant Description",
+        "participantId": {
+            "name": "org.onap.PM_CDS_Blueprint",
+            "version": "1.0.0"
+        },
+        "participantType": {
+            "name": "org.onap.PM_CDS_Blueprint",
+            "version": "1.0.0"
+        },
+        "clampControlLoopTopics": {
+            "topicSources": [
+                {
+                    "topic": "POLICY-CLRUNTIME-PARTICIPANT",
+                    "servers": [
+                        "localhost"
+                    ],
+                    "topicCommInfrastructure": "dmaap",
+                    "fetchTimeout": 15000
+                }
+            ],
+            "topicSinks": [
+                {
+                    "topic": "POLICY-CLRUNTIME-PARTICIPANT",
+                    "servers": [
+                        "localhost"
+                    ],
+                    "topicCommInfrastructure": "dmaap"
+                },
+                {
+                    "topic": "POLICY-NOTIFICATION",
+                    "servers": [
+                        "localhost"
+                    ],
+                    "topicCommInfrastructure": "dmaap"
+                }
+            ]
+        }
+    },
+    "databaseProviderParameters": {
+        "name": "PolicyProviderParameterGroup",
+        "implementation": "org.onap.policy.models.provider.impl.DatabasePolicyModelsProviderImpl",
+        "databaseDriver": "org.h2.Driver",
+        "databaseUrl": "jdbc:h2:mem:testdb",
+        "databaseUser": "policy",
+        "databasePassword": "P01icY",
+        "persistenceUnit": "ToscaConceptTest"
+    }
+}
diff --git a/participant/participant-impl/participant-impl-simulator/src/test/resources/parameters/TestParametersStd.json b/participant/participant-impl/participant-impl-simulator/src/test/resources/parameters/TestParametersStd.json
new file mode 100644
index 0000000..0295a8f
--- /dev/null
+++ b/participant/participant-impl/participant-impl-simulator/src/test/resources/parameters/TestParametersStd.json
@@ -0,0 +1,61 @@
+{
+    "name": "ControlLoopParticipantGroup",
+     "restServerParameters": {
+        "host": "0.0.0.0",
+        "port": ${port},
+        "userName": "healthcheck",
+        "password": "zb!XztG34",
+        "https": false,
+        "aaf": false
+    },
+    "intermediaryParameters": {
+        "name": "Participant parameters",
+        "reportingTimeInterval": 120000,
+        "description": "Participant Description",
+        "participantId": {
+            "name": "org.onap.PM_CDS_Blueprint",
+            "version": "1.0.0"
+        },
+        "participantType": {
+            "name": "org.onap.PM_CDS_Blueprint",
+            "version": "1.0.0"
+        },
+        "clampControlLoopTopics": {
+            "topicSources": [
+                {
+                    "topic": "POLICY-CLRUNTIME-PARTICIPANT",
+                    "servers": [
+                        "localhost"
+                    ],
+                    "topicCommInfrastructure": "dmaap",
+                    "fetchTimeout": 15000
+                }
+            ],
+            "topicSinks": [
+                {
+                    "topic": "POLICY-CLRUNTIME-PARTICIPANT",
+                    "servers": [
+                        "localhost"
+                    ],
+                    "topicCommInfrastructure": "dmaap"
+                },
+                {
+                    "topic": "POLICY-NOTIFICATION",
+                    "servers": [
+                        "localhost"
+                    ],
+                    "topicCommInfrastructure": "dmaap"
+                }
+            ]
+        }
+    },
+    "databaseProviderParameters": {
+        "name": "PolicyProviderParameterGroup",
+        "implementation": "org.onap.policy.models.provider.impl.DatabasePolicyModelsProviderImpl",
+        "databaseDriver": "org.h2.Driver",
+        "databaseUrl": "jdbc:h2:mem:testdb",
+        "databaseUser": "policy",
+        "databasePassword": "P01icY",
+        "persistenceUnit": "ToscaConceptTest"
+    }
+}
diff --git a/participant/participant-impl/participant-impl-simulator/src/test/resources/parameters/Unreadable.json b/participant/participant-impl/participant-impl-simulator/src/test/resources/parameters/Unreadable.json
new file mode 100644
index 0000000..f11bd8c
--- /dev/null
+++ b/participant/participant-impl/participant-impl-simulator/src/test/resources/parameters/Unreadable.json
@@ -0,0 +1,81 @@
+{
+    "name": "ControlLoopRuntimeGroup",
+    "restServerParameters": {
+        "host": "0.0.0.0",
+        "port": 6969,
+        "userName": "healthcheck",
+        "password": "zb!XztG34",
+        "https": false,
+        "aaf": false
+    },
+    "participantParameters": {
+        "heartBeatMs": 120000,
+        "updateParameters": {
+            "maxRetryCount": 1,
+            "maxWaitMs": 30000
+        },
+        "stateChangeParameters": {
+            "maxRetryCount": 1,
+            "maxWaitMs": 30000
+        }
+    },
+    "databaseProviderParameters": {
+        "name": "PolicyProviderParameterGroup",
+        "implementation": "org.onap.policy.models.provider.impl.DatabasePolicyModelsProviderImpl",
+        "databaseDriver": "org.h2.Driver",
+        "databaseUrl": "jdbc:h2:mem:testdb",
+        "databaseUser": "policy",
+        "databasePassword": "P01icY",
+        "persistenceUnit": "ToscaConceptTest"
+    },
+    "topicParameterGroup": {
+        "topicSources": [
+            {
+                "topic": "POLICY-CLRUNTIME-PARTICIPANT",
+                "servers": [
+                    "localhost"
+                ],
+                "topicCommInfrastructure": "dmaap",
+                "fetchTimeout": 15000
+            }
+        ],
+        "topicSinks": [
+            {
+                "topic": "POLICY-CLRUNTIME-PARTICIPANT",
+                "servers": [
+                    "localhost"
+                ],
+                "topicCommInfrastructure": "dmaap"
+            },
+            {
+                "topic": "POLICY-NOTIFICATION",
+                "servers": [
+                    "localhost"
+                ],
+                "topicCommInfrastructure": "dmaap"
+            }
+        ]
+    },
+    "healthCheckRestClientParameters": [
+        {
+            "clientName": "api",
+            "hostname": "policy-api",
+            "port": 6969,
+            "userName": "healthcheck",
+            "password": "zb!XztG34",
+            "useHttps": true,
+            "basePath": "policy/api/v1/healthcheck"
+        },
+        {
+            "clientName": "distribution",
+            "hostname": "policy-distribution",
+            "port": 6969,
+            "userName": "healthcheck",
+            "password": "zb!XztG34",
+            "useHttps": true,
+            "basePath": "healthcheck"
+        }
+    ]
+}
+
+
diff --git a/participant/participant-impl/participant-impl-simulator/src/test/resources/rest/servicetemplates/pm_control_loop_tosca.yaml b/participant/participant-impl/participant-impl-simulator/src/test/resources/rest/servicetemplates/pm_control_loop_tosca.yaml
new file mode 100644
index 0000000..99dd0ed
--- /dev/null
+++ b/participant/participant-impl/participant-impl-simulator/src/test/resources/rest/servicetemplates/pm_control_loop_tosca.yaml
@@ -0,0 +1,452 @@
+tosca_definitions_version: tosca_simple_yaml_1_3
+capability_types:
+  org.onap.EventProducer:
+    properties:
+      carrier_protocol_type:
+        type: string
+        required: true
+        constraints:
+        - valid_values:
+          - DMAAP_message_router
+          - SOMETHING_ELSE
+          - REST
+      data_format:
+        type: string
+        required: true
+        constraints:
+        - valid_values:
+          - JSON
+          - YAML
+          - JMS
+      event_format:
+        type: string
+        required: true
+      event_format_version:
+        type: string
+        required: false
+      config_keys:
+        type: list
+        required: false
+        entry_schema:
+          type: string
+          constraints:
+          - valid_values:
+            - all valid values should be added here
+            - if not specified, events of any config key may be generated
+            - 'examples for config_key: ves-measurement, ves-syslog, tca_handle_out,
+              etc.'
+    version: 0.0.1
+    derived_from: tosca.capabilities.Root
+  org.onap.EventConsumer:
+    properties:
+      responding_capability:
+        type: string
+        required: false
+      carrier_protocol_type:
+        type: string
+        required: true
+        constraints:
+        - valid_values:
+          - DMAAP_message_router
+          - SOMETHING_ELSE
+          - REST
+      data_format:
+        type: string
+        required: true
+        constraints:
+        - valid_values:
+          - JSON
+          - YAML
+          - JMS
+          - all valid values should be added here
+      event_format:
+        type: string
+        description: 'examples for event_format: Ves_specification, LinkUp, VnfConfigured,
+          etc.'
+        required: true
+      event_format_version:
+        type: string
+        description: 'examples for event_format_version: 5.28.4, 7.30.1, etc.'
+        required: false
+      config_keys:
+        type: list
+        required: false
+        entry_schema:
+          type: string
+          constraints:
+          - valid_values:
+            - all valid values should be added here
+            - if not specified, events of any config key may be generated
+            - 'examples for config_key: ves-measurement, ves-syslog, tca_handle_out,
+              etc.'
+    version: 0.0.1
+    derived_from: tosca.capabilities.Root
+node_types:
+  org.onap.DynamicConfig:
+    properties:
+      application_name:
+        type: string
+        description: Value used to tie the config to an application ? should we be
+          using a relationship here instead?
+        required: true
+      application_version:
+        type: string
+        required: true
+      application_provider:
+        type: string
+        required: false
+      data_types:
+        type: object
+        required: false
+      schema:
+        type: object
+        required: false
+    version: 0.0.1
+    derived_from: tosca.nodes.Root
+  org.onap.APP:
+    properties:
+      application_name:
+        type: string
+        description: Human readable name for the application Product
+        required: false
+      provider:
+        type: string
+        description: Provider of the application and of the descriptor
+        required: true
+      application_version:
+        type: string
+        description: Software version of the application
+        required: true
+      blueprint_id:
+        type: string
+        description: A reference to the app blueprint
+        required: false
+      monitoring_policy:
+        type: string
+        description: A reference to the monitoring policy
+        required: false
+    requirements:
+    - receive:
+        capability: org.onap.EventProducer
+        relationship: org.onap.PropagateEvent
+        occurrences:
+        - 0.0
+        - UNBOUNDED
+        version: 0.0.0
+    - send:
+        capability: org.onap.EventConsumer
+        relationship: org.onap.PropagateEvent
+        occurrences:
+        - 0.0
+        - UNBOUNDED
+        version: 0.0.0
+    version: 0.0.1
+    derived_from: tosca.nodes.Root
+  org.onap.EventRelay:
+    properties:
+      event_format:
+        type: string
+        description: 'examples for event_format: Ves_specification, etc.'
+        required: true
+      event_format_version:
+        type: string
+        description: 'examples for event_format_version: 5.28.4, 7.30.1, etc.'
+        required: true
+      config_keys:
+        type: list
+        required: false
+        entry_schema:
+          type: string
+          constraints:
+          - valid_values:
+            - all valid values should be added here
+            - if not specified, events of any config key is relayed
+            - 'examples for config_key: ves-measurement, ves-syslog, tca_handle_out,
+              etc.'
+      supported_carrier_protocols:
+        type: map
+        description: 'A map describing supported carrier protocols and translations.
+          The tuples define what protocol combinations are supported on the producer
+          and consumer side: e.g. { REST: REST, DMAAP: REST, DMAAP: DMAAP}'
+        required: true
+        key_schema:
+          type: string
+          constraints:
+          - valid_values:
+            - DMAAP_message_router
+            - SOMETHING_ELSE
+            - REST
+            - all valid values should be added here
+        entry_schema:
+          type: string
+          constraints:
+          - valid_values:
+            - DMAAP_message_router
+            - SOMETHING_ELSE
+            - REST
+            - all valid values should be added here
+      supported_data_formats:
+        type: map
+        description: 'Is a map describing supported data formats and translation.
+          The tuples define what protocol combinations are supported on the producer
+          and consumer side: e.g. { JSON: JSON, JMS: JSON, YAML:YAML }'
+        required: true
+        key_schema:
+          type: string
+          constraints:
+          - valid_values:
+            - JSON
+            - JMS
+            - YAML
+            - etc
+            - all valid values should be added here
+        entry_schema:
+          type: string
+          constraints:
+          - valid_values:
+            - JSON
+            - JMS
+            - YAML
+            - etc
+            - all valid values should be added here
+    requirements:
+    - receive:
+        capability: org.onap.EventProducer
+        relationship: org.onap.PropagateEvent
+        occurrences:
+        - 0.0
+        - UNBOUNDED
+        version: 0.0.0
+    - send:
+        capability: org.onap.EventConsumer
+        relationship: org.onap.PropagateEvent
+        occurrences:
+        - 0.0
+        - UNBOUNDED
+        version: 0.0.0
+    version: 0.0.1
+    derived_from: tosca.nodes.Root
+relationship_types:
+  org.onap.PropagateEvent:
+    properties:
+      config_keys:
+        type: list
+        description: The relationship type used on requirements to org.onap.EventProducer
+          and org.onap.EventConsumer capabilities. Filters events by specific config_keys
+          to be transferred by this relationship. That is, any event with a specific
+          config_key found in the list is transferred. If list is not defined or is
+          empty, events with all config_keys are transferred.
+        required: false
+        entry_schema:
+          type: string
+    version: 0.0.1
+    derived_from: tosca.relationships.Root
+topology_template:
+  inputs:
+    pm_subscription_topic:
+      type: string
+    pm_subscription_response_topic:
+      type: string
+    pm_subscription_handler_blueprint_id:
+      type: string
+    pm_subscription_operational_policy_id:
+      type: string
+    pm_subscription_cds_blueprint_id:
+      type: string
+    enable_tls:
+      type: string
+  node_templates:
+    org.onap.PM_Subscription_Handler:
+      type: org.onap.APP
+      properties:
+        application_name: PM Subscription Handler
+        provider: Ericsson
+        application_version: 1.0.0
+        artifact_id:
+          get_input: pm_subscription_handler_blueprint_id
+          description: Is this a reference to the DCAE Cloudify Blueprint that is
+            already stored(or will be stored before CL configuration & instatiation)
+            in DCAE Inventory?
+        artifact_config:
+          enable_tls:
+            get_input: enable_tls
+          pmsh_publish_topic_name:
+            get_input: pm_subscription_topic
+      capabilities:
+        pm-subscription-event-publisher:
+          properties:
+            carrier_protocol_type: DMAAP_message_router
+            data_format: JSON
+            event_format: pm-subscription-event-format
+            event_format_version: 1.0.0
+          attributes:
+            type: org.onap.EventProducer
+          occurrences:
+          - 0.0
+          - UNBOUNDED
+          version: 0.0.0
+        pm-subscription-event-receiver:
+          properties:
+            carrier_protocol_type: DMAAP_message_router
+            data_format: JSON
+            event_format: pm-subscription-event-response-format
+            event_format_version: 1.0.0
+            relationships:
+            - type: tosca.relationships.DependsOn
+            - description: any ideas on a better realtionship ? or is it better to
+                just use the root realtionship ?
+            - target: org.onap.PM_Monitoring_Policy
+          attributes:
+            type: org.onap.EventConsumer
+          occurrences:
+          - 0.0
+          - UNBOUNDED
+          version: 0.0.0
+      version: 0.0.0
+    org.onap.PM_Monitoring_Policy:
+      type: org.onap.DynamicConfig
+      properties:
+        application_name: PM Subscription Handler
+        application_version: 1.0.0
+        provider: Ericsson
+        data_types:
+          measurementType:
+            type: string
+          DN:
+            type: string
+          nfFilter:
+            properties:
+              nfNames:
+                type: list
+                entry_schema: string
+              modelInvariantIDs:
+                type: list
+                entry_schema:
+                  type: string
+              modelVersionIDs:
+                type: list
+                entry_schema:
+                  type: string
+          measurementGroup:
+            properties:
+              masurementTypes:
+                type: list
+                entry_schema:
+                  type: measurementType
+              managedObjectDNsBasic:
+                type: list
+                entry_schema:
+                  type: DN
+        schema:
+          subscription:
+            subscriptionName:
+              type: string
+              required: true
+            administrativeState:
+              type: string
+              required: true
+            filebasedGP:
+              type: integer
+              required: true
+            fileLocation:
+              type: string
+              required: true
+            nfFilter:
+              type: nfFilter
+            measurementGroups:
+              type: list
+              entry_schema:
+                type: measurementGroup
+      version: 0.0.0
+      description: Should I be showing a dependency between PM Subscription Handler
+        and the PM Monitoring Policy
+    org.onap.PM_Policy:
+      type: org.onap.APP
+      properties:
+        application_name: PM Subscription Operational Policy
+        provider: Ericsson
+        application_version: 1.0.0
+        artifact_id:
+          get_input: pm_subscription_operational_policy_id
+        artifact_config: NOT_DEFINED
+      requirements:
+      - receive_0:
+          capability: pm-subscription-event-publisher
+          node: org.onap.PM_Subscription_Handler
+          relationship: NOT_DEFINED
+          properties:
+            config_keys:
+            - topic_name:
+                get_input: pm_subscription_topic
+          version: 0.0.0
+      - send_0:
+          capability: cds-rest-receive
+          node: org.onap.CDS
+          version: 0.0.0
+      - receive_1:
+          capability: cds-rest-response
+          node: org.onap.CDS
+          version: 0.0.0
+      - send_1:
+          capability: pm-subscription-event-receiver
+          node: org.onap.PM_Subscription_Handler
+          relationship: NOT_DEFINED
+          properties:
+            config_keys:
+            - topic_name:
+                get_input: pm_subscription_response_topic
+          version: 0.0.0
+      capabilities:
+        pm-subscription-response-event-publisher:
+          properties:
+            type: org.onap.EventProducer
+            carrier_protocol_type: DMAAP_message_router
+            data_format: JSON
+            event_format: pm-subscription-event-response-format
+            event_format_version: 1.0.0
+          occurrences:
+          - 0.0
+          - UNBOUNDED
+          version: 0.0.0
+      version: 0.0.0
+    org.onap.PM_CDS_Blueprint:
+      type: org.onap.APP
+      properties:
+        application_name: PM Subscription CDS Blueprint
+        provider: Ericsson
+        application_version: 1.0.0
+        artifact_id:
+          get_input: pm_subscription_cds_blueprint_id
+      capabilities:
+        cds-rest-receive:
+          properties:
+            type: org.onap.EventConsumer
+            protocol_type: REST
+            data_format: JSON
+            event_format: cds_action_format
+            event_format_version: 1.0.0
+            responding_capability: cds-rest-response
+          occurrences:
+          - 0.0
+          - UNBOUNDED
+          version: 0.0.0
+        cds-rest-response:
+          properties:
+            type: org.onap.EventProducer
+            protocol_type: REST
+            data_format: JSON
+            event_format: cds_action_response_format
+            event_format_version: 1.0.0
+          occurrences:
+          - 0.0
+          version: 0.0.0
+      version: 1.0.0
+    org.onap.controlloop0:
+      type: org.onap.APP
+      properties:
+        application_name: Test Control Loop
+        provider: Ericsson
+        application_version: 1.0.0
+        status: NOT_DEPLOYED
+      version: 0.0.0
+version: 0.0.0
diff --git a/participant/participant-impl/pom.xml b/participant/participant-impl/pom.xml
index 6c67bfa..8afd810 100644
--- a/participant/participant-impl/pom.xml
+++ b/participant/participant-impl/pom.xml
@@ -40,4 +40,12 @@
         <module>participant-impl-cds</module>
         <module>participant-impl-kubernetes</module>
     </modules>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.onap.policy.clamp.participant</groupId>
+            <artifactId>policy-clamp-participant-intermediary</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+    </dependencies>
 </project>
diff --git a/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/api/ControlLoopElementListener.java b/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/api/ControlLoopElementListener.java
new file mode 100644
index 0000000..9e5d2c6
--- /dev/null
+++ b/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/api/ControlLoopElementListener.java
@@ -0,0 +1,62 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.intermediary.api;
+
+import java.util.UUID;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopElement;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopOrderedState;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopState;
+import org.onap.policy.models.base.PfModelException;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
+
+/**
+ * This interface is implemented by participant implementations to receive updates on control loop elements.
+ */
+public interface ControlLoopElementListener {
+    /**
+     * Handle a control loop element state change.
+     *
+     * @param controlLoopElementId the ID of the control loop element
+     * @param currentState the current state of the control loop element
+     * @param newState the state to which the control loop element is changing to
+     * @throws PfModelException in case of a model exception
+     */
+    public void controlLoopElementStateChange(UUID controlLoopElementId, ControlLoopState currentState,
+            ControlLoopOrderedState newState) throws PfModelException;
+
+    /**
+     * Handle an update on a control loop element.
+     *
+     * @param element the information on the control loop element
+     * @param controlLoopDefinition toscaServiceTemplate
+     * @throws PfModelException from Policy framework
+     */
+    public void controlLoopElementUpdate(ControlLoopElement element,
+            ToscaServiceTemplate controlLoopDefinition) throws PfModelException;
+
+    /**
+     * Handle controlLoopElement statistics.
+     *
+     * @param controlLoopElementId controlLoopElement id
+     * @throws PfModelException in case of a model exception
+     */
+    public void handleStatistics(UUID controlLoopElementId) throws PfModelException;
+}
diff --git a/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/api/ParticipantIntermediaryApi.java b/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/api/ParticipantIntermediaryApi.java
new file mode 100644
index 0000000..d31ae10
--- /dev/null
+++ b/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/api/ParticipantIntermediaryApi.java
@@ -0,0 +1,139 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.intermediary.api;
+
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ClElementStatistics;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoop;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopElement;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopOrderedState;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopState;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoops;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.Participant;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantState;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantStatistics;
+import org.onap.policy.clamp.controlloop.participant.intermediary.handler.ParticipantHandler;
+import org.onap.policy.clamp.controlloop.participant.intermediary.parameters.ParticipantIntermediaryParameters;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+/**
+ * This interface is used by participant implementations to use the participant intermediary.
+ */
+public interface ParticipantIntermediaryApi {
+    /**
+     * Initialise the participant intermediary.
+     *
+     * @param parameters the parameters for the intermediary
+     */
+    void init(ParticipantIntermediaryParameters parameters);
+
+    /**
+     * Close the intermediary.
+     */
+    void close();
+
+    /**
+     * Register a listener for control loop elements that are mediated by the intermediary.
+     *
+     * @param controlLoopElementListener The control loop element listener to register
+     */
+    void registerControlLoopElementListener(ControlLoopElementListener controlLoopElementListener);
+
+    /**
+     * Get participants loops from the intermediary API.
+     *
+     * @param name the participant name, null for all
+     * @param version the participant version, null for all
+     * @return the participants
+     */
+    List<Participant> getParticipants(String name, String version);
+
+    /**
+     * Update the state of a participant.
+     *
+     * @param definition the definition of the participant to update the state on
+     * @param state the state of the participant
+     * @return the participant
+     */
+    Participant updateParticipantState(ToscaConceptIdentifier definition, ParticipantState state);
+
+    /**
+     * Update the statistics of a participant.
+     *
+     * @param participantStatistics the statistics of the participant
+     */
+    void updateParticipantStatistics(ParticipantStatistics participantStatistics);
+
+    /**
+     * Get control loops from the intermediary API.
+     *
+     * @param name the control loop element name, null for all
+     * @param version the control loop element version, null for all
+     * @return the control loop elements
+     */
+    ControlLoops getControlLoops(String name, String version);
+
+    /**
+     * Get control loop elements from the intermediary API.
+     *
+     * @param name the control loop element name, null for all
+     * @param version the control loop element version, null for all
+     * @return the control loop elements
+     */
+    Map<UUID, ControlLoopElement> getControlLoopElements(String name, String version);
+
+    /**
+     * Get control loop element from the intermediary API.
+     *
+     * @param id control loop element ID
+     * @return the control loop element
+     */
+    ControlLoopElement getControlLoopElement(UUID id);
+
+    /**
+     * Update the state of a control loop element.
+     *
+     * @param id the ID of the control loop element to update the state on
+     * @param currentState the state of the control loop element
+     * @param newState the state of the control loop element
+     * @return ControlLoopElement updated control loop element
+     */
+    ControlLoopElement updateControlLoopElementState(UUID id, ControlLoopOrderedState currentState,
+            ControlLoopState newState);
+
+    /**
+     * Update the control loop element statistics.
+     *
+     * @param id the ID of the control loop element to update the state on
+     * @param elementStatistics the updated statistics
+     */
+    void updateControlLoopElementStatistics(UUID id, ClElementStatistics elementStatistics);
+
+    /**
+     * Return participantHandler, This will not be used in real world, but for junits,
+     * if participantHandler is not returned, there is no way to test state change messages
+     * without dmaap simulator.
+     *
+     */
+    ParticipantHandler getParticipantHandler();
+}
diff --git a/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/api/ParticipantIntermediaryFactory.java b/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/api/ParticipantIntermediaryFactory.java
new file mode 100644
index 0000000..d7cc4b2
--- /dev/null
+++ b/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/api/ParticipantIntermediaryFactory.java
@@ -0,0 +1,38 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.intermediary.api;
+
+import org.onap.policy.clamp.controlloop.participant.intermediary.api.impl.ParticipantIntermediaryApiImpl;
+
+/**
+ * Factory class for creating {@link ParticipantIntermediaryApi} instances.
+ */
+public class ParticipantIntermediaryFactory {
+
+    /**
+     * Create an implementation of the {@link ParticipantIntermediaryApi} interface.
+     *
+     * @return the implementation of the API
+     */
+    public ParticipantIntermediaryApi createApiImplementation() {
+        return new ParticipantIntermediaryApiImpl();
+    }
+}
diff --git a/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/api/impl/ParticipantIntermediaryApiImpl.java b/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/api/impl/ParticipantIntermediaryApiImpl.java
new file mode 100644
index 0000000..839088d
--- /dev/null
+++ b/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/api/impl/ParticipantIntermediaryApiImpl.java
@@ -0,0 +1,133 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.intermediary.api.impl;
+
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ClElementStatistics;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoop;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopElement;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopOrderedState;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopState;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoops;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.Participant;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantState;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantStatistics;
+import org.onap.policy.clamp.controlloop.participant.intermediary.api.ControlLoopElementListener;
+import org.onap.policy.clamp.controlloop.participant.intermediary.api.ParticipantIntermediaryApi;
+import org.onap.policy.clamp.controlloop.participant.intermediary.handler.IntermediaryActivator;
+import org.onap.policy.clamp.controlloop.participant.intermediary.handler.ParticipantHandler;
+import org.onap.policy.clamp.controlloop.participant.intermediary.parameters.ParticipantIntermediaryParameters;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+/**
+ * This class is api implementation used by participant intermediary.
+ */
+public class ParticipantIntermediaryApiImpl implements ParticipantIntermediaryApi {
+
+    // The activator for the participant intermediary
+    private IntermediaryActivator activator;
+
+    @Override
+    public void init(ParticipantIntermediaryParameters parameters) {
+        activator = new IntermediaryActivator(parameters);
+
+        activator.start();
+    }
+
+    @Override
+    public void close() {
+        activator.shutdown();
+    }
+
+    @Override
+    public void registerControlLoopElementListener(ControlLoopElementListener controlLoopElementListener) {
+        activator.getParticipantHandler().getControlLoopHandler()
+                .registerControlLoopElementListener(controlLoopElementListener);
+    }
+
+    @Override
+    public List<Participant> getParticipants(String name, String version) {
+        return List.of(activator.getParticipantHandler().getParticipant(name, version));
+    }
+
+    @Override
+    public Participant updateParticipantState(ToscaConceptIdentifier definition, ParticipantState state) {
+        return activator.getParticipantHandler().updateParticipantState(definition, state);
+    }
+
+    @Override
+    public void updateParticipantStatistics(ParticipantStatistics participantStatistics) {
+        // TODO Auto-generated method stub
+    }
+
+    @Override
+    public ControlLoops getControlLoops(String name, String version) {
+        return activator.getParticipantHandler().getControlLoopHandler().getControlLoops();
+    }
+
+    @Override
+    public Map<UUID, ControlLoopElement> getControlLoopElements(String name, String version) {
+        List<ControlLoop> controlLoops = activator.getParticipantHandler()
+                .getControlLoopHandler().getControlLoops().getControlLoopList();
+
+        for (ControlLoop controlLoop : controlLoops) {
+            if (name.equals(controlLoop.getDefinition().getName())) {
+                return controlLoop.getElements();
+            }
+        }
+        return new LinkedHashMap<>();
+    }
+
+    @Override
+    public ControlLoopElement getControlLoopElement(UUID id) {
+        List<ControlLoop> controlLoops = activator.getParticipantHandler()
+                .getControlLoopHandler().getControlLoops().getControlLoopList();
+
+        for (ControlLoop controlLoop : controlLoops) {
+            ControlLoopElement clElement = controlLoop.getElements().get(id);
+            if (clElement != null) {
+                return clElement;
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public ControlLoopElement updateControlLoopElementState(UUID id, ControlLoopOrderedState currentState,
+            ControlLoopState newState) {
+        return activator.getParticipantHandler().getControlLoopHandler()
+                .updateControlLoopElementState(id, currentState, newState);
+    }
+
+    @Override
+    public void updateControlLoopElementStatistics(UUID id, ClElementStatistics elementStatistics) {
+        activator.getParticipantHandler().getControlLoopHandler()
+        .updateControlLoopElementStatistics(id, elementStatistics);
+    }
+
+    @Override
+    public ParticipantHandler getParticipantHandler() {
+        return activator.getParticipantHandler();
+    }
+}
diff --git a/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/comm/ControlLoopStateChangeListener.java b/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/comm/ControlLoopStateChangeListener.java
new file mode 100644
index 0000000..50b8b9c
--- /dev/null
+++ b/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/comm/ControlLoopStateChangeListener.java
@@ -0,0 +1,68 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.intermediary.comm;
+
+import java.io.Closeable;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantControlLoopStateChange;
+import org.onap.policy.clamp.controlloop.participant.intermediary.handler.ParticipantHandler;
+import org.onap.policy.common.endpoints.event.comm.Topic.CommInfrastructure;
+import org.onap.policy.common.endpoints.listeners.ScoListener;
+import org.onap.policy.common.utils.coder.StandardCoderObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Listener for Participant State Change messages sent by CLAMP.
+ */
+public class ControlLoopStateChangeListener extends ScoListener<ParticipantControlLoopStateChange>
+        implements Closeable {
+    private static final Logger LOGGER = LoggerFactory.getLogger(ControlLoopStateChangeListener.class);
+
+    private final ParticipantHandler participantHandler;
+
+    /**
+     * Constructs the object.
+     *
+     * @param participantHandler the handler for managing the state of the participant
+     */
+    public ControlLoopStateChangeListener(final ParticipantHandler participantHandler) {
+        super(ParticipantControlLoopStateChange.class);
+        this.participantHandler = participantHandler;
+    }
+
+    @Override
+    public void onTopicEvent(final CommInfrastructure infra, final String topic, final StandardCoderObject sco,
+            final ParticipantControlLoopStateChange controlLoopStateChangeMsg) {
+        LOGGER.debug("Control Loop State Change received from CLAMP - {}", controlLoopStateChangeMsg);
+
+        if (participantHandler.canHandle(controlLoopStateChangeMsg)) {
+            LOGGER.debug("Message for this participant");
+            participantHandler.getControlLoopHandler().handleControlLoopStateChange(controlLoopStateChangeMsg);
+        } else {
+            LOGGER.debug("Message not for this participant");
+        }
+    }
+
+    @Override
+    public void close() {
+        // No explicit action on this class
+    }
+}
diff --git a/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/comm/ControlLoopUpdateListener.java b/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/comm/ControlLoopUpdateListener.java
new file mode 100644
index 0000000..ab2437c
--- /dev/null
+++ b/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/comm/ControlLoopUpdateListener.java
@@ -0,0 +1,67 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.intermediary.comm;
+
+import java.io.Closeable;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantControlLoopUpdate;
+import org.onap.policy.clamp.controlloop.participant.intermediary.handler.ParticipantHandler;
+import org.onap.policy.common.endpoints.event.comm.Topic.CommInfrastructure;
+import org.onap.policy.common.endpoints.listeners.ScoListener;
+import org.onap.policy.common.utils.coder.StandardCoderObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Listener for Control Loop Update messages sent by CLAMP.
+ */
+public class ControlLoopUpdateListener extends ScoListener<ParticipantControlLoopUpdate> implements Closeable {
+    private static final Logger LOGGER = LoggerFactory.getLogger(ControlLoopUpdateListener.class);
+
+    private final ParticipantHandler participantHandler;
+
+    /**
+     * Constructs the object.
+     *
+     * @param participantHandler the handler for managing the state of the participant
+     */
+    public ControlLoopUpdateListener(final ParticipantHandler participantHandler) {
+        super(ParticipantControlLoopUpdate.class);
+        this.participantHandler = participantHandler;
+    }
+
+    @Override
+    public void onTopicEvent(final CommInfrastructure infra, final String topic, final StandardCoderObject sco,
+            final ParticipantControlLoopUpdate participantControlLoopUpdateMsg) {
+        LOGGER.debug("Control Loop update received from CLAMP - {}", participantControlLoopUpdateMsg);
+
+        if (participantHandler.canHandle(participantControlLoopUpdateMsg)) {
+            LOGGER.debug("Message for this participant");
+            participantHandler.getControlLoopHandler().handleControlLoopUpdate(participantControlLoopUpdateMsg);
+        } else {
+            LOGGER.debug("Message not for this participant");
+        }
+    }
+
+    @Override
+    public void close() {
+        // No explicit action on this class
+    }
+}
diff --git a/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/comm/MessageSender.java b/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/comm/MessageSender.java
new file mode 100644
index 0000000..3128f1e
--- /dev/null
+++ b/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/comm/MessageSender.java
@@ -0,0 +1,162 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.intermediary.comm;
+
+import java.io.Closeable;
+import java.time.Instant;
+import java.util.TimerTask;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoop;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopElement;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoops;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantStatistics;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantResponseDetails;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantResponseStatus;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantStatus;
+import org.onap.policy.clamp.controlloop.participant.intermediary.api.ControlLoopElementListener;
+import org.onap.policy.clamp.controlloop.participant.intermediary.comm.ParticipantStatusPublisher;
+import org.onap.policy.clamp.controlloop.participant.intermediary.handler.ParticipantHandler;
+import org.onap.policy.models.base.PfModelException;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * This class sends messages from participants to CLAMP.
+ */
+public class MessageSender extends TimerTask implements Closeable {
+    private static final Logger LOGGER = LoggerFactory.getLogger(MessageSender.class);
+
+    private final ParticipantHandler participantHandler;
+    private final ParticipantStatusPublisher publisher;
+    private ScheduledExecutorService timerPool;
+
+    /**
+     * Constructor, set the publisher.
+     *
+     * @param participantHandler the participant handler to use for gathering information
+     * @param publisher the publisher to use for sending messages
+     * @param interval time interval to send Participant Status periodic messages
+     */
+    public MessageSender(ParticipantHandler participantHandler, ParticipantStatusPublisher publisher,
+            long interval) {
+        this.participantHandler = participantHandler;
+        this.publisher = publisher;
+
+        // Kick off the timer
+        timerPool = makeTimerPool();
+        timerPool.scheduleAtFixedRate(this, 0, interval, TimeUnit.SECONDS);
+    }
+
+    @Override
+    public void run() {
+        LOGGER.debug("Sent heartbeat to CLAMP");
+
+        ParticipantResponseDetails response = new ParticipantResponseDetails();
+
+        response.setResponseTo(null);
+        response.setResponseStatus(ParticipantResponseStatus.PERIODIC);
+        response.setResponseMessage("Periodic response from participant");
+    }
+
+    @Override
+    public void close() {
+        timerPool.shutdown();
+    }
+
+    /**
+     * Send a response message for this participant.
+     *
+     * @param response the details to include in the response message
+     */
+    public void sendResponse(ParticipantResponseDetails response) {
+        sendResponse(null, response);
+    }
+
+    /**
+     * Dispatch a response message for this participant.
+     *
+     * @param controlLoopId the control loop to which this message is a response
+     * @param response the details to include in the response message
+     */
+    public void sendResponse(ToscaConceptIdentifier controlLoopId, ParticipantResponseDetails response) {
+        ParticipantStatus status = new ParticipantStatus();
+
+        // Participant related fields
+        status.setParticipantType(participantHandler.getParticipantType());
+        status.setParticipantId(participantHandler.getParticipantId());
+        status.setState(participantHandler.getState());
+        status.setHealthStatus(participantHandler.getHealthStatus());
+
+        // Control loop related fields
+        ControlLoops controlLoops = participantHandler.getControlLoopHandler().getControlLoops();
+        status.setControlLoopId(controlLoopId);
+        status.setControlLoops(controlLoops);
+        status.setResponse(response);
+
+        ParticipantStatistics participantStatistics = new ParticipantStatistics();
+        participantStatistics.setTimeStamp(Instant.now());
+        participantStatistics.setParticipantId(participantHandler.getParticipantId());
+        participantStatistics.setHealthStatus(participantHandler.getHealthStatus());
+        participantStatistics.setState(participantHandler.getState());
+        status.setParticipantStatistics(participantStatistics);
+
+        for (ControlLoopElementListener clElementListener :
+            participantHandler.getControlLoopHandler().getListeners()) {
+            updateClElementStatistics(controlLoops, clElementListener);
+        }
+
+        status.setControlLoops(controlLoops);
+
+        publisher.send(status);
+    }
+
+    /**
+     * Update ControlLoopElement statistics. The control loop elements listening will be 
+     * notified to retrieve statistics from respective controlloop elements, and controlloopelements
+     * data on the handler will be updated.
+     *
+     * @param controlLoops the control loops
+     * @param clElementListener control loop element listener
+     */
+    public void updateClElementStatistics(ControlLoops controlLoops, ControlLoopElementListener clElementListener) {
+        for (ControlLoop controlLoop : controlLoops.getControlLoopList()) {
+            for (ControlLoopElement element : controlLoop.getElements().values()) {
+                try {
+                    clElementListener.handleStatistics(element.getId());
+                } catch (PfModelException e) {
+                    LOGGER.debug("Getting statistics for Control loop element failed");
+                }
+            }
+        }
+    }
+
+    /**
+     * Makes a new timer pool.
+     *
+     * @return a new timer pool
+     */
+    protected ScheduledExecutorService makeTimerPool() {
+        return Executors.newScheduledThreadPool(1);
+    }
+}
diff --git a/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/comm/ParticipantHealthCheckListener.java b/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/comm/ParticipantHealthCheckListener.java
new file mode 100644
index 0000000..e0e6be3
--- /dev/null
+++ b/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/comm/ParticipantHealthCheckListener.java
@@ -0,0 +1,69 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.intermediary.comm;
+
+import java.io.Closeable;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantHealthCheck;
+import org.onap.policy.clamp.controlloop.participant.intermediary.handler.ParticipantHandler;
+import org.onap.policy.common.endpoints.event.comm.Topic.CommInfrastructure;
+import org.onap.policy.common.endpoints.listeners.ScoListener;
+import org.onap.policy.common.utils.coder.StandardCoderObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Listener for Participant health status messages sent by CLAMP.
+ */
+public class ParticipantHealthCheckListener extends ScoListener<ParticipantHealthCheck> implements Closeable {
+    private static final Logger LOGGER = LoggerFactory.getLogger(ParticipantHealthCheckListener.class);
+
+    private final ParticipantHandler participantHandler;
+
+    /**
+     * Constructs the object.
+     *
+     * @param participantHandler the handler for managing the state and health of the participant
+     */
+    public ParticipantHealthCheckListener(final ParticipantHandler participantHandler) {
+        super(ParticipantHealthCheck.class);
+        this.participantHandler = participantHandler;
+    }
+
+    @Override
+    public void onTopicEvent(final CommInfrastructure infra, final String topic, final StandardCoderObject sco,
+            final ParticipantHealthCheck participantHealthCheckMsg) {
+        LOGGER.debug("Participant Health Check message received from CLAMP - {}", participantHealthCheckMsg);
+
+
+        if (participantHandler.canHandle(participantHealthCheckMsg)) {
+            LOGGER.debug("Message for this participant");
+            participantHandler.handleParticipantHealthCheck(participantHealthCheckMsg);
+        } else {
+            LOGGER.debug("Message not for this participant");
+        }
+
+    }
+
+    @Override
+    public void close() {
+        // No explicit action on this class
+    }
+}
diff --git a/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/comm/ParticipantStateChangeListener.java b/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/comm/ParticipantStateChangeListener.java
new file mode 100644
index 0000000..c1a8b5b
--- /dev/null
+++ b/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/comm/ParticipantStateChangeListener.java
@@ -0,0 +1,68 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.intermediary.comm;
+
+import java.io.Closeable;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantStateChange;
+import org.onap.policy.clamp.controlloop.participant.intermediary.handler.ParticipantHandler;
+import org.onap.policy.common.endpoints.event.comm.Topic.CommInfrastructure;
+import org.onap.policy.common.endpoints.listeners.ScoListener;
+import org.onap.policy.common.utils.coder.StandardCoderObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Listener for Participant State Change messages sent by CLAMP.
+ *
+ */
+public class ParticipantStateChangeListener extends ScoListener<ParticipantStateChange> implements Closeable {
+    private static final Logger LOGGER = LoggerFactory.getLogger(ParticipantStateChangeListener.class);
+
+    private final ParticipantHandler participantHandler;
+
+    /**
+     * Constructs the object.
+     *
+     * @param participantHandler the handler for managing the state of the participant
+     */
+    public ParticipantStateChangeListener(final ParticipantHandler participantHandler) {
+        super(ParticipantStateChange.class);
+        this.participantHandler = participantHandler;
+    }
+
+    @Override
+    public void onTopicEvent(final CommInfrastructure infra, final String topic, final StandardCoderObject sco,
+            final ParticipantStateChange participantStateChangeMsg) {
+        LOGGER.debug("Participant State Change received from CLAMP - {}", participantStateChangeMsg);
+
+        if (participantHandler.canHandle(participantStateChangeMsg)) {
+            LOGGER.debug("Message for this participant");
+            participantHandler.handleParticipantStateChange(participantStateChangeMsg);
+        } else {
+            LOGGER.debug("Message not for this participant");
+        }
+    }
+
+    @Override
+    public void close() {
+        // No explicit action on this class
+    }
+}
diff --git a/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/comm/ParticipantStatusPublisher.java b/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/comm/ParticipantStatusPublisher.java
new file mode 100644
index 0000000..bc53b4e
--- /dev/null
+++ b/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/comm/ParticipantStatusPublisher.java
@@ -0,0 +1,63 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.intermediary.comm;
+
+import java.io.Closeable;
+import java.util.List;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantStatus;
+import org.onap.policy.common.endpoints.event.comm.TopicSink;
+import org.onap.policy.common.endpoints.event.comm.client.TopicSinkClient;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * This class is used to send Participant Status messages to clamp using TopicSinkClient.
+ *
+ */
+public class ParticipantStatusPublisher implements Closeable {
+    private static final Logger LOGGER = LoggerFactory.getLogger(ParticipantStatusPublisher.class);
+
+    private final TopicSinkClient topicSinkClient;
+
+    /**
+     * Constructor for instantiating ParticipantStatusPublisher.
+     *
+     * @param topicSinks the topic sinks
+     */
+    public ParticipantStatusPublisher(List<TopicSink> topicSinks) {
+        this.topicSinkClient = new TopicSinkClient(topicSinks.get(0));
+    }
+
+    /**
+     * Method to send Participant Status message to clamp on demand.
+     *
+     * @param participantStatus the Participant Status
+     */
+    public void send(final ParticipantStatus participantStatus) {
+        topicSinkClient.send(participantStatus);
+        LOGGER.debug("Sent Participant Status message to CLAMP - {}", participantStatus);
+    }
+
+    @Override
+    public void close() {
+        // No explicit action on this class
+    }
+}
diff --git a/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/handler/ControlLoopHandler.java b/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/handler/ControlLoopHandler.java
new file mode 100644
index 0000000..cc2a66b
--- /dev/null
+++ b/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/handler/ControlLoopHandler.java
@@ -0,0 +1,323 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.intermediary.handler;
+
+import java.io.Closeable;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import lombok.Getter;
+import org.apache.commons.collections4.CollectionUtils;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ClElementStatistics;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoop;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopElement;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopOrderedState;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopState;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoops;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantControlLoopStateChange;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantControlLoopUpdate;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantResponseDetails;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantResponseStatus;
+import org.onap.policy.clamp.controlloop.participant.intermediary.api.ControlLoopElementListener;
+import org.onap.policy.clamp.controlloop.participant.intermediary.comm.MessageSender;
+import org.onap.policy.clamp.controlloop.participant.intermediary.parameters.ParticipantIntermediaryParameters;
+import org.onap.policy.models.base.PfModelException;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/*
+ * This class is responsible for managing the state of all control loops in the participant.
+ */
+public class ControlLoopHandler implements Closeable {
+    private static final Logger LOGGER = LoggerFactory.getLogger(ControlLoopHandler.class);
+
+    private ToscaConceptIdentifier participantType = null;
+    private ToscaConceptIdentifier participantId = null;
+    private MessageSender messageSender = null;
+
+    private final Map<ToscaConceptIdentifier, ControlLoop> controlLoopMap = new LinkedHashMap<>();
+
+    private final Map<UUID, ControlLoopElement> elementsOnThisParticipant = new LinkedHashMap<>();
+
+    @Getter
+    private List<ControlLoopElementListener> listeners = new ArrayList<>();
+
+    public ControlLoopHandler() {}
+
+    /**
+     * Constructor, set the participant ID and messageSender.
+     *
+     * @param parameters the parameters of the participant
+     * @param messageSender the messageSender for sending responses to messages
+     */
+    public ControlLoopHandler(ParticipantIntermediaryParameters parameters, MessageSender messageSender) {
+        this.participantType = parameters.getParticipantType();
+        this.participantId = parameters.getParticipantId();
+        this.messageSender = messageSender;
+    }
+
+    @Override
+    public void close() {
+        // No explicit action on this class
+    }
+
+    public void registerControlLoopElementListener(ControlLoopElementListener listener) {
+        listeners.add(listener);
+    }
+    
+    /**
+     * Handle a control loop element state change message.
+     *
+     * @param id controlloop element id
+     * @param orderedState the current state
+     * @param newState the ordered state
+     * @return controlLoopElement the updated controlloop element
+     */
+    public ControlLoopElement updateControlLoopElementState(UUID id, ControlLoopOrderedState orderedState,
+            ControlLoopState newState) {
+
+        if (id == null) {
+            return null;
+        }
+
+        ControlLoopElement clElement = elementsOnThisParticipant.get(id);
+        if (clElement != null) {
+            clElement.setOrderedState(orderedState);
+            clElement.setState(newState);
+            LOGGER.debug("Control loop element {} state changed to {}", id, newState);
+            ParticipantResponseDetails response = new ParticipantResponseDetails();
+            response.setResponseStatus(ParticipantResponseStatus.SUCCESS);
+            response.setResponseMessage("ControlLoopElement state changed to {} " + newState);
+            messageSender.sendResponse(response);
+            return clElement;
+        }
+
+        return null;
+    }
+
+    /**
+     * Handle a control loop element statistics.
+     *
+     * @param id controlloop element id
+     * @param elementStatistics control loop element Statistics
+     */
+    public void updateControlLoopElementStatistics(UUID id, ClElementStatistics elementStatistics) {
+        ControlLoopElement clElement = elementsOnThisParticipant.get(id);
+        if (clElement != null) {
+            elementStatistics.setParticipantId(participantId);
+            elementStatistics.setId(id);
+            clElement.setClElementStatistics(elementStatistics);
+        }
+    }
+
+    /**
+     * Handle a control loop state change message.
+     *
+     * @param stateChangeMsg the state change message
+     */
+    public void handleControlLoopStateChange(ParticipantControlLoopStateChange stateChangeMsg) {
+        if (stateChangeMsg.getControlLoopId() == null) {
+            return;
+        }
+
+        ControlLoop controlLoop = controlLoopMap.get(stateChangeMsg.getControlLoopId());
+
+        if (controlLoop == null) {
+            LOGGER.debug("Control loop {} does not use this participant", stateChangeMsg.getControlLoopId());
+            return;
+        }
+
+        ParticipantResponseDetails response = new ParticipantResponseDetails(stateChangeMsg);
+        handleState(controlLoop, response, stateChangeMsg.getOrderedState());
+        messageSender.sendResponse(response);
+    }
+
+    /**
+     * Method to handle state changes.
+     *
+     * @param controlLoop participant response
+     * @param response participant response
+     * @param orderedState controlloop ordered state
+     */
+    private void handleState(final ControlLoop controlLoop, final ParticipantResponseDetails response,
+            ControlLoopOrderedState orderedState) {
+        switch (orderedState) {
+            case UNINITIALISED:
+                handleUninitialisedState(controlLoop, orderedState, response);
+                break;
+            case PASSIVE:
+                handlePassiveState(controlLoop, orderedState, response);
+                break;
+            case RUNNING:
+                handleRunningState(controlLoop, orderedState, response);
+                break;
+            default:
+                LOGGER.debug("StateChange message has no state, state is null {}", controlLoop.getDefinition());
+                break;
+        }
+    }
+
+    /**
+     * Handle a control loop update message.
+     *
+     * @param updateMsg the update message
+     */
+    public void handleControlLoopUpdate(ParticipantControlLoopUpdate updateMsg) {
+
+        if (!updateMsg.appliesTo(participantType, participantId)) {
+            return;
+        }
+
+        ControlLoop controlLoop = controlLoopMap.get(updateMsg.getControlLoopId());
+
+        ParticipantResponseDetails response = new ParticipantResponseDetails(updateMsg);
+
+        // TODO: Updates to existing ControlLoops are not supported yet (Addition/Removal of ControlLoop
+        // elements to existing ControlLoop has to be supported).
+        if (controlLoop != null) {
+            response.setResponseStatus(ParticipantResponseStatus.FAIL);
+            response.setResponseMessage("Control loop " + updateMsg.getControlLoopId()
+                    + " already defined on participant " + participantId);
+
+            messageSender.sendResponse(response);
+            return;
+        }
+
+        controlLoop = updateMsg.getControlLoop();
+        controlLoop.getElements().values().removeIf(element -> !participantType.equals(element.getParticipantType()));
+
+        controlLoopMap.put(updateMsg.getControlLoopId(), controlLoop);
+        for (ControlLoopElement element : updateMsg.getControlLoop().getElements().values()) {
+            element.setState(element.getOrderedState().asState());
+            element.setParticipantId(participantId);
+            elementsOnThisParticipant.put(element.getId(), element);
+        }
+
+        for (ControlLoopElementListener clElementListener : listeners) {
+            try {
+                for (ControlLoopElement element : updateMsg.getControlLoop().getElements().values()) {
+                    clElementListener.controlLoopElementUpdate(element, updateMsg.getControlLoopDefinition());
+                }
+            } catch (PfModelException e) {
+                LOGGER.debug("Control loop element update failed {}", updateMsg.getControlLoopId());
+            }
+        }
+
+        response.setResponseStatus(ParticipantResponseStatus.SUCCESS);
+        response.setResponseMessage(
+                "Control loop " + updateMsg.getControlLoopId() + " defined on participant " + participantId);
+
+        messageSender.sendResponse(response);
+    }
+
+    /**
+     * Method to handle when the new state from participant is UNINITIALISED state.
+     *
+     * @param controlLoop participant response
+     * @param orderedState orderedState
+     * @param response participant response
+     */
+    private void handleUninitialisedState(final ControlLoop controlLoop, final ControlLoopOrderedState orderedState,
+            final ParticipantResponseDetails response) {
+        handleStateChange(controlLoop, orderedState, ControlLoopState.UNINITIALISED, response);
+        controlLoopMap.remove(controlLoop.getKey().asIdentifier());
+
+        for (ControlLoopElementListener clElementListener : listeners) {
+            try {
+                for (ControlLoopElement element : controlLoop.getElements().values()) {
+                    clElementListener.controlLoopElementStateChange(element.getId(), element.getState(),
+                            orderedState);
+                }
+            } catch (PfModelException e) {
+                LOGGER.debug("Control loop element update failed {}", controlLoop.getDefinition());
+            }
+        }
+    }
+
+    /**
+     * Method to handle when the new state from participant is PASSIVE state.
+     *
+     * @param controlLoop participant response
+     * @param orderedState orderedState
+     * @param response participant response
+     */
+    private void handlePassiveState(final ControlLoop controlLoop, final ControlLoopOrderedState orderedState,
+            final ParticipantResponseDetails response) {
+        handleStateChange(controlLoop, orderedState, ControlLoopState.PASSIVE, response);
+    }
+
+    /**
+     * Method to handle when the new state from participant is RUNNING state.
+     *
+     * @param controlLoop participant response
+     * @param orderedState orderedState
+     * @param response participant response
+     */
+    private void handleRunningState(final ControlLoop controlLoop, final ControlLoopOrderedState orderedState,
+            final ParticipantResponseDetails response) {
+        handleStateChange(controlLoop, orderedState, ControlLoopState.RUNNING, response);
+    }
+    
+    /**
+     * Method to update the state of control loop elements.
+     *
+     * @param controlLoop participant status in memory
+     * @param orderedState orderedState
+     * @param state new state of the control loop elements
+     */
+    private void handleStateChange(ControlLoop controlLoop, final ControlLoopOrderedState orderedState,
+            ControlLoopState newState, ParticipantResponseDetails response) {
+
+        if (orderedState.equals(controlLoop.getOrderedState())) {
+            response.setResponseStatus(ParticipantResponseStatus.SUCCESS);
+            response.setResponseMessage("Control loop is already in state " + orderedState);
+            return;
+        }
+
+        if (!CollectionUtils.isEmpty(controlLoop.getElements().values())) {
+            controlLoop.getElements().values().forEach(element -> {
+                    element.setState(newState);
+                    element.setOrderedState(orderedState);
+                }
+            );
+        }
+
+        response.setResponseStatus(ParticipantResponseStatus.SUCCESS);
+        response.setResponseMessage("ControlLoop state changed from " + controlLoop.getOrderedState()
+                        + " to " + orderedState);
+        controlLoop.setOrderedState(orderedState);
+    }
+
+
+    /**
+     * Get control loops as a {@link ConrolLoops} class.
+     *
+     * @return the control loops
+     */
+    public ControlLoops getControlLoops() {
+        ControlLoops controlLoops = new ControlLoops();
+        controlLoops.setControlLoopList(new ArrayList<>(controlLoopMap.values()));
+        return controlLoops;
+    }
+}
diff --git a/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/handler/IntermediaryActivator.java b/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/handler/IntermediaryActivator.java
new file mode 100644
index 0000000..be2fa1a
--- /dev/null
+++ b/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/handler/IntermediaryActivator.java
@@ -0,0 +1,165 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.intermediary.handler;
+
+import java.util.List;
+import java.util.concurrent.atomic.AtomicReference;
+import javax.ws.rs.core.Response.Status;
+import lombok.Getter;
+import lombok.experimental.Delegate;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopRuntimeException;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantControlLoopStateChange;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantControlLoopUpdate;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantHealthCheck;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantMessageType;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantStateChange;
+import org.onap.policy.clamp.controlloop.participant.intermediary.comm.ControlLoopStateChangeListener;
+import org.onap.policy.clamp.controlloop.participant.intermediary.comm.ControlLoopUpdateListener;
+import org.onap.policy.clamp.controlloop.participant.intermediary.comm.ParticipantHealthCheckListener;
+import org.onap.policy.clamp.controlloop.participant.intermediary.comm.ParticipantStateChangeListener;
+import org.onap.policy.clamp.controlloop.participant.intermediary.comm.ParticipantStatusPublisher;
+import org.onap.policy.clamp.controlloop.participant.intermediary.parameters.ParticipantIntermediaryParameters;
+import org.onap.policy.common.endpoints.event.comm.TopicEndpointManager;
+import org.onap.policy.common.endpoints.event.comm.TopicSink;
+import org.onap.policy.common.endpoints.event.comm.TopicSource;
+import org.onap.policy.common.endpoints.listeners.MessageTypeDispatcher;
+import org.onap.policy.common.endpoints.listeners.ScoListener;
+import org.onap.policy.common.utils.services.ServiceManagerContainer;
+
+/**
+ * This class activates the Participant Intermediary together with all its handlers.
+ */
+public class IntermediaryActivator extends ServiceManagerContainer {
+    // Name of the message type for messages on topics
+    private static final String[] MSG_TYPE_NAMES = {"messageType"};
+
+    @Getter
+    private final ParticipantIntermediaryParameters parameters;
+
+    // Topics from which the participant receives and to which the participant sends messages
+    private List<TopicSink> topicSinks;
+    private List<TopicSource> topicSources;
+
+    // The participant handler for this intermediary
+    final AtomicReference<ParticipantHandler> participantHandler = new AtomicReference<>();
+
+    /**
+     * Listens for messages on the topic, decodes them into a message, and then dispatches them.
+     */
+    private final MessageTypeDispatcher msgDispatcher;
+
+    /**
+     * Instantiate the activator for participant.
+     *
+     * @param parameters the parameters for the participant intermediary
+     */
+    public IntermediaryActivator(final ParticipantIntermediaryParameters parameters) {
+        this.parameters = parameters;
+
+        topicSinks =
+                TopicEndpointManager.getManager().addTopicSinks(parameters.getClampControlLoopTopics().getTopicSinks());
+
+        topicSources = TopicEndpointManager.getManager()
+                .addTopicSources(parameters.getClampControlLoopTopics().getTopicSources());
+
+        try {
+            this.msgDispatcher = new MessageTypeDispatcher(MSG_TYPE_NAMES);
+        } catch (final RuntimeException e) {
+            throw new ControlLoopRuntimeException(Status.INTERNAL_SERVER_ERROR,
+                    "topic message dispatcher failed to start", e);
+        }
+
+        // @formatter:off
+        final AtomicReference<ParticipantStatusPublisher>     statusPublisher                = new AtomicReference<>();
+        final AtomicReference<ParticipantStateChangeListener> participantStateChangeListener = new AtomicReference<>();
+        final AtomicReference<ParticipantHealthCheckListener> participantHealthCheckListener = new AtomicReference<>();
+        final AtomicReference<ControlLoopStateChangeListener> controlLoopStateChangeListener = new AtomicReference<>();
+        final AtomicReference<ControlLoopUpdateListener>      controlLoopUpdateListener      = new AtomicReference<>();
+
+        addAction("Topic endpoint management",
+            () -> TopicEndpointManager.getManager().start(),
+            () -> TopicEndpointManager.getManager().shutdown());
+
+        addAction("Participant Status Publisher",
+            () -> statusPublisher.set(new ParticipantStatusPublisher(topicSinks)),
+            () -> statusPublisher.get().close());
+
+        addAction("Participant Handler",
+            () -> participantHandler.set(new ParticipantHandler(parameters, statusPublisher.get())),
+            () -> participantHandler.get().close());
+
+        addAction("Participant State Change Listener",
+            () -> participantStateChangeListener.set(new ParticipantStateChangeListener(participantHandler.get())),
+            () -> participantStateChangeListener.get().close());
+
+        addAction("Participant Health Check Listener",
+            () -> participantHealthCheckListener.set(new ParticipantHealthCheckListener(participantHandler.get())),
+            () -> participantHealthCheckListener.get().close());
+
+        addAction("Control Loop State Change Listener",
+            () -> controlLoopStateChangeListener.set(new ControlLoopStateChangeListener(participantHandler.get())),
+            () -> controlLoopStateChangeListener.get().close());
+
+        addAction("Control Loop Update Listener",
+            () -> controlLoopUpdateListener.set(new ControlLoopUpdateListener(participantHandler.get())),
+            () -> controlLoopUpdateListener.get().close());
+
+        addAction("Topic Message Dispatcher", this::registerMsgDispatcher, this::unregisterMsgDispatcher);
+        // @formatter:on
+    }
+
+    /**
+     * Registers the dispatcher with the topic source(s).
+     */
+    private void registerMsgDispatcher() {
+        msgDispatcher.register(ParticipantMessageType.PARTICIPANT_STATE_CHANGE.name(),
+                (ScoListener<ParticipantStateChange>) new ParticipantStateChangeListener(
+                 participantHandler.get()));
+        msgDispatcher.register(ParticipantMessageType.PARTICIPANT_HEALTH_CHECK.name(),
+                (ScoListener<ParticipantHealthCheck>) new ParticipantHealthCheckListener(
+                 participantHandler.get()));
+        msgDispatcher.register(ParticipantMessageType.PARTICIPANT_CONTROL_LOOP_STATE_CHANGE.name(),
+                (ScoListener<ParticipantControlLoopStateChange>) new ControlLoopStateChangeListener(
+                 participantHandler.get()));
+        msgDispatcher.register(ParticipantMessageType.PARTICIPANT_CONTROL_LOOP_UPDATE.name(),
+                (ScoListener<ParticipantControlLoopUpdate>) new ControlLoopUpdateListener(
+                 participantHandler.get()));
+        for (final TopicSource source : topicSources) {
+            source.register(msgDispatcher);
+        }
+    }
+
+    /**
+     * Unregisters the dispatcher from the topic source(s).
+     */
+    private void unregisterMsgDispatcher() {
+        for (final TopicSource source : topicSources) {
+            source.unregister(msgDispatcher);
+        }
+    }
+
+    /**
+     * Return the participant handler.
+     */
+    public ParticipantHandler getParticipantHandler() {
+        return participantHandler.get();
+    }
+}
diff --git a/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/handler/ParticipantHandler.java b/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/handler/ParticipantHandler.java
new file mode 100644
index 0000000..980ab6e
--- /dev/null
+++ b/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/handler/ParticipantHandler.java
@@ -0,0 +1,235 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.intermediary.handler;
+
+import java.io.Closeable;
+import java.util.Objects;
+import lombok.Getter;
+import lombok.Setter;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.Participant;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantHealthStatus;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantState;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantStatistics;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantHealthCheck;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantMessage;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantResponseDetails;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantResponseStatus;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantStateChange;
+import org.onap.policy.clamp.controlloop.participant.intermediary.comm.MessageSender;
+import org.onap.policy.clamp.controlloop.participant.intermediary.comm.ParticipantStatusPublisher;
+import org.onap.policy.clamp.controlloop.participant.intermediary.parameters.ParticipantIntermediaryParameters;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * This class is responsible for managing the state of a participant.
+ */
+@Getter
+public class ParticipantHandler implements Closeable {
+    private static final Logger LOGGER = LoggerFactory.getLogger(ParticipantHandler.class);
+
+    private final ToscaConceptIdentifier participantType;
+    private final ToscaConceptIdentifier participantId;
+    private final MessageSender sender;
+    private final ControlLoopHandler controlLoopHandler;
+    private final ParticipantStatistics participantStatistics;
+
+    @Setter
+    private ParticipantState state = ParticipantState.UNKNOWN;
+
+    @Setter
+    private ParticipantHealthStatus healthStatus = ParticipantHealthStatus.UNKNOWN;
+
+    /**
+     * Constructor, set the participant ID and sender.
+     *
+     * @param parameters the parameters of the participant
+     * @param publisher the publisher for sending responses to messages
+     */
+    public ParticipantHandler(ParticipantIntermediaryParameters parameters, ParticipantStatusPublisher publisher) {
+        this.participantType = parameters.getParticipantType();
+        this.participantId = parameters.getParticipantId();
+        this.sender = new MessageSender(this, publisher, parameters.getReportingTimeInterval());
+        this.controlLoopHandler = new ControlLoopHandler(parameters, sender);
+        this.participantStatistics = new ParticipantStatistics();
+    }
+
+    @Override
+    public void close() {
+        sender.close();
+        controlLoopHandler.close();
+    }
+
+    /**
+     * Method which handles a participant state change event from clamp.
+     *
+     * @param stateChangeMsg participant state change message
+     */
+    public void handleParticipantStateChange(final ParticipantStateChange stateChangeMsg) {
+
+        if (!stateChangeMsg.appliesTo(participantType, participantId)) {
+            return;
+        }
+
+        ParticipantResponseDetails response = new ParticipantResponseDetails(stateChangeMsg);
+
+        switch (stateChangeMsg.getState()) {
+            case PASSIVE:
+                handlePassiveState(response);
+                break;
+            case ACTIVE:
+                handleActiveState(response);
+                break;
+            case SAFE:
+                handleSafeState(response);
+                break;
+            case TEST:
+                handleTestState(response);
+                break;
+            case TERMINATED:
+                handleTerminatedState(response);
+                break;
+            default:
+                LOGGER.debug("StateChange message has no state, state is null {}", stateChangeMsg.getParticipantId());
+                response.setResponseStatus(ParticipantResponseStatus.FAIL);
+                response.setResponseMessage("StateChange message has invalid state for participantId "
+                    + stateChangeMsg.getParticipantId());
+                break;
+        }
+
+        sender.sendResponse(response);
+    }
+
+
+    /**
+     * Method which handles a participant health check event from clamp.
+     *
+     * @param healthCheckMsg participant health check message
+     */
+    public void handleParticipantHealthCheck(final ParticipantHealthCheck healthCheckMsg) {
+        ParticipantResponseDetails response = new ParticipantResponseDetails(healthCheckMsg);
+        response.setResponseStatus(ParticipantResponseStatus.SUCCESS);
+        response.setResponseMessage(healthStatus.toString());
+
+        sender.sendResponse(response);
+    }
+
+    /**
+     * Method to handle when the new state from participant is active.
+     *
+     * @param response participant response
+     */
+    private void handleActiveState(final ParticipantResponseDetails response) {
+        handleStateChange(ParticipantState.ACTIVE, response);
+    }
+
+    /**
+     * Method to handle when the new state from participant is passive.
+     *
+     * @param response participant response
+     */
+    private void handlePassiveState(final ParticipantResponseDetails response) {
+        handleStateChange(ParticipantState.PASSIVE, response);
+    }
+
+    /**
+     * Method to handle when the new state from participant is safe.
+     *
+     * @param response participant response
+     */
+    private void handleSafeState(final ParticipantResponseDetails response) {
+        handleStateChange(ParticipantState.SAFE, response);
+    }
+
+    /**
+     * Method to handle when the new state from participant is TEST.
+     *
+     * @param response participant response
+     */
+    private void handleTestState(final ParticipantResponseDetails response) {
+        handleStateChange(ParticipantState.TEST, response);
+    }
+
+    /**
+     * Method to handle when the new state from participant is Terminated.
+     *
+     * @param response participant response
+     */
+    private void handleTerminatedState(final ParticipantResponseDetails response) {
+        handleStateChange(ParticipantState.TERMINATED, response);
+    }
+
+    private void handleStateChange(ParticipantState newParticipantState, ParticipantResponseDetails response) {
+        if (state.equals(newParticipantState)) {
+            response.setResponseStatus(ParticipantResponseStatus.SUCCESS);
+            response.setResponseMessage("Participant already in state " + newParticipantState);
+        } else {
+            response.setResponseStatus(ParticipantResponseStatus.SUCCESS);
+            response.setResponseMessage("Participant state changed from " + state + " to " + newParticipantState);
+            state = newParticipantState;
+        }
+    }
+
+    /**
+     * Method to update participant state.
+     *
+     * @param definition participant definition
+     * @param participantState participant state
+     */
+    public Participant updateParticipantState(ToscaConceptIdentifier definition,
+            ParticipantState participantState) {
+        if (!Objects.equals(definition, participantId)) {
+            LOGGER.debug("No participant with this ID {}", definition.getName());
+            return null;
+        }
+        ParticipantResponseDetails response = new ParticipantResponseDetails();
+        handleStateChange(participantState, response);
+        sender.sendResponse(response);
+        return getParticipant(definition.getName(), definition.getVersion());
+    }
+
+    /**
+     * Get participants as a {@link Participant} class.
+     *
+     * @return the participant
+     */
+    public Participant getParticipant(String name, String version) {
+        if (participantId.getName().equals(name)) {
+            Participant participant = new Participant();
+            participant.setDefinition(participantId);
+            participant.setParticipantState(state);
+            participant.setHealthStatus(healthStatus);
+            return participant;
+        }
+        return null;
+    }
+
+    /**
+     * Check if a participant message applies to this participant handler.
+     *
+     * @param partipantMsg the message to check
+     * @return true if it applies, false otherwise
+     */
+    public boolean canHandle(ParticipantMessage partipantMsg) {
+        return partipantMsg.appliesTo(participantType, participantId);
+    }
+}
diff --git a/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/parameters/ParticipantIntermediaryParameters.java b/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/parameters/ParticipantIntermediaryParameters.java
new file mode 100644
index 0000000..8e3440e
--- /dev/null
+++ b/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/parameters/ParticipantIntermediaryParameters.java
@@ -0,0 +1,58 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.participant.intermediary.parameters;
+
+import lombok.Getter;
+import org.onap.policy.common.endpoints.parameters.TopicParameterGroup;
+import org.onap.policy.common.parameters.ParameterGroupImpl;
+import org.onap.policy.common.parameters.annotations.NotBlank;
+import org.onap.policy.common.parameters.annotations.NotNull;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+/**
+ * Class to hold all parameters needed for participant component.
+ */
+@NotNull
+@NotBlank
+@Getter
+public class ParticipantIntermediaryParameters extends ParameterGroupImpl {
+    // The ID and description of this participant
+    private ToscaConceptIdentifier participantId;
+    private String description;
+
+    // The participant type of this participant
+    private ToscaConceptIdentifier participantType;
+
+    // The time interval for periodic reporting of status to the CLAMP control loop server
+    private long reportingTimeInterval;
+
+    // DMaaP topics for communicating with the CLAMP control loop server
+    private TopicParameterGroup clampControlLoopTopics;
+
+    /**
+     * Create the participant parameter group.
+     *
+     * @param instanceId instance id of the event.
+     */
+    public ParticipantIntermediaryParameters(final String instanceId) {
+        super(instanceId);
+    }
+}
diff --git a/participant/pom.xml b/participant/pom.xml
index c18ee14..b0ee3c0 100644
--- a/participant/pom.xml
+++ b/participant/pom.xml
@@ -39,4 +39,36 @@
         <module>participant-intermediary</module>
         <module>participant-impl</module>
     </modules>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.onap.policy.clamp</groupId>
+            <artifactId>policy-clamp-common</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onap.policy.clamp</groupId>
+            <artifactId>policy-clamp-models</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <artifactId>maven-assembly-plugin</artifactId>
+                <configuration>
+                    <archive>
+                        <manifest>
+                            <mainClass>org.onap.policy.clamp.controlloop.participant.simulator.main.startstop.Main</mainClass>
+                        </manifest>
+                    </archive>
+                    <descriptorRefs>
+                        <descriptorRef>jar-with-dependencies</descriptorRef>
+                    </descriptorRefs>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
 </project>
diff --git a/pom.xml b/pom.xml
index 6f86ff5..d9640b4 100644
--- a/pom.xml
+++ b/pom.xml
@@ -58,6 +58,7 @@
         <module>common</module>
         <module>models</module>
         <module>runtime</module>
+        <module>runtime-controlloop</module>
         <module>participant</module>
     </modules>
 
@@ -67,5 +68,74 @@
             <artifactId>junit</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>commons-cli</groupId>
+            <artifactId>commons-cli</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.onap.policy.common</groupId>
+            <artifactId>common-parameters</artifactId>
+            <version>${policy.common.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onap.policy.common</groupId>
+            <artifactId>utils</artifactId>
+            <version>${policy.common.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onap.policy.common</groupId>
+            <artifactId>policy-endpoints</artifactId>
+            <version>${policy.common.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onap.policy.common</groupId>
+            <artifactId>gson</artifactId>
+            <version>${policy.common.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onap.policy.models</groupId>
+            <artifactId>policy-models-provider</artifactId>
+            <version>${policy.models.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.onap.policy.common</groupId>
+            <artifactId>utils-test</artifactId>
+            <version>${policy.common.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.assertj</groupId>
+            <artifactId>assertj-core</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-core</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.powermock</groupId>
+            <artifactId>powermock-api-mockito2</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.powermock</groupId>
+            <artifactId>powermock-module-junit4</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.awaitility</groupId>
+            <artifactId>awaitility</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.h2database</groupId>
+            <artifactId>h2</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 </project>
diff --git a/runtime-controlloop/pom.xml b/runtime-controlloop/pom.xml
new file mode 100644
index 0000000..ab72deb
--- /dev/null
+++ b/runtime-controlloop/pom.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ============LICENSE_START=======================================================
+  Copyright (C) 2021 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=========================================================
+-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.onap.policy.clamp</groupId>
+        <artifactId>policy-clamp</artifactId>
+        <version>6.1.2-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>policy-clamp-runtime-controlloop</artifactId>
+    <name>${project.artifactId}</name>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.onap.policy.clamp</groupId>
+            <artifactId>policy-clamp-common</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onap.policy.clamp</groupId>
+            <artifactId>policy-clamp-models</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+    </dependencies>
+</project>
diff --git a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/commissioning/CommissioningHandler.java b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/commissioning/CommissioningHandler.java
new file mode 100644
index 0000000..88e8b1d
--- /dev/null
+++ b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/commissioning/CommissioningHandler.java
@@ -0,0 +1,81 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.runtime.commissioning;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Set;
+import javax.ws.rs.core.Response;
+import lombok.Getter;
+import org.onap.policy.clamp.controlloop.common.handler.ControlLoopHandler;
+import org.onap.policy.clamp.controlloop.runtime.commissioning.rest.CommissioningController;
+import org.onap.policy.clamp.controlloop.runtime.main.parameters.ClRuntimeParameterGroup;
+import org.onap.policy.common.endpoints.event.comm.TopicSink;
+import org.onap.policy.common.endpoints.listeners.MessageTypeDispatcher;
+import org.onap.policy.common.utils.services.Registry;
+import org.onap.policy.models.base.PfModelRuntimeException;
+
+/**
+ * This class handles commissioning of control loop definitions.
+ */
+public final class CommissioningHandler extends ControlLoopHandler {
+
+    @Getter
+    private CommissioningProvider provider;
+
+    /**
+     * Gets the CommissioningHandler.
+     *
+     * @return CommissioningHandler
+     */
+    public static CommissioningHandler getInstance() {
+        return Registry.get(CommissioningHandler.class.getName());
+    }
+
+    /**
+     * Create a handler.
+     *
+     * @param controlLoopParameters the parameters for access to the database
+     */
+    public CommissioningHandler(ClRuntimeParameterGroup controlLoopParameters) {
+        super(controlLoopParameters.getDatabaseProviderParameters());
+    }
+
+    @Override
+    public Set<Class<?>> getProviderClasses() {
+        return Set.of(CommissioningController.class);
+    }
+
+    @Override
+    public void startProviders() {
+        provider = new CommissioningProvider(getDatabaseProviderParameters());
+    }
+
+    @Override
+    public void stopProviders() {
+        try {
+            provider.close();
+        } catch (IOException e) {
+            throw new PfModelRuntimeException(Response.Status.INTERNAL_SERVER_ERROR,
+                    "an error has occured while stopping commissioning providers", e);
+        }
+    }
+}
diff --git a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/commissioning/CommissioningProvider.java b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/commissioning/CommissioningProvider.java
new file mode 100644
index 0000000..50f6787
--- /dev/null
+++ b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/commissioning/CommissioningProvider.java
@@ -0,0 +1,208 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.runtime.commissioning;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.collections4.MapUtils;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopRuntimeException;
+import org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider.ControlLoopProvider;
+import org.onap.policy.clamp.controlloop.models.messages.rest.commissioning.CommissioningResponse;
+import org.onap.policy.models.base.PfModelException;
+import org.onap.policy.models.base.PfModelRuntimeException;
+import org.onap.policy.models.provider.PolicyModelsProvider;
+import org.onap.policy.models.provider.PolicyModelsProviderFactory;
+import org.onap.policy.models.provider.PolicyModelsProviderParameters;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplates;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaTypedEntityFilter;
+
+/**
+ * This class provides the create, read and delete actions on Commissioning of Control Loop concepts in the database to
+ * the callers.
+ */
+public class CommissioningProvider implements Closeable {
+    public static final String CONTROL_LOOP_NODE_TYPE = "org.onap.policy.clamp.controlloop.ControlLoop";
+
+    private final PolicyModelsProvider modelsProvider;
+    private final ControlLoopProvider clProvider;
+
+    private static final Object lockit = new Object();
+
+    /**
+     * Create a commissioning provider.
+     *
+     * @throws ControlLoopRuntimeException on errors creating the provider
+     */
+    public CommissioningProvider(PolicyModelsProviderParameters databaseProviderParameters)
+            throws ControlLoopRuntimeException {
+        try {
+            modelsProvider = new PolicyModelsProviderFactory()
+                    .createPolicyModelsProvider(databaseProviderParameters);
+        } catch (PfModelException e) {
+            throw new PfModelRuntimeException(e);
+        }
+
+        try {
+            clProvider = new ControlLoopProvider(databaseProviderParameters);
+        } catch (PfModelException e) {
+            throw new PfModelRuntimeException(e);
+        }
+    }
+
+    @Override
+    public void close() throws IOException {
+        try {
+            modelsProvider.close();
+        } catch (PfModelException e) {
+            throw new IOException("error closing modelsProvider", e);
+        }
+    }
+
+    /**
+     * Create control loops from a service template.
+     *
+     * @param serviceTemplate the service template
+     * @return the result of the commissioning operation
+     * @throws PfModelException on creation errors
+     */
+    public CommissioningResponse createControlLoopDefinitions(ToscaServiceTemplate serviceTemplate)
+            throws PfModelException {
+        synchronized (lockit) {
+            modelsProvider.createServiceTemplate(serviceTemplate);
+        }
+
+        CommissioningResponse response = new CommissioningResponse();
+        // @formatter:off
+        response.setAffectedControlLoopDefinitions(serviceTemplate.getToscaTopologyTemplate().getNodeTemplates()
+                .values()
+                .stream()
+                .map(template -> template.getKey().asIdentifier())
+                .collect(Collectors.toList()));
+        // @formatter:on
+
+        return response;
+    }
+
+    /**
+     * Delete the control loop definition with the given name and version.
+     *
+     * @param name the name of the control loop definition to delete
+     * @param version the version of the control loop to delete
+     * @return the result of the deletion
+     * @throws PfModelException on deletion errors
+     */
+    public CommissioningResponse deleteControlLoopDefinition(String name, String version) throws PfModelException {
+        synchronized (lockit) {
+            modelsProvider.deleteServiceTemplate(name, version);
+        }
+
+        CommissioningResponse response = new CommissioningResponse();
+        response.setAffectedControlLoopDefinitions(
+                Collections.singletonList(new ToscaConceptIdentifier(name, version)));
+
+        return response;
+    }
+
+    /**
+     * Get control loop node templates.
+     *
+     * @param clName the name of the control loop, null for all
+     * @param clVersion the version of the control loop, null for all
+     * @return list of control loop node templates
+     * @throws PfModelException on errors getting control loop definitions
+     */
+    public List<ToscaNodeTemplate> getControlLoopDefinitions(String clName, String clVersion) throws PfModelException {
+
+        // @formatter:off
+        ToscaTypedEntityFilter<ToscaNodeTemplate> nodeTemplateFilter = ToscaTypedEntityFilter
+                .<ToscaNodeTemplate>builder()
+                .name(clName)
+                .version(clVersion)
+                .type(CONTROL_LOOP_NODE_TYPE)
+                .build();
+        // @formatter:on
+
+        return clProvider.getFilteredNodeTemplates(nodeTemplateFilter);
+    }
+
+    /**
+     * Get the control loop elements from a control loop node template.
+     *
+     * @param controlLoopNodeTemplate the control loop node template
+     * @return a list of the control loop element node templates in a control loop node template
+     * @throws PfModelException on errors get control loop element node templates
+     */
+    public List<ToscaNodeTemplate> getControlLoopElementDefinitions(ToscaNodeTemplate controlLoopNodeTemplate)
+            throws PfModelException {
+        if (!CONTROL_LOOP_NODE_TYPE.equals(controlLoopNodeTemplate.getType())) {
+            return Collections.emptyList();
+        }
+
+        if (MapUtils.isEmpty(controlLoopNodeTemplate.getProperties())) {
+            return Collections.emptyList();
+        }
+
+        @SuppressWarnings("unchecked")
+        List<Map<String, String>> controlLoopElements =
+                (List<Map<String, String>>) controlLoopNodeTemplate.getProperties().get("elements");
+
+        if (CollectionUtils.isEmpty(controlLoopElements)) {
+            return Collections.emptyList();
+        }
+
+        List<ToscaNodeTemplate> controlLoopElementList = new ArrayList<>();
+        // @formatter:off
+        controlLoopElementList.addAll(
+                controlLoopElements
+                        .stream()
+                        .map(elementMap -> clProvider.getNodeTemplates(elementMap.get("name"),
+                                elementMap.get("version")))
+                        .flatMap(List::stream)
+                        .collect(Collectors.toList())
+        );
+        // @formatter:on
+
+        return controlLoopElementList;
+    }
+
+    /**
+     * Get the requested control loop definitions.
+     *
+     * @param name the name of the definition to get, null for all definitions
+     * @param version the version of the definition to get, null for all definitions
+     * @return the control loop definitions
+     * @throws PfModelException on errors getting control loop definitions
+     */
+    public ToscaServiceTemplate getToscaServiceTemplate(String name, String version) throws PfModelException {
+        ToscaServiceTemplates serviceTemplates = new ToscaServiceTemplates();
+        serviceTemplates.setServiceTemplates(modelsProvider.getServiceTemplateList(name, version));
+        return serviceTemplates.getServiceTemplates().get(0);
+    }
+}
diff --git a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/commissioning/rest/CommissioningController.java b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/commissioning/rest/CommissioningController.java
new file mode 100644
index 0000000..18e1f77
--- /dev/null
+++ b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/commissioning/rest/CommissioningController.java
@@ -0,0 +1,360 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.runtime.commissioning.rest;
+
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import io.swagger.annotations.Authorization;
+import io.swagger.annotations.Extension;
+import io.swagger.annotations.ExtensionProperty;
+import io.swagger.annotations.ResponseHeader;
+import java.util.List;
+import java.util.UUID;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.HeaderParam;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+import org.onap.policy.clamp.controlloop.models.messages.rest.commissioning.CommissioningResponse;
+import org.onap.policy.clamp.controlloop.runtime.commissioning.CommissioningHandler;
+import org.onap.policy.clamp.controlloop.runtime.commissioning.CommissioningProvider;
+import org.onap.policy.clamp.controlloop.runtime.main.rest.RestController;
+import org.onap.policy.models.base.PfModelException;
+import org.onap.policy.models.base.PfModelRuntimeException;
+import org.onap.policy.models.errors.concepts.ErrorResponse;
+import org.onap.policy.models.errors.concepts.ErrorResponseInfo;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Class to provide REST end points for creating, deleting, querying commissioned control loops.
+ */
+public class CommissioningController extends RestController {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(CommissioningController.class);
+
+    private final CommissioningProvider provider;
+
+    /**
+     * create Commissioning Controller.
+     */
+    public CommissioningController() {
+        this.provider = CommissioningHandler.getInstance().getProvider();
+    }
+
+    /**
+     * Creates a control loop definition.
+     *
+     * @param requestId request ID used in ONAP logging
+     * @param body the body of control loop following TOSCA definition
+     * @return a response
+     */
+    // @formatter:off
+    @POST
+    @Path("/commission")
+    @ApiOperation(
+            value = "Commissions control loop definitions",
+            notes = "Commissions control loop definitions, returning the commissioned control loop definition IDs",
+            response = CommissioningResponse.class,
+            tags = {
+                    "Control Loop Commissioning API"
+            },
+            authorizations = @Authorization(value = AUTHORIZATION_TYPE),
+            responseHeaders = {
+                    @ResponseHeader(
+                            name = VERSION_MINOR_NAME,
+                            description = VERSION_MINOR_DESCRIPTION,
+                            response = String.class),
+                    @ResponseHeader(
+                            name = VERSION_PATCH_NAME,
+                            description = VERSION_PATCH_DESCRIPTION,
+                            response = String.class),
+                    @ResponseHeader(
+                            name = VERSION_LATEST_NAME,
+                            description = VERSION_LATEST_DESCRIPTION,
+                            response = String.class),
+                    @ResponseHeader(
+                            name = REQUEST_ID_NAME,
+                            description = REQUEST_ID_HDR_DESCRIPTION,
+                            response = UUID.class)
+            },
+            extensions = {
+                    @Extension(
+                            name = EXTENSION_NAME,
+                            properties = {
+                                    @ExtensionProperty(name = API_VERSION_NAME, value = API_VERSION),
+                                    @ExtensionProperty(name = LAST_MOD_NAME, value = LAST_MOD_RELEASE)
+                            }
+                    )
+            }
+    )
+    @ApiResponses(
+            value = {
+                    @ApiResponse(code = AUTHENTICATION_ERROR_CODE, message = AUTHENTICATION_ERROR_MESSAGE),
+                    @ApiResponse(code = AUTHORIZATION_ERROR_CODE, message = AUTHORIZATION_ERROR_MESSAGE),
+                    @ApiResponse(code = SERVER_ERROR_CODE, message = SERVER_ERROR_MESSAGE)
+            }
+    )
+    // @formatter:on
+    public Response create(
+            @HeaderParam(REQUEST_ID_NAME) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId,
+            @ApiParam(value = "Entity Body of Control Loop", required = true) ToscaServiceTemplate body) {
+
+        try {
+            CommissioningResponse response = provider.createControlLoopDefinitions(body);
+            return addLoggingHeaders(addVersionControlHeaders(Response.status(Status.OK)), requestId)
+                    .entity(response).build();
+
+        } catch (PfModelRuntimeException | PfModelException e) {
+            LOGGER.warn("Commissioning of the control loops failed", e);
+            CommissioningResponse resp = new CommissioningResponse();
+            resp.setErrorDetails(e.getErrorResponse().getErrorMessage());
+            return returnResponse(e.getErrorResponse().getResponseCode(), requestId, resp);
+        }
+
+    }
+
+    /**
+     * Deletes a control loop definition.
+     *
+     * @param requestId request ID used in ONAP logging
+     * @param name the name of the control loop definition to delete
+     * @param version the version of the control loop definition to delete
+     * @return a response
+     */
+    // @formatter:off
+    @DELETE
+    @Path("/commission")
+    @ApiOperation(value = "Delete a commissioned control loop",
+            notes = "Deletes a Commissioned Control Loop, returning optional error details",
+            response = CommissioningResponse.class,
+            tags = {
+                    "Clamp Control Loop Commissioning API"
+            },
+            authorizations = @Authorization(value = AUTHORIZATION_TYPE),
+            responseHeaders = {
+                    @ResponseHeader(
+                            name = VERSION_MINOR_NAME,
+                            description = VERSION_MINOR_DESCRIPTION,
+                            response = String.class),
+                    @ResponseHeader(
+                            name = VERSION_PATCH_NAME,
+                            description = VERSION_PATCH_DESCRIPTION,
+                            response = String.class),
+                    @ResponseHeader(
+                            name = VERSION_LATEST_NAME,
+                            description = VERSION_LATEST_DESCRIPTION,
+                            response = String.class),
+                    @ResponseHeader(
+                            name = REQUEST_ID_NAME,
+                            description = REQUEST_ID_HDR_DESCRIPTION,
+                            response = UUID.class)},
+            extensions = {
+                    @Extension(
+                            name = EXTENSION_NAME,
+                            properties = {
+                                    @ExtensionProperty(name = API_VERSION_NAME, value = API_VERSION),
+                                    @ExtensionProperty(name = LAST_MOD_NAME, value = LAST_MOD_RELEASE)
+                            }
+                    )
+            }
+    )
+    @ApiResponses(value = {
+            @ApiResponse(code = AUTHENTICATION_ERROR_CODE, message = AUTHENTICATION_ERROR_MESSAGE),
+            @ApiResponse(code = AUTHORIZATION_ERROR_CODE, message = AUTHORIZATION_ERROR_MESSAGE),
+            @ApiResponse(code = SERVER_ERROR_CODE, message = SERVER_ERROR_MESSAGE)
+        }
+    )
+    // @formatter:on
+    public Response delete(
+            @HeaderParam(REQUEST_ID_NAME) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId,
+            @ApiParam(value = "Control Loop definition name", required = true) @QueryParam("name") String name,
+            @ApiParam(value = "Control Loop definition version", required = true)
+            @QueryParam("version") String version) {
+
+        try {
+            CommissioningResponse response = provider.deleteControlLoopDefinition(name, version);
+            return addLoggingHeaders(addVersionControlHeaders(Response.status(Status.OK)), requestId)
+                    .entity(response).build();
+
+        } catch (PfModelRuntimeException | PfModelException e) {
+            LOGGER.warn("Decommisssioning of control loop failed", e);
+            CommissioningResponse resp = new CommissioningResponse();
+            resp.setErrorDetails(e.getErrorResponse().getErrorMessage());
+            return returnResponse(e.getErrorResponse().getResponseCode(), requestId, resp);
+        }
+
+    }
+
+    /**
+     * Queries details of all or specific control loop definitions.
+     *
+     * @param requestId request ID used in ONAP logging
+     * @param name the name of the control loop definition to get, null for all definitions
+     * @param version the version of the control loop definition to get, null for all definitions
+     * @return the control loop definitions
+     */
+    // @formatter:off
+    @GET
+    @Path("/commission")
+    @ApiOperation(value = "Query details of the requested commissioned control loop definitions",
+            notes = "Queries details of the requested commissioned control loop definitions, "
+                    + "returning all control loop details",
+            response = ToscaNodeTemplate.class,
+            tags = {
+                    "Clamp Control Loop Commissioning API"
+            },
+            authorizations = @Authorization(value = AUTHORIZATION_TYPE),
+            responseHeaders = {
+                    @ResponseHeader(
+                            name = VERSION_MINOR_NAME, description = VERSION_MINOR_DESCRIPTION,
+                            response = String.class),
+                    @ResponseHeader(name = VERSION_PATCH_NAME, description = VERSION_PATCH_DESCRIPTION,
+                            response = String.class),
+                    @ResponseHeader(name = VERSION_LATEST_NAME, description = VERSION_LATEST_DESCRIPTION,
+                            response = String.class),
+                    @ResponseHeader(name = REQUEST_ID_NAME, description = REQUEST_ID_HDR_DESCRIPTION,
+                            response = UUID.class)},
+            extensions = {
+                    @Extension(
+                            name = EXTENSION_NAME,
+                            properties = {
+                                    @ExtensionProperty(name = API_VERSION_NAME, value = API_VERSION),
+                                    @ExtensionProperty(name = LAST_MOD_NAME, value = LAST_MOD_RELEASE)
+                            }
+                    )
+            }
+    )
+    @ApiResponses(
+            value = {
+                    @ApiResponse(code = AUTHENTICATION_ERROR_CODE, message = AUTHENTICATION_ERROR_MESSAGE),
+                    @ApiResponse(code = AUTHORIZATION_ERROR_CODE, message = AUTHORIZATION_ERROR_MESSAGE),
+                    @ApiResponse(code = SERVER_ERROR_CODE, message = SERVER_ERROR_MESSAGE)
+            }
+    )
+    // @formatter:on
+    public Response query(@HeaderParam(REQUEST_ID_NAME) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId,
+                          @ApiParam(value = "Control Loop definition name", required = true)
+                          @QueryParam("name") String name,
+                          @ApiParam(value = "Control Loop definition version", required = true)
+                          @QueryParam("version") String version) {
+
+        try {
+            List<ToscaNodeTemplate> response = provider.getControlLoopDefinitions(name, version);
+            return addLoggingHeaders(addVersionControlHeaders(Response.status(Status.OK)), requestId).entity(response)
+                    .build();
+
+        } catch (PfModelRuntimeException | PfModelException e) {
+            LOGGER.warn("Get of control loop definitions failed", e);
+            CommissioningResponse resp = new CommissioningResponse();
+            resp.setErrorDetails(e.getErrorResponse().getErrorMessage());
+            return returnResponse(e.getErrorResponse().getResponseCode(), requestId, resp);
+        }
+
+    }
+
+    /**
+     * Queries the elements of a specific control loop.
+     *
+     * @param requestId request ID used in ONAP logging
+     * @param name the name of the control loop definition to get
+     * @param version the version of the control loop definition to get
+     * @return the control loop element definitions
+     */
+    // @formatter:off
+    @GET
+    @Path("/commission/elements")
+    @ApiOperation(value = "Query details of the requested commissioned control loop element definitions",
+            notes = "Queries details of the requested commissioned control loop element definitions, "
+                    + "returning all control loop elements' details",
+            response = ToscaNodeTemplate.class,
+            tags = {
+                    "Clamp Control Loop Commissioning API"
+            },
+            authorizations = @Authorization(value = AUTHORIZATION_TYPE),
+            responseHeaders = {
+                    @ResponseHeader(
+                            name = VERSION_MINOR_NAME, description = VERSION_MINOR_DESCRIPTION,
+                            response = String.class),
+                    @ResponseHeader(name = VERSION_PATCH_NAME, description = VERSION_PATCH_DESCRIPTION,
+                            response = String.class),
+                    @ResponseHeader(name = VERSION_LATEST_NAME, description = VERSION_LATEST_DESCRIPTION,
+                            response = String.class),
+                    @ResponseHeader(name = REQUEST_ID_NAME, description = REQUEST_ID_HDR_DESCRIPTION,
+                            response = UUID.class)},
+            extensions = {
+                    @Extension(
+                            name = EXTENSION_NAME,
+                            properties = {
+                                    @ExtensionProperty(name = API_VERSION_NAME, value = API_VERSION),
+                                    @ExtensionProperty(name = LAST_MOD_NAME, value = LAST_MOD_RELEASE)
+                            }
+                    )
+            }
+    )
+    @ApiResponses(
+            value = {
+                    @ApiResponse(code = AUTHENTICATION_ERROR_CODE, message = AUTHENTICATION_ERROR_MESSAGE),
+                    @ApiResponse(code = AUTHORIZATION_ERROR_CODE, message = AUTHORIZATION_ERROR_MESSAGE),
+                    @ApiResponse(code = SERVER_ERROR_CODE, message = SERVER_ERROR_MESSAGE)
+            }
+    )
+    // @formatter:on
+    public Response queryElements(@HeaderParam(REQUEST_ID_NAME) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId,
+                                  @ApiParam(value = "Control Loop definition name", required = true)
+                                  @QueryParam("name") String name,
+                                  @ApiParam(value = "Control Loop definition version", required = true)
+                                  @QueryParam("version") String version) throws Exception {
+
+        try {
+            List<ToscaNodeTemplate> nodeTemplate = provider.getControlLoopDefinitions(name, version);
+            //Prevent ambiguous queries with multiple returns
+            if (nodeTemplate.size() > 1) {
+                CommissioningResponse resp = new CommissioningResponse();
+                resp.setErrorDetails("Multiple ControlLoops are not supported");
+                return returnResponse(Response.Status.NOT_ACCEPTABLE, requestId, resp);
+            }
+
+            List<ToscaNodeTemplate> response = provider.getControlLoopElementDefinitions(nodeTemplate.get(0));
+            return addLoggingHeaders(addVersionControlHeaders(Response.status(Status.OK)), requestId).entity(response)
+                    .build();
+
+        } catch (PfModelRuntimeException | PfModelException e) {
+            LOGGER.warn("Get of control loop element definitions failed", e);
+            CommissioningResponse resp = new CommissioningResponse();
+            resp.setErrorDetails(e.getErrorResponse().getErrorMessage());
+            return returnResponse(e.getErrorResponse().getResponseCode(), requestId, resp);
+        }
+
+    }
+
+    private Response returnResponse(Response.Status status, UUID requestId, CommissioningResponse resp) {
+        return addLoggingHeaders(addVersionControlHeaders(Response.status(status)),
+                requestId).entity(resp).build();
+    }
+}
diff --git a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/instantiation/ControlLoopInstantiationProvider.java b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/instantiation/ControlLoopInstantiationProvider.java
new file mode 100644
index 0000000..eb72d92
--- /dev/null
+++ b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/instantiation/ControlLoopInstantiationProvider.java
@@ -0,0 +1,276 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.runtime.instantiation;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.function.UnaryOperator;
+import java.util.stream.Collectors;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopException;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoop;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopElement;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopState;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoops;
+import org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider.ControlLoopProvider;
+import org.onap.policy.clamp.controlloop.models.messages.rest.instantiation.InstantiationCommand;
+import org.onap.policy.clamp.controlloop.models.messages.rest.instantiation.InstantiationResponse;
+import org.onap.policy.clamp.controlloop.runtime.commissioning.CommissioningProvider;
+import org.onap.policy.clamp.controlloop.runtime.supervision.SupervisionHandler;
+import org.onap.policy.common.parameters.BeanValidationResult;
+import org.onap.policy.common.parameters.ObjectValidationResult;
+import org.onap.policy.common.parameters.ValidationResult;
+import org.onap.policy.common.parameters.ValidationStatus;
+import org.onap.policy.models.base.PfModelException;
+import org.onap.policy.models.base.PfModelRuntimeException;
+import org.onap.policy.models.provider.PolicyModelsProviderParameters;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate;
+
+/**
+ * This class is dedicated to the Instantiation of Commissioned control loop.
+ */
+public class ControlLoopInstantiationProvider implements Closeable {
+    private final ControlLoopProvider controlLoopProvider;
+    private final CommissioningProvider commissioningProvider;
+
+    private static final Object lockit = new Object();
+
+    /**
+     * Create a instantiation provider.
+     *
+     * @param databaseProviderParameters the parameters for database access
+     */
+    public ControlLoopInstantiationProvider(PolicyModelsProviderParameters databaseProviderParameters) {
+        try {
+            controlLoopProvider = new ControlLoopProvider(databaseProviderParameters);
+            commissioningProvider = new CommissioningProvider(databaseProviderParameters);
+        } catch (PfModelException e) {
+            throw new PfModelRuntimeException(e);
+        }
+    }
+
+    @Override
+    public void close() throws IOException {
+        controlLoopProvider.close();
+    }
+
+    /**
+     * Create control loops.
+     *
+     * @param controlLoops the control loop
+     * @return the result of the instantiation operation
+     * @throws PfModelException on creation errors
+     */
+    public InstantiationResponse createControlLoops(ControlLoops controlLoops) throws PfModelException {
+
+        synchronized (lockit) {
+            for (ControlLoop controlLoop : controlLoops.getControlLoopList()) {
+                ControlLoop checkControlLoop = controlLoopProvider.getControlLoop(controlLoop.getKey().asIdentifier());
+                if (checkControlLoop != null) {
+                    throw new PfModelException(Response.Status.BAD_REQUEST,
+                            controlLoop.getKey().asIdentifier() + " already defined");
+                }
+            }
+            BeanValidationResult validationResult = validateControlLoops(controlLoops);
+            if (!validationResult.isValid()) {
+                throw new PfModelException(Response.Status.BAD_REQUEST, validationResult.getResult());
+            }
+            controlLoopProvider.createControlLoops(controlLoops.getControlLoopList());
+        }
+
+        InstantiationResponse response = new InstantiationResponse();
+        response.setAffectedControlLoops(controlLoops.getControlLoopList().stream()
+                .map(cl -> cl.getKey().asIdentifier()).collect(Collectors.toList()));
+
+        return response;
+    }
+
+    /**
+     * Update control loops.
+     *
+     * @param controlLoops the control loop
+     * @return the result of the instantiation operation
+     * @throws PfModelException on update errors
+     */
+    public InstantiationResponse updateControlLoops(ControlLoops controlLoops) throws PfModelException {
+        synchronized (lockit) {
+            BeanValidationResult validationResult = validateControlLoops(controlLoops);
+            if (!validationResult.isValid()) {
+                throw new PfModelException(Response.Status.BAD_REQUEST, validationResult.getResult());
+            }
+            controlLoopProvider.updateControlLoops(controlLoops.getControlLoopList());
+        }
+
+        InstantiationResponse response = new InstantiationResponse();
+        response.setAffectedControlLoops(controlLoops.getControlLoopList().stream()
+                .map(cl -> cl.getKey().asIdentifier()).collect(Collectors.toList()));
+
+        return response;
+    }
+
+    /**
+     * Validate ControlLoops.
+     *
+     * @param controlLoops ControlLoops to validate
+     * @result the result of validation
+     * @throws PfModelException if controlLoops is not valid
+     */
+    private BeanValidationResult validateControlLoops(ControlLoops controlLoops) throws PfModelException {
+
+        BeanValidationResult result = new BeanValidationResult("ControlLoops", controlLoops);
+
+        for (ControlLoop controlLoop : controlLoops.getControlLoopList()) {
+            BeanValidationResult subResult = new BeanValidationResult(
+                    "entry " + controlLoop.getDefinition().getName(), controlLoop);
+
+            List<ToscaNodeTemplate> toscaNodeTemplates = commissioningProvider.getControlLoopDefinitions(
+                    controlLoop.getDefinition().getName(), controlLoop.getDefinition().getVersion());
+
+            if (toscaNodeTemplates.isEmpty()) {
+                subResult
+                        .addResult(new ObjectValidationResult("ControlLoop", controlLoop.getDefinition().getName(),
+                                ValidationStatus.INVALID, "Commissioned control loop definition not FOUND"));
+            } else if (toscaNodeTemplates.size() > 1) {
+                subResult
+                        .addResult(new ObjectValidationResult("ControlLoop", controlLoop.getDefinition().getName(),
+                                ValidationStatus.INVALID, "Commissioned control loop definition not VALID"));
+            } else {
+
+                List<ToscaNodeTemplate> clElementDefinitions =
+                        commissioningProvider.getControlLoopElementDefinitions(toscaNodeTemplates.get(0));
+
+                // @formatter:off
+                Map<String, ToscaConceptIdentifier> definitions = clElementDefinitions
+                        .stream()
+                        .map(nodeTemplate -> nodeTemplate.getKey().asIdentifier())
+                        .collect(Collectors.toMap(ToscaConceptIdentifier::getName, UnaryOperator.identity()));
+                // @formatter:on
+
+                for (ControlLoopElement element : controlLoop.getElements().values()) {
+                    subResult.addResult(validateDefinition(definitions, element.getDefinition()));
+                }
+            }
+            result.addResult(subResult);
+        }
+        return result;
+    }
+
+    /**
+     * Validate ToscaConceptIdentifier, checking if exist in ToscaConceptIdentifiers map.
+     *
+     * @param definitions map of all ToscaConceptIdentifiers
+     * @param definition ToscaConceptIdentifier to validate
+     * @result result the validation result
+     */
+    private ValidationResult validateDefinition(Map<String, ToscaConceptIdentifier> definitions,
+                                                ToscaConceptIdentifier definition) {
+        BeanValidationResult result = new BeanValidationResult("entry " + definition.getName(), definition);
+        ToscaConceptIdentifier identifier = definitions.get(definition.getName());
+        if (identifier == null) {
+            result.setResult(ValidationStatus.INVALID, "Not FOUND");
+        } else if (!identifier.equals(definition)) {
+            result.setResult(ValidationStatus.INVALID, "Version not matching");
+        }
+        return (result.isClean() ? null : result);
+    }
+
+    /**
+     * Delete the control loop with the given name and version.
+     *
+     * @param name the name of the control loop to delete
+     * @param version the version of the control loop to delete
+     * @return the result of the deletion
+     * @throws PfModelException on deletion errors
+     */
+    public InstantiationResponse deleteControlLoop(String name, String version) throws PfModelException {
+        InstantiationResponse response = new InstantiationResponse();
+        synchronized (lockit) {
+            List<ControlLoop> controlLoops = controlLoopProvider.getControlLoops(name, version);
+            if (controlLoops.isEmpty()) {
+                throw new PfModelException(Response.Status.NOT_FOUND, "Control Loop not found");
+            }
+            for (ControlLoop controlLoop : controlLoops) {
+                if (!ControlLoopState.UNINITIALISED.equals(controlLoop.getState())) {
+                    throw new PfModelException(Response.Status.BAD_REQUEST,
+                            "Control Loop State is still " + controlLoop.getState());
+                }
+            }
+
+            response.setAffectedControlLoops(Collections
+                    .singletonList(controlLoopProvider.deleteControlLoop(name, version).getKey().asIdentifier()));
+        }
+        return response;
+    }
+
+    /**
+     * Get the requested control loops.
+     *
+     * @param name the name of the control loop to get, null for all control loops
+     * @param version the version of the control loop to get, null for all control loops
+     * @return the control loops
+     * @throws PfModelException on errors getting control loops
+     */
+    public ControlLoops getControlLoops(String name, String version) throws PfModelException {
+        ControlLoops controlLoops = new ControlLoops();
+        controlLoops.setControlLoopList(controlLoopProvider.getControlLoops(name, version));
+
+        return controlLoops;
+    }
+
+    /**
+     * Issue a command to control loops, setting their ordered state.
+     *
+     * @param command the command to issue to control loops
+     * @return the result of the initiation command
+     * @throws PfModelException on errors setting the ordered state on the control loops
+     * @throws ControlLoopException on ordered state invalid
+     */
+    public InstantiationResponse issueControlLoopCommand(InstantiationCommand command)
+            throws ControlLoopException, PfModelException {
+
+        if (command.getOrderedState() == null) {
+            throw new ControlLoopException(Status.BAD_REQUEST, "ordered state invalid or not specified on command");
+        }
+
+        synchronized (lockit) {
+            List<ControlLoop> controlLoops = new ArrayList<>(command.getControlLoopIdentifierList().size());
+            for (ToscaConceptIdentifier id : command.getControlLoopIdentifierList()) {
+                ControlLoop controlLoop = controlLoopProvider.getControlLoop(id);
+                controlLoop.setCascadedOrderedState(command.getOrderedState());
+                controlLoops.add(controlLoop);
+            }
+            controlLoopProvider.updateControlLoops(controlLoops);
+        }
+
+        SupervisionHandler supervisionHandler = SupervisionHandler.getInstance();
+        supervisionHandler.triggerControlLoopSupervision(command.getControlLoopIdentifierList());
+        InstantiationResponse response = new InstantiationResponse();
+        response.setAffectedControlLoops(command.getControlLoopIdentifierList());
+
+        return response;
+    }
+}
diff --git a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/instantiation/InstantiationHandler.java b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/instantiation/InstantiationHandler.java
new file mode 100644
index 0000000..d81e54c
--- /dev/null
+++ b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/instantiation/InstantiationHandler.java
@@ -0,0 +1,82 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.runtime.instantiation;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Set;
+import javax.ws.rs.core.Response;
+import lombok.Getter;
+import org.onap.policy.clamp.controlloop.common.handler.ControlLoopHandler;
+import org.onap.policy.clamp.controlloop.runtime.instantiation.rest.InstantiationController;
+import org.onap.policy.clamp.controlloop.runtime.main.parameters.ClRuntimeParameterGroup;
+import org.onap.policy.common.endpoints.event.comm.TopicSink;
+import org.onap.policy.common.endpoints.listeners.MessageTypeDispatcher;
+import org.onap.policy.common.utils.services.Registry;
+import org.onap.policy.models.base.PfModelRuntimeException;
+
+/**
+ * This class handles instantiation of control loop instances.
+ *
+ * <p/>It is effectively a singleton that is started at system start
+ */
+public final class InstantiationHandler extends ControlLoopHandler {
+
+    @Getter
+    private ControlLoopInstantiationProvider controlLoopInstantiationProvider;
+
+    /**
+     * Gets the InstantiationHandler.
+     *
+     * @return InstantiationHandler
+     */
+    public static InstantiationHandler getInstance() {
+        return Registry.get(InstantiationHandler.class.getName());
+    }
+
+    /**
+     * Create a handler.
+     *
+     * @param controlLoopParameters the parameters for access to the database
+     */
+    public InstantiationHandler(ClRuntimeParameterGroup controlLoopParameters) {
+        super(controlLoopParameters.getDatabaseProviderParameters());
+    }
+
+    @Override
+    public Set<Class<?>> getProviderClasses() {
+        return Set.of(InstantiationController.class);
+    }
+
+    @Override
+    public void startProviders() {
+        controlLoopInstantiationProvider = new ControlLoopInstantiationProvider(getDatabaseProviderParameters());
+    }
+
+    @Override
+    public void stopProviders() {
+        try {
+            controlLoopInstantiationProvider.close();
+        } catch (IOException e) {
+            throw new PfModelRuntimeException(Response.Status.INTERNAL_SERVER_ERROR, e.getMessage());
+        }
+    }
+}
diff --git a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/instantiation/rest/InstantiationController.java b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/instantiation/rest/InstantiationController.java
new file mode 100644
index 0000000..7581aaf
--- /dev/null
+++ b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/instantiation/rest/InstantiationController.java
@@ -0,0 +1,416 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.runtime.instantiation.rest;
+
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import io.swagger.annotations.Authorization;
+import io.swagger.annotations.Extension;
+import io.swagger.annotations.ExtensionProperty;
+import io.swagger.annotations.ResponseHeader;
+import java.util.UUID;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.HeaderParam;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopException;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoops;
+import org.onap.policy.clamp.controlloop.models.messages.rest.instantiation.InstantiationCommand;
+import org.onap.policy.clamp.controlloop.models.messages.rest.instantiation.InstantiationResponse;
+import org.onap.policy.clamp.controlloop.runtime.instantiation.ControlLoopInstantiationProvider;
+import org.onap.policy.clamp.controlloop.runtime.instantiation.InstantiationHandler;
+import org.onap.policy.clamp.controlloop.runtime.main.rest.RestController;
+import org.onap.policy.models.base.PfModelException;
+import org.onap.policy.models.base.PfModelRuntimeException;
+import org.onap.policy.models.errors.concepts.ErrorResponseInfo;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Class to provide REST end points for creating, deleting, query and commanding a control loop definition.
+ */
+public class InstantiationController extends RestController {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(InstantiationController.class);
+
+    // The CL provider for instantiation requests
+    private final ControlLoopInstantiationProvider provider;
+
+    /**
+     * create Instantiation Controller.
+     */
+    public InstantiationController() {
+        this.provider = InstantiationHandler.getInstance().getControlLoopInstantiationProvider();
+    }
+
+    /**
+     * Creates a control loop.
+     *
+     * @param requestId request ID used in ONAP logging
+     * @param controlLoops the control loops
+     * @return a response
+     */
+    // @formatter:off
+    @POST
+    @Path("/instantiation")
+    @ApiOperation(
+            value = "Commissions control loop definitions",
+            notes = "Commissions control loop definitions, returning the control loop IDs",
+            response = InstantiationResponse.class,
+            tags = {
+                "Control Loop Instantiation API"
+                },
+            authorizations = @Authorization(value = AUTHORIZATION_TYPE),
+            responseHeaders = {
+                    @ResponseHeader(
+                            name = VERSION_MINOR_NAME,
+                            description = VERSION_MINOR_DESCRIPTION,
+                            response = String.class),
+                    @ResponseHeader(
+                            name = VERSION_PATCH_NAME,
+                            description = VERSION_PATCH_DESCRIPTION,
+                            response = String.class),
+                    @ResponseHeader(
+                            name = VERSION_LATEST_NAME,
+                            description = VERSION_LATEST_DESCRIPTION,
+                            response = String.class),
+                    @ResponseHeader(
+                            name = REQUEST_ID_NAME,
+                            description = REQUEST_ID_HDR_DESCRIPTION,
+                            response = UUID.class)
+                },
+            extensions = {
+                @Extension(
+                    name = EXTENSION_NAME,
+                    properties = {
+                            @ExtensionProperty(name = API_VERSION_NAME, value = API_VERSION),
+                            @ExtensionProperty(name = LAST_MOD_NAME, value = LAST_MOD_RELEASE)
+                    }
+                )
+            }
+        )
+    @ApiResponses(
+            value = {
+                @ApiResponse(code = AUTHENTICATION_ERROR_CODE, message = AUTHENTICATION_ERROR_MESSAGE),
+                @ApiResponse(code = AUTHORIZATION_ERROR_CODE, message = AUTHORIZATION_ERROR_MESSAGE),
+                @ApiResponse(code = SERVER_ERROR_CODE, message = SERVER_ERROR_MESSAGE)
+            }
+        )
+    // @formatter:on
+    public Response create(
+            @HeaderParam(REQUEST_ID_NAME) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId,
+            @ApiParam(value = "Entity Body of Control Loop", required = true) ControlLoops controlLoops) {
+
+        try {
+            InstantiationResponse response = provider.createControlLoops(controlLoops);
+            return addLoggingHeaders(addVersionControlHeaders(Response.status(Status.OK)), requestId).entity(response)
+                    .build();
+
+        } catch (PfModelRuntimeException | PfModelException e) {
+            LOGGER.warn("creation of control loop failed", e);
+            return createInstantiationErrorResponse(e, requestId);
+        }
+    }
+
+    /**
+     * Queries details of all control loops.
+     *
+     * @param requestId request ID used in ONAP logging
+     * @param name the name of the control loop to get, null for all control loops
+     * @param version the version of the control loop to get, null for all control loops
+     * @return the control loops
+     */
+    // @formatter:off
+    @GET
+    @Path("/instantiation")
+    @ApiOperation(value = "Query details of the requested control loops",
+            notes = "Queries details of the requested control loops, returning all control loop details",
+            response = ControlLoops.class,
+            tags = {
+                "Clamp control loop Instantiation API"
+            },
+            authorizations = @Authorization(value = AUTHORIZATION_TYPE),
+            responseHeaders = {
+                    @ResponseHeader(
+                            name = VERSION_MINOR_NAME, description = VERSION_MINOR_DESCRIPTION,
+                                    response = String.class),
+                    @ResponseHeader(name = VERSION_PATCH_NAME, description = VERSION_PATCH_DESCRIPTION,
+                                    response = String.class),
+                    @ResponseHeader(name = VERSION_LATEST_NAME, description = VERSION_LATEST_DESCRIPTION,
+                                    response = String.class),
+                    @ResponseHeader(name = REQUEST_ID_NAME, description = REQUEST_ID_HDR_DESCRIPTION,
+                                    response = UUID.class)},
+            extensions = {
+                    @Extension(
+                            name = EXTENSION_NAME,
+                            properties = {
+                                    @ExtensionProperty(name = API_VERSION_NAME, value = API_VERSION),
+                                    @ExtensionProperty(name = LAST_MOD_NAME, value = LAST_MOD_RELEASE)
+                        }
+                    )
+                }
+        )
+    @ApiResponses(
+            value = {
+                @ApiResponse(code = AUTHENTICATION_ERROR_CODE, message = AUTHENTICATION_ERROR_MESSAGE),
+                @ApiResponse(code = AUTHORIZATION_ERROR_CODE, message = AUTHORIZATION_ERROR_MESSAGE),
+                @ApiResponse(code = SERVER_ERROR_CODE, message = SERVER_ERROR_MESSAGE)
+            }
+        )
+    // @formatter:on
+    public Response query(
+            @HeaderParam(REQUEST_ID_NAME) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId,
+            @ApiParam(value = "Control Loop definition name", required = true) @QueryParam("name") String name,
+            @ApiParam(value = "Control Loop definition version",
+                    required = true) @QueryParam("version") String version) {
+
+        try {
+            ControlLoops response = provider.getControlLoops(name, version);
+            return addLoggingHeaders(addVersionControlHeaders(Response.status(Status.OK)), requestId).entity(response)
+                    .build();
+
+        } catch (PfModelRuntimeException | PfModelException e) {
+            LOGGER.warn("commisssioning of control loop failed", e);
+            return createInstantiationErrorResponse(e, requestId);
+        }
+
+    }
+
+    /**
+     * Updates a control loop.
+     *
+     * @param requestId request ID used in ONAP logging
+     * @param controlLoops the control loops
+     * @return a response
+     */
+    // @formatter:off
+    @PUT
+    @Path("/instantiation")
+    @ApiOperation(
+            value = "Updates control loop definitions",
+            notes = "Updates control loop definitions, returning the updated control loop definition IDs",
+            response = InstantiationResponse.class,
+            tags = {
+                "Control Loop Instantiation API"
+                },
+            authorizations = @Authorization(value = AUTHORIZATION_TYPE),
+            responseHeaders = {
+                    @ResponseHeader(
+                            name = VERSION_MINOR_NAME,
+                            description = VERSION_MINOR_DESCRIPTION,
+                            response = String.class),
+                    @ResponseHeader(
+                            name = VERSION_PATCH_NAME,
+                            description = VERSION_PATCH_DESCRIPTION,
+                            response = String.class),
+                    @ResponseHeader(
+                            name = VERSION_LATEST_NAME,
+                            description = VERSION_LATEST_DESCRIPTION,
+                            response = String.class),
+                    @ResponseHeader(
+                            name = REQUEST_ID_NAME,
+                            description = REQUEST_ID_HDR_DESCRIPTION,
+                            response = UUID.class)
+                },
+            extensions = {
+                @Extension(
+                    name = EXTENSION_NAME,
+                    properties = {
+                            @ExtensionProperty(name = API_VERSION_NAME, value = API_VERSION),
+                            @ExtensionProperty(name = LAST_MOD_NAME, value = LAST_MOD_RELEASE)
+                    }
+                )
+            }
+        )
+    @ApiResponses(
+            value = {
+                @ApiResponse(code = AUTHENTICATION_ERROR_CODE, message = AUTHENTICATION_ERROR_MESSAGE),
+                @ApiResponse(code = AUTHORIZATION_ERROR_CODE, message = AUTHORIZATION_ERROR_MESSAGE),
+                @ApiResponse(code = SERVER_ERROR_CODE, message = SERVER_ERROR_MESSAGE)
+            }
+        )
+    // @formatter:on
+    public Response update(
+            @HeaderParam(REQUEST_ID_NAME) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId,
+            @ApiParam(value = "Entity Body of Control Loop", required = true) ControlLoops controlLoops) {
+
+        try {
+            InstantiationResponse response = provider.updateControlLoops(controlLoops);
+            return addLoggingHeaders(addVersionControlHeaders(Response.status(Status.OK)), requestId).entity(response)
+                    .build();
+
+        } catch (PfModelRuntimeException | PfModelException e) {
+            LOGGER.warn("update of control loops failed", e);
+            return createInstantiationErrorResponse(e, requestId);
+        }
+    }
+
+    /**
+     * Deletes a control loop definition.
+     *
+     * @param requestId request ID used in ONAP logging
+     * @param name the name of the control loop to delete
+     * @param version the version of the control loop to delete
+     * @return a response
+     */
+    // @formatter:off
+    @DELETE
+    @Path("/instantiation")
+    @ApiOperation(value = "Delete a control loop",
+            notes = "Deletes a control loop, returning optional error details",
+            response = InstantiationResponse.class,
+            tags = {
+                "Clamp Control Loop Instantiation API"
+                },
+            authorizations = @Authorization(value = AUTHORIZATION_TYPE),
+            responseHeaders = {
+                    @ResponseHeader(
+                            name = VERSION_MINOR_NAME,
+                            description = VERSION_MINOR_DESCRIPTION,
+                            response = String.class),
+                    @ResponseHeader(
+                            name = VERSION_PATCH_NAME,
+                            description = VERSION_PATCH_DESCRIPTION,
+                            response = String.class),
+                    @ResponseHeader(
+                            name = VERSION_LATEST_NAME,
+                            description = VERSION_LATEST_DESCRIPTION,
+                            response = String.class),
+                    @ResponseHeader(
+                            name = REQUEST_ID_NAME,
+                            description = REQUEST_ID_HDR_DESCRIPTION,
+                            response = UUID.class)},
+            extensions = {
+                    @Extension(
+                            name = EXTENSION_NAME,
+                            properties = {
+                                    @ExtensionProperty(name = API_VERSION_NAME, value = API_VERSION),
+                                    @ExtensionProperty(name = LAST_MOD_NAME, value = LAST_MOD_RELEASE)
+                                }
+                        )
+                }
+        )
+    @ApiResponses(value = {
+            @ApiResponse(code = AUTHENTICATION_ERROR_CODE, message = AUTHENTICATION_ERROR_MESSAGE),
+            @ApiResponse(code = AUTHORIZATION_ERROR_CODE, message = AUTHORIZATION_ERROR_MESSAGE),
+            @ApiResponse(code = SERVER_ERROR_CODE, message = SERVER_ERROR_MESSAGE)
+        }
+    )
+    // @formatter:on
+
+    public Response delete(
+            @HeaderParam(REQUEST_ID_NAME) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId,
+            @ApiParam(value = "Control Loop definition name", required = true) @QueryParam("name") String name,
+            @ApiParam(value = "Control Loop definition version", required = true)
+                    @QueryParam("version") String version) {
+
+        try {
+            InstantiationResponse response = provider.deleteControlLoop(name, version);
+            return addLoggingHeaders(addVersionControlHeaders(Response.status(Status.OK)), requestId).entity(response)
+                    .build();
+
+        } catch (PfModelRuntimeException | PfModelException e) {
+            LOGGER.warn("delete of control loop failed", e);
+            return createInstantiationErrorResponse(e, requestId);
+        }
+    }
+
+    /**
+     * Issues control loop commands to control loops.
+     *
+     * @param requestId request ID used in ONAP logging
+     * @param command the command to issue to control loops
+     * @return the control loop definitions
+     */
+    // @formatter:off
+    @PUT
+    @Path("/instantiation/command")
+    @ApiOperation(value = "Issue a command to the requested control loops",
+            notes = "Issues a command to a control loop, ordering a state change on the control loop",
+            response = InstantiationResponse.class,
+            tags = {
+                "Clamp Control Loop Instantiation API"
+            },
+            authorizations = @Authorization(value = AUTHORIZATION_TYPE),
+            responseHeaders = {
+                    @ResponseHeader(
+                            name = VERSION_MINOR_NAME, description = VERSION_MINOR_DESCRIPTION,
+                                    response = String.class),
+                    @ResponseHeader(name = VERSION_PATCH_NAME, description = VERSION_PATCH_DESCRIPTION,
+                                    response = String.class),
+                    @ResponseHeader(name = VERSION_LATEST_NAME, description = VERSION_LATEST_DESCRIPTION,
+                                    response = String.class),
+                    @ResponseHeader(name = REQUEST_ID_NAME, description = REQUEST_ID_HDR_DESCRIPTION,
+                                    response = UUID.class)},
+            extensions = {
+                    @Extension(
+                            name = EXTENSION_NAME,
+                            properties = {
+                                    @ExtensionProperty(name = API_VERSION_NAME, value = API_VERSION),
+                                    @ExtensionProperty(name = LAST_MOD_NAME, value = LAST_MOD_RELEASE)
+                        }
+                    )
+                }
+        )
+    @ApiResponses(
+            value = {
+                @ApiResponse(code = AUTHENTICATION_ERROR_CODE, message = AUTHENTICATION_ERROR_MESSAGE),
+                @ApiResponse(code = AUTHORIZATION_ERROR_CODE, message = AUTHORIZATION_ERROR_MESSAGE),
+                @ApiResponse(code = SERVER_ERROR_CODE, message = SERVER_ERROR_MESSAGE)
+            }
+        )
+    // @formatter:on
+    public Response issueControlLoopCommand(
+            @HeaderParam(REQUEST_ID_NAME) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId,
+            @ApiParam(value = "Entity Body of control loop command", required = true) InstantiationCommand command) {
+
+        try {
+            InstantiationResponse response = provider.issueControlLoopCommand(command);
+            return addLoggingHeaders(addVersionControlHeaders(Response.status(Status.ACCEPTED)), requestId)
+                    .entity(response).build();
+
+        } catch (PfModelRuntimeException | PfModelException | ControlLoopException e) {
+            LOGGER.warn("creation of control loop failed", e);
+            return createInstantiationErrorResponse(e, requestId);
+        }
+    }
+
+    /**
+     * create a Instantiation Response from an exception.
+     * @param e the error
+     * @param requestId request ID used in ONAP logging
+     * @return the Instantiation Response
+     */
+    private Response createInstantiationErrorResponse(ErrorResponseInfo e, UUID requestId) {
+        InstantiationResponse resp = new InstantiationResponse();
+        resp.setErrorDetails(e.getErrorResponse().getErrorMessage());
+        return addLoggingHeaders(addVersionControlHeaders(Response.status(e.getErrorResponse().getResponseCode())),
+            requestId).entity(resp).build();
+    }
+}
+
diff --git a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/main/parameters/ClRuntimeParameterGroup.java b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/main/parameters/ClRuntimeParameterGroup.java
new file mode 100644
index 0000000..4c99b8e
--- /dev/null
+++ b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/main/parameters/ClRuntimeParameterGroup.java
@@ -0,0 +1,55 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.runtime.main.parameters;
+
+import java.util.List;
+import javax.validation.constraints.NotBlank;
+import lombok.Getter;
+import org.onap.policy.common.endpoints.event.comm.bus.internal.BusTopicParams;
+import org.onap.policy.common.endpoints.parameters.RestServerParameters;
+import org.onap.policy.common.endpoints.parameters.TopicParameterGroup;
+import org.onap.policy.common.parameters.ParameterGroupImpl;
+import org.onap.policy.common.parameters.annotations.NotNull;
+import org.onap.policy.models.provider.PolicyModelsProviderParameters;
+
+/**
+ * Class to hold all parameters needed for the Control Loop runtime component.
+ *
+ */
+@NotNull
+@NotBlank
+@Getter
+public class ClRuntimeParameterGroup extends ParameterGroupImpl {
+    private RestServerParameters restServerParameters;
+    private PolicyModelsProviderParameters databaseProviderParameters;
+    private ParticipantParameters participantParameters;
+    private TopicParameterGroup topicParameterGroup;
+    private List<BusTopicParams> healthCheckRestClientParameters;
+
+    /**
+     * Create the Control Loop parameter group.
+     *
+     * @param name the parameter group name
+     */
+    public ClRuntimeParameterGroup(final String name) {
+        super(name);
+    }
+}
diff --git a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/main/parameters/ClRuntimeParameterHandler.java b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/main/parameters/ClRuntimeParameterHandler.java
new file mode 100644
index 0000000..a463ad1
--- /dev/null
+++ b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/main/parameters/ClRuntimeParameterHandler.java
@@ -0,0 +1,77 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.runtime.main.parameters;
+
+import java.io.File;
+import javax.ws.rs.core.Response;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopException;
+import org.onap.policy.clamp.controlloop.runtime.main.startstop.ClRuntimeCommandLineArguments;
+import org.onap.policy.common.parameters.ValidationResult;
+import org.onap.policy.common.utils.coder.Coder;
+import org.onap.policy.common.utils.coder.CoderException;
+import org.onap.policy.common.utils.coder.StandardCoder;
+
+/**
+ * This class handles reading, parsing and validating of control loop runtime parameters from JSON files.
+ */
+public class ClRuntimeParameterHandler {
+
+    private static final Coder CODER = new StandardCoder();
+
+    /**
+     * Read the parameters from the parameter file.
+     *
+     * @param arguments the arguments passed to control loop runtime
+     * @return the parameters read from the configuration file
+     * @throws ControlLoopException on parameter exceptions
+     */
+    public ClRuntimeParameterGroup getParameters(final ClRuntimeCommandLineArguments arguments)
+            throws ControlLoopException {
+        ClRuntimeParameterGroup clRuntimeParameterGroup = null;
+
+        // Read the parameters
+        try {
+            // Read the parameters from JSON
+            File file = new File(arguments.getFullConfigurationFilePath());
+            clRuntimeParameterGroup = CODER.decode(file, ClRuntimeParameterGroup.class);
+        } catch (final CoderException e) {
+            throw new ControlLoopException(
+                    Response.Status.NOT_ACCEPTABLE, "error reading parameters from \""
+                            + arguments.getConfigurationFilePath() + "\"\n" + "(" + e.getClass().getSimpleName() + ")",
+                    e);
+        }
+
+        // The JSON processing returns null if there is an empty file
+        if (clRuntimeParameterGroup == null) {
+            throw new ControlLoopException(Response.Status.NOT_ACCEPTABLE,
+                    "no parameters found in \"" + arguments.getConfigurationFilePath() + "\"");
+        }
+
+        // validate the parameters
+        final ValidationResult validationResult = clRuntimeParameterGroup.validate();
+        if (!validationResult.isValid()) {
+            throw new ControlLoopException(Response.Status.NOT_ACCEPTABLE, "validation error(s) on parameters from \""
+                    + arguments.getConfigurationFilePath() + "\"\n" + validationResult.getResult());
+        }
+
+        return clRuntimeParameterGroup;
+    }
+}
diff --git a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/main/parameters/ParticipantParameters.java b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/main/parameters/ParticipantParameters.java
new file mode 100644
index 0000000..dfc1b28
--- /dev/null
+++ b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/main/parameters/ParticipantParameters.java
@@ -0,0 +1,59 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.clamp.controlloop.runtime.main.parameters;
+
+import java.util.concurrent.TimeUnit;
+import lombok.Getter;
+import org.onap.policy.common.parameters.ParameterGroupImpl;
+import org.onap.policy.common.parameters.annotations.Min;
+import org.onap.policy.common.parameters.annotations.NotBlank;
+import org.onap.policy.common.parameters.annotations.NotNull;
+
+/**
+ * Parameters for communicating with participants.
+ */
+@NotNull
+@NotBlank
+@Getter
+public class ParticipantParameters extends ParameterGroupImpl {
+
+    /**
+     * Default maximum message age, in milliseconds, that should be examined. Any message
+     * older than this is discarded.
+     */
+    public static final long DEFAULT_MAX_AGE_MS = TimeUnit.MILLISECONDS.convert(10, TimeUnit.MINUTES);
+
+
+    @Min(1)
+    private long heartBeatMs;
+
+    @Min(1)
+    private long maxMessageAgeMs =  DEFAULT_MAX_AGE_MS;
+
+    private ParticipantUpdateParameters updateParameters;
+    private ParticipantStateChangeParameters stateChangeParameters;
+
+
+    /**
+     * Constructs the object.
+     */
+    public ParticipantParameters() {
+        super(ParticipantParameters.class.getSimpleName());
+    }
+}
diff --git a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/main/parameters/ParticipantStateChangeParameters.java b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/main/parameters/ParticipantStateChangeParameters.java
new file mode 100644
index 0000000..2eea4ab
--- /dev/null
+++ b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/main/parameters/ParticipantStateChangeParameters.java
@@ -0,0 +1,53 @@
+/*
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.clamp.controlloop.runtime.main.parameters;
+
+import lombok.Getter;
+import org.onap.policy.common.parameters.ParameterGroupImpl;
+import org.onap.policy.common.parameters.annotations.Min;
+import org.onap.policy.common.parameters.annotations.NotBlank;
+import org.onap.policy.common.parameters.annotations.NotNull;
+
+/**
+ * Parameters for Participant STATE-CHANGE requests.
+ */
+@NotNull
+@NotBlank
+@Getter
+public class ParticipantStateChangeParameters extends ParameterGroupImpl {
+
+    /**
+     * Maximum number of times to re-send a request to a PDP.
+     */
+    @Min(value = 0)
+    private int maxRetryCount;
+
+    /**
+     * Maximum time to wait, in milliseconds, for a PDP response.
+     */
+    @Min(value = 0)
+    private long maxWaitMs;
+
+    /**
+     * Constructs the object.
+     */
+    public ParticipantStateChangeParameters() {
+        super(ParticipantStateChangeParameters.class.getSimpleName());
+    }
+}
diff --git a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/main/parameters/ParticipantUpdateParameters.java b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/main/parameters/ParticipantUpdateParameters.java
new file mode 100644
index 0000000..2af5be5
--- /dev/null
+++ b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/main/parameters/ParticipantUpdateParameters.java
@@ -0,0 +1,54 @@
+/*
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.clamp.controlloop.runtime.main.parameters;
+
+import lombok.Getter;
+import org.onap.policy.common.parameters.ParameterGroupImpl;
+import org.onap.policy.common.parameters.annotations.Min;
+import org.onap.policy.common.parameters.annotations.NotBlank;
+import org.onap.policy.common.parameters.annotations.NotNull;
+
+/**
+ * Parameters for Participant UPDATE requests.
+ */
+@NotNull
+@NotBlank
+@Getter
+public class ParticipantUpdateParameters extends ParameterGroupImpl {
+
+    /**
+     * Maximum number of times to re-send a request to a PDP.
+     */
+    @Min(value = 0)
+    private int maxRetryCount;
+
+    /**
+     * Maximum time to wait, in milliseconds, for a PDP response.
+     */
+    @Min(value = 0)
+    private long maxWaitMs;
+
+    /**
+     * Constructs the object.
+     */
+    public ParticipantUpdateParameters() {
+        super(ParticipantUpdateParameters.class.getSimpleName());
+    }
+}
+
diff --git a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/main/rest/ControlLoopAafFilter.java b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/main/rest/ControlLoopAafFilter.java
new file mode 100644
index 0000000..f166de5
--- /dev/null
+++ b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/main/rest/ControlLoopAafFilter.java
@@ -0,0 +1,38 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.runtime.main.rest;
+
+import org.onap.policy.common.endpoints.http.server.aaf.AafGranularAuthFilter;
+import org.onap.policy.common.utils.resources.MessageConstants;
+
+/**
+ * Class to manage AAF filters for the control loop runtime component.
+ */
+public class ControlLoopAafFilter extends AafGranularAuthFilter {
+
+    public static final String AAF_NODETYPE = MessageConstants.POLICY_CLAMP;
+    public static final String AAF_ROOT_PERMISSION = DEFAULT_NAMESPACE + "." + AAF_NODETYPE;
+
+    @Override
+    public String getPermissionTypeRoot() {
+        return AAF_ROOT_PERMISSION;
+    }
+}
diff --git a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/main/rest/RestController.java b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/main/rest/RestController.java
new file mode 100644
index 0000000..dd3fa30
--- /dev/null
+++ b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/main/rest/RestController.java
@@ -0,0 +1,115 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.runtime.main.rest;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.BasicAuthDefinition;
+import io.swagger.annotations.Info;
+import io.swagger.annotations.SecurityDefinition;
+import io.swagger.annotations.SwaggerDefinition;
+import io.swagger.annotations.Tag;
+import java.net.HttpURLConnection;
+import java.util.UUID;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response.ResponseBuilder;
+
+/**
+ * Common superclass to provide REST endpoints for the control loop service.
+ */
+// @formatter:off
+@Path("/onap/controlloop/v2")
+@Api(value = "Control Loop API")
+@Produces({MediaType.APPLICATION_JSON, RestController.APPLICATION_YAML})
+@SwaggerDefinition(
+    info = @Info(description =
+                    "Control Loop Service", version = "v1.0",
+                    title = "Control Loop"),
+    consumes = {MediaType.APPLICATION_JSON, RestController.APPLICATION_YAML},
+    produces = {MediaType.APPLICATION_JSON, RestController.APPLICATION_YAML},
+    schemes = {SwaggerDefinition.Scheme.HTTP, SwaggerDefinition.Scheme.HTTPS},
+    tags = {@Tag(name = "controlloop", description = "Control Loop Service")},
+    securityDefinition = @SecurityDefinition(basicAuthDefinitions = {@BasicAuthDefinition(key = "basicAuth")}))
+// @formatter:on
+public class RestController {
+    public static final String APPLICATION_YAML = "application/yaml";
+
+    public static final String EXTENSION_NAME = "interface info";
+
+    public static final String API_VERSION_NAME = "api-version";
+    public static final String API_VERSION = "1.0.0";
+
+    public static final String LAST_MOD_NAME = "last-mod-release";
+    public static final String LAST_MOD_RELEASE = "Dublin";
+
+    public static final String VERSION_MINOR_NAME = "X-MinorVersion";
+    public static final String VERSION_MINOR_DESCRIPTION =
+                    "Used to request or communicate a MINOR version back from the client"
+                                    + " to the server, and from the server back to the client";
+
+    public static final String VERSION_PATCH_NAME = "X-PatchVersion";
+    public static final String VERSION_PATCH_DESCRIPTION = "Used only to communicate a PATCH version in a response for"
+                    + " troubleshooting purposes only, and will not be provided by" + " the client on request";
+
+    public static final String VERSION_LATEST_NAME = "X-LatestVersion";
+    public static final String VERSION_LATEST_DESCRIPTION = "Used only to communicate an API's latest version";
+
+    public static final String REQUEST_ID_NAME = "X-ONAP-RequestID";
+    public static final String REQUEST_ID_HDR_DESCRIPTION = "Used to track REST transactions for logging purpose";
+    public static final String REQUEST_ID_PARAM_DESCRIPTION = "RequestID for http transaction";
+
+    public static final String AUTHORIZATION_TYPE = "basicAuth";
+
+    public static final int AUTHENTICATION_ERROR_CODE = HttpURLConnection.HTTP_UNAUTHORIZED;
+    public static final int AUTHORIZATION_ERROR_CODE = HttpURLConnection.HTTP_FORBIDDEN;
+    public static final int SERVER_ERROR_CODE = HttpURLConnection.HTTP_INTERNAL_ERROR;
+
+    public static final String AUTHENTICATION_ERROR_MESSAGE = "Authentication Error";
+    public static final String AUTHORIZATION_ERROR_MESSAGE = "Authorization Error";
+    public static final String SERVER_ERROR_MESSAGE = "Internal Server Error";
+
+    /**
+     * Adds version headers to the response.
+     *
+     * @param respBuilder response builder
+     * @return the response builder, with version headers
+     */
+    public ResponseBuilder addVersionControlHeaders(ResponseBuilder respBuilder) {
+        return respBuilder.header(VERSION_MINOR_NAME, "0").header(VERSION_PATCH_NAME, "0").header(VERSION_LATEST_NAME,
+                        API_VERSION);
+    }
+
+    /**
+     * Adds logging headers to the response.
+     *
+     * @param respBuilder response builder
+     * @return the response builder, with version logging
+     */
+    public ResponseBuilder addLoggingHeaders(ResponseBuilder respBuilder, UUID requestId) {
+        if (requestId == null) {
+            // Generate a random uuid if client does not embed requestId in rest request
+            return respBuilder.header(REQUEST_ID_NAME, UUID.randomUUID());
+        }
+
+        return respBuilder.header(REQUEST_ID_NAME, requestId);
+    }
+}
diff --git a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/main/startstop/ClRuntimeActivator.java b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/main/startstop/ClRuntimeActivator.java
new file mode 100644
index 0000000..a4238a9
--- /dev/null
+++ b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/main/startstop/ClRuntimeActivator.java
@@ -0,0 +1,186 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.runtime.main.startstop;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicReference;
+import javax.ws.rs.core.Response.Status;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopRuntimeException;
+import org.onap.policy.clamp.controlloop.common.handler.ControlLoopHandler;
+import org.onap.policy.clamp.controlloop.runtime.commissioning.CommissioningHandler;
+import org.onap.policy.clamp.controlloop.runtime.instantiation.InstantiationHandler;
+import org.onap.policy.clamp.controlloop.runtime.main.parameters.ClRuntimeParameterGroup;
+import org.onap.policy.clamp.controlloop.runtime.main.rest.ControlLoopAafFilter;
+import org.onap.policy.clamp.controlloop.runtime.monitoring.MonitoringHandler;
+import org.onap.policy.clamp.controlloop.runtime.supervision.SupervisionHandler;
+import org.onap.policy.common.endpoints.event.comm.TopicEndpointManager;
+import org.onap.policy.common.endpoints.event.comm.TopicSink;
+import org.onap.policy.common.endpoints.event.comm.TopicSource;
+import org.onap.policy.common.endpoints.http.server.RestServer;
+import org.onap.policy.common.endpoints.listeners.MessageTypeDispatcher;
+import org.onap.policy.common.parameters.ParameterService;
+import org.onap.policy.common.utils.services.ServiceManagerContainer;
+
+/**
+ * This class activates the control loop runtime component as a complete service together with all its controllers,
+ * listeners & handlers.
+ */
+public class ClRuntimeActivator extends ServiceManagerContainer {
+    // Name of the message type for messages on topics
+    private static final String[] MSG_TYPE_NAMES = {"messageType"};
+
+    private final ClRuntimeParameterGroup clRuntimeParameterGroup;
+
+    // Topics from which the application receives and to which the application sends messages
+    private List<TopicSink> topicSinks;
+    private List<TopicSource> topicSources;
+
+    /**
+     * Listens for messages on the topic, decodes them into a message, and then dispatches them.
+     */
+    private final MessageTypeDispatcher msgDispatcher;
+
+    /**
+     * Instantiate the activator for the control loop runtime as a complete service.
+     *
+     * @param clRuntimeParameterGroup the parameters for the control loop runtime service
+     */
+    public ClRuntimeActivator(final ClRuntimeParameterGroup clRuntimeParameterGroup) {
+
+        if (clRuntimeParameterGroup == null || !clRuntimeParameterGroup.isValid()) {
+            throw new ControlLoopRuntimeException(Status.INTERNAL_SERVER_ERROR, "ParameterGroup not valid");
+        }
+
+        this.clRuntimeParameterGroup = clRuntimeParameterGroup;
+
+        topicSinks = TopicEndpointManager.getManager()
+                .addTopicSinks(clRuntimeParameterGroup.getTopicParameterGroup().getTopicSinks());
+
+        topicSources = TopicEndpointManager.getManager()
+                .addTopicSources(clRuntimeParameterGroup.getTopicParameterGroup().getTopicSources());
+
+        try {
+            msgDispatcher = new MessageTypeDispatcher(MSG_TYPE_NAMES);
+        } catch (final RuntimeException e) {
+            throw new ControlLoopRuntimeException(Status.INTERNAL_SERVER_ERROR,
+                    "topic message dispatcher failed to start", e);
+        }
+
+        final AtomicReference<ControlLoopHandler> commissioningHandler = new AtomicReference<>();
+        final AtomicReference<ControlLoopHandler> instantiationHandler = new AtomicReference<>();
+        final AtomicReference<ControlLoopHandler> supervisionHandler = new AtomicReference<>();
+        final AtomicReference<ControlLoopHandler> monitoringHandler = new AtomicReference<>();
+        final AtomicReference<RestServer> restServer = new AtomicReference<>();
+
+        // @formatter:off
+        addAction("Control loop runtime parameters",
+            () -> ParameterService.register(clRuntimeParameterGroup),
+            () -> ParameterService.deregister(clRuntimeParameterGroup.getName()));
+
+        addAction("Topic endpoint management",
+            () -> TopicEndpointManager.getManager().start(),
+            () -> TopicEndpointManager.getManager().shutdown());
+
+        addAction("Commissioning Handler",
+                () -> commissioningHandler.set(new CommissioningHandler(clRuntimeParameterGroup)),
+                () -> commissioningHandler.get().close());
+
+        addAction("Instantiation Handler",
+            () -> instantiationHandler.set(new InstantiationHandler(clRuntimeParameterGroup)),
+            () -> instantiationHandler.get().close());
+
+        addAction("Supervision Handler",
+            () -> supervisionHandler.set(new SupervisionHandler(clRuntimeParameterGroup)),
+            () -> supervisionHandler.get().close());
+
+        addAction("Monitoring Handler",
+            () -> monitoringHandler.set(new MonitoringHandler(clRuntimeParameterGroup)),
+            () -> monitoringHandler.get().close());
+
+        addHandlerActions("Commissioning", commissioningHandler);
+        addHandlerActions("Instantiation", instantiationHandler);
+        addHandlerActions("Supervision", supervisionHandler);
+        addHandlerActions("Monitoring", monitoringHandler);
+
+        addAction("Topic Message Dispatcher", this::registerMsgDispatcher, this::unregisterMsgDispatcher);
+
+        clRuntimeParameterGroup.getRestServerParameters().setName(clRuntimeParameterGroup.getName());
+
+        addAction("REST server",
+            () -> {
+                Set<Class<?>> providerClasses = new HashSet<>();
+                providerClasses.addAll(commissioningHandler.get().getProviderClasses());
+                providerClasses.addAll(instantiationHandler.get().getProviderClasses());
+                providerClasses.addAll(supervisionHandler.get().getProviderClasses());
+                providerClasses.addAll(monitoringHandler.get().getProviderClasses());
+
+                RestServer server = new RestServer(clRuntimeParameterGroup.getRestServerParameters(),
+                        ControlLoopAafFilter.class,
+                        providerClasses.toArray(new Class<?>[providerClasses.size()]));
+
+                restServer.set(server);
+                restServer.get().start();
+            },
+            () -> restServer.get().stop());
+        // @formatter:on
+    }
+
+    private void addHandlerActions(final String name, final AtomicReference<ControlLoopHandler> handler) {
+        addAction(name + " Providers",
+            () -> handler.get().startProviders(),
+            () -> handler.get().stopProviders());
+        addAction(name + " Listeners",
+            () -> handler.get().startAndRegisterListeners(msgDispatcher),
+            () -> handler.get().stopAndUnregisterListeners(msgDispatcher));
+        addAction(name + " Publishers",
+            () -> handler.get().startAndRegisterPublishers(topicSinks),
+            () -> handler.get().stopAndUnregisterPublishers());
+    }
+
+    /**
+     * Registers the dispatcher with the topic source(s).
+     */
+    private void registerMsgDispatcher() {
+        for (final TopicSource source : topicSources) {
+            source.register(msgDispatcher);
+        }
+    }
+
+    /**
+     * Unregisters the dispatcher from the topic source(s).
+     */
+    private void unregisterMsgDispatcher() {
+        for (final TopicSource source : topicSources) {
+            source.unregister(msgDispatcher);
+        }
+    }
+
+    /**
+     * Get the parameters used by the activator.
+     *
+     * @return the parameters of the activator
+     */
+    public ClRuntimeParameterGroup getParameterGroup() {
+        return clRuntimeParameterGroup;
+    }
+}
diff --git a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/main/startstop/ClRuntimeCommandLineArguments.java b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/main/startstop/ClRuntimeCommandLineArguments.java
new file mode 100644
index 0000000..f36bb85
--- /dev/null
+++ b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/main/startstop/ClRuntimeCommandLineArguments.java
@@ -0,0 +1,151 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.runtime.main.startstop;
+
+import java.io.File;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.net.URL;
+import java.util.Arrays;
+import javax.ws.rs.core.Response;
+import lombok.Getter;
+import lombok.Setter;
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.DefaultParser;
+import org.apache.commons.cli.HelpFormatter;
+import org.apache.commons.cli.Option;
+import org.apache.commons.cli.Options;
+import org.apache.commons.cli.ParseException;
+import org.apache.commons.lang3.StringUtils;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopException;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopRuntimeException;
+import org.onap.policy.clamp.controlloop.common.startstop.CommonCommandLineArguments;
+import org.onap.policy.common.utils.resources.ResourceUtils;
+
+/**
+ * This class reads and handles command line parameters for the control loop runtime service.
+ */
+public class ClRuntimeCommandLineArguments {
+    private static final String FILE_MESSAGE_PREAMBLE = " file \"";
+    private static final int HELP_LINE_LENGTH = 120;
+
+    private final Options options;
+    private final CommonCommandLineArguments commonCommandLineArguments;
+
+    @Getter()
+    @Setter()
+    private String configurationFilePath = null;
+
+    /**
+     * Construct the options for the control loop runtime component.
+     */
+    public ClRuntimeCommandLineArguments() {
+        options = new Options();
+        commonCommandLineArguments = new CommonCommandLineArguments(options);
+    }
+
+    /**
+     * Construct the options for the CLI editor and parse in the given arguments.
+     *
+     * @param args The command line arguments
+     */
+    public ClRuntimeCommandLineArguments(final String[] args) {
+        // Set up the options with the default constructor
+        this();
+
+        // Parse the arguments
+        try {
+            parse(args);
+        } catch (final ControlLoopException e) {
+            throw new ControlLoopRuntimeException(Response.Status.NOT_ACCEPTABLE,
+                    "parse error on control loop runtime parameters", e);
+        }
+    }
+
+    /**
+     * Parse the command line options.
+     *
+     * @param args The command line arguments
+     * @return a string with a message for help and version, or null if there is no message
+     * @throws ControlLoopException on command argument errors
+     */
+    public String parse(final String[] args) throws ControlLoopException {
+        // Clear all our arguments
+        setConfigurationFilePath(null);
+        CommandLine commandLine = null;
+        try {
+            commandLine = new DefaultParser().parse(options, args);
+        } catch (final ParseException e) {
+            throw new ControlLoopException(Response.Status.NOT_ACCEPTABLE,
+                    "invalid command line arguments specified : " + e.getMessage());
+        }
+
+        // Arguments left over after Commons CLI does its stuff
+        final String[] remainingArgs = commandLine.getArgs();
+
+        if (remainingArgs.length > 0) {
+            throw new ControlLoopException(Response.Status.NOT_ACCEPTABLE,
+                    "too many command line arguments specified : " + Arrays.toString(args));
+        }
+
+        if (commandLine.hasOption('h')) {
+            return commonCommandLineArguments.help(Main.class.getName(), options);
+        }
+
+        if (commandLine.hasOption('v')) {
+            return commonCommandLineArguments.version();
+        }
+
+        if (commandLine.hasOption('c')) {
+            setConfigurationFilePath(commandLine.getOptionValue('c'));
+        }
+
+        return null;
+    }
+
+    /**
+     * Validate the command line options.
+     *
+     * @throws ControlLoopException on command argument validation errors
+     */
+    public void validate() throws ControlLoopException {
+        commonCommandLineArguments.validate(configurationFilePath);
+    }
+
+    /**
+     * Gets the full expanded configuration file path.
+     *
+     * @return the configuration file path
+     */
+    public String getFullConfigurationFilePath() {
+        return ResourceUtils.getFilePath4Resource(getConfigurationFilePath());
+    }
+
+    /**
+     * Sets the configuration file path.
+     *
+     * @param configurationFilePath the configuration file path
+     */
+    public void setConfigurationFilePath(final String configurationFilePath) {
+        this.configurationFilePath = configurationFilePath;
+
+    }
+}
diff --git a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/main/startstop/Main.java b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/main/startstop/Main.java
new file mode 100644
index 0000000..8e60d68
--- /dev/null
+++ b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/main/startstop/Main.java
@@ -0,0 +1,156 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.runtime.main.startstop;
+
+import java.util.Arrays;
+import javax.ws.rs.core.Response;
+import org.onap.policy.clamp.controlloop.common.ControlLoopConstants;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopException;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopRuntimeException;
+import org.onap.policy.clamp.controlloop.runtime.main.parameters.ClRuntimeParameterGroup;
+import org.onap.policy.clamp.controlloop.runtime.main.parameters.ClRuntimeParameterHandler;
+import org.onap.policy.common.utils.resources.MessageConstants;
+import org.onap.policy.common.utils.services.Registry;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * This class initiates ONAP Policy Framework Control Loop runtime component.
+ */
+public class Main {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(Main.class);
+
+    private ClRuntimeActivator activator;
+    private ClRuntimeParameterGroup parameterGroup;
+
+    /**
+     * Instantiates the control loop runtime service.
+     *
+     * @param args the command line arguments
+     */
+    public Main(final String[] args) {
+        final String argumentString = Arrays.toString(args);
+        LOGGER.info("Starting the control loop runtime service with arguments - {}", argumentString);
+
+        // Check the arguments
+        final ClRuntimeCommandLineArguments arguments = new ClRuntimeCommandLineArguments();
+        try {
+            // The arguments return a string if there is a message to print and we should exit
+            final String argumentMessage = arguments.parse(args);
+            if (argumentMessage != null) {
+                LOGGER.info(argumentMessage);
+                return;
+            }
+            // Validate that the arguments are sane
+            arguments.validate();
+
+            // Read the parameters
+            parameterGroup = new ClRuntimeParameterHandler().getParameters(arguments);
+
+            // Now, create the activator for the service
+            activator = new ClRuntimeActivator(parameterGroup);
+            Registry.register(ControlLoopConstants.REG_CLRUNTIME_ACTIVATOR, activator);
+
+            // Start the activator
+            activator.start();
+        } catch (Exception exp) {
+            if (null != activator) {
+                Registry.unregister(ControlLoopConstants.REG_CLRUNTIME_ACTIVATOR);
+            }
+            throw new ControlLoopRuntimeException(Response.Status.BAD_REQUEST,
+                String.format(MessageConstants.START_FAILURE_MSG, MessageConstants.POLICY_CLAMP), exp);
+        }
+
+        // Add a shutdown hook to shut everything down in an orderly manner
+        Runtime.getRuntime().addShutdownHook(new ClRuntimeShutdownHookClass());
+        String successMsg = String.format(MessageConstants.START_SUCCESS_MSG, MessageConstants.POLICY_CLAMP);
+        LOGGER.info(successMsg);
+    }
+
+    /**
+     * Check if main is running.
+     */
+    public boolean isRunning() {
+        return activator != null && activator.isAlive();
+    }
+
+    /**
+     * Get the parameters specified in JSON.
+     *
+     * @return the parameters
+     */
+    public ClRuntimeParameterGroup getParameters() {
+        return parameterGroup;
+    }
+
+    /**
+     * Shut down Execution.
+     *
+     * @throws ControlLoopException on shutdown errors
+     */
+    public void shutdown() throws ControlLoopException {
+        // clear the parameterGroup variable
+        parameterGroup = null;
+
+        // clear the cl runtime activator
+        if (activator != null) {
+            activator.stop();
+        }
+    }
+
+    /**
+     * The Class ClRuntimeShutdownHookClass terminates the control loop runtime service when its run method is called.
+     */
+    private class ClRuntimeShutdownHookClass extends Thread {
+        /*
+         * (non-Javadoc)
+         *
+         * @see java.lang.Runnable#run()
+         */
+        @Override
+        public void run() {
+            if (!activator.isAlive()) {
+                return;
+            }
+
+            try {
+                // Shutdown the control loop runtime service and wait for everything to stop
+                activator.stop();
+            } catch (final RuntimeException e) {
+                LOGGER.warn("error occured during shut down of the control loop runtime service", e);
+            }
+        }
+    }
+
+    /**
+     * The main method.
+     *
+     * @param args the arguments
+     */
+    public static void main(final String[] args) {      // NOSONAR
+        /*
+         * NOTE: arguments are validated by the constructor, thus sonar is disabled.
+         */
+
+        new Main(args);
+    }
+}
diff --git a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/monitoring/MonitoringHandler.java b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/monitoring/MonitoringHandler.java
new file mode 100644
index 0000000..a7ad918
--- /dev/null
+++ b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/monitoring/MonitoringHandler.java
@@ -0,0 +1,84 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.runtime.monitoring;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Set;
+import javax.ws.rs.core.Response;
+import lombok.Getter;
+import org.onap.policy.clamp.controlloop.common.handler.ControlLoopHandler;
+import org.onap.policy.clamp.controlloop.runtime.main.parameters.ClRuntimeParameterGroup;
+import org.onap.policy.clamp.controlloop.runtime.monitoring.rest.MonitoringQueryController;
+import org.onap.policy.common.endpoints.event.comm.TopicSink;
+import org.onap.policy.common.endpoints.listeners.MessageTypeDispatcher;
+import org.onap.policy.common.utils.services.Registry;
+import org.onap.policy.models.base.PfModelRuntimeException;
+
+/**
+ * This class handles monitoring of control loop definitions,
+ * so only one object of this type should be built at a time.
+ *
+ * <p/>
+ * It is effectively a singleton that is started at system start.
+ */
+public class MonitoringHandler extends ControlLoopHandler {
+
+    @Getter
+    private MonitoringProvider monitoringProvider;
+
+    /**
+     * Gets the Monitoring Handler.
+     *
+     * @return MonitoringHandler
+     */
+    public static MonitoringHandler getInstance() {
+        return Registry.get(MonitoringHandler.class.getName());
+    }
+
+    /**
+     * Create a handler.
+     *
+     * @param controlLoopParameters the parameters for access to the database
+     */
+    public MonitoringHandler(ClRuntimeParameterGroup controlLoopParameters) {
+        super(controlLoopParameters.getDatabaseProviderParameters());
+    }
+
+    @Override
+    public Set<Class<?>> getProviderClasses() {
+        return Set.of(MonitoringQueryController.class);
+    }
+
+    @Override
+    public void startProviders() {
+        monitoringProvider = new MonitoringProvider(getDatabaseProviderParameters());
+    }
+
+    @Override
+    public void stopProviders() {
+        try {
+            monitoringProvider.close();
+        } catch (IOException e) {
+            throw new PfModelRuntimeException(Response.Status.INTERNAL_SERVER_ERROR, "Cannot stop provider", e);
+        }
+    }
+}
diff --git a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/monitoring/MonitoringProvider.java b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/monitoring/MonitoringProvider.java
new file mode 100644
index 0000000..193f8d5
--- /dev/null
+++ b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/monitoring/MonitoringProvider.java
@@ -0,0 +1,273 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.runtime.monitoring;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.time.Instant;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import lombok.NonNull;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ClElementStatistics;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ClElementStatisticsList;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoop;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopElement;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantStatistics;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantStatisticsList;
+import org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider.ClElementStatisticsProvider;
+import org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider.ControlLoopProvider;
+import org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider.ParticipantStatisticsProvider;
+import org.onap.policy.models.base.PfModelException;
+import org.onap.policy.models.base.PfModelRuntimeException;
+import org.onap.policy.models.provider.PolicyModelsProviderParameters;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+/**
+ * This class provides information about statistics data of CL elements and CL Participants in database to callers.
+ */
+public class MonitoringProvider implements Closeable {
+
+    private static final String DESC_ORDER = "DESC";
+    private final ParticipantStatisticsProvider participantStatisticsProvider;
+    private final ClElementStatisticsProvider clElementStatisticsProvider;
+    private final ControlLoopProvider controlLoopProvider;
+
+    /**
+     * Create a Monitoring provider.
+     *
+     */
+    public MonitoringProvider(PolicyModelsProviderParameters parameters) {
+
+        try {
+            participantStatisticsProvider = new ParticipantStatisticsProvider(parameters);
+            clElementStatisticsProvider = new ClElementStatisticsProvider(parameters);
+            controlLoopProvider = new ControlLoopProvider(parameters);
+        } catch (PfModelException e) {
+            throw new PfModelRuntimeException(e);
+        }
+    }
+
+    @Override
+    public void close() throws IOException {
+        controlLoopProvider.close();
+        clElementStatisticsProvider.close();
+        participantStatisticsProvider.close();
+    }
+
+    /**
+     * Create participant statistics.
+     *
+     * @param participantStatistics the participant statistics
+     * @return the result of create operation
+     * @throws PfModelException on creation errors
+     */
+    public ParticipantStatisticsList createParticipantStatistics(List<ParticipantStatistics> participantStatistics)
+        throws PfModelException {
+        ParticipantStatisticsList participantStatisticsList = new ParticipantStatisticsList();
+        participantStatisticsList.setStatisticsList(participantStatisticsProvider
+            .createParticipantStatistics(participantStatistics));
+
+        return participantStatisticsList;
+    }
+
+    /**
+     * Create clElement statistics.
+     *
+     * @param clElementStatisticsList the clElement statistics
+     * @return the result of create operation
+     * @throws PfModelException on creation errors
+     */
+    public ClElementStatisticsList createClElementStatistics(List<ClElementStatistics> clElementStatisticsList)
+        throws PfModelException {
+        ClElementStatisticsList elementStatisticsList = new ClElementStatisticsList();
+        elementStatisticsList.setClElementStatistics(clElementStatisticsProvider
+            .createClElementStatistics(clElementStatisticsList));
+
+        return elementStatisticsList;
+    }
+
+    /**
+     * Get participant statistics based on specific filters.
+     *
+     * @param name the name of the participant statistics to get, null to get all statistics
+     * @param version the version of the participant statistics to get, null to get all statistics
+     * @param recordCount number of records to be fetched.
+     * @param startTime start of the timestamp, from statistics to be filtered
+     * @param endTime end of the timestamp up to which statistics to be filtered
+     * @return the participant found
+     */
+    public ParticipantStatisticsList fetchFilteredParticipantStatistics(@NonNull final String name,
+                                                                        final String version, int recordCount,
+                                                                        Instant startTime, Instant endTime)  {
+        ParticipantStatisticsList participantStatisticsList = new ParticipantStatisticsList();
+
+        //Additional parameters can be added in filterMap for filtering data.
+        Map<String, Object> filterMap = null;
+        participantStatisticsList.setStatisticsList(participantStatisticsProvider.getFilteredParticipantStatistics(
+            name, version, startTime, endTime, filterMap, DESC_ORDER, recordCount));
+
+        return participantStatisticsList;
+    }
+
+    /**
+     * Get all participant statistics records found for a specific control loop.     *
+     *
+     * @param controlLoopName name of the control loop
+     * @param controlLoopVersion version of the control loop
+     * @return All the participant statistics found
+     * @throws PfModelException on errors getting participant statistics
+     */
+    public ParticipantStatisticsList fetchParticipantStatsPerControlLoop(@NonNull final String controlLoopName,
+                                                                         @NonNull final String controlLoopVersion)
+        throws PfModelException {
+        ParticipantStatisticsList statisticsList = new ParticipantStatisticsList();
+        List<ParticipantStatistics> participantStatistics = new ArrayList<>();
+        try {
+            //Fetch all participantIds for a specific control loop
+            List<ToscaConceptIdentifier> participantIds = getAllParticipantIdsPerControlLoop(controlLoopName,
+                controlLoopVersion);
+            for (ToscaConceptIdentifier id: participantIds) {
+                participantStatistics.addAll(participantStatisticsProvider.getFilteredParticipantStatistics(
+                    id.getName(), id.getVersion(), null, null, null, DESC_ORDER, 0));
+            }
+            statisticsList.setStatisticsList(participantStatistics);
+        } catch (PfModelException e) {
+            throw new PfModelRuntimeException(e);
+        }
+        return statisticsList;
+    }
+
+
+
+    /**
+     * Get clElement statistics based on specific filters.
+     *
+     * @param name the name of the clElement statistics to get, null to get all statistics
+     * @param version the version of the clElement statistics to get, null to get all statistics
+     * @param id UUID of the control loop element
+     * @param startTime start of the timestamp, from statistics to be filtered
+     * @param endTime end of the timestamp up to which statistics to be filtered
+     * @param recordCount number of records to be fetched.
+     * @return the participant found
+     * @throws PfModelException on errors getting control loop statistics
+     */
+    public ClElementStatisticsList fetchFilteredClElementStatistics(@NonNull final String name, final String version,
+                                                                    final String id, Instant startTime, Instant endTime,
+                                                                    int recordCount) throws PfModelException {
+        ClElementStatisticsList clElementStatisticsList = new ClElementStatisticsList();
+        Map<String, Object> filterMap = new HashMap<>();
+        //Adding UUID in filter if present
+        if (id != null) {
+            filterMap.put("localName", id);
+        }
+        clElementStatisticsList.setClElementStatistics(clElementStatisticsProvider.getFilteredClElementStatistics(
+            name, version, startTime, endTime, filterMap, DESC_ORDER, recordCount));
+
+        return clElementStatisticsList;
+    }
+
+
+    /**
+     * Get clElement statistics per control loop.
+     *
+     * @param name the name of the control loop
+     * @param version the version of the control loop
+     * @return the clElement statistics found
+     * @throws PfModelException on errors getting control loop statistics
+     */
+    public ClElementStatisticsList fetchClElementStatsPerControlLoop(@NonNull final String name,
+                                                                     @NonNull final String version)
+        throws PfModelException {
+        ClElementStatisticsList clElementStatisticsList = new ClElementStatisticsList();
+        List<ClElementStatistics> clElementStats = new ArrayList<>();
+        try {
+            List<ControlLoopElement> clElements = new ArrayList<>();
+            //Fetch all control loop elements for the control loop
+            ControlLoop controlLoop = controlLoopProvider.getControlLoop(new ToscaConceptIdentifier(name,
+                version));
+            if (controlLoop != null) {
+                clElements.addAll(controlLoop.getElements().values());
+                //Collect control loop element statistics for each cl element.
+                for (ControlLoopElement clElement : clElements) {
+                    clElementStats.addAll(fetchFilteredClElementStatistics(clElement.getParticipantId().getName(),
+                        clElement.getParticipantId().getVersion(), clElement.getId().toString(), null,
+                        null, 0).getClElementStatistics());
+                }
+            }
+            clElementStatisticsList.setClElementStatistics(clElementStats);
+        } catch (PfModelException e) {
+            throw new PfModelRuntimeException(e);
+        }
+        return clElementStatisticsList;
+    }
+
+    /**
+     * If required, REST end point can be defined for this method to fetch associated participant Ids
+     * for a control loop.
+     *
+     * @param name the name of the control loop
+     * @param version the version of the control loop
+     * @return List of participant Id
+     * @throws PfModelException on errors
+     */
+    public List<ToscaConceptIdentifier> getAllParticipantIdsPerControlLoop(String name, String version)
+        throws PfModelException {
+        List<ToscaConceptIdentifier> participantIds = new ArrayList<>();
+        ControlLoop controlLoop = controlLoopProvider.getControlLoop(new ToscaConceptIdentifier(name, version));
+        if (controlLoop != null) {
+            for (ControlLoopElement clElement : controlLoop.getElements().values()) {
+                participantIds.add(clElement.getParticipantId());
+            }
+        }
+        return participantIds;
+    }
+
+    /**
+     * If required, REST end point can be defined for this method to fetch associated control loop element Ids
+     * for a control loop.
+     *
+     * @param name the name of the control loop
+     * @param version the version of the control loop
+     * @return Map of control loop Id and participant details
+     * @throws PfModelException on errors
+     */
+    public Map<String, ToscaConceptIdentifier> getAllClElementsIdPerControlLoop(String name, String version)
+        throws PfModelException {
+        Map<String, ToscaConceptIdentifier> clElementId = new HashMap<>();
+        ControlLoop controlLoop = controlLoopProvider.getControlLoop(new ToscaConceptIdentifier(name, version));
+        if (controlLoop != null) {
+            for (ControlLoopElement clElement : controlLoop.getElements().values()) {
+                clElementId.put(clElement.getId().toString(), clElement.getParticipantId());
+            }
+        }
+        return clElementId;
+    }
+
+    public void updateClElementStatistics(List<ClElementStatistics> clElementStatistics) {
+        // TODO Auto-generated method stub
+    }
+
+    public void updateParticipantStatistics(List<ParticipantStatistics> statisticsList) {
+        // TODO Auto-generated method stub
+    }
+}
diff --git a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/monitoring/rest/MonitoringQueryController.java b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/monitoring/rest/MonitoringQueryController.java
new file mode 100644
index 0000000..2e19ffe
--- /dev/null
+++ b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/monitoring/rest/MonitoringQueryController.java
@@ -0,0 +1,371 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.runtime.monitoring.rest;
+
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import io.swagger.annotations.Authorization;
+import io.swagger.annotations.Extension;
+import io.swagger.annotations.ExtensionProperty;
+import io.swagger.annotations.ResponseHeader;
+import java.time.Instant;
+import java.util.UUID;
+import javax.ws.rs.DefaultValue;
+import javax.ws.rs.GET;
+import javax.ws.rs.HeaderParam;
+import javax.ws.rs.Path;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.Response;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ClElementStatisticsList;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantStatisticsList;
+import org.onap.policy.clamp.controlloop.runtime.main.rest.RestController;
+import org.onap.policy.clamp.controlloop.runtime.monitoring.MonitoringHandler;
+import org.onap.policy.clamp.controlloop.runtime.monitoring.MonitoringProvider;
+import org.onap.policy.models.base.PfModelException;
+import org.onap.policy.models.base.PfModelRuntimeException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * This class handles REST endpoints for CL Statistics monitoring.
+ */
+public class MonitoringQueryController extends RestController {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(MonitoringQueryController.class);
+    private final MonitoringProvider provider;
+
+    /**
+     * Create Monitoring Controller.
+     */
+    public MonitoringQueryController() {
+        this.provider = MonitoringHandler.getInstance().getMonitoringProvider();
+    }
+
+
+    /**
+     * Queries details of control loop participants statistics.
+     *
+     * @param requestId request ID used in ONAP logging
+     * @param name the name of the participant to get, null for all participants statistics
+     * @param recordCount the record count to be fetched
+     * @return the participant statistics
+     */
+    // @formatter:off
+    @GET
+    @Path("/monitoring/participant")
+    @ApiOperation(value = "Query details of the requested participant stats",
+        notes = "Queries details of the requested participant stats, returning all participant stats",
+        response = ParticipantStatisticsList.class,
+        tags = {
+            "Clamp control loop Monitoring API"
+        },
+        authorizations = @Authorization(value = AUTHORIZATION_TYPE),
+        responseHeaders = {
+            @ResponseHeader(
+                name = VERSION_MINOR_NAME, description = VERSION_MINOR_DESCRIPTION,
+                response = String.class),
+            @ResponseHeader(name = VERSION_PATCH_NAME, description = VERSION_PATCH_DESCRIPTION,
+                response = String.class),
+            @ResponseHeader(name = VERSION_LATEST_NAME, description = VERSION_LATEST_DESCRIPTION,
+                response = String.class),
+            @ResponseHeader(name = REQUEST_ID_NAME, description = REQUEST_ID_HDR_DESCRIPTION,
+                response = UUID.class)},
+        extensions = {
+            @Extension(
+                name = EXTENSION_NAME,
+                properties = {
+                    @ExtensionProperty(name = API_VERSION_NAME, value = API_VERSION),
+                    @ExtensionProperty(name = LAST_MOD_NAME, value = LAST_MOD_RELEASE)
+                }
+            )
+        }
+    )
+    @ApiResponses(
+        value = {
+            @ApiResponse(code = AUTHENTICATION_ERROR_CODE, message = AUTHENTICATION_ERROR_MESSAGE),
+            @ApiResponse(code = AUTHORIZATION_ERROR_CODE, message = AUTHORIZATION_ERROR_MESSAGE),
+            @ApiResponse(code = SERVER_ERROR_CODE, message = SERVER_ERROR_MESSAGE)
+        }
+    )
+    // @formatter:on
+    public Response queryParticipantStatistics(@HeaderParam(REQUEST_ID_NAME)
+                                               @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId,
+                                               @ApiParam(value = "Control Loop participant name", required = true)
+                                               @QueryParam("name") final String name,
+                                               @ApiParam(value = "Control Loop participant version", required = true)
+                                               @QueryParam("version") final String version,
+                                               @ApiParam(value = "Record count", required = false) @DefaultValue("0")
+                                               @QueryParam("recordCount") final int recordCount,
+                                               @ApiParam(value = "start time", required = false)
+                                               @QueryParam("startTime") final String startTime,
+                                               @ApiParam(value = "end time", required = false)
+                                               @QueryParam("endTime") final String endTime) {
+
+        try {
+            Instant startTimestamp = null;
+            Instant endTimestamp = null;
+
+            if (startTime != null) {
+                startTimestamp = Instant.parse(startTime);
+            }
+            if (endTime != null) {
+                endTimestamp = Instant.parse(endTime);
+            }
+            ParticipantStatisticsList response = provider.fetchFilteredParticipantStatistics(name, version, recordCount,
+                startTimestamp, endTimestamp);
+            return addLoggingHeaders(addVersionControlHeaders(Response.status(Response.Status.OK)), requestId)
+                .entity(response)
+                .build();
+
+        } catch (PfModelRuntimeException e) {
+            LOGGER.warn("Monitoring of participants statistics failed", e);
+            return addLoggingHeaders(addVersionControlHeaders(Response.status(e.getErrorResponse().getResponseCode())),
+                requestId).build();
+        }
+
+    }
+
+    /**
+     * Queries details of all participant statistics per control loop.
+     *
+     * @param requestId request ID used in ONAP logging
+     * @param name the name of the control loop
+     * @param version version of the control loop
+     * @return the control loop element statistics
+     */
+    // @formatter:off
+    @GET
+    @Path("/monitoring/participants/controlloop")
+    @ApiOperation(value = "Query details of all the participant stats in a control loop",
+        notes = "Queries details of the participant stats, returning all participant stats",
+        response = ClElementStatisticsList.class,
+        tags = {
+            "Clamp control loop Monitoring API"
+        },
+        authorizations = @Authorization(value = AUTHORIZATION_TYPE),
+        responseHeaders = {
+            @ResponseHeader(
+                name = VERSION_MINOR_NAME, description = VERSION_MINOR_DESCRIPTION,
+                response = String.class),
+            @ResponseHeader(name = VERSION_PATCH_NAME, description = VERSION_PATCH_DESCRIPTION,
+                response = String.class),
+            @ResponseHeader(name = VERSION_LATEST_NAME, description = VERSION_LATEST_DESCRIPTION,
+                response = String.class),
+            @ResponseHeader(name = REQUEST_ID_NAME, description = REQUEST_ID_HDR_DESCRIPTION,
+                response = UUID.class)},
+        extensions = {
+            @Extension(
+                name = EXTENSION_NAME,
+                properties = {
+                    @ExtensionProperty(name = API_VERSION_NAME, value = API_VERSION),
+                    @ExtensionProperty(name = LAST_MOD_NAME, value = LAST_MOD_RELEASE)
+                }
+            )
+        })
+    @ApiResponses(
+        value = {
+            @ApiResponse(code = AUTHENTICATION_ERROR_CODE, message = AUTHENTICATION_ERROR_MESSAGE),
+            @ApiResponse(code = AUTHORIZATION_ERROR_CODE, message = AUTHORIZATION_ERROR_MESSAGE),
+            @ApiResponse(code = SERVER_ERROR_CODE, message = SERVER_ERROR_MESSAGE)
+        }
+    )
+    // @formatter:on
+    public Response queryParticipantStatisticsPerControlLoop(@HeaderParam(REQUEST_ID_NAME)
+                                                             @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId,
+                                                             @ApiParam(value = "Control Loop name", required = true)
+                                                             @QueryParam("name") final String name,
+                                                             @ApiParam(value = "Control Loop version", required = true)
+                                                             @QueryParam("version") final String version) {
+
+        try {
+            ParticipantStatisticsList response = provider.fetchParticipantStatsPerControlLoop(name, version);
+            return addLoggingHeaders(addVersionControlHeaders(Response.status(Response.Status.OK)), requestId)
+                .entity(response)
+                .build();
+
+        } catch (PfModelRuntimeException | PfModelException e) {
+            LOGGER.warn("Monitoring of Cl participant statistics failed", e);
+            return addLoggingHeaders(addVersionControlHeaders(Response.status(e.getErrorResponse().getResponseCode())),
+                requestId).build();
+        }
+
+    }
+
+
+
+    /**
+     * Queries details of all control loop element statistics per control loop.
+     *
+     * @param requestId request ID used in ONAP logging
+     * @param name the name of the control loop
+     * @param version version of the control loop
+     * @return the control loop element statistics
+     */
+    // @formatter:off
+    @GET
+    @Path("/monitoring/clelements/controlloop")
+    @ApiOperation(value = "Query details of the requested cl element stats in a control loop",
+        notes = "Queries details of the requested cl element stats, returning all clElement stats",
+        response = ClElementStatisticsList.class,
+        tags = {
+            "Clamp control loop Monitoring API"
+        },
+        authorizations = @Authorization(value = AUTHORIZATION_TYPE),
+        responseHeaders = {
+            @ResponseHeader(
+                name = VERSION_MINOR_NAME, description = VERSION_MINOR_DESCRIPTION,
+                response = String.class),
+            @ResponseHeader(name = VERSION_PATCH_NAME, description = VERSION_PATCH_DESCRIPTION,
+                response = String.class),
+            @ResponseHeader(name = VERSION_LATEST_NAME, description = VERSION_LATEST_DESCRIPTION,
+                response = String.class),
+            @ResponseHeader(name = REQUEST_ID_NAME, description = REQUEST_ID_HDR_DESCRIPTION,
+                response = UUID.class)},
+        extensions = {
+            @Extension(
+                name = EXTENSION_NAME,
+                properties = {
+                    @ExtensionProperty(name = API_VERSION_NAME, value = API_VERSION),
+                    @ExtensionProperty(name = LAST_MOD_NAME, value = LAST_MOD_RELEASE)
+                }
+            )
+        })
+    @ApiResponses(
+        value = {
+            @ApiResponse(code = AUTHENTICATION_ERROR_CODE, message = AUTHENTICATION_ERROR_MESSAGE),
+            @ApiResponse(code = AUTHORIZATION_ERROR_CODE, message = AUTHORIZATION_ERROR_MESSAGE),
+            @ApiResponse(code = SERVER_ERROR_CODE, message = SERVER_ERROR_MESSAGE)
+        }
+    )
+    // @formatter:on
+    public Response queryElementStatisticsPerControlLoop(@HeaderParam(REQUEST_ID_NAME)
+                                                         @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId,
+                                                         @ApiParam(value = "Control Loop name", required = true)
+                                                         @QueryParam("name") final String name,
+                                                         @ApiParam(value = "Control Loop version", required = true)
+                                                         @QueryParam("version") final String version) {
+
+        try {
+            ClElementStatisticsList response = provider.fetchClElementStatsPerControlLoop(name, version);
+            return addLoggingHeaders(addVersionControlHeaders(Response.status(Response.Status.OK)), requestId)
+                .entity(response)
+                .build();
+
+        } catch (PfModelRuntimeException | PfModelException e) {
+            LOGGER.warn("Monitoring of Cl Element statistics failed", e);
+            return addLoggingHeaders(addVersionControlHeaders(Response.status(e.getErrorResponse().getResponseCode())),
+                requestId).build();
+        }
+
+    }
+
+
+
+
+    /**
+     * Queries details of all control loop element statistics per control loop.
+     *
+     * @param requestId request ID used in ONAP logging
+     * @param name the name of the control loop
+     * @param version version of the control loop
+     * @param id Id of the control loop element
+     * @param recordCount the record count to be fetched
+     * @return the control loop element statistics
+     */
+    // @formatter:off
+    @GET
+    @Path("/monitoring/clelement")
+    @ApiOperation(value = "Query details of the requested cl element stats",
+        notes = "Queries details of the requested cl element stats, returning all clElement stats",
+        response = ClElementStatisticsList.class,
+        tags = {
+            "Clamp control loop Monitoring API"
+        },
+        authorizations = @Authorization(value = AUTHORIZATION_TYPE),
+        responseHeaders = {
+            @ResponseHeader(
+                name = VERSION_MINOR_NAME, description = VERSION_MINOR_DESCRIPTION,
+                response = String.class),
+            @ResponseHeader(name = VERSION_PATCH_NAME, description = VERSION_PATCH_DESCRIPTION,
+                response = String.class),
+            @ResponseHeader(name = VERSION_LATEST_NAME, description = VERSION_LATEST_DESCRIPTION,
+                response = String.class),
+            @ResponseHeader(name = REQUEST_ID_NAME, description = REQUEST_ID_HDR_DESCRIPTION,
+                response = UUID.class)},
+        extensions = {
+            @Extension(
+                name = EXTENSION_NAME,
+                properties = {
+                    @ExtensionProperty(name = API_VERSION_NAME, value = API_VERSION),
+                    @ExtensionProperty(name = LAST_MOD_NAME, value = LAST_MOD_RELEASE)
+                }
+            )
+        })
+    @ApiResponses(
+        value = {
+            @ApiResponse(code = AUTHENTICATION_ERROR_CODE, message = AUTHENTICATION_ERROR_MESSAGE),
+            @ApiResponse(code = AUTHORIZATION_ERROR_CODE, message = AUTHORIZATION_ERROR_MESSAGE),
+            @ApiResponse(code = SERVER_ERROR_CODE, message = SERVER_ERROR_MESSAGE)
+        }
+    )
+    // @formatter:on
+    public Response queryElementStatistics(@HeaderParam(REQUEST_ID_NAME)
+                                           @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId,
+                                           @ApiParam(value = "Participant name", required = true)
+                                           @QueryParam("name") final String name,
+                                           @ApiParam(value = "Participant version", required = true)
+                                           @QueryParam("version") final String version,
+                                           @ApiParam(value = "Record count", required = false)
+                                           @DefaultValue("0") @QueryParam("recordCount") final int recordCount,
+                                           @ApiParam(value = "Control Loop element id", required = false)
+                                           @QueryParam("id") final String id,
+                                           @ApiParam(value = "start time", required = false)
+                                           @QueryParam("startTime") final String startTime,
+                                           @ApiParam(value = "end time", required = false)
+                                           @QueryParam("endTime") final String endTime) {
+
+        try {
+            Instant startTimestamp = null;
+            Instant endTimestamp = null;
+
+            if (startTime != null) {
+                startTimestamp = Instant.parse(startTime);
+            }
+            if (endTime != null) {
+                endTimestamp = Instant.parse(endTime);
+            }
+            ClElementStatisticsList response = provider.fetchFilteredClElementStatistics(name, version, id,
+                startTimestamp, endTimestamp, recordCount);
+            return addLoggingHeaders(addVersionControlHeaders(Response.status(Response.Status.OK)), requestId)
+                .entity(response)
+                .build();
+
+        } catch (PfModelRuntimeException | PfModelException e) {
+            LOGGER.warn("Monitoring of Cl Element statistics failed", e);
+            return addLoggingHeaders(addVersionControlHeaders(Response.status(e.getErrorResponse().getResponseCode())),
+                requestId).build();
+        }
+
+    }
+
+}
diff --git a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/supervision/SupervisionHandler.java b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/supervision/SupervisionHandler.java
new file mode 100644
index 0000000..63bff00
--- /dev/null
+++ b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/supervision/SupervisionHandler.java
@@ -0,0 +1,450 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.runtime.supervision;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+import org.apache.commons.collections4.CollectionUtils;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopException;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopRuntimeException;
+import org.onap.policy.clamp.controlloop.common.handler.ControlLoopHandler;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoop;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopElement;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopState;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.Participant;
+import org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider.ControlLoopProvider;
+import org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider.ParticipantProvider;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantControlLoopStateChange;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantControlLoopUpdate;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantMessageType;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantStatus;
+import org.onap.policy.clamp.controlloop.runtime.commissioning.CommissioningHandler;
+import org.onap.policy.clamp.controlloop.runtime.commissioning.CommissioningProvider;
+import org.onap.policy.clamp.controlloop.runtime.main.parameters.ClRuntimeParameterGroup;
+import org.onap.policy.clamp.controlloop.runtime.monitoring.MonitoringHandler;
+import org.onap.policy.clamp.controlloop.runtime.monitoring.MonitoringProvider;
+import org.onap.policy.clamp.controlloop.runtime.supervision.comm.ParticipantControlLoopStateChangePublisher;
+import org.onap.policy.clamp.controlloop.runtime.supervision.comm.ParticipantControlLoopUpdatePublisher;
+import org.onap.policy.clamp.controlloop.runtime.supervision.comm.ParticipantStateChangePublisher;
+import org.onap.policy.clamp.controlloop.runtime.supervision.comm.ParticipantStatusListener;
+import org.onap.policy.common.endpoints.event.comm.TopicSink;
+import org.onap.policy.common.endpoints.listeners.MessageTypeDispatcher;
+import org.onap.policy.common.utils.services.Registry;
+import org.onap.policy.common.utils.services.ServiceManager;
+import org.onap.policy.common.utils.services.ServiceManagerException;
+import org.onap.policy.models.base.PfModelException;
+import org.onap.policy.models.base.PfModelRuntimeException;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * This class handles supervision of control loop instances, so only one object of this type should be built at a time.
+ *
+ * <p/> It is effectively a singleton that is started at system start.
+ */
+public class SupervisionHandler extends ControlLoopHandler {
+    private static final Logger LOGGER = LoggerFactory.getLogger(SupervisionHandler.class);
+
+    private static final String CONTROL_LOOP_CANNOT_TRANSITION_FROM_STATE = "Control loop can't transition from state ";
+    private static final String CONTROL_LOOP_IS_ALREADY_IN_STATE = "Control loop is already in state ";
+    private static final String TO_STATE = " to state ";
+    private static final String AND_TRANSITIONING_TO_STATE = " and transitioning to state ";
+
+    private ControlLoopProvider controlLoopProvider;
+    private ParticipantProvider participantProvider;
+    private CommissioningProvider commissioningProvider;
+    private MonitoringProvider monitoringProvider;
+
+    // Publishers for participant communication
+    private ParticipantStateChangePublisher stateChangePublisher;
+    private ParticipantControlLoopUpdatePublisher controlLoopUpdatePublisher;
+    private ParticipantControlLoopStateChangePublisher controlLoopStateChangePublisher;
+
+    // Database scanner
+    private SupervisionScanner scanner;
+
+    /**
+     * Used to manage the services.
+     */
+    private ServiceManager manager;
+    private ServiceManager publisherManager;
+
+    /**
+     * Gets the SupervisionHandler.
+     *
+     * @return SupervisionHandler
+     */
+    public static SupervisionHandler getInstance() {
+        return Registry.get(SupervisionHandler.class.getName());
+    }
+
+    /**
+     * Create a handler.
+     *
+     * @param clRuntimeParameterGroup the parameters for the control loop runtime
+     */
+    public SupervisionHandler(ClRuntimeParameterGroup clRuntimeParameterGroup) {
+        super(clRuntimeParameterGroup.getDatabaseProviderParameters());
+        // @formatter:off
+        this.manager = new ServiceManager()
+                        .addAction("ControlLoop Provider",
+                            () -> controlLoopProvider = new ControlLoopProvider(getDatabaseProviderParameters()),
+                            () -> controlLoopProvider = null)
+                        .addAction("Participant Provider",
+                            () -> participantProvider = new ParticipantProvider(getDatabaseProviderParameters()),
+                            () -> participantProvider = null);
+        // @formatter:on
+    }
+
+    /**
+     * Supervision trigger called when a command is issued on control loops.
+     *
+     * </p> Causes supervision to start or continue supervision on the control loops in question.
+     *
+     * @param controlLoopIdentifierList the control loops for which the supervision command has been issued
+     * @throws ControlLoopException on supervision triggering exceptions
+     */
+    public void triggerControlLoopSupervision(List<ToscaConceptIdentifier> controlLoopIdentifierList)
+            throws ControlLoopException {
+
+        LOGGER.debug("triggering control loop supervision on control loops {}", controlLoopIdentifierList);
+
+        if (CollectionUtils.isEmpty(controlLoopIdentifierList)) {
+            // This is just to force throwing of the exception in certain circumstances.
+            exceptionOccured(Response.Status.NOT_ACCEPTABLE,
+                    "The list of control loops for supervision is empty");
+        }
+
+        for (ToscaConceptIdentifier controlLoopId : controlLoopIdentifierList) {
+            try {
+                ControlLoop controlLoop = controlLoopProvider.getControlLoop(controlLoopId);
+
+                superviseControlLoop(controlLoop);
+
+                controlLoopProvider.updateControlLoop(controlLoop);
+            } catch (PfModelException pfme) {
+                throw new ControlLoopException(pfme.getErrorResponse().getResponseCode(), pfme.getMessage(), pfme);
+            }
+        }
+    }
+
+    @Override
+    public void startAndRegisterListeners(MessageTypeDispatcher msgDispatcher) {
+        msgDispatcher.register(ParticipantMessageType.PARTICIPANT_STATUS.name(), new ParticipantStatusListener());
+    }
+
+    @Override
+    public void startAndRegisterPublishers(List<TopicSink> topicSinks) {
+        // TODO: Use a parameter for the timeout
+        // @formatter:off
+        this.publisherManager = new ServiceManager()
+                .addAction("Supervision scanner",
+                        () -> scanner = new SupervisionScanner(controlLoopProvider, 10000),
+                        () -> scanner = null)
+                .addAction("ControlLoopUpdate publisher",
+                        () -> controlLoopUpdatePublisher = new ParticipantControlLoopUpdatePublisher(topicSinks, -1),
+                        () -> controlLoopUpdatePublisher.terminate())
+                .addAction("StateChange Publisher",
+                        () -> stateChangePublisher = new ParticipantStateChangePublisher(topicSinks, 10000),
+                        () -> stateChangePublisher.terminate())
+                .addAction("ControlLoopStateChange Publisher",
+                        () -> controlLoopStateChangePublisher =
+                        new ParticipantControlLoopStateChangePublisher(topicSinks, -1),
+                        () -> controlLoopStateChangePublisher.terminate());
+        // @formatter:on
+        try {
+            publisherManager.start();
+        } catch (final ServiceManagerException exp) {
+            throw new ControlLoopRuntimeException(Status.INTERNAL_SERVER_ERROR,
+                    "Supervision handler start of publishers or scanner failed", exp);
+        }
+    }
+
+    @Override
+    public void stopAndUnregisterPublishers() {
+        try {
+            publisherManager.stop();
+        } catch (final ServiceManagerException exp) {
+            throw new ControlLoopRuntimeException(Status.INTERNAL_SERVER_ERROR,
+                    "Supervision handler stop of publishers or scanner failed", exp);
+        }
+    }
+
+    @Override
+    public void stopAndUnregisterListeners(MessageTypeDispatcher msgDispatcher) {
+        msgDispatcher.unregister(ParticipantMessageType.PARTICIPANT_STATUS.name());
+    }
+
+    /**
+     * Handle a ParticipantStatus message from a participant.
+     *
+     * @param participantStatusMessage the ParticipantStatus message received from a participant
+     */
+    public void handleParticipantStatusMessage(ParticipantStatus participantStatusMessage) {
+        LOGGER.debug("Participant Status received {}", participantStatusMessage);
+
+        try {
+            superviseParticipant(participantStatusMessage);
+        } catch (PfModelException | ControlLoopException svExc) {
+            LOGGER.warn("error supervising participant {}", participantStatusMessage.getParticipantId(), svExc);
+            return;
+        }
+
+        try {
+            superviseControlLoops(participantStatusMessage);
+        } catch (PfModelException | ControlLoopException svExc) {
+            LOGGER.warn("error supervising participant {}", participantStatusMessage.getParticipantId(), svExc);
+        }
+    }
+
+    /**
+     * Supervise a control loop, performing whatever actions need to be performed on the control loop.
+     *
+     * @param controlLoop the control loop to supervises
+     * @throws ControlLoopException on supervision errors
+     */
+    private void superviseControlLoop(ControlLoop controlLoop) throws ControlLoopException, PfModelException {
+        switch (controlLoop.getOrderedState()) {
+            case UNINITIALISED:
+                superviseControlLoopUninitialization(controlLoop);
+                break;
+
+            case PASSIVE:
+                superviseControlLoopPassivation(controlLoop);
+                break;
+
+            case RUNNING:
+                superviseControlLoopActivation(controlLoop);
+                break;
+
+            default:
+                exceptionOccured(Response.Status.NOT_ACCEPTABLE,
+                    "A control loop cannot be commanded to go into state " + controlLoop.getOrderedState().name());
+        }
+    }
+
+    /**
+     * Supervise a control loop uninitialisation, performing whatever actions need to be performed on the control loop,
+     * control loop ordered state is UNINITIALIZED.
+     *
+     * @param controlLoop the control loop to supervises
+     * @throws ControlLoopException on supervision errors
+     */
+    private void superviseControlLoopUninitialization(ControlLoop controlLoop) throws ControlLoopException {
+        switch (controlLoop.getState()) {
+            case UNINITIALISED:
+                exceptionOccured(Response.Status.NOT_ACCEPTABLE,
+                        CONTROL_LOOP_IS_ALREADY_IN_STATE + controlLoop.getState().name());
+                break;
+
+            case UNINITIALISED2PASSIVE:
+            case PASSIVE:
+                controlLoop.setState(ControlLoopState.PASSIVE2UNINITIALISED);
+                sendControlLoopStateChange(controlLoop);
+                break;
+
+            case PASSIVE2UNINITIALISED:
+                exceptionOccured(Response.Status.NOT_ACCEPTABLE, CONTROL_LOOP_IS_ALREADY_IN_STATE
+                        + controlLoop.getState().name() + AND_TRANSITIONING_TO_STATE + controlLoop.getOrderedState());
+                break;
+
+            default:
+                exceptionOccured(Response.Status.NOT_ACCEPTABLE, CONTROL_LOOP_CANNOT_TRANSITION_FROM_STATE
+                        + controlLoop.getState().name() + TO_STATE + controlLoop.getOrderedState());
+                break;
+        }
+    }
+
+    private void superviseControlLoopPassivation(ControlLoop controlLoop)
+            throws ControlLoopException, PfModelException {
+        switch (controlLoop.getState()) {
+            case PASSIVE:
+                exceptionOccured(Response.Status.NOT_ACCEPTABLE,
+                        CONTROL_LOOP_IS_ALREADY_IN_STATE + controlLoop.getState().name());
+                break;
+            case UNINITIALISED:
+                controlLoop.setState(ControlLoopState.UNINITIALISED2PASSIVE);
+                sendControlLoopUpdate(controlLoop);
+                break;
+
+            case UNINITIALISED2PASSIVE:
+            case RUNNING2PASSIVE:
+                exceptionOccured(Response.Status.NOT_ACCEPTABLE, CONTROL_LOOP_IS_ALREADY_IN_STATE
+                        + controlLoop.getState().name() + AND_TRANSITIONING_TO_STATE + controlLoop.getOrderedState());
+                break;
+
+            case RUNNING:
+                controlLoop.setState(ControlLoopState.RUNNING2PASSIVE);
+                sendControlLoopStateChange(controlLoop);
+                break;
+
+            default:
+                exceptionOccured(Response.Status.NOT_ACCEPTABLE, CONTROL_LOOP_CANNOT_TRANSITION_FROM_STATE
+                        + controlLoop.getState().name() + TO_STATE + controlLoop.getOrderedState());
+                break;
+        }
+    }
+
+    private void superviseControlLoopActivation(ControlLoop controlLoop) throws ControlLoopException {
+        switch (controlLoop.getState()) {
+            case RUNNING:
+                exceptionOccured(Response.Status.NOT_ACCEPTABLE,
+                        CONTROL_LOOP_IS_ALREADY_IN_STATE + controlLoop.getState().name());
+                break;
+
+            case PASSIVE2RUNNING:
+                exceptionOccured(Response.Status.NOT_ACCEPTABLE, CONTROL_LOOP_IS_ALREADY_IN_STATE
+                        + controlLoop.getState().name() + AND_TRANSITIONING_TO_STATE + controlLoop.getOrderedState());
+                break;
+
+            case PASSIVE:
+                controlLoop.setState(ControlLoopState.PASSIVE2RUNNING);
+                sendControlLoopStateChange(controlLoop);
+                break;
+
+            default:
+                exceptionOccured(Response.Status.NOT_ACCEPTABLE, CONTROL_LOOP_CANNOT_TRANSITION_FROM_STATE
+                        + controlLoop.getState().name() + TO_STATE + controlLoop.getOrderedState());
+                break;
+        }
+    }
+
+    private void sendControlLoopUpdate(ControlLoop controlLoop) throws PfModelException {
+        ParticipantControlLoopUpdate pclu = new ParticipantControlLoopUpdate();
+        pclu.setControlLoopId(controlLoop.getKey().asIdentifier());
+        pclu.setControlLoop(controlLoop);
+        // TODO: We should look up the correct TOSCA node template here for the control loop
+        // Tiny hack implemented to return the tosca service template entry from the database and be passed onto dmaap
+        commissioningProvider = CommissioningHandler.getInstance().getProvider();
+        pclu.setControlLoopDefinition(commissioningProvider.getToscaServiceTemplate(null, null));
+        controlLoopUpdatePublisher.send(pclu);
+    }
+
+    private void sendControlLoopStateChange(ControlLoop controlLoop) {
+        ParticipantControlLoopStateChange clsc = new ParticipantControlLoopStateChange();
+        clsc.setControlLoopId(controlLoop.getKey().asIdentifier());
+        clsc.setMessageId(UUID.randomUUID());
+        clsc.setOrderedState(controlLoop.getOrderedState());
+
+        controlLoopStateChangePublisher.send(clsc);
+    }
+
+    private void superviseParticipant(ParticipantStatus participantStatusMessage)
+            throws PfModelException, ControlLoopException {
+        if (participantStatusMessage.getParticipantId() == null) {
+            exceptionOccured(Response.Status.NOT_FOUND,
+                    "Participant ID on PARTICIPANT_STATUS message is null");
+        }
+
+        List<Participant> participantList =
+                participantProvider.getParticipants(participantStatusMessage.getParticipantId().getName(),
+                        participantStatusMessage.getParticipantId().getVersion());
+
+        if (CollectionUtils.isEmpty(participantList)) {
+            Participant participant = new Participant();
+            participant.setName(participantStatusMessage.getParticipantId().getName());
+            participant.setVersion(participantStatusMessage.getParticipantId().getVersion());
+            participant.setDefinition(new ToscaConceptIdentifier("unknown", "0.0.0"));
+            participant.setParticipantState(participantStatusMessage.getState());
+            participant.setHealthStatus(participantStatusMessage.getHealthStatus());
+
+            participantList.add(participant);
+            participantProvider.createParticipants(participantList);
+        } else {
+            for (Participant participant : participantList) {
+                participant.setParticipantState(participantStatusMessage.getState());
+                participant.setHealthStatus(participantStatusMessage.getHealthStatus());
+            }
+            participantProvider.updateParticipants(participantList);
+        }
+
+        monitoringProvider = MonitoringHandler.getInstance().getMonitoringProvider();
+        monitoringProvider.createParticipantStatistics(
+                                List.of(participantStatusMessage.getParticipantStatistics()));
+    }
+
+    private void superviseControlLoops(ParticipantStatus participantStatusMessage)
+            throws PfModelException, ControlLoopException {
+        if (CollectionUtils.isEmpty(participantStatusMessage.getControlLoops().getControlLoopList())) {
+            return;
+        }
+
+        for (ControlLoop controlLoop : participantStatusMessage.getControlLoops().getControlLoopList()) {
+            if (controlLoop == null) {
+                exceptionOccured(Response.Status.NOT_FOUND,
+                    "PARTICIPANT_STATUS message references unknown control loop: " + controlLoop);
+            }
+
+            ControlLoop dbControlLoop = controlLoopProvider
+                    .getControlLoop(new ToscaConceptIdentifier(controlLoop.getName(), controlLoop.getVersion()));
+            if (dbControlLoop == null) {
+                exceptionOccured(Response.Status.NOT_FOUND,
+                    "PARTICIPANT_STATUS control loop not found in database: " + controlLoop);
+            }
+
+            for (ControlLoopElement element : controlLoop.getElements().values()) {
+                ControlLoopElement dbElement = dbControlLoop.getElements().get(element.getId());
+
+                if (dbElement == null) {
+                    exceptionOccured(Response.Status.NOT_FOUND,
+                            "PARTICIPANT_STATUS message references unknown control loop element: " + element);
+                }
+
+                // Replace element entry in the database
+                dbControlLoop.getElements().put(element.getId(), element);
+            }
+            controlLoopProvider.updateControlLoop(dbControlLoop);
+        }
+
+        monitoringProvider = MonitoringHandler.getInstance().getMonitoringProvider();
+        for (ControlLoop controlLoop : participantStatusMessage.getControlLoops().getControlLoopList()) {
+            monitoringProvider.createClElementStatistics(controlLoop.getControlLoopElementStatisticsList(controlLoop));
+        }
+    }
+
+    @Override
+    public void startProviders() {
+        try {
+            manager.start();
+        } catch (final ServiceManagerException exp) {
+            throw new ControlLoopRuntimeException(Status.INTERNAL_SERVER_ERROR,
+                    "Supervision handler start of providers failed", exp);
+        }
+    }
+
+    @Override
+    public void stopProviders() {
+        try {
+            manager.stop();
+        } catch (final ServiceManagerException exp) {
+            throw new ControlLoopRuntimeException(Status.INTERNAL_SERVER_ERROR,
+                    "Supervision handler stop of providers failed", exp);
+        }
+    }
+
+    private void exceptionOccured(Response.Status status, String reason) throws ControlLoopException {
+        throw new ControlLoopException(status, reason);
+    }
+}
diff --git a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/supervision/SupervisionScanner.java b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/supervision/SupervisionScanner.java
new file mode 100644
index 0000000..0ccfddf
--- /dev/null
+++ b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/supervision/SupervisionScanner.java
@@ -0,0 +1,116 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.runtime.supervision;
+
+import java.io.Closeable;
+import java.util.Collection;
+import java.util.List;
+import java.util.TimerTask;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoop;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopElement;
+import org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider.ControlLoopProvider;
+import org.onap.policy.models.base.PfModelException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * This class is used to scan the control loops in the database and check if they are in the correct state.
+ */
+public class SupervisionScanner implements Runnable, Closeable {
+    private static final Logger LOGGER = LoggerFactory.getLogger(SupervisionScanner.class);
+
+    private ControlLoopProvider controlLoopProvider;
+    private ScheduledExecutorService timerPool;
+
+    /**
+     * Constructor for instantiating SupervisionScanner.
+     *
+     * @param controlLoopProvider the provider to use to read control loops from the database
+     * @param interval time interval to perform scans
+     */
+    public SupervisionScanner(final ControlLoopProvider controlLoopProvider, final long interval) {
+        this.controlLoopProvider = controlLoopProvider;
+
+        // Kick off the timer
+        timerPool = makeTimerPool();
+        timerPool.scheduleAtFixedRate(this, 0, interval, TimeUnit.SECONDS);
+    }
+
+    @Override
+    public void run() {
+        LOGGER.debug("Scanning control loops in the database . . .");
+
+        try {
+            for (ControlLoop controlLoop : controlLoopProvider.getControlLoops(null, null)) {
+                scanControlLoop(controlLoop);
+            }
+        } catch (PfModelException pfme) {
+            LOGGER.warn("error reading control loops from database", pfme);
+        }
+
+        LOGGER.debug("Control loop scan complete . . .");
+    }
+
+    @Override
+    public void close() {
+        timerPool.shutdown();
+    }
+
+    private void scanControlLoop(final ControlLoop controlLoop) throws PfModelException {
+        LOGGER.debug("scanning control loop {} . . .", controlLoop.getKey().asIdentifier());
+
+        if (controlLoop.getState().equals(controlLoop.getOrderedState().asState())) {
+            LOGGER.debug("control loop {} scanned, OK", controlLoop.getKey().asIdentifier());
+            return;
+        }
+
+        for (ControlLoopElement element : controlLoop.getElements().values()) {
+            if (!element.getState().equals(element.getOrderedState().asState())) {
+                LOGGER.debug("control loop scan: transitioning from state {} to {}", controlLoop.getState(),
+                        controlLoop.getOrderedState());
+                return;
+            }
+        }
+
+        LOGGER.debug("control loop scan: transition from state {} to {} completed", controlLoop.getState(),
+                controlLoop.getOrderedState());
+
+        controlLoop.setState(controlLoop.getOrderedState().asState());
+        controlLoopProvider.updateControlLoop(controlLoop);
+    }
+
+    /**
+     * Makes a new timer pool.
+     *
+     * @return a new timer pool
+     */
+    protected ScheduledExecutorService makeTimerPool() {
+        return Executors.newScheduledThreadPool(1);
+    }
+}
diff --git a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/supervision/comm/ParticipantControlLoopStateChangePublisher.java b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/supervision/comm/ParticipantControlLoopStateChangePublisher.java
new file mode 100644
index 0000000..c9c8ab8
--- /dev/null
+++ b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/supervision/comm/ParticipantControlLoopStateChangePublisher.java
@@ -0,0 +1,75 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.runtime.supervision.comm;
+
+import java.util.List;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantControlLoopStateChange;
+import org.onap.policy.common.endpoints.event.comm.TopicSink;
+import org.onap.policy.common.endpoints.event.comm.client.TopicSinkClient;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * This class is used to send ParticipantControlLoopStateChangePublisher messages to participants on DMaaP.
+ */
+public class ParticipantControlLoopStateChangePublisher {
+    private static final Logger LOGGER = LoggerFactory.getLogger(ParticipantControlLoopStateChangePublisher.class);
+
+    private TopicSinkClient topicSinkClient;
+
+    /**
+     * Constructor for instantiating ParticipantControlLoopStateChangePublisherPublisher.
+     *
+     * @param topicSinks the topic sinks
+     * @param interval time interval to send ParticipantControlLoopStateChangePublisher messages
+     */
+    public ParticipantControlLoopStateChangePublisher(final List<TopicSink> topicSinks, final long interval) {
+        // TODO: Should not be dependent on the order of topic sinks in the config
+        this.topicSinkClient = new TopicSinkClient(topicSinks.get(0));
+    }
+
+    /**
+     * Terminates the current timer.
+     */
+    public void terminate() {
+        // This is a user initiated message and doesn't need a timer.
+    }
+
+    /**
+     * Get the current time interval used by the timer task.
+     *
+     * @return interval the current time interval
+     */
+    public long getInterval() {
+        // This is a user initiated message and doesn't need a timer.
+        return -1;
+    }
+
+    /**
+     * Method to send ParticipantControlLoopStateChangePublisher status message to participants on demand.
+     *
+     * @param controlLoopStateChange the ParticipantControlLoopStateChangePublisher message
+     */
+    public void send(final ParticipantControlLoopStateChange controlLoopStateChange) {
+        topicSinkClient.send(controlLoopStateChange);
+        LOGGER.debug("Sent ParticipantControlLoopStateChange to Participants - {}", controlLoopStateChange);
+    }
+}
diff --git a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/supervision/comm/ParticipantControlLoopUpdatePublisher.java b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/supervision/comm/ParticipantControlLoopUpdatePublisher.java
new file mode 100644
index 0000000..3c5d230
--- /dev/null
+++ b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/supervision/comm/ParticipantControlLoopUpdatePublisher.java
@@ -0,0 +1,75 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.runtime.supervision.comm;
+
+import java.util.List;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantControlLoopUpdate;
+import org.onap.policy.common.endpoints.event.comm.TopicSink;
+import org.onap.policy.common.endpoints.event.comm.client.TopicSinkClient;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * This class is used to send ParticipantControlLoopUpdate messages to participants on DMaaP.
+ */
+public class ParticipantControlLoopUpdatePublisher {
+    private static final Logger LOGGER = LoggerFactory.getLogger(ParticipantControlLoopUpdatePublisher.class);
+
+    private TopicSinkClient topicSinkClient;
+
+    /**
+     * Constructor for instantiating ParticipantUpdatePublisher.
+     *
+     * @param topicSinks the topic sinks
+     * @param interval time interval to send ParticipantControlLoopUpdate messages
+     */
+    public ParticipantControlLoopUpdatePublisher(final List<TopicSink> topicSinks, final long interval) {
+        // TODO: Should not be dependent on the order of topic sinks in the config
+        this.topicSinkClient = new TopicSinkClient(topicSinks.get(0));
+    }
+
+    /**
+     * Terminates the current timer.
+     */
+    public void terminate() {
+        // This is a user initiated message and doesn't need a timer.
+    }
+
+    /**
+     * Get the current time interval used by the timer task.
+     *
+     * @return interval the current time interval
+     */
+    public long getInterval() {
+        // This is a user initiated message and doesn't need a timer.
+        return -1;
+    }
+
+    /**
+     * Method to send ParticipantControlLoopUpdate status message to participants on demand.
+     *
+     * @param participantControlLoopUpdate the ParticipantControlLoopUpdate message
+     */
+    public void send(final ParticipantControlLoopUpdate participantControlLoopUpdate) {
+        topicSinkClient.send(participantControlLoopUpdate);
+        LOGGER.debug("Sent ParticipantControlLoopUpdate to Participants - {}", participantControlLoopUpdate);
+    }
+}
diff --git a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/supervision/comm/ParticipantStateChangePublisher.java b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/supervision/comm/ParticipantStateChangePublisher.java
new file mode 100644
index 0000000..0990391
--- /dev/null
+++ b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/supervision/comm/ParticipantStateChangePublisher.java
@@ -0,0 +1,74 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.runtime.supervision.comm;
+
+import java.util.List;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantStateChange;
+import org.onap.policy.common.endpoints.event.comm.TopicSink;
+import org.onap.policy.common.endpoints.event.comm.client.TopicSinkClient;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * This class is used to send ParticipantStateChange messages to participants on DMaaP.
+ */
+public class ParticipantStateChangePublisher {
+    private static final Logger LOGGER = LoggerFactory.getLogger(ParticipantStateChangePublisher.class);
+
+    private TopicSinkClient topicSinkClient;
+
+    /**
+     * Constructor for instantiating ParticipantStateChangePublisher.
+     *
+     * @param topicSinks the topic sinks
+     * @param interval time interval to send ParticipantStateChange messages
+     */
+    public ParticipantStateChangePublisher(final List<TopicSink> topicSinks, final long interval) {
+        // TODO: Should not be dependent on the order of topic sinks in the config
+        this.topicSinkClient = new TopicSinkClient(topicSinks.get(0));
+    }
+
+    /**
+     * Terminates the current timer.
+     */
+    public void terminate() {
+        // Nothing to terminate, this publisher does not have a timer
+    }
+
+    /**
+     * Get the current time interval used by the timer task.
+     *
+     * @return interval the current time interval
+     */
+    public long getInterval() {
+        return -1;
+    }
+
+    /**
+     * Method to send ParticipantStateChange status message to participants on demand.
+     *
+     * @param participantStateChange the ParticipantStateChange message
+     */
+    public void send(final ParticipantStateChange participantStateChange) {
+        topicSinkClient.send(participantStateChange);
+        LOGGER.debug("Sent ParticipantStateChange to Participants - {}", participantStateChange);
+    }
+}
diff --git a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/supervision/comm/ParticipantStatusListener.java b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/supervision/comm/ParticipantStatusListener.java
new file mode 100644
index 0000000..a05f4aa
--- /dev/null
+++ b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/supervision/comm/ParticipantStatusListener.java
@@ -0,0 +1,53 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.runtime.supervision.comm;
+
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantStatus;
+import org.onap.policy.clamp.controlloop.runtime.supervision.SupervisionHandler;
+import org.onap.policy.common.endpoints.event.comm.Topic.CommInfrastructure;
+import org.onap.policy.common.endpoints.listeners.ScoListener;
+import org.onap.policy.common.utils.coder.StandardCoderObject;
+import org.onap.policy.common.utils.services.Registry;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Listener for ParticipantStatus messages sent by participants.
+ */
+public class ParticipantStatusListener extends ScoListener<ParticipantStatus> {
+    private static final Logger LOGGER = LoggerFactory.getLogger(ParticipantStatusListener.class);
+
+    private final SupervisionHandler supervisionHandler = Registry.get(SupervisionHandler.class.getName());
+
+    /**
+     * Constructs the object.
+     */
+    public ParticipantStatusListener() {
+        super(ParticipantStatus.class);
+    }
+
+    @Override
+    public void onTopicEvent(final CommInfrastructure infra, final String topic, final StandardCoderObject sco,
+            final ParticipantStatus participantStatusMessage) {
+        LOGGER.debug("ParticipantStatus message received from participant - {}", participantStatusMessage);
+        supervisionHandler.handleParticipantStatusMessage(participantStatusMessage);
+    }
+}
diff --git a/runtime-controlloop/src/main/resources/META-INF/persistence.xml b/runtime-controlloop/src/main/resources/META-INF/persistence.xml
new file mode 100644
index 0000000..e5d2cab
--- /dev/null
+++ b/runtime-controlloop/src/main/resources/META-INF/persistence.xml
@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ============LICENSE_START=======================================================
+   Copyright (C) 2021 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=========================================================
+-->
+<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
+    <persistence-unit name="CommissioningMariaDb" transaction-type="RESOURCE_LOCAL">
+        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
+
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaCapabilityAssignment</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaCapabilityAssignments</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaCapabilityType</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaCapabilityTypes</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaDataType</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaDataTypes</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeTemplate</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeTemplates</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeType</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeTypes</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaParameter</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicies</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicy</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicyType</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicyTypes</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaProperty</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaRelationshipType</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaRelationshipTypes</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaRequirement</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaRequirements</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaServiceTemplate</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaTopologyTemplate</class>
+        <class>org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaControlLoop</class>
+        <class>org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaControlLoopElement</class>
+        <class>org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaParticipant</class>
+        <class>org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaParticipantStatistics</class>
+        <class>org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaClElementStatistics</class>
+
+        <properties>
+            <property name="eclipselink.ddl-generation" value="create-or-extend-tables" />
+            <property name="eclipselink.ddl-generation.output-mode" value="database" />
+            <property name="eclipselink.logging.level" value="INFO" />
+
+            <!-- property name="eclipselink.logging.level" value="ALL" />
+            <property name="eclipselink.logging.level.jpa" value="ALL" />
+            <property name="eclipselink.logging.level.ddl" value="ALL" />
+            <property name="eclipselink.logging.level.connection" value="ALL" />
+            <property name="eclipselink.logging.level.sql" value="ALL" />
+            <property name="eclipselink.logging.level.transaction" value="ALL" />
+            <property name="eclipselink.logging.level.sequencing" value="ALL" />
+            <property name="eclipselink.logging.level.server" value="ALL" />
+            <property name="eclipselink.logging.level.query" value="ALL" />
+            <property name="eclipselink.logging.level.properties" value="ALL" /-->
+        </properties>
+        <shared-cache-mode>NONE</shared-cache-mode>
+    </persistence-unit>
+
+    <persistence-unit name="ToscaConceptTest" transaction-type="RESOURCE_LOCAL">
+        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
+
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaCapabilityAssignment</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaCapabilityAssignments</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaCapabilityType</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaCapabilityTypes</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaDataType</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaDataTypes</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeTemplate</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeTemplates</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeType</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeTypes</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaParameter</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicies</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicy</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicyType</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicyTypes</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaProperty</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaRelationshipType</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaRelationshipTypes</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaRequirement</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaRequirements</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaServiceTemplate</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaTopologyTemplate</class>
+        <class>org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaControlLoop</class>
+        <class>org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaControlLoopElement</class>
+        <class>org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaParticipant</class>
+        <class>org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaParticipantStatistics</class>
+        <class>org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaClElementStatistics</class>
+        <properties>
+            <property name="eclipselink.ddl-generation" value="drop-and-create-tables" />
+            <property name="eclipselink.ddl-generation.output-mode" value="database" />
+            <property name="eclipselink.logging.level" value="INFO" />
+
+            <!-- property name="eclipselink.logging.level" value="ALL" />
+            <property name="eclipselink.logging.level.jpa" value="ALL" />
+            <property name="eclipselink.logging.level.ddl" value="ALL" />
+            <property name="eclipselink.logging.level.connection" value="ALL" />
+            <property name="eclipselink.logging.level.sql" value="ALL" />
+            <property name="eclipselink.logging.level.transaction" value="ALL" />
+            <property name="eclipselink.logging.level.sequencing" value="ALL" />
+            <property name="eclipselink.logging.level.server" value="ALL" />
+            <property name="eclipselink.logging.level.query" value="ALL" />
+            <property name="eclipselink.logging.level.properties" value="ALL" /-->
+        </properties>
+        <shared-cache-mode>NONE</shared-cache-mode>
+    </persistence-unit>
+</persistence>
+
diff --git a/runtime-controlloop/src/main/resources/version.txt b/runtime-controlloop/src/main/resources/version.txt
new file mode 100644
index 0000000..e11449e
--- /dev/null
+++ b/runtime-controlloop/src/main/resources/version.txt
@@ -0,0 +1,4 @@
+ONAP Tosca defined control loop
+Version: ${project.version}
+Built (UTC): ${maven.build.timestamp}
+ONAP https://wiki.onap.org
diff --git a/runtime-controlloop/src/test/java/org/onap/policy/clamp/controlloop/runtime/commissioning/CommissioningProviderTest.java b/runtime-controlloop/src/test/java/org/onap/policy/clamp/controlloop/runtime/commissioning/CommissioningProviderTest.java
new file mode 100644
index 0000000..956b5e9
--- /dev/null
+++ b/runtime-controlloop/src/test/java/org/onap/policy/clamp/controlloop/runtime/commissioning/CommissioningProviderTest.java
@@ -0,0 +1,216 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.runtime.commissioning;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.junit.Before;
+import org.junit.Test;
+import org.onap.policy.clamp.controlloop.runtime.main.parameters.ClRuntimeParameterGroup;
+import org.onap.policy.common.utils.coder.Coder;
+import org.onap.policy.common.utils.coder.CoderException;
+import org.onap.policy.common.utils.coder.StandardCoder;
+import org.onap.policy.common.utils.coder.YamlJsonTranslator;
+import org.onap.policy.common.utils.resources.ResourceUtils;
+import org.onap.policy.models.provider.PolicyModelsProviderParameters;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeType;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
+
+public class CommissioningProviderTest {
+    private static final String TOSCA_SERVICE_TEMPLATE_YAML =
+            "src/test/resources/rest/servicetemplates/pmsh_multiple_cl_tosca.yaml";
+    private static final String TEMPLATE_IS_NULL = ".*serviceTemplate is marked non-null but is null";
+    private static final Coder CODER = new StandardCoder();
+    private static final YamlJsonTranslator yamlTranslator = new YamlJsonTranslator();
+    private static int dbNum = 0;
+    private static final Object lockit = new Object();
+    private PolicyModelsProviderParameters databaseProviderParameters;
+
+    private static String getParameterGroupAsString() {
+        dbNum++;
+        return ResourceUtils.getResourceAsString("src/test/resources/parameters/TestParameters.json")
+                .replace("jdbc:h2:mem:testdb", "jdbc:h2:mem:commissioningdb" + dbNum);
+    }
+
+    /**
+     * Sets up db provider parameters before each test.
+     *
+     * @throws CoderException .
+     */
+    @Before
+    public void setupDbProviderParameters() throws CoderException {
+        synchronized (lockit) {
+            databaseProviderParameters = CODER.decode(getParameterGroupAsString(), ClRuntimeParameterGroup.class)
+                    .getDatabaseProviderParameters();
+        }
+    }
+
+    /**
+     * Test the fetching of control loop definitions (ToscaServiceTemplates).
+     *
+     * @throws Exception .
+     */
+    @Test
+    public void testGetControlLoopDefinitions() throws Exception {
+        List<ToscaNodeTemplate> listOfTemplates;
+
+        try (CommissioningProvider provider = new CommissioningProvider(databaseProviderParameters)) {
+            ToscaServiceTemplate serviceTemplate = yamlTranslator
+                    .fromYaml(ResourceUtils.getResourceAsString(TOSCA_SERVICE_TEMPLATE_YAML),
+                            ToscaServiceTemplate.class);
+
+
+            listOfTemplates = provider.getControlLoopDefinitions(null, null);
+            assertThat(listOfTemplates).isEmpty();
+
+            provider.createControlLoopDefinitions(serviceTemplate);
+            listOfTemplates = provider.getControlLoopDefinitions(null, null);
+            assertThat(listOfTemplates).hasSize(2);
+
+            //Test Filtering
+            listOfTemplates = provider.getControlLoopDefinitions("org.onap.domain.pmsh.PMSHControlLoopDefinition",
+                    "1.2.3");
+            assertThat(listOfTemplates).hasSize(1);
+            for (ToscaNodeTemplate template : listOfTemplates) {
+                //Other CL elements contain PMSD instead of PMSH in their name
+                assertFalse(template.getName().contains("PMSD"));
+            }
+
+            //Test Wrong Name
+            listOfTemplates = provider.getControlLoopDefinitions("WrongControlLoopName", "0.0.0");
+            assertThat(listOfTemplates).isEmpty();
+        }
+    }
+
+    /**
+     * Test the creation of control loop definitions (ToscaServiceTemplates).
+     *
+     * @throws Exception .
+     */
+    @Test
+    public void testCreateControlLoopDefinitions() throws Exception {
+        List<ToscaNodeTemplate> listOfTemplates;
+
+        try (CommissioningProvider provider = new CommissioningProvider(databaseProviderParameters)) {
+            //Test Service template is null
+            assertThatThrownBy(() -> provider.createControlLoopDefinitions(null)).hasMessageMatching(TEMPLATE_IS_NULL);
+            listOfTemplates = provider.getControlLoopDefinitions(null, null);
+            assertThat(listOfTemplates).isEmpty();
+
+            ToscaServiceTemplate serviceTemplate = yamlTranslator
+                    .fromYaml(ResourceUtils.getResourceAsString(TOSCA_SERVICE_TEMPLATE_YAML),
+                            ToscaServiceTemplate.class);
+
+            // Response should return the number of node templates present in the service template
+            List<ToscaConceptIdentifier> affectedDefinitions =
+                    provider.createControlLoopDefinitions(serviceTemplate).getAffectedControlLoopDefinitions();
+            assertThat(affectedDefinitions).hasSize(13);
+            listOfTemplates = provider.getControlLoopDefinitions(null, null);
+            assertThat(listOfTemplates).hasSize(2);
+        }
+    }
+
+    /**
+     * Test the deletion of control loop definitions (ToscaServiceTemplate).
+     *
+     * @throws Exception .
+     */
+    @Test
+    public void testDeleteControlLoopDefinitions() throws Exception {
+        List<ToscaNodeTemplate> listOfTemplates;
+
+        try (CommissioningProvider provider = new CommissioningProvider(databaseProviderParameters)) {
+            ToscaServiceTemplate serviceTemplate = yamlTranslator
+                    .fromYaml(ResourceUtils.getResourceAsString(TOSCA_SERVICE_TEMPLATE_YAML),
+                            ToscaServiceTemplate.class);
+
+            listOfTemplates = provider.getControlLoopDefinitions(null, null);
+            assertThat(listOfTemplates).isEmpty();
+
+            provider.createControlLoopDefinitions(serviceTemplate);
+            listOfTemplates = provider.getControlLoopDefinitions(null, null);
+            assertThat(listOfTemplates).hasSize(2);
+
+            provider.deleteControlLoopDefinition(serviceTemplate.getName(), serviceTemplate.getVersion());
+            listOfTemplates = provider.getControlLoopDefinitions(null, null);
+            assertThat(listOfTemplates).isEmpty();
+        }
+    }
+
+    /**
+     * Test the fetching of control loop element definitions.
+     *
+     * @throws Exception .
+     */
+    @Test
+    public void testGetControlLoopElementDefinitions() throws Exception {
+        try (CommissioningProvider provider = new CommissioningProvider(databaseProviderParameters)) {
+            ToscaServiceTemplate serviceTemplate = yamlTranslator
+                    .fromYaml(ResourceUtils.getResourceAsString(TOSCA_SERVICE_TEMPLATE_YAML),
+                            ToscaServiceTemplate.class);
+
+            provider.getControlLoopDefinitions(null, null);
+
+            provider.createControlLoopDefinitions(serviceTemplate);
+            List<ToscaNodeTemplate> controlLoopDefinitionList = provider.getControlLoopDefinitions(
+                    "org.onap.domain.pmsh.PMSHControlLoopDefinition", "1.2.3");
+
+            List<ToscaNodeTemplate> controlLoopElementNodeTemplates =
+                    provider.getControlLoopElementDefinitions(controlLoopDefinitionList.get(0));
+
+            // 4 PMSH control loop elements definitions.
+            assertThat(controlLoopElementNodeTemplates).hasSize(4);
+
+            List<ToscaNodeType> derivedTypes = getDerivedNodeTypes(serviceTemplate);
+            for (ToscaNodeTemplate template : controlLoopElementNodeTemplates) {
+                assertTrue(checkNodeType(template, derivedTypes));
+            }
+        }
+    }
+
+    private boolean checkNodeType(ToscaNodeTemplate template, List<ToscaNodeType> derivedNodeTypes) {
+        String controlLoopElementType = "org.onap.policy.clamp.controlloop.ControlLoopElement";
+        for (ToscaNodeType derivedType : derivedNodeTypes) {
+            if (template.getType().equals(derivedType.getName()) || template.getType().equals(controlLoopElementType)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private List<ToscaNodeType> getDerivedNodeTypes(ToscaServiceTemplate serviceTemplate) {
+        String type = "org.onap.policy.clamp.controlloop.ControlLoopElement";
+        List<ToscaNodeType> nodeTypes = new ArrayList<>();
+        for (ToscaNodeType nodeType : serviceTemplate.getNodeTypes().values()) {
+            if (nodeType.getDerivedFrom().equals(type)) {
+                nodeTypes.add(nodeType);
+            }
+        }
+        return nodeTypes;
+    }
+}
diff --git a/runtime-controlloop/src/test/java/org/onap/policy/clamp/controlloop/runtime/commissioning/rest/CommissioningControllerTest.java b/runtime-controlloop/src/test/java/org/onap/policy/clamp/controlloop/runtime/commissioning/rest/CommissioningControllerTest.java
new file mode 100644
index 0000000..4dbb3ea
--- /dev/null
+++ b/runtime-controlloop/src/test/java/org/onap/policy/clamp/controlloop/runtime/commissioning/rest/CommissioningControllerTest.java
@@ -0,0 +1,202 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.runtime.commissioning.rest;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.List;
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.client.Invocation;
+import javax.ws.rs.core.Response;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.onap.policy.clamp.controlloop.models.messages.rest.commissioning.CommissioningResponse;
+import org.onap.policy.clamp.controlloop.runtime.util.rest.CommonRestController;
+import org.onap.policy.common.utils.coder.YamlJsonTranslator;
+import org.onap.policy.common.utils.resources.ResourceUtils;
+import org.onap.policy.models.provider.PolicyModelsProvider;
+import org.onap.policy.models.provider.PolicyModelsProviderFactory;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
+
+public class CommissioningControllerTest extends CommonRestController {
+
+    private static final String TOSCA_SERVICE_TEMPLATE_YAML =
+            "src/test/resources/rest/servicetemplates/pmsh_multiple_cl_tosca.yaml";
+    private static final YamlJsonTranslator yamlTranslator = new YamlJsonTranslator();
+    private static final String COMMISSIONING_ENDPOINT = "commission";
+    private static ToscaServiceTemplate serviceTemplate = new ToscaServiceTemplate();
+
+    /**
+     * starts Main and inserts a commissioning template.
+     *
+     * @throws Exception if an error occurs
+     */
+    @BeforeClass
+    public static void setUpBeforeClass() throws Exception {
+        CommonRestController.setUpBeforeClass("CommissioningApi");
+
+        serviceTemplate = yamlTranslator.fromYaml(ResourceUtils.getResourceAsString(TOSCA_SERVICE_TEMPLATE_YAML),
+                ToscaServiceTemplate.class);
+    }
+
+    @AfterClass
+    public static void teardownAfterClass() {
+        CommonRestController.teardownAfterClass();
+    }
+
+    @Test
+    public void testSwagger() throws Exception {
+        super.testSwagger(COMMISSIONING_ENDPOINT);
+    }
+
+    @Test
+    public void testUnauthorizedCreate() throws Exception {
+        assertUnauthorizedPost(COMMISSIONING_ENDPOINT, Entity.json(serviceTemplate));
+    }
+
+    @Test
+    public void testUnauthorizedQuery() throws Exception {
+        assertUnauthorizedGet(COMMISSIONING_ENDPOINT);
+    }
+
+    @Test
+    public void testUnauthorizedQueryElements() throws Exception {
+        assertUnauthorizedGet(COMMISSIONING_ENDPOINT + "/elements");
+    }
+
+    @Test
+    public void testUnauthorizedDelete() throws Exception {
+        assertUnauthorizedDelete(COMMISSIONING_ENDPOINT);
+    }
+
+    @Test
+    public void testCreateBadRequest() throws Exception {
+        Invocation.Builder invocationBuilder = super.sendRequest(COMMISSIONING_ENDPOINT);
+        Response resp = invocationBuilder.post(Entity.json("NotToscaServiceTempalte"));
+
+        assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
+        CommissioningResponse commissioningResponse = resp.readEntity(CommissioningResponse.class);
+        assertNotNull(commissioningResponse.getErrorDetails());
+        assertNull(commissioningResponse.getAffectedControlLoopDefinitions());
+    }
+
+    @Test
+    public void testCreate() throws Exception {
+        Invocation.Builder invocationBuilder = super.sendRequest(COMMISSIONING_ENDPOINT);
+        Response resp = invocationBuilder.post(Entity.json(serviceTemplate));
+        assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
+        CommissioningResponse commissioningResponse = resp.readEntity(CommissioningResponse.class);
+
+        assertNotNull(commissioningResponse);
+        assertNull(commissioningResponse.getErrorDetails());
+        // Response should return the number of node templates present in the service template
+        assertThat(commissioningResponse.getAffectedControlLoopDefinitions()).hasSize(13);
+        for (String nodeTemplateName : serviceTemplate.getToscaTopologyTemplate().getNodeTemplates().keySet()) {
+            assertTrue(commissioningResponse.getAffectedControlLoopDefinitions().stream()
+                    .anyMatch(ac -> ac.getName().equals(nodeTemplateName)));
+        }
+    }
+
+    @Test
+    public void testQuery_NoResultWithThisName() throws Exception {
+        createEntryInDB();
+
+        Invocation.Builder invocationBuilder = super.sendRequest(COMMISSIONING_ENDPOINT + "?name=noResultWithThisName");
+        Response rawresp = invocationBuilder.buildGet().invoke();
+        assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus());
+        List entityList = rawresp.readEntity(List.class);
+        assertThat(entityList).isEmpty();
+    }
+
+    @Test
+    public void testQuery() throws Exception {
+        createEntryInDB();
+
+        Invocation.Builder invocationBuilder = super.sendRequest(COMMISSIONING_ENDPOINT);
+        Response rawresp = invocationBuilder.buildGet().invoke();
+        assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus());
+        List entityList = rawresp.readEntity(List.class);
+        assertNotNull(entityList);
+        assertThat(entityList).hasSize(2);
+    }
+
+    @Test
+    public void testQueryElementsBadRequest() throws Exception {
+        createEntryInDB();
+
+        //Call get elements with no info
+        Invocation.Builder invocationBuilder = super.sendRequest(COMMISSIONING_ENDPOINT + "/elements");
+        Response resp = invocationBuilder.buildGet().invoke();
+        assertEquals(Response.Status.NOT_ACCEPTABLE.getStatusCode(), resp.getStatus());
+    }
+
+    @Test
+    public void testQueryElements() throws Exception {
+        createEntryInDB();
+
+        Invocation.Builder invocationBuilder = super.sendRequest(COMMISSIONING_ENDPOINT + "/elements"
+                + "?name=org.onap.domain.pmsh.PMSHControlLoopDefinition");
+        Response rawresp = invocationBuilder.buildGet().invoke();
+        assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus());
+        List entityList = rawresp.readEntity(List.class);
+        assertNotNull(entityList);
+        assertThat(entityList).hasSize(4);
+    }
+
+    @Test
+    public void testDeleteBadRequest() throws Exception {
+        createEntryInDB();
+
+        Invocation.Builder invocationBuilder = super.sendRequest(COMMISSIONING_ENDPOINT);
+        //Call delete with no info
+        Response resp = invocationBuilder.delete();
+        assertEquals(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), resp.getStatus());
+    }
+
+    @Test
+    public void testDelete() throws Exception {
+        createEntryInDB();
+
+        Invocation.Builder invocationBuilder = super.sendRequest(COMMISSIONING_ENDPOINT + "?name="
+                + serviceTemplate.getName() + "&version=" + serviceTemplate.getVersion());
+        //Call delete with no info
+        Response resp = invocationBuilder.delete();
+        assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
+
+        try (PolicyModelsProvider modelsProvider = new PolicyModelsProviderFactory()
+                .createPolicyModelsProvider(CommonRestController.getParameters())) {
+            List<ToscaServiceTemplate> templatesInDB = modelsProvider.getServiceTemplateList(null, null);
+            assertThat(templatesInDB).isEmpty();
+        }
+    }
+
+    private synchronized void createEntryInDB() throws Exception {
+        try (PolicyModelsProvider modelsProvider = new PolicyModelsProviderFactory()
+                .createPolicyModelsProvider(CommonRestController.getParameters())) {
+            modelsProvider.createServiceTemplate(serviceTemplate);
+        }
+    }
+}
diff --git a/runtime-controlloop/src/test/java/org/onap/policy/clamp/controlloop/runtime/instantiation/ControlLoopInstantiationProviderTest.java b/runtime-controlloop/src/test/java/org/onap/policy/clamp/controlloop/runtime/instantiation/ControlLoopInstantiationProviderTest.java
new file mode 100644
index 0000000..ccc54b9
--- /dev/null
+++ b/runtime-controlloop/src/test/java/org/onap/policy/clamp/controlloop/runtime/instantiation/ControlLoopInstantiationProviderTest.java
@@ -0,0 +1,370 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.runtime.instantiation;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.mockito.Mockito;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopRuntimeException;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoop;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopState;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoops;
+import org.onap.policy.clamp.controlloop.models.messages.rest.instantiation.InstantiationCommand;
+import org.onap.policy.clamp.controlloop.models.messages.rest.instantiation.InstantiationResponse;
+import org.onap.policy.clamp.controlloop.runtime.commissioning.CommissioningHandler;
+import org.onap.policy.clamp.controlloop.runtime.supervision.SupervisionHandler;
+import org.onap.policy.clamp.controlloop.runtime.util.CommonTestData;
+import org.onap.policy.common.endpoints.event.comm.TopicSink;
+import org.onap.policy.models.base.PfModelException;
+import org.onap.policy.models.provider.PolicyModelsProviderParameters;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+/**
+ * Class to perform unit test of {@link ControlLoopInstantiationProvider}}.
+ *
+ */
+public class ControlLoopInstantiationProviderTest {
+
+    private static final String CL_INSTANTIATION_CREATE_JSON = "src/test/resources/rest/controlloops/ControlLoops.json";
+    private static final String CL_INSTANTIATION_UPDATE_JSON =
+            "src/test/resources/rest/controlloops/ControlLoopsUpdate.json";
+    private static final String CL_INSTANTIATION_CHANGE_STATE_JSON =
+            "src/test/resources/rest/controlloops/PassiveCommand.json";
+    private static final String CL_INSTANTIATION_DEFINITION_NAME_NOT_FOUND_JSON =
+            "src/test/resources/rest/controlloops/ControlLoopElementsNotFound.json";
+    private static final String CL_INSTANTIATION_CONTROLLOOP_DEFINITION_NOT_FOUND_JSON =
+            "src/test/resources/rest/controlloops/ControlLoopsNotFound.json";
+    private static final String TOSCA_TEMPLATE_YAML =
+            "src/test/resources/rest/servicetemplates/pmsh_multiple_cl_tosca.yaml";
+    private static final String CONTROL_LOOP_NOT_FOUND = "Control Loop not found";
+    private static final String DELETE_BAD_REQUEST = "Control Loop State is still %s";
+    private static final String ORDERED_STATE_INVALID = "ordered state invalid or not specified on command";
+    private static final String CONTROLLOOP_ELEMENT_NAME_NOT_FOUND =
+            "\"ControlLoops\" INVALID, item has status INVALID\n"
+            + "  \"entry org.onap.domain.pmsh.PMSHControlLoopDefinition\" INVALID, item has status INVALID\n"
+            + "    \"entry org.onap.domain.pmsh.DCAEMicroservice\" INVALID, Not FOUND\n"
+            + "  \"entry org.onap.domain.pmsh.PMSHControlLoopDefinition\" INVALID, item has status INVALID\n"
+            + "    \"entry org.onap.domain.pmsh.DCAEMicroservice\" INVALID, Not FOUND\n";
+
+    private static final String CONTROLLOOP_DEFINITION_NOT_FOUND = "\"ControlLoops\" INVALID, item has status INVALID\n"
+            + "  \"entry org.onap.domain.PMSHControlLoopDefinition\" INVALID, item has status INVALID\n"
+            + "    item \"ControlLoop\" value \"org.onap.domain.PMSHControlLoopDefinition\" INVALID,"
+            + " Commissioned control loop definition not FOUND\n"
+            + "  \"entry org.onap.domain.PMSHControlLoopDefinition\" INVALID, item has status INVALID\n"
+            + "    item \"ControlLoop\" value \"org.onap.domain.PMSHControlLoopDefinition\" INVALID,"
+            + " Commissioned control loop definition not FOUND\n";
+
+    private static PolicyModelsProviderParameters databaseProviderParameters;
+    private static SupervisionHandler supervisionHandler;
+    private static CommissioningHandler commissioningHandler;
+
+    /**
+     * setup Db Provider Parameters.
+     *
+     * @throws PfModelException if an error occurs
+     */
+    @BeforeClass
+    public static void setupDbProviderParameters() throws PfModelException {
+        databaseProviderParameters =
+                CommonTestData.geParameterGroup(0, "instantproviderdb").getDatabaseProviderParameters();
+        commissioningHandler = new CommissioningHandler(CommonTestData.geParameterGroup(0, "instantproviderdb"));
+        commissioningHandler.startProviders();
+        supervisionHandler = new SupervisionHandler(CommonTestData.geParameterGroup(0, "instantproviderdb"));
+        supervisionHandler.startProviders();
+        supervisionHandler.startAndRegisterPublishers(Collections.singletonList(Mockito.mock(TopicSink.class)));
+    }
+
+    @Test
+    public void testInstantiationCrud() throws Exception {
+        ControlLoops controlLoopsCreate =
+                InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Crud");
+        ControlLoops controlLoopsDb = getControlLoopsFromDb(controlLoopsCreate);
+        assertThat(controlLoopsDb.getControlLoopList()).isEmpty();
+        try (ControlLoopInstantiationProvider instantiationProvider =
+                     new ControlLoopInstantiationProvider(databaseProviderParameters)) {
+
+            // to validate control Loop, it needs to define ToscaServiceTemplate
+            InstantiationUtils.storeToscaServiceTemplate(TOSCA_TEMPLATE_YAML, databaseProviderParameters);
+
+            InstantiationResponse instantiationResponse = instantiationProvider.createControlLoops(controlLoopsCreate);
+            InstantiationUtils.assertInstantiationResponse(instantiationResponse, controlLoopsCreate);
+
+            controlLoopsDb = getControlLoopsFromDb(controlLoopsCreate);
+            assertThat(controlLoopsDb.getControlLoopList()).isNotEmpty();
+            Assert.assertEquals(controlLoopsCreate, controlLoopsDb);
+
+            for (ControlLoop controlLoop : controlLoopsCreate.getControlLoopList()) {
+                ControlLoops controlLoopsGet =
+                        instantiationProvider.getControlLoops(controlLoop.getName(), controlLoop.getVersion());
+                assertThat(controlLoopsGet.getControlLoopList()).hasSize(1);
+                Assert.assertEquals(controlLoop, controlLoopsGet.getControlLoopList().get(0));
+            }
+
+            ControlLoops controlLoopsUpdate =
+                    InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_UPDATE_JSON, "Crud");
+            Assert.assertNotEquals(controlLoopsUpdate, controlLoopsDb);
+
+            instantiationResponse = instantiationProvider.updateControlLoops(controlLoopsUpdate);
+            InstantiationUtils.assertInstantiationResponse(instantiationResponse, controlLoopsUpdate);
+
+            controlLoopsDb = getControlLoopsFromDb(controlLoopsCreate);
+            assertThat(controlLoopsDb.getControlLoopList()).isNotEmpty();
+            Assert.assertEquals(controlLoopsUpdate, controlLoopsDb);
+
+            InstantiationCommand instantiationCommand =
+                    InstantiationUtils.getInstantiationCommandFromResource(CL_INSTANTIATION_CHANGE_STATE_JSON, "Crud");
+            instantiationResponse = instantiationProvider.issueControlLoopCommand(instantiationCommand);
+            InstantiationUtils.assertInstantiationResponse(instantiationResponse, instantiationCommand);
+
+            for (ToscaConceptIdentifier toscaConceptIdentifier : instantiationCommand.getControlLoopIdentifierList()) {
+                ControlLoops controlLoopsGet = instantiationProvider.getControlLoops(toscaConceptIdentifier.getName(),
+                        toscaConceptIdentifier.getVersion());
+                assertThat(controlLoopsGet.getControlLoopList()).hasSize(1);
+                Assert.assertEquals(instantiationCommand.getOrderedState(),
+                        controlLoopsGet.getControlLoopList().get(0).getOrderedState());
+            }
+
+            // in order to delete a controlLoop the state must be UNINITIALISED
+            controlLoopsCreate.getControlLoopList().forEach(cl -> cl.setState(ControlLoopState.UNINITIALISED));
+            instantiationProvider.updateControlLoops(controlLoopsCreate);
+
+            for (ControlLoop controlLoop : controlLoopsCreate.getControlLoopList()) {
+                instantiationProvider.deleteControlLoop(controlLoop.getName(), controlLoop.getVersion());
+            }
+
+            controlLoopsDb = getControlLoopsFromDb(controlLoopsCreate);
+            assertThat(controlLoopsDb.getControlLoopList()).isEmpty();
+        }
+    }
+
+    private ControlLoops getControlLoopsFromDb(ControlLoops controlLoopsSource) throws Exception {
+        ControlLoops controlLoopsDb = new ControlLoops();
+        controlLoopsDb.setControlLoopList(new ArrayList<>());
+
+        try (ControlLoopInstantiationProvider instantiationProvider =
+                     new ControlLoopInstantiationProvider(databaseProviderParameters)) {
+
+            for (ControlLoop controlLoop : controlLoopsSource.getControlLoopList()) {
+                ControlLoops controlLoopsFromDb =
+                        instantiationProvider.getControlLoops(controlLoop.getName(), controlLoop.getVersion());
+                controlLoopsDb.getControlLoopList().addAll(controlLoopsFromDb.getControlLoopList());
+            }
+            return controlLoopsDb;
+        }
+    }
+
+    @Test
+    public void testInstantiationDelete() throws Exception {
+        ControlLoops controlLoops =
+                InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Delete");
+        assertThat(getControlLoopsFromDb(controlLoops).getControlLoopList()).isEmpty();
+
+        ControlLoop controlLoop0 = controlLoops.getControlLoopList().get(0);
+
+        try (ControlLoopInstantiationProvider instantiationProvider =
+                     new ControlLoopInstantiationProvider(databaseProviderParameters)) {
+
+            // to validate control Loop, it needs to define ToscaServiceTemplate
+            InstantiationUtils.storeToscaServiceTemplate(TOSCA_TEMPLATE_YAML, databaseProviderParameters);
+
+            assertThatThrownBy(
+                    () -> instantiationProvider.deleteControlLoop(controlLoop0.getName(), controlLoop0.getVersion()))
+                    .hasMessageMatching(CONTROL_LOOP_NOT_FOUND);
+
+            InstantiationUtils.assertInstantiationResponse(instantiationProvider.createControlLoops(controlLoops),
+                    controlLoops);
+
+            for (ControlLoopState state : ControlLoopState.values()) {
+                if (!ControlLoopState.UNINITIALISED.equals(state)) {
+                    assertThatDeleteThrownBy(controlLoops, state);
+                }
+            }
+
+            controlLoop0.setState(ControlLoopState.UNINITIALISED);
+            instantiationProvider.updateControlLoops(controlLoops);
+
+            for (ControlLoop controlLoop : controlLoops.getControlLoopList()) {
+                instantiationProvider.deleteControlLoop(controlLoop.getName(), controlLoop.getVersion());
+            }
+
+            for (ControlLoop controlLoop : controlLoops.getControlLoopList()) {
+                ControlLoops controlLoopsGet =
+                        instantiationProvider.getControlLoops(controlLoop.getName(), controlLoop.getVersion());
+                assertThat(controlLoopsGet.getControlLoopList()).isEmpty();
+            }
+        }
+    }
+
+    private void assertThatDeleteThrownBy(ControlLoops controlLoops, ControlLoopState state) throws Exception {
+        ControlLoop controlLoop = controlLoops.getControlLoopList().get(0);
+
+        controlLoop.setState(state);
+
+        try (ControlLoopInstantiationProvider instantiationProvider =
+                     new ControlLoopInstantiationProvider(databaseProviderParameters)) {
+
+            instantiationProvider.updateControlLoops(controlLoops);
+            assertThatThrownBy(
+                    () -> instantiationProvider.deleteControlLoop(controlLoop.getName(), controlLoop.getVersion()))
+                    .hasMessageMatching(String.format(DELETE_BAD_REQUEST, state));
+        }
+    }
+
+    @Test
+    public void testCreateControlLoops_NoDuplicates() throws Exception {
+        ControlLoops controlLoopsCreate =
+                InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "NoDuplicates");
+
+        ControlLoops controlLoopsDb = getControlLoopsFromDb(controlLoopsCreate);
+        assertThat(controlLoopsDb.getControlLoopList()).isEmpty();
+
+        try (ControlLoopInstantiationProvider instantiationProvider =
+                     new ControlLoopInstantiationProvider(databaseProviderParameters)) {
+
+            // to validate control Loop, it needs to define ToscaServiceTemplate
+            InstantiationUtils.storeToscaServiceTemplate(TOSCA_TEMPLATE_YAML, databaseProviderParameters);
+
+            InstantiationResponse instantiationResponse = instantiationProvider.createControlLoops(controlLoopsCreate);
+            InstantiationUtils.assertInstantiationResponse(instantiationResponse, controlLoopsCreate);
+
+            assertThatThrownBy(() -> instantiationProvider.createControlLoops(controlLoopsCreate)).hasMessageMatching(
+                    controlLoopsCreate.getControlLoopList().get(0).getKey().asIdentifier() + " already defined");
+
+            for (ControlLoop controlLoop : controlLoopsCreate.getControlLoopList()) {
+                instantiationProvider.deleteControlLoop(controlLoop.getName(), controlLoop.getVersion());
+            }
+        }
+    }
+
+    @Test
+    public void testCreateControlLoops_CommissionedClElementNotFound() throws Exception {
+        ControlLoops controlLoops = InstantiationUtils
+                .getControlLoopsFromResource(CL_INSTANTIATION_DEFINITION_NAME_NOT_FOUND_JSON, "ClElementNotFound");
+
+        try (ControlLoopInstantiationProvider provider =
+                     new ControlLoopInstantiationProvider(databaseProviderParameters)) {
+
+            // to validate control Loop, it needs to define ToscaServiceTemplate
+            InstantiationUtils.storeToscaServiceTemplate(TOSCA_TEMPLATE_YAML, databaseProviderParameters);
+
+            assertThat(getControlLoopsFromDb(controlLoops).getControlLoopList()).isEmpty();
+
+            assertThatThrownBy(() -> provider.createControlLoops(controlLoops))
+                    .hasMessageMatching(CONTROLLOOP_ELEMENT_NAME_NOT_FOUND);
+        }
+    }
+
+    @Test
+    public void testCreateControlLoops_CommissionedClNotFound() throws Exception {
+        ControlLoops controlLoops = InstantiationUtils
+                .getControlLoopsFromResource(CL_INSTANTIATION_CONTROLLOOP_DEFINITION_NOT_FOUND_JSON, "ClNotFound");
+
+        assertThat(getControlLoopsFromDb(controlLoops).getControlLoopList()).isEmpty();
+
+        try (ControlLoopInstantiationProvider provider =
+                     new ControlLoopInstantiationProvider(databaseProviderParameters)) {
+            assertThatThrownBy(() -> provider.createControlLoops(controlLoops))
+                    .hasMessageMatching(CONTROLLOOP_DEFINITION_NOT_FOUND);
+        }
+    }
+
+    @Test
+    public void testIssueControlLoopCommand_OrderedStateInvalid() throws ControlLoopRuntimeException, IOException {
+        try (ControlLoopInstantiationProvider instantiationProvider =
+                     new ControlLoopInstantiationProvider(databaseProviderParameters)) {
+            assertThatThrownBy(() -> instantiationProvider.issueControlLoopCommand(new InstantiationCommand()))
+                    .hasMessageMatching(ORDERED_STATE_INVALID);
+        }
+    }
+
+    @Test
+    public void testInstantiationVersions() throws Exception {
+
+        // create controlLoops V1
+        ControlLoops controlLoopsV1 =
+                InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "V1");
+        assertThat(getControlLoopsFromDb(controlLoopsV1).getControlLoopList()).isEmpty();
+
+        try (ControlLoopInstantiationProvider instantiationProvider =
+                     new ControlLoopInstantiationProvider(databaseProviderParameters)) {
+
+            // to validate control Loop, it needs to define ToscaServiceTemplate
+            InstantiationUtils.storeToscaServiceTemplate(TOSCA_TEMPLATE_YAML, databaseProviderParameters);
+
+            InstantiationUtils.assertInstantiationResponse(instantiationProvider.createControlLoops(controlLoopsV1),
+                    controlLoopsV1);
+
+            // create controlLoops V2
+            ControlLoops controlLoopsV2 =
+                    InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "V2");
+            assertThat(getControlLoopsFromDb(controlLoopsV2).getControlLoopList()).isEmpty();
+            InstantiationUtils.assertInstantiationResponse(instantiationProvider.createControlLoops(controlLoopsV2),
+                    controlLoopsV2);
+
+            // GET controlLoops V2
+            for (ControlLoop controlLoop : controlLoopsV2.getControlLoopList()) {
+                ControlLoops controlLoopsGet =
+                        instantiationProvider.getControlLoops(controlLoop.getName(), controlLoop.getVersion());
+                assertThat(controlLoopsGet.getControlLoopList()).hasSize(1);
+                Assert.assertEquals(controlLoop, controlLoopsGet.getControlLoopList().get(0));
+            }
+
+            // DELETE controlLoops V1
+            for (ControlLoop controlLoop : controlLoopsV1.getControlLoopList()) {
+                instantiationProvider.deleteControlLoop(controlLoop.getName(), controlLoop.getVersion());
+            }
+
+            // GET controlLoops V1 is not available
+            for (ControlLoop controlLoop : controlLoopsV1.getControlLoopList()) {
+                ControlLoops controlLoopsGet =
+                        instantiationProvider.getControlLoops(controlLoop.getName(), controlLoop.getVersion());
+                assertThat(controlLoopsGet.getControlLoopList()).isEmpty();
+            }
+
+            // GET controlLoops V2 is still available
+            for (ControlLoop controlLoop : controlLoopsV2.getControlLoopList()) {
+                ControlLoops controlLoopsGet =
+                        instantiationProvider.getControlLoops(controlLoop.getName(), controlLoop.getVersion());
+                assertThat(controlLoopsGet.getControlLoopList()).hasSize(1);
+                Assert.assertEquals(controlLoop, controlLoopsGet.getControlLoopList().get(0));
+            }
+
+            // DELETE controlLoops V2
+            for (ControlLoop controlLoop : controlLoopsV2.getControlLoopList()) {
+                instantiationProvider.deleteControlLoop(controlLoop.getName(), controlLoop.getVersion());
+            }
+
+            // GET controlLoops V2 is not available
+            for (ControlLoop controlLoop : controlLoopsV2.getControlLoopList()) {
+                ControlLoops controlLoopsGet =
+                        instantiationProvider.getControlLoops(controlLoop.getName(), controlLoop.getVersion());
+                assertThat(controlLoopsGet.getControlLoopList()).isEmpty();
+            }
+        }
+    }
+}
diff --git a/runtime-controlloop/src/test/java/org/onap/policy/clamp/controlloop/runtime/instantiation/InstantiationUtils.java b/runtime-controlloop/src/test/java/org/onap/policy/clamp/controlloop/runtime/instantiation/InstantiationUtils.java
new file mode 100644
index 0000000..958d91d
--- /dev/null
+++ b/runtime-controlloop/src/test/java/org/onap/policy/clamp/controlloop/runtime/instantiation/InstantiationUtils.java
@@ -0,0 +1,149 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.runtime.instantiation;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import org.junit.Assert;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoop;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoops;
+import org.onap.policy.clamp.controlloop.models.messages.rest.instantiation.InstantiationCommand;
+import org.onap.policy.clamp.controlloop.models.messages.rest.instantiation.InstantiationResponse;
+import org.onap.policy.common.utils.coder.Coder;
+import org.onap.policy.common.utils.coder.CoderException;
+import org.onap.policy.common.utils.coder.StandardCoder;
+import org.onap.policy.common.utils.coder.YamlJsonTranslator;
+import org.onap.policy.common.utils.resources.ResourceUtils;
+import org.onap.policy.models.base.PfModelException;
+import org.onap.policy.models.provider.PolicyModelsProvider;
+import org.onap.policy.models.provider.PolicyModelsProviderFactory;
+import org.onap.policy.models.provider.PolicyModelsProviderParameters;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
+
+/**
+ * Utility methods supporting tests for Instantiation.
+ */
+public class InstantiationUtils {
+
+    private static final Coder CODER = new StandardCoder();
+    private static final YamlJsonTranslator yamlTranslator = new YamlJsonTranslator();
+
+    /**
+     * Gets the ControlLoops from Resource.
+     *
+     * @param path path of the resource
+     * @param suffix suffix to add to all names in ControlLoops
+     * @return the ControlLoops from Resource
+     * @throws CoderException if an error occurs
+     */
+    public static ControlLoops getControlLoopsFromResource(final String path, final String suffix)
+            throws CoderException {
+        ControlLoops controlLoops = CODER.decode(new File(path), ControlLoops.class);
+
+        // add suffix to all names
+        controlLoops.getControlLoopList().forEach(controlLoop -> controlLoop.setName(controlLoop.getName() + suffix));
+        return controlLoops;
+    }
+
+    /**
+     * Gets InstantiationCommand from Resource.
+     *
+     * @param path path of the resource
+     * @param suffix suffix to add to all names in ControlLoops
+     * @return the InstantiationCommand
+     * @throws CoderException if an error occurs
+     */
+    public static InstantiationCommand getInstantiationCommandFromResource(final String path, final String suffix)
+            throws CoderException {
+        InstantiationCommand instantiationCommand = CODER.decode(new File(path), InstantiationCommand.class);
+
+        // add suffix to all names
+        instantiationCommand.getControlLoopIdentifierList().forEach(cl -> cl.setName(cl.getName() + suffix));
+        return instantiationCommand;
+    }
+
+    /**
+     * Assert that Instantiation Response contains proper ControlLoops.
+     *
+     * @param response InstantiationResponse
+     * @param controlLoops ControlLoops
+     */
+    public static void assertInstantiationResponse(InstantiationResponse response, ControlLoops controlLoops) {
+        assertNotNull(response);
+        Assert.assertNull(response.getErrorDetails());
+        assertEquals(response.getAffectedControlLoops().size(), controlLoops.getControlLoopList().size());
+        for (ControlLoop controlLoop : controlLoops.getControlLoopList()) {
+            assertTrue(response.getAffectedControlLoops().stream()
+                    .filter(ac -> ac.equals(controlLoop.getKey().asIdentifier())).findAny().isPresent());
+        }
+    }
+
+    /**
+     * Assert that Instantiation Response contains proper ControlLoops.
+     *
+     * @param response InstantiationResponse
+     * @param command InstantiationCommand
+     */
+    public static void assertInstantiationResponse(InstantiationResponse response, InstantiationCommand command) {
+        assertNotNull(response);
+        assertEquals(response.getAffectedControlLoops().size(), command.getControlLoopIdentifierList().size());
+        for (ToscaConceptIdentifier toscaConceptIdentifier : command.getControlLoopIdentifierList()) {
+            assertTrue(response.getAffectedControlLoops().stream()
+                    .filter(ac -> ac.compareTo(toscaConceptIdentifier) == 0).findAny().isPresent());
+        }
+    }
+
+    /**
+     * Assert that Instantiation Response contains ControlLoop equals to controlLoop.
+     *
+     * @param response InstantiationResponse
+     * @param controlLoop ControlLoop
+     */
+    public static void assertInstantiationResponse(InstantiationResponse response, ControlLoop controlLoop) {
+        assertNotNull(response);
+        Assert.assertNull(response.getErrorDetails());
+        assertEquals(1, response.getAffectedControlLoops().size());
+        assertEquals(0, response.getAffectedControlLoops().get(0).compareTo(controlLoop.getKey().asIdentifier()));
+    }
+
+    /**
+     * Store ToscaServiceTemplate from resource to DB.
+     *
+     * @param path path of the resource
+     * @param parameters The parameters for the implementation of the PolicyModelProvider
+     * @throws PfModelException if an error occurs
+     */
+    public static void storeToscaServiceTemplate(String path, PolicyModelsProviderParameters parameters)
+            throws PfModelException {
+
+        ToscaServiceTemplate template =
+                yamlTranslator.fromYaml(ResourceUtils.getResourceAsString(path), ToscaServiceTemplate.class);
+
+        try (PolicyModelsProvider modelsProvider =
+                new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters)) {
+            modelsProvider.createServiceTemplate(template);
+        }
+    }
+}
diff --git a/runtime-controlloop/src/test/java/org/onap/policy/clamp/controlloop/runtime/instantiation/rest/InstantiationControllerTest.java b/runtime-controlloop/src/test/java/org/onap/policy/clamp/controlloop/runtime/instantiation/rest/InstantiationControllerTest.java
new file mode 100644
index 0000000..71e7624
--- /dev/null
+++ b/runtime-controlloop/src/test/java/org/onap/policy/clamp/controlloop/runtime/instantiation/rest/InstantiationControllerTest.java
@@ -0,0 +1,322 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.runtime.instantiation.rest;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.client.Invocation;
+import javax.ws.rs.core.Response;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoop;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoops;
+import org.onap.policy.clamp.controlloop.models.messages.rest.instantiation.InstantiationCommand;
+import org.onap.policy.clamp.controlloop.models.messages.rest.instantiation.InstantiationResponse;
+import org.onap.policy.clamp.controlloop.runtime.instantiation.ControlLoopInstantiationProvider;
+import org.onap.policy.clamp.controlloop.runtime.instantiation.InstantiationUtils;
+import org.onap.policy.clamp.controlloop.runtime.util.rest.CommonRestController;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+/**
+ * Class to perform unit test of {@link InstantiationController}}.
+ *
+ */
+public class InstantiationControllerTest extends CommonRestController {
+
+    private static final String CL_INSTANTIATION_CREATE_JSON = "src/test/resources/rest/controlloops/ControlLoops.json";
+
+    private static final String CL_INSTANTIATION_UPDATE_JSON =
+            "src/test/resources/rest/controlloops/ControlLoopsUpdate.json";
+
+    private static final String CL_INSTANTIATION_CHANGE_STATE_JSON =
+            "src/test/resources/rest/controlloops/PassiveCommand.json";
+
+    private static final String TOSCA_TEMPLATE_YAML =
+            "src/test/resources/rest/servicetemplates/pmsh_multiple_cl_tosca.yaml";
+
+    private static final String INSTANTIATION_ENDPOINT = "instantiation";
+
+    private static final String INSTANTIATION_COMMAND_ENDPOINT = "instantiation/command";
+
+    /**
+     * starts Main and inserts a commissioning template.
+     *
+     * @throws Exception if an error occurs
+     */
+    @BeforeClass
+    public static void setUpBeforeClass() throws Exception {
+        CommonRestController.setUpBeforeClass("InstApi");
+
+        // to validate control Loop, it needs to define ToscaServiceTemplate
+        InstantiationUtils.storeToscaServiceTemplate(TOSCA_TEMPLATE_YAML, getParameters());
+
+        ControlLoops controlLoops =
+                InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Command");
+        try (ControlLoopInstantiationProvider instantiationProvider =
+                new ControlLoopInstantiationProvider(getParameters())) {
+            instantiationProvider.createControlLoops(controlLoops);
+        }
+    }
+
+    @AfterClass
+    public static void teardownAfterClass() {
+        CommonRestController.teardownAfterClass();
+    }
+
+    @Test
+    public void testSwagger() throws Exception {
+        super.testSwagger(INSTANTIATION_ENDPOINT);
+    }
+
+    @Test
+    public void testCreate_Unauthorized() throws Exception {
+        ControlLoops controlLoops =
+                InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Unauthorized");
+
+        assertUnauthorizedPost(INSTANTIATION_ENDPOINT, Entity.json(controlLoops));
+    }
+
+    @Test
+    public void testQuery_Unauthorized() throws Exception {
+        assertUnauthorizedGet(INSTANTIATION_ENDPOINT);
+    }
+
+    @Test
+    public void testUpdate_Unauthorized() throws Exception {
+        ControlLoops controlLoops =
+                InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_UPDATE_JSON, "Unauthorized");
+
+        assertUnauthorizedPut(INSTANTIATION_ENDPOINT, Entity.json(controlLoops));
+    }
+
+    @Test
+    public void testDelete_Unauthorized() throws Exception {
+        assertUnauthorizedDelete(INSTANTIATION_ENDPOINT);
+    }
+
+    @Test
+    public void testCommand_Unauthorized() throws Exception {
+        InstantiationCommand instantiationCommand = InstantiationUtils
+                .getInstantiationCommandFromResource(CL_INSTANTIATION_CHANGE_STATE_JSON, "Unauthorized");
+
+        assertUnauthorizedPut(INSTANTIATION_COMMAND_ENDPOINT, Entity.json(instantiationCommand));
+    }
+
+    @Test
+    public void testCreate() throws Exception {
+        ControlLoops controlLoopsFromRsc =
+                InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Create");
+
+        Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT);
+        Response resp = invocationBuilder.post(Entity.json(controlLoopsFromRsc));
+        assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
+        InstantiationResponse instResponse = resp.readEntity(InstantiationResponse.class);
+        InstantiationUtils.assertInstantiationResponse(instResponse, controlLoopsFromRsc);
+
+        try (ControlLoopInstantiationProvider instantiationProvider =
+                new ControlLoopInstantiationProvider(getParameters())) {
+            for (ControlLoop controlLoopFromRsc : controlLoopsFromRsc.getControlLoopList()) {
+                ControlLoops controlLoopsFromDb = instantiationProvider.getControlLoops(
+                        controlLoopFromRsc.getKey().getName(), controlLoopFromRsc.getKey().getVersion());
+
+                assertNotNull(controlLoopsFromDb);
+                assertThat(controlLoopsFromDb.getControlLoopList()).hasSize(1);
+                assertEquals(controlLoopFromRsc, controlLoopsFromDb.getControlLoopList().get(0));
+            }
+        }
+    }
+
+    @Test
+    public void testCreateBadRequest() throws Exception {
+        ControlLoops controlLoopsFromRsc =
+                InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "CreateBadRequest");
+
+        Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT);
+        Response resp = invocationBuilder.post(Entity.json(controlLoopsFromRsc));
+        assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
+
+        // testing Bad Request: CL already defined
+        resp = invocationBuilder.post(Entity.json(controlLoopsFromRsc));
+        assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
+        InstantiationResponse instResponse = resp.readEntity(InstantiationResponse.class);
+        assertNotNull(instResponse.getErrorDetails());
+        assertNull(instResponse.getAffectedControlLoops());
+    }
+
+    @Test
+    public void testQuery_NoResultWithThisName() throws Exception {
+        Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT + "?name=noResultWithThisName");
+        Response rawresp = invocationBuilder.buildGet().invoke();
+        assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus());
+        ControlLoops resp = rawresp.readEntity(ControlLoops.class);
+        assertThat(resp.getControlLoopList()).isEmpty();
+    }
+
+    @Test
+    public void testQuery() throws Exception {
+        // inserts a ControlLoops to DB
+        ControlLoops controlLoops =
+                InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Query");
+        try (ControlLoopInstantiationProvider instantiationProvider =
+                new ControlLoopInstantiationProvider(getParameters())) {
+            instantiationProvider.createControlLoops(controlLoops);
+        }
+
+        for (ControlLoop controlLoopFromRsc : controlLoops.getControlLoopList()) {
+            Invocation.Builder invocationBuilder =
+                    super.sendRequest(INSTANTIATION_ENDPOINT + "?name=" + controlLoopFromRsc.getKey().getName());
+            Response rawresp = invocationBuilder.buildGet().invoke();
+            assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus());
+            ControlLoops controlLoopsQuery = rawresp.readEntity(ControlLoops.class);
+            assertNotNull(controlLoopsQuery);
+            assertThat(controlLoopsQuery.getControlLoopList()).hasSize(1);
+            assertEquals(controlLoopFromRsc, controlLoopsQuery.getControlLoopList().get(0));
+        }
+    }
+
+    @Test
+    public void testUpdate() throws Exception {
+        ControlLoops controlLoopsCreate =
+                InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Update");
+
+        ControlLoops controlLoops =
+                InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_UPDATE_JSON, "Update");
+
+        try (ControlLoopInstantiationProvider instantiationProvider =
+                new ControlLoopInstantiationProvider(getParameters())) {
+            instantiationProvider.createControlLoops(controlLoopsCreate);
+
+            Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT);
+            Response resp = invocationBuilder.put(Entity.json(controlLoops));
+            assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
+
+            InstantiationResponse instResponse = resp.readEntity(InstantiationResponse.class);
+            InstantiationUtils.assertInstantiationResponse(instResponse, controlLoops);
+
+            for (ControlLoop controlLoopUpdate : controlLoops.getControlLoopList()) {
+                ControlLoops controlLoopsFromDb = instantiationProvider
+                        .getControlLoops(controlLoopUpdate.getKey().getName(), controlLoopUpdate.getKey().getVersion());
+
+                assertNotNull(controlLoopsFromDb);
+                assertThat(controlLoopsFromDb.getControlLoopList()).hasSize(1);
+                assertEquals(controlLoopUpdate, controlLoopsFromDb.getControlLoopList().get(0));
+            }
+        }
+    }
+
+    @Test
+    public void testDelete_NoResultWithThisName() throws Exception {
+        Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT + "?name=noResultWithThisName");
+        Response resp = invocationBuilder.delete();
+        assertEquals(Response.Status.NOT_FOUND.getStatusCode(), resp.getStatus());
+        InstantiationResponse instResponse = resp.readEntity(InstantiationResponse.class);
+        assertNotNull(instResponse.getErrorDetails());
+        assertNull(instResponse.getAffectedControlLoops());
+    }
+
+    @Test
+    public void testDelete() throws Exception {
+        ControlLoops controlLoopsFromRsc =
+                InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Delete");
+        try (ControlLoopInstantiationProvider instantiationProvider =
+                new ControlLoopInstantiationProvider(getParameters())) {
+            instantiationProvider.createControlLoops(controlLoopsFromRsc);
+
+            for (ControlLoop controlLoopFromRsc : controlLoopsFromRsc.getControlLoopList()) {
+                Invocation.Builder invocationBuilder =
+                        super.sendRequest(INSTANTIATION_ENDPOINT + "?name=" + controlLoopFromRsc.getKey().getName()
+                                + "&version=" + controlLoopFromRsc.getKey().getVersion());
+                Response resp = invocationBuilder.delete();
+                assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
+                InstantiationResponse instResponse = resp.readEntity(InstantiationResponse.class);
+                InstantiationUtils.assertInstantiationResponse(instResponse, controlLoopFromRsc);
+
+                ControlLoops controlLoopsFromDb = instantiationProvider.getControlLoops(
+                        controlLoopFromRsc.getKey().getName(), controlLoopFromRsc.getKey().getVersion());
+                assertThat(controlLoopsFromDb.getControlLoopList()).isEmpty();
+            }
+        }
+    }
+
+    @Test
+    public void testDeleteBadRequest() throws Exception {
+        ControlLoops controlLoopsFromRsc =
+                InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "DelBadRequest");
+        try (ControlLoopInstantiationProvider instantiationProvider =
+                new ControlLoopInstantiationProvider(getParameters())) {
+            instantiationProvider.createControlLoops(controlLoopsFromRsc);
+
+            for (ControlLoop controlLoopFromRsc : controlLoopsFromRsc.getControlLoopList()) {
+                Invocation.Builder invocationBuilder =
+                        super.sendRequest(INSTANTIATION_ENDPOINT + "?name=" + controlLoopFromRsc.getKey().getName());
+                Response resp = invocationBuilder.delete();
+                // should be BAD_REQUEST
+                assertEquals(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), resp.getStatus());
+            }
+        }
+    }
+
+    @Test
+    public void testCommand_NotFound1() throws Exception {
+        Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_COMMAND_ENDPOINT);
+        Response resp = invocationBuilder.put(Entity.json(new InstantiationCommand()));
+        assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
+    }
+
+    @Test
+    public void testCommand_NotFound2() throws Exception {
+        InstantiationCommand command =
+                InstantiationUtils.getInstantiationCommandFromResource(CL_INSTANTIATION_CHANGE_STATE_JSON, "Command");
+        command.setOrderedState(null);
+
+        Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_COMMAND_ENDPOINT);
+        Response resp = invocationBuilder.put(Entity.json(command));
+        assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
+    }
+
+    @Test
+    public void testCommand() throws Exception {
+        InstantiationCommand command =
+                InstantiationUtils.getInstantiationCommandFromResource(CL_INSTANTIATION_CHANGE_STATE_JSON, "Command");
+
+        Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_COMMAND_ENDPOINT);
+        Response resp = invocationBuilder.put(Entity.json(command));
+        assertEquals(Response.Status.ACCEPTED.getStatusCode(), resp.getStatus());
+        InstantiationResponse instResponse = resp.readEntity(InstantiationResponse.class);
+        InstantiationUtils.assertInstantiationResponse(instResponse, command);
+
+        // check passive state on DB
+        try (ControlLoopInstantiationProvider instantiationProvider =
+                new ControlLoopInstantiationProvider(getParameters())) {
+            for (ToscaConceptIdentifier toscaConceptIdentifier : command.getControlLoopIdentifierList()) {
+                ControlLoops controlLoopsGet = instantiationProvider.getControlLoops(toscaConceptIdentifier.getName(),
+                        toscaConceptIdentifier.getVersion());
+                assertThat(controlLoopsGet.getControlLoopList()).hasSize(1);
+                assertEquals(command.getOrderedState(), controlLoopsGet.getControlLoopList().get(0).getOrderedState());
+            }
+        }
+    }
+}
diff --git a/runtime-controlloop/src/test/java/org/onap/policy/clamp/controlloop/runtime/main/rest/RestControllerTest.java b/runtime-controlloop/src/test/java/org/onap/policy/clamp/controlloop/runtime/main/rest/RestControllerTest.java
new file mode 100644
index 0000000..4f68b4f
--- /dev/null
+++ b/runtime-controlloop/src/test/java/org/onap/policy/clamp/controlloop/runtime/main/rest/RestControllerTest.java
@@ -0,0 +1,71 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.runtime.main.rest;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.util.UUID;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import org.junit.Test;
+
+/**
+ * Class to perform unit test of {@link RestController}}.
+ *
+ */
+public class RestControllerTest {
+
+    @Test
+    public void testProduces() {
+        Produces annotation = RestController.class.getAnnotation(Produces.class);
+        assertNotNull(annotation);
+        assertThat(annotation.value()).contains(MediaType.APPLICATION_JSON)
+                        .contains(RestController.APPLICATION_YAML);
+    }
+
+    @Test
+    public void testAddVersionControlHeaders() {
+        RestController ctlr = new RestController();
+        Response resp = ctlr.addVersionControlHeaders(Response.status(Response.Status.OK)).build();
+        assertEquals("0", resp.getHeaderString(RestController.VERSION_MINOR_NAME));
+        assertEquals("0", resp.getHeaderString(RestController.VERSION_PATCH_NAME));
+        assertEquals("1.0.0", resp.getHeaderString(RestController.VERSION_LATEST_NAME));
+    }
+
+    @Test
+    public void testAddLoggingHeaders_Null() {
+        RestController ctlr = new RestController();
+        Response resp = ctlr.addLoggingHeaders(Response.status(Response.Status.OK), null).build();
+        assertNotNull(resp.getHeaderString(RestController.REQUEST_ID_NAME));
+    }
+
+    @Test
+    public void testAddLoggingHeaders_NonNull() {
+        UUID uuid = UUID.randomUUID();
+        RestController ctlr = new RestController();
+        Response resp = ctlr.addLoggingHeaders(Response.status(Response.Status.OK), uuid).build();
+        assertEquals(uuid.toString(), resp.getHeaderString(RestController.REQUEST_ID_NAME));
+    }
+
+}
diff --git a/runtime-controlloop/src/test/java/org/onap/policy/clamp/controlloop/runtime/main/startstop/ClRuntimeActivatorTest.java b/runtime-controlloop/src/test/java/org/onap/policy/clamp/controlloop/runtime/main/startstop/ClRuntimeActivatorTest.java
new file mode 100644
index 0000000..da71c23
--- /dev/null
+++ b/runtime-controlloop/src/test/java/org/onap/policy/clamp/controlloop/runtime/main/startstop/ClRuntimeActivatorTest.java
@@ -0,0 +1,82 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.runtime.main.startstop;
+
+import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
+import static org.assertj.core.api.Assertions.assertThatIllegalStateException;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopRuntimeException;
+import org.onap.policy.clamp.controlloop.runtime.main.parameters.ClRuntimeParameterGroup;
+import org.onap.policy.clamp.controlloop.runtime.main.parameters.ClRuntimeParameterHandler;
+import org.onap.policy.common.utils.services.Registry;
+
+/**
+ * Class to perform unit test of {@link ClRuntimeActivator}}.
+ *
+ */
+public class ClRuntimeActivatorTest {
+
+    @Test
+    public void testStartAndStop() throws Exception {
+        Registry.newRegistry();
+        final String[] configParameters = {"-c", "src/test/resources/parameters/TestParameters.json"};
+        final ClRuntimeCommandLineArguments arguments = new ClRuntimeCommandLineArguments();
+        arguments.parse(configParameters);
+        ClRuntimeParameterGroup parameterGroup = new ClRuntimeParameterHandler().getParameters(arguments);
+        ClRuntimeActivator activator = new ClRuntimeActivator(parameterGroup);
+        activator.isAlive();
+
+        assertFalse(activator.isAlive());
+        activator.start();
+        assertTrue(activator.isAlive());
+        assertTrue(activator.getParameterGroup().isValid());
+        assertEquals(activator.getParameterGroup().getName(),
+                activator.getParameterGroup().getRestServerParameters().getName());
+
+        // repeat start - should throw an exception
+        assertThatIllegalStateException().isThrownBy(() -> activator.start());
+        assertTrue(activator.isAlive());
+        assertTrue(activator.getParameterGroup().isValid());
+
+        activator.stop();
+        assertFalse(activator.isAlive());
+
+        // repeat stop - should throw an exception
+        assertThatIllegalStateException().isThrownBy(() -> activator.stop());
+        assertFalse(activator.isAlive());
+    }
+
+    @Test
+    public void testNull() {
+        assertThatExceptionOfType(ControlLoopRuntimeException.class).isThrownBy(() -> new ClRuntimeActivator(null));
+    }
+
+    @Test
+    public void testNotValid() {
+        ClRuntimeParameterGroup parameterGroup = new ClRuntimeParameterGroup("name");
+        assertThatExceptionOfType(ControlLoopRuntimeException.class)
+                .isThrownBy(() -> new ClRuntimeActivator(parameterGroup));
+    }
+}
diff --git a/runtime-controlloop/src/test/java/org/onap/policy/clamp/controlloop/runtime/main/startstop/MainTest.java b/runtime-controlloop/src/test/java/org/onap/policy/clamp/controlloop/runtime/main/startstop/MainTest.java
new file mode 100644
index 0000000..b06383c
--- /dev/null
+++ b/runtime-controlloop/src/test/java/org/onap/policy/clamp/controlloop/runtime/main/startstop/MainTest.java
@@ -0,0 +1,157 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.runtime.main.startstop;
+
+import static org.assertj.core.api.Assertions.assertThatCode;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.onap.policy.clamp.controlloop.common.ControlLoopConstants;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopRuntimeException;
+import org.onap.policy.common.utils.resources.MessageConstants;
+import org.onap.policy.common.utils.services.Registry;
+
+/**
+ * Class to perform unit test of {@link Main}}.
+ *
+ */
+public class MainTest {
+
+    public static final String POLICY_CLAMP_FAILURE_MSG =
+            String.format(MessageConstants.START_FAILURE_MSG, MessageConstants.POLICY_CLAMP);
+
+    /**
+     * Set up.
+     */
+    @BeforeClass
+    public static void setUp() {
+        Registry.newRegistry();
+    }
+
+    /**
+     * Shuts "main" down.
+     *
+     * @throws Exception if an error occurs
+     */
+    @AfterClass
+    public static void tearDown() throws Exception {
+        // shut down activator
+        final ClRuntimeActivator activator =
+                Registry.getOrDefault(ControlLoopConstants.REG_CLRUNTIME_ACTIVATOR, ClRuntimeActivator.class, null);
+        if (activator != null && activator.isAlive()) {
+            activator.shutdown();
+        }
+    }
+
+    @Test
+    public void testMain_Help() {
+        final String[] configParameters = {"-h"};
+        Main main = new Main(configParameters);
+        assertFalse(main.isRunning());
+    }
+
+    @Test
+    public void testMain_Version() {
+        final String[] configParameters = {"-v"};
+        Main main = new Main(configParameters);
+        assertFalse(main.isRunning());
+    }
+
+    @Test
+    public void testMain_Valid() {
+        final String[] configParameters = {"-c", "src/test/resources/parameters/TestParameters.json"};
+        Main main = new Main(configParameters);
+        assertTrue(main.isRunning());
+
+        // ensure items were added to the registry
+        assertNotNull(Registry.get(ControlLoopConstants.REG_CLRUNTIME_ACTIVATOR, ClRuntimeActivator.class));
+
+        assertThatCode(() -> main.shutdown()).doesNotThrowAnyException();
+
+        assertFalse(main.isRunning());
+    }
+
+    @Test
+    public void testMain_NoParameter() {
+        assertThatConfigParameterThrownException(new String[] {});
+    }
+
+    @Test
+    public void testMain_FilePathNotDefined() {
+        assertThatConfigParameterThrownException(new String[] {"-c"});
+    }
+
+    @Test
+    public void testMain_TooManyCommand() {
+        assertThatConfigParameterThrownException(new String[] {"-h", "d"});
+    }
+
+    @Test
+    public void testMain_WrongParameter() {
+        assertThatConfigParameterThrownException(new String[] {"-d"});
+    }
+
+    private void assertThatConfigParameterThrownException(final String[] configParameters) {
+        assertThatThrownBy(() -> Main.main(configParameters)).isInstanceOf(ControlLoopRuntimeException.class)
+                .hasMessage(POLICY_CLAMP_FAILURE_MSG);
+    }
+
+    @Test
+    public void testParticipant_NoFileWithThisName() {
+        assertThatConfigFileThrownException("src/test/resources/parameters/NoFileWithThisName.json");
+    }
+
+    @Test
+    public void testParticipant_NotValidFile() {
+        assertThatConfigFileThrownException("src/test/resources/parameters");
+    }
+
+    @Test
+    public void testParticipant_FileEmpty() {
+        assertThatConfigFileThrownException("src/test/resources/parameters/EmptyParameters.json");
+    }
+
+    @Test
+    public void testParticipant_NoParameters() {
+        assertThatConfigFileThrownException("src/test/resources/parameters/NoParameters.json");
+    }
+
+    @Test
+    public void testParticipant_InvalidParameters() {
+        assertThatConfigFileThrownException("src/test/resources/parameters/InvalidParameters.json");
+    }
+
+    @Test
+    public void testParticipant_WrongJsonFormat() {
+        assertThatConfigFileThrownException("src/test/resources/parameters/Unreadable.json");
+    }
+
+    private void assertThatConfigFileThrownException(final String configFilePath) {
+        final String[] configParameters = new String[] {"-c", configFilePath};
+        assertThatThrownBy(() -> new Main(configParameters)).isInstanceOf(ControlLoopRuntimeException.class)
+                .hasMessage(String.format(POLICY_CLAMP_FAILURE_MSG));
+    }
+}
diff --git a/runtime-controlloop/src/test/java/org/onap/policy/clamp/controlloop/runtime/monitoring/TestMonitoringProvider.java b/runtime-controlloop/src/test/java/org/onap/policy/clamp/controlloop/runtime/monitoring/TestMonitoringProvider.java
new file mode 100644
index 0000000..44096ee
--- /dev/null
+++ b/runtime-controlloop/src/test/java/org/onap/policy/clamp/controlloop/runtime/monitoring/TestMonitoringProvider.java
@@ -0,0 +1,264 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.runtime.monitoring;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.when;
+
+import java.io.File;
+import java.lang.reflect.Field;
+import java.time.Instant;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.mockito.Mockito;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ClElementStatisticsList;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoop;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopElement;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantStatisticsList;
+import org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider.ControlLoopProvider;
+import org.onap.policy.clamp.controlloop.runtime.util.CommonTestData;
+import org.onap.policy.common.utils.coder.Coder;
+import org.onap.policy.common.utils.coder.CoderException;
+import org.onap.policy.common.utils.coder.StandardCoder;
+import org.onap.policy.models.provider.PolicyModelsProviderParameters;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+
+public class TestMonitoringProvider {
+
+    private static final String CL_PARTICIPANT_STATISTICS_JSON =
+        "src/test/resources/rest/monitoring/TestParticipantStatistics.json";
+    private static final String INVALID_PARTICIPANT_JSON_INPUT =
+        "src/test/resources/rest/monitoring/TestParticipantStatistics_Invalid.json";
+    private static final String CL_ELEMENT_STATISTICS_JSON =
+        "src/test/resources/rest/monitoring/TestClElementStatistics.json";
+    private static final String INVALID_CL_ELEMENT_JSON_INPUT =
+        "src/test/resources/rest/monitoring/TestClElementStatistics_Invalid.json";
+    private static final Coder CODER = new StandardCoder();
+
+    private static final String CL_PROVIDER_FIELD = "controlLoopProvider";
+
+    private static final String LIST_IS_NULL = ".*StatisticsList is marked .*ull but is null";
+    private static ParticipantStatisticsList inputParticipantStatistics;
+    private static ParticipantStatisticsList invalidParticipantInput;
+    private static ClElementStatisticsList inputClElementStatistics;
+    private static ClElementStatisticsList invalidClElementInput;
+
+
+
+    @BeforeClass
+    public static void beforeSetupStatistics() throws CoderException {
+        // Reading input json for statistics data
+        inputParticipantStatistics =
+            CODER.decode(new File(CL_PARTICIPANT_STATISTICS_JSON), ParticipantStatisticsList.class);
+        invalidParticipantInput =
+            CODER.decode(new File(INVALID_PARTICIPANT_JSON_INPUT), ParticipantStatisticsList.class);
+        inputClElementStatistics = CODER.decode(new File(CL_ELEMENT_STATISTICS_JSON), ClElementStatisticsList.class);
+        invalidClElementInput = CODER.decode(new File(INVALID_CL_ELEMENT_JSON_INPUT), ClElementStatisticsList.class);
+    }
+
+
+    @Test
+    public void testCreateParticipantStatistics() throws Exception {
+        PolicyModelsProviderParameters parameters =
+            CommonTestData.geParameterGroup(0, "createparStat").getDatabaseProviderParameters();
+
+        try (MonitoringProvider provider = new MonitoringProvider(parameters)) {
+            // Creating statistics data in db with null input
+            assertThatThrownBy(() -> {
+                provider.createParticipantStatistics(null);
+            }).hasMessageMatching(LIST_IS_NULL);
+
+            assertThatThrownBy(() -> {
+                provider.createParticipantStatistics(invalidParticipantInput.getStatisticsList());
+            }).hasMessageMatching("participantStatisticsList is marked .*null but is null");
+
+            // Creating statistics data from input json
+            ParticipantStatisticsList createResponse =
+                provider.createParticipantStatistics(inputParticipantStatistics.getStatisticsList());
+
+            assertThat(createResponse.getStatisticsList()).hasSize(3);
+            assertEquals(createResponse.getStatisticsList().toString().replaceAll("\\s+", ""),
+                inputParticipantStatistics.getStatisticsList().toString().replaceAll("\\s+", ""));
+        }
+    }
+
+    @Test
+    public void testGetParticipantStatistics() throws Exception {
+        PolicyModelsProviderParameters parameters =
+            CommonTestData.geParameterGroup(0, "getparStat").getDatabaseProviderParameters();
+        try (MonitoringProvider provider = new MonitoringProvider(parameters)) {
+            ParticipantStatisticsList getResponse;
+
+            provider.createParticipantStatistics(inputParticipantStatistics.getStatisticsList());
+
+            assertThatThrownBy(() -> {
+                provider.fetchFilteredParticipantStatistics(null, null, 0, null, null);
+            }).hasMessageMatching("name is marked .*null but is null");
+
+            // Fetch specific statistics record with name, version and record count
+            getResponse = provider.fetchFilteredParticipantStatistics("name2", "1.001", 1,
+                null, null);
+            assertThat(getResponse.getStatisticsList()).hasSize(1);
+            assertEquals(getResponse.getStatisticsList().get(0).toString().replaceAll("\\s+", ""),
+                inputParticipantStatistics.getStatisticsList().get(2).toString().replaceAll("\\s+", ""));
+
+            // Fetch statistics using timestamp
+            getResponse = provider.fetchFilteredParticipantStatistics("name1", "1.001", 0,
+                null, Instant.parse("2021-01-10T15:00:00.000Z"));
+            assertThat(getResponse.getStatisticsList()).hasSize(1);
+
+            getResponse = provider.fetchFilteredParticipantStatistics("name1", "1.001", 0,
+                Instant.parse("2021-01-11T12:00:00.000Z"), Instant.parse("2021-01-11T16:00:00.000Z"));
+
+            assertThat(getResponse.getStatisticsList()).isEmpty();
+        }
+    }
+
+    @Test
+    public void testCreateClElementStatistics() throws Exception {
+        PolicyModelsProviderParameters parameters =
+            CommonTestData.geParameterGroup(0, "createelemstat").getDatabaseProviderParameters();
+        try (MonitoringProvider provider = new MonitoringProvider(parameters)) {
+            // Creating statistics data in db with null input
+            assertThatThrownBy(() -> {
+                provider.createClElementStatistics(null);
+            }).hasMessageMatching(LIST_IS_NULL);
+
+            assertThatThrownBy(() -> {
+                provider.createClElementStatistics(invalidClElementInput.getClElementStatistics());
+            }).hasMessageMatching("clElementStatisticsList is marked .*null but is null");
+
+            // Creating clElement statistics data from input json
+            ClElementStatisticsList createResponse =
+                provider.createClElementStatistics(inputClElementStatistics.getClElementStatistics());
+
+            assertThat(createResponse.getClElementStatistics()).hasSize(4);
+            assertEquals(createResponse.getClElementStatistics().toString().replaceAll("\\s+", ""),
+                inputClElementStatistics.getClElementStatistics().toString().replaceAll("\\s+", ""));
+        }
+    }
+
+    @Test
+    public void testGetClElementStatistics() throws Exception {
+        PolicyModelsProviderParameters parameters =
+            CommonTestData.geParameterGroup(0, "getelemstat").getDatabaseProviderParameters();
+        try (MonitoringProvider provider = new MonitoringProvider(parameters)) {
+            ClElementStatisticsList getResponse;
+
+            assertThatThrownBy(() -> {
+                provider.fetchFilteredClElementStatistics(null, null, null,  null,
+                    null, 0);
+            }).hasMessageMatching("name is marked .*null but is null");
+
+            ClElementStatisticsList lists = provider.createClElementStatistics(inputClElementStatistics
+                .getClElementStatistics());
+
+            getResponse = provider.fetchFilteredClElementStatistics("name1", null, null, null,
+                null, 0);
+
+            assertThat(getResponse.getClElementStatistics()).hasSize(2);
+            assertEquals(getResponse.getClElementStatistics().get(0).toString().replaceAll("\\s+", ""),
+                inputClElementStatistics.getClElementStatistics().get(0).toString().replaceAll("\\s+", ""));
+
+            // Fetch specific statistics record with name, id and record count
+            getResponse = provider.fetchFilteredClElementStatistics("name1", "1.001",
+                "709c62b3-8918-41b9-a747-d21eb79c6c20", null, null, 0);
+            assertThat(getResponse.getClElementStatistics()).hasSize(2);
+
+            // Fetch statistics using timestamp
+            getResponse = provider.fetchFilteredClElementStatistics("name1", "1.001", null,
+                Instant.parse("2021-01-10T13:45:00.000Z"), null, 0);
+            assertThat(getResponse.getClElementStatistics()).hasSize(2);
+        }
+    }
+
+    @Test
+    public void testGetParticipantStatsPerCL() throws Exception {
+        PolicyModelsProviderParameters parameters =
+            CommonTestData.geParameterGroup(0, "getparStatCL").getDatabaseProviderParameters();
+        try (MonitoringProvider provider = Mockito.spy(new MonitoringProvider(parameters))) {
+
+            provider.createParticipantStatistics(inputParticipantStatistics.getStatisticsList());
+            //Mock the response for fetching participant conceptIdentifiers per control loop
+            List<ToscaConceptIdentifier> conceptIdentifiers = new ArrayList<>();
+            conceptIdentifiers.add(new ToscaConceptIdentifier("name1", "1.001"));
+            when(provider.getAllParticipantIdsPerControlLoop("testName", "1.001"))
+                .thenReturn(conceptIdentifiers);
+            ParticipantStatisticsList getResponse;
+            getResponse = provider.fetchParticipantStatsPerControlLoop("testName", "1.001");
+            assertThat(getResponse.getStatisticsList()).hasSize(2);
+            assertEquals(getResponse.getStatisticsList().get(0).toString().replaceAll("\\s+", ""),
+                inputParticipantStatistics.getStatisticsList().get(0).toString().replaceAll("\\s+", ""));
+            assertThat(provider.fetchParticipantStatsPerControlLoop("invalidCLName", "1.002")
+                .getStatisticsList()).isEmpty();
+        }
+
+    }
+
+    @Test
+    public void testClElementStatsPerCL() throws Exception {
+        PolicyModelsProviderParameters parameters =
+            CommonTestData.geParameterGroup(0, "getelemstatPerCL").getDatabaseProviderParameters();
+        //Setup a dummy Control loop data
+        ControlLoopElement mockClElement = new ControlLoopElement();
+        mockClElement.setId(inputClElementStatistics.getClElementStatistics().get(0).getId());
+        mockClElement.setParticipantId(new ToscaConceptIdentifier(inputClElementStatistics.getClElementStatistics()
+            .get(0).getParticipantId().getName(), inputClElementStatistics.getClElementStatistics().get(0)
+            .getParticipantId().getVersion()));
+        ControlLoop mockCL = new ControlLoop();
+        mockCL.setElements(new LinkedHashMap<>());
+        mockCL.getElements().put(mockClElement.getId(), mockClElement);
+
+        //Mock controlloop data to be returned for the given CL Id
+        ControlLoopProvider mockClProvider = Mockito.mock(ControlLoopProvider.class);
+        when(mockClProvider.getControlLoop(new ToscaConceptIdentifier("testCLName", "1.001")))
+            .thenReturn(mockCL);
+
+        try (MonitoringProvider monitoringProvider = new MonitoringProvider(parameters)) {
+            monitoringProvider.createClElementStatistics(inputClElementStatistics.getClElementStatistics());
+            Field controlLoopProviderField = monitoringProvider.getClass().getDeclaredField(CL_PROVIDER_FIELD);
+            controlLoopProviderField.setAccessible(true);
+            controlLoopProviderField.set(monitoringProvider, mockClProvider);
+
+            ClElementStatisticsList getResponse;
+            getResponse = monitoringProvider.fetchClElementStatsPerControlLoop("testCLName", "1.001");
+
+            assertThat(getResponse.getClElementStatistics()).hasSize(2);
+            assertEquals(getResponse.getClElementStatistics().get(1).toString().replaceAll("\\s+", ""),
+                inputClElementStatistics.getClElementStatistics().get(1).toString().replaceAll("\\s+", ""));
+
+            assertThat(monitoringProvider.fetchClElementStatsPerControlLoop("invalidCLName", "1.002")
+                .getClElementStatistics()).isEmpty();
+
+            Map<String, ToscaConceptIdentifier> clElementIds = monitoringProvider
+                .getAllClElementsIdPerControlLoop("testCLName", "1.001");
+            assertThat(clElementIds).containsKey(inputClElementStatistics.getClElementStatistics().get(0).getId()
+                .toString());
+        }
+    }
+}
diff --git a/runtime-controlloop/src/test/java/org/onap/policy/clamp/controlloop/runtime/monitoring/rest/MonitoringQueryControllerTest.java b/runtime-controlloop/src/test/java/org/onap/policy/clamp/controlloop/runtime/monitoring/rest/MonitoringQueryControllerTest.java
new file mode 100644
index 0000000..118199a
--- /dev/null
+++ b/runtime-controlloop/src/test/java/org/onap/policy/clamp/controlloop/runtime/monitoring/rest/MonitoringQueryControllerTest.java
@@ -0,0 +1,237 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.runtime.monitoring.rest;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.io.File;
+import java.time.Instant;
+import javax.ws.rs.client.Invocation;
+import javax.ws.rs.core.Response;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ClElementStatisticsList;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantStatisticsList;
+import org.onap.policy.clamp.controlloop.runtime.monitoring.MonitoringProvider;
+import org.onap.policy.clamp.controlloop.runtime.util.rest.CommonRestController;
+import org.onap.policy.common.utils.coder.Coder;
+import org.onap.policy.common.utils.coder.StandardCoder;
+
+public class MonitoringQueryControllerTest extends CommonRestController {
+
+    private static final String CL_PARTICIPANT_STATISTICS_JSON =
+        "src/test/resources/rest/monitoring/TestParticipantStatistics.json";
+    private static final String CL_ELEMENT_STATISTICS_JSON =
+        "src/test/resources/rest/monitoring/TestClElementStatistics.json";
+
+    private static final Coder CODER = new StandardCoder();
+
+    private static ParticipantStatisticsList inputParticipantStatistics;
+    private static ClElementStatisticsList inputClElementStatistics;
+
+    private static ParticipantStatisticsList participantStatisticsList;
+    private static  ClElementStatisticsList clElementStatisticsList;
+
+    private static final String CLELEMENT_STATS_ENDPOINT = "monitoring/clelement";
+    private static final String PARTICIPANT_STATS_ENDPOINT = "monitoring/participant";
+    private static final String PARTICIPANT_STATS_PER_CL_ENDPOINT = "monitoring/participants/controlloop";
+    private static final String CLELEMENT_STATS_PER_CL_ENDPOINT = "monitoring/clelements/controlloop";
+
+
+    /**
+     * starts Main.
+     *
+     * @throws Exception if an error occurs
+     */
+    @BeforeClass
+    public static void setUpBeforeClass() throws Exception {
+        CommonRestController.setUpBeforeClass("testStatisticsQuery");
+        inputParticipantStatistics = CODER.decode(new File(CL_PARTICIPANT_STATISTICS_JSON),
+            ParticipantStatisticsList.class);
+        inputClElementStatistics = CODER.decode(new File(CL_ELEMENT_STATISTICS_JSON),
+            ClElementStatisticsList.class);
+
+        try (MonitoringProvider monitoringProvider = new MonitoringProvider(getParameters())) {
+            // Insert Participant statistics to DB
+            participantStatisticsList = monitoringProvider.createParticipantStatistics(inputParticipantStatistics
+                .getStatisticsList());
+            // Insert CL Element statistics to DB
+            clElementStatisticsList = monitoringProvider.createClElementStatistics(inputClElementStatistics
+                .getClElementStatistics());
+        }
+    }
+
+    @AfterClass
+    public static void teardownAfterClass() {
+        CommonRestController.teardownAfterClass();
+    }
+
+    @Test
+    public void testQuery_Unauthorized_for_ClElementStats() throws Exception {
+        assertUnauthorizedGet(CLELEMENT_STATS_ENDPOINT);
+    }
+
+    @Test
+    public void testQuery_Unauthorized_for_ClParticipantStats() throws Exception {
+        assertUnauthorizedGet(PARTICIPANT_STATS_ENDPOINT);
+    }
+
+    @Test
+    public void testQuery_Unauthorized_for_ParticipantStatsPerCl() throws Exception {
+        assertUnauthorizedGet(PARTICIPANT_STATS_PER_CL_ENDPOINT);
+    }
+
+    @Test
+    public void testQuery_Unauthorized_for_ClElementStatsPerCl() throws Exception {
+        assertUnauthorizedGet(CLELEMENT_STATS_PER_CL_ENDPOINT);
+    }
+
+    @Test
+    public void testSwagger_ClStats() throws Exception {
+        super.testSwagger(CLELEMENT_STATS_ENDPOINT);
+        super.testSwagger(PARTICIPANT_STATS_ENDPOINT);
+        super.testSwagger(CLELEMENT_STATS_PER_CL_ENDPOINT);
+        super.testSwagger(PARTICIPANT_STATS_PER_CL_ENDPOINT);
+    }
+
+    @Test
+    public void testClElementStatisticsEndpoint() throws Exception {
+        // Filter statistics only based on participant Id and UUID
+        Invocation.Builder invokeRequest1 =
+            super.sendRequest(CLELEMENT_STATS_ENDPOINT + "?name=" + clElementStatisticsList
+                .getClElementStatistics().get(0).getParticipantId().getName() + "&version=" + clElementStatisticsList
+                .getClElementStatistics().get(0).getParticipantId().getVersion() + "&id=" + clElementStatisticsList
+                .getClElementStatistics().get(0).getId().toString());
+        Response response1 = invokeRequest1.buildGet().invoke();
+        assertEquals(Response.Status.OK.getStatusCode(), response1.getStatus());
+
+        ClElementStatisticsList result1 = response1.readEntity(ClElementStatisticsList.class);
+
+        assertNotNull(result1);
+        assertThat(result1.getClElementStatistics()).hasSize(2);
+        assertEquals(result1.getClElementStatistics().get(0), clElementStatisticsList
+            .getClElementStatistics().get(0));
+
+        // Filter statistics based on timestamp
+        Invocation.Builder invokeRequest2 =
+            super.sendRequest(CLELEMENT_STATS_ENDPOINT + "?name=" + clElementStatisticsList
+                .getClElementStatistics().get(1).getParticipantId().getName() + "&version=" + clElementStatisticsList
+                .getClElementStatistics().get(1).getParticipantId().getVersion() + "&startTime="
+                + Instant.parse("2021-01-10T13:00:00.000Z") + "&endTime=" + Instant.parse("2021-01-10T14:00:00.000Z"));
+        Response response2 = invokeRequest2.buildGet().invoke();
+        assertEquals(Response.Status.OK.getStatusCode(), response2.getStatus());
+        ClElementStatisticsList result2 = response2.readEntity(ClElementStatisticsList.class);
+
+        assertNotNull(result2);
+        assertThat(result2.getClElementStatistics()).hasSize(1);
+        assertEquals(result1.getClElementStatistics().get(0), clElementStatisticsList
+            .getClElementStatistics().get(0));
+    }
+
+    @Test
+    public void testClElementStats_BadRequest() throws Exception {
+        Invocation.Builder invokeRequest1 =
+            super.sendRequest(CLELEMENT_STATS_ENDPOINT + "?version=1.0.0");
+        Response response1 = invokeRequest1.buildGet().invoke();
+        assertEquals(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), response1.getStatus());
+    }
+
+    @Test
+    public void testParticipantStatisticsEndpoint() throws Exception {
+
+        // Filter statistics only based on participant Id
+        Invocation.Builder invokeRequest1 =
+            super.sendRequest(PARTICIPANT_STATS_ENDPOINT + "?name=" + participantStatisticsList
+                .getStatisticsList().get(0).getParticipantId().getName() + "&version=" + participantStatisticsList
+                .getStatisticsList().get(0).getParticipantId().getVersion());
+        Response response1 = invokeRequest1.buildGet().invoke();
+        assertEquals(Response.Status.OK.getStatusCode(), response1.getStatus());
+        ParticipantStatisticsList result1 = response1.readEntity(ParticipantStatisticsList.class);
+
+        assertNotNull(result1);
+        assertThat(result1.getStatisticsList()).hasSize(2);
+        assertEquals(result1.getStatisticsList().get(0), participantStatisticsList
+            .getStatisticsList().get(0));
+
+        // Filter statistics based on timestamp
+        Invocation.Builder invokeRequest2 =
+            super.sendRequest(PARTICIPANT_STATS_ENDPOINT + "?name=" + participantStatisticsList
+                .getStatisticsList().get(1).getParticipantId().getName() + "&version=" + participantStatisticsList
+                .getStatisticsList().get(1).getParticipantId().getVersion() + "&startTime="
+                + Instant.parse("2021-01-10T13:00:00.000Z") + "&endTime=" + Instant.parse("2021-01-10T14:00:00.000Z"));
+        Response response2 = invokeRequest2.buildGet().invoke();
+        assertEquals(Response.Status.OK.getStatusCode(), response2.getStatus());
+        ParticipantStatisticsList result2 = response2.readEntity(ParticipantStatisticsList.class);
+
+        assertNotNull(result2);
+        assertThat(result2.getStatisticsList()).hasSize(1);
+        assertEquals(result1.getStatisticsList().get(0), participantStatisticsList
+            .getStatisticsList().get(0));
+    }
+
+    @Test
+    public void testParticipantStats_BadRequest() throws Exception {
+        Invocation.Builder invokeRequest1 =
+            super.sendRequest(PARTICIPANT_STATS_ENDPOINT + "?version=0.0");
+        Response response1 = invokeRequest1.buildGet().invoke();
+        assertEquals(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), response1.getStatus());
+    }
+
+    @Test
+    public void testParticipantStatsPerClEndpoint() throws Exception {
+        Invocation.Builder invokeRequest1 =
+            super.sendRequest(PARTICIPANT_STATS_PER_CL_ENDPOINT + "?name=dummyName&version=1.001");
+        Response response1 = invokeRequest1.buildGet().invoke();
+        assertEquals(Response.Status.OK.getStatusCode(), response1.getStatus());
+        ParticipantStatisticsList result1 = response1.readEntity(ParticipantStatisticsList.class);
+        assertThat(result1.getStatisticsList()).isEmpty();
+    }
+
+    @Test
+    public void testParticipantStatsPerCl_BadRequest() throws Exception {
+        Invocation.Builder invokeRequest1 =
+            super.sendRequest(PARTICIPANT_STATS_PER_CL_ENDPOINT);
+        Response response1 = invokeRequest1.buildGet().invoke();
+        assertEquals(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), response1.getStatus());
+    }
+
+    @Test
+    public void testClElementStatisticsPerClEndpoint() throws Exception {
+        Invocation.Builder invokeRequest1 =
+            super.sendRequest(CLELEMENT_STATS_PER_CL_ENDPOINT + "?name=dummyName&version=1.001");
+        Response response1 = invokeRequest1.buildGet().invoke();
+        assertEquals(Response.Status.OK.getStatusCode(), response1.getStatus());
+        ClElementStatisticsList result1 = response1.readEntity(ClElementStatisticsList.class);
+        assertThat(result1.getClElementStatistics()).isEmpty();
+    }
+
+    @Test
+    public void testClElementStatsPerCl_BadRequest() throws Exception {
+        Invocation.Builder invokeRequest1 =
+            super.sendRequest(CLELEMENT_STATS_PER_CL_ENDPOINT);
+        Response response1 = invokeRequest1.buildGet().invoke();
+        assertEquals(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), response1.getStatus());
+    }
+}
diff --git a/runtime-controlloop/src/test/java/org/onap/policy/clamp/controlloop/runtime/util/CommonTestData.java b/runtime-controlloop/src/test/java/org/onap/policy/clamp/controlloop/runtime/util/CommonTestData.java
new file mode 100644
index 0000000..77f802d
--- /dev/null
+++ b/runtime-controlloop/src/test/java/org/onap/policy/clamp/controlloop/runtime/util/CommonTestData.java
@@ -0,0 +1,63 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.runtime.util;
+
+import org.onap.policy.clamp.controlloop.runtime.main.parameters.ClRuntimeParameterGroup;
+import org.onap.policy.common.utils.coder.Coder;
+import org.onap.policy.common.utils.coder.CoderException;
+import org.onap.policy.common.utils.coder.StandardCoder;
+import org.onap.policy.common.utils.resources.ResourceUtils;
+
+/**
+ * Class to hold/create all parameters for test cases.
+ *
+ */
+public class CommonTestData {
+    private static final Coder coder = new StandardCoder();
+
+    /**
+     * Gets the standard Control Loop parameters.
+     *
+     * @param port port to be inserted into the parameters
+     * @param dbName the database name
+     * @return the standard Control Loop parameters
+     */
+    public static ClRuntimeParameterGroup geParameterGroup(final int port, final String dbName) {
+        try {
+            return coder.decode(getParameterGroupAsString(port, dbName), ClRuntimeParameterGroup.class);
+
+        } catch (CoderException e) {
+            throw new RuntimeException("cannot read Control Loop parameters", e);
+        }
+    }
+
+    /**
+     * Gets the standard Control Loop parameters, as a String.
+     *
+     * @param port port to be inserted into the parameters
+     * @param dbName the database name
+     * @return the standard Control Loop parameters as string
+     */
+    public static String getParameterGroupAsString(final int port, final String dbName) {
+        return ResourceUtils.getResourceAsString("src/test/resources/parameters/InstantiationConfigParametersStd.json")
+                .replace("${port}", String.valueOf(port)).replace("${dbName}", "jdbc:h2:mem:" + dbName);
+    }
+}
diff --git a/runtime-controlloop/src/test/java/org/onap/policy/clamp/controlloop/runtime/util/rest/CommonRestController.java b/runtime-controlloop/src/test/java/org/onap/policy/clamp/controlloop/runtime/util/rest/CommonRestController.java
new file mode 100644
index 0000000..0d668f1
--- /dev/null
+++ b/runtime-controlloop/src/test/java/org/onap/policy/clamp/controlloop/runtime/util/rest/CommonRestController.java
@@ -0,0 +1,263 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 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.controlloop.runtime.util.rest;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.ClientBuilder;
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.client.Invocation;
+import javax.ws.rs.client.WebTarget;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import org.glassfish.jersey.client.ClientProperties;
+import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopException;
+import org.onap.policy.clamp.controlloop.runtime.main.startstop.Main;
+import org.onap.policy.clamp.controlloop.runtime.util.CommonTestData;
+import org.onap.policy.common.gson.GsonMessageBodyHandler;
+import org.onap.policy.common.utils.network.NetworkUtil;
+import org.onap.policy.common.utils.services.Registry;
+import org.onap.policy.models.provider.PolicyModelsProviderParameters;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Class to perform Rest unit tests.
+ *
+ */
+public class CommonRestController {
+
+    private static final String CONFIG_FILE = "src/test/resources/parameters/RuntimeConfigParameters%d.json";
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(CommonRestController.class);
+
+    public static final String SELF = NetworkUtil.getHostname();
+    public static final String ENDPOINT_PREFIX = "onap/controlloop/v2/";
+
+    private static int port;
+    private static String httpPrefix;
+    private static Main main;
+
+    /**
+     * Allocates a port for the server, writes a config file, and then starts Main.
+     *
+     * @param dbName database name
+     * @throws Exception if an error occurs
+     */
+    public static void setUpBeforeClass(final String dbName) throws Exception {
+        port = NetworkUtil.allocPort();
+
+        httpPrefix = "http://" + SELF + ":" + port + "/";
+
+        makeConfigFile(dbName);
+        startMain();
+    }
+
+    /**
+     * Stops Main.
+     */
+    public static void teardownAfterClass() {
+        try {
+            stopMain();
+        } catch (Exception ex) {
+            LOGGER.error("cannot stop main", ex);
+        }
+    }
+
+    protected static PolicyModelsProviderParameters getParameters() {
+        return main.getParameters().getDatabaseProviderParameters();
+    }
+
+    /**
+     * Verifies that an endpoint appears within the swagger response.
+     *
+     * @param endpoint the endpoint of interest
+     * @throws Exception if an error occurs
+     */
+    protected void testSwagger(final String endpoint) throws Exception {
+        final Invocation.Builder invocationBuilder = sendFqeRequest(httpPrefix + "swagger.yaml", true);
+        final String resp = invocationBuilder.get(String.class);
+
+        assertTrue(resp.contains(ENDPOINT_PREFIX + endpoint + ":"));
+    }
+
+    /**
+     * Makes a parameter configuration file.
+     *
+     * @param dbName database name
+     * @throws IOException if an error occurs writing the configuration file
+     * @throws FileNotFoundException if an error occurs writing the configuration file
+     */
+    private static void makeConfigFile(final String dbName) throws FileNotFoundException, IOException {
+        String json = CommonTestData.getParameterGroupAsString(port, dbName);
+
+        File file = new File(String.format(CONFIG_FILE, port));
+        file.deleteOnExit();
+
+        try (FileOutputStream output = new FileOutputStream(file)) {
+            output.write(json.getBytes(StandardCharsets.UTF_8));
+        }
+    }
+
+    /**
+     * Starts the "Main".
+     *
+     * @throws InterruptedException
+     *
+     * @throws Exception if an error occurs
+     */
+    protected static void startMain() throws InterruptedException {
+        Registry.newRegistry();
+
+        // make sure port is available
+        if (NetworkUtil.isTcpPortOpen(SELF, port, 1, 1L)) {
+            throw new IllegalStateException("port " + port + " is not available");
+        }
+
+        final String[] configParameters = {"-c", String.format(CONFIG_FILE, port)};
+
+        main = new Main(configParameters);
+
+        if (!NetworkUtil.isTcpPortOpen(SELF, port, 40, 250L)) {
+            throw new IllegalStateException("server is not listening on port " + port);
+        }
+    }
+
+    /**
+     * Stops the "Main".
+     *
+     * @throws ControlLoopException
+     *
+     * @throws Exception if an error occurs
+     */
+    private static void stopMain() throws Exception {
+        if (main != null) {
+            Main main2 = main;
+            main = null;
+
+            main2.shutdown();
+        }
+        // make sure port is close
+        if (NetworkUtil.isTcpPortOpen(SELF, port, 1, 1L)) {
+            throw new IllegalStateException("port " + port + " is still in use");
+        }
+    }
+
+    /**
+     * Sends a request to an endpoint.
+     *
+     * @param endpoint the target endpoint
+     * @return a request builder
+     * @throws Exception if an error occurs
+     */
+    protected Invocation.Builder sendRequest(final String endpoint) throws Exception {
+        return sendFqeRequest(httpPrefix + ENDPOINT_PREFIX + endpoint, true);
+    }
+
+    /**
+     * Sends a request to an endpoint, without any authorization header.
+     *
+     * @param endpoint the target endpoint
+     * @return a request builder
+     * @throws Exception if an error occurs
+     */
+    protected Invocation.Builder sendNoAuthRequest(final String endpoint) throws Exception {
+        return sendFqeRequest(httpPrefix + ENDPOINT_PREFIX + endpoint, false);
+    }
+
+    /**
+     * Sends a request to a fully qualified endpoint.
+     *
+     * @param fullyQualifiedEndpoint the fully qualified target endpoint
+     * @param includeAuth if authorization header should be included
+     * @return a request builder
+     * @throws Exception if an error occurs
+     */
+    protected Invocation.Builder sendFqeRequest(final String fullyQualifiedEndpoint, boolean includeAuth)
+            throws Exception {
+        final Client client = ClientBuilder.newBuilder().build();
+
+        client.property(ClientProperties.METAINF_SERVICES_LOOKUP_DISABLE, "true");
+        client.register(GsonMessageBodyHandler.class);
+
+        if (includeAuth) {
+            client.register(HttpAuthenticationFeature.basic("healthcheck", "zb!XztG34"));
+        }
+
+        final WebTarget webTarget = client.target(fullyQualifiedEndpoint);
+
+        return webTarget.request(MediaType.APPLICATION_JSON);
+    }
+
+    /**
+     * Assert that POST call is Unauthorized.
+     *
+     * @param endPoint the endpoint
+     * @param entity the entity ofthe body
+     * @throws Exception if an error occurs
+     */
+    protected void assertUnauthorizedPost(final String endPoint, final Entity<?> entity) throws Exception {
+        Response rawresp = sendNoAuthRequest(endPoint).post(entity);
+        assertEquals(Response.Status.UNAUTHORIZED.getStatusCode(), rawresp.getStatus());
+    }
+
+    /**
+     * Assert that PUT call is Unauthorized.
+     *
+     * @param endPoint the endpoint
+     * @param entity the entity ofthe body
+     * @throws Exception if an error occurs
+     */
+    protected void assertUnauthorizedPut(final String endPoint, final Entity<?> entity) throws Exception {
+        Response rawresp = sendNoAuthRequest(endPoint).put(entity);
+        assertEquals(Response.Status.UNAUTHORIZED.getStatusCode(), rawresp.getStatus());
+    }
+
+    /**
+     * Assert that GET call is Unauthorized.
+     *
+     * @param endPoint the endpoint
+     * @throws Exception if an error occurs
+     */
+    protected void assertUnauthorizedGet(final String endPoint) throws Exception {
+        Response rawresp = sendNoAuthRequest(endPoint).buildGet().invoke();
+        assertEquals(Response.Status.UNAUTHORIZED.getStatusCode(), rawresp.getStatus());
+    }
+
+    /**
+     * Assert that DELETE call is Unauthorized.
+     *
+     * @param endPoint the endpoint
+     * @throws Exception if an error occurs
+     */
+    protected void assertUnauthorizedDelete(final String endPoint) throws Exception {
+        Response rawresp = sendNoAuthRequest(endPoint).delete();
+        assertEquals(Response.Status.UNAUTHORIZED.getStatusCode(), rawresp.getStatus());
+    }
+}
\ No newline at end of file
diff --git a/runtime-controlloop/src/test/resources/META-INF/persistence.xml b/runtime-controlloop/src/test/resources/META-INF/persistence.xml
new file mode 100644
index 0000000..6e31cca
--- /dev/null
+++ b/runtime-controlloop/src/test/resources/META-INF/persistence.xml
@@ -0,0 +1,159 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ============LICENSE_START=======================================================
+   Copyright (C) 2021 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=========================================================
+-->
+<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
+    <persistence-unit name="CommissioningMariaDb" transaction-type="RESOURCE_LOCAL">
+        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
+
+        <class>org.onap.policy.models.base.PfConceptKey</class>
+        <class>org.onap.policy.models.dao.converters.CDataConditioner</class>
+        <class>org.onap.policy.models.dao.converters.Uuid2String</class>
+        <class>org.onap.policy.models.pdp.persistence.concepts.JpaPdp</class>
+        <class>org.onap.policy.models.pdp.persistence.concepts.JpaPdpGroup</class>
+        <class>org.onap.policy.models.pdp.persistence.concepts.JpaPdpStatistics</class>
+        <class>org.onap.policy.models.pdp.persistence.concepts.JpaPdpSubGroup</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaCapabilityAssignment</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaCapabilityAssignments</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaCapabilityType</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaCapabilityTypes</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaDataType</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaDataTypes</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeTemplate</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeTemplates</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeType</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeTypes</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaParameter</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicies</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicy</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicyType</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicyTypes</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaProperty</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaRelationshipType</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaRelationshipTypes</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaRequirement</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaRequirements</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaServiceTemplate</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaTopologyTemplate</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaTrigger</class>
+        <class>org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaControlLoop</class>
+        <class>org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaControlLoopElement</class>
+        <class>org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaParticipant</class>
+        <class>org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaParticipantStatistics</class>
+        <class>org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaClElementStatistics</class>
+
+        <properties>
+            <property name="eclipselink.ddl-generation" value="create-or-extend-tables" />
+            <property name="eclipselink.ddl-generation.output-mode" value="database" />
+            <property name="eclipselink.logging.level" value="INFO" />
+
+            <!-- property name="eclipselink.logging.level" value="ALL" />
+            <property name="eclipselink.logging.level.jpa" value="ALL" />
+            <property name="eclipselink.logging.level.ddl" value="ALL" />
+            <property name="eclipselink.logging.level.connection" value="ALL" />
+            <property name="eclipselink.logging.level.sql" value="ALL" />
+            <property name="eclipselink.logging.level.transaction" value="ALL" />
+            <property name="eclipselink.logging.level.sequencing" value="ALL" />
+            <property name="eclipselink.logging.level.server" value="ALL" />
+            <property name="eclipselink.logging.level.query" value="ALL" />
+            <property name="eclipselink.logging.level.properties" value="ALL" /-->
+        </properties>
+        <shared-cache-mode>NONE</shared-cache-mode>
+    </persistence-unit>
+
+    <persistence-unit name="ToscaConceptTest" transaction-type="RESOURCE_LOCAL">
+        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
+
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaCapabilityAssignment</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaCapabilityAssignments</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaCapabilityType</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaCapabilityTypes</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaDataType</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaDataTypes</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeTemplate</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeTemplates</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeType</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeTypes</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaParameter</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicies</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicy</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicyType</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicyTypes</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaProperty</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaRelationshipType</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaRelationshipTypes</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaRequirement</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaRequirements</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaServiceTemplate</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaTopologyTemplate</class>
+        <class>org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaControlLoop</class>
+        <class>org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaControlLoopElement</class>
+        <class>org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaParticipantStatistics</class>
+        <class>org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaClElementStatistics</class>
+
+        <properties>
+            <property name="eclipselink.target-database" value="MySQL" />
+            <property name="eclipselink.ddl-generation" value="drop-and-create-tables" />
+            <property name="eclipselink.ddl-generation.output-mode" value="database" />
+            <property name="eclipselink.logging.level" value="INFO" />
+        </properties>
+        <shared-cache-mode>NONE</shared-cache-mode>
+    </persistence-unit>
+
+    <persistence-unit name="InstantiationTests" transaction-type="RESOURCE_LOCAL">
+        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
+
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaCapabilityAssignment</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaCapabilityAssignments</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaCapabilityType</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaCapabilityTypes</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaDataType</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaDataTypes</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeTemplate</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeTemplates</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeType</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeTypes</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaParameter</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicies</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicy</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicyType</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicyTypes</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaProperty</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaRelationshipType</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaRelationshipTypes</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaRequirement</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaRequirements</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaServiceTemplate</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaTopologyTemplate</class>
+        <class>org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaControlLoop</class>
+        <class>org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaControlLoopElement</class>
+        <class>org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaParticipant</class>
+        <class>org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaParticipantStatistics</class>
+        <class>org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaClElementStatistics</class>
+
+        <properties>
+            <property name="eclipselink.ddl-generation" value="create-or-extend-tables" />
+            <property name="eclipselink.ddl-generation.output-mode" value="database" />
+            <property name="eclipselink.logging.level" value="INFO" />
+        </properties>
+        <shared-cache-mode>NONE</shared-cache-mode>
+    </persistence-unit>
+
+</persistence>
+
diff --git a/runtime-controlloop/src/test/resources/parameters/CommissioningConfig.json b/runtime-controlloop/src/test/resources/parameters/CommissioningConfig.json
new file mode 100644
index 0000000..bda9da6
--- /dev/null
+++ b/runtime-controlloop/src/test/resources/parameters/CommissioningConfig.json
@@ -0,0 +1,20 @@
+{
+  "name": "CommissioningGroup",
+  "restServerParameters": {
+    "host": "127.0.0.1",
+    "port": 6969,
+    "userName": "admin",
+    "password": "password",
+    "https": false,
+    "aaf": false
+  },
+  "databaseProviderParameters": {
+    "name": "CommissioningProviderParameterGroup",
+    "implementation": "org.onap.policy.models.provider.impl.DatabasePolicyModelsProviderImpl",
+    "databaseDriver": "org.h2.Driver",
+    "databaseUrl": "jdbc:h2:mem:testdb",
+    "databaseUser": "controlloop",
+    "databasePassword": "C0ntr0lL00p",
+    "persistenceUnit": "ToscaConceptTest"
+  }
+}
diff --git a/runtime-controlloop/src/test/resources/parameters/EmptyParameters.json b/runtime-controlloop/src/test/resources/parameters/EmptyParameters.json
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/runtime-controlloop/src/test/resources/parameters/EmptyParameters.json
diff --git a/runtime-controlloop/src/test/resources/parameters/InstantiationConfigParametersStd.json b/runtime-controlloop/src/test/resources/parameters/InstantiationConfigParametersStd.json
new file mode 100644
index 0000000..7682a18
--- /dev/null
+++ b/runtime-controlloop/src/test/resources/parameters/InstantiationConfigParametersStd.json
@@ -0,0 +1,79 @@
+{
+    "name": "ControlLoopRuntimeGroup",
+    "restServerParameters": {
+        "host": "0.0.0.0",
+        "port": ${port},
+        "userName": "healthcheck",
+        "password": "zb!XztG34",
+        "https": false,
+        "aaf": false
+    },
+    "participantParameters": {
+        "heartBeatMs": 120000,
+        "updateParameters": {
+            "maxRetryCount": 1,
+            "maxWaitMs": 30000
+        },
+        "stateChangeParameters": {
+            "maxRetryCount": 1,
+            "maxWaitMs": 30000
+        }
+    },
+    "databaseProviderParameters": {
+        "name": "PolicyProviderParameterGroup",
+        "implementation": "org.onap.policy.models.provider.impl.DatabasePolicyModelsProviderImpl",
+        "databaseDriver": "org.h2.Driver",
+        "databaseUrl": "${dbName}",
+        "databaseUser": "policy",
+        "databasePassword": "P01icY",
+        "persistenceUnit": "InstantiationTests"
+    },
+    "topicParameterGroup": {
+        "topicSources": [
+            {
+                "topic": "POLICY-CLRUNTIME-PARTICIPANT",
+                "servers": [
+                    "localhost"
+                ],
+                "topicCommInfrastructure": "dmaap",
+                "fetchTimeout": 15000
+            }
+        ],
+        "topicSinks": [
+            {
+                "topic": "POLICY-CLRUNTIME-PARTICIPANT",
+                "servers": [
+                    "localhost"
+                ],
+                "topicCommInfrastructure": "dmaap"
+            },
+            {
+                "topic": "POLICY-NOTIFICATION",
+                "servers": [
+                    "localhost"
+                ],
+                "topicCommInfrastructure": "dmaap"
+            }
+        ]
+    },
+    "healthCheckRestClientParameters": [
+        {
+            "clientName": "api",
+            "hostname": "policy-api",
+            "port": 6969,
+            "userName": "healthcheck",
+            "password": "zb!XztG34",
+            "useHttps": true,
+            "basePath": "policy/api/v1/healthcheck"
+        },
+        {
+            "clientName": "distribution",
+            "hostname": "policy-distribution",
+            "port": 6969,
+            "userName": "healthcheck",
+            "password": "zb!XztG34",
+            "useHttps": true,
+            "basePath": "healthcheck"
+        }
+    ]
+}
diff --git a/runtime-controlloop/src/test/resources/parameters/InstantiationConfigParameters_InvalidName.json b/runtime-controlloop/src/test/resources/parameters/InstantiationConfigParameters_InvalidName.json
new file mode 100644
index 0000000..b0c322c
--- /dev/null
+++ b/runtime-controlloop/src/test/resources/parameters/InstantiationConfigParameters_InvalidName.json
@@ -0,0 +1,31 @@
+{
+    "name":" ",
+  "restServerParameters": {
+    "host": "127.0.0.1",
+    "port": 6969,
+    "userName": "admin",
+    "password": "password",
+    "https": false,
+    "aaf": false
+  },
+    "pdpParameters": {
+        "heartBeatMs": 1,
+        "updateParameters": {
+            "maxRetryCount": 1,
+            "maxWaitMs": 1
+        },
+        "stateChangeParameters": {
+            "maxRetryCount": 1,
+            "maxWaitMs": 1
+        }
+    },
+    "databaseProviderParameters": {
+        "name": "PolicyProviderParameterGroup",
+        "implementation": "org.onap.policy.models.provider.impl.DatabasePolicyModelsProviderImpl",
+        "databaseDriver": "org.h2.Driver",
+        "databaseUrl": "jdbc:h2:mem:testdb",
+        "databaseUser": "policy",
+        "databasePassword": "P01icY",
+        "persistenceUnit": "PdpGroupTest"
+    }
+}
diff --git a/runtime-controlloop/src/test/resources/parameters/InstantiationConfigParameters_sim.json b/runtime-controlloop/src/test/resources/parameters/InstantiationConfigParameters_sim.json
new file mode 100644
index 0000000..0977da9
--- /dev/null
+++ b/runtime-controlloop/src/test/resources/parameters/InstantiationConfigParameters_sim.json
@@ -0,0 +1,43 @@
+{
+    "name": "Instantiation",
+  "restServerParameters": {
+    "host": "127.0.0.1",
+    "port": 6969,
+    "userName": "admin",
+    "password": "password",
+    "https": false,
+    "aaf": false
+  },
+    "pdpParameters": {
+        "heartBeatMs": 10,
+        "updateParameters": {
+            "maxRetryCount": 1,
+            "maxWaitMs": 30000
+        },
+        "stateChangeParameters": {
+            "maxRetryCount": 1,
+            "maxWaitMs": 30000
+        }
+    },
+    "databaseProviderParameters": {
+        "name": "PolicyProviderParameterGroup",
+        "implementation": "org.onap.policy.models.provider.impl.DatabasePolicyModelsProviderImpl",
+        "databaseDriver": "org.mariadb.jdbc.Driver",
+        "databaseUrl": "jdbc:mariadb://localhost:3306/policyadmin",
+        "databaseUser": "policy",
+        "databasePassword": "UDAxaWNZ",
+        "persistenceUnit": "PolicyMariaDb"
+    },
+    "topicParameterGroup": {
+        "topicSources" : [{
+            "topic" : "INSTANTIATION",
+            "servers" : [ "localhost:6845" ],
+            "topicCommInfrastructure" : "dmaap"
+        }],
+        "topicSinks" : [{
+            "topic" : "INSTANTIATION",
+            "servers" : [ "localhost:6845" ],
+            "topicCommInfrastructure" : "dmaap"
+        }]
+    }
+}
diff --git a/runtime-controlloop/src/test/resources/parameters/InvalidParameters.json b/runtime-controlloop/src/test/resources/parameters/InvalidParameters.json
new file mode 100644
index 0000000..976ec29
--- /dev/null
+++ b/runtime-controlloop/src/test/resources/parameters/InvalidParameters.json
@@ -0,0 +1,3 @@
+{
+  "name": ""
+}
diff --git a/runtime-controlloop/src/test/resources/parameters/MinimumParametersH2.json b/runtime-controlloop/src/test/resources/parameters/MinimumParametersH2.json
new file mode 100644
index 0000000..f784dcd
--- /dev/null
+++ b/runtime-controlloop/src/test/resources/parameters/MinimumParametersH2.json
@@ -0,0 +1,59 @@
+{
+    "name":"PapGroup",
+    "restServerParameters":{
+        "host":"0.0.0.0",
+        "port":6969,
+        "userName":"healthcheck",
+        "password":"zb!XztG34"
+    },
+    "pdpParameters": {
+        "heartBeatMs": 1,
+        "updateParameters": {
+            "maxRetryCount": 1,
+            "maxWaitMs": 1
+        },
+        "stateChangeParameters": {
+            "maxRetryCount": 1,
+            "maxWaitMs": 1
+        }
+    },
+    "databaseProviderParameters": {
+        "name": "PolicyProviderParameterGroup",
+        "implementation": "org.onap.policy.models.provider.impl.DatabasePolicyModelsProviderImpl",
+        "databaseDriver": "org.h2.Driver",
+        "databaseUrl": "jdbc:h2:mem:testdb",
+        "databaseUser": "policy",
+        "databasePassword": "P01icY",
+        "persistenceUnit": "PdpGroupTest"
+    },
+    "topicParameterGroup": {
+        "topicSources" : [{
+            "topic" : "POLICY-PDP-PAP",
+            "servers" : [ "message-router" ],
+            "topicCommInfrastructure" : "dmaap"
+        }],
+        "topicSinks" : [{
+            "topic" : "POLICY-PDP-PAP",
+            "servers" : [ "message-router" ],
+            "topicCommInfrastructure" : "dmaap"
+        }]
+    },
+    "healthCheckRestClientParameters":[{
+        "clientName": "api",
+        "hostname": "policy-api",
+        "port": 6969,
+        "userName": "healthcheck",
+        "password": "zb!XztG34",
+        "useHttps": true,
+        "basePath": "policy/api/v1/healthcheck"
+    },
+    {
+        "clientName": "distribution",
+        "hostname": "policy-distribution",
+        "port": 6969,
+        "userName": "healthcheck",
+        "password": "zb!XztG34",
+        "useHttps": true,
+        "basePath": "healthcheck"
+    }]
+}
diff --git a/runtime-controlloop/src/test/resources/parameters/NoParameters.json b/runtime-controlloop/src/test/resources/parameters/NoParameters.json
new file mode 100644
index 0000000..2c63c08
--- /dev/null
+++ b/runtime-controlloop/src/test/resources/parameters/NoParameters.json
@@ -0,0 +1,2 @@
+{
+}
diff --git a/runtime-controlloop/src/test/resources/parameters/TestParameters.json b/runtime-controlloop/src/test/resources/parameters/TestParameters.json
new file mode 100644
index 0000000..c3be762
--- /dev/null
+++ b/runtime-controlloop/src/test/resources/parameters/TestParameters.json
@@ -0,0 +1,79 @@
+{
+    "name": "ControlLoopRuntimeGroup",
+    "restServerParameters": {
+        "host": "0.0.0.0",
+        "port": 6969,
+        "userName": "healthcheck",
+        "password": "zb!XztG34",
+        "https": false,
+        "aaf": false
+    },
+    "participantParameters": {
+        "heartBeatMs": 120000,
+        "updateParameters": {
+            "maxRetryCount": 1,
+            "maxWaitMs": 30000
+        },
+        "stateChangeParameters": {
+            "maxRetryCount": 1,
+            "maxWaitMs": 30000
+        }
+    },
+    "databaseProviderParameters": {
+        "name": "PolicyProviderParameterGroup",
+        "implementation": "org.onap.policy.models.provider.impl.DatabasePolicyModelsProviderImpl",
+        "databaseDriver": "org.h2.Driver",
+        "databaseUrl": "jdbc:h2:mem:testdb",
+        "databaseUser": "policy",
+        "databasePassword": "P01icY",
+        "persistenceUnit": "ToscaConceptTest"
+    },
+    "topicParameterGroup": {
+        "topicSources": [
+            {
+                "topic": "POLICY-CLRUNTIME-PARTICIPANT",
+                "servers": [
+                    "localhost"
+                ],
+                "topicCommInfrastructure": "dmaap",
+                "fetchTimeout": 15000
+            }
+        ],
+        "topicSinks": [
+            {
+                "topic": "POLICY-CLRUNTIME-PARTICIPANT",
+                "servers": [
+                    "localhost"
+                ],
+                "topicCommInfrastructure": "dmaap"
+            },
+            {
+                "topic": "POLICY-NOTIFICATION",
+                "servers": [
+                    "localhost"
+                ],
+                "topicCommInfrastructure": "dmaap"
+            }
+        ]
+    },
+    "healthCheckRestClientParameters": [
+        {
+            "clientName": "api",
+            "hostname": "policy-api",
+            "port": 6969,
+            "userName": "healthcheck",
+            "password": "zb!XztG34",
+            "useHttps": true,
+            "basePath": "policy/api/v1/healthcheck"
+        },
+        {
+            "clientName": "distribution",
+            "hostname": "policy-distribution",
+            "port": 6969,
+            "userName": "healthcheck",
+            "password": "zb!XztG34",
+            "useHttps": true,
+            "basePath": "healthcheck"
+        }
+    ]
+}
diff --git a/runtime-controlloop/src/test/resources/parameters/TestParametersMariaDB.json b/runtime-controlloop/src/test/resources/parameters/TestParametersMariaDB.json
new file mode 100644
index 0000000..2c0127b
--- /dev/null
+++ b/runtime-controlloop/src/test/resources/parameters/TestParametersMariaDB.json
@@ -0,0 +1,79 @@
+{
+    "name": "ControlLoopRuntimeGroup",
+    "restServerParameters": {
+        "host": "0.0.0.0",
+        "port": 6969,
+        "userName": "healthcheck",
+        "password": "zb!XztG34",
+        "https": false,
+        "aaf": false
+    },
+    "participantParameters": {
+        "heartBeatMs": 120000,
+        "updateParameters": {
+            "maxRetryCount": 1,
+            "maxWaitMs": 30000
+        },
+        "stateChangeParameters": {
+            "maxRetryCount": 1,
+            "maxWaitMs": 30000
+        }
+    },
+    "databaseProviderParameters": {
+        "name": "PolicyProviderParameterGroup",
+        "implementation": "org.onap.policy.models.provider.impl.DatabasePolicyModelsProviderImpl",
+        "databaseDriver": "org.mariadb.jdbc.Driver",
+        "databaseUrl": "jdbc:mariadb://localhost:3306/controlloop",
+        "databaseUser": "policy",
+        "databasePassword": "P01icY",
+        "persistenceUnit": "CommissioningMariaDb"
+    },
+    "topicParameterGroup": {
+        "topicSources": [
+            {
+                "topic": "POLICY-CLRUNTIME-PARTICIPANT",
+                "servers": [
+                    "localhost"
+                ],
+                "topicCommInfrastructure": "dmaap",
+                "fetchTimeout": 15000
+            }
+        ],
+        "topicSinks": [
+            {
+                "topic": "POLICY-CLRUNTIME-PARTICIPANT",
+                "servers": [
+                    "localhost"
+                ],
+                "topicCommInfrastructure": "dmaap"
+            },
+            {
+                "topic": "POLICY-NOTIFICATION",
+                "servers": [
+                    "localhost"
+                ],
+                "topicCommInfrastructure": "dmaap"
+            }
+        ]
+    },
+    "healthCheckRestClientParameters": [
+        {
+            "clientName": "api",
+            "hostname": "policy-api",
+            "port": 6969,
+            "userName": "healthcheck",
+            "password": "zb!XztG34",
+            "useHttps": true,
+            "basePath": "policy/api/v1/healthcheck"
+        },
+        {
+            "clientName": "distribution",
+            "hostname": "policy-distribution",
+            "port": 6969,
+            "userName": "healthcheck",
+            "password": "zb!XztG34",
+            "useHttps": true,
+            "basePath": "healthcheck"
+        }
+    ]
+}
diff --git a/runtime-controlloop/src/test/resources/parameters/Unreadable.json b/runtime-controlloop/src/test/resources/parameters/Unreadable.json
new file mode 100644
index 0000000..3d117f4
--- /dev/null
+++ b/runtime-controlloop/src/test/resources/parameters/Unreadable.json
@@ -0,0 +1,78 @@
+{
+    "name": "ControlLoopRuntimeGroup",
+    "restServerParameters": {
+        "host": "0.0.0.0",
+        "port": 6969,
+        "userName": "healthcheck",
+        "password": "zb!XztG34",
+        "https": false,
+        "aaf": false
+    },
+    "participantParameters": {
+        "heartBeatMs": 120000,
+        "updateParameters": {
+            "maxRetryCount": 1,
+            "maxWaitMs": 30000
+        },
+        "stateChangeParameters": {
+            "maxRetryCount": 1,
+            "maxWaitMs": 30000
+        }
+    },
+    "databaseProviderParameters": {
+        "name": "PolicyProviderParameterGroup",
+        "implementation": "org.onap.policy.models.provider.impl.DatabasePolicyModelsProviderImpl",
+        "databaseDriver": "org.h2.Driver",
+        "databaseUrl": "jdbc:h2:mem:testdb",
+        "databaseUser": "policy",
+        "databasePassword": "P01icY",
+        "persistenceUnit": "ToscaConceptTest"
+    },
+    "topicParameterGroup": {
+        "topicSources": [
+            {
+                "topic": "POLICY-CLRUNTIME-PARTICIPANT",
+                "servers": [
+                    "localhost"
+                ],
+                "topicCommInfrastructure": "dmaap",
+                "fetchTimeout": 15000
+            }
+        ],
+        "topicSinks": [
+            {
+                "topic": "POLICY-CLRUNTIME-PARTICIPANT",
+                "servers": [
+                    "localhost"
+                ],
+                "topicCommInfrastructure": "dmaap"
+            },
+            {
+                "topic": "POLICY-NOTIFICATION",
+                "servers": [
+                    "localhost"
+                ],
+                "topicCommInfrastructure": "dmaap"
+            }
+        ]
+    },
+    "healthCheckRestClientParameters": [
+        {
+            "clientName": "api",
+            "hostname": "policy-api",
+            "port": 6969,
+            "userName": "healthcheck",
+            "password": "zb!XztG34",
+            "useHttps": true,
+            "basePath": "policy/api/v1/healthcheck"
+        },
+        {
+            "clientName": "distribution",
+            "hostname": "policy-distribution",
+            "port": 6969,
+            "userName": "healthcheck",
+            "password": "zb!XztG34",
+            "useHttps": true,
+            "basePath": "healthcheck"
+        }
+    ]
diff --git a/runtime-controlloop/src/test/resources/parameters/logback-test.xml b/runtime-controlloop/src/test/resources/parameters/logback-test.xml
new file mode 100644
index 0000000..e00c36b
--- /dev/null
+++ b/runtime-controlloop/src/test/resources/parameters/logback-test.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ============LICENSE_START=======================================================
+   Copyright (C) 2021 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=========================================================
+-->
+
+<configuration>
+
+    <contextName>Apex</contextName>
+    <statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />
+    <property name="LOG_DIR" value="${java.io.tmpdir}/clamp_logging/" />
+
+    <!-- USE FOR STD OUT ONLY -->
+    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <Pattern>%d %contextName [%t] %level %logger{36} - %msg%n</Pattern>
+        </encoder>
+    </appender>
+
+    <root level="info">
+        <appender-ref ref="STDOUT" />
+    </root>
+
+    <logger name="org.onap.policy.clamp.controlloop.runtime" level="trace" additivity="false">
+        <appender-ref ref="STDOUT" />
+    </logger>
+</configuration>
diff --git a/runtime-controlloop/src/test/resources/rest/controlloops/ControlLoopElementsNotFound.json b/runtime-controlloop/src/test/resources/rest/controlloops/ControlLoopElementsNotFound.json
new file mode 100644
index 0000000..faea7cd
--- /dev/null
+++ b/runtime-controlloop/src/test/resources/rest/controlloops/ControlLoopElementsNotFound.json
@@ -0,0 +1,142 @@
+{
+    "controlLoopList": [
+        {
+            "name": "PMSHInstance0",
+            "version": "1.0.1",
+            "definition": {
+                "name": "org.onap.domain.pmsh.PMSHControlLoopDefinition",
+                "version": "1.2.3"
+            },
+            "state": "UNINITIALISED",
+            "orderedState": "UNINITIALISED",
+            "description": "PMSH control loop instance 0",
+            "elements": {
+                "709c62b3-8918-41b9-a747-d21eb79c6c20": {
+                    "id": "709c62b3-8918-41b9-a747-d21eb79c6c20",
+                    "definition": {
+                        "name": "org.onap.domain.pmsh.DCAEMicroservice",
+                        "version": "1.2.3"
+                    },
+                    "participantType": {
+                        "name": "org.onap.dcae.controlloop.DCAEMicroserviceControlLoopParticipant",
+                        "version": "2.3.4"
+                    },
+                    "state": "UNINITIALISED",
+                    "orderedState": "UNINITIALISED",
+                    "description": "DCAE Control Loop Element for the PMSH instance 0 control loop"
+                },
+                "709c62b3-8918-41b9-a747-d21eb79c6c21": {
+                    "id": "709c62b3-8918-41b9-a747-d21eb79c6c21",
+                    "definition": {
+                        "name": "org.onap.domain.pmsh.PMSH_MonitoringPolicyControlLoopElement",
+                        "version": "1.2.3"
+                    },
+                    "participantType": {
+                        "name": "org.onap.policy.controlloop.PolicyControlLoopParticipant",
+                        "version": "2.3.1"
+                    },
+                    "state": "UNINITIALISED",
+                    "orderedState": "UNINITIALISED",
+                    "description": "Monitoring Policy Control Loop Element for the PMSH instance 0 control loop"
+                },
+                "709c62b3-8918-41b9-a747-d21eb79c6c22": {
+                    "id": "709c62b3-8918-41b9-a747-d21eb79c6c22",
+                    "definition": {
+                        "name": "org.onap.domain.pmsh.PMSH_OperationalPolicyControlLoopElement",
+                        "version": "1.2.3"
+                    },
+                    "participantType": {
+                        "name": "org.onap.policy.controlloop.PolicyControlLoopParticipant",
+                        "version": "2.3.1"
+                    },
+                    "state": "UNINITIALISED",
+                    "orderedState": "UNINITIALISED",
+                    "description": "Operational Policy Control Loop Element for the PMSH instance 0 control loop"
+                },
+                "709c62b3-8918-41b9-a747-d21eb79c6c23": {
+                    "id": "709c62b3-8918-41b9-a747-d21eb79c6c23",
+                    "definition": {
+                        "name": "org.onap.domain.pmsh.PMSH_CDS_ControlLoopElement",
+                        "version": "1.2.3"
+                    },
+                    "participantType": {
+                        "name": "org.onap.ccsdk.cds.controlloop.CdsControlLoopParticipant",
+                        "version": "2.2.1"
+                    },
+                    "state": "UNINITIALISED",
+                    "orderedState": "UNINITIALISED",
+                    "description": "CDS Control Loop Element for the PMSH instance 0 control loop"
+                }
+            }
+        },
+        {
+            "name": "PMSHInstance1",
+            "version": "1.0.1",
+            "definition": {
+                "name": "org.onap.domain.pmsh.PMSHControlLoopDefinition",
+                "version": "1.2.3"
+            },
+            "state": "UNINITIALISED",
+            "orderedState": "UNINITIALISED",
+            "description": "PMSH control loop instance 1",
+            "elements": {
+                "709c62b3-8918-41b9-a747-d21eb79c6c24": {
+                    "id": "709c62b3-8918-41b9-a747-e21eb79c6c24",
+                    "definition": {
+                        "name": "org.onap.domain.pmsh.DCAEMicroservice",
+                        "version": "1.2.3"
+                    },
+                    "participantType": {
+                        "name": "org.onap.dcae.controlloop.DCAEMicroserviceControlLoopParticipant",
+                        "version": "2.3.4"
+                    },
+                    "state": "UNINITIALISED",
+                    "orderedState": "UNINITIALISED",
+                    "description": "DCAE Control Loop Element for the PMSH instance 1 control loop"
+                },
+                "709c62b3-8918-41b9-a747-d21eb79c6c25": {
+                    "id": "709c62b3-8918-41b9-a747-e21eb79c6c25",
+                    "definition": {
+                        "name": "org.onap.domain.pmsh.PMSH_MonitoringPolicyControlLoopElement",
+                        "version": "1.2.3"
+                    },
+                    "participantType": {
+                        "name": "org.onap.policy.controlloop.PolicyControlLoopParticipant",
+                        "version": "2.3.1"
+                    },
+                    "state": "UNINITIALISED",
+                    "orderedState": "UNINITIALISED",
+                    "description": "Monitoring Policy Control Loop Element for the PMSH instance 1 control loop"
+                },
+                "709c62b3-8918-41b9-a747-d21eb79c6c26": {
+                    "id": "709c62b3-8918-41b9-a747-e21eb79c6c26",
+                    "definition": {
+                        "name": "org.onap.domain.pmsh.PMSH_OperationalPolicyControlLoopElement",
+                        "version": "1.2.3"
+                    },
+                    "participantType": {
+                        "name": "org.onap.policy.controlloop.PolicyControlLoopParticipant",
+                        "version": "2.3.1"
+                    },
+                    "state": "UNINITIALISED",
+                    "orderedState": "UNINITIALISED",
+                    "description": "Operational Policy Control Loop Element for the PMSH instance 1 control loop"
+                },
+                "709c62b3-8918-41b9-a747-d21eb79c6c27": {
+                    "id": "709c62b3-8918-41b9-a747-e21eb79c6c27",
+                    "definition": {
+                        "name": "org.onap.domain.pmsh.PMSH_CDS_ControlLoopElement",
+                        "version": "1.2.3"
+                    },
+                    "participantType": {
+                        "name": "org.onap.ccsdk.cds.controlloop.CdsControlLoopParticipant",
+                        "version": "2.2.1"
+                    },
+                    "state": "UNINITIALISED",
+                    "orderedState": "UNINITIALISED",
+                    "description": "CDS Control Loop Element for the PMSH instance 1 control loop"
+                }
+            }
+        }
+    ]
+}
diff --git a/runtime-controlloop/src/test/resources/rest/controlloops/ControlLoops.json b/runtime-controlloop/src/test/resources/rest/controlloops/ControlLoops.json
new file mode 100644
index 0000000..13ea1bf
--- /dev/null
+++ b/runtime-controlloop/src/test/resources/rest/controlloops/ControlLoops.json
@@ -0,0 +1,142 @@
+{
+    "controlLoopList": [
+        {
+            "name": "PMSHInstance0",
+            "version": "1.0.1",
+            "definition": {
+                "name": "org.onap.domain.pmsh.PMSHControlLoopDefinition",
+                "version": "1.2.3"
+            },
+            "state": "UNINITIALISED",
+            "orderedState": "UNINITIALISED",
+            "description": "PMSH control loop instance 0",
+            "elements": {
+                "709c62b3-8918-41b9-a747-d21eb79c6c20": {
+                    "id": "709c62b3-8918-41b9-a747-d21eb79c6c20",
+                    "definition": {
+                        "name": "org.onap.domain.pmsh.PMSH_DCAEMicroservice",
+                        "version": "1.2.3"
+                    },
+                    "participantType": {
+                        "name": "org.onap.dcae.controlloop.DCAEMicroserviceControlLoopParticipant",
+                        "version": "2.3.4"
+                    },
+                    "state": "UNINITIALISED",
+                    "orderedState": "UNINITIALISED",
+                    "description": "DCAE Control Loop Element for the PMSH instance 0 control loop"
+                },
+                "709c62b3-8918-41b9-a747-d21eb79c6c21": {
+                    "id": "709c62b3-8918-41b9-a747-d21eb79c6c21",
+                    "definition": {
+                        "name": "org.onap.domain.pmsh.PMSH_MonitoringPolicyControlLoopElement",
+                        "version": "1.2.3"
+                    },
+                    "participantType": {
+                        "name": "org.onap.policy.controlloop.PolicyControlLoopParticipant",
+                        "version": "2.3.1"
+                    },
+                    "state": "UNINITIALISED",
+                    "orderedState": "UNINITIALISED",
+                    "description": "Monitoring Policy Control Loop Element for the PMSH instance 0 control loop"
+                },
+                "709c62b3-8918-41b9-a747-d21eb79c6c22": {
+                    "id": "709c62b3-8918-41b9-a747-d21eb79c6c22",
+                    "definition": {
+                        "name": "org.onap.domain.pmsh.PMSH_OperationalPolicyControlLoopElement",
+                        "version": "1.2.3"
+                    },
+                    "participantType": {
+                        "name": "org.onap.policy.controlloop.PolicyControlLoopParticipant",
+                        "version": "2.3.1"
+                    },
+                    "state": "UNINITIALISED",
+                    "orderedState": "UNINITIALISED",
+                    "description": "Operational Policy Control Loop Element for the PMSH instance 0 control loop"
+                },
+                "709c62b3-8918-41b9-a747-d21eb79c6c23": {
+                    "id": "709c62b3-8918-41b9-a747-d21eb79c6c23",
+                    "definition": {
+                        "name": "org.onap.domain.pmsh.PMSH_CDS_ControlLoopElement",
+                        "version": "1.2.3"
+                    },
+                    "participantType": {
+                        "name": "org.onap.ccsdk.cds.controlloop.CdsControlLoopParticipant",
+                        "version": "2.2.1"
+                    },
+                    "state": "UNINITIALISED",
+                    "orderedState": "UNINITIALISED",
+                    "description": "CDS Control Loop Element for the PMSH instance 0 control loop"
+                }
+            }
+        },
+        {
+            "name": "PMSHInstance1",
+            "version": "1.0.1",
+            "definition": {
+                "name": "org.onap.domain.pmsh.PMSHControlLoopDefinition",
+                "version": "1.2.3"
+            },
+            "state": "UNINITIALISED",
+            "orderedState": "UNINITIALISED",
+            "description": "PMSH control loop instance 1",
+            "elements": {
+                "709c62b3-8918-41b9-a747-d21eb79c6c24": {
+                    "id": "709c62b3-8918-41b9-a747-e21eb79c6c24",
+                    "definition": {
+                        "name": "org.onap.domain.pmsh.PMSH_DCAEMicroservice",
+                        "version": "1.2.3"
+                    },
+                    "participantType": {
+                        "name": "org.onap.dcae.controlloop.DCAEMicroserviceControlLoopParticipant",
+                        "version": "2.3.4"
+                    },
+                    "state": "UNINITIALISED",
+                    "orderedState": "UNINITIALISED",
+                    "description": "DCAE Control Loop Element for the PMSH instance 1 control loop"
+                },
+                "709c62b3-8918-41b9-a747-d21eb79c6c25": {
+                    "id": "709c62b3-8918-41b9-a747-e21eb79c6c25",
+                    "definition": {
+                        "name": "org.onap.domain.pmsh.PMSH_MonitoringPolicyControlLoopElement",
+                        "version": "1.2.3"
+                    },
+                    "participantType": {
+                        "name": "org.onap.policy.controlloop.PolicyControlLoopParticipant",
+                        "version": "2.3.1"
+                    },
+                    "state": "UNINITIALISED",
+                    "orderedState": "UNINITIALISED",
+                    "description": "Monitoring Policy Control Loop Element for the PMSH instance 1 control loop"
+                },
+                "709c62b3-8918-41b9-a747-d21eb79c6c26": {
+                    "id": "709c62b3-8918-41b9-a747-e21eb79c6c26",
+                    "definition": {
+                        "name": "org.onap.domain.pmsh.PMSH_OperationalPolicyControlLoopElement",
+                        "version": "1.2.3"
+                    },
+                    "participantType": {
+                        "name": "org.onap.policy.controlloop.PolicyControlLoopParticipant",
+                        "version": "2.3.1"
+                    },
+                    "state": "UNINITIALISED",
+                    "orderedState": "UNINITIALISED",
+                    "description": "Operational Policy Control Loop Element for the PMSH instance 1 control loop"
+                },
+                "709c62b3-8918-41b9-a747-d21eb79c6c27": {
+                    "id": "709c62b3-8918-41b9-a747-e21eb79c6c27",
+                    "definition": {
+                        "name": "org.onap.domain.pmsh.PMSH_CDS_ControlLoopElement",
+                        "version": "1.2.3"
+                    },
+                    "participantType": {
+                        "name": "org.onap.ccsdk.cds.controlloop.CdsControlLoopParticipant",
+                        "version": "2.2.1"
+                    },
+                    "state": "UNINITIALISED",
+                    "orderedState": "UNINITIALISED",
+                    "description": "CDS Control Loop Element for the PMSH instance 1 control loop"
+                }
+            }
+        }
+    ]
+}
diff --git a/runtime-controlloop/src/test/resources/rest/controlloops/ControlLoopsNotFound.json b/runtime-controlloop/src/test/resources/rest/controlloops/ControlLoopsNotFound.json
new file mode 100644
index 0000000..9e97674
--- /dev/null
+++ b/runtime-controlloop/src/test/resources/rest/controlloops/ControlLoopsNotFound.json
@@ -0,0 +1,142 @@
+{
+    "controlLoopList": [
+        {
+            "name": "PMSHInstance0",
+            "version": "1.0.1",
+            "definition": {
+                "name": "org.onap.domain.PMSHControlLoopDefinition",
+                "version": "1.2.3"
+            },
+            "state": "UNINITIALISED",
+            "orderedState": "UNINITIALISED",
+            "description": "PMSH control loop instance 0",
+            "elements": {
+                "709c62b3-8918-41b9-a747-d21eb79c6c20": {
+                    "id": "709c62b3-8918-41b9-a747-d21eb79c6c20",
+                    "definition": {
+                        "name": "org.onap.domain.pmsh.PMSH_DCAEMicroservice",
+                        "version": "1.2.3"
+                    },
+                    "participantType": {
+                        "name": "org.onap.dcae.controlloop.DCAEMicroserviceControlLoopParticipant",
+                        "version": "2.3.4"
+                    },
+                    "state": "UNINITIALISED",
+                    "orderedState": "UNINITIALISED",
+                    "description": "DCAE Control Loop Element for the PMSH instance 0 control loop"
+                },
+                "709c62b3-8918-41b9-a747-d21eb79c6c21": {
+                    "id": "709c62b3-8918-41b9-a747-d21eb79c6c21",
+                    "definition": {
+                        "name": "org.onap.domain.pmsh.PMSH_MonitoringPolicyControlLoopElement",
+                        "version": "1.2.3"
+                    },
+                    "participantType": {
+                        "name": "org.onap.policy.controlloop.PolicyControlLoopParticipant",
+                        "version": "2.3.1"
+                    },
+                    "state": "UNINITIALISED",
+                    "orderedState": "UNINITIALISED",
+                    "description": "Monitoring Policy Control Loop Element for the PMSH instance 0 control loop"
+                },
+                "709c62b3-8918-41b9-a747-d21eb79c6c22": {
+                    "id": "709c62b3-8918-41b9-a747-d21eb79c6c22",
+                    "definition": {
+                        "name": "org.onap.domain.pmsh.PMSH_OperationalPolicyControlLoopElement",
+                        "version": "1.2.3"
+                    },
+                    "participantType": {
+                        "name": "org.onap.policy.controlloop.PolicyControlLoopParticipant",
+                        "version": "2.3.1"
+                    },
+                    "state": "UNINITIALISED",
+                    "orderedState": "UNINITIALISED",
+                    "description": "Operational Policy Control Loop Element for the PMSH instance 0 control loop"
+                },
+                "709c62b3-8918-41b9-a747-d21eb79c6c23": {
+                    "id": "709c62b3-8918-41b9-a747-d21eb79c6c23",
+                    "definition": {
+                        "name": "org.onap.domain.pmsh.PMSH_CDS_ControlLoopElement",
+                        "version": "1.2.3"
+                    },
+                    "participantType": {
+                        "name": "org.onap.ccsdk.cds.controlloop.CdsControlLoopParticipant",
+                        "version": "2.2.1"
+                    },
+                    "state": "UNINITIALISED",
+                    "orderedState": "UNINITIALISED",
+                    "description": "CDS Control Loop Element for the PMSH instance 0 control loop"
+                }
+            }
+        },
+        {
+            "name": "PMSHInstance1",
+            "version": "1.0.1",
+            "definition": {
+                "name": "org.onap.domain.PMSHControlLoopDefinition",
+                "version": "1.2.3"
+            },
+            "state": "UNINITIALISED",
+            "orderedState": "UNINITIALISED",
+            "description": "PMSH control loop instance 1",
+            "elements": {
+                "709c62b3-8918-41b9-a747-d21eb79c6c24": {
+                    "id": "709c62b3-8918-41b9-a747-e21eb79c6c24",
+                    "definition": {
+                        "name": "org.onap.domain.pmsh.PMSH_DCAEMicroservice",
+                        "version": "1.2.3"
+                    },
+                    "participantType": {
+                        "name": "org.onap.dcae.controlloop.DCAEMicroserviceControlLoopParticipant",
+                        "version": "2.3.4"
+                    },
+                    "state": "UNINITIALISED",
+                    "orderedState": "UNINITIALISED",
+                    "description": "DCAE Control Loop Element for the PMSH instance 1 control loop"
+                },
+                "709c62b3-8918-41b9-a747-d21eb79c6c25": {
+                    "id": "709c62b3-8918-41b9-a747-e21eb79c6c25",
+                    "definition": {
+                        "name": "org.onap.domain.pmsh.PMSH_MonitoringPolicyControlLoopElement",
+                        "version": "1.2.3"
+                    },
+                    "participantType": {
+                        "name": "org.onap.policy.controlloop.PolicyControlLoopParticipant",
+                        "version": "2.3.1"
+                    },
+                    "state": "UNINITIALISED",
+                    "orderedState": "UNINITIALISED",
+                    "description": "Monitoring Policy Control Loop Element for the PMSH instance 1 control loop"
+                },
+                "709c62b3-8918-41b9-a747-d21eb79c6c26": {
+                    "id": "709c62b3-8918-41b9-a747-e21eb79c6c26",
+                    "definition": {
+                        "name": "org.onap.domain.pmsh.PMSH_OperationalPolicyControlLoopElement",
+                        "version": "1.2.3"
+                    },
+                    "participantType": {
+                        "name": "org.onap.policy.controlloop.PolicyControlLoopParticipant",
+                        "version": "2.3.1"
+                    },
+                    "state": "UNINITIALISED",
+                    "orderedState": "UNINITIALISED",
+                    "description": "Operational Policy Control Loop Element for the PMSH instance 1 control loop"
+                },
+                "709c62b3-8918-41b9-a747-d21eb79c6c27": {
+                    "id": "709c62b3-8918-41b9-a747-e21eb79c6c27",
+                    "definition": {
+                        "name": "org.onap.domain.pmsh.PMSH_CDS_ControlLoopElement",
+                        "version": "1.2.3"
+                    },
+                    "participantType": {
+                        "name": "org.onap.ccsdk.cds.controlloop.CdsControlLoopParticipant",
+                        "version": "2.2.1"
+                    },
+                    "state": "UNINITIALISED",
+                    "orderedState": "UNINITIALISED",
+                    "description": "CDS Control Loop Element for the PMSH instance 1 control loop"
+                }
+            }
+        }
+    ]
+}
diff --git a/runtime-controlloop/src/test/resources/rest/controlloops/ControlLoopsUpdate.json b/runtime-controlloop/src/test/resources/rest/controlloops/ControlLoopsUpdate.json
new file mode 100644
index 0000000..025e2a1
--- /dev/null
+++ b/runtime-controlloop/src/test/resources/rest/controlloops/ControlLoopsUpdate.json
@@ -0,0 +1,142 @@
+{
+    "controlLoopList": [
+        {
+            "name": "PMSHInstance0",
+            "version": "1.0.1",
+            "definition": {
+                "name": "org.onap.domain.pmsh.PMSHControlLoopDefinition",
+                "version": "1.2.3"
+            },
+            "state": "UNINITIALISED",
+            "orderedState": "UNINITIALISED",
+            "description": "PMSH control loop instance 1",
+            "elements": {
+                "709c62b3-8918-41b9-a747-d21eb79c6c21": {
+                    "id": "709c62b3-8918-41b9-a747-d21eb79c6c21",
+                    "definition": {
+                        "name": "org.onap.domain.pmsh.PMSH_DCAEMicroservice",
+                        "version": "1.2.3"
+                    },
+                    "participantType": {
+                        "name": "org.onap.dcae.controlloop.DCAEMicroserviceControlLoopParticipant",
+                        "version": "2.3.4"
+                    },
+                    "state": "UNINITIALISED",
+                    "orderedState": "UNINITIALISED",
+                    "description": "DCAE Control Loop Element for the PMSH instance 0 control loop"
+                },
+                "709c62b3-8918-41b9-a747-d21eb79c6c22": {
+                    "id": "709c62b3-8918-41b9-a747-d21eb79c6c22",
+                    "definition": {
+                        "name": "org.onap.domain.pmsh.PMSH_MonitoringPolicyControlLoopElement",
+                        "version": "1.2.3"
+                    },
+                    "participantType": {
+                        "name": "org.onap.policy.controlloop.PolicyControlLoopParticipant",
+                        "version": "2.3.1"
+                    },
+                    "state": "UNINITIALISED",
+                    "orderedState": "UNINITIALISED",
+                    "description": "Monitoring Policy Control Loop Element for the PMSH instance 0 control loop"
+                },
+                "709c62b3-8918-41b9-a747-d21eb79c6c23": {
+                    "id": "709c62b3-8918-41b9-a747-d21eb79c6c23",
+                    "definition": {
+                        "name": "org.onap.domain.pmsh.PMSH_MonitoringPolicyControlLoopElement",
+                        "version": "1.2.3"
+                    },
+                    "participantType": {
+                        "name": "org.onap.policy.controlloop.PolicyControlLoopParticipant",
+                        "version": "2.3.1"
+                    },
+                    "state": "UNINITIALISED",
+                    "orderedState": "UNINITIALISED",
+                    "description": "Operational Policy Control Loop Element for the PMSH instance 0 control loop"
+                },
+                "709c62b3-8918-41b9-a747-d21eb79c6c24": {
+                    "id": "709c62b3-8918-41b9-a747-d21eb79c6c24",
+                    "definition": {
+                        "name": "org.onap.domain.pmsh.PMSH_CDS_ControlLoopElement",
+                        "version": "1.2.3"
+                    },
+                    "participantType": {
+                        "name": "org.onap.ccsdk.cds.controlloop.CdsControlLoopParticipant",
+                        "version": "2.2.1"
+                    },
+                    "state": "UNINITIALISED",
+                    "orderedState": "UNINITIALISED",
+                    "description": "CDS Control Loop Element for the PMSH instance 0 control loop"
+                }
+            }
+        },
+        {
+            "name": "PMSHInstance1",
+            "version": "1.0.1",
+            "definition": {
+                "name": "org.onap.domain.pmsh.PMSHControlLoopDefinition",
+                "version": "1.2.3"
+            },
+            "state": "UNINITIALISED",
+            "orderedState": "UNINITIALISED",
+            "description": "PMSH control loop instance 1",
+            "elements": {
+                "709c62b3-8918-41b9-a747-d21eb79c6c25": {
+                    "id": "709c62b3-8918-41b9-a747-e21eb79c6c25",
+                    "definition": {
+                        "name": "org.onap.domain.pmsh.PMSH_DCAEMicroservice",
+                        "version": "1.2.3"
+                    },
+                    "participantType": {
+                        "name": "org.onap.dcae.controlloop.DCAEMicroserviceControlLoopParticipant",
+                        "version": "2.3.4"
+                    },
+                    "state": "UNINITIALISED",
+                    "orderedState": "UNINITIALISED",
+                    "description": "DCAE Control Loop Element for the PMSH instance 1 control loop"
+                },
+                "709c62b3-8918-41b9-a747-d21eb79c6c26": {
+                    "id": "709c62b3-8918-41b9-a747-e21eb79c6c26",
+                    "definition": {
+                        "name": "org.onap.domain.pmsh.PMSH_MonitoringPolicyControlLoopElement",
+                        "version": "1.2.3"
+                    },
+                    "participantType": {
+                        "name": "org.onap.policy.controlloop.PolicyControlLoopParticipant",
+                        "version": "2.3.1"
+                    },
+                    "state": "UNINITIALISED",
+                    "orderedState": "UNINITIALISED",
+                    "description": "Monitoring Policy Control Loop Element for the PMSH instance 1 control loop"
+                },
+                "709c62b3-8918-41b9-a747-d21eb79c6c27": {
+                    "id": "709c62b3-8918-41b9-a747-e21eb79c6c27",
+                    "definition": {
+                        "name": "org.onap.domain.pmsh.PMSH_MonitoringPolicyControlLoopElement",
+                        "version": "1.2.3"
+                    },
+                    "participantType": {
+                        "name": "org.onap.policy.controlloop.PolicyControlLoopParticipant",
+                        "version": "2.3.1"
+                    },
+                    "state": "UNINITIALISED",
+                    "orderedState": "UNINITIALISED",
+                    "description": "Operational Policy Control Loop Element for the PMSH instance 1 control loop"
+                },
+                "709c62b3-8918-41b9-a747-d21eb79c6c28": {
+                    "id": "709c62b3-8918-41b9-a747-e21eb79c6c28",
+                    "definition": {
+                        "name": "org.onap.domain.pmsh.PMSH_CDS_ControlLoopElement",
+                        "version": "1.2.3"
+                    },
+                    "participantType": {
+                        "name": "org.onap.ccsdk.cds.controlloop.CdsControlLoopParticipant",
+                        "version": "2.2.1"
+                    },
+                    "state": "UNINITIALISED",
+                    "orderedState": "UNINITIALISED",
+                    "description": "CDS Control Loop Element for the PMSH instance 1 control loop"
+                }
+            }
+        }
+    ]
+}
diff --git a/runtime-controlloop/src/test/resources/rest/controlloops/ControlLoopsVersionNotMatches.json b/runtime-controlloop/src/test/resources/rest/controlloops/ControlLoopsVersionNotMatches.json
new file mode 100644
index 0000000..76131af
--- /dev/null
+++ b/runtime-controlloop/src/test/resources/rest/controlloops/ControlLoopsVersionNotMatches.json
@@ -0,0 +1,142 @@
+{
+    "controlLoopList": [
+        {
+            "name": "PMSHInstance0",
+            "version": "1.0.1",
+            "definition": {
+                "name": "org.onap.domain.pmsh.PMSHControlLoopDefinition",
+                "version": "1.2.3"
+            },
+            "state": "UNINITIALISED",
+            "orderedState": "UNINITIALISED",
+            "description": "PMSH control loop instance 0",
+            "elements": {
+                "709c62b3-8918-41b9-a747-d21eb79c6c20": {
+                    "id": "709c62b3-8918-41b9-a747-d21eb79c6c20",
+                    "definition": {
+                        "name": "org.onap.domain.pmsh.PMSH_DCAEMicroservice",
+                        "version": "1.0.0"
+                    },
+                    "participantType": {
+                        "name": "org.onap.dcae.controlloop.DCAEMicroserviceControlLoopParticipant",
+                        "version": "2.3.4"
+                    },
+                    "state": "UNINITIALISED",
+                    "orderedState": "UNINITIALISED",
+                    "description": "DCAE Control Loop Element for the PMSH instance 0 control loop"
+                },
+                "709c62b3-8918-41b9-a747-d21eb79c6c21": {
+                    "id": "709c62b3-8918-41b9-a747-d21eb79c6c21",
+                    "definition": {
+                        "name": "org.onap.domain.pmsh.PMSH_MonitoringPolicyControlLoopElement",
+                        "version": "1.2.3"
+                    },
+                    "participantType": {
+                        "name": "org.onap.policy.controlloop.PolicyControlLoopParticipant",
+                        "version": "2.3.1"
+                    },
+                    "state": "UNINITIALISED",
+                    "orderedState": "UNINITIALISED",
+                    "description": "Monitoring Policy Control Loop Element for the PMSH instance 0 control loop"
+                },
+                "709c62b3-8918-41b9-a747-d21eb79c6c22": {
+                    "id": "709c62b3-8918-41b9-a747-d21eb79c6c22",
+                    "definition": {
+                        "name": "org.onap.domain.pmsh.PMSH_OperationalPolicyControlLoopElement",
+                        "version": "1.2.3"
+                    },
+                    "participantType": {
+                        "name": "org.onap.policy.controlloop.PolicyControlLoopParticipant",
+                        "version": "2.3.1"
+                    },
+                    "state": "UNINITIALISED",
+                    "orderedState": "UNINITIALISED",
+                    "description": "Operational Policy Control Loop Element for the PMSH instance 0 control loop"
+                },
+                "709c62b3-8918-41b9-a747-d21eb79c6c23": {
+                    "id": "709c62b3-8918-41b9-a747-d21eb79c6c23",
+                    "definition": {
+                        "name": "org.onap.domain.pmsh.PMSH_CDS_ControlLoopElement",
+                        "version": "1.2.3"
+                    },
+                    "participantType": {
+                        "name": "org.onap.ccsdk.cds.controlloop.CdsControlLoopParticipant",
+                        "version": "2.2.1"
+                    },
+                    "state": "UNINITIALISED",
+                    "orderedState": "UNINITIALISED",
+                    "description": "CDS Control Loop Element for the PMSH instance 0 control loop"
+                }
+            }
+        },
+        {
+            "name": "PMSHInstance1",
+            "version": "1.0.1",
+            "definition": {
+                "name": "org.onap.domain.pmsh.PMSHControlLoopDefinition",
+                "version": "1.2.3"
+            },
+            "state": "UNINITIALISED",
+            "orderedState": "UNINITIALISED",
+            "description": "PMSH control loop instance 1",
+            "elements": {
+                "709c62b3-8918-41b9-a747-d21eb79c6c24": {
+                    "id": "709c62b3-8918-41b9-a747-e21eb79c6c24",
+                    "definition": {
+                        "name": "org.onap.domain.pmsh.PMSH_DCAEMicroservice",
+                        "version": "1.0.0"
+                    },
+                    "participantType": {
+                        "name": "org.onap.dcae.controlloop.DCAEMicroserviceControlLoopParticipant",
+                        "version": "2.3.4"
+                    },
+                    "state": "UNINITIALISED",
+                    "orderedState": "UNINITIALISED",
+                    "description": "DCAE Control Loop Element for the PMSH instance 1 control loop"
+                },
+                "709c62b3-8918-41b9-a747-d21eb79c6c25": {
+                    "id": "709c62b3-8918-41b9-a747-e21eb79c6c25",
+                    "definition": {
+                        "name": "org.onap.domain.pmsh.PMSH_MonitoringPolicyControlLoopElement",
+                        "version": "1.2.3"
+                    },
+                    "participantType": {
+                        "name": "org.onap.policy.controlloop.PolicyControlLoopParticipant",
+                        "version": "2.3.1"
+                    },
+                    "state": "UNINITIALISED",
+                    "orderedState": "UNINITIALISED",
+                    "description": "Monitoring Policy Control Loop Element for the PMSH instance 1 control loop"
+                },
+                "709c62b3-8918-41b9-a747-d21eb79c6c26": {
+                    "id": "709c62b3-8918-41b9-a747-e21eb79c6c26",
+                    "definition": {
+                        "name": "org.onap.domain.pmsh.PMSH_OperationalPolicyControlLoopElement",
+                        "version": "1.2.3"
+                    },
+                    "participantType": {
+                        "name": "org.onap.policy.controlloop.PolicyControlLoopParticipant",
+                        "version": "2.3.1"
+                    },
+                    "state": "UNINITIALISED",
+                    "orderedState": "UNINITIALISED",
+                    "description": "Operational Policy Control Loop Element for the PMSH instance 1 control loop"
+                },
+                "709c62b3-8918-41b9-a747-d21eb79c6c27": {
+                    "id": "709c62b3-8918-41b9-a747-e21eb79c6c27",
+                    "definition": {
+                        "name": "org.onap.domain.pmsh.PMSH_CDS_ControlLoopElement",
+                        "version": "1.2.3"
+                    },
+                    "participantType": {
+                        "name": "org.onap.ccsdk.cds.controlloop.CdsControlLoopParticipant",
+                        "version": "2.2.1"
+                    },
+                    "state": "UNINITIALISED",
+                    "orderedState": "UNINITIALISED",
+                    "description": "CDS Control Loop Element for the PMSH instance 1 control loop"
+                }
+            }
+        }
+    ]
+}
diff --git a/runtime-controlloop/src/test/resources/rest/controlloops/PassiveCommand.json b/runtime-controlloop/src/test/resources/rest/controlloops/PassiveCommand.json
new file mode 100644
index 0000000..9c87e43
--- /dev/null
+++ b/runtime-controlloop/src/test/resources/rest/controlloops/PassiveCommand.json
@@ -0,0 +1,13 @@
+{
+    "orderedState": "PASSIVE",
+    "controlLoopIdentifierList": [
+        {
+            "name": "PMSHInstance0",
+            "version": "1.0.1"
+        },
+        {
+            "name": "PMSHInstance1",
+            "version": "1.0.1"
+        }
+    ]
+}
diff --git a/runtime-controlloop/src/test/resources/rest/monitoring/TestClElementStatistics.json b/runtime-controlloop/src/test/resources/rest/monitoring/TestClElementStatistics.json
new file mode 100644
index 0000000..21a048f
--- /dev/null
+++ b/runtime-controlloop/src/test/resources/rest/monitoring/TestClElementStatistics.json
@@ -0,0 +1,44 @@
+{
+  "clElementStatistics":[
+    {
+      "participantId":{
+        "name":"name1",
+        "version":"1.001"
+      },
+      "id": "709c62b3-8918-41b9-a747-d21eb79c6c20",
+      "timeStamp": "2021-01-10T13:45:00.000Z",
+      "controlLoopState": "UNINITIALISED",
+      "clElementUptime":250
+    },
+    {
+      "participantId":{
+        "name":"name1",
+        "version":"1.001"
+      },
+      "id": "709c62b3-8918-41b9-a747-d21eb79c6c20",
+      "timeStamp": "2021-01-10T15:45:00.000Z",
+      "controlLoopState": "UNINITIALISED",
+      "clElementUptime":450
+    },
+    {
+      "participantId":{
+        "name":"name2",
+        "version":"1.001"
+      },
+      "id": "709c62b3-8918-41b9-a747-d21eb79c6c21",
+      "timeStamp": "2021-01-10T14:25:00.000Z",
+      "controlLoopState": "UNINITIALISED",
+      "clElementUptime":330
+    },
+    {
+      "participantId":{
+        "name":"name2",
+        "version":"1.001"
+      },
+      "id": "709c62b3-8918-41b9-a747-d21eb79c6c21",
+      "timeStamp": "2021-01-10T16:35:00.000Z",
+      "controlLoopState": "UNINITIALISED",
+      "clElementUptime":650
+    }
+  ]
+}
\ No newline at end of file
diff --git a/runtime-controlloop/src/test/resources/rest/monitoring/TestClElementStatistics_Invalid.json b/runtime-controlloop/src/test/resources/rest/monitoring/TestClElementStatistics_Invalid.json
new file mode 100644
index 0000000..2cf2619
--- /dev/null
+++ b/runtime-controlloop/src/test/resources/rest/monitoring/TestClElementStatistics_Invalid.json
@@ -0,0 +1,13 @@
+{
+  "clElementStatisticsList":[
+    {
+      "participantId":{
+        "name":"name1",
+        "version":"1.001"
+      },
+      "id": "709c62b3-8918-41b9-a747-d21eb79c6c20",
+      "controlLoopState": "UNINITIALISED",
+      "clElementUptime":250
+    }
+  ]
+}
\ No newline at end of file
diff --git a/runtime-controlloop/src/test/resources/rest/monitoring/TestParticipantStatistics.json b/runtime-controlloop/src/test/resources/rest/monitoring/TestParticipantStatistics.json
new file mode 100644
index 0000000..acd88e2
--- /dev/null
+++ b/runtime-controlloop/src/test/resources/rest/monitoring/TestParticipantStatistics.json
@@ -0,0 +1,46 @@
+{
+  "statisticsList":[
+    {
+      "participantId":{
+        "name":"name1",
+        "version":"1.001"
+      },
+      "timeStamp": "2021-01-10T13:45:00.000Z",
+      "state": "PASSIVE",
+      "healthStatus": "HEALTHY",
+      "eventCount":250,
+      "lastExecutionTime":100,
+      "averageExecutionTime":90,
+      "upTime":1000,
+      "lastStart":3000
+    },
+    {
+      "participantId":{
+        "name":"name1",
+        "version":"1.001"
+      },
+      "timeStamp": "2021-01-10T15:45:00.000Z",
+      "state": "PASSIVE",
+      "healthStatus": "HEALTHY",
+      "eventCount":262,
+      "lastExecutionTime":100,
+      "averageExecutionTime":90,
+      "upTime":2000,
+      "lastStart":3000
+    },
+    {
+      "participantId":{
+        "name":"name2",
+        "version":"1.001"
+      },
+      "timeStamp": "2021-01-27T14:25:00.000Z",
+      "state": "PASSIVE",
+      "healthStatus": "HEALTHY",
+      "eventCount":245,
+      "lastExecutionTime":1020,
+      "averageExecutionTime":85,
+      "upTime":1050,
+      "lastStart":3100
+    }
+  ]
+}
\ No newline at end of file
diff --git a/runtime-controlloop/src/test/resources/rest/monitoring/TestParticipantStatistics_Invalid.json b/runtime-controlloop/src/test/resources/rest/monitoring/TestParticipantStatistics_Invalid.json
new file mode 100644
index 0000000..7281822
--- /dev/null
+++ b/runtime-controlloop/src/test/resources/rest/monitoring/TestParticipantStatistics_Invalid.json
@@ -0,0 +1,16 @@
+{
+  "participantStatisticsList":[
+    {
+      "participantId":{
+        "name":"name3",
+        "version":"1.001"
+      },
+      "state": "PASSIVE",
+      "eventCount":250,
+      "lastExecutionTime":100,
+      "averageExecutionTime":90,
+      "upTime":1000,
+      "lastStart":3000
+    }
+  ]
+}
\ No newline at end of file
diff --git a/runtime-controlloop/src/test/resources/rest/servicetemplates/PMSHMultipleCLTosca.yaml b/runtime-controlloop/src/test/resources/rest/servicetemplates/PMSHMultipleCLTosca.yaml
new file mode 100644
index 0000000..099e2e9
--- /dev/null
+++ b/runtime-controlloop/src/test/resources/rest/servicetemplates/PMSHMultipleCLTosca.yaml
@@ -0,0 +1,221 @@
+tosca_definitions_version: tosca_simple_yaml_1_3
+data_types:
+  onap.datatypes.ToscaConceptIdentifier:
+    derived_from: tosca.datatypes.Root
+    properties:
+      name:
+        type: string
+        required: true
+      version:
+        type: string
+        required: true
+node_types:
+  org.onap.policy.clamp.controlloop.Participant:
+    version: 1.0.1
+    derived_from: tosca.nodetypes.Root
+    properties:
+      provider:
+        type: string
+        requred: false
+  org.onap.policy.clamp.controlloop.ControlLoopElement:
+    version: 1.0.1
+    derived_from: tosca.nodetypes.Root
+    properties:
+      provider:
+        type: string
+        requred: false
+      participant_id:
+        type: onap.datatypes.ToscaConceptIdentifier
+        requred: true
+  org.onap.policy.clamp.controlloop.ControlLoop:
+    version: 1.0.1
+    derived_from: tosca.nodetypes.Root
+    properties:
+      provider:
+        type: string
+        requred: false
+      elements:
+        type: list
+        required: true
+        entry_schema:
+          type: onap.datatypes.ToscaConceptIdentifier
+  org.onap.policy.clamp.controlloop.DCAEMicroserviceControlLoopElement:
+    version: 1.0.1
+    derived_from: org.onap.policy.clamp.controlloop.ControlLoopElement
+    properties:
+      dcae_blueprint_id:
+        type: onap.datatypes.ToscaConceptIdentifier
+        requred: true
+  org.onap.policy.clamp.controlloop.PolicyTypeControlLoopElement:
+    version: 1.0.1
+    derived_from: org.onap.policy.clamp.controlloop.ControlLoopElement
+    properties:
+      policy_type_id:
+        type: onap.datatypes.ToscaConceptIdentifier
+        requred: true
+  org.onap.policy.clamp.controlloop.CDSControlLoopElement:
+    version: 1.0.1
+    derived_from: org.onap.policy.clamp.controlloop.ControlLoopElement
+    properties:
+      cds_blueprint_id:
+        type: onap.datatypes.ToscaConceptIdentifier
+        requred: true
+topology_template:
+  node_templates:
+    org.onap.dcae.controlloop.DCAEMicroserviceControlLoopParticipant:
+      version: 2.3.4
+      type: org.onap.policy.clamp.controlloop.Participant
+      type_version: 1.0.1
+      description: Participant for DCAE microservices
+      properties:
+        provider: ONAP
+    org.onap.policy.controlloop.PolicyControlLoopParticipant:
+      version: 2.2.1
+      type: org.onap.policy.clamp.controlloop.Participant
+      type_version: 1.0.1
+      description: Participant for DCAE microservices
+      properties:
+        provider: ONAP
+    org.onap.ccsdk.cds.controlloop.CdsControlLoopParticipant:
+      version: 2.2.1
+      type: org.onap.policy.clamp.controlloop.Participant
+      type_version: 1.0.1
+      description: Participant for DCAE microservices
+      properties:
+        provider: ONAP
+    org.onap.domain.pmsh.PMSH_DCAEMicroservice:
+      version: 1.2.3
+      type: org.onap.policy.clamp.controlloop.DCAEMicroserviceControlLoopElement
+      type_version: 1.0.0
+      description: Control loop element for the DCAE microservice for Performance Management Subscription Handling
+      properties:
+        provider: Ericsson
+        participant_id:
+          name: org.onap.dcae.controlloop.DCAEMicroserviceControlLoopParticipant
+          version: 2.3.4
+        dcae_blueprint_id:
+          name: org.onap.dcae.blueprints.PMSHBlueprint
+          version: 1.0.0
+    org.onap.domain.pmsh.PMSH_MonitoringPolicyControlLoopElement:
+      version: 1.2.3
+      type: org.onap.policy.clamp.controlloop.PolicyTypeControlLoopElement
+      type_version: 1.0.0
+      description: Control loop element for the monitoring policy for Performance Management Subscription Handling
+      properties:
+        provider: Ericsson
+        participant_id:
+          name: org.onap.policy.controlloop.PolicyControlLoopParticipant
+          version: 2.2.1
+        policy_type_id:
+          name: onap.policies.monitoring.pm-subscription-handler
+          version: 1.0.0
+    org.onap.domain.pmsh.PMSH_OperationalPolicyControlLoopElement:
+      version: 1.2.3
+      type: org.onap.policy.clamp.controlloop.PolicyTypeControlLoopElement
+      type_version: 1.0.0
+      description: Control loop element for the operational policy for Performance Management Subscription Handling
+      properties:
+        provider: Ericsson
+        participant_id:
+          name: org.onap.policy.controlloop.PolicyControlLoopParticipant
+          version: 2.2.1
+        policy_type_id:
+          name: onap.policies.operational.pm-subscription-handler
+          version: 1.0.0
+    org.onap.domain.pmsh.PMSH_CDS_ControlLoopElement:
+      version: 1.2.3
+      type: org.onap.policy.clamp.controlloop.ControlLoopElement
+      type_version: 1.0.0
+      description: Control loop element for CDS for Performance Management Subscription Handling
+      properties:
+        provider: Ericsson
+        participant_Id:
+          name: org.onap.ccsdk.cds.controlloop.CdsControlLoopParticipant
+          version: 3.2.1
+        cds_blueprint_id:
+          name: org.onap.ccsdk.cds.PMSHCdsBlueprint
+          version: 1.0.0
+    org.onap.domain.pmsh.PMSHControlLoopDefinition:
+      version: 1.2.3
+      type: org.onap.policy.clamp.controlloop.ControlLoop
+      type_version: 1.0.0
+      description: Control loop for Performance Management Subscription Handling
+      properties:
+        provider: Ericsson
+        elements:
+          - name: org.onap.domain.pmsh.PMSH_DCAEMicroservice
+            version: 1.2.3
+          - name: org.onap.domain.pmsh.PMSH_MonitoringPolicyControlLoopElement
+            version: 1.2.3
+          - name: org.onap.domain.pmsh.PMSH_OperationalPolicyControlLoopElement
+            version: 1.2.3
+          - name: org.onap.domain.pmsh.PMSH_CDS_ControlLoopElement
+            version: 1.2.3
+    org.onap.domain.pmsh.PMSD_DCAEMicroservice:
+      version: 1.2.3
+      type: org.onap.policy.clamp.controlloop.DCAEMicroserviceControlLoopElement
+      type_version: 1.0.0
+      description: Control loop element for the DCAE microservice for Performance Management Subscription Handling
+      properties:
+        provider: Ericsson
+        participant_id:
+          name: org.onap.dcae.controlloop.DCAEMicroserviceControlLoopParticipant
+          version: 2.3.4
+        dcae_blueprint_id:
+          name: org.onap.dcae.blueprints.PMSDBlueprint
+          version: 1.0.0
+    org.onap.domain.pmsh.PMSD_MonitoringPolicyControlLoopElement:
+      version: 1.2.3
+      type: org.onap.policy.clamp.controlloop.PolicyTypeControlLoopElement
+      type_version: 1.0.0
+      description: Control loop element for the monitoring policy for Performance Management Subscription Handling
+      properties:
+        provider: Ericsson
+        participant_id:
+          name: org.onap.policy.controlloop.PolicyControlLoopParticipant
+          version: 2.2.1
+        policy_type_id:
+          name: onap.policies.monitoring.pm-subscription-handler
+          version: 1.0.0
+    org.onap.domain.pmsh.PMSD_OperationalPolicyControlLoopElement:
+      version: 1.2.3
+      type: org.onap.policy.clamp.controlloop.PolicyTypeControlLoopElement
+      type_version: 1.0.0
+      description: Control loop element for the operational policy for Performance Management Subscription Handling
+      properties:
+        provider: Ericsson
+        participant_id:
+          name: org.onap.policy.controlloop.PolicyControlLoopParticipant
+          version: 2.2.1
+        policy_type_id:
+          name: onap.policies.operational.pm-subscription-handler
+          version: 1.0.0
+    org.onap.domain.pmsh.PMSD_CDS_ControlLoopElement:
+      version: 1.2.3
+      type: org.onap.policy.clamp.controlloop.ControlLoopElement
+      type_version: 1.0.0
+      description: Control loop element for CDS for Performance Management Subscription Handling
+      properties:
+        provider: Ericsson
+        participant_Id:
+          name: org.onap.ccsdk.cds.controlloop.CdsControlLoopParticipant
+          version: 3.2.1
+        cds_blueprint_id:
+          name: org.onap.ccsdk.cds.PMSDCdsBlueprint
+          version: 1.0.0
+    org.onap.domain.pmsh.PMSDControlLoopDefinition:
+      version: 1.2.3
+      type: org.onap.policy.clamp.controlloop.ControlLoop
+      type_version: 1.0.0
+      description: Control loop for Performance Management Subscription Handling
+      properties:
+        provider: Ericsson
+        elements:
+          - name: org.onap.domain.pmsh.PMSD_DCAEMicroservice
+            version: 1.2.3
+          - name: org.onap.domain.pmsh.PMSD_MonitoringPolicyControlLoopElement
+            version: 1.2.3
+          - name: org.onap.domain.pmsh.PMSD_OperationalPolicyControlLoopElement
+            version: 1.2.3
+          - name: org.onap.domain.pmsh.PMSD_CDS_ControlLoopElement
+            version: 1.2.3
diff --git a/runtime-controlloop/src/test/resources/rest/servicetemplates/pm_control_loop_tosca.yaml b/runtime-controlloop/src/test/resources/rest/servicetemplates/pm_control_loop_tosca.yaml
new file mode 100644
index 0000000..01f825f
--- /dev/null
+++ b/runtime-controlloop/src/test/resources/rest/servicetemplates/pm_control_loop_tosca.yaml
@@ -0,0 +1,452 @@
+tosca_definitions_version: tosca_simple_yaml_1_3
+capability_types:
+  org.onap.EventProducer:
+    properties:
+      carrier_protocol_type:
+        type: string
+        required: true
+        constraints:
+        - valid_values:
+          - DMAAP_message_router
+          - SOMETHING_ELSE
+          - REST
+      data_format:
+        type: string
+        required: true
+        constraints:
+        - valid_values:
+          - JSON
+          - YAML
+          - JMS
+      event_format:
+        type: string
+        required: true
+      event_format_version:
+        type: string
+        required: false
+      config_keys:
+        type: list
+        required: false
+        entry_schema:
+          type: string
+          constraints:
+          - valid_values:
+            - all valid values should be added here
+            - if not specified, events of any config key may be generated
+            - 'examples for config_key: ves-measurement, ves-syslog, tca_handle_out,
+              etc.'
+    version: 0.0.1
+    derived_from: tosca.capabilities.Root
+  org.onap.EventConsumer:
+    properties:
+      responding_capability:
+        type: string
+        required: false
+      carrier_protocol_type:
+        type: string
+        required: true
+        constraints:
+        - valid_values:
+          - DMAAP_message_router
+          - SOMETHING_ELSE
+          - REST
+      data_format:
+        type: string
+        required: true
+        constraints:
+        - valid_values:
+          - JSON
+          - YAML
+          - JMS
+          - all valid values should be added here
+      event_format:
+        type: string
+        description: 'examples for event_format: Ves_specification, LinkUp, VnfConfigured,
+          etc.'
+        required: true
+      event_format_version:
+        type: string
+        description: 'examples for event_format_version: 5.28.4, 7.30.1, etc.'
+        required: false
+      config_keys:
+        type: list
+        required: false
+        entry_schema:
+          type: string
+          constraints:
+          - valid_values:
+            - all valid values should be added here
+            - if not specified, events of any config key may be generated
+            - 'examples for config_key: ves-measurement, ves-syslog, tca_handle_out,
+              etc.'
+    version: 0.0.1
+    derived_from: tosca.capabilities.Root
+node_types:
+  org.onap.DynamicConfig:
+    properties:
+      application_name:
+        type: string
+        description: Value used to tie the config to an application ? should we be
+          using a relationship here instead?
+        required: true
+      application_version:
+        type: string
+        required: true
+      application_provider:
+        type: string
+        required: false
+      data_types:
+        type: object
+        required: false
+      schema:
+        type: object
+        required: false
+    version: 0.0.1
+    derived_from: tosca.nodes.Root
+  org.onap.APP:
+    properties:
+      application_name:
+        type: string
+        description: Human readable name for the application Product
+        required: false
+      provider:
+        type: string
+        description: Provider of the application and of the descriptor
+        required: true
+      application_version:
+        type: string
+        description: Software version of the application
+        required: true
+      blueprint_id:
+        type: string
+        description: A reference to the app blueprint
+        required: false
+      monitoring_policy:
+        type: string
+        description: A reference to the monitoring policy
+        required: false
+    requirements:
+    - receive:
+        capability: org.onap.EventProducer
+        relationship: org.onap.PropagateEvent
+        occurrences:
+        - 0.0
+        - UNBOUNDED
+        version: 0.0.0
+    - send:
+        capability: org.onap.EventConsumer
+        relationship: org.onap.PropagateEvent
+        occurrences:
+        - 0.0
+        - UNBOUNDED
+        version: 0.0.0
+    version: 0.0.1
+    derived_from: tosca.nodes.Root
+  org.onap.EventRelay:
+    properties:
+      event_format:
+        type: string
+        description: 'examples for event_format: Ves_specification, etc.'
+        required: true
+      event_format_version:
+        type: string
+        description: 'examples for event_format_version: 5.28.4, 7.30.1, etc.'
+        required: true
+      config_keys:
+        type: list
+        required: false
+        entry_schema:
+          type: string
+          constraints:
+          - valid_values:
+            - all valid values should be added here
+            - if not specified, events of any config key is relayed
+            - 'examples for config_key: ves-measurement, ves-syslog, tca_handle_out,
+              etc.'
+      supported_carrier_protocols:
+        type: map
+        description: 'A map describing supported carrier protocols and translations.
+          The tuples define what protocol combinations are supported on the producer
+          and consumer side: e.g. { REST: REST, DMAAP: REST, DMAAP: DMAAP}'
+        required: true
+        key_schema:
+          type: string
+          constraints:
+          - valid_values:
+            - DMAAP_message_router
+            - SOMETHING_ELSE
+            - REST
+            - all valid values should be added here
+        entry_schema:
+          type: string
+          constraints:
+          - valid_values:
+            - DMAAP_message_router
+            - SOMETHING_ELSE
+            - REST
+            - all valid values should be added here
+      supported_data_formats:
+        type: map
+        description: 'Is a map describing supported data formats and translation.
+          The tuples define what protocol combinations are supported on the producer
+          and consumer side: e.g. { JSON: JSON, JMS: JSON, YAML:YAML }'
+        required: true
+        key_schema:
+          type: string
+          constraints:
+          - valid_values:
+            - JSON
+            - JMS
+            - YAML
+            - etc
+            - all valid values should be added here
+        entry_schema:
+          type: string
+          constraints:
+          - valid_values:
+            - JSON
+            - JMS
+            - YAML
+            - etc
+            - all valid values should be added here
+    requirements:
+    - receive:
+        capability: org.onap.EventProducer
+        relationship: org.onap.PropagateEvent
+        occurrences:
+        - 0.0
+        - UNBOUNDED
+        version: 0.0.0
+    - send:
+        capability: org.onap.EventConsumer
+        relationship: org.onap.PropagateEvent
+        occurrences:
+        - 0.0
+        - UNBOUNDED
+        version: 0.0.0
+    version: 0.0.1
+    derived_from: tosca.nodes.Root
+relationship_types:
+  org.onap.PropagateEvent:
+    properties:
+      config_keys:
+        type: list
+        description: The relationship type used on requirements to org.onap.EventProducer
+          and org.onap.EventConsumer capabilities. Filters events by specific config_keys
+          to be transferred by this relationship. That is, any event with a specific
+          config_key found in the list is transferred. If list is not defined or is
+          empty, events with all config_keys are transferred.
+        required: false
+        entry_schema:
+          type: string
+    version: 0.0.1
+    derived_from: tosca.relationships.Root
+topology_template:
+  inputs:
+    pm_subscription_topic:
+      type: string
+    pm_subscription_response_topic:
+      type: string
+    pm_subscription_handler_blueprint_id:
+      type: string
+    pm_subscription_operational_policy_id:
+      type: string
+    pm_subscription_cds_blueprint_id:
+      type: string
+    enable_tls:
+      type: string
+  node_templates:
+    org.onap.PM_Subscription_Handler:
+      type: org.onap.APP
+      properties:
+        application_name: PM Subscription Handler
+        provider: Ericsson
+        application_version: 1.0.0
+        artifact_id:
+          get_input: pm_subscription_handler_blueprint_id
+          description: Is this a reference to the DCAE Cloudify Blueprint that is
+            already stored(or will be stored before CL configuration & instatiation)
+            in DCAE Inventory?
+        artifact_config:
+          enable_tls:
+            get_input: enable_tls
+          pmsh_publish_topic_name:
+            get_input: pm_subscription_topic
+      capabilities:
+        pm-subscription-event-publisher:
+          properties:
+            carrier_protocol_type: DMAAP_message_router
+            data_format: JSON
+            event_format: pm-subscription-event-format
+            event_format_version: 1.0.0
+          attributes:
+            type: org.onap.EventProducer
+          occurrences:
+          - 0.0
+          - UNBOUNDED
+          version: 0.0.0
+        pm-subscription-event-receiver:
+          properties:
+            carrier_protocol_type: DMAAP_message_router
+            data_format: JSON
+            event_format: pm-subscription-event-response-format
+            event_format_version: 1.0.0
+            relationships:
+            - type: tosca.relationships.DependsOn
+            - description: any ideas on a better realtionship ? or is it better to
+                just use the root realtionship ?
+            - target: org.onap.PM_Monitoring_Policy
+          attributes:
+            type: org.onap.EventConsumer
+          occurrences:
+          - 0.0
+          - UNBOUNDED
+          version: 0.0.0
+      version: 0.0.0
+    org.onap.PM_Monitoring_Policy:
+      type: org.onap.DynamicConfig
+      properties:
+        application_name: PM Subscription Handler
+        application_version: 1.0.0
+        provider: Ericsson
+        data_types:
+          measurementType:
+            type: string
+          DN:
+            type: string
+          nfFilter:
+            properties:
+              nfNames:
+                type: list
+                entry_schema: string
+              modelInvariantIDs:
+                type: list
+                entry_schema:
+                  type: string
+              modelVersionIDs:
+                type: list
+                entry_schema:
+                  type: string
+          measurementGroup:
+            properties:
+              masurementTypes:
+                type: list
+                entry_schema:
+                  type: measurementType
+              managedObjectDNsBasic:
+                type: list
+                entry_schema:
+                  type: DN
+        schema:
+          subscription:
+            subscriptionName:
+              type: string
+              required: true
+            administrativeState:
+              type: string
+              required: true
+            filebasedGP:
+              type: integer
+              required: true
+            fileLocation:
+              type: string
+              required: true
+            nfFilter:
+              type: nfFilter
+            measurementGroups:
+              type: list
+              entry_schema:
+                type: measurementGroup
+      version: 0.0.0
+      description: Should I be showing a dependency between PM Subscription Handler
+        and the PM Monitoring Policy
+    org.onap.PM_Policy:
+      type: org.onap.APP
+      properties:
+        application_name: PM Subscription Operational Policy
+        provider: Ericsson
+        application_version: 1.0.0
+        artifact_id:
+          get_input: pm_subscription_operational_policy_id
+        artifact_config: NOT_DEFINED
+      requirements:
+      - receive_0:
+          capability: pm-subscription-event-publisher
+          node: org.onap.PM_Subscription_Handler
+          relationship: NOT_DEFINED
+          properties:
+            config_keys:
+            - topic_name:
+                get_input: pm_subscription_topic
+          version: 0.0.0
+      - send_0:
+          capability: cds-rest-receive
+          node: org.onap.CDS
+          version: 0.0.0
+      - receive_1:
+          capability: cds-rest-response
+          node: org.onap.CDS
+          version: 0.0.0
+      - send_1:
+          capability: pm-subscription-event-receiver
+          node: org.onap.PM_Subscription_Handler
+          relationship: NOT_DEFINED
+          properties:
+            config_keys:
+            - topic_name:
+                get_input: pm_subscription_response_topic
+          version: 0.0.0
+      capabilities:
+        pm-subscription-response-event-publisher:
+          properties:
+            type: org.onap.EventProducer
+            carrier_protocol_type: DMAAP_message_router
+            data_format: JSON
+            event_format: pm-subscription-event-response-format
+            event_format_version: 1.0.0
+          occurrences:
+          - 0.0
+          - UNBOUNDED
+          version: 0.0.0
+      version: 0.0.0
+    org.onap.PM_CDS_Blueprint:
+      type: org.onap.APP
+      properties:
+        application_name: PM Subscription CDS Blueprint
+        provider: Ericsson
+        application_version: 1.0.0
+        artifact_id:
+          get_input: pm_subscription_cds_blueprint_id
+      capabilities:
+        cds-rest-receive:
+          properties:
+            type: org.onap.EventConsumer
+            protocol_type: REST
+            data_format: JSON
+            event_format: cds_action_format
+            event_format_version: 1.0.0
+            responding_capability: cds-rest-response
+          occurrences:
+          - 0.0
+          - UNBOUNDED
+          version: 0.0.0
+        cds-rest-response:
+          properties:
+            type: org.onap.EventProducer
+            protocol_type: REST
+            data_format: JSON
+            event_format: cds_action_response_format
+            event_format_version: 1.0.0
+          occurrences:
+          - 0.0
+          version: 0.0.0
+      version: 0.0.0
+    org.onap.controlloop0:
+      type: org.onap.APP
+      properties:
+        application_name: Test Control Loop
+        provider: Ericsson
+        application_version: 1.0.0
+        status: NOT_DEPLOYED
+      version: 0.0.0
+version: 0.0.0
diff --git a/runtime-controlloop/src/test/resources/rest/servicetemplates/pmsh_multiple_cl_tosca.yaml b/runtime-controlloop/src/test/resources/rest/servicetemplates/pmsh_multiple_cl_tosca.yaml
new file mode 100644
index 0000000..099e2e9
--- /dev/null
+++ b/runtime-controlloop/src/test/resources/rest/servicetemplates/pmsh_multiple_cl_tosca.yaml
@@ -0,0 +1,221 @@
+tosca_definitions_version: tosca_simple_yaml_1_3
+data_types:
+  onap.datatypes.ToscaConceptIdentifier:
+    derived_from: tosca.datatypes.Root
+    properties:
+      name:
+        type: string
+        required: true
+      version:
+        type: string
+        required: true
+node_types:
+  org.onap.policy.clamp.controlloop.Participant:
+    version: 1.0.1
+    derived_from: tosca.nodetypes.Root
+    properties:
+      provider:
+        type: string
+        requred: false
+  org.onap.policy.clamp.controlloop.ControlLoopElement:
+    version: 1.0.1
+    derived_from: tosca.nodetypes.Root
+    properties:
+      provider:
+        type: string
+        requred: false
+      participant_id:
+        type: onap.datatypes.ToscaConceptIdentifier
+        requred: true
+  org.onap.policy.clamp.controlloop.ControlLoop:
+    version: 1.0.1
+    derived_from: tosca.nodetypes.Root
+    properties:
+      provider:
+        type: string
+        requred: false
+      elements:
+        type: list
+        required: true
+        entry_schema:
+          type: onap.datatypes.ToscaConceptIdentifier
+  org.onap.policy.clamp.controlloop.DCAEMicroserviceControlLoopElement:
+    version: 1.0.1
+    derived_from: org.onap.policy.clamp.controlloop.ControlLoopElement
+    properties:
+      dcae_blueprint_id:
+        type: onap.datatypes.ToscaConceptIdentifier
+        requred: true
+  org.onap.policy.clamp.controlloop.PolicyTypeControlLoopElement:
+    version: 1.0.1
+    derived_from: org.onap.policy.clamp.controlloop.ControlLoopElement
+    properties:
+      policy_type_id:
+        type: onap.datatypes.ToscaConceptIdentifier
+        requred: true
+  org.onap.policy.clamp.controlloop.CDSControlLoopElement:
+    version: 1.0.1
+    derived_from: org.onap.policy.clamp.controlloop.ControlLoopElement
+    properties:
+      cds_blueprint_id:
+        type: onap.datatypes.ToscaConceptIdentifier
+        requred: true
+topology_template:
+  node_templates:
+    org.onap.dcae.controlloop.DCAEMicroserviceControlLoopParticipant:
+      version: 2.3.4
+      type: org.onap.policy.clamp.controlloop.Participant
+      type_version: 1.0.1
+      description: Participant for DCAE microservices
+      properties:
+        provider: ONAP
+    org.onap.policy.controlloop.PolicyControlLoopParticipant:
+      version: 2.2.1
+      type: org.onap.policy.clamp.controlloop.Participant
+      type_version: 1.0.1
+      description: Participant for DCAE microservices
+      properties:
+        provider: ONAP
+    org.onap.ccsdk.cds.controlloop.CdsControlLoopParticipant:
+      version: 2.2.1
+      type: org.onap.policy.clamp.controlloop.Participant
+      type_version: 1.0.1
+      description: Participant for DCAE microservices
+      properties:
+        provider: ONAP
+    org.onap.domain.pmsh.PMSH_DCAEMicroservice:
+      version: 1.2.3
+      type: org.onap.policy.clamp.controlloop.DCAEMicroserviceControlLoopElement
+      type_version: 1.0.0
+      description: Control loop element for the DCAE microservice for Performance Management Subscription Handling
+      properties:
+        provider: Ericsson
+        participant_id:
+          name: org.onap.dcae.controlloop.DCAEMicroserviceControlLoopParticipant
+          version: 2.3.4
+        dcae_blueprint_id:
+          name: org.onap.dcae.blueprints.PMSHBlueprint
+          version: 1.0.0
+    org.onap.domain.pmsh.PMSH_MonitoringPolicyControlLoopElement:
+      version: 1.2.3
+      type: org.onap.policy.clamp.controlloop.PolicyTypeControlLoopElement
+      type_version: 1.0.0
+      description: Control loop element for the monitoring policy for Performance Management Subscription Handling
+      properties:
+        provider: Ericsson
+        participant_id:
+          name: org.onap.policy.controlloop.PolicyControlLoopParticipant
+          version: 2.2.1
+        policy_type_id:
+          name: onap.policies.monitoring.pm-subscription-handler
+          version: 1.0.0
+    org.onap.domain.pmsh.PMSH_OperationalPolicyControlLoopElement:
+      version: 1.2.3
+      type: org.onap.policy.clamp.controlloop.PolicyTypeControlLoopElement
+      type_version: 1.0.0
+      description: Control loop element for the operational policy for Performance Management Subscription Handling
+      properties:
+        provider: Ericsson
+        participant_id:
+          name: org.onap.policy.controlloop.PolicyControlLoopParticipant
+          version: 2.2.1
+        policy_type_id:
+          name: onap.policies.operational.pm-subscription-handler
+          version: 1.0.0
+    org.onap.domain.pmsh.PMSH_CDS_ControlLoopElement:
+      version: 1.2.3
+      type: org.onap.policy.clamp.controlloop.ControlLoopElement
+      type_version: 1.0.0
+      description: Control loop element for CDS for Performance Management Subscription Handling
+      properties:
+        provider: Ericsson
+        participant_Id:
+          name: org.onap.ccsdk.cds.controlloop.CdsControlLoopParticipant
+          version: 3.2.1
+        cds_blueprint_id:
+          name: org.onap.ccsdk.cds.PMSHCdsBlueprint
+          version: 1.0.0
+    org.onap.domain.pmsh.PMSHControlLoopDefinition:
+      version: 1.2.3
+      type: org.onap.policy.clamp.controlloop.ControlLoop
+      type_version: 1.0.0
+      description: Control loop for Performance Management Subscription Handling
+      properties:
+        provider: Ericsson
+        elements:
+          - name: org.onap.domain.pmsh.PMSH_DCAEMicroservice
+            version: 1.2.3
+          - name: org.onap.domain.pmsh.PMSH_MonitoringPolicyControlLoopElement
+            version: 1.2.3
+          - name: org.onap.domain.pmsh.PMSH_OperationalPolicyControlLoopElement
+            version: 1.2.3
+          - name: org.onap.domain.pmsh.PMSH_CDS_ControlLoopElement
+            version: 1.2.3
+    org.onap.domain.pmsh.PMSD_DCAEMicroservice:
+      version: 1.2.3
+      type: org.onap.policy.clamp.controlloop.DCAEMicroserviceControlLoopElement
+      type_version: 1.0.0
+      description: Control loop element for the DCAE microservice for Performance Management Subscription Handling
+      properties:
+        provider: Ericsson
+        participant_id:
+          name: org.onap.dcae.controlloop.DCAEMicroserviceControlLoopParticipant
+          version: 2.3.4
+        dcae_blueprint_id:
+          name: org.onap.dcae.blueprints.PMSDBlueprint
+          version: 1.0.0
+    org.onap.domain.pmsh.PMSD_MonitoringPolicyControlLoopElement:
+      version: 1.2.3
+      type: org.onap.policy.clamp.controlloop.PolicyTypeControlLoopElement
+      type_version: 1.0.0
+      description: Control loop element for the monitoring policy for Performance Management Subscription Handling
+      properties:
+        provider: Ericsson
+        participant_id:
+          name: org.onap.policy.controlloop.PolicyControlLoopParticipant
+          version: 2.2.1
+        policy_type_id:
+          name: onap.policies.monitoring.pm-subscription-handler
+          version: 1.0.0
+    org.onap.domain.pmsh.PMSD_OperationalPolicyControlLoopElement:
+      version: 1.2.3
+      type: org.onap.policy.clamp.controlloop.PolicyTypeControlLoopElement
+      type_version: 1.0.0
+      description: Control loop element for the operational policy for Performance Management Subscription Handling
+      properties:
+        provider: Ericsson
+        participant_id:
+          name: org.onap.policy.controlloop.PolicyControlLoopParticipant
+          version: 2.2.1
+        policy_type_id:
+          name: onap.policies.operational.pm-subscription-handler
+          version: 1.0.0
+    org.onap.domain.pmsh.PMSD_CDS_ControlLoopElement:
+      version: 1.2.3
+      type: org.onap.policy.clamp.controlloop.ControlLoopElement
+      type_version: 1.0.0
+      description: Control loop element for CDS for Performance Management Subscription Handling
+      properties:
+        provider: Ericsson
+        participant_Id:
+          name: org.onap.ccsdk.cds.controlloop.CdsControlLoopParticipant
+          version: 3.2.1
+        cds_blueprint_id:
+          name: org.onap.ccsdk.cds.PMSDCdsBlueprint
+          version: 1.0.0
+    org.onap.domain.pmsh.PMSDControlLoopDefinition:
+      version: 1.2.3
+      type: org.onap.policy.clamp.controlloop.ControlLoop
+      type_version: 1.0.0
+      description: Control loop for Performance Management Subscription Handling
+      properties:
+        provider: Ericsson
+        elements:
+          - name: org.onap.domain.pmsh.PMSD_DCAEMicroservice
+            version: 1.2.3
+          - name: org.onap.domain.pmsh.PMSD_MonitoringPolicyControlLoopElement
+            version: 1.2.3
+          - name: org.onap.domain.pmsh.PMSD_OperationalPolicyControlLoopElement
+            version: 1.2.3
+          - name: org.onap.domain.pmsh.PMSD_CDS_ControlLoopElement
+            version: 1.2.3
diff --git a/runtime-controlloop/src/test/resources/testscripts/listenOnTopic.sh b/runtime-controlloop/src/test/resources/testscripts/listenOnTopic.sh
new file mode 100644
index 0000000..5e66177
--- /dev/null
+++ b/runtime-controlloop/src/test/resources/testscripts/listenOnTopic.sh
@@ -0,0 +1,31 @@
+#! /bin/bash
+#  ============LICENSE_START=======================================================
+#  Copyright (C) 2021 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=========================================================
+
+if [ $# -ne 1 ]
+then
+    echo invalid parameters $*, specify a single parameter as the topic to listen on
+    exit 1
+fi
+
+while true
+do
+    curl "http://localhost:3904/events/$1/TEST/1?timeout=60000"
+    echo ""
+done
+
diff --git a/runtime/pom.xml b/runtime/pom.xml
index 66d555a..f027757 100644
--- a/runtime/pom.xml
+++ b/runtime/pom.xml
@@ -647,7 +647,7 @@
                     </dependency>
                 </dependencies>
                 <configuration>
-                    <swaggerInput>${project.basedir}/docs/swagger/swagger.json</swaggerInput>
+                    <swaggerInput>${project.basedir}/../docs/swagger/swagger.json</swaggerInput>
                     <outputDir>${project.build.directory}/asciidoc/generated</outputDir>
                     <config>
                         <swagger2markup.markupLanguage>ASCIIDOC</swagger2markup.markupLanguage>