Merge "Code Coverage on clamp-participant-dcae"
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
index 1bbe566..18297da 100644
--- 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
@@ -20,14 +20,11 @@
 
 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;
 
 /**
@@ -47,21 +44,9 @@
     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<>();
     }
 
     /**
diff --git a/common/src/main/resources/tosca/CdsControlLoopElementType.yaml b/common/src/main/resources/tosca/CdsControlLoopElementType.yaml
index 296324b..c2fc66a 100644
--- a/common/src/main/resources/tosca/CdsControlLoopElementType.yaml
+++ b/common/src/main/resources/tosca/CdsControlLoopElementType.yaml
@@ -24,3 +24,4 @@
       cdsBlueprint:
         type: string
         required: true
+        description: The CDS blueprint that this control loop element is managing.
diff --git a/common/src/main/resources/tosca/ControlLoopTOSCAServiceTemplateTypes.yaml b/common/src/main/resources/tosca/ControlLoopTOSCAServiceTemplateTypes.yaml
index 615fc34..e45a062 100644
--- a/common/src/main/resources/tosca/ControlLoopTOSCAServiceTemplateTypes.yaml
+++ b/common/src/main/resources/tosca/ControlLoopTOSCAServiceTemplateTypes.yaml
@@ -34,20 +34,62 @@
       provider:
         type: string
         required: false
+        metadata:
+            common: true
         description: Specifies the organization that provides the control loop element
-      participant_type:
+      participantType:
         type: onap.datatypes.ToscaConceptIdentifier
         required: true
+        metadata:
+            common: true
         description: The identity of the participant type that hosts this type of Control Loop Element
-      start_phase:
+      startPhase:
         type: integer
         required: false
         constraints:
         - greater-or-equal: 0
+        metadata:
+            common: true
         description: A value indicating the start phase in which this control loop element will be started, the
                      first start phase is zero. Control Loop Elements are started in their start_phase order and stopped
                      in reverse start phase order. Control Loop Elements with the same start phase are started and
                      stopped simultaneously
+      uninitializedToPassiveTimeout:
+        type: integer
+        required: false
+        constraints:
+        - greater-or-equal: 0
+        default: 60
+        metadata:
+            common: true
+        description: The maximum time in seconds to wait for a state chage from uninitialized to passive
+      passiveToRunningTimeout:
+        type: integer
+        required: false
+        constraints:
+        - greater-or-equal: 0
+        default: 60
+        metadata:
+            common: true
+        description: The maximum time in seconds to wait for a state chage from passive to running
+      runningToPassiveTimeout:
+        type: integer
+        required: false
+        constraints:
+        - greater-or-equal: 0
+        default: 60
+        metadata:
+            common: true
+        description: The maximum time in seconds to wait for a state chage from running to passive
+      passiveToUninitializedTimeout:
+        type: integer
+        required: false
+        constraints:
+        - greater-or-equal: 0
+        default: 60
+        metadata:
+            common: true
+        description: The maximum time in seconds to wait for a state chage from passive to uninitialized
   org.onap.policy.clamp.controlloop.ControlLoop:
     version: 1.0.1
     derived_from: tosca.nodetypes.Root
@@ -55,11 +97,15 @@
       provider:
         type: string
         required: false
+        metadata:
+            common: true
         description: Specifies the organization that provides the control loop element
       elements:
         type: list
         required: true
-        description: Specifies a list of control loop element definitions that make up this control loop definition
+        metadata:
+            common: true
         entry_schema:
           type: onap.datatypes.ToscaConceptIdentifier
+        description: Specifies a list of control loop element definitions that make up this control loop definition
 
diff --git a/common/src/main/resources/tosca/DcaeControlLoopElementType.yaml b/common/src/main/resources/tosca/DcaeControlLoopElementType.yaml
index 654a094..acf91bb 100644
--- a/common/src/main/resources/tosca/DcaeControlLoopElementType.yaml
+++ b/common/src/main/resources/tosca/DcaeControlLoopElementType.yaml
@@ -26,14 +26,14 @@
         name: consulUrl
         type: string
         typeVersion: 0.0.0
-        description: Consul url for this entry
         required: true
+        description: Consul url for this entry
       consulBody:
         name: consulBody
         type: string
         typeVersion: 0.0.0
-        description: Body of Consul entry
         required: true
+        description: Body of Consul entry
 node_types:
   org.onap.policy.clamp.controlloop.DCAEMicroserviceControlLoopElement:
     version: 1.0.1
@@ -42,8 +42,10 @@
       dcaeBlueprint:
         type: string
         required: true
+        description: The DCAE blueprint for the DCAE microservice this control loop element is managing.
       consulInfo:
         type: list
         required: false
         entry_schema:
           type: org.onap.datatypes.policy.clamp.controlloop.DCAEControlLoopElementConsulInfo
+        description: The information to be sent to Consul for the microservice this control loop element is managing.
diff --git a/common/src/main/resources/tosca/HttpControlLoopElementType.yaml b/common/src/main/resources/tosca/HttpControlLoopElementType.yaml
index 4fdb605..fd37040 100644
--- a/common/src/main/resources/tosca/HttpControlLoopElementType.yaml
+++ b/common/src/main/resources/tosca/HttpControlLoopElementType.yaml
@@ -24,28 +24,28 @@
       restRequestId:
         type:  onap.datatypes.ToscaConceptIdentifier
         typeVersion: 1.0.0
-        description: The name and version of a REST request to be sent to a REST endpoint
         required: true
+        description: The name and version of a REST request to be sent to a REST endpoint
       httpMethod:
         type: string
-        description: The REST method to use
         required: true
         constraints:
           - valid_values: [POST, PUT, GET, DELETE]
+        description: The REST method to use
       path:
         type: string
-        description: The path of the REST request relative to the base URL
         required: true
+        description: The path of the REST request relative to the base URL
       body:
         type: string
-        description: The body of the REST request for PUT and POST requests
         required: false
+        description: The body of the REST request for PUT and POST requests
       expectedResponse:
         type: integer
-        description: THe expected HTTP status code for the REST request
         required: true
         constraints:
           - in_range: [100, 599]
+        description: THe expected HTTP status code for the REST request
   org.onap.datatypes.policy.clamp.controlloop.httpControlLoopElement.ConfigurationEntity:
     version: 1.0.0
     derived_from: tosca.datatypes.Root
@@ -53,14 +53,14 @@
       configurationEntityId:
         type:  onap.datatypes.ToscaConceptIdentifier
         typeVersion: 1.0.0
-        description: The name and version of a Configuration Entity to be handled by the HTTP Control Loop Element
         required: true
+        description: The name and version of a Configuration Entity to be handled by the HTTP Control Loop Element
       restSequence:
         type: list
-        description: A sequence of REST commands to send to the REST endpoint
         entry_schema:
           type: org.onap.datatypes.policy.clamp.controlloop.httpControlLoopElement.RestRequest
           typeVersion: 1.0.0
+        description: A sequence of REST commands to send to the REST endpoint
 node_types:
   org.onap.policy.clamp.controlloop.HttpControlLoopElement:
     version: 1.0.1
@@ -69,14 +69,17 @@
       baseUrl:
         type: string
         required: true
+        description: The base URL to be prepended to each path, identifies the host for the REST endpoints.
       httpHeaders:
         type: map
         required: false
         entry_schema:
           type: string
+        description: HTTP headers to send on REST requests
       configurationEntities:
         type: map
         required: true
         entry_schema:
           type: org.onap.datatypes.policy.clamp.controlloop.httpControlLoopElement.ConfigurationEntity
           typeVersion: 1.0.0
+        description: The connfiguration entities the Control Loop Element is managing and their associated REST requests
diff --git a/common/src/main/resources/tosca/KubernetesControlLoopElementType.yaml b/common/src/main/resources/tosca/KubernetesControlLoopElementType.yaml
index 7468581..86a8ce1 100644
--- a/common/src/main/resources/tosca/KubernetesControlLoopElementType.yaml
+++ b/common/src/main/resources/tosca/KubernetesControlLoopElementType.yaml
@@ -24,26 +24,26 @@
       chartId:
         type:  onap.datatypes.ToscaConceptIdentifier
         typeVersion: 1.0.0
-        description: The name and version of the chart
         required: true
+        description: The name and version of the chart
       releaseName:
         type: string
-        description: The name of the release of the chart
         required: true
+        description: The name of the release of the chart
       repository:
         type: string
-        description: The name of the repository where the chart is stored
         required: false
+        description: The name of the repository where the chart is stored
       namespace:
         type: string
-        description: The name space of the chart
         required: true
+        description: The name space of the chart
       overrideParams:
         type: map
-        description: A map of override settings for parameters in the chart
         required: false
         entry_schema:
           type: string
+        description: A map of override settings for parameters in the chart
 node_types:
   org.onap.policy.clamp.controlloop.KubernetesControlLoopElement:
     version: 1.0.1
@@ -52,25 +52,25 @@
       chart:
         type: org.onap.datatypes.policy.clamp.controlloop.kubernetesControlLoopElement.Chart
         typeVersion: 1.0.0
-        description: The helm chart for the microservice
         required: true
+        description: The helm chart for the microservice
       configs:
         type: list
-        description: The configurations for the microservice
         required: false
         entry_schema:
           type: string
+        description: The configurations for the microservice
       requirements:
         type: string
-        description: The requirements for the microservice
         required: false
+        description: The requirements for the microservice
       templates:
         type: list
-        description: The templates for the microservice
         required: false
         entry_schema:
           type: string
+        description: The templates for the microservice
       values:
         type: string
+        required: false
         description: The values for the microservice
-        required: true
diff --git a/common/src/main/resources/tosca/PolicyControlLoopElementType.yaml b/common/src/main/resources/tosca/PolicyControlLoopElementType.yaml
index f2d45f1..e584c2f 100644
--- a/common/src/main/resources/tosca/PolicyControlLoopElementType.yaml
+++ b/common/src/main/resources/tosca/PolicyControlLoopElementType.yaml
@@ -21,6 +21,13 @@
     version: 1.0.1
     derived_from: org.onap.policy.clamp.controlloop.ControlLoopElement
     properties:
-      policyId:
+      policyType:
         type: onap.datatypes.ToscaConceptIdentifier
         required: true
+        description: The policy type of the policy that this control loop element is managing
+      policyId:
+        type: onap.datatypes.ToscaConceptIdentifier
+        required: false
+        description: The policy that this control loop element is managing, if the policy ID is specified, the policy
+                     is either already in the Policy Framework database or is specified in the "policies" part of the
+                     TOSCA service template of the Control Loop definition
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
index 7a0479d..7def287 100644
--- 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
@@ -25,7 +25,6 @@
 import static org.junit.Assert.assertNotNull;
 
 import org.junit.jupiter.api.Test;
-import org.onap.policy.common.utils.services.Registry;
 import org.onap.policy.models.provider.PolicyModelsProviderParameters;
 
 class ControlLoopHandlerTest {
@@ -35,10 +34,6 @@
         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();
 
@@ -46,9 +41,7 @@
         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/startstop/CommonCommandLineArgumentsTest.java b/common/src/test/java/org/onap/policy/clamp/controlloop/common/startstop/CommonCommandLineArgumentsTest.java
index 715232f..8eff212 100644
--- a/common/src/test/java/org/onap/policy/clamp/controlloop/common/startstop/CommonCommandLineArgumentsTest.java
+++ b/common/src/test/java/org/onap/policy/clamp/controlloop/common/startstop/CommonCommandLineArgumentsTest.java
@@ -45,7 +45,7 @@
     @Test
     void testHelp() {
         assertThat(cli.help("DummyClass", new Options()))
-                .contains("DummyClass [options...]\noptions");
+                .contains("DummyClass [options...]" + System.lineSeparator() + "options");
     }
 
     @Test
diff --git a/common/src/test/resources/examples/controlloop/PMSubscriptionHandling.yaml b/common/src/test/resources/examples/controlloop/PMSubscriptionHandling.yaml
index f9f9742..5c6883b 100644
--- a/common/src/test/resources/examples/controlloop/PMSubscriptionHandling.yaml
+++ b/common/src/test/resources/examples/controlloop/PMSubscriptionHandling.yaml
@@ -309,24 +309,24 @@
     properties:
       provider:
         type: string
-        requred: false
+        required: false
   org.onap.policy.clamp.controlloop.ControlLoopElement:
     version: 1.0.1
     derived_from: tosca.nodetypes.Root
     properties:
       provider:
         type: string
-        requred: false
+        required: false
       participant_id:
         type: onap.datatypes.ToscaConceptIdentifier
-        requred: true
+        required: true
   org.onap.policy.clamp.controlloop.ControlLoop:
     version: 1.0.1
     derived_from: tosca.nodetypes.Root
     properties:
       provider:
         type: string
-        requred: false
+        required: false
       elements:
         type: list
         required: true
@@ -338,10 +338,10 @@
     properties:
       dcae_blueprint_id:
         type: onap.datatypes.ToscaConceptIdentifier
-        requred: false
+        required: false
       dcae_blueprint:
         type: onap.dcae.cloudify_blueprint
-        requred: false
+        required: false
       consul_info:
         type: list
         required: false
@@ -353,17 +353,17 @@
     properties:
       policy_type_id:
         type: onap.datatypes.ToscaConceptIdentifier
-        requred: true
+        required: true
       policy_id:
         type: onap.datatypes.ToscaConceptIdentifier
-        requred: false
+        required: 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
+        required: true
 topology_template:
   inputs:
     pmsh_monitoring_policy:
diff --git a/common/src/test/resources/gentleguidance/GentleGuidanceDefaultPropeties.yaml b/common/src/test/resources/gentleguidance/GentleGuidanceDefaultPropeties.yaml
new file mode 100644
index 0000000..d634a1f
--- /dev/null
+++ b/common/src/test/resources/gentleguidance/GentleGuidanceDefaultPropeties.yaml
@@ -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=========================================================
+tosca_definitions_version: tosca_simple_yaml_1_3
+topology_template:
+  node_templates:
+    org.onap.domain.gentleguidance.KubernetesControlLoopElementDefinition:
+      version: 1.0.0
+      type: org.onap.policy.clamp.controlloop.KubernetesControlLoopElement
+      type_version: 1.0.1
+      description: Control loop element for the Gentle Guidance Kubernetes Microservice
+      properties:
+        provider: Ericsson
+        participantType: org.onap.policy.controlloop.participant.Kubernetes:1.0.0
+        startPhase: 2
+        uninitializedToPassiveTimeout: 180
+        chart:
+            chartId: GentleGuidance:1.0.0
+            releaseName: Istanbul
+            namespace: org.onap.policy.controlloop.gentleguidance
+    org.onap.domain.gentleguidance.RestControlLoopElementDefinition:
+      version: 1.0.0
+      type: org.onap.policy.clamp.controlloop.HttpControlLoopElement
+      type_version: 1.0.1
+      description: Control loop element for the Gentle Guidance Microservice REST configuration
+      properties:
+        provider: Ericsson
+        participantType: org.onap.policy.controlloop.participant.Http:1.0.0
+        startPhase: 1
+        baseUrl: https://10.10.10.10:12345/gentleguidancemicroservice
+        httpHeaders:
+          "Content-Type": "application/json"
+          "Accept": "application/json"
+        configurationEntities:
+          org.onap.policy.controlloop.gentleguidance.setGentleGuidanceConfig:1.0.0:
+            configurationEntityId: org.onap.policy.controlloop.gentleguidance.setGentleGuidanceConfig:1.0.0
+            restSequence:
+            - restRequestId: org.onap.policy.controlloop.gentleguidance.setGentleGuidanceConfig.CreateGentle:1.0.0
+              httpMethd: POST
+              path: "gentle/create"
+              body:
+                gentleLevel: veryGentle
+                gentleType: softAndFurry
+              expectedResponse: 200
+            - restRequestId: org.onap.policy.controlloop.gentleguidance.setGentleGuidanceConfig.CreateGuidance:1.0.0
+              httpMethd: POST
+              path: "guidance/create"
+              body:
+                guidanceLevel: high
+                guidanceType: subtle
+              expectedResponse: 200
+          org.onap.policy.controlloop.gentleguidance.updateGentleGuidanceConfig:1.0.0:
+            configurationEntityId: org.onap.policy.controlloop.gentleguidance.updateGentleGuidanceConfig:1.0.0
+            restSequence:
+            - restRequestId: org.onap.policy.controlloop.gentleguidance.updateGentleGuidanceConfig.CreateGentle:1.0.0
+              httpMethd: PUT
+              path: "gentle/update]"
+              body:
+                gentleLevel: robust
+                gentleType: hardAndGritty
+              expectedResponse: 200
+            - restRequestId: org.onap.policy.controlloop.gentleguidance.updateGentleGuidanceConfig.CreateGuidance:1.0.0
+              httpMethd: PUT
+              path: "guidance/update"
+              body:
+                guidanceLevel: low
+                guidanceType: terse
+              expectedResponse: 200
+    org.onap.domain.gentleguidance.PolicyControlLoopElementDefinition:
+      version: 1.0.0
+      type: org.onap.policy.clamp.controlloop.PolicyControlLoopElement
+      type_version: 1.0.1
+      description: Control loop element for the Gentle Guidance Operational Policy
+      properties:
+        provider: Ericsson
+        participantType: org.onap.policy.controlloop.participant.Policy:1.0.0
+        startPhase: 0
+        policyType: onap.policies.controlloop.operational.common.Apex:1.0.0
+        policyId: org.onap.domain.gentleguidance.policy.GentleGuidanceAssertive:1.0.0
+    org.onap.domain.gentleguidance.CdsControlLoopElementDefinition:
+      version: 1.0.0
+      type: org.onap.policy.clamp.controlloop.CDSControlLoopElement
+      type_version: 1.0.1
+      description: Control loop element for the Gentle Guidance CDS blueprint
+      properties:
+        provider: Ericsson
+        participantType: org.onap.policy.controlloop.participant.Cds:1.0.0
+        startPhase: 0
+        cdsBlueprint: "Placeholder for the CDS blueprint"
+    org.onap.domain.gentleguidance.ControlLoopDefinition:
+      version: 1.0.0
+      type: org.onap.policy.clamp.controlloop.ControlLoop
+      type_version: 1.0.1
+      description: Control loop definition for the Gentle Guidance domain
+      properties:
+        provider: Ericsson
+        elements:
+        - org.onap.domain.gentleguidance.KubernetesControlLoopElementDefinition:1.0.0
+        - org.onap.domain.gentleguidance.RestControlLoopElementDefinition:1.0.0
+        - org.onap.domain.gentleguidance.PolicyControlLoopElementDefinition:1.0.0
+        - org.onap.domain.gentleguidance.CdsControlLoopElementDefinition:1.0.0
diff --git a/common/src/test/resources/gentleguidance/GentleGuidanceNoPropeties.yaml b/common/src/test/resources/gentleguidance/GentleGuidanceNoPropeties.yaml
new file mode 100644
index 0000000..d022261
--- /dev/null
+++ b/common/src/test/resources/gentleguidance/GentleGuidanceNoPropeties.yaml
@@ -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=========================================================
+tosca_definitions_version: tosca_simple_yaml_1_3
+topology_template:
+  node_templates:
+    org.onap.domain.gentleguidance.KubernetesControlLoopElementDefinition:
+      version: 1.0.0
+      type: org.onap.policy.clamp.controlloop.KubernetesControlLoopElement
+      type_version: 1.0.1
+      description: Control loop element for the Gentle Guidance Kubernetes Microservice
+    org.onap.domain.gentleguidance.RestControlLoopElementDefinition:
+      version: 1.0.0
+      type: org.onap.policy.clamp.controlloop.HttpControlLoopElement
+      type_version: 1.0.1
+      description: Control loop element for the Gentle Guidance Microservice REST configuration
+    org.onap.domain.gentleguidance.PolicyControlLoopElementDefinition:
+      version: 1.0.0
+      type: org.onap.policy.clamp.controlloop.PolicyControlLoopElement
+      type_version: 1.0.1
+      description: Control loop element for the Gentle Guidance Operational Policy
+    org.onap.domain.gentleguidance.CdsControlLoopElementDefinition:
+      version: 1.0.0
+      type: org.onap.policy.clamp.controlloop.CDSControlLoopElement
+      type_version: 1.0.1
+      description: Control loop element for the Gentle Guidance CDS blueprint
+    org.onap.domain.gentleguidance.ControlLoopDefinition:
+      version: 1.0.0
+      type: org.onap.policy.clamp.controlloop.ControlLoop
+      type_version: 1.0.1
+      description: Control loop definition for the Gentle Guidance domain
+      properties:
+        provider: Ericsson
+        elements:
+        - org.onap.domain.gentleguidance.KubernetesControlLoopElementDefinition:1.0.0
+        - org.onap.domain.gentleguidance.RestControlLoopElementDefinition:1.0.0
+        - org.onap.domain.gentleguidance.PolicyControlLoopElementDefinition:1.0.0
+        - org.onap.domain.gentleguidance.CdsControlLoopElementDefinition:1.0.0
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoopElementDefinition.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoopElementDefinition.java
new file mode 100644
index 0000000..7daf897
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoopElementDefinition.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;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.UUID;
+import java.util.function.UnaryOperator;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.NonNull;
+import lombok.ToString;
+import org.onap.policy.models.base.PfUtils;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
+
+/**
+ * Class to represent a control loop element definition instance.
+ */
+@NoArgsConstructor
+@Data
+@ToString
+public class ControlLoopElementDefinition {
+
+    @NonNull
+    private UUID id = UUID.randomUUID();
+
+    // The definition of the Control Loop Element in TOSCA
+    private ToscaServiceTemplate controlLoopElementToscaServiceTemplate;
+
+    // A map indexed by the property name. Each map entry is the serialized value of the property,
+    // which can be deserialized into an instance of the type of the property.
+    private Map<String, String> commonPropertiesMap = new LinkedHashMap<>();
+
+    /**
+     * Copy constructor, does a deep copy but as all fields here are immutable, it's just a regular copy.
+     *
+     * @param clElementDefinition the controlloop element definition to copy from
+     */
+    public ControlLoopElementDefinition(final ControlLoopElementDefinition clElementDefinition) {
+        this.id = clElementDefinition.id;
+        this.controlLoopElementToscaServiceTemplate =
+                new ToscaServiceTemplate(clElementDefinition.controlLoopElementToscaServiceTemplate);
+        this.commonPropertiesMap = PfUtils.mapMap(clElementDefinition.commonPropertiesMap, UnaryOperator.identity());
+    }
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantAckMessage.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantAckMessage.java
new file mode 100644
index 0000000..1e53921
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantAckMessage.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.messages.dmaap.participant;
+
+import java.util.UUID;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+/**
+ * Class to represent participant Ack message.
+ */
+@Getter
+@Setter
+@ToString
+public class ParticipantAckMessage {
+
+    // The responseTo field should match the original request id in the request.
+    private UUID responseTo;
+
+    // Result: Success/Fail.
+    private Boolean result;
+
+    // Message indicating reason for failure
+    private String message;
+
+    private ParticipantMessageType messageType;
+
+    /**
+     * Constructor for instantiating a participant ack message class.
+     *
+     * @param messageType the message type
+     */
+    public ParticipantAckMessage(final ParticipantMessageType messageType) {
+        this.messageType = messageType;
+    }
+
+    /**
+     * Constructs the object, making a deep copy.
+     *
+     * @param source source from which to copy
+     */
+    public ParticipantAckMessage(ParticipantAckMessage source) {
+        this.responseTo = source.responseTo;
+        this.result = source.result;
+        this.message = source.message;
+        this.messageType = source.messageType;
+    }
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantDeregister.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantDeregister.java
new file mode 100644
index 0000000..e8759b3
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantDeregister.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.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_DEREGISTER message that all the participants send to control loop runtime.
+ */
+@Getter
+@Setter
+@ToString(callSuper = true)
+public class ParticipantDeregister extends ParticipantMessage {
+
+    /**
+     * Constructor for instantiating ParticipantDeregister class with message name.
+     *
+     */
+    public ParticipantDeregister() {
+        super(ParticipantMessageType.PARTICIPANT_DEREGISTER);
+    }
+
+    /**
+     * Constructs the object, making a deep copy.
+     *
+     * @param source source from which to copy
+     */
+    public ParticipantDeregister(final ParticipantDeregister source) {
+        super(source);
+    }
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantDeregisterAck.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantDeregisterAck.java
new file mode 100644
index 0000000..69406be
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantDeregisterAck.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.models.messages.dmaap.participant;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+/**
+ * Class to represent the PARTICIPANT_DEREGISTER_ACK message that control loop runtime sends to the participant.
+ */
+@Getter
+@Setter
+@ToString(callSuper = true)
+public class ParticipantDeregisterAck extends ParticipantAckMessage {
+
+    /**
+     * Constructor for instantiating ParticipantDeregisterAck class with message name.
+     *
+     */
+    public ParticipantDeregisterAck() {
+        super(ParticipantMessageType.PARTICIPANT_DEREGISTER_ACK);
+    }
+
+    /**
+     * Constructs the object, making a deep copy.
+     *
+     * @param source source from which to copy
+     */
+    public ParticipantDeregisterAck(final ParticipantDeregisterAck source) {
+        super(source);
+    }
+}
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
index 77a50bd..94d4846 100644
--- 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
@@ -31,26 +31,57 @@
     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.
+     * Used by the controlloop 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
+     * Used by controlloop runtime to update the controlloops 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.
+     * Used by controlloop runtime to change the state of controlloops in participants, triggers a
+     * PARTICIPANT_STATUS message with result of 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.
+     * 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
+    PARTICIPANT_HEALTH_CHECK,
+
+    /**
+     * Used by participant to register itself with control loop runtime.
+     */
+    PARTICIPANT_REGISTER,
+
+    /**
+     * Used by control loop runtime to respond to participant registration.
+     */
+    PARTICIPANT_REGISTER_ACK,
+
+    /**
+     * Used by participant to deregister itself with control loop runtime.
+     */
+    PARTICIPANT_DEREGISTER,
+
+    /**
+     * Used by control loop runtime to respond to participant deregistration.
+     */
+    PARTICIPANT_DEREGISTER_ACK,
+
+    /**
+     * Used by control loop runtime to send ToscaServiceTemplate to participant.
+     */
+    PARTICIPANT_UPDATE,
+
+    /**
+     * Used by participant to acknowledge the receipt of Participant_Update message
+     * from control loop runtime.
+     */
+    PARTICIPANT_UPDATE_ACK
 }
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantRegister.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantRegister.java
new file mode 100644
index 0000000..7319d99
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantRegister.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.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_REGISTER message that all the participants send to control loop runtime.
+ */
+@Getter
+@Setter
+@ToString(callSuper = true)
+public class ParticipantRegister extends ParticipantMessage {
+
+    /**
+     * Constructor for instantiating ParticipantRegister class with message name.
+     *
+     */
+    public ParticipantRegister() {
+        super(ParticipantMessageType.PARTICIPANT_REGISTER);
+    }
+
+    /**
+     * Constructs the object, making a deep copy.
+     *
+     * @param source source from which to copy
+     */
+    public ParticipantRegister(final ParticipantRegister source) {
+        super(source);
+    }
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantRegisterAck.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantRegisterAck.java
new file mode 100644
index 0000000..3d55c36
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantRegisterAck.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.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_REGISTER_ACK message that control loop runtime sends to registered participant.
+ */
+@Getter
+@Setter
+@ToString(callSuper = true)
+public class ParticipantRegisterAck extends ParticipantAckMessage {
+
+    /**
+     * Constructor for instantiating ParticipantRegisterAck class with message name.
+     *
+     */
+    public ParticipantRegisterAck() {
+        super(ParticipantMessageType.PARTICIPANT_REGISTER_ACK);
+    }
+
+    /**
+     * Constructs the object, making a deep copy.
+     *
+     * @param source source from which to copy
+     */
+    public ParticipantRegisterAck(final ParticipantRegisterAck source) {
+        super(source);
+    }
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantUpdate.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantUpdate.java
new file mode 100644
index 0000000..5fd00e2
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantUpdate.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.models.messages.dmaap.participant;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.UUID;
+import java.util.function.UnaryOperator;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopElementDefinition;
+import org.onap.policy.models.base.PfUtils;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
+
+/**
+ * Class to represent the PARTICIPANT_UPDATE message that the control loop runtime sends to a participant.
+ * CLAMP Runtime sends Control Loop Element Definitions and Common Parameter Values to Participants.
+ */
+@Getter
+@Setter
+@ToString(callSuper = true)
+public class ParticipantUpdate extends ParticipantMessage {
+
+    // A map with Participant ID as its key, and a map of ControlLoopElements as value.
+    private Map<ToscaConceptIdentifier, Map<UUID, ControlLoopElementDefinition>>
+            participantDefinitionUpdateMap = new LinkedHashMap<>();
+
+    /**
+     * Constructor for instantiating ParticipantUpdate class with message name.
+     *
+     */
+    public ParticipantUpdate() {
+        super(ParticipantMessageType.PARTICIPANT_UPDATE);
+    }
+
+    /**
+     * Constructs the object, making a deep copy.
+     *
+     * @param source source from which to copy
+     */
+    public ParticipantUpdate(ParticipantUpdate source) {
+        super(source);
+
+        this.participantDefinitionUpdateMap = PfUtils.mapMap(source.participantDefinitionUpdateMap,
+                clElementDefinitionMap -> PfUtils.mapMap(clElementDefinitionMap,
+                        ControlLoopElementDefinition::new));
+    }
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantUpdateAck.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantUpdateAck.java
new file mode 100644
index 0000000..0f065e9
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantUpdateAck.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.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_UPDATE_ACK message that registered participant sends to controlloop runtime.
+ */
+@Getter
+@Setter
+@ToString(callSuper = true)
+public class ParticipantUpdateAck extends ParticipantAckMessage {
+
+    /**
+     * Constructor for instantiating ParticipantUpdateAck class with message name.
+     *
+     */
+    public ParticipantUpdateAck() {
+        super(ParticipantMessageType.PARTICIPANT_UPDATE_ACK);
+    }
+
+    /**
+     * Constructs the object, making a deep copy.
+     *
+     * @param source source from which to copy
+     */
+    public ParticipantUpdateAck(final ParticipantUpdateAck source) {
+        super(source);
+    }
+}
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
index b90ccba..94b0b13 100644
--- 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
@@ -23,6 +23,6 @@
 /**
  * Test class for {@link JpaClElementStatistics} comparisons.
  */
-public class DummyJpaClElementStatisticsChild extends JpaClElementStatistics {
+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
index c4eb364..10150cf 100644
--- 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
@@ -23,6 +23,6 @@
 /**
  * Test class for {@link JpaControlLoop} comparisons.
  */
-public class DummyJpaControlLoopChild extends JpaControlLoop {
+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
index 2082ff4..4bacb92 100644
--- 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
@@ -23,6 +23,6 @@
 /**
  * Test class for {@link JpaControlLoopElement} comparisons.
  */
-public class DummyJpaControlLoopElementChild extends JpaControlLoopElement {
+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
index e6bc92e..68dcc31 100644
--- 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
@@ -23,6 +23,6 @@
 /**
  * Test class for {@link JpaParticipant} comparisons.
  */
-public class DummyJpaParticipantChild extends JpaParticipant {
+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
index 74dd400..2c1f04e 100644
--- 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
@@ -23,6 +23,6 @@
 /**
  * Test class for {@link JpaParticipantStatistics} comparisons.
  */
-public class DummyJpaParticipantStatisticsChild extends JpaParticipantStatistics {
+class DummyJpaParticipantStatisticsChild extends JpaParticipantStatistics {
     private static final long serialVersionUID = -5101743610779424064L;
 }
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantAckMessageTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantAckMessageTest.java
new file mode 100644
index 0000000..82ba5d1
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantAckMessageTest.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.dmaap.participant;
+
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.junit.Assert.assertEquals;
+
+import java.util.UUID;
+import org.junit.jupiter.api.Test;
+
+class ParticipantAckMessageTest {
+    private ParticipantAckMessage message;
+
+    @Test
+    void testCopyConstructor() {
+        assertThatThrownBy(() -> new ParticipantAckMessage((ParticipantAckMessage) null))
+                .isInstanceOf(NullPointerException.class);
+
+        // verify with null values
+        message = new ParticipantAckMessage(ParticipantMessageType.PARTICIPANT_STATE_CHANGE);
+        ParticipantAckMessage newmsg = new ParticipantAckMessage(message);
+        newmsg.setResponseTo(message.getResponseTo());
+        assertEquals(message.toString(), newmsg.toString());
+
+        // verify with all values
+        message = makeMessage();
+        newmsg = new ParticipantAckMessage(message);
+        newmsg.setResponseTo(message.getResponseTo());
+        assertEquals(message.toString(), newmsg.toString());
+    }
+
+    private ParticipantAckMessage makeMessage() {
+        ParticipantAckMessage msg = new ParticipantAckMessage(ParticipantMessageType.PARTICIPANT_DEREGISTER_ACK);
+
+        msg.setMessage("Successfull Ack");
+        msg.setResult(true);
+        msg.setResponseTo(UUID.randomUUID());
+
+        return msg;
+    }
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantDeregisterAckTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantDeregisterAckTest.java
new file mode 100644
index 0000000..cfb891e
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantDeregisterAckTest.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.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.util.UUID;
+import org.junit.jupiter.api.Test;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+class ParticipantDeregisterAckTest {
+
+    @Test
+    void testCopyConstructor() {
+        assertThatThrownBy(() -> new ParticipantDeregisterAck(null)).isInstanceOf(NullPointerException.class);
+
+        final ParticipantDeregisterAck orig = new ParticipantDeregisterAck();
+
+        // verify with null values
+        assertEquals(removeVariableFields(orig.toString()),
+                removeVariableFields(new ParticipantDeregisterAck(orig).toString()));
+
+        // verify with all values
+        ToscaConceptIdentifier id = new ToscaConceptIdentifier();
+        id.setName("id");
+        id.setVersion("1.2.3");
+        orig.setResponseTo(UUID.randomUUID());
+        orig.setMessageType(ParticipantMessageType.PARTICIPANT_DEREGISTER_ACK);
+        orig.setResult(true);
+        orig.setMessage("Successfully processed message");
+
+        assertEquals(removeVariableFields(orig.toString()),
+                removeVariableFields(new ParticipantDeregisterAck(orig).toString()));
+    }
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantDeregisterTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantDeregisterTest.java
new file mode 100644
index 0000000..2daefb6
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantDeregisterTest.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.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.jupiter.api.Test;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+class ParticipantDeregisterTest {
+
+    @Test
+    void testCopyConstructor() {
+        assertThatThrownBy(() -> new ParticipantDeregister(null)).isInstanceOf(NullPointerException.class);
+
+        final ParticipantDeregister orig = new ParticipantDeregister();
+
+        // verify with null values
+        assertEquals(removeVariableFields(orig.toString()),
+                removeVariableFields(new ParticipantDeregister(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.setParticipantType(id);
+        orig.setMessageId(UUID.randomUUID());
+        orig.setTimestamp(Instant.ofEpochMilli(3000));
+
+        assertEquals(removeVariableFields(orig.toString()),
+                removeVariableFields(new ParticipantDeregister(orig).toString()));
+    }
+}
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
index af8eaa8..1a56a39 100644
--- 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
@@ -44,6 +44,8 @@
 
         pojoClasses.remove(PojoClassFactory.getPojoClass(ParticipantMessage.class));
         pojoClasses.remove(PojoClassFactory.getPojoClass(ParticipantMessageTest.class));
+        pojoClasses.remove(PojoClassFactory.getPojoClass(ParticipantAckMessage.class));
+        pojoClasses.remove(PojoClassFactory.getPojoClass(ParticipantAckMessageTest.class));
 
         // @formatter:off
         final Validator validator = ValidatorBuilder
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantRegisterAckTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantRegisterAckTest.java
new file mode 100644
index 0000000..f0c7211
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantRegisterAckTest.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.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.util.UUID;
+import org.junit.jupiter.api.Test;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+class ParticipantRegisterAckTest {
+
+    @Test
+    void testCopyConstructor() {
+        assertThatThrownBy(() -> new ParticipantRegisterAck(null)).isInstanceOf(NullPointerException.class);
+
+        final ParticipantRegisterAck orig = new ParticipantRegisterAck();
+
+        // verify with null values
+        assertEquals(removeVariableFields(orig.toString()),
+                removeVariableFields(new ParticipantRegisterAck(orig).toString()));
+
+        // verify with all values
+        ToscaConceptIdentifier id = new ToscaConceptIdentifier();
+        id.setName("id");
+        id.setVersion("1.2.3");
+        orig.setResponseTo(UUID.randomUUID());
+        orig.setMessageType(ParticipantMessageType.PARTICIPANT_REGISTER_ACK);
+        orig.setResult(true);
+        orig.setMessage("Successfully processed message");
+
+        assertEquals(removeVariableFields(orig.toString()),
+                removeVariableFields(new ParticipantRegisterAck(orig).toString()));
+    }
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantRegisterTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantRegisterTest.java
new file mode 100644
index 0000000..d7ce5bf
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantRegisterTest.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.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.jupiter.api.Test;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+class ParticipantRegisterTest {
+
+    @Test
+    void testCopyConstructor() {
+        assertThatThrownBy(() -> new ParticipantRegister(null)).isInstanceOf(NullPointerException.class);
+
+        final ParticipantRegister orig = new ParticipantRegister();
+
+        // verify with null values
+        assertEquals(removeVariableFields(orig.toString()),
+                removeVariableFields(new ParticipantRegister(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.setParticipantType(id);
+        orig.setMessageId(UUID.randomUUID());
+        orig.setTimestamp(Instant.ofEpochMilli(3000));
+
+        assertEquals(removeVariableFields(orig.toString()),
+                removeVariableFields(new ParticipantRegister(orig).toString()));
+    }
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantUpdateAckTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantUpdateAckTest.java
new file mode 100644
index 0000000..8681476
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantUpdateAckTest.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.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.util.UUID;
+import org.junit.jupiter.api.Test;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+class ParticipantUpdateAckTest {
+
+    @Test
+    void testCopyConstructor() {
+        assertThatThrownBy(() -> new ParticipantUpdateAck(null)).isInstanceOf(NullPointerException.class);
+
+        final ParticipantUpdateAck orig = new ParticipantUpdateAck();
+
+        // verify with null values
+        assertEquals(removeVariableFields(orig.toString()),
+                removeVariableFields(new ParticipantUpdateAck(orig).toString()));
+
+        // verify with all values
+        ToscaConceptIdentifier id = new ToscaConceptIdentifier();
+        id.setName("id");
+        id.setVersion("1.2.3");
+        orig.setResponseTo(UUID.randomUUID());
+        orig.setMessageType(ParticipantMessageType.PARTICIPANT_UPDATE_ACK);
+        orig.setResult(true);
+        orig.setMessage("Successfully processed message");
+
+        assertEquals(removeVariableFields(orig.toString()),
+                removeVariableFields(new ParticipantUpdateAck(orig).toString()));
+    }
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantUpdateTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantUpdateTest.java
new file mode 100644
index 0000000..4f8b42b
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantUpdateTest.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.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.LinkedHashMap;
+import java.util.Map;
+import java.util.UUID;
+import org.junit.jupiter.api.Test;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopElementDefinition;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
+
+/**
+ * Test the copy constructor.
+ */
+class ParticipantUpdateTest {
+    @Test
+    void testCopyConstructor() {
+        assertThatThrownBy(() -> new ParticipantUpdate(null)).isInstanceOf(NullPointerException.class);
+
+        ParticipantUpdate orig = new ParticipantUpdate();
+        // verify with all values
+        ToscaConceptIdentifier id = new ToscaConceptIdentifier();
+        id.setName("id");
+        id.setVersion("1.2.3");
+        orig.setControlLoopId(id);
+        orig.setParticipantId(id);
+        orig.setParticipantType(id);
+        orig.setMessageId(UUID.randomUUID());
+        orig.setTimestamp(Instant.ofEpochMilli(3000));
+
+        ToscaServiceTemplate toscaServiceTemplate = new ToscaServiceTemplate();
+        toscaServiceTemplate.setName("serviceTemplate");
+        toscaServiceTemplate.setDerivedFrom("parentServiceTemplate");
+        toscaServiceTemplate.setDescription("Description of serviceTemplate");
+        toscaServiceTemplate.setVersion("1.2.3");
+
+        ControlLoopElementDefinition clDefinition = new ControlLoopElementDefinition();
+        clDefinition.setId(UUID.randomUUID());
+        clDefinition.setControlLoopElementToscaServiceTemplate(toscaServiceTemplate);
+        Map<String, String> commonPropertiesMap = new LinkedHashMap<>();
+        commonPropertiesMap.put("Prop1", "PropValue");
+        clDefinition.setCommonPropertiesMap(commonPropertiesMap);
+
+        Map<UUID, ControlLoopElementDefinition> controlLoopElementDefinitionMap = new LinkedHashMap<>();
+        controlLoopElementDefinitionMap.put(UUID.randomUUID(), clDefinition);
+
+        Map<ToscaConceptIdentifier, Map<UUID, ControlLoopElementDefinition>>
+            participantDefinitionUpdateMap = new LinkedHashMap<>();
+        participantDefinitionUpdateMap.put(id, controlLoopElementDefinitionMap);
+        orig.setParticipantDefinitionUpdateMap(participantDefinitionUpdateMap);
+
+        ParticipantUpdate other = new ParticipantUpdate(orig);
+
+        assertEquals(removeVariableFields(orig.toString()), removeVariableFields(other.toString()));
+    }
+}
diff --git a/packages/policy-clamp-docker/pom.xml b/packages/policy-clamp-docker/pom.xml
index fc6e360..576c95d 100644
--- a/packages/policy-clamp-docker/pom.xml
+++ b/packages/policy-clamp-docker/pom.xml
@@ -149,6 +149,38 @@
                             </build>
                         </image>
                         <image>
+                            <name>onap/kubernetes-participant</name>
+                            <alias>onap-kubernetes-participant</alias>
+                            <build>
+                                <cleanup>try</cleanup>
+                                <dockerFile>KubernetesParticipantDockerfile</dockerFile>
+                                <tags>
+                                    <tag>${project.version}</tag>
+                                    <tag>${project.version}-${maven.build.timestamp}</tag>
+                                    <tag>${project.docker.latest.minmax.tag.version}</tag>
+                                </tags>
+                                <assembly>
+                                    <inline>
+                                        <dependencySets>
+                                            <dependencySet>
+                                                <includes>
+                                                    <include>org.onap.policy.clamp:policy-clamp-tarball</include>
+                                                </includes>
+                                                <outputDirectory>/lib</outputDirectory>
+                                                <outputFileNameMapping>kubernetes-participant.tar.gz</outputFileNameMapping>
+                                            </dependencySet>
+                                            <dependencySet>
+                                                <includes>
+                                                    <include>org.onap.policy.clamp.participant:policy-clamp-participant-impl-kubernetes</include>
+                                                </includes>
+                                                <outputFileNameMapping>app.jar</outputFileNameMapping>
+                                            </dependencySet>
+                                        </dependencySets>
+                                    </inline>
+                                </assembly>
+                            </build>
+                        </image>
+                        <image>
                             <name>onap/dcae-participant</name>
                             <alias>onap-dcae-participant</alias>
                             <build>
@@ -245,5 +277,10 @@
             <artifactId>policy-clamp-participant-impl-dcae</artifactId>
             <version>${project.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.onap.policy.clamp.participant</groupId>
+            <artifactId>policy-clamp-participant-impl-kubernetes</artifactId>
+            <version>${project.version}</version>
+        </dependency>
     </dependencies>
 </project>
diff --git a/packages/policy-clamp-docker/src/main/docker/KubernetesParticipantDockerfile b/packages/policy-clamp-docker/src/main/docker/KubernetesParticipantDockerfile
new file mode 100644
index 0000000..40532c0
--- /dev/null
+++ b/packages/policy-clamp-docker/src/main/docker/KubernetesParticipantDockerfile
@@ -0,0 +1,66 @@
+#-------------------------------------------------------------------------------
+# ============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=========================================================
+#-------------------------------------------------------------------------------
+
+#
+# Docker file to build an image that runs CLAMP on Java 11 or better in alpine
+#
+FROM onap/policy-jre-alpine:2.2.1
+
+LABEL maintainer="Policy Team"
+
+ARG POLICY_LOGS=/var/log/onap/policy/clamp
+
+ENV POLICY_LOGS=$POLICY_LOGS
+ENV POLICY_HOME=$POLICY_HOME/clamp
+
+RUN mkdir -p $POLICY_LOGS $POLICY_HOME $POLICY_HOME/bin && \
+    chown -R policy:policy $POLICY_HOME $POLICY_LOGS && \
+    mkdir /packages
+COPY /maven/lib/kubernetes-participant.tar.gz /packages
+
+RUN tar xvfz /packages/kubernetes-participant.tar.gz --directory $POLICY_HOME && \
+    rm /packages/kubernetes-participant.tar.gz && \
+    rm -rf $POLICY_HOME/lib
+
+WORKDIR $POLICY_HOME
+COPY kubernetes-participant.sh  bin/.
+COPY /maven/app.jar /app
+
+RUN chown -R policy:policy * && \
+    chmod 755 bin/*.sh && \
+    chown -R policy:policy /app && \
+    apk update && \
+    apk add wget && \
+    wget https://get.helm.sh/helm-v3.5.2-linux-amd64.tar.gz && \
+    tar xvf helm-v3.5.2-linux-amd64.tar.gz && \
+    mv linux-amd64/helm /usr/local/bin && \
+    rm -rf linux-amd64 && \
+    rm helm-v3.5.2-linux-amd64.tar.gz && \
+    wget https://storage.googleapis.com/kubernetes-release/release/v1.21.1/bin/linux/amd64/kubectl && \
+    chmod +x kubectl && \
+    mv kubectl /usr/local/bin/kubectl
+
+EXPOSE 8080
+
+USER policy
+WORKDIR $POLICY_HOME/bin
+ENTRYPOINT [ "./kubernetes-participant.sh" ]
+
+
diff --git a/packages/policy-clamp-docker/src/main/docker/kubernetes-participant.sh b/packages/policy-clamp-docker/src/main/docker/kubernetes-participant.sh
new file mode 100644
index 0000000..195639a
--- /dev/null
+++ b/packages/policy-clamp-docker/src/main/docker/kubernetes-participant.sh
@@ -0,0 +1,49 @@
+#!/usr/bin/env sh
+#
+# ============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=========================================================
+#
+
+JAVA_HOME=/usr/lib/jvm/java-11-openjdk/
+KEYSTORE="${KEYSTORE:-$POLICY_HOME/etc/ssl/policy-keystore}"
+TRUSTSTORE="${TRUSTSTORE:-$POLICY_HOME/etc/ssl/policy-truststore}"
+KEYSTORE_PASSWD="${KEYSTORE_PASSWD:-Pol1cy_0nap}"
+TRUSTSTORE_PASSWD="${TRUSTSTORE_PASSWD:-Pol1cy_0nap}"
+
+
+
+if [ -f "${POLICY_HOME}/etc/mounted/policy-truststore" ]; then
+    echo "overriding policy-truststore"
+    cp -f "${POLICY_HOME}"/etc/mounted/policy-truststore "${TRUSTSTORE}"
+fi
+
+if [ -f "${POLICY_HOME}/etc/mounted/policy-keystore" ]; then
+    echo "overriding policy-keystore"
+    cp -f "${POLICY_HOME}"/etc/mounted/policy-keystore "${KEYSTORE}"
+fi
+
+if [ -f "${POLICY_HOME}/etc/mounted/logback.xml" ]; then
+    echo "overriding logback xml files"
+    cp -f "${POLICY_HOME}"/etc/mounted/logback*.xml "${POLICY_HOME}"/etc/
+fi
+
+$JAVA_HOME/bin/java -Djavax.net.ssl.keyStore="${KEYSTORE}" \
+    -Djavax.net.ssl.keyStorePassword="${KEYSTORE_PASSWD}" \
+    -Djavax.net.ssl.trustStore="${TRUSTSTORE}" \
+    -Djavax.net.ssl.trustStorePassword="${TRUSTSTORE_PASSWD}" \
+    -jar /app/app.jar
diff --git a/packages/policy-clamp-tarball/pom.xml b/packages/policy-clamp-tarball/pom.xml
index 559dbaa..4689433 100644
--- a/packages/policy-clamp-tarball/pom.xml
+++ b/packages/policy-clamp-tarball/pom.xml
@@ -47,6 +47,11 @@
             <artifactId>policy-clamp-participant-impl-dcae</artifactId>
             <version>${project.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.onap.policy.clamp.participant</groupId>
+            <artifactId>policy-clamp-participant-impl-kubernetes</artifactId>
+            <version>${project.version}</version>
+        </dependency>
     </dependencies>
 
     <build>
diff --git a/packages/policy-clamp-tarball/src/main/resources/etc/ClRuntimeParameters.json b/packages/policy-clamp-tarball/src/main/resources/etc/ClRuntimeParameters.json
index 5726fa5..a6a3ff0 100644
--- a/packages/policy-clamp-tarball/src/main/resources/etc/ClRuntimeParameters.json
+++ b/packages/policy-clamp-tarball/src/main/resources/etc/ClRuntimeParameters.json
@@ -23,7 +23,7 @@
         "name": "PolicyProviderParameterGroup",
         "implementation": "org.onap.policy.models.provider.impl.DatabasePolicyModelsProviderImpl",
         "databaseDriver": "org.mariadb.jdbc.Driver",
-        "databaseUrl": "jdbc:mariadb://localhost:3306/controlloop",
+        "databaseUrl": "jdbc:mariadb://mariadb:3306/controlloop",
         "databaseUser": "policy",
         "databasePassword": "P01icY",
         "persistenceUnit": "CommissioningMariaDb"
diff --git a/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/controlloop/participant/simulator/main/rest/ParticipantErrorController.java b/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/controlloop/participant/simulator/main/rest/ParticipantErrorController.java
index d4429b8..695ae06 100644
--- a/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/controlloop/participant/simulator/main/rest/ParticipantErrorController.java
+++ b/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/controlloop/participant/simulator/main/rest/ParticipantErrorController.java
@@ -20,7 +20,6 @@
 
 package org.onap.policy.clamp.controlloop.participant.simulator.main.rest;
 
-import io.swagger.v3.oas.annotations.Hidden;
 import java.util.Map;
 import javax.servlet.RequestDispatcher;
 import javax.servlet.http.HttpServletRequest;
@@ -38,7 +37,6 @@
 import org.springframework.web.context.request.ServletWebRequest;
 
 @Controller
-@Hidden
 public class ParticipantErrorController implements ErrorController {
 
     private final ErrorAttributes errorAttributes;
diff --git a/pom.xml b/pom.xml
index eb8b58a..da214ff 100644
--- a/pom.xml
+++ b/pom.xml
@@ -131,6 +131,15 @@
             <scope>test</scope>
         </dependency>
         <dependency>
+            <groupId>io.swagger</groupId>
+            <artifactId>swagger-models</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-annotations</artifactId>
+            <version>${version.jackson}</version>
+        </dependency>
+        <dependency>
             <groupId>io.springfox</groupId>
             <artifactId>springfox-boot-starter</artifactId>
             <version>${version.springfox}</version>
diff --git a/runtime-controlloop/pom.xml b/runtime-controlloop/pom.xml
index ab72deb..e436451 100644
--- a/runtime-controlloop/pom.xml
+++ b/runtime-controlloop/pom.xml
@@ -44,5 +44,66 @@
             <artifactId>policy-clamp-models</artifactId>
             <version>${project.version}</version>
         </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.module</groupId>
+            <artifactId>jackson-module-jsonSchema</artifactId>
+            <version>${version.jackson}</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>javax.validation</groupId>
+                    <artifactId>validation-api</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.springframework.boot</groupId>
+                    <artifactId>spring-boot-starter-json</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-security</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-validation</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-boot-starter</artifactId>
+            <version>${version.springfox}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger-ui</artifactId>
+            <scope>runtime</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                        <phase>package</phase>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
 </project>
diff --git a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/Application.java b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/Application.java
new file mode 100644
index 0000000..a2b6f62
--- /dev/null
+++ b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/Application.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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.clamp.controlloop.runtime;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class Application {
+
+    public static void main(String[] args) {
+        SpringApplication.run(Application.class, args);
+    }
+}
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
deleted file mode 100644
index 74975e7..0000000
--- a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/commissioning/CommissioningHandler.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*-
- * ============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.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.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
index 5bbf6a0..f291c4e 100644
--- 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
@@ -20,6 +20,11 @@
 
 package org.onap.policy.clamp.controlloop.runtime.commissioning;
 
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.PropertyNamingStrategies;
+import com.fasterxml.jackson.module.jsonSchema.JsonSchema;
+import com.fasterxml.jackson.module.jsonSchema.factories.SchemaFactoryWrapper;
 import java.io.Closeable;
 import java.io.IOException;
 import java.util.ArrayList;
@@ -31,21 +36,29 @@
 import org.apache.commons.collections4.MapUtils;
 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.clamp.controlloop.runtime.main.parameters.ClRuntimeParameterGroup;
 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.ToscaCapabilityType;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaDataType;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeType;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyType;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaRelationshipType;
 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.ToscaTopologyTemplate;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaTypedEntityFilter;
+import org.springframework.stereotype.Component;
 
 /**
  * This class provides the create, read and delete actions on Commissioning of Control Loop concepts in the database to
  * the callers.
  */
+@Component
 public class CommissioningProvider implements Closeable {
     public static final String CONTROL_LOOP_NODE_TYPE = "org.onap.policy.clamp.controlloop.ControlLoop";
 
@@ -56,19 +69,20 @@
 
     /**
      * Create a commissioning provider.
-     * @param databaseProviderParameters parameters for database access
+     *
+     * @param controlLoopParameters the parameters for access to the database
      * @throws PfModelRuntimeException on errors creating the database provider
      */
-    public CommissioningProvider(PolicyModelsProviderParameters databaseProviderParameters) {
+    public CommissioningProvider(ClRuntimeParameterGroup controlLoopParameters) {
         try {
             modelsProvider = new PolicyModelsProviderFactory()
-                    .createPolicyModelsProvider(databaseProviderParameters);
+                    .createPolicyModelsProvider(controlLoopParameters.getDatabaseProviderParameters());
         } catch (PfModelException e) {
             throw new PfModelRuntimeException(e);
         }
 
         try {
-            clProvider = new ControlLoopProvider(databaseProviderParameters);
+            clProvider = new ControlLoopProvider(controlLoopParameters.getDatabaseProviderParameters());
         } catch (PfModelException e) {
             throw new PfModelRuntimeException(e);
         }
@@ -78,6 +92,7 @@
     public void close() throws IOException {
         try {
             modelsProvider.close();
+            clProvider.close();
         } catch (PfModelException e) {
             throw new IOException("error closing modelsProvider", e);
         }
@@ -203,4 +218,49 @@
         serviceTemplates.setServiceTemplates(modelsProvider.getServiceTemplateList(name, version));
         return serviceTemplates.getServiceTemplates().get(0);
     }
+
+    /**
+     * Get the requested json schema.
+     *
+     * @param section section of the tosca service template to get schema for
+     * @return the specified tosca service template or section Json Schema
+     * @throws PfModelException on errors with retrieving the classes
+     * @throws JsonProcessingException on errors generating the schema
+     */
+    public String getToscaServiceTemplateSchema(String section) throws PfModelException, JsonProcessingException {
+        ObjectMapper mapper = new ObjectMapper();
+        mapper.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE);
+        SchemaFactoryWrapper visitor = new SchemaFactoryWrapper();
+
+        switch (section) {
+            case "data_types":
+                mapper.acceptJsonFormatVisitor(mapper.constructType(ToscaDataType.class), visitor);
+                break;
+            case "capability_types":
+                mapper.acceptJsonFormatVisitor(mapper.constructType(ToscaCapabilityType.class), visitor);
+                break;
+            case "node_types":
+                mapper.acceptJsonFormatVisitor(mapper.constructType(ToscaNodeType.class), visitor);
+                break;
+            case "relationship_types":
+                mapper.acceptJsonFormatVisitor(mapper.constructType(ToscaRelationshipType.class), visitor);
+                break;
+            case "policy_types":
+                mapper.acceptJsonFormatVisitor(mapper.constructType(ToscaPolicyType.class), visitor);
+                break;
+            case "topology_template":
+                mapper.acceptJsonFormatVisitor(mapper.constructType(ToscaTopologyTemplate.class), visitor);
+                break;
+            case "node_templates":
+                mapper.acceptJsonFormatVisitor(mapper.constructType(ToscaNodeTemplate.class), visitor);
+                break;
+            default:
+                mapper.acceptJsonFormatVisitor(mapper.constructType(ToscaServiceTemplate.class), visitor);
+        }
+
+        JsonSchema jsonSchema = visitor.finalSchema();
+        String response = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonSchema);
+
+        return response;
+    }
 }
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
deleted file mode 100644
index ebfbbd5..0000000
--- a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/commissioning/rest/CommissioningController.java
+++ /dev/null
@@ -1,412 +0,0 @@
-/*-
- * ============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.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);
-            var 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);
-            var 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);
-            var resp = new CommissioningResponse();
-            resp.setErrorDetails(e.getErrorResponse().getErrorMessage());
-            return returnResponse(e.getErrorResponse().getResponseCode(), requestId, resp);
-        }
-
-    }
-
-    /**
-     * Retrieves the Tosca Service Template.
-     *
-     * @param requestId request ID used in ONAP logging
-     * @param name the name of the tosca service template to retrieve
-     * @param version the version of the tosca service template to get
-     * @return the specified tosca service template
-     */
-    // @formatter:off
-    @GET
-    @Path("/commission/toscaservicetemplate")
-    @ApiOperation(value = "Query details of the requested tosca service templates",
-            notes = "Queries details of the requested commissioned tosca service template, "
-                    + "returning all tosca service template details",
-            response = ToscaServiceTemplate.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 queryToscaServiceTemplate(
-        @HeaderParam(REQUEST_ID_NAME) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId,
-        @ApiParam(value = "Tosca service template name", required = true) @QueryParam("name") String name,
-        @ApiParam(value = "Tosca service template version", required = true) @QueryParam("version") String version) {
-
-        try {
-            var response = provider.getToscaServiceTemplate(name, version);
-            return addLoggingHeaders(addVersionControlHeaders(Response.status(Status.OK)), requestId).entity(response)
-                .build();
-
-        } catch (PfModelRuntimeException | PfModelException e) {
-            LOGGER.warn("Get of tosca service template failed", e);
-            var 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) {
-
-        try {
-            List<ToscaNodeTemplate> nodeTemplate = provider.getControlLoopDefinitions(name, version);
-            // Prevent ambiguous queries with multiple returns
-            if (nodeTemplate.size() > 1) {
-                var 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);
-            var 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/config/AafConfiguration.java b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/config/AafConfiguration.java
new file mode 100644
index 0000000..4483fbd
--- /dev/null
+++ b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/config/AafConfiguration.java
@@ -0,0 +1,46 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP CLAMP
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. 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.
+ * ============LICENSE_END============================================
+ * ===================================================================
+ *
+ */
+
+package org.onap.policy.clamp.controlloop.runtime.config;
+
+import javax.servlet.Filter;
+import org.onap.policy.clamp.controlloop.runtime.main.web.ControlLoopAafFilter;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Profile;
+
+@Configuration
+@Profile("clamp-aaf-authentication")
+public class AafConfiguration {
+
+    /**
+     * Method to return Aaf filter.
+     *
+     * @return Filter
+     */
+    @Bean
+    public Filter aafFilter() {
+        return new ControlLoopAafFilter();
+    }
+
+}
diff --git a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/config/ActivatorConfig.java b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/config/ActivatorConfig.java
new file mode 100644
index 0000000..1d6b92e
--- /dev/null
+++ b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/config/ActivatorConfig.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.runtime.config;
+
+import org.onap.policy.clamp.controlloop.runtime.main.parameters.ClRuntimeParameterGroup;
+import org.onap.policy.clamp.controlloop.runtime.main.startstop.ClRuntimeActivator;
+import org.onap.policy.clamp.controlloop.runtime.supervision.SupervisionHandler;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class ActivatorConfig {
+
+    /**
+     * Create and start ClRuntimeActivator.
+     *
+     * @param clRuntimeParameterGroup the parameters for the control loop runtime service
+     * @param supervisionHandler the SupervisionHandler
+     * @return ClRuntimeActivator
+     */
+    @Bean
+    public ClRuntimeActivator clRuntimeActivator(ClRuntimeParameterGroup clRuntimeParameterGroup,
+            SupervisionHandler supervisionHandler) {
+        var clRuntimeActivator = new ClRuntimeActivator(clRuntimeParameterGroup, supervisionHandler);
+        clRuntimeActivator.start();
+        return clRuntimeActivator;
+    }
+}
diff --git a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/config/CoderHttpMesageConverter.java b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/config/CoderHttpMesageConverter.java
new file mode 100644
index 0000000..cdd6ea7
--- /dev/null
+++ b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/config/CoderHttpMesageConverter.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.config;
+
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.nio.charset.StandardCharsets;
+import javax.ws.rs.core.Response;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopRuntimeException;
+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.StandardYamlCoder;
+import org.springframework.http.HttpInputMessage;
+import org.springframework.http.HttpOutputMessage;
+import org.springframework.http.MediaType;
+import org.springframework.http.converter.AbstractHttpMessageConverter;
+import org.springframework.http.converter.HttpMessageNotReadableException;
+import org.springframework.http.converter.HttpMessageNotWritableException;
+
+public class CoderHttpMesageConverter<T> extends AbstractHttpMessageConverter<T> {
+
+    private Coder coder;
+
+    public CoderHttpMesageConverter(String type) {
+        super(new MediaType("application", type, StandardCharsets.UTF_8));
+        this.coder = "json".equals(type) ? new StandardCoder() : new StandardYamlCoder();
+    }
+
+    @Override
+    protected boolean supports(Class<?> clazz) {
+        return true;
+    }
+
+    @Override
+    protected T readInternal(Class<? extends T> clazz, HttpInputMessage inputMessage)
+            throws IOException, HttpMessageNotReadableException {
+        try (var is = new InputStreamReader(inputMessage.getBody(), StandardCharsets.UTF_8)) {
+            return coder.decode(is, clazz);
+        } catch (CoderException e) {
+            throw new ControlLoopRuntimeException(Response.Status.BAD_REQUEST, e.getMessage(), e);
+        }
+    }
+
+    @Override
+    protected void writeInternal(T t, HttpOutputMessage outputMessage)
+            throws IOException, HttpMessageNotWritableException {
+        try (var writer = new OutputStreamWriter(outputMessage.getBody(), StandardCharsets.UTF_8)) {
+            coder.encode(writer, t);
+        } catch (CoderException e) {
+            throw new ControlLoopRuntimeException(Response.Status.BAD_REQUEST, e.getMessage(), e);
+        }
+    }
+
+}
diff --git a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/config/ConverterConfiguration.java b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/config/ConverterConfiguration.java
new file mode 100644
index 0000000..ee04619
--- /dev/null
+++ b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/config/ConverterConfiguration.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.runtime.config;
+
+import java.util.List;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.converter.HttpMessageConverter;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+@Configuration
+public class ConverterConfiguration implements WebMvcConfigurer {
+
+    @Override
+    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
+        converters.add(new CoderHttpMesageConverter<>("yaml"));
+        converters.add(new CoderHttpMesageConverter<>("json"));
+    }
+}
diff --git a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/config/FilterConfig.java b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/config/FilterConfig.java
new file mode 100644
index 0000000..d58553a
--- /dev/null
+++ b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/config/FilterConfig.java
@@ -0,0 +1,45 @@
+/*-
+ * ============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.config;
+
+import org.onap.policy.clamp.controlloop.runtime.main.web.RequestResponseLoggingFilter;
+import org.springframework.boot.web.servlet.FilterRegistrationBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class FilterConfig {
+
+    /**
+     * Logging Filter configuration.
+     *
+     * @return FilterRegistrationBean
+     */
+    @Bean
+    public FilterRegistrationBean<RequestResponseLoggingFilter> loggingFilter() {
+        FilterRegistrationBean<RequestResponseLoggingFilter> registrationBean = new FilterRegistrationBean<>();
+
+        registrationBean.setFilter(new RequestResponseLoggingFilter());
+        registrationBean.addUrlPatterns("/onap/controlloop/v2/*");
+
+        return registrationBean;
+    }
+}
diff --git a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/config/PropertiesConfig.java b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/config/PropertiesConfig.java
new file mode 100644
index 0000000..04bd35d
--- /dev/null
+++ b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/config/PropertiesConfig.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.config;
+
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopException;
+import org.onap.policy.clamp.controlloop.runtime.main.parameters.ClRuntimeParameterGroup;
+import org.onap.policy.clamp.controlloop.runtime.main.parameters.ClRuntimeParameterHandler;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class PropertiesConfig {
+
+    @Bean
+    public ClRuntimeParameterGroup clRuntimeParameterGroup(@Value("${runtime.file}") String file)
+            throws ControlLoopException {
+        return new ClRuntimeParameterHandler().getParameters(file);
+    }
+}
diff --git a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/config/SecurityConfig.java b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/config/SecurityConfig.java
new file mode 100644
index 0000000..846944e
--- /dev/null
+++ b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/config/SecurityConfig.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.runtime.config;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
+
+@Configuration
+public class SecurityConfig extends WebSecurityConfigurerAdapter {
+
+    @Value("${security.enable-csrf:true}")
+    private boolean csrfEnabled = true;
+
+    @Override
+    protected void configure(HttpSecurity http) throws Exception {
+        // @formatter:off
+        http.authorizeRequests()
+            .antMatchers().authenticated()
+            .anyRequest().authenticated()
+            .and().httpBasic();
+        // @formatter:on
+
+        if (!csrfEnabled) {
+            http.csrf().disable();
+        }
+    }
+}
diff --git a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/config/SpringFoxConfig.java b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/config/SpringFoxConfig.java
new file mode 100644
index 0000000..d8c7033
--- /dev/null
+++ b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/config/SpringFoxConfig.java
@@ -0,0 +1,45 @@
+/*-
+ * ============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.config;
+
+import org.onap.policy.clamp.controlloop.runtime.main.rest.MonitoringQueryController;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+
+@Configuration
+public class SpringFoxConfig {
+
+    /**
+     * Docket Spring Fox Config.
+     *
+     * @return Docket
+     */
+    @Bean
+    public Docket api() {
+        return new Docket(DocumentationType.SWAGGER_2).select()
+                .apis(RequestHandlerSelectors.basePackage(MonitoringQueryController.class.getPackageName()))
+                .paths(PathSelectors.any()).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
index f458d7c..c01a0b9 100644
--- 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
@@ -39,6 +39,7 @@
 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.main.parameters.ClRuntimeParameterGroup;
 import org.onap.policy.clamp.controlloop.runtime.supervision.SupervisionHandler;
 import org.onap.policy.common.parameters.BeanValidationResult;
 import org.onap.policy.common.parameters.ObjectValidationResult;
@@ -46,29 +47,35 @@
 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;
+import org.springframework.stereotype.Component;
 
 /**
  * This class is dedicated to the Instantiation of Commissioned control loop.
  */
+@Component
 public class ControlLoopInstantiationProvider implements Closeable {
     private final ControlLoopProvider controlLoopProvider;
     private final CommissioningProvider commissioningProvider;
+    private final SupervisionHandler supervisionHandler;
 
     private static final Object lockit = new Object();
 
     /**
      * Create a instantiation provider.
      *
-     * @param databaseProviderParameters the parameters for database access
+     * @param controlLoopParameters the parameters for access to the database
+     * @param commissioningProvider CommissioningProvider
+     * @param supervisionHandler SupervisionHandler
      * @throws PfModelRuntimeException on errors creating a provider
      */
-    public ControlLoopInstantiationProvider(PolicyModelsProviderParameters databaseProviderParameters) {
+    public ControlLoopInstantiationProvider(ClRuntimeParameterGroup controlLoopParameters,
+            CommissioningProvider commissioningProvider, SupervisionHandler supervisionHandler) {
+        this.commissioningProvider = commissioningProvider;
+        this.supervisionHandler = supervisionHandler;
         try {
-            controlLoopProvider = new ControlLoopProvider(databaseProviderParameters);
-            commissioningProvider = new CommissioningProvider(databaseProviderParameters);
+            controlLoopProvider = new ControlLoopProvider(controlLoopParameters.getDatabaseProviderParameters());
         } catch (PfModelException e) {
             throw new PfModelRuntimeException(e);
         }
@@ -93,7 +100,7 @@
                 var checkControlLoop = controlLoopProvider.getControlLoop(controlLoop.getKey().asIdentifier());
                 if (checkControlLoop != null) {
                     throw new PfModelException(Response.Status.BAD_REQUEST,
-                        controlLoop.getKey().asIdentifier() + " already defined");
+                            controlLoop.getKey().asIdentifier() + " already defined");
                 }
             }
             BeanValidationResult validationResult = validateControlLoops(controlLoops);
@@ -105,7 +112,7 @@
 
         var response = new InstantiationResponse();
         response.setAffectedControlLoops(controlLoops.getControlLoopList().stream()
-            .map(cl -> cl.getKey().asIdentifier()).collect(Collectors.toList()));
+                .map(cl -> cl.getKey().asIdentifier()).collect(Collectors.toList()));
 
         return response;
     }
@@ -128,7 +135,7 @@
 
         var response = new InstantiationResponse();
         response.setAffectedControlLoops(controlLoops.getControlLoopList().stream()
-            .map(cl -> cl.getKey().asIdentifier()).collect(Collectors.toList()));
+                .map(cl -> cl.getKey().asIdentifier()).collect(Collectors.toList()));
 
         return response;
     }
@@ -148,18 +155,18 @@
             var subResult = new BeanValidationResult("entry " + controlLoop.getDefinition().getName(), controlLoop);
 
             List<ToscaNodeTemplate> toscaNodeTemplates = commissioningProvider.getControlLoopDefinitions(
-                controlLoop.getDefinition().getName(), controlLoop.getDefinition().getVersion());
+                    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"));
+                        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"));
+                        ValidationStatus.INVALID, "Commissioned control loop definition not VALID"));
             } else {
 
                 List<ToscaNodeTemplate> clElementDefinitions =
-                    commissioningProvider.getControlLoopElementDefinitions(toscaNodeTemplates.get(0));
+                        commissioningProvider.getControlLoopElementDefinitions(toscaNodeTemplates.get(0));
 
                 // @formatter:off
                 Map<String, ToscaConceptIdentifier> definitions = clElementDefinitions
@@ -185,7 +192,7 @@
      * @return the validation result
      */
     private ValidationResult validateDefinition(Map<String, ToscaConceptIdentifier> definitions,
-        ToscaConceptIdentifier definition) {
+            ToscaConceptIdentifier definition) {
         var result = new BeanValidationResult("entry " + definition.getName(), definition);
         ToscaConceptIdentifier identifier = definitions.get(definition.getName());
         if (identifier == null) {
@@ -214,12 +221,12 @@
             for (ControlLoop controlLoop : controlLoops) {
                 if (!ControlLoopState.UNINITIALISED.equals(controlLoop.getState())) {
                     throw new PfModelException(Response.Status.BAD_REQUEST,
-                        "Control Loop State is still " + controlLoop.getState());
+                            "Control Loop State is still " + controlLoop.getState());
                 }
             }
 
             response.setAffectedControlLoops(Collections
-                .singletonList(controlLoopProvider.deleteControlLoop(name, version).getKey().asIdentifier()));
+                    .singletonList(controlLoopProvider.deleteControlLoop(name, version).getKey().asIdentifier()));
         }
         return response;
     }
@@ -248,7 +255,7 @@
      * @throws ControlLoopException on ordered state invalid
      */
     public InstantiationResponse issueControlLoopCommand(InstantiationCommand command)
-        throws ControlLoopException, PfModelException {
+            throws ControlLoopException, PfModelException {
 
         if (command.getOrderedState() == null) {
             throw new ControlLoopException(Status.BAD_REQUEST, "ordered state invalid or not specified on command");
@@ -264,7 +271,6 @@
             controlLoopProvider.updateControlLoops(controlLoops);
         }
 
-        var supervisionHandler = SupervisionHandler.getInstance();
         supervisionHandler.triggerControlLoopSupervision(command.getControlLoopIdentifierList());
         var response = new InstantiationResponse();
         response.setAffectedControlLoops(command.getControlLoopIdentifierList());
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
deleted file mode 100644
index 67fd945..0000000
--- a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/instantiation/InstantiationHandler.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*-
- * ============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.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.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/main/parameters/ClRuntimeParameterHandler.java b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/main/parameters/ClRuntimeParameterHandler.java
index a463ad1..bcf1124 100644
--- 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
@@ -23,7 +23,6 @@
 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;
@@ -39,37 +38,33 @@
     /**
      * Read the parameters from the parameter file.
      *
-     * @param arguments the arguments passed to control loop runtime
+     * @param path the path 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 {
+    public ClRuntimeParameterGroup getParameters(final String path) throws ControlLoopException {
         ClRuntimeParameterGroup clRuntimeParameterGroup = null;
 
         // Read the parameters
         try {
             // Read the parameters from JSON
-            File file = new File(arguments.getFullConfigurationFilePath());
+            File file = new File(path);
             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);
+            throw new ControlLoopException(Response.Status.NOT_ACCEPTABLE,
+                    "error reading parameters from \"" + path + "\"\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() + "\"");
+            throw new ControlLoopException(Response.Status.NOT_ACCEPTABLE, "no parameters found in \"" + path + "\"");
         }
 
         // 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());
+            throw new ControlLoopException(Response.Status.NOT_ACCEPTABLE,
+                    "validation error(s) on parameters from \"" + path + "\"\n" + validationResult.getResult());
         }
 
         return clRuntimeParameterGroup;
diff --git a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/main/rest/CommissioningController.java b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/main/rest/CommissioningController.java
new file mode 100644
index 0000000..b50e7a0
--- /dev/null
+++ b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/main/rest/CommissioningController.java
@@ -0,0 +1,506 @@
+/*-
+ * ============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 com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.PropertyNamingStrategies;
+import com.fasterxml.jackson.module.jsonSchema.JsonSchema;
+import com.fasterxml.jackson.module.jsonSchema.factories.SchemaFactoryWrapper;
+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.core.Response.Status;
+import org.onap.policy.clamp.controlloop.models.messages.rest.commissioning.CommissioningResponse;
+import org.onap.policy.clamp.controlloop.runtime.commissioning.CommissioningProvider;
+import org.onap.policy.clamp.controlloop.runtime.main.web.AbstractRestController;
+import org.onap.policy.models.base.PfModelException;
+import org.onap.policy.models.base.PfModelRuntimeException;
+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;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestHeader;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * Class to provide REST end points for creating, deleting, querying commissioned control loops.
+ */
+@RestController
+public class CommissioningController extends AbstractRestController {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(CommissioningController.class);
+
+    private final CommissioningProvider provider;
+
+    /**
+     * Create Commissioning Controller.
+     *
+     * @param provider the CommissioningProvider
+     */
+    public CommissioningController(CommissioningProvider provider) {
+        this.provider = provider;
+    }
+
+    /**
+     * 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
+    @PostMapping(value = "/commission",
+            consumes = {MediaType.APPLICATION_JSON_VALUE, APPLICATION_YAML},
+            produces = {MediaType.APPLICATION_JSON_VALUE, APPLICATION_YAML})
+    @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 ResponseEntity<CommissioningResponse> create(
+            @RequestHeader(
+                    name = REQUEST_ID_NAME,
+                    required = false) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId,
+            @ApiParam(value = "Entity Body of Control Loop", required = true) @RequestBody ToscaServiceTemplate body) {
+        try {
+            return ResponseEntity.ok().body(provider.createControlLoopDefinitions(body));
+
+        } catch (PfModelRuntimeException | PfModelException e) {
+            LOGGER.warn("Commissioning of the control loops failed", e);
+            var resp = new CommissioningResponse();
+            resp.setErrorDetails(e.getErrorResponse().getErrorMessage());
+            return ResponseEntity.status(e.getErrorResponse().getResponseCode().getStatusCode()).body(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
+    @DeleteMapping(value = "/commission",
+            produces = {MediaType.APPLICATION_JSON_VALUE, APPLICATION_YAML})
+    @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 ResponseEntity<CommissioningResponse> delete(
+            @RequestHeader(
+                    name = REQUEST_ID_NAME,
+                    required = false) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId,
+            @ApiParam(value = "Control Loop definition name", required = true) @RequestParam(
+                    value = "name") String name,
+            @ApiParam(
+                    value = "Control Loop definition version",
+                    required = true) @RequestParam("version") String version) {
+
+        try {
+            return ResponseEntity.ok().body(provider.deleteControlLoopDefinition(name, version));
+
+        } catch (PfModelRuntimeException | PfModelException e) {
+            LOGGER.warn("Decommisssioning of control loop failed", e);
+            var resp = new CommissioningResponse();
+            resp.setErrorDetails(e.getErrorResponse().getErrorMessage());
+            return ResponseEntity.status(e.getErrorResponse().getResponseCode().getStatusCode()).body(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
+    @GetMapping(value = "/commission",
+            produces = {MediaType.APPLICATION_JSON_VALUE, APPLICATION_YAML})
+    @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 ResponseEntity<?> query(
+            @RequestHeader(
+                    name = REQUEST_ID_NAME,
+                    required = false) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId,
+            @ApiParam(value = "Control Loop definition name", required = false) @RequestParam(
+                    value = "name",
+                    required = false) String name,
+            @ApiParam(value = "Control Loop definition version", required = false) @RequestParam(
+                    value = "version",
+                    required = false) String version) {
+
+        try {
+            return ResponseEntity.ok().body(provider.getControlLoopDefinitions(name, version));
+
+        } catch (PfModelRuntimeException | PfModelException e) {
+            LOGGER.warn("Get of control loop definitions failed", e);
+            var resp = new CommissioningResponse();
+            resp.setErrorDetails(e.getErrorResponse().getErrorMessage());
+            return ResponseEntity.status(e.getErrorResponse().getResponseCode().getStatusCode()).body(resp);
+        }
+
+    }
+
+    /**
+     * Retrieves the Tosca Service Template.
+     *
+     * @param requestId request ID used in ONAP logging
+     * @param name the name of the tosca service template to retrieve
+     * @param version the version of the tosca service template to get
+     * @return the specified tosca service template
+     */
+    // @formatter:off
+    @GetMapping(value = "/commission/toscaservicetemplate",
+            produces = {MediaType.APPLICATION_JSON_VALUE, APPLICATION_YAML})
+    @ApiOperation(value = "Query details of the requested tosca service templates",
+        notes = "Queries details of the requested commissioned tosca service template, "
+            + "returning all tosca service template details",
+        response = ToscaServiceTemplate.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 ResponseEntity<?> queryToscaServiceTemplate(
+            @RequestHeader(
+                    name = REQUEST_ID_NAME,
+                    required = false) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId,
+            @ApiParam(value = "Tosca service template name", required = false) @RequestParam(
+                    value = "name",
+                    required = false) String name,
+            @ApiParam(value = "Tosca service template version", required = true) @RequestParam(
+                    value = "version",
+                    required = false) String version) {
+
+        try {
+            return ResponseEntity.ok().body(provider.getToscaServiceTemplate(name, version));
+
+        } catch (PfModelRuntimeException | PfModelException e) {
+            LOGGER.warn("Get of tosca service template failed", e);
+            var resp = new CommissioningResponse();
+            resp.setErrorDetails(e.getErrorResponse().getErrorMessage());
+            return ResponseEntity.status(e.getErrorResponse().getResponseCode().getStatusCode()).body(resp);
+        }
+
+    }
+
+    /**
+     * Retrieves the Json Schema for the specified Tosca Service Template.
+     *
+     * @param requestId request ID used in ONAP logging
+     * @param section section of the tosca service template to get schema for
+     * @return the specified tosca service template or section Json Schema
+     */
+    // @formatter:off
+    @GetMapping(value = "/commission/toscaServiceTemplateSchema",
+        produces = {MediaType.APPLICATION_JSON_VALUE, APPLICATION_YAML})
+    @ApiOperation(value = "Query details of the requested tosca service template json schema",
+        notes = "Queries details of the requested commissioned tosca service template json schema, "
+            + "returning all tosca service template json schema details",
+        response = ToscaServiceTemplate.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 ResponseEntity<?> queryToscaServiceTemplateJsonSchema(
+        @RequestHeader(
+            name = REQUEST_ID_NAME,
+            required = false) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId,
+        @ApiParam(value = "Section of Template schema is desired for", required = false) @RequestParam(
+            value = "section",
+            required = false, defaultValue = "all") String section) {
+        try {
+            return ResponseEntity.ok().body(provider.getToscaServiceTemplateSchema(section));
+
+        } catch (PfModelRuntimeException | PfModelException e) {
+            LOGGER.warn("Get of tosca service template json schema failed", e);
+            var resp = new CommissioningResponse();
+            resp.setErrorDetails(e.getErrorResponse().getErrorMessage());
+            return ResponseEntity.status(e.getErrorResponse().getResponseCode().getStatusCode()).body(resp);
+        } catch (JsonProcessingException e) {
+            LOGGER.warn("Get of tosca service template json schema failed", e);
+            var resp = new CommissioningResponse();
+            resp.setErrorDetails(e.getMessage());
+            return ResponseEntity.status(Status.BAD_REQUEST.getStatusCode()).body(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
+    @GetMapping(value = "/commission/elements",
+            produces = {MediaType.APPLICATION_JSON_VALUE, APPLICATION_YAML})
+    @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 ResponseEntity<?> queryElements(
+            @RequestHeader(
+                    name = REQUEST_ID_NAME,
+                    required = false) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId,
+            @ApiParam(value = "Control Loop definition name", required = false) @RequestParam(
+                    value = "name",
+                    required = false) String name,
+            @ApiParam(value = "Control Loop definition version", required = true) @RequestParam(
+                    value = "version",
+                    required = false) String version) {
+
+        try {
+            List<ToscaNodeTemplate> nodeTemplate = provider.getControlLoopDefinitions(name, version);
+            // Prevent ambiguous queries with multiple returns
+            if (nodeTemplate.size() > 1) {
+                var resp = new CommissioningResponse();
+                resp.setErrorDetails("Multiple ControlLoops are not supported");
+                return ResponseEntity.status(HttpStatus.NOT_ACCEPTABLE).body(resp);
+            }
+
+            List<ToscaNodeTemplate> response = provider.getControlLoopElementDefinitions(nodeTemplate.get(0));
+            return ResponseEntity.ok().body(response);
+
+        } catch (PfModelRuntimeException | PfModelException e) {
+            LOGGER.warn("Get of control loop element definitions failed", e);
+            var resp = new CommissioningResponse();
+            resp.setErrorDetails(e.getErrorResponse().getErrorMessage());
+            return ResponseEntity.status(e.getErrorResponse().getResponseCode().getStatusCode()).body(resp);
+        }
+
+    }
+}
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/main/rest/InstantiationController.java
similarity index 76%
rename from runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/instantiation/rest/InstantiationController.java
rename to runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/main/rest/InstantiationController.java
index ea36c71..aba585e 100644
--- 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/main/rest/InstantiationController.java
@@ -18,7 +18,7 @@
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.policy.clamp.controlloop.runtime.instantiation.rest;
+package org.onap.policy.clamp.controlloop.runtime.main.rest;
 
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
@@ -29,32 +29,33 @@
 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.clamp.controlloop.runtime.main.web.AbstractRestController;
 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;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestHeader;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
 
 /**
  * Class to provide REST end points for creating, deleting, query and commanding a control loop definition.
  */
-public class InstantiationController extends RestController {
+@RestController
+public class InstantiationController extends AbstractRestController {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(InstantiationController.class);
 
@@ -62,10 +63,12 @@
     private final ControlLoopInstantiationProvider provider;
 
     /**
-     * create Instantiation Controller.
+     * Create Instantiation Controller.
+     *
+     * @param provider the ControlLoopInstantiationProvider
      */
-    public InstantiationController() {
-        this.provider = InstantiationHandler.getInstance().getControlLoopInstantiationProvider();
+    public InstantiationController(ControlLoopInstantiationProvider provider) {
+        this.provider = provider;
     }
 
     /**
@@ -76,8 +79,9 @@
      * @return a response
      */
     // @formatter:off
-    @POST
-    @Path("/instantiation")
+    @PostMapping(value = "/instantiation",
+            produces = {MediaType.APPLICATION_JSON_VALUE, APPLICATION_YAML},
+            consumes = {MediaType.APPLICATION_JSON_VALUE, APPLICATION_YAML})
     @ApiOperation(
             value = "Commissions control loop definitions",
             notes = "Commissions control loop definitions, returning the control loop IDs",
@@ -121,18 +125,18 @@
             }
         )
     // @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) {
+    public ResponseEntity<InstantiationResponse> create(
+            @RequestHeader(name = REQUEST_ID_NAME, required = false)
+            @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId,
+            @ApiParam(value = "Entity Body of Control Loop", required = true)
+            @RequestBody ControlLoops controlLoops) {
 
         try {
-            InstantiationResponse response = provider.createControlLoops(controlLoops);
-            return addLoggingHeaders(addVersionControlHeaders(Response.status(Status.OK)), requestId).entity(response)
-                    .build();
+            return ResponseEntity.ok().body(provider.createControlLoops(controlLoops));
 
         } catch (PfModelRuntimeException | PfModelException e) {
             LOGGER.warn("creation of control loop failed", e);
-            return createInstantiationErrorResponse(e, requestId);
+            return createInstantiationErrorResponse(e);
         }
     }
 
@@ -145,8 +149,8 @@
      * @return the control loops
      */
     // @formatter:off
-    @GET
-    @Path("/instantiation")
+    @GetMapping(value = "/instantiation",
+            produces = {MediaType.APPLICATION_JSON_VALUE, APPLICATION_YAML})
     @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,
@@ -183,20 +187,20 @@
             }
         )
     // @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) {
+    public ResponseEntity<?> query(
+            @RequestHeader(name = REQUEST_ID_NAME, required = false)
+            @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId,
+            @ApiParam(value = "Control Loop definition name", required = false)
+            @RequestParam(value = "name", required = false) String name,
+            @ApiParam(value = "Control Loop definition version", required = false)
+            @RequestParam(value = "version", required = false) String version) {
 
         try {
-            var response = provider.getControlLoops(name, version);
-            return addLoggingHeaders(addVersionControlHeaders(Response.status(Status.OK)), requestId).entity(response)
-                    .build();
+            return ResponseEntity.ok().body(provider.getControlLoops(name, version));
 
         } catch (PfModelRuntimeException | PfModelException e) {
             LOGGER.warn("commisssioning of control loop failed", e);
-            return createInstantiationErrorResponse(e, requestId);
+            return createInstantiationErrorResponse(e);
         }
 
     }
@@ -209,8 +213,9 @@
      * @return a response
      */
     // @formatter:off
-    @PUT
-    @Path("/instantiation")
+    @PutMapping(value = "/instantiation",
+            produces = {MediaType.APPLICATION_JSON_VALUE, APPLICATION_YAML},
+            consumes = {MediaType.APPLICATION_JSON_VALUE, APPLICATION_YAML})
     @ApiOperation(
             value = "Updates control loop definitions",
             notes = "Updates control loop definitions, returning the updated control loop definition IDs",
@@ -256,18 +261,18 @@
             }
         )
     // @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) {
+    public ResponseEntity<InstantiationResponse> update(
+            @RequestHeader(name = REQUEST_ID_NAME, required = false)
+            @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId,
+            @ApiParam(value = "Entity Body of Control Loop", required = true)
+            @RequestBody ControlLoops controlLoops) {
 
         try {
-            InstantiationResponse response = provider.updateControlLoops(controlLoops);
-            return addLoggingHeaders(addVersionControlHeaders(Response.status(Status.OK)), requestId).entity(response)
-                    .build();
+            return ResponseEntity.ok().body(provider.updateControlLoops(controlLoops));
 
         } catch (PfModelRuntimeException | PfModelException e) {
             LOGGER.warn("update of control loops failed", e);
-            return createInstantiationErrorResponse(e, requestId);
+            return createInstantiationErrorResponse(e);
         }
     }
 
@@ -280,8 +285,8 @@
      * @return a response
      */
     // @formatter:off
-    @DELETE
-    @Path("/instantiation")
+    @DeleteMapping(value = "/instantiation",
+            produces = {MediaType.APPLICATION_JSON_VALUE, APPLICATION_YAML})
     @ApiOperation(value = "Delete a control loop",
             notes = "Deletes a control loop, returning optional error details",
             response = InstantiationResponse.class,
@@ -326,20 +331,20 @@
     )
     // @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) {
+    public ResponseEntity<InstantiationResponse> delete(
+            @RequestHeader(name = REQUEST_ID_NAME, required = false)
+            @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId,
+            @ApiParam(value = "Control Loop definition name", required = true)
+            @RequestParam("name") String name,
+            @ApiParam(value = "Control Loop definition version")
+            @RequestParam(value = "version", required = false) String version) {
 
         try {
-            InstantiationResponse response = provider.deleteControlLoop(name, version);
-            return addLoggingHeaders(addVersionControlHeaders(Response.status(Status.OK)), requestId).entity(response)
-                    .build();
+            return ResponseEntity.ok().body(provider.deleteControlLoop(name, version));
 
         } catch (PfModelRuntimeException | PfModelException e) {
             LOGGER.warn("delete of control loop failed", e);
-            return createInstantiationErrorResponse(e, requestId);
+            return createInstantiationErrorResponse(e);
         }
     }
 
@@ -351,8 +356,9 @@
      * @return the control loop definitions
      */
     // @formatter:off
-    @PUT
-    @Path("/instantiation/command")
+    @PutMapping(value = "/instantiation/command",
+            produces = {MediaType.APPLICATION_JSON_VALUE, APPLICATION_YAML},
+            consumes = {MediaType.APPLICATION_JSON_VALUE, APPLICATION_YAML})
     @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,
@@ -389,32 +395,30 @@
             }
         )
     // @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) {
+    public ResponseEntity<InstantiationResponse> issueControlLoopCommand(
+            @RequestHeader(name = REQUEST_ID_NAME, required = false)
+            @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId,
+            @ApiParam(value = "Entity Body of control loop command", required = true)
+            @RequestBody InstantiationCommand command) {
 
         try {
-            InstantiationResponse response = provider.issueControlLoopCommand(command);
-            return addLoggingHeaders(addVersionControlHeaders(Response.status(Status.ACCEPTED)), requestId)
-                    .entity(response).build();
+            return ResponseEntity.accepted().body(provider.issueControlLoopCommand(command));
 
         } catch (PfModelRuntimeException | PfModelException | ControlLoopException e) {
             LOGGER.warn("creation of control loop failed", e);
-            return createInstantiationErrorResponse(e, requestId);
+            return createInstantiationErrorResponse(e);
         }
     }
 
     /**
      * 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) {
+    private ResponseEntity<InstantiationResponse> createInstantiationErrorResponse(ErrorResponseInfo e) {
         var resp = new InstantiationResponse();
         resp.setErrorDetails(e.getErrorResponse().getErrorMessage());
-        return addLoggingHeaders(addVersionControlHeaders(Response.status(e.getErrorResponse().getResponseCode())),
-            requestId).entity(resp).build();
+        return ResponseEntity.status(e.getErrorResponse().getResponseCode().getStatusCode()).body(resp);
     }
 }
-
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/main/rest/MonitoringQueryController.java
similarity index 64%
rename from runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/monitoring/rest/MonitoringQueryController.java
rename to runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/main/rest/MonitoringQueryController.java
index 7fde5fb..8653159 100644
--- 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/main/rest/MonitoringQueryController.java
@@ -18,7 +18,7 @@
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.policy.clamp.controlloop.runtime.monitoring.rest;
+package org.onap.policy.clamp.controlloop.runtime.main.rest;
 
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
@@ -30,38 +30,39 @@
 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.main.web.AbstractRestController;
 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;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestHeader;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
 
 /**
  * This class handles REST endpoints for CL Statistics monitoring.
  */
-public class MonitoringQueryController extends RestController {
+@RestController
+public class MonitoringQueryController extends AbstractRestController {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(MonitoringQueryController.class);
     private final MonitoringProvider provider;
 
     /**
      * Create Monitoring Controller.
+     *
+     * @param provider the MonitoringProvider
      */
-    public MonitoringQueryController() {
-        this.provider = MonitoringHandler.getInstance().getMonitoringProvider();
+    public MonitoringQueryController(MonitoringProvider provider) {
+        this.provider = provider;
     }
 
-
     /**
      * Queries details of control loop participants statistics.
      *
@@ -74,8 +75,8 @@
      * @return the participant statistics
      */
     // @formatter:off
-    @GET
-    @Path("/monitoring/participant")
+    @GetMapping(value = "/monitoring/participant",
+            produces = {MediaType.APPLICATION_JSON_VALUE, APPLICATION_YAML})
     @ApiOperation(value = "Query details of the requested participant stats",
         notes = "Queries details of the requested participant stats, returning all participant stats",
         response = ParticipantStatisticsList.class,
@@ -112,18 +113,26 @@
         }
     )
     // @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) {
+    public ResponseEntity<ParticipantStatisticsList> queryParticipantStatistics(
+            @RequestHeader(
+                    name = REQUEST_ID_NAME,
+                    required = false) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId,
+            @ApiParam(value = "Control Loop participant name") @RequestParam(
+                    value = "name",
+                    required = false) final String name,
+            @ApiParam(value = "Control Loop participant version", required = false) @RequestParam(
+                    value = "version",
+                    required = false) final String version,
+            @ApiParam(value = "Record count", required = false) @RequestParam(
+                    value = "recordCount",
+                    required = false,
+                    defaultValue = "0") final int recordCount,
+            @ApiParam(value = "start time", required = false) @RequestParam(
+                    value = "startTime",
+                    required = false) final String startTime,
+            @ApiParam(value = "end time", required = false) @RequestParam(
+                    value = "endTime",
+                    required = false) final String endTime) {
 
         try {
             Instant startTimestamp = null;
@@ -135,16 +144,12 @@
             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();
+            return ResponseEntity.ok().body(provider.fetchFilteredParticipantStatistics(name, version, recordCount,
+                    startTimestamp, endTimestamp));
 
         } catch (PfModelRuntimeException e) {
             LOGGER.warn("Monitoring of participants statistics failed", e);
-            return addLoggingHeaders(addVersionControlHeaders(Response.status(e.getErrorResponse().getResponseCode())),
-                requestId).build();
+            return ResponseEntity.status(e.getErrorResponse().getResponseCode().getStatusCode()).build();
         }
 
     }
@@ -158,8 +163,8 @@
      * @return the control loop element statistics
      */
     // @formatter:off
-    @GET
-    @Path("/monitoring/participants/controlloop")
+    @GetMapping(value = "/monitoring/participants/controlloop",
+            produces = {MediaType.APPLICATION_JSON_VALUE, APPLICATION_YAML})
     @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,
@@ -195,29 +200,27 @@
         }
     )
     // @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) {
+    public ResponseEntity<ParticipantStatisticsList> queryParticipantStatisticsPerControlLoop(
+            @RequestHeader(
+                    name = REQUEST_ID_NAME,
+                    required = false) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId,
+            @ApiParam(value = "Control Loop name", required = true) @RequestParam(
+                    value = "name",
+                    required = false) final String name,
+            @ApiParam(value = "Control Loop version", required = true) @RequestParam(
+                    value = "version",
+                    required = false) final String version) {
 
         try {
-            ParticipantStatisticsList response = provider.fetchParticipantStatsPerControlLoop(name, version);
-            return addLoggingHeaders(addVersionControlHeaders(Response.status(Response.Status.OK)), requestId)
-                .entity(response)
-                .build();
+            return ResponseEntity.ok().body(provider.fetchParticipantStatsPerControlLoop(name, version));
 
         } catch (PfModelRuntimeException e) {
             LOGGER.warn("Monitoring of Cl participant statistics failed", e);
-            return addLoggingHeaders(addVersionControlHeaders(Response.status(e.getErrorResponse().getResponseCode())),
-                requestId).build();
+            return ResponseEntity.status(e.getErrorResponse().getResponseCode().getStatusCode()).build();
         }
 
     }
 
-
-
     /**
      * Queries details of all control loop element statistics per control loop.
      *
@@ -227,8 +230,8 @@
      * @return the control loop element statistics
      */
     // @formatter:off
-    @GET
-    @Path("/monitoring/clelements/controlloop")
+    @GetMapping(value = "/monitoring/clelements/controlloop",
+            produces = {MediaType.APPLICATION_JSON_VALUE, APPLICATION_YAML})
     @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,
@@ -264,30 +267,27 @@
         }
     )
     // @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) {
+    public ResponseEntity<ClElementStatisticsList> queryElementStatisticsPerControlLoop(
+            @RequestHeader(
+                    name = REQUEST_ID_NAME,
+                    required = false) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId,
+            @ApiParam(value = "Control Loop name", required = true) @RequestParam(
+                    value = "name",
+                    required = false) final String name,
+            @ApiParam(value = "Control Loop version", required = true) @RequestParam(
+                    value = "version",
+                    required = false) final String version) {
 
         try {
-            ClElementStatisticsList response = provider.fetchClElementStatsPerControlLoop(name, version);
-            return addLoggingHeaders(addVersionControlHeaders(Response.status(Response.Status.OK)), requestId)
-                .entity(response)
-                .build();
+            return ResponseEntity.ok().body(provider.fetchClElementStatsPerControlLoop(name, version));
 
         } catch (PfModelRuntimeException e) {
             LOGGER.warn("Monitoring of Cl Element statistics failed", e);
-            return addLoggingHeaders(addVersionControlHeaders(Response.status(e.getErrorResponse().getResponseCode())),
-                requestId).build();
+            return ResponseEntity.status(e.getErrorResponse().getResponseCode().getStatusCode()).build();
         }
 
     }
 
-
-
-
     /**
      * Queries details of all control loop element statistics per control loop.
      *
@@ -301,8 +301,8 @@
      * @return the control loop element statistics
      */
     // @formatter:off
-    @GET
-    @Path("/monitoring/clelement")
+    @GetMapping(value = "/monitoring/clelement",
+            produces = {MediaType.APPLICATION_JSON_VALUE, APPLICATION_YAML})
     @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,
@@ -338,20 +338,29 @@
         }
     )
     // @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) {
+    public ResponseEntity<ClElementStatisticsList> queryElementStatistics(
+            @RequestHeader(
+                    name = REQUEST_ID_NAME,
+                    required = false) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId,
+            @ApiParam(value = "Participant name", required = true) @RequestParam(
+                    value = "name",
+                    required = false) final String name,
+            @ApiParam(value = "Participant version", required = true) @RequestParam(
+                    value = "version",
+                    required = false) final String version,
+            @ApiParam(value = "Record count", required = false) @RequestParam(
+                    value = "recordCount",
+                    required = false,
+                    defaultValue = "0") final int recordCount,
+            @ApiParam(value = "Control Loop element id", required = false) @RequestParam(
+                    value = "id",
+                    required = false) final String id,
+            @ApiParam(value = "start time", required = false) @RequestParam(
+                    value = "startTime",
+                    required = false) final String startTime,
+            @ApiParam(value = "end time", required = false) @RequestParam(
+                    value = "endTime",
+                    required = false) final String endTime) {
 
         try {
             Instant startTimestamp = null;
@@ -363,16 +372,12 @@
             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();
+            return ResponseEntity.ok().body(provider.fetchFilteredClElementStatistics(name, version, id, startTimestamp,
+                    endTimestamp, recordCount));
 
         } catch (PfModelRuntimeException | PfModelException e) {
             LOGGER.warn("Monitoring of Cl Element statistics failed", e);
-            return addLoggingHeaders(addVersionControlHeaders(Response.status(e.getErrorResponse().getResponseCode())),
-                requestId).build();
+            return ResponseEntity.status(e.getErrorResponse().getResponseCode().getStatusCode()).build();
         }
 
     }
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
deleted file mode 100644
index 4955e4a..0000000
--- a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/main/rest/RestController.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*-
- * ============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
-     * @param requestId unique ID for this request
-     * @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
index 957f536..323f761 100644
--- 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
@@ -20,36 +20,30 @@
 
 package org.onap.policy.clamp.controlloop.runtime.main.startstop;
 
-import java.util.HashSet;
+import java.io.Closeable;
+import java.io.IOException;
 import java.util.List;
-import java.util.Set;
-import java.util.concurrent.atomic.AtomicReference;
 import javax.ws.rs.core.Response.Status;
+import lombok.Getter;
 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 {
+public class ClRuntimeActivator extends ServiceManagerContainer implements Closeable {
     // Name of the message type for messages on topics
     private static final String[] MSG_TYPE_NAMES = {"messageType"};
 
-    private final ClRuntimeParameterGroup clRuntimeParameterGroup;
+    @Getter
+    private final ClRuntimeParameterGroup parameterGroup;
 
     // Topics from which the application receives and to which the application sends messages
     private List<TopicSink> topicSinks;
@@ -64,15 +58,12 @@
      * Instantiate the activator for the control loop runtime as a complete service.
      *
      * @param clRuntimeParameterGroup the parameters for the control loop runtime service
+     * @param supervisionHandler SupervisionHandler
      * @throws ControlLoopRuntimeException if the activator does not start
      */
-    public ClRuntimeActivator(final ClRuntimeParameterGroup clRuntimeParameterGroup) {
-
-        if (clRuntimeParameterGroup == null || !clRuntimeParameterGroup.isValid()) {
-            throw new ControlLoopRuntimeException(Status.INTERNAL_SERVER_ERROR, "ParameterGroup not valid");
-        }
-
-        this.clRuntimeParameterGroup = clRuntimeParameterGroup;
+    public ClRuntimeActivator(final ClRuntimeParameterGroup clRuntimeParameterGroup,
+            SupervisionHandler supervisionHandler) {
+        this.parameterGroup = clRuntimeParameterGroup;
 
         topicSinks = TopicEndpointManager.getManager()
                 .addTopicSinks(clRuntimeParameterGroup.getTopicParameterGroup().getTopicSinks());
@@ -87,77 +78,22 @@
                     "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("Supervision Providers", () -> supervisionHandler.startProviders(),
+                () -> supervisionHandler.stopProviders());
+        addAction("Supervision Listeners", () -> supervisionHandler.startAndRegisterListeners(msgDispatcher),
+                () -> supervisionHandler.stopAndUnregisterListeners(msgDispatcher));
+        addAction("Supervision Publishers", () -> supervisionHandler.startAndRegisterPublishers(topicSinks),
+                () -> supervisionHandler.stopAndUnregisterPublishers());
 
         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());
-
-                var 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).
      */
@@ -176,12 +112,10 @@
         }
     }
 
-    /**
-     * Get the parameters used by the activator.
-     *
-     * @return the parameters of the activator
-     */
-    public ClRuntimeParameterGroup getParameterGroup() {
-        return clRuntimeParameterGroup;
+    @Override
+    public void close() throws IOException {
+        if (isAlive()) {
+            stop();
+        }
     }
 }
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
deleted file mode 100644
index 54167e8..0000000
--- a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/main/startstop/ClRuntimeCommandLineArguments.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*-
- * ============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 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.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 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
-     * @throws ControlLoopRuntimeException if the arguments are invalid
-     */
-    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());
-    }
-}
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
deleted file mode 100644
index de1ce6f..0000000
--- a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/main/startstop/Main.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*-
- * ============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
-     * @throws ControlLoopRuntimeException if the CLAMP runtime fails to start
-     */
-    public Main(final String[] args) {
-        final var argumentString = Arrays.toString(args);
-        LOGGER.info("Starting the control loop runtime service with arguments - {}", argumentString);
-
-        // Check the arguments
-        final var 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());
-        var successMsg = String.format(MessageConstants.START_SUCCESS_MSG, MessageConstants.POLICY_CLAMP);
-        LOGGER.info(successMsg);
-    }
-
-    /**
-     * Check if main is running.
-     *
-     * @return true if the CLAMP runtime 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/main/web/AbstractRestController.java b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/main/web/AbstractRestController.java
new file mode 100644
index 0000000..7d279ba
--- /dev/null
+++ b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/main/web/AbstractRestController.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.runtime.main.web;
+
+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 javax.ws.rs.core.MediaType;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+/**
+ * Common superclass to provide REST endpoints for the participant simulator.
+ */
+// @formatter:off
+@RequestMapping(value = "/v2", produces = {MediaType.APPLICATION_JSON, AbstractRestController.APPLICATION_YAML})
+@Api(value = "Control Loop Commissioning API")
+@SwaggerDefinition(
+        info = @Info(description =
+                        "Control Loop Service", version = "v1.0",
+                        title = "Control Loop"),
+        consumes = {MediaType.APPLICATION_JSON, AbstractRestController.APPLICATION_YAML},
+        produces = {MediaType.APPLICATION_JSON, AbstractRestController.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 abstract class AbstractRestController {
+    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";
+
+    /**
+     * Constructor.
+     */
+    protected AbstractRestController() {
+    }
+}
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/web/ControlLoopAafFilter.java
similarity index 95%
rename from runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/main/rest/ControlLoopAafFilter.java
rename to runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/main/web/ControlLoopAafFilter.java
index f166de5..739a691 100644
--- 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/web/ControlLoopAafFilter.java
@@ -18,7 +18,7 @@
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.policy.clamp.controlloop.runtime.main.rest;
+package org.onap.policy.clamp.controlloop.runtime.main.web;
 
 import org.onap.policy.common.endpoints.http.server.aaf.AafGranularAuthFilter;
 import org.onap.policy.common.utils.resources.MessageConstants;
diff --git a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/main/web/RequestResponseLoggingFilter.java b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/main/web/RequestResponseLoggingFilter.java
new file mode 100644
index 0000000..eb08391
--- /dev/null
+++ b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/main/web/RequestResponseLoggingFilter.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.main.web;
+
+import java.io.IOException;
+import java.util.UUID;
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+
+@Component
+@Order(2)
+public class RequestResponseLoggingFilter implements Filter {
+
+    private static final String VERSION_MINOR_NAME = "X-MinorVersion";
+    private static final String VERSION_PATCH_NAME = "X-PatchVersion";
+    private static final String VERSION_LATEST_NAME = "X-LatestVersion";
+    public static final String API_VERSION = "1.0.0";
+    public static final String REQUEST_ID_NAME = "X-ONAP-RequestID";
+
+    @Override
+    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
+            throws IOException, ServletException {
+
+
+        HttpServletResponse res = (HttpServletResponse) response;
+        HttpServletRequest req = (HttpServletRequest) request;
+
+        String requestId = req.getHeader(REQUEST_ID_NAME);
+        res.addHeader(REQUEST_ID_NAME, requestId != null ? requestId : UUID.randomUUID().toString());
+
+        res.addHeader(VERSION_MINOR_NAME, "0");
+        res.addHeader(VERSION_PATCH_NAME, "0");
+        res.addHeader(VERSION_LATEST_NAME, API_VERSION);
+
+        chain.doFilter(request, response);
+    }
+
+}
diff --git a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/main/web/RuntimeErrorController.java b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/main/web/RuntimeErrorController.java
new file mode 100644
index 0000000..2dc7a6b
--- /dev/null
+++ b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/main/web/RuntimeErrorController.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.runtime.main.web;
+
+import io.swagger.v3.oas.annotations.Hidden;
+import java.util.Map;
+import javax.servlet.RequestDispatcher;
+import javax.servlet.http.HttpServletRequest;
+import org.onap.policy.clamp.controlloop.models.messages.rest.SimpleResponse;
+import org.onap.policy.clamp.controlloop.models.messages.rest.TypedSimpleResponse;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.web.error.ErrorAttributeOptions;
+import org.springframework.boot.web.servlet.error.ErrorAttributes;
+import org.springframework.boot.web.servlet.error.ErrorController;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.context.request.ServletWebRequest;
+
+@Controller
+@Hidden
+public class RuntimeErrorController implements ErrorController {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(RuntimeErrorController.class);
+
+    private final ErrorAttributes errorAttributes;
+
+    @Value("${server.error.path}")
+    private String path;
+
+    /**
+     * Constructor.
+     *
+     * @param errorAttributes ErrorAttributes
+     */
+    public RuntimeErrorController(ErrorAttributes errorAttributes) {
+        this.errorAttributes = errorAttributes;
+    }
+
+    protected HttpStatus getStatus(HttpServletRequest request) {
+        Integer statusCode = (Integer) request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE);
+        if (statusCode == null) {
+            return HttpStatus.INTERNAL_SERVER_ERROR;
+        }
+        try {
+            return HttpStatus.valueOf(statusCode);
+        } catch (Exception ex) {
+            LOGGER.error("statusCode {} Not Valid", statusCode, ex);
+            return HttpStatus.INTERNAL_SERVER_ERROR;
+        }
+    }
+
+    /**
+     * Handle Errors not handled to GlobalControllerExceptionHandler.
+     *
+     * @param request HttpServletRequest
+     * @return ResponseEntity
+     */
+    @RequestMapping(value = "${server.error.path}", produces = MediaType.APPLICATION_JSON_VALUE)
+    public ResponseEntity<TypedSimpleResponse<SimpleResponse>> handleError(HttpServletRequest request) {
+        Map<String, Object> map = this.errorAttributes.getErrorAttributes(new ServletWebRequest(request),
+                ErrorAttributeOptions.defaults());
+
+        StringBuilder sb = new StringBuilder();
+        final Object error = map.get("error");
+        if (error != null) {
+            sb.append(error.toString()).append(" ");
+        }
+        final Object message = map.get("message");
+        if (message != null) {
+            sb.append(message.toString());
+        }
+
+        TypedSimpleResponse<SimpleResponse> resp = new TypedSimpleResponse<>();
+        resp.setErrorDetails(sb.toString());
+
+        return ResponseEntity.status(getStatus(request)).body(resp);
+
+    }
+}
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
deleted file mode 100644
index 1584766..0000000
--- a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/monitoring/MonitoringHandler.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*-
- * ============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.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.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
index 1bc1312..a685058 100644
--- 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
@@ -36,14 +36,16 @@
 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.clamp.controlloop.runtime.main.parameters.ClRuntimeParameterGroup;
 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.springframework.stereotype.Component;
 
 /**
  * This class provides information about statistics data of CL elements and CL Participants in database to callers.
  */
+@Component
 public class MonitoringProvider implements Closeable {
 
     private static final String DESC_ORDER = "DESC";
@@ -54,15 +56,17 @@
     /**
      * Create a Monitoring provider.
      *
-     * @param parameters parameters for accessing the database for monitoring
+     * @param controlLoopParameters the parameters for access to the database
      * @throws PfModelRuntimeException on errors creating the provider
      */
-    public MonitoringProvider(PolicyModelsProviderParameters parameters) {
+    public MonitoringProvider(ClRuntimeParameterGroup controlLoopParameters) {
 
         try {
-            participantStatisticsProvider = new ParticipantStatisticsProvider(parameters);
-            clElementStatisticsProvider = new ClElementStatisticsProvider(parameters);
-            controlLoopProvider = new ControlLoopProvider(parameters);
+            participantStatisticsProvider =
+                    new ParticipantStatisticsProvider(controlLoopParameters.getDatabaseProviderParameters());
+            clElementStatisticsProvider =
+                    new ClElementStatisticsProvider(controlLoopParameters.getDatabaseProviderParameters());
+            controlLoopProvider = new ControlLoopProvider(controlLoopParameters.getDatabaseProviderParameters());
         } catch (PfModelException e) {
             throw new PfModelRuntimeException(e);
         }
@@ -83,10 +87,10 @@
      * @throws PfModelException on creation errors
      */
     public ParticipantStatisticsList createParticipantStatistics(List<ParticipantStatistics> participantStatistics)
-        throws PfModelException {
+            throws PfModelException {
         var participantStatisticsList = new ParticipantStatisticsList();
         participantStatisticsList
-            .setStatisticsList(participantStatisticsProvider.createParticipantStatistics(participantStatistics));
+                .setStatisticsList(participantStatisticsProvider.createParticipantStatistics(participantStatistics));
 
         return participantStatisticsList;
     }
@@ -99,10 +103,10 @@
      * @throws PfModelException on creation errors
      */
     public ClElementStatisticsList createClElementStatistics(List<ClElementStatistics> clElementStatisticsList)
-        throws PfModelException {
+            throws PfModelException {
         var elementStatisticsList = new ClElementStatisticsList();
         elementStatisticsList
-            .setClElementStatistics(clElementStatisticsProvider.createClElementStatistics(clElementStatisticsList));
+                .setClElementStatistics(clElementStatisticsProvider.createClElementStatistics(clElementStatisticsList));
 
         return elementStatisticsList;
     }
@@ -118,13 +122,13 @@
      * @return the participant found
      */
     public ParticipantStatisticsList fetchFilteredParticipantStatistics(@NonNull final String name,
-        final String version, int recordCount, Instant startTime, Instant endTime) {
+            final String version, int recordCount, Instant startTime, Instant endTime) {
         var 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));
+                version, startTime, endTime, filterMap, DESC_ORDER, recordCount));
 
         return participantStatisticsList;
     }
@@ -138,16 +142,16 @@
      * @throws PfModelRuntimeException on errors getting participant statistics
      */
     public ParticipantStatisticsList fetchParticipantStatsPerControlLoop(@NonNull final String controlLoopName,
-        @NonNull final String controlLoopVersion) {
+            @NonNull final String controlLoopVersion) {
         var statisticsList = new ParticipantStatisticsList();
         List<ParticipantStatistics> participantStatistics = new ArrayList<>();
         try {
             // Fetch all participantIds for a specific control loop
             List<ToscaConceptIdentifier> participantIds =
-                getAllParticipantIdsPerControlLoop(controlLoopName, controlLoopVersion);
+                    getAllParticipantIdsPerControlLoop(controlLoopName, controlLoopVersion);
             for (ToscaConceptIdentifier id : participantIds) {
-                participantStatistics.addAll(participantStatisticsProvider
-                    .getFilteredParticipantStatistics(id.getName(), id.getVersion(), null, null, null, DESC_ORDER, 0));
+                participantStatistics.addAll(participantStatisticsProvider.getFilteredParticipantStatistics(
+                        id.getName(), id.getVersion(), null, null, null, DESC_ORDER, 0));
             }
             statisticsList.setStatisticsList(participantStatistics);
         } catch (PfModelException e) {
@@ -169,7 +173,7 @@
      * @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 {
+            final String id, Instant startTime, Instant endTime, int recordCount) throws PfModelException {
         var clElementStatisticsList = new ClElementStatisticsList();
         Map<String, Object> filterMap = new HashMap<>();
         // Adding UUID in filter if present
@@ -177,7 +181,7 @@
             filterMap.put("localName", id);
         }
         clElementStatisticsList.setClElementStatistics(clElementStatisticsProvider.getFilteredClElementStatistics(name,
-            version, startTime, endTime, filterMap, DESC_ORDER, recordCount));
+                version, startTime, endTime, filterMap, DESC_ORDER, recordCount));
 
         return clElementStatisticsList;
     }
@@ -191,7 +195,7 @@
      * @throws PfModelRuntimeException on errors getting control loop statistics
      */
     public ClElementStatisticsList fetchClElementStatsPerControlLoop(@NonNull final String name,
-        @NonNull final String version) {
+            @NonNull final String version) {
         var clElementStatisticsList = new ClElementStatisticsList();
         List<ClElementStatistics> clElementStats = new ArrayList<>();
         try {
@@ -203,8 +207,8 @@
                 // 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());
+                            clElement.getParticipantId().getVersion(), clElement.getId().toString(), null, null, 0)
+                                    .getClElementStatistics());
                 }
             }
             clElementStatisticsList.setClElementStatistics(clElementStats);
@@ -224,7 +228,7 @@
      * @throws PfModelException on errors
      */
     public List<ToscaConceptIdentifier> getAllParticipantIdsPerControlLoop(String name, String version)
-        throws PfModelException {
+            throws PfModelException {
         List<ToscaConceptIdentifier> participantIds = new ArrayList<>();
         var controlLoop = controlLoopProvider.getControlLoop(new ToscaConceptIdentifier(name, version));
         if (controlLoop != null) {
@@ -245,7 +249,7 @@
      * @throws PfModelException on errors
      */
     public Map<String, ToscaConceptIdentifier> getAllClElementsIdPerControlLoop(String name, String version)
-        throws PfModelException {
+            throws PfModelException {
         Map<String, ToscaConceptIdentifier> clElementId = new HashMap<>();
         var controlLoop = controlLoopProvider.getControlLoop(new ToscaConceptIdentifier(name, version));
         if (controlLoop != null) {
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
index 511185d..e1b4be4 100644
--- 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
@@ -38,9 +38,8 @@
 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;
@@ -48,19 +47,20 @@
 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.tosca.authorative.concepts.ToscaConceptIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
 
 /**
  * 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.
  */
+@Component
 public class SupervisionHandler extends ControlLoopHandler {
     private static final Logger LOGGER = LoggerFactory.getLogger(SupervisionHandler.class);
 
@@ -71,7 +71,8 @@
 
     private ControlLoopProvider controlLoopProvider;
     private ParticipantProvider participantProvider;
-    private MonitoringProvider monitoringProvider;
+    private final MonitoringProvider monitoringProvider;
+    private final CommissioningProvider commissioningProvider;
 
     // Publishers for participant communication
     private ParticipantStateChangePublisher stateChangePublisher;
@@ -93,21 +94,18 @@
     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
+     * @param monitoringProvider the MonitoringProvider
+     * @param commissioningProvider the CommissioningProvider
      */
-    public SupervisionHandler(ClRuntimeParameterGroup clRuntimeParameterGroup) {
+    public SupervisionHandler(ClRuntimeParameterGroup clRuntimeParameterGroup, MonitoringProvider monitoringProvider,
+            CommissioningProvider commissioningProvider) {
         super(clRuntimeParameterGroup.getDatabaseProviderParameters());
+        this.monitoringProvider = monitoringProvider;
+        this.commissioningProvider = commissioningProvider;
+
         // @formatter:off
         this.manager = new ServiceManager()
                         .addAction("ControlLoop Provider",
@@ -128,7 +126,8 @@
     /**
      * 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.
+     * <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
@@ -158,7 +157,7 @@
 
     @Override
     public void startAndRegisterListeners(MessageTypeDispatcher msgDispatcher) {
-        msgDispatcher.register(ParticipantMessageType.PARTICIPANT_STATUS.name(), new ParticipantStatusListener());
+        msgDispatcher.register(ParticipantMessageType.PARTICIPANT_STATUS.name(), new ParticipantStatusListener(this));
     }
 
     @Override
@@ -250,7 +249,7 @@
 
             default:
                 exceptionOccured(Response.Status.NOT_ACCEPTABLE,
-                    "A control loop cannot be commanded to go into state " + controlLoop.getOrderedState().name());
+                        "A control loop cannot be commanded to go into state " + controlLoop.getOrderedState().name());
         }
     }
 
@@ -346,7 +345,6 @@
         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
-        var commissioningProvider = CommissioningHandler.getInstance().getProvider();
         pclu.setControlLoopDefinition(commissioningProvider.getToscaServiceTemplate(null, null));
         controlLoopUpdatePublisher.send(pclu);
     }
@@ -388,7 +386,6 @@
             participantProvider.updateParticipants(participantList);
         }
 
-        monitoringProvider = MonitoringHandler.getInstance().getMonitoringProvider();
         monitoringProvider.createParticipantStatistics(List.of(participantStatusMessage.getParticipantStatistics()));
     }
 
@@ -401,14 +398,14 @@
         for (ControlLoop controlLoop : participantStatusMessage.getControlLoops().getControlLoopList()) {
             if (controlLoop == null) {
                 exceptionOccured(Response.Status.NOT_FOUND,
-                    "PARTICIPANT_STATUS message references unknown control loop: " + controlLoop);
+                        "PARTICIPANT_STATUS message references unknown control loop: " + controlLoop);
             }
 
             var 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);
+                        "PARTICIPANT_STATUS control loop not found in database: " + controlLoop);
             }
 
             for (ControlLoopElement element : controlLoop.getElements().values()) {
@@ -425,7 +422,6 @@
             controlLoopProvider.updateControlLoop(dbControlLoop);
         }
 
-        monitoringProvider = MonitoringHandler.getInstance().getMonitoringProvider();
         for (ControlLoop controlLoop : participantStatusMessage.getControlLoops().getControlLoopList()) {
             monitoringProvider.createClElementStatistics(controlLoop.getControlLoopElementStatisticsList(controlLoop));
         }
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
index a05f4aa..88b8386 100644
--- 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
@@ -25,7 +25,6 @@
 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;
 
@@ -35,13 +34,14 @@
 public class ParticipantStatusListener extends ScoListener<ParticipantStatus> {
     private static final Logger LOGGER = LoggerFactory.getLogger(ParticipantStatusListener.class);
 
-    private final SupervisionHandler supervisionHandler = Registry.get(SupervisionHandler.class.getName());
+    private final SupervisionHandler supervisionHandler;
 
     /**
      * Constructs the object.
      */
-    public ParticipantStatusListener() {
+    public ParticipantStatusListener(SupervisionHandler supervisionHandler) {
         super(ParticipantStatus.class);
+        this.supervisionHandler = supervisionHandler;
     }
 
     @Override
diff --git a/runtime-controlloop/src/main/resources/application.yaml b/runtime-controlloop/src/main/resources/application.yaml
new file mode 100644
index 0000000..af9966d
--- /dev/null
+++ b/runtime-controlloop/src/main/resources/application.yaml
@@ -0,0 +1,22 @@
+spring:
+  security:
+    user:
+      name: healthcheck
+      password: zb!XztG34
+  http:
+    converters:
+      preferred-json-mapper: gson
+
+security:
+  enable-csrf: false
+
+server:
+  port: 6969
+  servlet:
+    context-path: /onap/controlloop
+  error:
+    path: /error
+
+
+runtime:
+  file: src/main/resources/parameters/ClRuntimeParameters.json
diff --git a/runtime-controlloop/src/test/resources/parameters/TestParametersMariaDB.json b/runtime-controlloop/src/main/resources/parameters/ClRuntimeParameters.json
similarity index 90%
rename from runtime-controlloop/src/test/resources/parameters/TestParametersMariaDB.json
rename to runtime-controlloop/src/main/resources/parameters/ClRuntimeParameters.json
index 3a009f8..a6c1983 100644
--- a/runtime-controlloop/src/test/resources/parameters/TestParametersMariaDB.json
+++ b/runtime-controlloop/src/main/resources/parameters/ClRuntimeParameters.json
@@ -27,7 +27,7 @@
         "name": "PolicyProviderParameterGroup",
         "implementation": "org.onap.policy.models.provider.impl.DatabasePolicyModelsProviderImpl",
         "databaseDriver": "org.mariadb.jdbc.Driver",
-        "databaseUrl": "jdbc:mariadb://localhost:3306/controlloop",
+        "databaseUrl": "jdbc:mariadb://mariadb:3306/controlloop",
         "databaseUser": "policy",
         "databasePassword": "P01icY",
         "persistenceUnit": "CommissioningMariaDb"
@@ -37,7 +37,7 @@
             {
                 "topic": "POLICY-CLRUNTIME-PARTICIPANT",
                 "servers": [
-                    "localhost"
+                    "message-router"
                 ],
                 "topicCommInfrastructure": "dmaap",
                 "fetchTimeout": 15000
@@ -47,14 +47,14 @@
             {
                 "topic": "POLICY-CLRUNTIME-PARTICIPANT",
                 "servers": [
-                    "localhost"
+                    "message-router"
                 ],
                 "topicCommInfrastructure": "dmaap"
             },
             {
                 "topic": "POLICY-NOTIFICATION",
                 "servers": [
-                    "localhost"
+                    "message-router"
                 ],
                 "topicCommInfrastructure": "dmaap"
             }
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
index 956b5e9..fdddcf9 100644
--- 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
@@ -22,26 +22,23 @@
 
 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 static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.util.ArrayList;
 import java.util.List;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.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 {
+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";
@@ -49,7 +46,6 @@
     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++;
@@ -58,15 +54,13 @@
     }
 
     /**
-     * Sets up db provider parameters before each test.
+     * return a Cl Runtime Parameters.
      *
      * @throws CoderException .
      */
-    @Before
-    public void setupDbProviderParameters() throws CoderException {
+    public ClRuntimeParameterGroup getClRuntimeParameterGroup() throws CoderException {
         synchronized (lockit) {
-            databaseProviderParameters = CODER.decode(getParameterGroupAsString(), ClRuntimeParameterGroup.class)
-                    .getDatabaseProviderParameters();
+            return CODER.decode(getParameterGroupAsString(), ClRuntimeParameterGroup.class);
         }
     }
 
@@ -76,14 +70,13 @@
      * @throws Exception .
      */
     @Test
-    public void testGetControlLoopDefinitions() throws Exception {
+    void testGetControlLoopDefinitions() throws Exception {
         List<ToscaNodeTemplate> listOfTemplates;
+        ClRuntimeParameterGroup clRuntimeParameterGroup = getClRuntimeParameterGroup();
 
-        try (CommissioningProvider provider = new CommissioningProvider(databaseProviderParameters)) {
-            ToscaServiceTemplate serviceTemplate = yamlTranslator
-                    .fromYaml(ResourceUtils.getResourceAsString(TOSCA_SERVICE_TEMPLATE_YAML),
-                            ToscaServiceTemplate.class);
-
+        try (var provider = new CommissioningProvider(clRuntimeParameterGroup)) {
+            ToscaServiceTemplate serviceTemplate = yamlTranslator.fromYaml(
+                    ResourceUtils.getResourceAsString(TOSCA_SERVICE_TEMPLATE_YAML), ToscaServiceTemplate.class);
 
             listOfTemplates = provider.getControlLoopDefinitions(null, null);
             assertThat(listOfTemplates).isEmpty();
@@ -92,16 +85,16 @@
             listOfTemplates = provider.getControlLoopDefinitions(null, null);
             assertThat(listOfTemplates).hasSize(2);
 
-            //Test Filtering
-            listOfTemplates = provider.getControlLoopDefinitions("org.onap.domain.pmsh.PMSHControlLoopDefinition",
-                    "1.2.3");
+            // 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"));
+                // Other CL elements contain PMSD instead of PMSH in their name
+                assertThat(template.getName()).doesNotContain("PMSD");
             }
 
-            //Test Wrong Name
+            // Test Wrong Name
             listOfTemplates = provider.getControlLoopDefinitions("WrongControlLoopName", "0.0.0");
             assertThat(listOfTemplates).isEmpty();
         }
@@ -113,18 +106,18 @@
      * @throws Exception .
      */
     @Test
-    public void testCreateControlLoopDefinitions() throws Exception {
+    void testCreateControlLoopDefinitions() throws Exception {
         List<ToscaNodeTemplate> listOfTemplates;
+        ClRuntimeParameterGroup clRuntimeParameterGroup = getClRuntimeParameterGroup();
 
-        try (CommissioningProvider provider = new CommissioningProvider(databaseProviderParameters)) {
-            //Test Service template is null
+        try (var provider = new CommissioningProvider(clRuntimeParameterGroup)) {
+            // 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);
+            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 =
@@ -141,13 +134,13 @@
      * @throws Exception .
      */
     @Test
-    public void testDeleteControlLoopDefinitions() throws Exception {
+    void testDeleteControlLoopDefinitions() throws Exception {
         List<ToscaNodeTemplate> listOfTemplates;
+        ClRuntimeParameterGroup clRuntimeParameterGroup = getClRuntimeParameterGroup();
 
-        try (CommissioningProvider provider = new CommissioningProvider(databaseProviderParameters)) {
-            ToscaServiceTemplate serviceTemplate = yamlTranslator
-                    .fromYaml(ResourceUtils.getResourceAsString(TOSCA_SERVICE_TEMPLATE_YAML),
-                            ToscaServiceTemplate.class);
+        try (var provider = new CommissioningProvider(clRuntimeParameterGroup)) {
+            ToscaServiceTemplate serviceTemplate = yamlTranslator.fromYaml(
+                    ResourceUtils.getResourceAsString(TOSCA_SERVICE_TEMPLATE_YAML), ToscaServiceTemplate.class);
 
             listOfTemplates = provider.getControlLoopDefinitions(null, null);
             assertThat(listOfTemplates).isEmpty();
@@ -168,17 +161,17 @@
      * @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);
+    void testGetControlLoopElementDefinitions() throws Exception {
+        ClRuntimeParameterGroup clRuntimeParameterGroup = getClRuntimeParameterGroup();
+        try (var provider = new CommissioningProvider(clRuntimeParameterGroup)) {
+            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> controlLoopDefinitionList =
+                    provider.getControlLoopDefinitions("org.onap.domain.pmsh.PMSHControlLoopDefinition", "1.2.3");
 
             List<ToscaNodeTemplate> controlLoopElementNodeTemplates =
                     provider.getControlLoopElementDefinitions(controlLoopDefinitionList.get(0));
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
index f7749e1..85bb2d1 100644
--- 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
@@ -21,27 +21,38 @@
 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 static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.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.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 import org.onap.policy.clamp.controlloop.models.messages.rest.commissioning.CommissioningResponse;
+import org.onap.policy.clamp.controlloop.runtime.main.parameters.ClRuntimeParameterGroup;
 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;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
+import org.springframework.boot.web.server.LocalServerPort;
+import org.springframework.test.context.TestPropertySource;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
 
-public class CommissioningControllerTest extends CommonRestController {
+@ExtendWith(SpringExtension.class)
+@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
+@TestPropertySource(locations = {"classpath:application_test.properties"})
+class CommissioningControllerTest extends CommonRestController {
 
     private static final String TOSCA_SERVICE_TEMPLATE_YAML =
             "src/test/resources/rest/servicetemplates/pmsh_multiple_cl_tosca.yaml";
@@ -49,62 +60,67 @@
     private static final String COMMISSIONING_ENDPOINT = "commission";
     private static ToscaServiceTemplate serviceTemplate = new ToscaServiceTemplate();
 
+    @Autowired
+    private ClRuntimeParameterGroup clRuntimeParameterGroup;
+
+    @LocalServerPort
+    private int randomServerPort;
+
     /**
      * starts Main and inserts a commissioning template.
      *
      * @throws Exception if an error occurs
      */
-    @BeforeClass
+    @BeforeAll
     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();
+    @BeforeEach
+    public void setUpPort() {
+        super.setHttpPrefix(randomServerPort);
     }
 
     @Test
-    public void testSwagger() throws Exception {
+    void testSwagger() throws Exception {
         super.testSwagger(COMMISSIONING_ENDPOINT);
     }
 
     @Test
-    public void testUnauthorizedCreate() throws Exception {
+    void testUnauthorizedCreate() throws Exception {
         assertUnauthorizedPost(COMMISSIONING_ENDPOINT, Entity.json(serviceTemplate));
     }
 
     @Test
-    public void testUnauthorizedQuery() throws Exception {
+    void testUnauthorizedQuery() throws Exception {
         assertUnauthorizedGet(COMMISSIONING_ENDPOINT);
     }
 
     @Test
-    public void testUnauthorizedQueryElements() throws Exception {
+    void testUnauthorizedQueryElements() throws Exception {
         assertUnauthorizedGet(COMMISSIONING_ENDPOINT + "/elements");
     }
 
     @Test
-    public void testUnauthorizedDelete() throws Exception {
+    void testUnauthorizedDelete() throws Exception {
         assertUnauthorizedDelete(COMMISSIONING_ENDPOINT);
     }
 
     @Test
-    public void testCreateBadRequest() throws Exception {
+    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());
+        assertThat(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode()).isEqualTo(resp.getStatus());
         CommissioningResponse commissioningResponse = resp.readEntity(CommissioningResponse.class);
-        assertNotNull(commissioningResponse.getErrorDetails());
-        assertNull(commissioningResponse.getAffectedControlLoopDefinitions());
+        assertThat(commissioningResponse.getErrorDetails()).isNotNull();
+        assertThat(commissioningResponse.getAffectedControlLoopDefinitions()).isNull();
     }
 
     @Test
-    public void testCreate() throws Exception {
+    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());
@@ -121,7 +137,7 @@
     }
 
     @Test
-    public void testQuery_NoResultWithThisName() throws Exception {
+    void testQuery_NoResultWithThisName() throws Exception {
         createEntryInDB();
 
         Invocation.Builder invocationBuilder = super.sendRequest(COMMISSIONING_ENDPOINT + "?name=noResultWithThisName");
@@ -132,7 +148,7 @@
     }
 
     @Test
-    public void testQuery() throws Exception {
+    void testQuery() throws Exception {
         createEntryInDB();
 
         Invocation.Builder invocationBuilder = super.sendRequest(COMMISSIONING_ENDPOINT);
@@ -144,7 +160,7 @@
     }
 
     @Test
-    public void testQueryElementsBadRequest() throws Exception {
+    void testQueryElementsBadRequest() throws Exception {
         createEntryInDB();
 
         //Call get elements with no info
@@ -154,7 +170,7 @@
     }
 
     @Test
-    public void testQueryElements() throws Exception {
+    void testQueryElements() throws Exception {
         createEntryInDB();
 
         Invocation.Builder invocationBuilder = super.sendRequest(COMMISSIONING_ENDPOINT + "/elements"
@@ -167,17 +183,17 @@
     }
 
     @Test
-    public void testDeleteBadRequest() throws Exception {
+    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());
+        assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
     }
 
     @Test
-    public void testDelete() throws Exception {
+    void testDelete() throws Exception {
         createEntryInDB();
 
         Invocation.Builder invocationBuilder = super.sendRequest(COMMISSIONING_ENDPOINT + "?name="
@@ -187,7 +203,7 @@
         assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
 
         try (PolicyModelsProvider modelsProvider = new PolicyModelsProviderFactory()
-                .createPolicyModelsProvider(CommonRestController.getParameters())) {
+                .createPolicyModelsProvider(clRuntimeParameterGroup.getDatabaseProviderParameters())) {
             List<ToscaServiceTemplate> templatesInDB = modelsProvider.getServiceTemplateList(null, null);
             assertThat(templatesInDB).isEmpty();
         }
@@ -195,7 +211,7 @@
 
     private synchronized void createEntryInDB() throws Exception {
         try (PolicyModelsProvider modelsProvider = new PolicyModelsProviderFactory()
-                .createPolicyModelsProvider(CommonRestController.getParameters())) {
+                .createPolicyModelsProvider(clRuntimeParameterGroup.getDatabaseProviderParameters())) {
             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
index ccc54b9..b93bd0f 100644
--- 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
@@ -26,9 +26,8 @@
 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.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
 import org.mockito.Mockito;
 import org.onap.policy.clamp.controlloop.common.exception.ControlLoopRuntimeException;
 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoop;
@@ -36,19 +35,20 @@
 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.commissioning.CommissioningProvider;
+import org.onap.policy.clamp.controlloop.runtime.main.parameters.ClRuntimeParameterGroup;
+import org.onap.policy.clamp.controlloop.runtime.monitoring.MonitoringProvider;
 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 {
+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 =
@@ -66,10 +66,10 @@
     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";
+                    + "  \"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"
@@ -79,62 +79,61 @@
             + "    item \"ControlLoop\" value \"org.onap.domain.PMSHControlLoopDefinition\" INVALID,"
             + " Commissioned control loop definition not FOUND\n";
 
-    private static PolicyModelsProviderParameters databaseProviderParameters;
+    private static ClRuntimeParameterGroup controlLoopParameters;
     private static SupervisionHandler supervisionHandler;
-    private static CommissioningHandler commissioningHandler;
+    private static CommissioningProvider commissioningProvider;
 
     /**
      * setup Db Provider Parameters.
      *
      * @throws PfModelException if an error occurs
      */
-    @BeforeClass
+    @BeforeAll
     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"));
+        controlLoopParameters = CommonTestData.geParameterGroup(0, "instantproviderdb");
+        commissioningProvider = new CommissioningProvider(controlLoopParameters);
+        var monitoringProvider = new MonitoringProvider(controlLoopParameters);
+        supervisionHandler = new SupervisionHandler(controlLoopParameters, monitoringProvider, commissioningProvider);
         supervisionHandler.startProviders();
         supervisionHandler.startAndRegisterPublishers(Collections.singletonList(Mockito.mock(TopicSink.class)));
     }
 
     @Test
-    public void testInstantiationCrud() throws Exception {
+    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)) {
+        try (ControlLoopInstantiationProvider instantiationProvider = new ControlLoopInstantiationProvider(
+                controlLoopParameters, commissioningProvider, supervisionHandler)) {
 
             // to validate control Loop, it needs to define ToscaServiceTemplate
-            InstantiationUtils.storeToscaServiceTemplate(TOSCA_TEMPLATE_YAML, databaseProviderParameters);
+            InstantiationUtils.storeToscaServiceTemplate(TOSCA_TEMPLATE_YAML, commissioningProvider);
 
             InstantiationResponse instantiationResponse = instantiationProvider.createControlLoops(controlLoopsCreate);
             InstantiationUtils.assertInstantiationResponse(instantiationResponse, controlLoopsCreate);
 
             controlLoopsDb = getControlLoopsFromDb(controlLoopsCreate);
             assertThat(controlLoopsDb.getControlLoopList()).isNotEmpty();
-            Assert.assertEquals(controlLoopsCreate, controlLoopsDb);
+            assertThat(controlLoopsCreate).isEqualTo(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));
+                assertThat(controlLoop).isEqualTo(controlLoopsGet.getControlLoopList().get(0));
             }
 
             ControlLoops controlLoopsUpdate =
                     InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_UPDATE_JSON, "Crud");
-            Assert.assertNotEquals(controlLoopsUpdate, controlLoopsDb);
+            assertThat(controlLoopsUpdate).isNotEqualTo(controlLoopsDb);
 
             instantiationResponse = instantiationProvider.updateControlLoops(controlLoopsUpdate);
             InstantiationUtils.assertInstantiationResponse(instantiationResponse, controlLoopsUpdate);
 
             controlLoopsDb = getControlLoopsFromDb(controlLoopsCreate);
             assertThat(controlLoopsDb.getControlLoopList()).isNotEmpty();
-            Assert.assertEquals(controlLoopsUpdate, controlLoopsDb);
+            assertThat(controlLoopsUpdate).isEqualTo(controlLoopsDb);
 
             InstantiationCommand instantiationCommand =
                     InstantiationUtils.getInstantiationCommandFromResource(CL_INSTANTIATION_CHANGE_STATE_JSON, "Crud");
@@ -145,8 +144,8 @@
                 ControlLoops controlLoopsGet = instantiationProvider.getControlLoops(toscaConceptIdentifier.getName(),
                         toscaConceptIdentifier.getVersion());
                 assertThat(controlLoopsGet.getControlLoopList()).hasSize(1);
-                Assert.assertEquals(instantiationCommand.getOrderedState(),
-                        controlLoopsGet.getControlLoopList().get(0).getOrderedState());
+                assertThat(instantiationCommand.getOrderedState())
+                        .isEqualTo(controlLoopsGet.getControlLoopList().get(0).getOrderedState());
             }
 
             // in order to delete a controlLoop the state must be UNINITIALISED
@@ -166,8 +165,8 @@
         ControlLoops controlLoopsDb = new ControlLoops();
         controlLoopsDb.setControlLoopList(new ArrayList<>());
 
-        try (ControlLoopInstantiationProvider instantiationProvider =
-                     new ControlLoopInstantiationProvider(databaseProviderParameters)) {
+        try (ControlLoopInstantiationProvider instantiationProvider = new ControlLoopInstantiationProvider(
+                controlLoopParameters, commissioningProvider, supervisionHandler)) {
 
             for (ControlLoop controlLoop : controlLoopsSource.getControlLoopList()) {
                 ControlLoops controlLoopsFromDb =
@@ -179,22 +178,22 @@
     }
 
     @Test
-    public void testInstantiationDelete() throws Exception {
+    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)) {
+        try (ControlLoopInstantiationProvider instantiationProvider = new ControlLoopInstantiationProvider(
+                controlLoopParameters, commissioningProvider, supervisionHandler)) {
 
             // to validate control Loop, it needs to define ToscaServiceTemplate
-            InstantiationUtils.storeToscaServiceTemplate(TOSCA_TEMPLATE_YAML, databaseProviderParameters);
+            InstantiationUtils.storeToscaServiceTemplate(TOSCA_TEMPLATE_YAML, commissioningProvider);
 
             assertThatThrownBy(
                     () -> instantiationProvider.deleteControlLoop(controlLoop0.getName(), controlLoop0.getVersion()))
-                    .hasMessageMatching(CONTROL_LOOP_NOT_FOUND);
+                            .hasMessageMatching(CONTROL_LOOP_NOT_FOUND);
 
             InstantiationUtils.assertInstantiationResponse(instantiationProvider.createControlLoops(controlLoops),
                     controlLoops);
@@ -225,29 +224,29 @@
 
         controlLoop.setState(state);
 
-        try (ControlLoopInstantiationProvider instantiationProvider =
-                     new ControlLoopInstantiationProvider(databaseProviderParameters)) {
+        try (ControlLoopInstantiationProvider instantiationProvider = new ControlLoopInstantiationProvider(
+                controlLoopParameters, commissioningProvider, supervisionHandler)) {
 
             instantiationProvider.updateControlLoops(controlLoops);
             assertThatThrownBy(
                     () -> instantiationProvider.deleteControlLoop(controlLoop.getName(), controlLoop.getVersion()))
-                    .hasMessageMatching(String.format(DELETE_BAD_REQUEST, state));
+                            .hasMessageMatching(String.format(DELETE_BAD_REQUEST, state));
         }
     }
 
     @Test
-    public void testCreateControlLoops_NoDuplicates() throws Exception {
+    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)) {
+        try (ControlLoopInstantiationProvider instantiationProvider = new ControlLoopInstantiationProvider(
+                controlLoopParameters, commissioningProvider, supervisionHandler)) {
 
             // to validate control Loop, it needs to define ToscaServiceTemplate
-            InstantiationUtils.storeToscaServiceTemplate(TOSCA_TEMPLATE_YAML, databaseProviderParameters);
+            InstantiationUtils.storeToscaServiceTemplate(TOSCA_TEMPLATE_YAML, commissioningProvider);
 
             InstantiationResponse instantiationResponse = instantiationProvider.createControlLoops(controlLoopsCreate);
             InstantiationUtils.assertInstantiationResponse(instantiationResponse, controlLoopsCreate);
@@ -262,15 +261,15 @@
     }
 
     @Test
-    public void testCreateControlLoops_CommissionedClElementNotFound() throws Exception {
+    void testCreateControlLoops_CommissionedClElementNotFound() throws Exception {
         ControlLoops controlLoops = InstantiationUtils
                 .getControlLoopsFromResource(CL_INSTANTIATION_DEFINITION_NAME_NOT_FOUND_JSON, "ClElementNotFound");
 
-        try (ControlLoopInstantiationProvider provider =
-                     new ControlLoopInstantiationProvider(databaseProviderParameters)) {
+        try (ControlLoopInstantiationProvider provider = new ControlLoopInstantiationProvider(controlLoopParameters,
+                commissioningProvider, supervisionHandler)) {
 
             // to validate control Loop, it needs to define ToscaServiceTemplate
-            InstantiationUtils.storeToscaServiceTemplate(TOSCA_TEMPLATE_YAML, databaseProviderParameters);
+            InstantiationUtils.storeToscaServiceTemplate(TOSCA_TEMPLATE_YAML, commissioningProvider);
 
             assertThat(getControlLoopsFromDb(controlLoops).getControlLoopList()).isEmpty();
 
@@ -280,41 +279,41 @@
     }
 
     @Test
-    public void testCreateControlLoops_CommissionedClNotFound() throws Exception {
+    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)) {
+        try (ControlLoopInstantiationProvider provider = new ControlLoopInstantiationProvider(controlLoopParameters,
+                commissioningProvider, supervisionHandler)) {
             assertThatThrownBy(() -> provider.createControlLoops(controlLoops))
                     .hasMessageMatching(CONTROLLOOP_DEFINITION_NOT_FOUND);
         }
     }
 
     @Test
-    public void testIssueControlLoopCommand_OrderedStateInvalid() throws ControlLoopRuntimeException, IOException {
-        try (ControlLoopInstantiationProvider instantiationProvider =
-                     new ControlLoopInstantiationProvider(databaseProviderParameters)) {
+    void testIssueControlLoopCommand_OrderedStateInvalid() throws ControlLoopRuntimeException, IOException {
+        try (ControlLoopInstantiationProvider instantiationProvider = new ControlLoopInstantiationProvider(
+                controlLoopParameters, commissioningProvider, supervisionHandler)) {
             assertThatThrownBy(() -> instantiationProvider.issueControlLoopCommand(new InstantiationCommand()))
                     .hasMessageMatching(ORDERED_STATE_INVALID);
         }
     }
 
     @Test
-    public void testInstantiationVersions() throws Exception {
+    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)) {
+        try (ControlLoopInstantiationProvider instantiationProvider = new ControlLoopInstantiationProvider(
+                controlLoopParameters, commissioningProvider, supervisionHandler)) {
 
             // to validate control Loop, it needs to define ToscaServiceTemplate
-            InstantiationUtils.storeToscaServiceTemplate(TOSCA_TEMPLATE_YAML, databaseProviderParameters);
+            InstantiationUtils.storeToscaServiceTemplate(TOSCA_TEMPLATE_YAML, commissioningProvider);
 
             InstantiationUtils.assertInstantiationResponse(instantiationProvider.createControlLoops(controlLoopsV1),
                     controlLoopsV1);
@@ -331,7 +330,7 @@
                 ControlLoops controlLoopsGet =
                         instantiationProvider.getControlLoops(controlLoop.getName(), controlLoop.getVersion());
                 assertThat(controlLoopsGet.getControlLoopList()).hasSize(1);
-                Assert.assertEquals(controlLoop, controlLoopsGet.getControlLoopList().get(0));
+                assertThat(controlLoop).isEqualTo(controlLoopsGet.getControlLoopList().get(0));
             }
 
             // DELETE controlLoops V1
@@ -351,7 +350,7 @@
                 ControlLoops controlLoopsGet =
                         instantiationProvider.getControlLoops(controlLoop.getName(), controlLoop.getVersion());
                 assertThat(controlLoopsGet.getControlLoopList()).hasSize(1);
-                Assert.assertEquals(controlLoop, controlLoopsGet.getControlLoopList().get(0));
+                assertThat(controlLoop).isEqualTo(controlLoopsGet.getControlLoopList().get(0));
             }
 
             // DELETE controlLoops V2
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
index 958d91d..9a9fc16 100644
--- 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
@@ -20,25 +20,22 @@
 
 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 static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.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.clamp.controlloop.runtime.commissioning.CommissioningProvider;
 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;
 
@@ -91,9 +88,9 @@
      * @param controlLoops ControlLoops
      */
     public static void assertInstantiationResponse(InstantiationResponse response, ControlLoops controlLoops) {
-        assertNotNull(response);
-        Assert.assertNull(response.getErrorDetails());
-        assertEquals(response.getAffectedControlLoops().size(), controlLoops.getControlLoopList().size());
+        assertThat(response).isNotNull();
+        assertThat(response.getErrorDetails()).isNull();
+        assertThat(response.getAffectedControlLoops().size()).isEqualTo(controlLoops.getControlLoopList().size());
         for (ControlLoop controlLoop : controlLoops.getControlLoopList()) {
             assertTrue(response.getAffectedControlLoops().stream()
                     .filter(ac -> ac.equals(controlLoop.getKey().asIdentifier())).findAny().isPresent());
@@ -107,7 +104,7 @@
      * @param command InstantiationCommand
      */
     public static void assertInstantiationResponse(InstantiationResponse response, InstantiationCommand command) {
-        assertNotNull(response);
+        assertThat(response).isNotNull();
         assertEquals(response.getAffectedControlLoops().size(), command.getControlLoopIdentifierList().size());
         for (ToscaConceptIdentifier toscaConceptIdentifier : command.getControlLoopIdentifierList()) {
             assertTrue(response.getAffectedControlLoops().stream()
@@ -122,8 +119,8 @@
      * @param controlLoop ControlLoop
      */
     public static void assertInstantiationResponse(InstantiationResponse response, ControlLoop controlLoop) {
-        assertNotNull(response);
-        Assert.assertNull(response.getErrorDetails());
+        assertThat(response).isNotNull();
+        assertThat(response.getErrorDetails()).isNull();
         assertEquals(1, response.getAffectedControlLoops().size());
         assertEquals(0, response.getAffectedControlLoops().get(0).compareTo(controlLoop.getKey().asIdentifier()));
     }
@@ -132,18 +129,15 @@
      * Store ToscaServiceTemplate from resource to DB.
      *
      * @param path path of the resource
-     * @param parameters The parameters for the implementation of the PolicyModelProvider
+     * @param commissioningProvider The CommissioningProvider
      * @throws PfModelException if an error occurs
      */
-    public static void storeToscaServiceTemplate(String path, PolicyModelsProviderParameters parameters)
+    public static void storeToscaServiceTemplate(String path, CommissioningProvider commissioningProvider)
             throws PfModelException {
 
         ToscaServiceTemplate template =
                 yamlTranslator.fromYaml(ResourceUtils.getResourceAsString(path), ToscaServiceTemplate.class);
 
-        try (PolicyModelsProvider modelsProvider =
-                new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters)) {
-            modelsProvider.createServiceTemplate(template);
-        }
+        commissioningProvider.createControlLoopDefinitions(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
index 71e7624..6c9674d 100644
--- 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
@@ -21,30 +21,41 @@
 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 static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.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.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 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.commissioning.CommissioningProvider;
 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.main.rest.InstantiationController;
 import org.onap.policy.clamp.controlloop.runtime.util.rest.CommonRestController;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
+import org.springframework.boot.web.server.LocalServerPort;
+import org.springframework.test.context.TestPropertySource;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
 
 /**
  * Class to perform unit test of {@link InstantiationController}}.
  *
  */
-public class InstantiationControllerTest extends CommonRestController {
+@ExtendWith(SpringExtension.class)
+@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
+@TestPropertySource(locations = {"classpath:application_test.properties"})
+class InstantiationControllerTest extends CommonRestController {
 
     private static final String CL_INSTANTIATION_CREATE_JSON = "src/test/resources/rest/controlloops/ControlLoops.json";
 
@@ -61,38 +72,38 @@
 
     private static final String INSTANTIATION_COMMAND_ENDPOINT = "instantiation/command";
 
+    @Autowired
+    private ControlLoopInstantiationProvider instantiationProvider;
+
+    @Autowired
+    private CommissioningProvider commissioningProvider;
+
+    @LocalServerPort
+    private int randomServerPort;
+
     /**
      * starts Main and inserts a commissioning template.
      *
      * @throws Exception if an error occurs
      */
-    @BeforeClass
-    public static void setUpBeforeClass() throws Exception {
-        CommonRestController.setUpBeforeClass("InstApi");
-
+    @BeforeEach
+    public void setUpBeforeClass() throws Exception {
         // 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);
-        }
+        InstantiationUtils.storeToscaServiceTemplate(TOSCA_TEMPLATE_YAML, commissioningProvider);
     }
 
-    @AfterClass
-    public static void teardownAfterClass() {
-        CommonRestController.teardownAfterClass();
+    @BeforeEach
+    public void setUpPort() {
+        super.setHttpPrefix(randomServerPort);
     }
 
     @Test
-    public void testSwagger() throws Exception {
+    void testSwagger() throws Exception {
         super.testSwagger(INSTANTIATION_ENDPOINT);
     }
 
     @Test
-    public void testCreate_Unauthorized() throws Exception {
+    void testCreate_Unauthorized() throws Exception {
         ControlLoops controlLoops =
                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Unauthorized");
 
@@ -100,12 +111,12 @@
     }
 
     @Test
-    public void testQuery_Unauthorized() throws Exception {
+    void testQuery_Unauthorized() throws Exception {
         assertUnauthorizedGet(INSTANTIATION_ENDPOINT);
     }
 
     @Test
-    public void testUpdate_Unauthorized() throws Exception {
+    void testUpdate_Unauthorized() throws Exception {
         ControlLoops controlLoops =
                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_UPDATE_JSON, "Unauthorized");
 
@@ -113,12 +124,12 @@
     }
 
     @Test
-    public void testDelete_Unauthorized() throws Exception {
+    void testDelete_Unauthorized() throws Exception {
         assertUnauthorizedDelete(INSTANTIATION_ENDPOINT);
     }
 
     @Test
-    public void testCommand_Unauthorized() throws Exception {
+    void testCommand_Unauthorized() throws Exception {
         InstantiationCommand instantiationCommand = InstantiationUtils
                 .getInstantiationCommandFromResource(CL_INSTANTIATION_CHANGE_STATE_JSON, "Unauthorized");
 
@@ -126,7 +137,7 @@
     }
 
     @Test
-    public void testCreate() throws Exception {
+    void testCreate() throws Exception {
         ControlLoops controlLoopsFromRsc =
                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Create");
 
@@ -136,21 +147,18 @@
         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());
+        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));
-            }
+            assertNotNull(controlLoopsFromDb);
+            assertThat(controlLoopsFromDb.getControlLoopList()).hasSize(1);
+            assertEquals(controlLoopFromRsc, controlLoopsFromDb.getControlLoopList().get(0));
         }
     }
 
     @Test
-    public void testCreateBadRequest() throws Exception {
+    void testCreateBadRequest() throws Exception {
         ControlLoops controlLoopsFromRsc =
                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "CreateBadRequest");
 
@@ -167,7 +175,7 @@
     }
 
     @Test
-    public void testQuery_NoResultWithThisName() throws Exception {
+    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());
@@ -176,14 +184,10 @@
     }
 
     @Test
-    public void testQuery() throws Exception {
+    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);
-        }
+        var controlLoops = InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Query");
+        instantiationProvider.createControlLoops(controlLoops);
 
         for (ControlLoop controlLoopFromRsc : controlLoops.getControlLoopList()) {
             Invocation.Builder invocationBuilder =
@@ -198,37 +202,32 @@
     }
 
     @Test
-    public void testUpdate() throws Exception {
+    void testUpdate() throws Exception {
         ControlLoops controlLoopsCreate =
                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Update");
 
-        ControlLoops controlLoops =
-                InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_UPDATE_JSON, "Update");
+        var controlLoops = InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_UPDATE_JSON, "Update");
+        instantiationProvider.createControlLoops(controlLoopsCreate);
 
-        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());
 
-            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);
 
-            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());
 
-            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));
-            }
+            assertNotNull(controlLoopsFromDb);
+            assertThat(controlLoopsFromDb.getControlLoopList()).hasSize(1);
+            assertEquals(controlLoopUpdate, controlLoopsFromDb.getControlLoopList().get(0));
         }
     }
 
     @Test
-    public void testDelete_NoResultWithThisName() throws Exception {
+    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());
@@ -238,56 +237,51 @@
     }
 
     @Test
-    public void testDelete() throws Exception {
+    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);
+        instantiationProvider.createControlLoops(controlLoopsFromRsc);
 
-                ControlLoops controlLoopsFromDb = instantiationProvider.getControlLoops(
-                        controlLoopFromRsc.getKey().getName(), controlLoopFromRsc.getKey().getVersion());
-                assertThat(controlLoopsFromDb.getControlLoopList()).isEmpty();
-            }
+        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 {
+    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());
-            }
+        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 {
+    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 {
+    void testCommand_NotFound2() throws Exception {
         InstantiationCommand command =
                 InstantiationUtils.getInstantiationCommandFromResource(CL_INSTANTIATION_CHANGE_STATE_JSON, "Command");
         command.setOrderedState(null);
@@ -298,7 +292,10 @@
     }
 
     @Test
-    public void testCommand() throws Exception {
+    void testCommand() throws Exception {
+        var controlLoops = InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Command");
+        instantiationProvider.createControlLoops(controlLoops);
+
         InstantiationCommand command =
                 InstantiationUtils.getInstantiationCommandFromResource(CL_INSTANTIATION_CHANGE_STATE_JSON, "Command");
 
@@ -309,14 +306,11 @@
         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());
-            }
+        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
deleted file mode 100644
index 4f68b4f..0000000
--- a/runtime-controlloop/src/test/java/org/onap/policy/clamp/controlloop/runtime/main/rest/RestControllerTest.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*-
- * ============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
index da71c23..7eb5672 100644
--- 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
@@ -20,63 +20,46 @@
 
 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 static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
-import org.junit.Test;
-import org.onap.policy.clamp.controlloop.common.exception.ControlLoopRuntimeException;
+import org.junit.jupiter.api.Test;
+import org.mockito.Mockito;
 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;
+import org.onap.policy.clamp.controlloop.runtime.supervision.SupervisionHandler;
 
 /**
  * Class to perform unit test of {@link ClRuntimeActivator}}.
  *
  */
-public class ClRuntimeActivatorTest {
+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();
+    void testStartAndStop() throws Exception {
+        final String path = "src/test/resources/parameters/TestParameters.json";
+        ClRuntimeParameterGroup parameterGroup = new ClRuntimeParameterHandler().getParameters(path);
+        var supervisionHandler = Mockito.mock(SupervisionHandler.class);
 
-        assertFalse(activator.isAlive());
-        activator.start();
-        assertTrue(activator.isAlive());
-        assertTrue(activator.getParameterGroup().isValid());
-        assertEquals(activator.getParameterGroup().getName(),
-                activator.getParameterGroup().getRestServerParameters().getName());
+        try (var activator = new ClRuntimeActivator(parameterGroup, supervisionHandler)) {
 
-        // repeat start - should throw an exception
-        assertThatIllegalStateException().isThrownBy(() -> activator.start());
-        assertTrue(activator.isAlive());
-        assertTrue(activator.getParameterGroup().isValid());
+            assertFalse(activator.isAlive());
+            activator.start();
+            assertTrue(activator.isAlive());
+            assertTrue(activator.getParameterGroup().isValid());
 
-        activator.stop();
-        assertFalse(activator.isAlive());
+            // repeat start - should throw an exception
+            assertThatIllegalStateException().isThrownBy(() -> activator.start());
+            assertTrue(activator.isAlive());
+            assertTrue(activator.getParameterGroup().isValid());
 
-        // repeat stop - should throw an exception
-        assertThatIllegalStateException().isThrownBy(() -> activator.stop());
-        assertFalse(activator.isAlive());
-    }
+            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));
+            // repeat stop - should throw an exception
+            assertThatIllegalStateException().isThrownBy(() -> activator.stop());
+            assertFalse(activator.isAlive());
+        }
     }
 }
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
deleted file mode 100644
index b06383c..0000000
--- a/runtime-controlloop/src/test/java/org/onap/policy/clamp/controlloop/runtime/main/startstop/MainTest.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*-
- * ============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
index 56735ae..580b30f 100644
--- 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
@@ -22,7 +22,7 @@
 
 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.jupiter.api.Assertions.assertEquals;
 import static org.mockito.Mockito.when;
 
 import java.io.File;
@@ -32,31 +32,31 @@
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
-import org.junit.BeforeClass;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.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.main.parameters.ClRuntimeParameterGroup;
 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 {
+class TestMonitoringProvider {
 
     private static final String CL_PARTICIPANT_STATISTICS_JSON =
-        "src/test/resources/rest/monitoring/TestParticipantStatistics.json";
+            "src/test/resources/rest/monitoring/TestParticipantStatistics.json";
     private static final String INVALID_PARTICIPANT_JSON_INPUT =
-        "src/test/resources/rest/monitoring/TestParticipantStatistics_Invalid.json";
+            "src/test/resources/rest/monitoring/TestParticipantStatistics_Invalid.json";
     private static final String CL_ELEMENT_STATISTICS_JSON =
-        "src/test/resources/rest/monitoring/TestClElementStatistics.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";
+            "src/test/resources/rest/monitoring/TestClElementStatistics_Invalid.json";
     private static final Coder CODER = new StandardCoder();
 
     private static final String CL_PROVIDER_FIELD = "controlLoopProvider";
@@ -67,21 +67,20 @@
     private static ClElementStatisticsList inputClElementStatistics;
     private static ClElementStatisticsList invalidClElementInput;
 
-    @BeforeClass
+    @BeforeAll
     public static void beforeSetupStatistics() throws CoderException {
         // Reading input json for statistics data
         inputParticipantStatistics =
-            CODER.decode(new File(CL_PARTICIPANT_STATISTICS_JSON), ParticipantStatisticsList.class);
+                CODER.decode(new File(CL_PARTICIPANT_STATISTICS_JSON), ParticipantStatisticsList.class);
         invalidParticipantInput =
-            CODER.decode(new File(INVALID_PARTICIPANT_JSON_INPUT), ParticipantStatisticsList.class);
+                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();
+    void testCreateParticipantStatistics() throws Exception {
+        ClRuntimeParameterGroup parameters = CommonTestData.geParameterGroup(0, "createparStat");
 
         try (MonitoringProvider provider = new MonitoringProvider(parameters)) {
             // Creating statistics data in db with null input
@@ -95,18 +94,17 @@
 
             // Creating statistics data from input json
             ParticipantStatisticsList createResponse =
-                provider.createParticipantStatistics(inputParticipantStatistics.getStatisticsList());
+                    provider.createParticipantStatistics(inputParticipantStatistics.getStatisticsList());
 
             assertThat(createResponse.getStatisticsList()).hasSize(3);
             assertEquals(createResponse.getStatisticsList().toString().replaceAll("\\s+", ""),
-                inputParticipantStatistics.getStatisticsList().toString().replaceAll("\\s+", ""));
+                    inputParticipantStatistics.getStatisticsList().toString().replaceAll("\\s+", ""));
         }
     }
 
     @Test
-    public void testGetParticipantStatistics() throws Exception {
-        PolicyModelsProviderParameters parameters =
-            CommonTestData.geParameterGroup(0, "getparStat").getDatabaseProviderParameters();
+    void testGetParticipantStatistics() throws Exception {
+        ClRuntimeParameterGroup parameters = CommonTestData.geParameterGroup(0, "getparStat");
         try (MonitoringProvider provider = new MonitoringProvider(parameters)) {
             ParticipantStatisticsList getResponse;
 
@@ -120,24 +118,24 @@
             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+", ""));
+                    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"));
+                    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"));
+                    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();
+    void testCreateClElementStatistics() throws Exception {
+        ClRuntimeParameterGroup parameters = CommonTestData.geParameterGroup(0, "createelemstat");
+
         try (MonitoringProvider provider = new MonitoringProvider(parameters)) {
             // Creating statistics data in db with null input
             assertThatThrownBy(() -> {
@@ -150,18 +148,18 @@
 
             // Creating clElement statistics data from input json
             ClElementStatisticsList createResponse =
-                provider.createClElementStatistics(inputClElementStatistics.getClElementStatistics());
+                    provider.createClElementStatistics(inputClElementStatistics.getClElementStatistics());
 
             assertThat(createResponse.getClElementStatistics()).hasSize(4);
             assertEquals(createResponse.getClElementStatistics().toString().replaceAll("\\s+", ""),
-                inputClElementStatistics.getClElementStatistics().toString().replaceAll("\\s+", ""));
+                    inputClElementStatistics.getClElementStatistics().toString().replaceAll("\\s+", ""));
         }
     }
 
     @Test
-    public void testGetClElementStatistics() throws Exception {
-        PolicyModelsProviderParameters parameters =
-            CommonTestData.geParameterGroup(0, "getelemstat").getDatabaseProviderParameters();
+    void testGetClElementStatistics() throws Exception {
+        ClRuntimeParameterGroup parameters = CommonTestData.geParameterGroup(0, "getelemstat");
+
         try (MonitoringProvider provider = new MonitoringProvider(parameters)) {
             ClElementStatisticsList getResponse;
 
@@ -175,24 +173,24 @@
 
             assertThat(getResponse.getClElementStatistics()).hasSize(2);
             assertEquals(getResponse.getClElementStatistics().get(0).toString().replaceAll("\\s+", ""),
-                inputClElementStatistics.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);
+                    "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);
+                    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();
+    void testGetParticipantStatsPerCL() throws Exception {
+        ClRuntimeParameterGroup parameters = CommonTestData.geParameterGroup(0, "getparStatCL");
+
         try (MonitoringProvider provider = Mockito.spy(new MonitoringProvider(parameters))) {
 
             provider.createParticipantStatistics(inputParticipantStatistics.getStatisticsList());
@@ -204,23 +202,23 @@
             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+", ""));
+                    inputParticipantStatistics.getStatisticsList().get(0).toString().replaceAll("\\s+", ""));
             assertThat(provider.fetchParticipantStatsPerControlLoop("invalidCLName", "1.002").getStatisticsList())
-                .isEmpty();
+                    .isEmpty();
         }
 
     }
 
     @Test
-    public void testClElementStatsPerCL() throws Exception {
-        PolicyModelsProviderParameters parameters =
-            CommonTestData.geParameterGroup(0, "getelemstatPerCL").getDatabaseProviderParameters();
+    void testClElementStatsPerCL() throws Exception {
+        ClRuntimeParameterGroup parameters = CommonTestData.geParameterGroup(0, "getelemstatPerCL");
+
         // 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()));
+                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);
@@ -240,16 +238,15 @@
 
             assertThat(getResponse.getClElementStatistics()).hasSize(2);
             assertEquals(getResponse.getClElementStatistics().get(1).toString().replaceAll("\\s+", ""),
-                inputClElementStatistics.getClElementStatistics().get(1).toString().replaceAll("\\s+", ""));
+                    inputClElementStatistics.getClElementStatistics().get(1).toString().replaceAll("\\s+", ""));
 
-            assertThat(
-                monitoringProvider.fetchClElementStatsPerControlLoop("invalidCLName", "1.002").getClElementStatistics())
-                    .isEmpty();
+            assertThat(monitoringProvider.fetchClElementStatsPerControlLoop("invalidCLName", "1.002")
+                    .getClElementStatistics()).isEmpty();
 
             Map<String, ToscaConceptIdentifier> clElementIds =
-                monitoringProvider.getAllClElementsIdPerControlLoop("testCLName", "1.001");
+                    monitoringProvider.getAllClElementsIdPerControlLoop("testCLName", "1.001");
             assertThat(clElementIds)
-                .containsKey(inputClElementStatistics.getClElementStatistics().get(0).getId().toString());
+                    .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
index a846d93..95b2113 100644
--- 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
@@ -21,29 +21,40 @@
 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 static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.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.Test;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 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.parameters.ClRuntimeParameterGroup;
 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;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
+import org.springframework.boot.web.server.LocalServerPort;
+import org.springframework.test.context.TestPropertySource;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
 
-public class MonitoringQueryControllerTest extends CommonRestController {
+@ExtendWith(SpringExtension.class)
+@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
+@TestPropertySource(locations = {"classpath:application_test.properties"})
+class MonitoringQueryControllerTest extends CommonRestController {
 
     private static final String CL_PARTICIPANT_STATISTICS_JSON =
-        "src/test/resources/rest/monitoring/TestParticipantStatistics.json";
+            "src/test/resources/rest/monitoring/TestParticipantStatistics.json";
     private static final String CL_ELEMENT_STATISTICS_JSON =
-        "src/test/resources/rest/monitoring/TestClElementStatistics.json";
+            "src/test/resources/rest/monitoring/TestClElementStatistics.json";
 
     private static final Coder CODER = new StandardCoder();
 
@@ -51,64 +62,68 @@
     private static ClElementStatisticsList inputClElementStatistics;
 
     private static ParticipantStatisticsList participantStatisticsList;
-    private static  ClElementStatisticsList clElementStatisticsList;
+    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";
 
+    @Autowired
+    private ClRuntimeParameterGroup clRuntimeParameterGroup;
+
+    @LocalServerPort
+    private int randomServerPort;
 
     /**
      * 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);
+    @BeforeAll
+    public static void setUpBeforeAll() throws Exception {
 
-        try (MonitoringProvider monitoringProvider = new MonitoringProvider(getParameters())) {
+        inputParticipantStatistics =
+                CODER.decode(new File(CL_PARTICIPANT_STATISTICS_JSON), ParticipantStatisticsList.class);
+        inputClElementStatistics = CODER.decode(new File(CL_ELEMENT_STATISTICS_JSON), ClElementStatisticsList.class);
+    }
+
+    @BeforeEach
+    public void setUpBeforeEach() throws Exception {
+        super.setHttpPrefix(randomServerPort);
+
+        try (var monitoringProvider = new MonitoringProvider(clRuntimeParameterGroup)) {
             // Insert Participant statistics to DB
-            participantStatisticsList = monitoringProvider.createParticipantStatistics(inputParticipantStatistics
-                .getStatisticsList());
+            participantStatisticsList =
+                    monitoringProvider.createParticipantStatistics(inputParticipantStatistics.getStatisticsList());
             // Insert CL Element statistics to DB
-            clElementStatisticsList = monitoringProvider.createClElementStatistics(inputClElementStatistics
-                .getClElementStatistics());
+            clElementStatisticsList =
+                    monitoringProvider.createClElementStatistics(inputClElementStatistics.getClElementStatistics());
         }
     }
 
-    @AfterClass
-    public static void teardownAfterClass() {
-        CommonRestController.teardownAfterClass();
-    }
-
     @Test
-    public void testQuery_Unauthorized_for_ClElementStats() throws Exception {
+    void testQuery_Unauthorized_for_ClElementStats() throws Exception {
         assertUnauthorizedGet(CLELEMENT_STATS_ENDPOINT);
     }
 
     @Test
-    public void testQuery_Unauthorized_for_ClParticipantStats() throws Exception {
+    void testQuery_Unauthorized_for_ClParticipantStats() throws Exception {
         assertUnauthorizedGet(PARTICIPANT_STATS_ENDPOINT);
     }
 
     @Test
-    public void testQuery_Unauthorized_for_ParticipantStatsPerCl() throws Exception {
+    void testQuery_Unauthorized_for_ParticipantStatsPerCl() throws Exception {
         assertUnauthorizedGet(PARTICIPANT_STATS_PER_CL_ENDPOINT);
     }
 
     @Test
-    public void testQuery_Unauthorized_for_ClElementStatsPerCl() throws Exception {
+    void testQuery_Unauthorized_for_ClElementStatsPerCl() throws Exception {
         assertUnauthorizedGet(CLELEMENT_STATS_PER_CL_ENDPOINT);
     }
 
     @Test
-    public void testSwagger_ClStats() throws Exception {
+    void testSwagger_ClStats() throws Exception {
         super.testSwagger(CLELEMENT_STATS_ENDPOINT);
         super.testSwagger(PARTICIPANT_STATS_ENDPOINT);
         super.testSwagger(CLELEMENT_STATS_PER_CL_ENDPOINT);
@@ -116,13 +131,12 @@
     }
 
     @Test
-    public void testClElementStatisticsEndpoint() throws Exception {
+    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());
+        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());
 
@@ -130,55 +144,49 @@
 
         assertNotNull(result1);
         assertThat(result1.getClElementStatistics()).hasSize(2);
-        assertEquals(result1.getClElementStatistics().get(0), clElementStatisticsList
-            .getClElementStatistics().get(0));
+        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"));
+        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));
+        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");
+    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 {
+    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());
+        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));
+        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="
+        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());
@@ -186,22 +194,20 @@
 
         assertNotNull(result2);
         assertThat(result2.getStatisticsList()).hasSize(1);
-        assertEquals(result1.getStatisticsList().get(0), participantStatisticsList
-            .getStatisticsList().get(0));
+        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");
+    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 {
+    void testParticipantStatsPerClEndpoint() throws Exception {
         Invocation.Builder invokeRequest1 =
-            super.sendRequest(PARTICIPANT_STATS_PER_CL_ENDPOINT + "?name=dummyName&version=1.001");
+                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);
@@ -209,17 +215,16 @@
     }
 
     @Test
-    public void testParticipantStatsPerCl_BadRequest() throws Exception {
-        Invocation.Builder invokeRequest1 =
-            super.sendRequest(PARTICIPANT_STATS_PER_CL_ENDPOINT);
+    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 {
+    void testClElementStatisticsPerClEndpoint() throws Exception {
         Invocation.Builder invokeRequest1 =
-            super.sendRequest(CLELEMENT_STATS_PER_CL_ENDPOINT + "?name=dummyName&version=1.001");
+                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);
@@ -227,9 +232,8 @@
     }
 
     @Test
-    public void testClElementStatsPerCl_BadRequest() throws Exception {
-        Invocation.Builder invokeRequest1 =
-            super.sendRequest(CLELEMENT_STATS_PER_CL_ENDPOINT);
+    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/rest/CommonRestController.java b/runtime-controlloop/src/test/java/org/onap/policy/clamp/controlloop/runtime/util/rest/CommonRestController.java
index 00b9c67..eebaa52 100644
--- 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
@@ -20,14 +20,9 @@
 
 package org.onap.policy.clamp.controlloop.runtime.util.rest;
 
+import static org.assertj.core.api.Assertions.assertThat;
 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;
@@ -37,15 +32,8 @@
 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.
@@ -53,46 +41,10 @@
  */
 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.
@@ -101,71 +53,10 @@
      * @throws Exception if an error occurs
      */
     protected void testSwagger(final String endpoint) throws Exception {
-        final Invocation.Builder invocationBuilder = sendFqeRequest(httpPrefix + "swagger.yaml", true);
+        final Invocation.Builder invocationBuilder = sendRequest("api-docs");
         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 if the NetworkUtil method calls are interrupted
-     * @throws IllegalStateException if a controller cannot be started on the requested port
-     */
-    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 if an error occurs shutting down the controller
-     * @throws InterruptedException if the NetworkUtil method calls are interrupted
-     * @throws IllegalStateException if a controller cannot be started on the requested port
-     */
-    private static void stopMain() throws ControlLoopException, InterruptedException {
-        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");
-        }
+        assertThat(resp).contains(endpoint);
     }
 
     /**
@@ -211,7 +102,7 @@
 
         final WebTarget webTarget = client.target(fullyQualifiedEndpoint);
 
-        return webTarget.request(MediaType.APPLICATION_JSON);
+        return webTarget.request(MediaType.APPLICATION_JSON).accept(MediaType.APPLICATION_JSON);
     }
 
     /**
@@ -259,4 +150,13 @@
         Response rawresp = sendNoAuthRequest(endPoint).delete();
         assertEquals(Response.Status.UNAUTHORIZED.getStatusCode(), rawresp.getStatus());
     }
+
+    /**
+     * Set Up httpPrefix.
+     *
+     * @param port the port
+     */
+    protected void setHttpPrefix(int port) {
+        httpPrefix = "http://" + SELF + ":" + port + "/";
+    }
 }
diff --git a/runtime-controlloop/src/test/resources/application_test.properties b/runtime-controlloop/src/test/resources/application_test.properties
new file mode 100644
index 0000000..fc24ea2
--- /dev/null
+++ b/runtime-controlloop/src/test/resources/application_test.properties
@@ -0,0 +1,9 @@
+spring.security.user.name=healthcheck
+spring.security.user.password=zb!XztG34
+security.enable-csrf=false
+
+server.port=6969
+server.servlet.context-path=/onap/controlloop
+server.error.path=/error
+
+runtime.file=src/test/resources/parameters/TestParameters.json
diff --git a/runtime-controlloop/src/test/resources/parameters/InstantiationConfigParametersStd.json b/runtime-controlloop/src/test/resources/parameters/InstantiationConfigParametersStd.json
index 3d5a7df..06f4370 100644
--- a/runtime-controlloop/src/test/resources/parameters/InstantiationConfigParametersStd.json
+++ b/runtime-controlloop/src/test/resources/parameters/InstantiationConfigParametersStd.json
@@ -6,8 +6,7 @@
     "participantClStateChangeIntervalSec": 1000,
     "restServerParameters": {
         "host": "0.0.0.0",
-        "port": ${port
-        },
+        "port": ${port},
         "userName": "healthcheck",
         "password": "zb!XztG34",
         "https": false,
diff --git a/runtime/pom.xml b/runtime/pom.xml
index 6efdec7..4c8bf24 100644
--- a/runtime/pom.xml
+++ b/runtime/pom.xml
@@ -434,13 +434,6 @@
             <artifactId>docker-java</artifactId>
             <scope>test</scope>
         </dependency>
-        <!-- Swagger models for swagger generation -->
-        <dependency>
-            <groupId>io.swagger</groupId>
-            <artifactId>swagger-models</artifactId>
-            <version>${version.swagger}</version>
-            <scope>test</scope>
-        </dependency>
     </dependencies>
 
     <build>
diff --git a/runtime/src/main/resources/clds/camel/rest/clamp-api-v2.xml b/runtime/src/main/resources/clds/camel/rest/clamp-api-v2.xml
index b3c4edb..8a7523c 100644
--- a/runtime/src/main/resources/clds/camel/rest/clamp-api-v2.xml
+++ b/runtime/src/main/resources/clds/camel/rest/clamp-api-v2.xml
@@ -1575,6 +1575,83 @@
                 </doTry>
             </route>
         </get>
+        <get uri="/v2/toscaControlLoop/getJsonSchema" outType="java.lang.String" bindingMode="off" produces="application/json">
+            <route>
+                <removeHeaders pattern="*"
+                               excludePattern="section"/>
+                <doTry>
+                    <to uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=startLog(*, 'GET Json Schema ')"/>
+                    <to uri="bean:org.onap.policy.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','read')"/>
+                    <setHeader name="Content-Type">
+                        <constant>application/json</constant>
+                    </setHeader>
+                    <setProperty name="raiseHttpExceptionFlag">
+                        <simple resultType="java.lang.Boolean">true</simple>
+                    </setProperty>
+                    <to uri="direct:get-json-schema"/>
+                    <to uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=endLog()"/>
+                    <doCatch>
+                        <exception>java.lang.Exception</exception>
+                        <handled>
+                            <constant>true</constant>
+                        </handled>
+                        <to
+                                uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=errorLog()"/>
+                        <log loggingLevel="ERROR"
+                             message="GET JSON Schema request failed: ${exception.stacktrace}"/>
+                        <setHeader name="CamelHttpResponseCode">
+                            <constant>500</constant>
+                        </setHeader>
+                        <setBody>
+                            <simple>GET JSON Schema FAILED</simple>
+                        </setBody>
+                    </doCatch>
+                </doTry>
+            </route>
+        </get>
+
+        <post uri="/v2/toscaControlLoop/postToscaInstantiation"
+              type="java.lang.String"
+              consumes="plain/text"
+              outType="java.lang.String"
+              produces="application/json"
+              bindingMode="off">
+            <route>
+                <removeHeaders pattern="*"/>
+                <setProperty name="raiseHttpExceptionFlag">
+                    <simple resultType="java.lang.Boolean">true</simple>
+                </setProperty>
+                <setHeader name="Content-Type">
+                    <constant>application/json</constant>
+                </setHeader>
+                <doTry>
+                    <to
+                            uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=startLog(*, 'Update the global properties')"/>
+                    <to
+                            uri="bean:org.onap.policy.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','update')"/>
+                    <to uri="direct:post-tosca-instantiation"/>
+                    <to
+                            uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=endLog()"/>
+                    <doCatch>
+                        <exception>java.lang.Exception</exception>
+                        <handled>
+                            <constant>true</constant>
+                        </handled>
+                        <to
+                                uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=errorLog()"/>
+                        <log loggingLevel="ERROR"
+                             message="Create Tosca Instantiation Service FAILED"/>
+
+                        <setHeader name="CamelHttpResponseCode">
+                            <constant>500</constant>
+                        </setHeader>
+                        <setBody>
+                            <simple>Create Tosca Instantiation Service FAILED</simple>
+                        </setBody>
+                    </doCatch>
+                </doTry>
+            </route>
+        </post>
 
         <get uri="/v2/clampInformation" outType="org.onap.policy.clamp.clds.model.ClampInformation"
              produces="application/json">
diff --git a/runtime/src/main/resources/clds/camel/routes/controlloop-flows.xml b/runtime/src/main/resources/clds/camel/routes/controlloop-flows.xml
index d2bf39b..a888d6b 100644
--- a/runtime/src/main/resources/clds/camel/routes/controlloop-flows.xml
+++ b/runtime/src/main/resources/clds/camel/routes/controlloop-flows.xml
@@ -79,4 +79,57 @@
             </doFinally>
         </doTry>
     </route>
+    <route id="post-tosca-instantiation">
+        <from uri="direct:post-tosca-instantiation"/>
+        <doTry>
+            <log loggingLevel="INFO"
+                 message="Create the tosca instantiation service"/>
+            <to
+                    uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=invokeLog('Controlloop', 'Create the tosca instantiation service')"/>
+            <setHeader name="CamelHttpMethod">
+                <constant>POST</constant>
+            </setHeader>
+            <setHeader name="Content-Type">
+                <constant>application/json</constant>
+            </setHeader>
+            <log loggingLevel="INFO"
+                 message="Endpoint to send Tosca Instantiation Service: {{clamp.config.controlloop.runtime.url}}/onap/controlloop/v2/instantiation"></log>
+            <toD
+                    uri="{{clamp.config.controlloop.runtime.url}}/onap/controlloop/v2/instantiation?bridgeEndpoint=true&amp;useSystemProperties=true&amp;throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&amp;authMethod=Basic&amp;authUsername={{clamp.config.controlloop.runtime.userName}}&amp;authPassword={{clamp.config.controlloop.runtime.password}}&amp;authenticationPreemptive=true&amp;connectionClose=true"/>
+            <convertBodyTo type="java.lang.String"/>
+            <doFinally>
+                <to uri="direct:reset-raise-http-exception-flag"/>
+                <to
+                        uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()"/>
+            </doFinally>
+        </doTry>
+    </route>
+    <route id="get-json-schema">
+        <from uri="direct:get-json-schema"/>
+        <doTry>
+            <log loggingLevel="INFO"
+                 message="Getting the JSON Schema"/>
+            <to
+                    uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=invokeLog('ControlLoop', 'Getting the JSON Schema')"/>
+            <setHeader name="CamelHttpMethod">
+                <constant>GET</constant>
+            </setHeader>
+            <setHeader name="Content-Type">
+                <constant>application/json</constant>
+            </setHeader>
+            <setProperty name="section">
+                <simple>${header.section}</simple>
+            </setProperty>
+            <log loggingLevel="INFO"
+                 message="Endpoint to get Json Schema: {{clamp.config.controlloop.runtime.url}}/onap/controlloop/v2/commission/toscaServiceTemplateSchema"></log>
+            <toD
+                    uri="{{clamp.config.controlloop.runtime.url}}/onap/controlloop/v2/commission/toscaServiceTemplateSchema?section=${exchangeProperty[section]}&amp;bridgeEndpoint=true&amp;useSystemProperties=true&amp;throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&amp;authMethod=Basic&amp;authUsername={{clamp.config.controlloop.runtime.userName}}&amp;authPassword={{clamp.config.controlloop.runtime.password}}&amp;authenticationPreemptive=true&amp;connectionClose=true"/>
+            <convertBodyTo type="java.lang.String"/>
+            <doFinally>
+                <to uri="direct:reset-raise-http-exception-flag"/>
+                <to
+                        uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()"/>
+            </doFinally>
+        </doTry>
+    </route>
 </routes>
diff --git a/runtime/src/test/java/org/onap/policy/clamp/runtime/RuntimeCommissioningResponseTestItCase.java b/runtime/src/test/java/org/onap/policy/clamp/runtime/RuntimeCommissioningResponseTestItCase.java
index 0ba1486..7616d7a 100644
--- a/runtime/src/test/java/org/onap/policy/clamp/runtime/RuntimeCommissioningResponseTestItCase.java
+++ b/runtime/src/test/java/org/onap/policy/clamp/runtime/RuntimeCommissioningResponseTestItCase.java
@@ -47,6 +47,20 @@
             + " \"name\": \"ToscaServiceTemplateSimple\", \"version\": \"1.0.0\", \"metadata\": {}}";
 
     @Test
+    public void testToscaServiceTemplateSchemaStatus() {
+        ProducerTemplate prodTemplate = camelContext.createProducerTemplate();
+
+        Exchange exchangeResponse =
+            prodTemplate.send("direct:get-json-schema", ExchangeBuilder.anExchange(camelContext)
+                .withProperty("section", "data_types")
+                .withProperty("raiseHttpExceptionFlag", "true")
+                .build());
+
+        assertThat(HttpStatus.valueOf((Integer) exchangeResponse.getIn().getHeader(Exchange.HTTP_RESPONSE_CODE))
+            .is2xxSuccessful()).isTrue();
+    }
+
+    @Test
     public void testToscaServiceTemplateStatus() {
         ProducerTemplate prodTemplate = camelContext.createProducerTemplate();
 
diff --git a/runtime/src/test/resources/http-cache/third_party_proxy.py b/runtime/src/test/resources/http-cache/third_party_proxy.py
index 50bd43a..1aaf402 100644
--- a/runtime/src/test/resources/http-cache/third_party_proxy.py
+++ b/runtime/src/test/resources/http-cache/third_party_proxy.py
@@ -283,6 +283,21 @@
              with open(cached_file_content, 'w+') as f:
                  f.write(jsonGenerated)
          return True
+     elif (self.path.startswith("/onap/controlloop/v2/commission/toscaServiceTemplateSchema")) and http_type == "GET":
+         if not _file_available:
+             cached_file_folder = cached_file_folder.split('bridgeEndpoint')[0]
+             print ("cached file folder for onap is %s: ", cached_file_folder)
+             print "self.path start with /onap/controlloop/v2/commission/, generating response json..."
+             jsonGenerated =  "{\"tosca_definitions_version\": \"tosca_simple_yaml_1_1_0\",\"data_types\": {},\"node_types\": {}, \"policy_types\": {}, \"topology_template\": {}, \"name\": \"ToscaServiceTemplateSimple\", \"version\": \"1.0.0\", \"metadata\": {}}"
+             print "jsonGenerated: " + jsonGenerated
+             if not os.path.exists(cached_file_folder):
+                 os.makedirs(cached_file_folder, 0777)
+
+             with open(cached_file_header, 'w+') as f:
+                 f.write("{\"Content-Length\": \"" + str(len(jsonGenerated)) + "\", \"Content-Type\": \"application/json\"}")
+             with open(cached_file_content, 'w+') as f:
+                 f.write(jsonGenerated)
+         return True
      elif (self.path.startswith("/onap/controlloop/v2/commission")) and http_type == "POST":
          print "self.path start with POST /onap/controlloop/v2/commission, copying body to response ..."
          if not os.path.exists(cached_file_folder):