remove dependency of drool-application/yaml in actors

Issue-ID: POLICY-1264
Change-Id: Ie89749cf25d6880fd2884eb6935f36f046114b23
Signed-off-by: ning.xi <ning.xi@est.tech>
diff --git a/models-interactions/model-actors/pom.xml b/models-interactions/model-actors/pom.xml
index 1144d8d..caee8a1 100644
--- a/models-interactions/model-actors/pom.xml
+++ b/models-interactions/model-actors/pom.xml
@@ -46,9 +46,9 @@
       <artifactId>guava</artifactId>
     </dependency>
     <dependency>
-      <groupId>org.onap.policy.drools-applications.controlloop.common</groupId>
-      <artifactId>policy-yaml</artifactId>
-      <version>${policy.drools-applications.version}</version>
+      <groupId>org.onap.policy.models.policy-models-interactions</groupId>
+      <artifactId>model-yaml</artifactId>
+      <version>${project.version}</version>
     </dependency>
   </dependencies>
 </project>
diff --git a/models-interactions/model-impl/events/README.md b/models-interactions/model-impl/events/README.md
index 6ebd725..e408410 100644
--- a/models-interactions/model-impl/events/README.md
+++ b/models-interactions/model-impl/events/README.md
@@ -1,4 +1,5 @@
 Copyright 2018 AT&T Intellectual Property. All rights reserved.
+Modifications Copyright (C) 2019 Nordix Foundation.
 This file is licensed under the CREATIVE COMMONS ATTRIBUTION 4.0 INTERNATIONAL LICENSE
 Full license text at https://creativecommons.org/licenses/by/4.0/legalcode
 
diff --git a/models-interactions/model-yaml/README-guard-v2.0.0.md b/models-interactions/model-yaml/README-guard-v2.0.0.md
new file mode 100644
index 0000000..7f373b1
--- /dev/null
+++ b/models-interactions/model-yaml/README-guard-v2.0.0.md
@@ -0,0 +1,188 @@
+Copyright 2018 AT&T Intellectual Property. All rights reserved.
+Modifications Copyright (C) 2019 Nordix Foundation.
+This file is licensed under the CREATIVE COMMONS ATTRIBUTION 4.0 INTERNATIONAL LICENSE
+Full license text at https://creativecommons.org/licenses/by/4.0/legalcode
+
+ONAP Control Loop Guard
+
+A control loop guard is a YAML specification for creating policy guard for ControlLoop.
+
+ONAP Control Loop Guard Features:
+
+* The Control Loop Guard can specify the frequency limiter and the blacklist of target entities but not both in the same Guard.
+* Two parts are incorporated. One is the common guard header including guard version while the other part is a set of guard policies. 
+* The Control Loop Guard should contain at least one guard policies.
+* Each guard policy is bound to a specific Actor and Recipe.
+* Each guard policy should have at least one limit constraints which define how the guard policy should be enforced.
+* Supported Actors are APPC and SO. 
+
+This SDK helps build the YAML specification for ONAP Control Loop Guard.
+
+# Create Builder Object
+
+To begin with, the ControlLoopGuardBuilder.Factory class has static methods that one should use to begin building a Control Loop Guard. It will return a [ControlLoopGuardBuilder object](src/main/java/org/onap/policy/controlloop/policy/guard/builder/ControlLoopGuardBuilder.java) that can then be used to continue to build and define the Control Loop Guard.
+
+```java
+		ControlLoopGuardBuilder builder = ControlLoopGuardBuilder.Factory.buildControlLoopGuard(new Guard());
+```
+
+# Add Guard Policy
+
+After a guard builder has been created, the next step would be to add a guard policy to the newly created Control Loop Guard via the builder. To add a guard policy, use the addGuardPolicy() method.
+
+```java
+		GuardPolicy policy = new GuardPolicy(
+								"unique_guard_vUSP_1", 
+								"APPC 5 Restart", 
+								"We only allow 5 restarts over 15 minute window during the day time hours (i.e. avoid midnight to 5am)",
+								"APPC", 
+								"Restart");	
+		builder = builder.addGuardPolicy(policy);
+```
+
+# Add Limit Constraint to a Guard Policy
+
+The limit constraint defines the details of how to enforce the guard policy. Each limit constraint can contain two types of constraints - frequency limiter and black list. At least one type of constraints should be specified, otherwise the limit constraint will be counted as invalid. To add a limit constraint to an existing guard policy, use the addLimitConstraint() method.
+
+```java
+		Map<String, String> time_in_range = new HashMap<String, String>();
+		time_in_range.put("arg2", "PT5H");
+		time_in_range.put("arg3", "PT24H");
+		List<String> blacklist = new LinkedList<String>();
+		blacklist.add("vm_name_1");
+		blacklist.add("vm_name_2");
+		Constraint cons = new Constraint(5, "PT15M", time_in_range, blacklist);
+		builder = builder.addLimitConstraint(policy.id, cons);
+```
+
+
+# Build the YAML Specification
+
+When finished defining the Guard Policies, build the specification and analyze the [Results.java](src/main/java/org/onap/policy/controlloop/policy/builder/Results.java)
+
+```java
+		Results results = builder.buildSpecification();
+		if (results.isValid()) {
+			System.out.println(results.getSpecification());
+		} else {
+			System.err.println("Builder failed");
+			for (Message message : results.getMessages()) {
+				System.err.println(message.getMessage());
+			}
+		}
+```
+
+
+# Use the YAML Specification to Generate the XACML Guard Policies
+
+Now that you have a valid YAML specification, call the method in [PolicyGuardYamlToXacml.java](guard/src/main/java/org/onap/policy/guard/PolicyGuardYamlToXacml.java) to generate the XACML Guard Policies.
+
+
+# YAML Specification
+
+The YAML specification has 2 sections to it: [guard](#guard-object) and [guards](#guards-array). The [guard section](#guard-object) section is simply a header defining the version of this guard. The [guards section](#guards-array) is simply an array of [GuardPolicy objects](#guardpolicy-object).
+
+## guard Object
+
+| Field Name      | Type          | Required   | Description  |
+| -------------   |:-------------:| -----------| ------------:|
+| version         | string        | required   | Value for this release if 2.0.0 |
+
+
+## guards array
+
+The guards section is an array of [GuardPolicy objects](#guardpolicy-object).
+
+### GuardPolicy Object
+
+| Field Name      | Type          | Required   | Description  |
+| -------------   |:-------------:| -----------| ------------:|
+| id              | string        | required   | Unique ID for the policy. |
+| name            | string        | required   | Policy name |
+| description     | string        | optional   | Policy description |
+| actor           | string        | required   | Name of the actor for this operation: Example: APPC |
+| recipe          | string        | required   | Name of recipe to be performed. Example "Restart" |
+| limit_constraints  | array of [constraint](#constraint-object) object | required | Constraints used to enforce the guard policy |
+
+The guard policy is bound to a specific recipe performed by the actor. When the Control Loop tries to perform the recipe operation by the actor, this guard policy should be evaluated against all the specified constraints. If any of the constraints will be violated, the operation should be abandoned.
+
+#### constraint Object
+
+| Field Name      | Type          | Required   | Description  |
+| -------------   |:-------------:| -----------| ------------:|
+| num             | integer       | required if blacklist is not specified  | The limited number of the same operations |
+| duration        | string        | required if blacklist is not specified  | Time window for counting the same operations |
+| time_in_range   | map<string, string> | optional   | Valid time spans for enforcing the guard policy |
+| blacklist       | array of string     | required if num and duration are not specified | A list of the entity names that should not be touched by the Control Loop |
+
+The first three attributes define the frequency limiter which means that only a limited number of the same operations can be allowed within each valid time window. The last attribute defines a blacklist of the target entities on which the Control Loop should not perform the operation.
+  
+The "duration" parameter should have one of the following values: [5min, 10min, 30min, 1h, 12h, 1d, 5d, 1w, 1mon].
+
+  
+## Examples of YAML Control Loop Guards
+
+[vService-Frequency-Limiter-Guard](src/test/resources/v2.0.0-guard/policy_guard_appc_restart.yaml)
+[vService-Blacklist-Guard](src/test/resources/v2.0.0-guard/policy_guard_blacklist.yaml)
+[ONAP-vDNS-Guard](src/test/resources/v2.0.0-guard/policy_guard_ONAP_demo_vDNS.yaml)
+
+
+### vService Frequency Limiter Guard
+```
+guard:
+  version: 2.0.0
+
+guards:
+  - id: unique_guard_vService_frequency_limiter
+    name: APPC 5 Restart
+    description: 
+      We only allow 5 restarts over 15 minute window during the day time hours (i.e. avoid midnight to 5am)
+    actor: APPC
+    recipe: Restart
+    limit_constraints:
+      - num: 5
+        duration: PT15M
+        time_in_range:
+          arg2: PT5H
+          arg3: PT24H	
+```
+
+
+### vService Blacklist Guard
+```
+guard:
+  version: 2.0.0
+
+guards:
+  - id: unique_guard_vService_blacklist
+    name: APPC Restart Blacklist
+    description: |
+      We deny restart of the blacklisted targets (avoid midnight to 5am)
+    actor: APPC
+    recipe: Restart
+    limit_constraints:
+      - blacklist:
+          - TargetName1
+          - TargetName2
+        time_in_range:
+          arg2: 00:00:00-05:00
+          arg3: 23:59:59-05:00
+```
+
+
+### ONAP vDNS Guard
+```
+guard:
+  version: 2.0.0
+
+guards:
+  - id: unique_guard_ONAP_vDNS_1
+    name: SO Spinup
+    description: We only spin up 1 instance over a 10 minute window
+    actor: SO
+    recipe: VF Module Create
+    limit_constraints:
+      - num: 1
+        duration: PT10M
+```
+
diff --git a/models-interactions/model-yaml/README-v1.0.0.md b/models-interactions/model-yaml/README-v1.0.0.md
new file mode 100644
index 0000000..eea1cad
--- /dev/null
+++ b/models-interactions/model-yaml/README-v1.0.0.md
@@ -0,0 +1,264 @@
+Copyright 2018 AT&T Intellectual Property. All rights reserved.
+Modifications Copyright (C) 2019 Nordix Foundation.
+This file is licensed under the CREATIVE COMMONS ATTRIBUTION 4.0 INTERNATIONAL LICENSE
+Full license text at https://creativecommons.org/licenses/by/4.0/legalcode
+
+ONAP Control Loop Policy v1.0.0
+
+A control loop policy is a YAML specification for creating and chaining policies for ControlLoop.
+
+Features of ONAP Control Loop Policy v1.0.0:
+
+* A single DCAE Closed Loop Event is the trigger for the overall Control Loop Policy
+* APPC is the only Actor that Policy will interact with. The operations available are: RESTART, REBUILD, MIGRATE.
+* An overall timeout for the Control Loop Policy must be provided
+* The Control Loop Policy can contain zero or more Operational Policies each chained together via outcomes of each policy.
+* If there are zero Operational Policies, i.e. no automated action is to be taken, then the policy is an Open Loop policy.
+* Operational Policies can have retries and timeout's given to control how they are processed.
+
+This SDK helps build the YAML specification for ONAP Control Loop Policy v1.0.0.
+
+# Create Builder Object
+
+To begin with, the ControlLoopPolicyBuilder.Factory class has static methods that one should use to begin building a Control Loop Policy. It will return a [ControlLoopPolicyBuilder object](src/main/java/org/onap/policy/controlloop/policy/builder/ControlLoopPolicyBuilder.java) that can then be used to continue to build and define the Control Loop Policy.
+
+```java
+		ControlLoopPolicyBuilder builder = ControlLoopPolicyBuilder.Factory.buildControlLoop(
+				UUID.randomUUID().toString(), 
+				2400, 
+				new Resource("sampleResource", ResourceType.VF),
+				new Service("sampleService")
+				);
+```
+
+# Define the Trigger Policy
+
+After the name of the Control Loop and the resource and services have been defined, the next step would be to define the Operation Policy that is first to respond to an incoming DCAE Closed Loop Event. Use the setTriggerPolicy() method to do so.
+
+```java
+		Policy triggerPolicy = builder.setTriggerPolicy(
+				"Restart the VM", 
+				"Upon getting the trigger event, restart the VM", 
+				Actor.APPC, 
+				Target.VM, 
+				"Restart", 
+				2, 
+				300);
+```
+
+# Chain Operational Policies Together Using Operational Results
+
+Operational Policies are chained together using the results of each Operational Policy. The results are defined in [PolicyResult.java](src/main/java/org/onap/policy/controlloop/policy/PolicyResult.java). To create an Operational Policy that is tied to the result of another, use the 
+setPolicyForPolicyResult() method.
+
+```java
+		Policy onRestartFailurePolicy = builder.setPolicyForPolicyResult(
+				"Rebuild VM", 
+				"If the restart fails, rebuild it.", 
+				Actor.APPC, 
+				Target.VM, 
+				"Rebuild", 
+				1, 
+				600, 
+				triggerPolicy.id, 
+				PolicyResult.FAILURE,
+				PolicyResult.FAILURE_RETRIES,
+				PolicyResult.FAILURE_TIMEOUT);
+```
+
+An Operational Policy MUST have place to go for every one of its results. By default, each result type goes to a Final Result. Optionally, using the setPolicyForPolicyResult() method is what allows the chaining of policies. Be aware of creating loops and set the overall Control Loop timeout to reasonable value. All paths MUST lead to a Final Result.
+
+# Build the YAML Specification
+
+When finished defining the Policies, build the specification and analyze the [Results.java](src/main/java/org/onap/policy/controlloop/policy/builder/Results.java)
+
+```java
+		Results results = builder.buildSpecification();
+		if (results.isValid()) {
+			System.out.println(results.getSpecification());
+		} else {
+			System.err.println("Builder failed");
+			for (Message message : results.getMessages()) {
+				System.err.println(message.getMessage());
+			}
+		}
+```
+
+
+# Use the YAML Specification to call the Create Policy API
+
+Now that you have a valid YAML specification, call the createPolicy API via the ONAP Policy Platform API.
+
+# YAML Specification
+
+The YAML specification has 2 sections to it: [controlLoop](#controlloop-object) and [policies](#policies-array). The [controlLoop section](#controlloop-object) section is simply a header defining the Control Loop Policy, what services its for, which resource its for, or if its for a pnf, the overall timeout, and which Operational Policy is triggered upon receiving the event. The [policies section](#policies-array) is simply an array of [Policy Objects](#policy-object).
+
+## controlLoop Object
+
+| Field Name      | Type          | Required   | Description  |
+| -------------   |:-------------:| -----------| ------------:|
+| controlLoopName | string        | required | Unique ID for the control Loop |
+| version         | string        | required | Value for this release if 1.0.0 |
+| services        | array of [service](#service-object) objects | optional | Zero or more services associated with this Control Loop |
+| resources        | array of [resource](#resource-object) object | required (If NOT a pnf control loop) | The resource's associated with this Control Loop. |
+| pnf             | [pnf](#pnf-object) object | required (If NOT a resource control loop) | The physical network function associated with this Control Loop. |
+| trigger_policy  | string     | required | Either this is the ID of an Operation Policy (see policy object), or "Final_OpenLoop" indicating an Open Loop |
+| timeout         | int | required | This is the overall timeout for the Control Loop Policy. It can be 0 for an Open Loop, but otherwise should total more than the timeouts specified in any Operational Policies |
+
+### resource Object
+
+This object was derived via SDC Catalog API and SDC Data Dictionary (POC) in an attempt to use common naming conventions.
+
+| Field Name      | Type          | Required   | Description  |
+| -------------   |:-------------:| -----------| ------------:|
+| resourceInvariantUUID | string - UUID | optional | via SDC, the unique ID for the resource version |
+| resourceName | string | required if NO resourceUUID available | Name of the resource, ideally from SDC catalog. But if not available, use well-known name. |
+| resourceType | string | optional | Use values defined by SDC: VF, VFC, VL, CP. |
+| resourceUUID | string - UUID | required IF available, else populate resourceName | Unique ID for the resource as assigned via SDC.
+| resourceVersion | string | optional | string version of the resource via SDC catalog
+
+SDC catalog is not fully available and resources have not been defined yet, use resourceName. Eg. vFW
+
+### service Object
+
+This object was derived via SDC Catalog API and SDC Data Dictionary (POC) in an attempt to use common naming conventions.
+
+| Field Name      | Type          | Required   | Description  |
+| -------------   |:-------------:| -----------| ------------:|
+| serviceInvariantUUID | string - UUID | optional | via SDC catalog, the unique ID for the service version |
+| serviceName | string | required if NO serviceUUID available | Name of the service, ideally from SDC catalog. But if not available, use well-known name. |
+| serviceUUID | string - UUID | required IF available, else populate serviceName | Unique ID fort he service as assigned via SDC
+| serviceVersion | string | optional | string version of the service via SDC catalog
+    
+SDC catalog is not fully available and some services have not been defined yet, use serviceName. Eg. vLB.
+
+### pnf Object
+
+This object is used for a physical network function. Expect this object to change in the future when ONAP Policy fully integrates with A&AI.
+
+| Field Name      | Type          | Required   | Description  |
+| -------------   |:-------------:| -----------| ------------:|
+| PNFName         | string        | required   | Name of the PNF. Should be supplied via A&AI. If not available use a well-known name. |
+| PNFType         | string        | optional   | Type of PNF if available. |
+
+
+## policies array
+
+The policies section is an array of [Policy objects](#policy-object).
+
+### Policy Object
+
+This is an Operation Policy. It is used to instruct an actor (eg. APPC) to invoke a recipe (eg. "Restart") on a target entity (eg. a "VM"). An operation is simply defined as performing a recipe (or operation) on an actor.
+
+| Field Name      | Type          | Required   | Description  |
+| -------------   |:-------------:| -----------| ------------:|
+| id              | string        | required   | Unique ID for the policy.
+| name            | string        | required   | Policy name |
+| description     | string        | optional   | Policy description |
+| actor           | string        | required   | Name of the actor for this operation: Example: APPC |
+| recipe          | string        | required   | Name of recipe to be performed. Example "Restart" |
+| target          | string        | required   | Entity being targeted. Example: VM |
+| timeout         | int           | required   | Timeout for the actor to perform the recipe. |
+| retry           | int           | optional   | Optional number of retries for ONAP Policy to invoke the recipe on the actor. |
+| success         | string        | required   | By default, this value should be FINAL_SUCCESS. Otherwise this can be the ID of the operational Policy (included in this specification) to invoke upon successfully completing the recipe on the actor.
+| failure         | string        | required   | By default, this value should be FINAL_FAILURE. Otherwise this can be the ID of the operational Policy (included in this specification) to invoke upon failure to perform the operation. |
+| failure_exception | string      | required   | By default, this value should be FINAL_FAILURE_EXCEPTION. Otherwise this can be the ID of an Operational Policy (included in this specification) to invoke upon an exception occurring while attempting to perform the operation. |
+| failure_retries | string        | required   | By default, this value should be the FINAL_FAILURE_RETRIES. Otherwise this can be the ID of an Operational Policy (included in this specification) to invoke upon maxing out on retries while attempting to perform the operation. |
+| failure_timeout | string        | required   | By default, this value should be FINAL_FAILURE_TIMEOUT. Otherwise this can be the ID of the operational Policy (included in this specification) to invoke upon a timeout occuring while performing an operation. |
+
+Every Operational Policy MUST have a place to go for every possible result (success, failure, failure_retries, failure_timeout, failure_exception). By default, all the results are final results.
+  
+## Examples of YAML Control Loops v1.0.0
+
+[vService](src/test/resources/v1.0.0/policy_vService.yaml)
+[Open-Loop](src/test/resources/v1.0.0/policy_OpenLoop.yaml)
+
+
+### vService
+```
+controlLoop:
+  version: 1.0.0
+  controlLoopName: ControlLoop-vService-cbed919f-2212-4ef7-8051-fe6308da1bda
+  services: 
+    - serviceName: service1
+  resources: 
+    - resourceName: resource1
+      resourceType: VF
+    - resourceName: resource2
+      resourceType: VF
+    - resourceName: resource3
+      resourceType: VF
+    - resourceName: resource4
+      resourceType: VF
+    - resourceName: resource5
+      resourceType: VF
+  trigger_policy: unique-policy-id-1-restart
+  timeout: 1200
+
+policies:
+  - id: unique-policy-id-1-restart
+    name: Restart Policy
+    description:
+    actor: APPC
+    recipe: Restart
+    target: VM
+    retry: 2
+    timeout: 300
+    success: final_success
+    failure: unique-policy-id-2-rebuild
+    failure_timeout: unique-policy-id-2-rebuild
+    failure_retries: unique-policy-id-2-rebuild
+    failure_exception: final_failure_exception
+  
+  - id: unique-policy-id-2-rebuild
+    name: Rebuild Policy
+    description:
+    actor: APPC
+    recipe: Rebuild
+    target: VM
+    retry: 0
+    timeout: 600
+    success: final_success
+    failure: unique-policy-id-3-migrate
+    failure_timeout: unique-policy-id-3-migrate
+    failure_retries: unique-policy-id-3-migrate
+    failure_exception: final_failure_exception
+  
+  - id: unique-policy-id-3-migrate
+    name: Migrate Policy
+    description:
+    actor: APPC
+    recipe: Migrate
+    target: VM
+    retry: 0
+    timeout: 600
+    success: final_success
+    failure: final_failure
+    failure_timeout: final_failure_timeout
+    failure_retries: final_failure_retries
+    failure_exception: final_failure_exception
+
+```
+
+### Open Loop
+```
+controlLoop:
+  version: 1.0.0
+  controlLoopName: ControlLoop-Open-fac4ae3d-c3f5-4bab-8e54-0a8581ede132
+  services:
+    - serviceName: service1
+  resources:
+    - resourceType: VF
+      resourceName: resource1
+  trigger_policy: final_openloop
+  timeout: 0
+
+policies:
+```
+
+
+
+# Control Loop Final Results Explained
+
+A Control Loop Policy has the following set of final results, as defined in [FinalResult.java](src/main/java/org/onap/policy/controlloop/policy/FinalResult.java). A final result indicates when a Control Loop Policy has finished execution and is finished processing a Closed Loop Event. All paths must lead to a Final Result.
+
diff --git a/models-interactions/model-yaml/README-v2.0.0.md b/models-interactions/model-yaml/README-v2.0.0.md
new file mode 100644
index 0000000..d6613ad
--- /dev/null
+++ b/models-interactions/model-yaml/README-v2.0.0.md
@@ -0,0 +1,355 @@
+Copyright 2018 AT&T Intellectual Property. All rights reserved.
+Modifications Copyright (C) 2019 Nordix Foundation.
+This file is licensed under the CREATIVE COMMONS ATTRIBUTION 4.0 INTERNATIONAL LICENSE
+Full license text at https://creativecommons.org/licenses/by/4.0/legalcode
+
+ONAP Control Loop Policy v2.0.0
+
+A control loop policy is a YAML specification for creating and chaining policies for ControlLoop.
+
+Features of ONAP Control Loop Policy v2.0.0:
+
+* Backward compatible with ONAP Control Loop Policy v1.0.0
+* A single DCAE Closed Loop Event is the trigger for the overall Control Loop Policy. 
+* An overall timeout for the Control Loop Policy must be provided.
+* An abatement flag indicating whether Policy will receive abatement event for the Control Loop could be provided.
+* The Control Loop Policy can contain zero or more Operational Policies each chained together via outcomes of each policy.
+* If there are zero Operational Policies, i.e. no automated action is to be taken, then the policy is an Open Loop policy.
+* Operational policies can have target, retries and timeout's given to control how they are processed.
+* Type and resourceID of the target could be provided to support the target in operational policies.
+* Payload could be provided to support the recipe. 
+* Multiple actors along with their supported recipes can be specified in operational policies that Policy will interact with. The following table summarizes the supported actors and recipes.
+
+| Actor        | Recipe                      | Target   | Payload  |
+| -------------|:---------------------------:| ---------| ------------:|
+| APPC         | Restart                     | VM       | CloudVServerSelfLink, CloudIdentity |
+| APPC         | Rebuild                     | VM   	| CloudVServerSelfLink, CloudIdentity |
+| APPC         | Migrate          			 | VM   	| CloudVServerSelfLink, CloudIdentity |
+| APPC         | ModifyConfig     			 | VNF  	| generic-vnf.vnf-id |
+| SO           | VF Module Create 			 | VFC  	| optional |
+
+
+This SDK helps build the YAML specification for ONAP Control Loop Policy v2.0.0.
+
+# Create Builder Object
+
+To begin with, the ControlLoopPolicyBuilder.Factory class has static methods that one should use to begin building a Control Loop Policy. It will return a [ControlLoopPolicyBuilder object](src/main/java/org/onap/policy/controlloop/policy/builder/ControlLoopPolicyBuilder.java) that can then be used to continue to build and define the Control Loop Policy.
+
+```java
+		ControlLoopPolicyBuilder builder = ControlLoopPolicyBuilder.Factory.buildControlLoop(
+				UUID.randomUUID().toString(), 
+				2400, 
+				new Resource("sampleResource", ResourceType.VF),
+				new Service("sampleService")
+				);
+```
+
+# Define the Trigger Policy
+
+After the name of the Control Loop and the resource and services have been defined, the next step would be to define the Operation Policy that is first to respond to an incoming DCAE Closed Loop Event. Use the setTriggerPolicy() method to do so.
+
+```java
+		Policy triggerPolicy = builder.setTriggerPolicy(
+				"Restart the VM", 
+				"Upon getting the trigger event, restart the VM", 
+				"APPC", 
+				new Target(TargetType.VM), 
+				"Restart", 
+				null,
+				2, 
+				300);
+```
+
+# Set the Abatement Flag for the Control Loop
+
+After the trigger policy, the name, the resource(s) and services of the Control Loop have been defined, the next optional step would be to set the abatement flag that indicates whether DCAE will send Policy the abatement event for this Control Loop. If the abatement is not explicitly set, it is assumed that Policy will not receive the abatement event. Use the setAbatement() method to do so.
+
+```java 
+	    builder = builder.setAbatement(false);
+```
+
+# Chain Operational Policies Together Using Operational Results
+
+Operational Policies are chained together using the results of each Operational Policy. The results are defined in [PolicyResult.java](src/main/java/org/onap/policy/controlloop/policy/PolicyResult.java). To create an Operational Policy that is tied to the result of another, use the 
+setPolicyForPolicyResult() method.
+
+```java
+		Policy onRestartFailurePolicy = builder.setPolicyForPolicyResult(
+				"Rebuild VM", 
+				"If the restart fails, rebuild it.", 
+				"APPC", 
+				new Target(TargetType.VM), 
+				"Rebuild", 
+				null,
+				1, 
+				600, 
+				triggerPolicy.id, 
+				PolicyResult.FAILURE,
+				PolicyResult.FAILURE_RETRIES,
+				PolicyResult.FAILURE_TIMEOUT,
+				PolicyResult.FAILURE_GUARD);
+```
+
+An Operational Policy MUST have place to go for every one of its results. By default, each result type goes to a Final Result. Optionally, using the setPolicyForPolicyResult() method is what allows the chaining of policies. Be aware of creating loops and set the overall Control Loop timeout to reasonable value. All paths MUST lead to a Final Result.
+
+
+
+# Build the YAML Specification
+
+When finished defining the Policies, build the specification and analyze the [Results.java](src/main/java/org/onap/policy/controlloop/policy/builder/Results.java)
+
+```java
+		Results results = builder.buildSpecification();
+		if (results.isValid()) {
+			System.out.println(results.getSpecification());
+		} else {
+			System.err.println("Builder failed");
+			for (Message message : results.getMessages()) {
+				System.err.println(message.getMessage());
+			}
+		}
+```
+
+
+# Use the YAML Specification to call the Create Policy API
+
+Now that you have a valid YAML specification, call the createPolicy API via the ONAP Policy Platform API.
+
+
+# YAML Specification
+
+The YAML specification has 2 sections to it: [controlLoop](#controlloop-object) and [policies](#policies-array). The [controlLoop section](#controlloop-object) section is simply a header defining the Control Loop Policy, what services its for, which resource its for, or if its for a pnf, the overall timeout, the abatement flag, and which Operational Policy is triggered upon receiving the event. The [policies section](#policies-array) is simply an array of [Policy Objects](#policy-object).
+
+## controlLoop Object
+
+| Field Name      | Type          | Required   | Description  |
+| -------------   |:-------------:| -----------| ------------:|
+| controlLoopName | string        | required | Unique ID for the control Loop |
+| version         | string        | required | Value for this release if 1.0.0 |
+| services        | array of [service](#service-object) objects | optional | Zero or more services associated with this Control Loop |
+| resources        | array of [resource](#resource-object) object | required (If NOT a pnf control loop) | The resource's associated with this Control Loop. |
+| pnf             | [pnf](#pnf-object) object | required (If NOT a resource control loop) | The physical network function associated with this Control Loop. |
+| trigger_policy  | string     | required | Either this is the ID of an Operation Policy (see policy object), or "Final_OpenLoop" indicating an Open Loop |
+| timeout         | int | required | This is the overall timeout for the Control Loop Policy. It can be 0 for an Open Loop, but otherwise should total more than the timeouts specified in any Operational Policies |
+| abatement       | boolean       | optional | This is an abatement flag indicating if DCAE will send abatement event to Policy for this Control Loop |
+
+### resource Object
+
+This object was derived via SDC Catalog API and SDC Data Dictionary (POC) in an attempt to use common naming conventions.
+
+| Field Name      | Type          | Required   | Description  |
+| -------------   |:-------------:| -----------| ------------:|
+| resourceInvariantUUID | string - UUID | optional | via SDC, the unique ID for the resource version |
+| resourceName | string | required if NO resourceUUID available | Name of the resource, ideally from SDC catalog. But if not available, use well-known name. |
+| resourceType | string | optional | Use values defined by SDC: VF, VFC, VL, CP. |
+| resourceUUID | string - UUID | required IF available, else populate resourceName | Unique ID for the resource as assigned via SDC.
+| resourceVersion | string | optional | string version of the resource via SDC catalog
+
+
+### service Object
+
+This object was derived via SDC Catalog API and SDC Data Dictionary (POC) in an attempt to use common naming conventions.
+
+| Field Name      | Type          | Required   | Description  |
+| ---------------:| -------------:| ----------:| ------------:|
+| serviceInvariantUUID | string - UUID | optional | via SDC catalog, the unique ID for the service version |
+| serviceName | string | required if NO serviceUUID available | Name of the service, ideally from SDC catalog. But if not available, use well-known name. |
+| serviceUUID | string - UUID | required IF available, else populate serviceName | Unique ID fort he service as assigned via SDC
+| serviceVersion | string | optional | string version of the service via SDC catalog
+    
+
+### pnf Object
+
+This object is used for a physical network function. Expect this object to change in the future when ONAP Policy fully integrates with A&AI.
+
+| Field Name      | Type          | Required   | Description  |
+| -------------   |:-------------:| -----------| ------------:|
+| PNFName         | string        | required   | Name of the PNF. Should be supplied via A&AI. If not available use a well-known name. |
+| PNFType         | string        | optional   | Type of PNF if available. |
+
+
+## policies array
+
+The policies section is an array of [Policy objects](#policy-object).
+
+### Policy Object
+
+This is an Operation Policy. It is used to instruct an actor (eg. APPC) to invoke a recipe (eg. "Restart") on a target entity (eg. a "VM"). An operation is simply defined as performing a recipe (or operation) on an actor.
+
+| Field Name      | Type          | Required   | Description  |
+| -------------   |:-------------:| -----------| ------------:|
+| id              | string        | required   | Unique ID for the policy.
+| name            | string        | required   | Policy name |
+| description     | string        | optional   | Policy description |
+| actor           | string        | required   | Name of the actor for this operation: Example: APPC |
+| recipe          | string        | required   | Name of recipe to be performed. Example "Restart" |
+| target          | [target](#target-object) object        | required   | Entity being targeted. Example: VM |
+| timeout         | int           | required   | Timeout for the actor to perform the recipe. |
+| retry           | int           | optional   | Optional number of retries for ONAP Policy to invoke the recipe on the actor. |
+| success         | string        | required   | By default, this value should be FINAL_SUCCESS. Otherwise this can be the ID of the operational Policy (included in this specification) to invoke upon successfully completing the recipe on the actor.
+| failure         | string        | required   | By default, this value should be FINAL_FAILURE. Otherwise this can be the ID of the operational Policy (included in this specification) to invoke upon failure to perform the operation. |
+| failure_exception | string      | required   | By default, this value should be FINAL_FAILURE_EXCEPTION. Otherwise this can be the ID of an Operational Policy (included in this specification) to invoke upon an exception occurring while attempting to perform the operation. |
+| failure_retries | string        | required   | By default, this value should be the FINAL_FAILURE_RETRIES. Otherwise this can be the ID of an Operational Policy (included in this specification) to invoke upon maxing out on retries while attempting to perform the operation. |
+| failure_timeout | string        | required   | By default, this value should be FINAL_FAILURE_TIMEOUT. Otherwise this can be the ID of the operational Policy (included in this specification) to invoke upon a timeout occuring while performing an operation. |
+| failure_guard   | string        | required   | By default, this value should be FINAL_FAILURE_GUARD. Otherwise this can be the ID of the operational Policy (included in this specification) to invoke upon Guard denies this operation. |
+
+Every Operational Policy MUST have a place to go for every possible result (success, failure, failure_retries, failure_timeout, failure_exception, failure_guard). By default, all the results are final results.
+  
+#### target Object
+
+This object is used for defining a target entity of a recipe.  
+
+| Field Name      | Type          | Required   | Description  |
+| -------------   |:-------------:| -----------| ------------:|
+| type            | enums of VM, PNF and VNC | required   | Type of the target. |
+| resourceID      | string        | optional   | Resource ID of the target. Should be supplied via SDC Catalog. |
+  
+  
+## Examples of YAML Control Loops v2.0.0
+
+[vService](src/test/resources/v2.0.0/policy_vService.yaml)
+[ONAP-vFirewall](src/test/resources/v2.0.0/policy_ONAP_demo_vFirewall.yaml)
+[ONAP-vDNS](src/test/resources/v2.0.0/policy_ONAP_demo_vDNS.yaml)
+
+### vService
+``` 
+controlLoop:
+  version: 2.0.0
+  controlLoopName: ControlLoop-vService-cbed919f-2212-4ef7-8051-fe6308da1bda
+  services: 
+    - serviceName: service1
+  resources: 
+    - resourceName: resource1
+      resourceType: VFC
+    - resourceName: resource2
+      resourceType: VFC
+    - resourceName: resource3
+      resourceType: VFC
+    - resourceName: resource4
+      resourceType: VFC
+    - resourceName: resource5
+      resourceType: VFC
+  trigger_policy: unique-policy-id-1-restart
+  timeout: 1200
+  abatement: false
+
+policies:
+  - id: unique-policy-id-1-restart
+    name: Restart Policy
+    description:
+    actor: APPC
+    recipe: Restart
+    target:
+      type: VM
+    retry: 2
+    timeout: 300
+    success: final_success
+    failure: unique-policy-id-2-rebuild
+    failure_timeout: unique-policy-id-2-rebuild
+    failure_retries: unique-policy-id-2-rebuild
+    failure_exception: final_failure_exception
+    failure_guard: unique-policy-id-2-rebuild
+  
+  - id: unique-policy-id-2-rebuild
+    name: Rebuild Policy
+    description:
+    actor: APPC
+    recipe: Rebuild
+    target:
+      type: VM 
+    retry: 0
+    timeout: 600
+    success: final_success
+    failure: unique-policy-id-3-migrate
+    failure_timeout: unique-policy-id-3-migrate
+    failure_retries: unique-policy-id-3-migrate
+    failure_exception: final_failure_exception
+    failure_guard: unique-policy-id-3-migrate
+  
+  - id: unique-policy-id-3-migrate
+    name: Migrate Policy
+    description:
+    actor: APPC
+    recipe: Migrate
+    target: 
+      type: VM
+    retry: 0
+    timeout: 600
+    success: final_success
+    failure: final_failure
+    failure_timeout: final_failure_timeout
+    failure_retries: final_failure_retries
+    failure_exception: final_failure_exception
+    failure_guard: final_failure_guard
+```
+
+
+
+### ONAP vFirewall
+```
+controlLoop:
+  version: 2.0.0
+  controlLoopName: ControlLoop-vFirewall-d0a1dfc6-94f5-4fd4-a5b5-4630b438850a
+  services: 
+    - serviceInvariantUUID: 5cfe6f4a-41bc-4247-8674-ebd4b98e35cc
+      serviceUUID: 0f40bba5-986e-4b3c-803f-ddd1b7b25f24
+      serviceName: 57e66ea7-0ed6-45c7-970f
+  trigger_policy: unique-policy-id-1-modifyConfig
+  timeout: 1200
+
+policies:
+  - id: unique-policy-id-1-modifyConfig
+    name: Change the Load Balancer
+    description:
+    actor: APPC
+    recipe: ModifyConfig
+    target:
+      resourceID: Eace933104d443b496b8.nodes.heat.vpg
+    payload:
+      generic-vnf.vnf-id: {generic-vnf.vnf-id}
+      ref$: pgstreams.json
+    retry: 0
+    timeout: 300
+    success: final_success
+    failure: final_failure
+    failure_timeout: final_failure_timeout
+    failure_retries: final_failure_retries
+    failure_exception: final_failure_exception
+    failure_guard: final_failure_guard
+```
+
+### ONAP vDNS
+```
+controlLoop:
+  version: 2.0.0
+  controlLoopName: ControlLoop-vDNS-6f37f56d-a87d-4b85-b6a9-cc953cf779b3
+  trigger_policy: unique-policy-id-1-scale-up
+  timeout: 1200
+  abatement: false
+
+policies:
+  - id: unique-policy-id-1-scale-up
+    name: Create a new VF Module
+    description:
+    actor: SO
+    recipe: VF Module Create
+    target:
+      type: VNF
+    payload:
+      requestParameters: '{"usePreload":true,"userParams":[]}'
+      configurationParameters: '[{"ip-addr":"$.vf-module-topology.vf-module-parameters.param[9]","oam-ip-addr":"$.vf-module-topology.vf-module-parameters.param[16]","enabled":"$.vf-module-topology.vf-module-parameters.param[23]"}]'
+    retry: 0
+    timeout: 1200
+    success: final_success
+    failure: final_failure
+    failure_timeout: final_failure_timeout
+    failure_retries: final_failure_retries
+    failure_exception: final_failure_exception
+    failure_guard: final_failure_guard
+```
+
+
+# Control Loop Final Results Explained
+
+A Control Loop Policy has the following set of final results, as defined in [FinalResult.java](src/main/java/org/onap/policy/controlloop/policy/FinalResult.java). A final result indicates when a Control Loop Policy has finished execution and is finished processing a Closed Loop Event. All paths must lead to a Final Result.
+
diff --git a/models-interactions/model-yaml/checkstyle-suppressions.xml b/models-interactions/model-yaml/checkstyle-suppressions.xml
new file mode 100644
index 0000000..eda812f
--- /dev/null
+++ b/models-interactions/model-yaml/checkstyle-suppressions.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0"?>
+<!--
+  ============LICENSE_START=======================================================
+   Copyright (C) 2018 AT&T Technologies. All rights reserved.
+   Modifications Copyright (C) 2019 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=========================================================
+-->
+
+<!DOCTYPE suppressions PUBLIC
+     "-//Puppy Crawl//DTD Suppressions 1.0//EN"
+     "http://www.puppycrawl.com/dtds/suppressions_1_0.dtd">
+ 
+<suppressions>
+  <suppress checks="AbbreviationAsWordInName"
+    files="Target.java|ControlLoopPolicyBuilder.java"
+    lines="1-9999"/>
+</suppressions>
diff --git a/models-interactions/model-yaml/pom.xml b/models-interactions/model-yaml/pom.xml
new file mode 100644
index 0000000..77f1d70
--- /dev/null
+++ b/models-interactions/model-yaml/pom.xml
@@ -0,0 +1,132 @@
+<!--
+  ============LICENSE_START=======================================================
+  drools-pdp-apps
+  ================================================================================
+  Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+  Modifications Copyright (C) 2019 Nordix Foundation.
+  ================================================================================
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  ============LICENSE_END=========================================================
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.onap.policy.models</groupId>
+    <artifactId>policy-models-interactions</artifactId>
+    <version>2.0.0-SNAPSHOT</version>
+  </parent>
+
+  <groupId>org.onap.policy.models.policy-models-interactions</groupId>
+  <artifactId>model-yaml</artifactId>
+  
+  <dependencies>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>ch.qos.logback</groupId>
+      <artifactId>logback-classic</artifactId>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.yaml</groupId>
+      <artifactId>snakeyaml</artifactId>
+      <version>1.17</version>
+    </dependency>
+    <dependency>
+      <groupId>org.jgrapht</groupId>
+      <artifactId>jgrapht-core</artifactId>
+      <version>0.9.2</version>
+    </dependency>
+    <dependency>
+      <groupId>org.onap.policy.models.policy-models-interactions.model-impl</groupId>
+      <artifactId>sdc</artifactId>
+      <version>${project.version}</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.onap.policy.models.policy-models-interactions.model-impl</groupId>
+      <artifactId>aai</artifactId>
+      <version>${project.version}</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>com.google.guava</groupId>
+      <artifactId>guava</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.onap.policy.common</groupId>
+      <artifactId>utils-test</artifactId>
+      <version>${policy.common.version}</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+    <!--
+    Without this defined here, the checkstyle plugin just simply fails outright. This needs to be investigated
+    further as there was no real debugging details as to why or any configuration issue detected.
+    NOTE: I had to append src/main/java to the sourceDirectory.
+    Is it a reactor ordering issue? I'm wondering why it is being compiled after aai, in between the sub-modules
+    in model-impl. Dependency ordering?? Circular dependency?? 
+     -->
+    <build>
+        <plugins>
+            <plugin>
+                <artifactId>maven-checkstyle-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>onap-java-style</id>
+                        <goals>
+                            <goal>check</goal>
+                        </goals>
+                        <phase>process-sources</phase>
+                        <configuration>
+                            <!-- Use Google Java Style Guide:
+                            https://github.com/checkstyle/checkstyle/blob/master/src/main/resources/google_checks.xml
+                            with minor changes -->
+                            <configLocation>onap-checkstyle/onap-java-style.xml</configLocation>
+                            <!-- <sourceDirectory> is needed so that checkstyle ignores the generated sources directory -->
+                            <sourceDirectory>${project.build.sourceDirectory}</sourceDirectory>
+                            <includeResources>true</includeResources>
+                            <includeTestSourceDirectory>true</includeTestSourceDirectory>
+                            <includeTestResources>true</includeTestResources>
+                            <excludes>
+                            </excludes>
+                            <suppressionsLocation>${project.basedir}/checkstyle-suppressions.xml</suppressionsLocation>
+                            <consoleOutput>true</consoleOutput>
+                            <failsOnViolation>true</failsOnViolation>
+                            <violationSeverity>warning</violationSeverity>
+                        </configuration>
+                    </execution>
+                </executions>
+                <dependencies>
+                    <dependency>
+                        <groupId>org.onap.oparent</groupId>
+                        <artifactId>checkstyle</artifactId>
+                        <version>${oparent.version}</version>
+                        <scope>compile</scope>
+                    </dependency>
+                </dependencies>
+            </plugin>
+        </plugins>
+    </build>
+</project>
diff --git a/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/compiler/CompilerException.java b/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/compiler/CompilerException.java
new file mode 100644
index 0000000..e064750
--- /dev/null
+++ b/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/compiler/CompilerException.java
@@ -0,0 +1,47 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * policy-yaml
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2019 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.controlloop.compiler;
+
+public class CompilerException extends Exception {
+
+    private static final long serialVersionUID = -7262217239867898601L;
+
+    public CompilerException() {
+    }
+
+    public CompilerException(String message) {
+        super(message);
+    }
+
+    public CompilerException(Throwable cause) {
+        super(cause);
+    }
+
+    public CompilerException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    public CompilerException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
+        super(message, cause, enableSuppression, writableStackTrace);
+    }
+
+}
diff --git a/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/compiler/ControlLoopCompiler.java b/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/compiler/ControlLoopCompiler.java
new file mode 100644
index 0000000..91b5266
--- /dev/null
+++ b/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/compiler/ControlLoopCompiler.java
@@ -0,0 +1,739 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * policy-yaml
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2019 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.controlloop.compiler;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+
+import java.io.InputStream;
+import java.io.Serializable;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.jgrapht.DirectedGraph;
+import org.jgrapht.graph.ClassBasedEdgeFactory;
+import org.jgrapht.graph.DefaultEdge;
+import org.jgrapht.graph.DirectedMultigraph;
+import org.onap.policy.controlloop.policy.ControlLoop;
+import org.onap.policy.controlloop.policy.ControlLoopPolicy;
+import org.onap.policy.controlloop.policy.FinalResult;
+import org.onap.policy.controlloop.policy.Policy;
+import org.onap.policy.controlloop.policy.PolicyResult;
+import org.onap.policy.controlloop.policy.TargetType;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.yaml.snakeyaml.Yaml;
+import org.yaml.snakeyaml.constructor.Constructor;
+
+
+public class ControlLoopCompiler implements Serializable {
+    private static final String OPERATION_POLICY = "Operation Policy ";
+    private static final long serialVersionUID = 1L;
+    private static final Logger LOGGER = LoggerFactory.getLogger(ControlLoopCompiler.class.getName());
+    
+    /**
+     * Compiles the policy from an object.
+     */
+    public static ControlLoopPolicy compile(ControlLoopPolicy policy, 
+                    ControlLoopCompilerCallback callback) throws CompilerException {
+        //
+        // Ensure the control loop is sane
+        //
+        validateControlLoop(policy.getControlLoop(), callback);
+        //
+        // Validate the policies
+        //
+        validatePolicies(policy, callback);
+        
+        return policy;
+    }
+    
+    /**
+     * Compiles the policy from an input stream.
+     * 
+     * @param yamlSpecification the yaml input stream
+     * @param callback method to callback during compilation
+     * @return Control Loop object
+     * @throws CompilerException throws any compile exception found
+     */
+    public static ControlLoopPolicy compile(InputStream yamlSpecification, 
+                    ControlLoopCompilerCallback callback) throws CompilerException {
+        Yaml yaml = new Yaml(new Constructor(ControlLoopPolicy.class));
+        Object obj = yaml.load(yamlSpecification);
+        if (obj == null) {
+            throw new CompilerException("Could not parse yaml specification.");
+        }
+        if (! (obj instanceof ControlLoopPolicy)) {
+            throw new CompilerException("Yaml could not parse specification into required ControlLoopPolicy object");
+        }
+        return ControlLoopCompiler.compile((ControlLoopPolicy) obj, callback);
+    }
+    
+    private static void validateControlLoop(ControlLoop controlLoop, 
+                    ControlLoopCompilerCallback callback) throws CompilerException {
+        if (controlLoop == null && callback != null) {
+            callback.onError("controlLoop cannot be null");
+        }
+        if (controlLoop != null) {
+            if ((controlLoop.getControlLoopName() == null || controlLoop.getControlLoopName().length() < 1) 
+                            && callback != null) {
+                callback.onError("Missing controlLoopName");
+            }
+            if ((!controlLoop.getVersion().contentEquals(ControlLoop.getCompilerVersion())) && callback != null) {
+                callback.onError("Unsupported version for this compiler");
+            }
+            if (controlLoop.getTrigger_policy() == null || controlLoop.getTrigger_policy().length() < 1) {
+                throw new CompilerException("trigger_policy is not valid");
+            }
+        }
+    }
+
+    private static void validatePolicies(ControlLoopPolicy policy, 
+                    ControlLoopCompilerCallback callback) throws CompilerException {
+        if (policy == null) {
+            throw new CompilerException("policy cannot be null");
+        }
+        if (policy.getPolicies() == null) {
+            callback.onWarning("controlLoop is an open loop.");   
+        } else {
+            //
+            // For this version we can use a directed multigraph, in the future we may not be able to
+            //
+            DirectedGraph<NodeWrapper, LabeledEdge> graph = 
+                            new DirectedMultigraph<>(new ClassBasedEdgeFactory<NodeWrapper, 
+                                            LabeledEdge>(LabeledEdge.class));
+            //
+            // Check to see if the trigger Event is for OpenLoop, we do so by
+            // attempting to create a FinalResult object from it. If its a policy id, this should
+            // return null.
+            //
+            FinalResult triggerResult = FinalResult.toResult(policy.getControlLoop().getTrigger_policy());
+            TriggerNodeWrapper triggerNode;
+            //
+            // Did this turn into a FinalResult object?
+            //
+            if (triggerResult != null) {
+                validateOpenLoopPolicy(policy, triggerResult, callback);
+                return;
+                //
+            } else {
+                validatePoliciesContainTriggerPolicyAndCombinedTimeoutIsOk(policy, callback);
+                triggerNode = new TriggerNodeWrapper(policy.getControlLoop().getControlLoopName());
+            }
+            //
+            // Add in the trigger node
+            //
+            graph.addVertex(triggerNode);
+            //
+            // Add in our Final Result nodes. All paths should end to these nodes.
+            //
+            FinalResultNodeWrapper finalSuccess = new FinalResultNodeWrapper(FinalResult.FINAL_SUCCESS);
+            FinalResultNodeWrapper finalFailure = new FinalResultNodeWrapper(FinalResult.FINAL_FAILURE);
+            FinalResultNodeWrapper finalFailureTimeout = new FinalResultNodeWrapper(FinalResult.FINAL_FAILURE_TIMEOUT);
+            FinalResultNodeWrapper finalFailureRetries = new FinalResultNodeWrapper(FinalResult.FINAL_FAILURE_RETRIES);
+            FinalResultNodeWrapper finalFailureException = 
+                            new FinalResultNodeWrapper(FinalResult.FINAL_FAILURE_EXCEPTION);
+            FinalResultNodeWrapper finalFailureGuard = new FinalResultNodeWrapper(FinalResult.FINAL_FAILURE_GUARD);
+            graph.addVertex(finalSuccess);
+            graph.addVertex(finalFailure);
+            graph.addVertex(finalFailureTimeout);
+            graph.addVertex(finalFailureRetries);
+            graph.addVertex(finalFailureException);
+            graph.addVertex(finalFailureGuard);
+            //
+            // Work through the policies and add them in as nodes.
+            //
+            Map<Policy, PolicyNodeWrapper> mapNodes = addPoliciesAsNodes(policy, graph, triggerNode, callback);
+            //
+            // last sweep to connect remaining edges for policy results
+            //
+            for (Policy operPolicy : policy.getPolicies()) {
+                PolicyNodeWrapper node = mapNodes.get(operPolicy);
+                //
+                // Just ensure this has something
+                //
+                if (node == null) {
+                    continue;
+                }
+                addEdge(graph, mapNodes, operPolicy.getId(), operPolicy.getSuccess(), finalSuccess, 
+                                PolicyResult.SUCCESS, node);
+                addEdge(graph, mapNodes, operPolicy.getId(), operPolicy.getFailure(), finalFailure, 
+                                PolicyResult.FAILURE, node);
+                addEdge(graph, mapNodes, operPolicy.getId(), operPolicy.getFailure_timeout(), finalFailureTimeout, 
+                                PolicyResult.FAILURE_TIMEOUT, node);
+                addEdge(graph, mapNodes, operPolicy.getId(), operPolicy.getFailure_retries(), finalFailureRetries, 
+                                PolicyResult.FAILURE_RETRIES, node);
+                addEdge(graph, mapNodes, operPolicy.getId(), operPolicy.getFailure_exception(), finalFailureException, 
+                                PolicyResult.FAILURE_EXCEPTION, node);
+                addEdge(graph, mapNodes, operPolicy.getId(), operPolicy.getFailure_guard(), finalFailureGuard, 
+                                PolicyResult.FAILURE_GUARD, node);
+            }
+            validateNodesAndEdges(graph, callback);
+        }   
+    }
+    
+    private static void validateOpenLoopPolicy(ControlLoopPolicy policy, FinalResult triggerResult, 
+                    ControlLoopCompilerCallback callback) throws CompilerException {
+        //
+        // Ensure they didn't use some other FinalResult code
+        //
+        if (triggerResult != FinalResult.FINAL_OPENLOOP) {
+            throw new CompilerException("Unexpected Final Result for trigger_policy, should only be " 
+        + FinalResult.FINAL_OPENLOOP.toString() + " or a valid Policy ID");
+        }
+        //
+        // They really shouldn't have any policies attached.
+        //
+        if ((policy.getPolicies() != null || policy.getPolicies().isEmpty()) && callback != null ) {
+            callback.onWarning("Open Loop policy contains policies. The policies will never be invoked.");
+        }
+    }
+    
+    private static void validatePoliciesContainTriggerPolicyAndCombinedTimeoutIsOk(ControlLoopPolicy policy, 
+                    ControlLoopCompilerCallback callback) throws CompilerException {
+        int sum = 0;
+        boolean triggerPolicyFound = false;
+        for (Policy operPolicy : policy.getPolicies()) {
+            sum += operPolicy.getTimeout().intValue();
+            if (policy.getControlLoop().getTrigger_policy().equals(operPolicy.getId())) {
+                triggerPolicyFound = true;
+            }
+        }
+        if (policy.getControlLoop().getTimeout().intValue() < sum && callback != null) {
+            callback.onError("controlLoop overall timeout is less than the sum of operational policy timeouts.");
+        }
+        
+        if (!triggerPolicyFound) {
+            throw new CompilerException("Unexpected value for trigger_policy, should only be " 
+        + FinalResult.FINAL_OPENLOOP.toString() + " or a valid Policy ID");
+        }
+    }
+    
+    private static Map<Policy, PolicyNodeWrapper> addPoliciesAsNodes(ControlLoopPolicy policy, 
+            DirectedGraph<NodeWrapper, LabeledEdge> graph, TriggerNodeWrapper triggerNode, 
+            ControlLoopCompilerCallback callback) {
+        Map<Policy, PolicyNodeWrapper> mapNodes = new HashMap<>();
+        for (Policy operPolicy : policy.getPolicies()) {
+            //
+            // Is it still ok to add?
+            //
+            if (!okToAdd(operPolicy, callback)) {
+                //
+                // Do not add it in
+                //
+                continue;
+            }
+            //
+            // Create wrapper policy node and save it into our map so we can
+            // easily retrieve it.
+            //
+            PolicyNodeWrapper node = new PolicyNodeWrapper(operPolicy);
+            mapNodes.put(operPolicy, node);
+            graph.addVertex(node);
+            //
+            // Is this the trigger policy?
+            //
+            if (operPolicy.getId().equals(policy.getControlLoop().getTrigger_policy())) {
+                //
+                // Yes add an edge from our trigger event node to this policy
+                //
+                graph.addEdge(triggerNode, node, new LabeledEdge(triggerNode, node, new TriggerEdgeWrapper("ONSET")));
+            }
+        }
+        return mapNodes;
+    }
+    
+    private static void addEdge(DirectedGraph<NodeWrapper, LabeledEdge> graph, Map<Policy, PolicyNodeWrapper> mapNodes,
+                    String policyId, String connectedPolicy, 
+                    FinalResultNodeWrapper finalResultNodeWrapper, 
+                    PolicyResult policyResult, NodeWrapper node) throws CompilerException {
+        FinalResult finalResult = FinalResult.toResult(finalResultNodeWrapper.getId());
+        if (FinalResult.isResult(connectedPolicy, finalResult)) {
+            graph.addEdge(node, finalResultNodeWrapper, new LabeledEdge(node, finalResultNodeWrapper, 
+                            new FinalResultEdgeWrapper(finalResult)));
+        } else {
+            PolicyNodeWrapper toNode = findPolicyNode(mapNodes, connectedPolicy);
+            if (toNode == null) {
+                throw new CompilerException(OPERATION_POLICY + policyId + " is connected to unknown policy " 
+            + connectedPolicy);
+            } else {
+                graph.addEdge(node, toNode, new LabeledEdge(node, toNode, new PolicyResultEdgeWrapper(policyResult)));
+            }
+        }
+    }
+    
+    private static void validateNodesAndEdges(DirectedGraph<NodeWrapper, LabeledEdge> graph, 
+                    ControlLoopCompilerCallback callback) throws CompilerException {
+        for (NodeWrapper node : graph.vertexSet()) {
+            if (node instanceof TriggerNodeWrapper) {
+                validateTriggerNodeWrapper(graph, node);
+            } else if (node instanceof FinalResultNodeWrapper) {
+                validateFinalResultNodeWrapper(graph, node);
+            } else if (node instanceof PolicyNodeWrapper) {
+                validatePolicyNodeWrapper(graph, node, callback);
+            }
+            for (LabeledEdge edge : graph.outgoingEdgesOf(node)) {
+                LOGGER.info("{} invokes {} upon {}", edge.from.getId(), edge.to.getId(), edge.edge.getId());
+            }
+        }
+    }
+    
+    private static void validateTriggerNodeWrapper(DirectedGraph<NodeWrapper, LabeledEdge> graph, 
+                    NodeWrapper node) throws CompilerException {
+        if (LOGGER.isDebugEnabled()) {
+            LOGGER.info("Trigger Node {}", node);
+        }
+        if (graph.inDegreeOf(node) > 0 ) {
+            //
+            // Really should NEVER get here unless someone messed up the code above.
+            //
+            throw new CompilerException("No inputs to event trigger");
+        }
+        //
+        // Should always be 1, except in the future we may support multiple events
+        //
+        if (graph.outDegreeOf(node) > 1) {
+            throw new CompilerException("The event trigger should only go to ONE node");
+        }
+    }
+    
+    private static void validateFinalResultNodeWrapper(DirectedGraph<NodeWrapper, LabeledEdge> graph, 
+                    NodeWrapper node) throws CompilerException {
+        if (LOGGER.isDebugEnabled()) {
+            LOGGER.info("FinalResult Node {}", node);
+        }
+        //
+        // FinalResult nodes should NEVER have an out edge
+        //
+        if (graph.outDegreeOf(node) > 0) {
+            throw new CompilerException("FinalResult nodes should never have any out edges.");
+        }
+    }
+    
+    private static void validatePolicyNodeWrapper(DirectedGraph<NodeWrapper, LabeledEdge> graph, 
+                    NodeWrapper node, ControlLoopCompilerCallback callback) throws CompilerException {
+        if (LOGGER.isDebugEnabled()) {
+            LOGGER.info("Policy Node {}", node);
+        }
+        //
+        // All Policy Nodes should have the 5 out degrees defined.
+        //
+        if (graph.outDegreeOf(node) != 6) {
+            throw new CompilerException("Policy node should ALWAYS have 6 out degrees.");
+        }
+        //
+        // All Policy Nodes should have at least 1 in degrees 
+        // 
+        if (graph.inDegreeOf(node) == 0 && callback != null) {
+            callback.onWarning("Policy " + node.getId() + " is not reachable.");
+        }
+    }
+    
+    private static boolean okToAdd(Policy operPolicy, ControlLoopCompilerCallback callback) {
+        boolean isOk = isPolicyIdOk(operPolicy, callback);
+        if (! isActorOk(operPolicy, callback)) {
+            isOk = false;
+        }
+        if (! isRecipeOk(operPolicy, callback)) {
+            isOk = false;
+        }
+        if (! isTargetOk(operPolicy, callback) ) {
+            isOk = false;
+        }
+        if (! arePolicyResultsOk(operPolicy, callback) ) {
+            isOk = false;
+        }
+        return isOk;
+    }
+    
+    private static boolean isPolicyIdOk(Policy operPolicy, ControlLoopCompilerCallback callback) {
+        boolean isOk = true;
+        if (operPolicy.getId() == null || operPolicy.getId().length() < 1) {
+            if (callback != null) {
+                callback.onError("Operational Policy has an bad ID");
+            }
+            isOk = false;
+        } else {
+            //
+            // Check if they decided to make the ID a result object
+            //
+            if (PolicyResult.toResult(operPolicy.getId()) != null) {
+                if (callback != null) {
+                    callback.onError("Policy id is set to a PolicyResult " + operPolicy.getId());
+                }
+                isOk = false;
+            }
+            if (FinalResult.toResult(operPolicy.getId()) != null) {
+                if (callback != null) {
+                    callback.onError("Policy id is set to a FinalResult " + operPolicy.getId());
+                }
+                isOk = false;
+            }
+        }
+        return isOk;
+    }
+    
+    private static boolean isActorOk(Policy operPolicy, ControlLoopCompilerCallback callback) {
+        boolean isOk = true;
+        if (operPolicy.getActor() == null) {
+            if (callback != null) {
+                callback.onError("Policy actor is null");
+            }
+            isOk = false;
+        }
+        //
+        // Construct a list for all valid actors
+        //
+        ImmutableList<String> actors = ImmutableList.of("APPC", "SDNC", "SDNR", "SO", "VFC");
+        //
+        if (operPolicy.getActor() != null && (!actors.contains(operPolicy.getActor())) ) {
+            if (callback != null) {
+                callback.onError("Policy actor is invalid");
+            }
+            isOk = false;
+        }
+        return isOk;
+    }
+    
+    private static boolean isRecipeOk(Policy operPolicy, ControlLoopCompilerCallback callback) {
+        boolean isOk = true;
+        if (operPolicy.getRecipe() == null) {
+            if (callback != null) {
+                callback.onError("Policy recipe is null");
+            }
+            isOk = false;
+        }
+        //
+        // NOTE: We need a way to find the acceptable recipe values (either Enum or a database that has these)
+        // 
+        ImmutableMap<String, List<String>> recipes = new ImmutableMap.Builder<String, List<String>>()
+                .put("APPC", ImmutableList.of("Restart", "Rebuild", "Migrate", "ModifyConfig"))
+                .put("SDNC", ImmutableList.of("Reroute"))
+                .put("SDNR", ImmutableList.of("ModifyConfig"))
+                .put("SO", ImmutableList.of("VF Module Create", "VF Module Delete"))
+                .put("VFC", ImmutableList.of("Restart"))
+                .build();
+        //
+        if (operPolicy.getRecipe() != null 
+                        && (!recipes.getOrDefault(operPolicy.getActor(), 
+                                        Collections.emptyList()).contains(operPolicy.getRecipe()))) {
+            if (callback != null) {
+                callback.onError("Policy recipe is invalid");
+            }
+            isOk = false;
+        }
+        return isOk;
+    }
+    
+    private static boolean isTargetOk(Policy operPolicy, ControlLoopCompilerCallback callback) {
+        boolean isOk = true;
+        if (operPolicy.getTarget() == null) {
+            if (callback != null) {
+                callback.onError("Policy target is null");
+            }
+            isOk = false;
+        }
+        if (operPolicy.getTarget() != null 
+                        && operPolicy.getTarget().getType() != TargetType.VM 
+                        && operPolicy.getTarget().getType() != TargetType.VFC 
+                        && operPolicy.getTarget().getType() != TargetType.PNF) {
+            if (callback != null) {
+                callback.onError("Policy target is invalid");
+            }
+            isOk = false;
+        }
+        return isOk;
+    }
+    
+    private static boolean arePolicyResultsOk(Policy operPolicy, ControlLoopCompilerCallback callback) {
+        //
+        // Check that policy results are connected to either default final * or another policy
+        //
+        boolean isOk = isSuccessPolicyResultOk(operPolicy, callback);
+        if (! isFailurePolicyResultOk(operPolicy, callback) ) {
+            isOk = false;
+        }
+        if (! isFailureRetriesPolicyResultOk(operPolicy, callback) ) {
+            isOk = false;
+        }
+        if (! isFailureTimeoutPolicyResultOk(operPolicy, callback) ) {
+            isOk = false;
+        }
+        if (! isFailureExceptionPolicyResultOk(operPolicy, callback) ) {
+            isOk = false;
+        }
+        if (! isFailureGuardPolicyResultOk(operPolicy, callback) ) {
+            isOk = false;
+        }
+        return isOk;
+    }
+    
+    private static boolean isSuccessPolicyResultOk(Policy operPolicy, ControlLoopCompilerCallback callback) {
+        boolean isOk = true;
+        if (FinalResult.toResult(operPolicy.getSuccess()) != null 
+                        && !operPolicy.getSuccess().equals(FinalResult.FINAL_SUCCESS.toString())) {
+            if (callback != null) {
+                callback.onError("Policy success is neither another policy nor FINAL_SUCCESS");
+            }
+            isOk = false;
+        }
+        return isOk;
+    }
+    
+    private static boolean isFailurePolicyResultOk(Policy operPolicy, ControlLoopCompilerCallback callback) {
+        boolean isOk = true;
+        if (FinalResult.toResult(operPolicy.getFailure()) != null 
+                        && !operPolicy.getFailure().equals(FinalResult.FINAL_FAILURE.toString())) {
+            if (callback != null) {
+                callback.onError("Policy failure is neither another policy nor FINAL_FAILURE");
+            }
+            isOk = false;
+        }
+        return isOk;
+    }
+    
+    private static boolean isFailureRetriesPolicyResultOk(Policy operPolicy, ControlLoopCompilerCallback callback) {
+        boolean isOk = true;
+        if (FinalResult.toResult(operPolicy.getFailure_retries()) != null 
+                        && !operPolicy.getFailure_retries().equals(FinalResult.FINAL_FAILURE_RETRIES.toString())) {
+            if (callback != null) {
+                callback.onError("Policy failure retries is neither another policy nor FINAL_FAILURE_RETRIES");
+            }
+            isOk = false;
+        }
+        return isOk;
+    }
+    
+    private static boolean isFailureTimeoutPolicyResultOk(Policy operPolicy, ControlLoopCompilerCallback callback) {
+        boolean isOk = true;
+        if (FinalResult.toResult(operPolicy.getFailure_timeout()) != null 
+                        && !operPolicy.getFailure_timeout().equals(FinalResult.FINAL_FAILURE_TIMEOUT.toString())) {
+            if (callback != null) {
+                callback.onError("Policy failure timeout is neither another policy nor FINAL_FAILURE_TIMEOUT");
+            }
+            isOk = false;
+        }
+        return isOk;
+    }
+    
+    private static boolean isFailureExceptionPolicyResultOk(Policy operPolicy, ControlLoopCompilerCallback callback) {
+        boolean isOk = true;
+        if (FinalResult.toResult(operPolicy.getFailure_exception()) != null 
+                        && !operPolicy.getFailure_exception().equals(FinalResult.FINAL_FAILURE_EXCEPTION.toString())) {
+            if (callback != null) {
+                callback.onError("Policy failure exception is neither another policy nor FINAL_FAILURE_EXCEPTION");
+            }
+            isOk = false;
+        }
+        return isOk;
+    }
+    
+    private static boolean isFailureGuardPolicyResultOk(Policy operPolicy, ControlLoopCompilerCallback callback) {
+        boolean isOk = true;
+        if (FinalResult.toResult(operPolicy.getFailure_guard()) != null 
+                        && !operPolicy.getFailure_guard().equals(FinalResult.FINAL_FAILURE_GUARD.toString())) {
+            if (callback != null) {
+                callback.onError("Policy failure guard is neither another policy nor FINAL_FAILURE_GUARD");
+            }
+            isOk = false;
+        }
+        return isOk;
+    }
+
+    private static PolicyNodeWrapper findPolicyNode(Map<Policy, PolicyNodeWrapper> mapNodes, String id) {
+        for (Entry<Policy, PolicyNodeWrapper> entry : mapNodes.entrySet()) {
+            if (entry.getKey().getId().equals(id)) {
+                return entry.getValue();
+            }
+        }
+        return null;
+    }
+    
+    @FunctionalInterface
+    private interface NodeWrapper extends Serializable {
+        public String   getId();
+    }
+    
+    private static class TriggerNodeWrapper implements NodeWrapper {
+        private static final long serialVersionUID = -187644087811478349L;
+        private String closedLoopControlName;
+        
+        public TriggerNodeWrapper(String closedLoopControlName) {
+            this.closedLoopControlName = closedLoopControlName;
+        }
+
+        @Override
+        public String toString() {
+            return "TriggerNodeWrapper [closedLoopControlName=" + closedLoopControlName + "]";
+        }
+
+        @Override
+        public String getId() {
+            return closedLoopControlName;
+        }
+        
+    }
+        
+    private static class FinalResultNodeWrapper implements NodeWrapper {
+        private static final long serialVersionUID = 8540008796302474613L;
+        private FinalResult result;
+
+        public FinalResultNodeWrapper(FinalResult result) {
+            this.result = result;
+        }
+
+        @Override
+        public String toString() {
+            return "FinalResultNodeWrapper [result=" + result + "]";
+        }
+
+        @Override
+        public String getId() {
+            return result.toString();
+        }
+    }
+    
+    private static class PolicyNodeWrapper implements NodeWrapper {
+        private static final long serialVersionUID = 8170162175653823082L;
+        private transient Policy policy;
+        
+        public PolicyNodeWrapper(Policy operPolicy) {
+            this.policy = operPolicy;
+        }
+
+        @Override
+        public String toString() {
+            return "PolicyNodeWrapper [policy=" + policy + "]";
+        }
+
+        @Override
+        public String getId() {
+            return policy.getId();
+        }
+    }
+    
+    @FunctionalInterface
+    private interface EdgeWrapper extends Serializable {
+        public String getId();
+        
+    }
+    
+    private static class TriggerEdgeWrapper implements EdgeWrapper {
+        private static final long serialVersionUID = 2678151552623278863L;
+        private String trigger;
+        
+        public TriggerEdgeWrapper(String trigger) {
+            this.trigger = trigger;
+        }
+
+        @Override
+        public String getId() {
+            return trigger;
+        }
+
+        @Override
+        public String toString() {
+            return "TriggerEdgeWrapper [trigger=" + trigger + "]";
+        }
+        
+    }
+    
+    private static class PolicyResultEdgeWrapper implements EdgeWrapper {
+        private static final long serialVersionUID = 6078569477021558310L;
+        private PolicyResult policyResult;
+
+        public PolicyResultEdgeWrapper(PolicyResult policyResult) {
+            super();
+            this.policyResult = policyResult;
+        }
+
+        @Override
+        public String toString() {
+            return "PolicyResultEdgeWrapper [policyResult=" + policyResult + "]";
+        }
+
+        @Override
+        public String getId() {
+            return policyResult.toString();
+        }
+        
+        
+    }
+    
+    private static class FinalResultEdgeWrapper implements EdgeWrapper {
+        private static final long serialVersionUID = -1486381946896779840L;
+        private FinalResult finalResult;
+        
+        public FinalResultEdgeWrapper(FinalResult result) {
+            this.finalResult = result;
+        }
+
+        @Override
+        public String toString() {
+            return "FinalResultEdgeWrapper [finalResult=" + finalResult + "]";
+        }
+        
+        @Override
+        public String getId() {
+            return finalResult.toString();
+        }
+    }
+    
+    
+    private static class LabeledEdge extends DefaultEdge {
+        private static final long serialVersionUID = 579384429573385524L;
+        
+        private NodeWrapper from;
+        private NodeWrapper to;
+        private EdgeWrapper edge;
+        
+        public LabeledEdge(NodeWrapper from, NodeWrapper to, EdgeWrapper edge) {
+            this.from = from;
+            this.to = to;
+            this.edge = edge;
+        }
+        
+        @SuppressWarnings("unused")
+        public NodeWrapper from() {
+            return from;
+        }
+        
+        @SuppressWarnings("unused")
+        public NodeWrapper to() {
+            return to;
+        }
+        
+        @SuppressWarnings("unused")
+        public EdgeWrapper edge() {
+            return edge;
+        }
+
+        @Override
+        public String toString() {
+            return "LabeledEdge [from=" + from + ", to=" + to + ", edge=" + edge + "]";
+        }
+    }
+
+}
diff --git a/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/compiler/ControlLoopCompilerCallback.java b/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/compiler/ControlLoopCompilerCallback.java
new file mode 100644
index 0000000..e59ce34
--- /dev/null
+++ b/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/compiler/ControlLoopCompilerCallback.java
@@ -0,0 +1,30 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * policy-yaml
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2019 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.controlloop.compiler;
+
+public interface ControlLoopCompilerCallback {
+
+    public boolean onWarning(String message);
+
+    public boolean onError(String message);
+
+}
diff --git a/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/guard/compiler/ControlLoopGuardCompiler.java b/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/guard/compiler/ControlLoopGuardCompiler.java
new file mode 100644
index 0000000..435963a
--- /dev/null
+++ b/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/guard/compiler/ControlLoopGuardCompiler.java
@@ -0,0 +1,158 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * policy-yaml
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2019 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.controlloop.guard.compiler;
+
+import java.io.InputStream;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.onap.policy.controlloop.compiler.CompilerException;
+import org.onap.policy.controlloop.compiler.ControlLoopCompilerCallback;
+import org.onap.policy.controlloop.policy.guard.Constraint;
+import org.onap.policy.controlloop.policy.guard.ControlLoopGuard;
+import org.onap.policy.controlloop.policy.guard.GuardPolicy;
+import org.yaml.snakeyaml.Yaml;
+import org.yaml.snakeyaml.constructor.Constructor;
+
+public class ControlLoopGuardCompiler {
+    
+    private static final String GUARD_POLICIES_SHOULD_NOT_BE_NULL = "Guard policies should not be null";
+    private static final String GUARD_POLICY = "Guard policy ";
+
+    private ControlLoopGuardCompiler(){
+        // Private Constructor 
+    }
+    
+    /**
+     * Compile the control loop guard.
+     * 
+     * @param clGuard the guard
+     * @param callback callback routine
+     * @return the guard object
+     * @throws CompilerException compilation exception
+     */
+    public static ControlLoopGuard compile(ControlLoopGuard clGuard, 
+                    ControlLoopCompilerCallback callback) throws CompilerException {
+        //
+        // Ensure ControlLoopGuard has at least one guard policies
+        //
+        validateControlLoopGuard(clGuard, callback);
+        //
+        // Ensure each guard policy has at least one constraints and all guard policies are unique
+        //
+        validateGuardPolicies(clGuard.getGuards(), callback);
+        //
+        // Ensure constraints for each guard policy are unique
+        //
+        validateConstraints(clGuard.getGuards(), callback);
+        
+        return clGuard;
+    }
+    
+    /**
+     * Compile the control loop guard.
+     * 
+     * @param yamlSpecification yaml specification as a stream
+     * @param callback callback method
+     * @return guard object
+     * @throws CompilerException throws compile exception
+     */
+    public static ControlLoopGuard  compile(InputStream yamlSpecification, 
+                    ControlLoopCompilerCallback callback) throws CompilerException {
+        Yaml yaml = new Yaml(new Constructor(ControlLoopGuard.class));
+        Object obj = yaml.load(yamlSpecification);
+        if (obj == null) {
+            throw new CompilerException("Could not parse yaml specification.");
+        }
+        if (! (obj instanceof ControlLoopGuard)) {
+            throw new CompilerException("Yaml could not parse specification into required ControlLoopGuard object");
+        }
+        return ControlLoopGuardCompiler.compile((ControlLoopGuard) obj, callback);
+    }
+    
+    private static void validateControlLoopGuard(ControlLoopGuard clGuard, 
+                    ControlLoopCompilerCallback callback) throws CompilerException {
+        if (clGuard == null) {
+            if (callback != null) {
+                callback.onError("ControlLoop Guard cannot be null");
+            }
+            throw new CompilerException("ControlLoop Guard cannot be null");
+        }
+        if (clGuard.getGuard() == null && callback != null) {
+            callback.onError("Guard version cannot be null");
+        }
+        if (clGuard.getGuards() == null) {
+            if (callback != null) {
+                callback.onError("ControlLoop Guard should have at least one guard policies");
+            }
+        } else if (clGuard.getGuards().isEmpty() && callback != null) {
+            callback.onError("ControlLoop Guard should have at least one guard policies");
+        }
+    }
+    
+    private static void validateGuardPolicies(List<GuardPolicy> policies, 
+                    ControlLoopCompilerCallback callback) throws CompilerException {
+        if (policies == null) {
+            if (callback != null) {
+                callback.onError(GUARD_POLICIES_SHOULD_NOT_BE_NULL);
+            }
+            throw new CompilerException(GUARD_POLICIES_SHOULD_NOT_BE_NULL);
+        }
+        //
+        // Ensure all guard policies are unique
+        //
+        Set<GuardPolicy> newSet = new HashSet<>(policies);
+        if (newSet.size() != policies.size() && callback != null) {
+            callback.onWarning("There are duplicate guard policies");
+        }
+        //
+        // Ensure each guard policy has at least one constraints
+        //
+        for (GuardPolicy policy : policies) {
+            if (policy.getLimit_constraints() == null || policy.getLimit_constraints().isEmpty()) {
+                if (callback != null) {
+                    callback.onError(GUARD_POLICY + policy.getName() + " does not have any limit constraint");
+                }
+                throw new CompilerException(GUARD_POLICY + policy.getName() + " does not have any limit constraint");
+            }
+        }
+    }
+    
+    private static void validateConstraints(List<GuardPolicy> policies, 
+                    ControlLoopCompilerCallback callback) throws CompilerException {
+        if (policies == null) {
+            if (callback != null) {
+                callback.onError(GUARD_POLICIES_SHOULD_NOT_BE_NULL);
+            }
+            throw new CompilerException(GUARD_POLICIES_SHOULD_NOT_BE_NULL);
+        }
+        for (GuardPolicy policy : policies) {
+            Set<Constraint> newSet = new HashSet<>(policy.getLimit_constraints());
+            if (newSet.size() != policy.getLimit_constraints().size() && callback != null) {
+                callback.onWarning(GUARD_POLICY + policy.getName() + " has duplicate limit constraints");
+            }
+        }
+    }
+    
+}
diff --git a/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/ControlLoop.java b/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/ControlLoop.java
new file mode 100644
index 0000000..fc3d823
--- /dev/null
+++ b/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/ControlLoop.java
@@ -0,0 +1,188 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * policy-yaml
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2019 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.controlloop.policy;
+
+import java.io.Serializable;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.onap.policy.aai.Pnf;
+import org.onap.policy.sdc.Resource;
+import org.onap.policy.sdc.Service;
+
+public class ControlLoop implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private static final String COMPILER_VERSION = "2.0.0";
+
+    private String controlLoopName;
+    private String version = COMPILER_VERSION;
+    private List<Service> services;
+    private List<Resource> resources;
+    private Pnf pnf;
+    private String triggerPolicy = FinalResult.FINAL_OPENLOOP.toString();
+    private Integer timeout;
+    private Boolean abatement = false;
+
+    public ControlLoop() {
+        // Empty Constructor.
+    }
+
+    /**
+     * Constructor.
+     * 
+     * @param controlLoop copy object
+     */
+    public ControlLoop(ControlLoop controlLoop) {
+        this.controlLoopName = controlLoop.controlLoopName;
+        this.services = new LinkedList<>();
+        if (controlLoop.services != null) {
+            for (Service service : controlLoop.services) {
+                this.services.add(service);
+            }
+        }
+        this.resources = new LinkedList<>();
+        if (controlLoop.resources != null) {
+            for (Resource resource : controlLoop.resources) {
+                this.resources.add(resource);
+            }
+        }
+        this.triggerPolicy = controlLoop.triggerPolicy;
+        this.timeout = controlLoop.timeout;
+        this.abatement = controlLoop.abatement;
+    }
+
+    public static String getCompilerVersion() {
+        return ControlLoop.COMPILER_VERSION;
+    }
+
+    public String getControlLoopName() {
+        return controlLoopName;
+    }
+
+    public void setControlLoopName(String controlLoopName) {
+        this.controlLoopName = controlLoopName;
+    }
+
+    public List<Service> getServices() {
+        return services;
+    }
+
+    public void setServices(List<Service> services) {
+        this.services = services;
+    }
+
+    public List<Resource> getResources() {
+        return resources;
+    }
+
+    public void setResources(List<Resource> resources) {
+        this.resources = resources;
+    }
+
+    public String getTrigger_policy() {
+        return triggerPolicy;
+    }
+
+    public void setTrigger_policy(String triggerPolicy) {
+        this.triggerPolicy = triggerPolicy;
+    }
+
+    public Integer getTimeout() {
+        return timeout;
+    }
+
+    public void setTimeout(Integer timeout) {
+        this.timeout = timeout;
+    }
+
+    public Boolean getAbatement() {
+        return abatement;
+    }
+
+    public void setAbatement(Boolean abatement) {
+        this.abatement = abatement;
+    }
+
+    public String getVersion() {
+        return version;
+    }
+
+    public void setVersion(String version) {
+        this.version = version;
+    }
+
+    public Pnf getPnf() {
+        return pnf;
+    }
+
+    public void setPnf(Pnf pnf) {
+        this.pnf = pnf;
+    }
+
+    @Override
+    public String toString() {
+        return "ControlLoop [controlLoopName=" + controlLoopName + ", version=" + version + ", services=" + services
+                + ", resources=" + resources + ", trigger_policy=" + triggerPolicy + ", timeout=" + timeout
+                + ", abatement=" + abatement + "]";
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((controlLoopName == null) ? 0 : controlLoopName.hashCode());
+        result = prime * result + ((resources == null) ? 0 : resources.hashCode());
+        result = prime * result + ((services == null) ? 0 : services.hashCode());
+        result = prime * result + ((timeout == null) ? 0 : timeout.hashCode());
+        result = prime * result + ((triggerPolicy == null) ? 0 : triggerPolicy.hashCode());
+        result = prime * result + ((version == null) ? 0 : version.hashCode());
+        result = prime * result + ((abatement == null) ? 0 : abatement.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null) {
+            return false;
+        }
+        if (getClass() != obj.getClass()) {
+            return false;
+        }
+        ControlLoop other = (ControlLoop) obj;
+        return equalsMayBeNull(controlLoopName, other.controlLoopName) && equalsMayBeNull(resources, other.resources)
+                && equalsMayBeNull(services, other.services) && equalsMayBeNull(timeout, other.timeout)
+                && equalsMayBeNull(triggerPolicy, other.triggerPolicy) && equalsMayBeNull(version, other.version)
+                && equalsMayBeNull(abatement, other.abatement);
+    }
+
+    private boolean equalsMayBeNull(final Object obj1, final Object obj2) {
+        if (obj1 == null) {
+            return obj2 == null;
+        }
+        return obj1.equals(obj2);
+    }
+
+}
diff --git a/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/ControlLoopPolicy.java b/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/ControlLoopPolicy.java
new file mode 100644
index 0000000..e90182d
--- /dev/null
+++ b/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/ControlLoopPolicy.java
@@ -0,0 +1,93 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * policy-yaml
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2019 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.controlloop.policy;
+
+import java.io.Serializable;
+import java.util.List;
+
+public class ControlLoopPolicy implements Serializable {
+    private static final long serialVersionUID = 1L;
+    
+    private ControlLoop controlLoop;
+
+    private List<Policy> policies;
+
+    public ControlLoop getControlLoop() {
+        return controlLoop;
+    }
+
+    public void setControlLoop(ControlLoop controlLoop) {
+        this.controlLoop = controlLoop;
+    }
+
+    public List<Policy> getPolicies() {
+        return policies;
+    }
+
+    public void setPolicies(List<Policy> policies) {
+        this.policies = policies;
+    }
+
+    @Override
+    public String toString() {
+        return "ControlLoopPolicy [controlLoop=" + controlLoop + ", policies=" + policies + "]";
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((controlLoop == null) ? 0 : controlLoop.hashCode());
+        result = prime * result + ((policies == null) ? 0 : policies.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null) {
+            return false;
+        }
+        if (getClass() != obj.getClass()) {
+            return false;
+        }
+        ControlLoopPolicy other = (ControlLoopPolicy) obj;
+        if (controlLoop == null) {
+            if (other.controlLoop != null) {
+                return false;
+            }
+        } else if (!controlLoop.equals(other.controlLoop)) {
+            return false;
+        }
+        if (policies == null) {
+            if (other.policies != null) {
+                return false;
+            }
+        } else if (!policies.equals(other.policies)) {
+            return false;
+        }
+        return true;
+    }
+
+}
diff --git a/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/FinalResult.java b/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/FinalResult.java
new file mode 100644
index 0000000..bd49484
--- /dev/null
+++ b/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/FinalResult.java
@@ -0,0 +1,108 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * policy-yaml
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2019 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.controlloop.policy;
+
+public enum FinalResult {
+    /**
+     * The Control Loop Policy successfully completed its Operations.
+     */
+    FINAL_SUCCESS("Final_Success"),
+    /**
+     * The Control Loop Policy was an Open Loop and is finished.
+     */
+    FINAL_OPENLOOP("Final_OpenLoop"),
+    /**
+     * The Control Loop Policy failed in its last Operation Policy. 
+     * NOTE: Previous Operation Policies may have been successful.
+     */
+    FINAL_FAILURE("Final_Failure"),
+    /**
+     * The Control Loop Policy failed because the overall timeout was met.
+     */
+    FINAL_FAILURE_TIMEOUT("Final_Failure_Timeout"),
+    /**
+     * The Control Loop Policy failed because an Operation Policy met its retry limit.
+     */
+    FINAL_FAILURE_RETRIES("Final_Failure_Retries"),
+    /**
+     * The Control Loop Policy failed due to an exception.
+     */
+    FINAL_FAILURE_EXCEPTION("Final_Failure_Exception"), 
+    /**
+     *  The Control Loop Policy failed due to guard denied.
+     */
+    FINAL_FAILURE_GUARD("Final_Failure_Guard")
+    ;
+    
+    String result;
+    
+    private FinalResult(String result) {
+        this.result = result;
+    }
+    
+    /**
+     * Converts to a result object.
+     * 
+     * @param result input string
+     * @return result object
+     */
+    public static FinalResult toResult(String result) {
+        if (result.equalsIgnoreCase(FINAL_SUCCESS.toString())) {
+            return FINAL_SUCCESS;
+        }
+        if (result.equalsIgnoreCase(FINAL_OPENLOOP.toString())) {
+            return FINAL_OPENLOOP;
+        }
+        if (result.equalsIgnoreCase(FINAL_FAILURE.toString())) {
+            return FINAL_FAILURE;
+        }
+        if (result.equalsIgnoreCase(FINAL_FAILURE_TIMEOUT.toString())) {
+            return FINAL_FAILURE_TIMEOUT;
+        }
+        if (result.equalsIgnoreCase(FINAL_FAILURE_RETRIES.toString())) {
+            return FINAL_FAILURE_RETRIES;
+        }
+        if (result.equalsIgnoreCase(FINAL_FAILURE_EXCEPTION.toString())) {
+            return FINAL_FAILURE_EXCEPTION;
+        }
+        if (result.equalsIgnoreCase(FINAL_FAILURE_GUARD.toString())) {
+            return FINAL_FAILURE_GUARD;
+        }
+        return null;
+    }
+    
+    /**
+     * Check if the result really is a result.
+     * 
+     * @param result string
+     * @param finalResult result object
+     * @return true if a result
+     */
+    public static boolean isResult(String result, FinalResult finalResult) {
+        FinalResult toResult = FinalResult.toResult(result);
+        if (toResult == null) {
+            return false;
+        }
+        return toResult.equals(finalResult);
+    }
+
+}
diff --git a/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/OperationsAccumulateParams.java b/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/OperationsAccumulateParams.java
new file mode 100644
index 0000000..07312db
--- /dev/null
+++ b/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/OperationsAccumulateParams.java
@@ -0,0 +1,106 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * policy-yaml
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2019 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.controlloop.policy;
+
+import java.io.Serializable;
+
+public class OperationsAccumulateParams implements Serializable {
+
+    private static final long serialVersionUID = -3597358159130168247L;
+    
+    private String period;
+    private Integer limit;
+    
+    public OperationsAccumulateParams() {
+        // Does Nothing 
+    } 
+    
+    public OperationsAccumulateParams(OperationsAccumulateParams ops) {
+        this.period = ops.period;
+        this.limit = ops.limit;
+    }
+    
+    public OperationsAccumulateParams(String period, Integer limit) {
+        this.period = period;
+        this.limit = limit;
+    }
+    
+    public String getPeriod() {
+        return period;
+    }
+
+    public void setPeriod(String period) {
+        this.period = period;
+    }
+
+    public Integer getLimit() {
+        return limit;
+    }
+
+    public void setLimit(Integer limit) {
+        this.limit = limit;
+    }
+
+    @Override
+    public String toString() {
+        return "OperationsAccumulateParams [period=" + period + ", limit=" + limit + "]";
+    }
+    
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((period == null) ? 0 : period.hashCode());
+        result = prime * result + ((limit == null) ? 0 : limit.hashCode());
+        return result;
+    }
+    
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null) {
+            return false;
+        }
+        if (getClass() != obj.getClass()) {
+            return false;
+        }
+        OperationsAccumulateParams other = (OperationsAccumulateParams) obj;
+        if (period == null) {
+            if (other.period != null) {
+                return false;
+            }
+        } else if (!period.equals(other.period)) {
+            return false;
+        }
+        if (limit == null) {
+            if (other.limit != null) {
+                return false;
+            }
+        } else if (!limit.equals(other.limit)) {
+            return false;
+        }
+        return true;
+    }
+
+}
diff --git a/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/Policy.java b/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/Policy.java
new file mode 100644
index 0000000..af50eaa
--- /dev/null
+++ b/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/Policy.java
@@ -0,0 +1,337 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * policy-yaml
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2019 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.controlloop.policy;
+
+import java.io.Serializable;
+import java.util.Collections;
+import java.util.Map;
+import java.util.UUID;
+
+public class Policy implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private String id = UUID.randomUUID().toString();
+    private String name;
+    private String description;
+    private String actor;
+    private String recipe;
+    private Map<String, String> payload;
+    private Target target;
+    private OperationsAccumulateParams operationsAccumulateParams;
+    private Integer retry = 0;
+    private Integer timeout = 300;
+    private String success = FinalResult.FINAL_SUCCESS.toString();
+    private String failure = FinalResult.FINAL_FAILURE.toString();
+    private String failureRetries = FinalResult.FINAL_FAILURE_RETRIES.toString();
+    private String failureTimeout = FinalResult.FINAL_FAILURE_TIMEOUT.toString();
+    private String failureException = FinalResult.FINAL_FAILURE_EXCEPTION.toString();
+    private String failureGuard = FinalResult.FINAL_FAILURE_GUARD.toString();
+    
+    
+    public Policy() {
+        //Does Nothing Empty Constructor
+    }
+    
+    public Policy(String id) {
+        this.id = id;
+    }
+    
+    /**
+     * Constructor.
+     * 
+     * @param name name
+     * @param actor actor
+     * @param recipe recipe
+     * @param payload payload
+     * @param target target
+     */
+    public Policy(String name, String actor, String recipe, Map<String, String> payload, Target target) {
+        this.name = name;
+        this.actor = actor;
+        this.recipe = recipe;
+        this.target = target;
+        if (payload != null) {
+            this.payload = Collections.unmodifiableMap(payload);
+        }
+    }
+    
+    /**
+     * Constructor.
+     * 
+     * @param name name
+     * @param actor actor
+     * @param recipe recipe
+     * @param payload payload
+     * @param target target
+     * @param retries retries
+     * @param timeout timeout
+     */
+    public Policy(String name, String actor, String recipe, Map<String, String> payload, Target target,
+                  Integer retries, Integer timeout) {
+        this(name, actor, recipe, payload, target);
+        this.retry = retries;
+        this.timeout = timeout;
+    }
+    
+    /**
+     * Constructor.
+     *
+     * @param policyParam provide parameter object
+     */
+    public Policy(PolicyParam policyParam) {
+        this(policyParam.getName(), policyParam.getActor(), policyParam.getRecipe(), policyParam.getPayload(),
+                policyParam.getTarget(), policyParam.getRetries(), policyParam.getTimeout());
+        this.id = policyParam.getId();
+        this.description = policyParam.getDescription();
+    }
+    
+    /**
+     * Constructor.
+     * 
+     * @param policy copy object
+     */
+    public Policy(Policy policy) {
+        this.id = policy.id;
+        this.name = policy.name;
+        this.description = policy.description;
+        this.actor = policy.actor;
+        this.recipe = policy.recipe;
+        if (policy.payload != null) {
+            this.payload = Collections.unmodifiableMap(policy.payload);
+        }
+        this.target = policy.target;
+        this.operationsAccumulateParams = policy.operationsAccumulateParams;
+        this.retry = policy.retry;
+        this.timeout = policy.timeout;
+        this.success = policy.success;
+        this.failure = policy.failure;
+        this.failureException = policy.failureException;
+        this.failureGuard = policy.failureGuard;
+        this.failureRetries = policy.failureRetries;
+        this.failureTimeout = policy.failureTimeout;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public String getActor() {
+        return actor;
+    }
+
+    public void setActor(String actor) {
+        this.actor = actor;
+    }
+
+    public String getRecipe() {
+        return recipe;
+    }
+
+    public void setRecipe(String recipe) {
+        this.recipe = recipe;
+    }
+
+    public Map<String, String> getPayload() {
+        return payload;
+    }
+
+    public void setPayload(Map<String, String> payload) {
+        this.payload = payload;
+    }
+
+    public Target getTarget() {
+        return target;
+    }
+
+    public void setTarget(Target target) {
+        this.target = target;
+    }
+
+    public OperationsAccumulateParams getOperationsAccumulateParams() {
+        return operationsAccumulateParams;
+    }
+
+    public void setOperationsAccumulateParams(OperationsAccumulateParams operationsAccumulateParams) {
+        this.operationsAccumulateParams = operationsAccumulateParams;
+    }
+
+    public Integer getRetry() {
+        return retry;
+    }
+
+    public void setRetry(Integer retry) {
+        this.retry = retry;
+    }
+
+    public Integer getTimeout() {
+        return timeout;
+    }
+
+    public void setTimeout(Integer timeout) {
+        this.timeout = timeout;
+    }
+
+    public String getSuccess() {
+        return success;
+    }
+
+    public void setSuccess(String success) {
+        this.success = success;
+    }
+
+    public String getFailure() {
+        return failure;
+    }
+
+    public void setFailure(String failure) {
+        this.failure = failure;
+    }
+
+    public String getFailure_retries() {
+        return failureRetries;
+    }
+
+    public void setFailure_retries(String failureRetries) {
+        this.failureRetries = failureRetries;
+    }
+
+    public String getFailure_timeout() {
+        return failureTimeout;
+    }
+
+    public void setFailure_timeout(String failureTimeout) {
+        this.failureTimeout = failureTimeout;
+    }
+
+    public String getFailure_exception() {
+        return failureException;
+    }
+
+    public void setFailure_exception(String failureException) {
+        this.failureException = failureException;
+    }
+
+    public String getFailure_guard() {
+        return failureGuard;
+    }
+
+    public void setFailure_guard(String failureGuard) {
+        this.failureGuard = failureGuard;
+    }
+
+    public boolean isValid() {
+        return id != null && name != null && actor != null && recipe != null && target != null;
+    }
+
+    @Override
+    public String toString() {
+        return "Policy [id=" + id + ", name=" + name + ", description=" + description + ", actor=" + actor + ", recipe="
+                + recipe + ", payload=" + payload + ", target=" + target + ", operationsAccumulateParams=" 
+                + operationsAccumulateParams + ", retry=" + retry + ", timeout=" + timeout
+                + ", success=" + success + ", failure=" + failure + ", failure_retries=" + failureRetries
+                + ", failure_timeout=" + failureTimeout + ", failure_exception=" + failureException
+                + ", failure_guard=" + failureGuard + "]";
+    }
+
+    @Override
+    public int hashCode() {
+        int result = 1;
+        result = addHashCodeForField(result, actor);
+        result = addHashCodeForField(result, description);
+        result = addHashCodeForField(result, failure);
+        result = addHashCodeForField(result, failureException);
+        result = addHashCodeForField(result, failureGuard);
+        result = addHashCodeForField(result, failureRetries);
+        result = addHashCodeForField(result, failureTimeout);
+        result = addHashCodeForField(result, id);
+        result = addHashCodeForField(result, name);
+        result = addHashCodeForField(result, payload);
+        result = addHashCodeForField(result, recipe);
+        result = addHashCodeForField(result, retry);
+        result = addHashCodeForField(result, success);
+        result = addHashCodeForField(result, target);
+        result = addHashCodeForField(result, operationsAccumulateParams);
+        result = addHashCodeForField(result, timeout);
+        return result;
+    }
+    
+    private int addHashCodeForField(int hashCode, Object field) {
+        final int prime = 31;
+        return prime * hashCode + ((field == null) ? 0 : field.hashCode());
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null) {
+            return false;
+        }
+        if (getClass() != obj.getClass()) {
+            return false;
+        }
+        Policy other = (Policy) obj;
+        return equalsMayBeNull(actor, other.actor)
+                && equalsMayBeNull(description, other.description)
+                && equalsMayBeNull(failure, other.failure)
+                && equalsMayBeNull(failureException, other.failureException)
+                && equalsMayBeNull(failureGuard, other.failureGuard)
+                && equalsMayBeNull(failureRetries, other.failureRetries)
+                && equalsMayBeNull(id, other.id)
+                && equalsMayBeNull(name, other.name)
+                && equalsMayBeNull(payload, other.payload)
+                && equalsMayBeNull(recipe, other.recipe)
+                && equalsMayBeNull(retry, other.retry)
+                && equalsMayBeNull(success, other.success)
+                && equalsMayBeNull(operationsAccumulateParams, other.operationsAccumulateParams)
+                && equalsMayBeNull(target, other.target)
+                && equalsMayBeNull(timeout, other.timeout);
+    }
+    
+    private boolean equalsMayBeNull(final Object obj1, final Object obj2) {
+        if ( obj1 == null ) {
+            return obj2 == null;
+        }
+        return obj1.equals(obj2);
+    }
+}
diff --git a/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/PolicyParam.java b/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/PolicyParam.java
new file mode 100644
index 0000000..ab4e7f8
--- /dev/null
+++ b/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/PolicyParam.java
@@ -0,0 +1,133 @@
+/*
+ * ============LICENSE_START=======================================================
+ * policy-endpoints
+ * ================================================================================
+ * Copyright (C) 2018 Samsung Electronics Co., Ltd. All rights reserved.
+ * Modifications Copyright (C) 2019 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.controlloop.policy;
+
+import java.util.Map;
+
+public class PolicyParam {
+    private String id;
+    private String name;
+    private String description;
+    private String actor;
+    private Map<String, String> payload;
+    private Target target;
+    private String recipe;
+    private Integer retries;
+    private Integer timeout;
+
+    public static PolicyParamBuilder builder() {
+        return  new PolicyParamBuilder();
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public String getActor() {
+        return actor;
+    }
+
+    public Map<String, String> getPayload() {
+        return payload;
+    }
+
+    public Target getTarget() {
+        return target;
+    }
+
+    public String getRecipe() {
+        return recipe;
+    }
+
+    public Integer getRetries() {
+        return retries;
+    }
+
+    public Integer getTimeout() {
+        return timeout;
+    }
+
+    public static class PolicyParamBuilder {
+
+        PolicyParam policyParm = new PolicyParam();
+
+        private PolicyParamBuilder() {
+        }
+
+        public PolicyParam build() {
+            return policyParm;
+        }
+
+        public PolicyParamBuilder id(String id) {
+            policyParm.id = id;
+            return this;
+        }
+
+        public PolicyParamBuilder name(String name) {
+            policyParm.name = name;
+            return this;
+        }
+
+        public PolicyParamBuilder description(String description) {
+            policyParm.description = description;
+            return this;
+        }
+
+        public PolicyParamBuilder actor(String actor) {
+            policyParm.actor = actor;
+            return this;
+        }
+
+        public PolicyParamBuilder payload(Map<String, String> payload) {
+            policyParm.payload = payload;
+            return this;
+        }
+
+        public PolicyParamBuilder target(Target target) {
+            policyParm.target = target;
+            return this;
+        }
+
+        public PolicyParamBuilder recipe(String recipe) {
+            policyParm.recipe = recipe;
+            return this;
+        }
+
+        public PolicyParamBuilder retries(Integer retries) {
+            policyParm.retries = retries;
+            return this;
+        }
+
+        public PolicyParamBuilder timeout(Integer timeout) {
+            policyParm.timeout = timeout;
+            return this;
+        }
+    }
+}
\ No newline at end of file
diff --git a/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/PolicyResult.java b/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/PolicyResult.java
new file mode 100644
index 0000000..80a6824
--- /dev/null
+++ b/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/PolicyResult.java
@@ -0,0 +1,90 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * policy-yaml
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2019 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.controlloop.policy;
+
+public enum PolicyResult {
+    /**
+     * Operation was successful.
+     */
+    SUCCESS("Success"),
+    /**
+     * Operation failed.
+     */
+    FAILURE("Failure"),
+    /**
+     * Operation failed due to maximum retries being met.
+     */
+    FAILURE_RETRIES("Failure_Retries"),
+    /**
+     * Operation failed due to timeout occurring.
+     */
+    FAILURE_TIMEOUT("Failure_Timeout"),
+    /**
+     * Operation failed due to an exception.
+     */
+    FAILURE_EXCEPTION("Failure_Exception"), 
+    /**
+     * Operation failed since Guard did not permit.
+     */
+    FAILURE_GUARD("Failure_Guard")
+    ;
+    
+    private String result;
+    
+    private PolicyResult(String result) {
+        this.result = result;
+    }
+    
+    @Override
+    public String toString() {
+        return this.result;
+    }
+    
+    /**
+     * Convert to a result.
+     * 
+     * @param result result string
+     * @return Result object
+     */
+    public static PolicyResult toResult(String result) {
+        if (result.equalsIgnoreCase(SUCCESS.toString())) {
+            return SUCCESS;
+        }
+        if (result.equalsIgnoreCase(FAILURE.toString())) {
+            return FAILURE;
+        }
+        if (result.equalsIgnoreCase(FAILURE_RETRIES.toString())) {
+            return FAILURE_RETRIES;
+        }
+        if (result.equalsIgnoreCase(FAILURE_TIMEOUT.toString())) {
+            return FAILURE_TIMEOUT;
+        }
+        if (result.equalsIgnoreCase(FAILURE_EXCEPTION.toString())) {
+            return FAILURE_EXCEPTION;
+        }
+        if (result.equalsIgnoreCase(FAILURE_GUARD.toString())) {
+            return FAILURE_GUARD;
+        }
+        return null;
+    }
+
+}
diff --git a/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/Target.java b/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/Target.java
new file mode 100644
index 0000000..6e7a821
--- /dev/null
+++ b/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/Target.java
@@ -0,0 +1,113 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * policy-yaml
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2019 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.controlloop.policy;
+
+import java.io.Serializable;
+
+public class Target implements Serializable {
+
+    private static final long serialVersionUID = 2180988443264988319L;
+     
+    private String resourceId;
+    private TargetType type;
+
+    public Target() {
+        //Does Nothing Empty Constructor
+    }
+    
+    public Target(TargetType type) {
+        this.type = type;
+    }
+    
+    public Target(String resourceId) {
+        this.resourceId = resourceId;
+    }
+    
+    public Target(TargetType type, String resourceId) {
+        this.type = type;
+        this.resourceId = resourceId;
+    }
+    
+    public Target(Target target) {
+        this.type = target.type;
+        this.resourceId = target.resourceId;
+    }
+    
+    public String getResourceID() {
+        return resourceId;
+    }
+
+    public void setResourceID(String resourceId) {
+        this.resourceId = resourceId;
+    }
+
+    public TargetType getType() {
+        return type;
+    }
+
+    public void setType(TargetType type) {
+        this.type = type;
+    }
+
+    @Override
+    public String toString() {
+        return "Target [type=" + type + ", resourceId=" + resourceId + "]";
+    }
+    
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((type == null) ? 0 : type.hashCode());
+        result = prime * result + ((resourceId == null) ? 0 : resourceId.hashCode());
+        return result;
+    }
+    
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null) {
+            return false;
+        }
+        if (getClass() != obj.getClass()) {
+            return false;
+        }
+        Target other = (Target) obj;
+        if (type == null) {
+            if (other.type != null) {
+                return false;
+            }
+        } else if (!type.equals(other.type)) {
+            return false;
+        }
+        if (resourceId == null) {
+            if (other.resourceId != null) {
+                return false;
+            }
+        } else if (!resourceId.equals(other.resourceId)) {
+            return false;
+        }
+        return true;
+    }
+}
diff --git a/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/TargetType.java b/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/TargetType.java
new file mode 100644
index 0000000..7e47f80
--- /dev/null
+++ b/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/TargetType.java
@@ -0,0 +1,42 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * policy-yaml
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2019 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.controlloop.policy;
+
+public enum TargetType {
+    VM("VM"),
+    PNF("PNF"),
+    VFC("VFC"), 
+    VNF("VNF")
+    ;
+    
+    private String target;
+    
+    private TargetType(String targetType) {
+        this.target = targetType;
+    }
+    
+    @Override
+    public String toString() {
+        return this.target;
+    }
+
+}
diff --git a/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/builder/BuilderException.java b/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/builder/BuilderException.java
new file mode 100644
index 0000000..3d086d0
--- /dev/null
+++ b/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/builder/BuilderException.java
@@ -0,0 +1,32 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * policy-yaml
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2019 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.controlloop.policy.builder;
+
+public class BuilderException extends Exception {
+
+    private static final long serialVersionUID = 610064813684337895L;
+
+    public BuilderException(String string) {
+        super(string);
+    }
+
+}
diff --git a/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/builder/ControlLoopPolicyBuilder.java b/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/builder/ControlLoopPolicyBuilder.java
new file mode 100644
index 0000000..9c0188c
--- /dev/null
+++ b/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/builder/ControlLoopPolicyBuilder.java
@@ -0,0 +1,315 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * policy-yaml
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2019 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.controlloop.policy.builder;
+
+import org.onap.policy.aai.Pnf;
+import org.onap.policy.controlloop.policy.ControlLoop;
+import org.onap.policy.controlloop.policy.OperationsAccumulateParams;
+import org.onap.policy.controlloop.policy.Policy;
+import org.onap.policy.controlloop.policy.PolicyParam;
+import org.onap.policy.controlloop.policy.PolicyResult;
+import org.onap.policy.controlloop.policy.builder.impl.ControlLoopPolicyBuilderImpl;
+import org.onap.policy.sdc.Resource;
+import org.onap.policy.sdc.Service;
+
+public interface ControlLoopPolicyBuilder {
+
+    /**
+     * Adds one or more services to the ControlLoop.
+     * 
+     * @param services service to add
+     * @return builder object
+     * @throws BuilderException builder exception
+     */
+    public ControlLoopPolicyBuilder addService(Service... services) throws BuilderException;
+
+    /**
+     * Remove service.
+     * 
+     * @param services to remove
+     * @return builder object
+     * @throws BuilderException builder exception
+     */
+    public ControlLoopPolicyBuilder removeService(Service... services) throws BuilderException;
+
+    /**
+     * Remove all the services.
+     * 
+     * @return builder object
+     * @throws BuilderException builder exception
+     */
+    public ControlLoopPolicyBuilder removeAllServices() throws BuilderException;
+
+    /**
+     * Adds one or more resources to the ControlLoop.
+     * 
+     * @return builder object
+     * @throws BuilderException builder exception
+     */
+    public ControlLoopPolicyBuilder addResource(Resource... resources) throws BuilderException;
+
+    /**
+     * Remove the resources.
+     * 
+     * @param resources resources to be removed
+     * @return object
+     * @throws BuilderException builder exception
+     */
+    public ControlLoopPolicyBuilder removeResource(Resource... resources) throws BuilderException;
+
+    /**
+     * Remove all resources.
+     * 
+     * @return object
+     * @throws BuilderException builder exception
+     */
+    public ControlLoopPolicyBuilder removeAllResources() throws BuilderException;
+
+    /**
+     * Set the PNF.
+     * 
+     * @param pnf input pnf
+     * @return builder object
+     * @throws BuilderException builder exception
+     */
+    public ControlLoopPolicyBuilder setPNF(Pnf pnf) throws BuilderException;
+
+    /**
+     * Remove PNF.
+     * 
+     * @return the object
+     * @throws BuilderException builder exception
+     */
+    public ControlLoopPolicyBuilder removePNF() throws BuilderException;
+
+    /**
+     * Set the abatement.
+     * 
+     * @param abatement whether abatement is possible
+     * @return object
+     * @throws BuilderException builder exception
+     */
+    public ControlLoopPolicyBuilder setAbatement(Boolean abatement) throws BuilderException;
+
+
+    /**
+     * Sets the overall timeout value for the Control Loop. If any operational policies have retries
+     * and timeouts, then this overall timeout value should exceed all those values.
+     * 
+     * @param timeout timeout value
+     * @return control loop policy builder
+     * @throws BuilderException builder exception
+     */
+    public ControlLoopPolicyBuilder setTimeout(Integer timeout) throws BuilderException;
+
+    /**
+     * Scans the operational policies and calculate an minimum overall timeout for the Control Loop.
+     * 
+     * 
+     * @return Integer
+     */
+    public Integer calculateTimeout();
+
+    /**
+     * Sets the initial trigger policy when a DCAE Closed Loop Event arrives in the ONAP Policy
+     * Platform.
+     * 
+     * 
+     * @param policy Policy parameters object
+     * @return Policy object
+     * @throws BuilderException builder exception
+     */
+    public Policy setTriggerPolicy(PolicyParam policy) throws BuilderException;
+
+    /**
+     * Changes the trigger policy to point to another existing Policy.
+     * 
+     * @param id the id
+     * @return ControlLoop object
+     * @throws BuilderException build exception
+     */
+    public ControlLoop setExistingTriggerPolicy(String id) throws BuilderException;
+
+    /**
+     * Is an open loop.
+     * 
+     * @return true or false
+     */
+    public boolean isOpenLoop();
+
+    /**
+     * Get the trigger policy.
+     * 
+     * @return the policy object
+     * @throws BuilderException if there is a builder exception
+     */
+    public Policy getTriggerPolicy() throws BuilderException;
+
+    /**
+     * Simply returns a copy of the ControlLoop information.
+     * 
+     * 
+     * @return ControlLoop
+     */
+    public ControlLoop getControlLoop();
+
+    /**
+     * Creates a policy that is chained to the result of another Policy.
+     * 
+     * @param policyParam policy parameters object
+     * @param results results
+     * @return Policy that was set
+     * @throws BuilderException builder exception
+     */
+    public Policy setPolicyForPolicyResult(PolicyParam policyParam, PolicyResult... results)
+            throws BuilderException;
+
+
+    /**
+     * Sets the policy result(s) to an existing Operational Policy.
+     * 
+     * @param policyResultId result ID
+     * @param policyId id
+     * @param results results
+     * @return Policy that was set
+     * @throws BuilderException builder exception
+     */
+    public Policy setPolicyForPolicyResult(String policyResultId, String policyId, PolicyResult... results)
+            throws BuilderException;
+
+    /**
+     * Removes an Operational Policy. Be mindful that if any other Operational Policies have results
+     * that point to this policy, any policies that have results pointing to this policy will have
+     * their result reset to the appropriate default FINAL_* result.
+     * 
+     * 
+     * @param policyID id for the policy
+     * @return true if removed else false
+     * @throws BuilderException builder exception
+     */
+    public boolean removePolicy(String policyID) throws BuilderException;
+
+    /**
+     * Resets a policy's results to defualt FINAL_* codes.
+     * 
+     * @return Policy object
+     * @throws BuilderException - Policy does not exist
+     */
+    public Policy resetPolicyResults(String policyID) throws BuilderException;
+
+    /**
+     * Removes all existing Operational Policies and reverts back to an Open Loop.
+     * 
+     * @return Policy builder object
+     */
+    public ControlLoopPolicyBuilder removeAllPolicies();
+
+    /**
+     * Adds an operationsAccumulateParams to an existing operational policy.
+     * 
+     * @return Policy
+     * @throws BuilderException - Policy does not exist
+     */
+    public Policy addOperationsAccumulateParams(String policyID, OperationsAccumulateParams operationsAccumulateParams)
+            throws BuilderException;
+
+    /**
+     * This will compile and build the YAML specification for the Control Loop Policy. Please
+     * iterate the Results object for details. The Results object will contains warnings and errors.
+     * If the specification compiled successfully, you will be able to retrieve the YAML.
+     * 
+     * @return Results
+     */
+    public Results buildSpecification();
+
+    /**
+     * The Factory is used to build a ControlLoopPolicyBuilder implementation.
+     * 
+     * @author pameladragosh
+     *
+     */
+    public static class Factory {
+        private Factory() {
+            // Private Constructor.
+        }
+
+        /**
+         * Builds a basic Control Loop with an overall timeout. Use this method if you wish to
+         * create an OpenLoop, or if you want to interactively build a Closed Loop.
+         * 
+         * @param controlLoopName - Per Closed Loop AID v1.0, unique string for the closed loop.
+         * @param timeout - Overall timeout for the Closed Loop to execute.
+         * @return ControlLoopPolicyBuilder object
+         */
+        public static ControlLoopPolicyBuilder buildControlLoop(String controlLoopName, Integer timeout) {
+            return new ControlLoopPolicyBuilderImpl(controlLoopName, timeout);
+        }
+
+        /**
+         * Build a Control Loop for a resource and services associated with the resource.
+         * 
+         * @param controlLoopName - Per Closed Loop AID v1.0, unique string for the closed loop.
+         * @param timeout - Overall timeout for the Closed Loop to execute.
+         * @param resource - Resource this closed loop is for. Should come from ASDC, but if not
+         *        available use resourceName to distinguish.
+         * @param services - Zero or more services associated with this resource. Should come from
+         *        ASDC, but if not available use serviceName to distinguish.
+         * @return ControlLoopPolicyBuilder object
+         * @throws BuilderException builder exception
+         */
+        public static ControlLoopPolicyBuilder buildControlLoop(String controlLoopName, Integer timeout,
+                Resource resource, Service... services) throws BuilderException {
+            return new ControlLoopPolicyBuilderImpl(controlLoopName, timeout, resource, services);
+        }
+
+        /**
+         * Build the control loop.
+         * 
+         * @param controlLoopName control loop id
+         * @param timeout timeout
+         * @param service service
+         * @param resources resources
+         * @return builder object
+         * @throws BuilderException builder exception
+         */
+        public static ControlLoopPolicyBuilder buildControlLoop(String controlLoopName, Integer timeout,
+                Service service, Resource... resources) throws BuilderException {
+            return new ControlLoopPolicyBuilderImpl(controlLoopName, timeout, service, resources);
+        }
+
+        /**
+         * Build control loop.
+         * 
+         * @param controlLoopName - Per Closed Loop AID v1.0, unique string for the closed loop.
+         * @param timeout - Overall timeout for the Closed Loop to execute.
+         * @param pnf - Physical Network Function. Should come from AIC, but if not available use
+         *        well-known name to distinguish. Eg. eNodeB
+         * @return ControlLoopPolicyBuilder object
+         * @throws BuilderException builder exception
+         */
+        public static ControlLoopPolicyBuilder buildControlLoop(String controlLoopName, Integer timeout, Pnf pnf)
+                throws BuilderException {
+            return new ControlLoopPolicyBuilderImpl(controlLoopName, timeout, pnf);
+        }
+    }
+
+}
diff --git a/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/builder/Message.java b/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/builder/Message.java
new file mode 100644
index 0000000..4e34a77
--- /dev/null
+++ b/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/builder/Message.java
@@ -0,0 +1,30 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * policy-yaml
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2019 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.controlloop.policy.builder;
+
+public interface Message {
+
+    public String getMessage();
+
+    public MessageLevel getLevel();
+
+}
diff --git a/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/builder/MessageLevel.java b/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/builder/MessageLevel.java
new file mode 100644
index 0000000..cca9e2c
--- /dev/null
+++ b/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/builder/MessageLevel.java
@@ -0,0 +1,29 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * policy-yaml
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2019 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.controlloop.policy.builder;
+
+public enum MessageLevel {
+  INFO,
+  WARNING,
+  ERROR,
+  EXCEPTION;
+}
diff --git a/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/builder/Results.java b/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/builder/Results.java
new file mode 100644
index 0000000..37f619b
--- /dev/null
+++ b/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/builder/Results.java
@@ -0,0 +1,34 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * policy-yaml
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2019 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.controlloop.policy.builder;
+
+import java.util.List;
+
+public interface Results {
+
+    public List<Message> getMessages();
+
+    public String getSpecification();
+
+    public boolean isValid();
+
+}
diff --git a/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/builder/impl/ControlLoopPolicyBuilderImpl.java b/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/builder/impl/ControlLoopPolicyBuilderImpl.java
new file mode 100644
index 0000000..ed6a54c
--- /dev/null
+++ b/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/builder/impl/ControlLoopPolicyBuilderImpl.java
@@ -0,0 +1,544 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * policy-yaml
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2019 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.controlloop.policy.builder.impl;
+
+import com.google.common.base.Strings;
+import java.util.LinkedList;
+import java.util.UUID;
+
+import org.onap.policy.aai.Pnf;
+import org.onap.policy.controlloop.compiler.CompilerException;
+import org.onap.policy.controlloop.compiler.ControlLoopCompiler;
+import org.onap.policy.controlloop.compiler.ControlLoopCompilerCallback;
+import org.onap.policy.controlloop.policy.ControlLoop;
+import org.onap.policy.controlloop.policy.ControlLoopPolicy;
+import org.onap.policy.controlloop.policy.FinalResult;
+import org.onap.policy.controlloop.policy.OperationsAccumulateParams;
+import org.onap.policy.controlloop.policy.Policy;
+import org.onap.policy.controlloop.policy.PolicyParam;
+import org.onap.policy.controlloop.policy.PolicyResult;
+import org.onap.policy.controlloop.policy.builder.BuilderException;
+import org.onap.policy.controlloop.policy.builder.ControlLoopPolicyBuilder;
+import org.onap.policy.controlloop.policy.builder.MessageLevel;
+import org.onap.policy.controlloop.policy.builder.Results;
+import org.onap.policy.sdc.Resource;
+import org.onap.policy.sdc.Service;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.yaml.snakeyaml.DumperOptions;
+import org.yaml.snakeyaml.DumperOptions.FlowStyle;
+import org.yaml.snakeyaml.Yaml;
+
+public class ControlLoopPolicyBuilderImpl implements ControlLoopPolicyBuilder {
+    private static final String UNKNOWN_POLICY = "Unknown policy ";
+    private static Logger logger = LoggerFactory.getLogger(ControlLoopPolicyBuilderImpl.class.getName());
+    private ControlLoopPolicy controlLoopPolicy;
+
+    /**
+     * Constructor.
+     * 
+     * @param controlLoopName control loop id
+     * @param timeout timeout value
+     */
+    public ControlLoopPolicyBuilderImpl(String controlLoopName, Integer timeout) {
+        controlLoopPolicy = new ControlLoopPolicy();
+        ControlLoop controlLoop = new ControlLoop();
+        controlLoop.setControlLoopName(controlLoopName);
+        controlLoop.setTimeout(timeout);
+        controlLoopPolicy.setControlLoop(controlLoop);
+    }
+
+    /**
+     * Constructor.
+     * 
+     * @param controlLoopName control loop id
+     * @param timeout timeout value
+     * @param resource resource
+     * @param services services
+     * @throws BuilderException builder exception
+     */
+    public ControlLoopPolicyBuilderImpl(String controlLoopName, Integer timeout, Resource resource, Service... services)
+            throws BuilderException {
+        this(controlLoopName, timeout);
+        this.addResource(resource);
+        this.addService(services);
+    }
+
+    public ControlLoopPolicyBuilderImpl(String controlLoopName, Integer timeout, Pnf pnf) throws BuilderException {
+        this(controlLoopName, timeout);
+        this.setPNF(pnf);
+    }
+
+    /**
+     * Constructor.
+     * 
+     * @param controlLoopName control loop id
+     * @param timeout timeout
+     * @param service service
+     * @param resources resources
+     * @throws BuilderException builder exception
+     */
+    public ControlLoopPolicyBuilderImpl(String controlLoopName, Integer timeout, Service service, Resource[] resources)
+            throws BuilderException {
+        this(controlLoopName, timeout);
+        this.addService(service);
+        this.addResource(resources);
+    }
+
+    @Override
+    public ControlLoopPolicyBuilder removePNF() throws BuilderException {
+        controlLoopPolicy.getControlLoop().setPnf(null);
+        return this;
+    }
+
+    @Override
+    public ControlLoopPolicyBuilder addService(Service... services) throws BuilderException {
+        for (Service service : services) {
+            if (service == null) {
+                throw new BuilderException("Service must not be null");
+            }
+            if (service.getServiceUUID() == null && Strings.isNullOrEmpty(service.getServiceName())) {
+                throw new BuilderException("Invalid service - need either a serviceUUID or serviceName");
+            }
+            if (controlLoopPolicy.getControlLoop().getServices() == null) {
+                controlLoopPolicy.getControlLoop().setServices(new LinkedList<>());
+            }
+            controlLoopPolicy.getControlLoop().getServices().add(service);
+        }
+        return this;
+    }
+
+    @Override
+    public ControlLoopPolicyBuilder removeService(Service... services) throws BuilderException {
+        if (controlLoopPolicy.getControlLoop().getServices() == null) {
+            throw new BuilderException("No existing services to remove");
+        }
+        for (Service service : services) {
+            if (service == null) {
+                throw new BuilderException("Service must not be null");
+            }
+            if (service.getServiceUUID() == null && Strings.isNullOrEmpty(service.getServiceName())) {
+                throw new BuilderException("Invalid service - need either a serviceUUID or serviceName");
+            }
+            boolean removed = controlLoopPolicy.getControlLoop().getServices().remove(service);
+            if (!removed) {
+                throw new BuilderException("Unknown service " + service.getServiceName());
+            }
+        }
+        return this;
+    }
+
+    @Override
+    public ControlLoopPolicyBuilder removeAllServices() throws BuilderException {
+        controlLoopPolicy.getControlLoop().getServices().clear();
+        return this;
+    }
+
+
+    @Override
+    public ControlLoopPolicyBuilder addResource(Resource... resources) throws BuilderException {
+        for (Resource resource : resources) {
+            if (resource == null) {
+                throw new BuilderException("Resource must not be null");
+            }
+            if (resource.getResourceUuid() == null && Strings.isNullOrEmpty(resource.getResourceName())) {
+                throw new BuilderException("Invalid resource - need either resourceUUID or resourceName");
+            }
+            if (controlLoopPolicy.getControlLoop().getResources() == null) {
+                controlLoopPolicy.getControlLoop().setResources(new LinkedList<>());
+            }
+            controlLoopPolicy.getControlLoop().getResources().add(resource);
+        }
+        return this;
+    }
+
+    @Override
+    public ControlLoopPolicyBuilder setPNF(Pnf pnf) throws BuilderException {
+        if (pnf == null) {
+            throw new BuilderException("PNF must not be null");
+        }
+        if (pnf.getPnfName() == null && pnf.getPnfType() == null) {
+            throw new BuilderException("Invalid PNF - need either pnfName or pnfType");
+        }
+        controlLoopPolicy.getControlLoop().setPnf(pnf);
+        return this;
+    }
+
+    @Override
+    public ControlLoopPolicyBuilder setAbatement(Boolean abatement) throws BuilderException {
+        if (abatement == null) {
+            throw new BuilderException("abatement must not be null");
+        }
+        controlLoopPolicy.getControlLoop().setAbatement(abatement);
+        return this;
+    }
+
+    @Override
+    public ControlLoopPolicyBuilder setTimeout(Integer timeout) {
+        controlLoopPolicy.getControlLoop().setTimeout(timeout);
+        return this;
+    }
+
+    @Override
+    public Policy setTriggerPolicy(PolicyParam policyParam)
+            throws BuilderException {
+
+        Policy trigger = new Policy(policyParam);
+
+        controlLoopPolicy.getControlLoop().setTrigger_policy(trigger.getId());
+
+        this.addNewPolicy(trigger);
+        //
+        // Return a copy of the policy
+        //
+        return new Policy(trigger);
+    }
+
+    @Override
+    public ControlLoop setExistingTriggerPolicy(String id) throws BuilderException {
+        if (id == null) {
+            throw new BuilderException("Id must not be null");
+        }
+        Policy trigger = this.findPolicy(id);
+        if (trigger == null) {
+            throw new BuilderException(UNKNOWN_POLICY + id);
+        } else {
+            this.controlLoopPolicy.getControlLoop().setTrigger_policy(id);
+        }
+        return new ControlLoop(this.controlLoopPolicy.getControlLoop());
+    }
+
+    @Override
+    public Policy setPolicyForPolicyResult(PolicyParam policyParam, PolicyResult... results)
+            throws BuilderException {
+        //
+        // Find the existing policy
+        //
+        Policy existingPolicy = this.findPolicy(policyParam.getId());
+        if (existingPolicy == null) {
+            throw new BuilderException(UNKNOWN_POLICY + policyParam.getId());
+        }
+        //
+        // Create the new Policy
+        //
+        Policy newPolicy = new Policy(
+                PolicyParam.builder().id(UUID.randomUUID().toString())
+                .name(policyParam.getName())
+                .description(policyParam.getDescription())
+                .actor(policyParam.getActor())
+                .payload(policyParam.getPayload())
+                .target(policyParam.getTarget())
+                .recipe(policyParam.getRecipe())
+                .retries(policyParam.getRetries())
+                .timeout(policyParam.getTimeout())
+                .build());
+        //
+        // Connect the results
+        //
+        for (PolicyResult result : results) {
+            switch (result) {
+                case FAILURE:
+                    existingPolicy.setFailure(newPolicy.getId());
+                    break;
+                case FAILURE_EXCEPTION:
+                    existingPolicy.setFailure_exception(newPolicy.getId());
+                    break;
+                case FAILURE_RETRIES:
+                    existingPolicy.setFailure_retries(newPolicy.getId());
+                    break;
+                case FAILURE_TIMEOUT:
+                    existingPolicy.setFailure_timeout(newPolicy.getId());
+                    break;
+                case FAILURE_GUARD:
+                    existingPolicy.setFailure_guard(newPolicy.getId());
+                    break;
+                case SUCCESS:
+                    existingPolicy.setSuccess(newPolicy.getId());
+                    break;
+                default:
+                    throw new BuilderException("Invalid PolicyResult " + result);
+            }
+        }
+        //
+        // Add it to our list
+        //
+        this.controlLoopPolicy.getPolicies().add(newPolicy);
+        //
+        // Return a policy to them
+        //
+        return new Policy(newPolicy);
+    }
+
+    @Override
+    public Policy setPolicyForPolicyResult(String policyResultId, String policyId, PolicyResult... results)
+            throws BuilderException {
+        //
+        // Find the existing policy
+        //
+        Policy existingPolicy = this.findPolicy(policyId);
+        if (existingPolicy == null) {
+            throw new BuilderException(policyId + " does not exist");
+        }
+        if (this.findPolicy(policyResultId) == null) {
+            throw new BuilderException("Operational policy " + policyResultId + " does not exist");
+        }
+        //
+        // Connect the results
+        //
+        for (PolicyResult result : results) {
+            switch (result) {
+                case FAILURE:
+                    existingPolicy.setFailure(policyResultId);
+                    break;
+                case FAILURE_EXCEPTION:
+                    existingPolicy.setFailure_exception(policyResultId);
+                    break;
+                case FAILURE_RETRIES:
+                    existingPolicy.setFailure_retries(policyResultId);
+                    break;
+                case FAILURE_TIMEOUT:
+                    existingPolicy.setFailure_timeout(policyResultId);
+                    break;
+                case FAILURE_GUARD:
+                    existingPolicy.setFailure_guard(policyResultId);
+                    break;
+                case SUCCESS:
+                    existingPolicy.setSuccess(policyResultId);
+                    break;
+                default:
+                    throw new BuilderException("Invalid PolicyResult " + result);
+            }
+        }
+        return new Policy(this.findPolicy(policyResultId));
+    }
+
+    private class BuilderCompilerCallback implements ControlLoopCompilerCallback {
+
+        private ResultsImpl results = new ResultsImpl();
+
+        @Override
+        public boolean onWarning(String message) {
+            results.addMessage(new MessageImpl(message, MessageLevel.WARNING));
+            return false;
+        }
+
+        @Override
+        public boolean onError(String message) {
+            results.addMessage(new MessageImpl(message, MessageLevel.ERROR));
+            return false;
+        }
+    }
+
+    @Override
+    public Results buildSpecification() {
+        //
+        // Dump the specification
+        //
+        DumperOptions options = new DumperOptions();
+        options.setDefaultFlowStyle(FlowStyle.BLOCK);
+        options.setPrettyFlow(true);
+        Yaml yaml = new Yaml(options);
+        String dumpedYaml = yaml.dump(controlLoopPolicy);
+        //
+        // This is our callback class for our compiler
+        //
+        BuilderCompilerCallback callback = new BuilderCompilerCallback();
+        //
+        // Compile it
+        //
+        try {
+            ControlLoopCompiler.compile(controlLoopPolicy, callback);
+        } catch (CompilerException e) {
+            logger.error(e.getMessage() + e);
+            callback.results.addMessage(new MessageImpl(e.getMessage(), MessageLevel.EXCEPTION));
+        }
+        //
+        // Save the spec
+        //
+        callback.results.setSpecification(dumpedYaml);
+        return callback.results;
+    }
+
+    private void addNewPolicy(Policy policy) {
+        if (this.controlLoopPolicy.getPolicies() == null) {
+            this.controlLoopPolicy.setPolicies(new LinkedList<>());
+        }
+        this.controlLoopPolicy.getPolicies().add(policy);
+    }
+
+    private Policy findPolicy(String id) {
+        if (this.controlLoopPolicy.getPolicies() != null) {
+            for (Policy policy : this.controlLoopPolicy.getPolicies()) {
+                if (policy.getId().equals(id)) {
+                    return policy;
+                }
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public ControlLoopPolicyBuilder removeResource(Resource... resources) throws BuilderException {
+        if (controlLoopPolicy.getControlLoop().getResources() == null) {
+            throw new BuilderException("No existing resources to remove");
+        }
+        for (Resource resource : resources) {
+            if (resource == null) {
+                throw new BuilderException("Resource must not be null");
+            }
+            if (resource.getResourceUuid() == null && Strings.isNullOrEmpty(resource.getResourceName())) {
+                throw new BuilderException("Invalid resource - need either a resourceUUID or resourceName");
+            }
+            boolean removed = controlLoopPolicy.getControlLoop().getResources().remove(resource);
+            if (!removed) {
+                throw new BuilderException("Unknown resource " + resource.getResourceName());
+            }
+        }
+        return this;
+    }
+
+    @Override
+    public ControlLoopPolicyBuilder removeAllResources() throws BuilderException {
+        controlLoopPolicy.getControlLoop().getResources().clear();
+        return this;
+    }
+
+    @Override
+    public Integer calculateTimeout() {
+        int sum = 0;
+        for (Policy policy : this.controlLoopPolicy.getPolicies()) {
+            sum += policy.getTimeout().intValue();
+        }
+        return Integer.valueOf(sum);
+    }
+
+    @Override
+    public boolean isOpenLoop() {
+        return this.controlLoopPolicy.getControlLoop().getTrigger_policy()
+                .equals(FinalResult.FINAL_OPENLOOP.toString());
+    }
+
+    @Override
+    public Policy getTriggerPolicy() throws BuilderException {
+        if (this.controlLoopPolicy.getControlLoop().getTrigger_policy().equals(FinalResult.FINAL_OPENLOOP.toString())) {
+            return null;
+        } else {
+            return new Policy(this.findPolicy(this.controlLoopPolicy.getControlLoop().getTrigger_policy()));
+        }
+    }
+
+    @Override
+    public ControlLoop getControlLoop() {
+        return new ControlLoop(this.controlLoopPolicy.getControlLoop());
+    }
+
+    @Override
+    public boolean removePolicy(String policyId) throws BuilderException {
+        Policy existingPolicy = this.findPolicy(policyId);
+        if (existingPolicy == null) {
+            throw new BuilderException(UNKNOWN_POLICY + policyId);
+        }
+        //
+        // Check if the policy to remove is trigger_policy
+        //
+        if (this.controlLoopPolicy.getControlLoop().getTrigger_policy().equals(policyId)) {
+            this.controlLoopPolicy.getControlLoop().setTrigger_policy(FinalResult.FINAL_OPENLOOP.toString());
+        } else {
+            updateChainedPoliciesForPolicyRemoval(policyId);
+        }
+        //
+        // remove the policy
+        //
+        return this.controlLoopPolicy.getPolicies().remove(existingPolicy);
+    }
+
+    private void updateChainedPoliciesForPolicyRemoval(String idOfPolicyBeingRemoved) {
+        for (Policy policy : this.controlLoopPolicy.getPolicies()) {
+            final int index = this.controlLoopPolicy.getPolicies().indexOf(policy);
+            if (policy.getSuccess().equals(idOfPolicyBeingRemoved)) {
+                policy.setSuccess(FinalResult.FINAL_SUCCESS.toString());
+            }
+            if (policy.getFailure().equals(idOfPolicyBeingRemoved)) {
+                policy.setFailure(FinalResult.FINAL_FAILURE.toString());
+            }
+            if (policy.getFailure_retries().equals(idOfPolicyBeingRemoved)) {
+                policy.setFailure_retries(FinalResult.FINAL_FAILURE_RETRIES.toString());
+            }
+            if (policy.getFailure_timeout().equals(idOfPolicyBeingRemoved)) {
+                policy.setFailure_timeout(FinalResult.FINAL_FAILURE_TIMEOUT.toString());
+            }
+            if (policy.getFailure_exception().equals(idOfPolicyBeingRemoved)) {
+                policy.setFailure_exception(FinalResult.FINAL_FAILURE_EXCEPTION.toString());
+            }
+            if (policy.getFailure_guard().equals(idOfPolicyBeingRemoved)) {
+                policy.setFailure_guard(FinalResult.FINAL_FAILURE_GUARD.toString());
+            }
+            this.controlLoopPolicy.getPolicies().set(index, policy);
+        }
+    }
+
+    @Override
+    public Policy resetPolicyResults(String policyId) throws BuilderException {
+        Policy existingPolicy = this.findPolicy(policyId);
+        if (existingPolicy == null) {
+            throw new BuilderException(UNKNOWN_POLICY + policyId);
+        }
+        //
+        // reset policy results
+        //
+        existingPolicy.setSuccess(FinalResult.FINAL_SUCCESS.toString());
+        existingPolicy.setFailure(FinalResult.FINAL_FAILURE.toString());
+        existingPolicy.setFailure_retries(FinalResult.FINAL_FAILURE_RETRIES.toString());
+        existingPolicy.setFailure_timeout(FinalResult.FINAL_FAILURE_TIMEOUT.toString());
+        existingPolicy.setFailure_exception(FinalResult.FINAL_FAILURE_EXCEPTION.toString());
+        existingPolicy.setFailure_guard(FinalResult.FINAL_FAILURE_GUARD.toString());
+        return new Policy(existingPolicy);
+    }
+
+    @Override
+    public ControlLoopPolicyBuilder removeAllPolicies() {
+        //
+        // Remove all existing operational policies
+        //
+        this.controlLoopPolicy.getPolicies().clear();
+        //
+        // Revert controlLoop back to an open loop
+        //
+        this.controlLoopPolicy.getControlLoop().setTrigger_policy(FinalResult.FINAL_OPENLOOP.toString());
+        return this;
+    }
+
+    @Override
+    public Policy addOperationsAccumulateParams(String policyId, OperationsAccumulateParams operationsAccumulateParams)
+            throws BuilderException {
+        Policy existingPolicy = this.findPolicy(policyId);
+        if (existingPolicy == null) {
+            throw new BuilderException(UNKNOWN_POLICY + policyId);
+        }
+        //
+        // Add operationsAccumulateParams to existingPolicy
+        //
+        existingPolicy.setOperationsAccumulateParams(operationsAccumulateParams);
+        return new Policy(existingPolicy);
+    }
+
+}
diff --git a/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/builder/impl/MessageImpl.java b/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/builder/impl/MessageImpl.java
new file mode 100644
index 0000000..1a03f6d
--- /dev/null
+++ b/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/builder/impl/MessageImpl.java
@@ -0,0 +1,47 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * policy-yaml
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2019 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.controlloop.policy.builder.impl;
+
+import org.onap.policy.controlloop.policy.builder.Message;
+import org.onap.policy.controlloop.policy.builder.MessageLevel;
+
+public class MessageImpl implements Message {
+
+    private String message;
+    private MessageLevel level;
+
+    public MessageImpl(String message, MessageLevel level) {
+        this.message = message;
+        this.level = level;
+    }
+
+    @Override
+    public String getMessage() {
+        return message;
+    }
+
+    @Override
+    public MessageLevel getLevel() {
+        return level;
+    }
+
+}
diff --git a/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/builder/impl/ResultsImpl.java b/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/builder/impl/ResultsImpl.java
new file mode 100644
index 0000000..561f551
--- /dev/null
+++ b/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/builder/impl/ResultsImpl.java
@@ -0,0 +1,57 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * policy-yaml
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2019 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.controlloop.policy.builder.impl;
+
+import java.util.LinkedList;
+import java.util.List;
+
+import org.onap.policy.controlloop.policy.builder.Message;
+import org.onap.policy.controlloop.policy.builder.Results;
+
+public class ResultsImpl implements Results {
+
+    private String specification;
+    private List<Message> messages = new LinkedList<>();
+
+    @Override
+    public List<Message> getMessages() {
+        return messages;
+    }
+
+    @Override
+    public String getSpecification() {
+        return specification;
+    }
+
+    @Override
+    public boolean isValid() {
+        return (this.specification != null);
+    }
+
+    public void addMessage(Message message) {
+        this.messages.add(message);
+    }
+
+    public void setSpecification(String spec) {
+        this.specification = spec;
+    }
+}
diff --git a/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/guard/Constraint.java b/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/guard/Constraint.java
new file mode 100644
index 0000000..b16ecbb
--- /dev/null
+++ b/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/guard/Constraint.java
@@ -0,0 +1,256 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * policy-yaml
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2019 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.controlloop.policy.guard;
+
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+public class Constraint {
+
+    private Integer freqLimitPerTarget;
+    private Map<String,String> timeWindow;
+    private Map<String, String> activeTimeRange;
+    private Integer minVnfCount;
+    private Integer maxVnfCount;
+    
+    private List<String> blacklist;
+    
+    public Constraint() {
+        // Do Nothing empty constructor. 
+    }
+    
+    /**
+     * Constructor.
+     * 
+     * @param freqLimitPerTarget frequency limit
+     * @param timeWindow time window
+     */
+    public Constraint(Integer freqLimitPerTarget, Map<String, String> timeWindow) {
+        this.freqLimitPerTarget = freqLimitPerTarget;
+        if (timeWindow != null) {
+            this.timeWindow = Collections.unmodifiableMap(timeWindow);
+        }
+    }
+
+    /**
+     * Constructor.
+     * 
+     * @param minVnfCount minimum VNF count
+     * @param maxVnfCount maximum VNF count
+     * @param activeTimeRange active time range
+     */
+    public Constraint(Integer minVnfCount, Integer maxVnfCount, Map<String, String> activeTimeRange) {
+        this.minVnfCount = minVnfCount;
+        this.maxVnfCount = maxVnfCount;
+
+        if (activeTimeRange != null) {
+            this.activeTimeRange = Collections.unmodifiableMap(activeTimeRange);
+        }
+    }
+    
+    public Constraint(List<String> blacklist) {
+        this.blacklist = new LinkedList<>(blacklist);
+    }
+    
+    /**
+     * Constructor.
+     * 
+     * @param freqLimitPerTarget frequency limit
+     * @param timeWindow time window
+     * @param blacklist blacklist
+     */
+    public Constraint(Integer freqLimitPerTarget, Map<String, String> timeWindow, List<String> blacklist) {
+        this.freqLimitPerTarget = freqLimitPerTarget;
+        this.timeWindow = Collections.unmodifiableMap(timeWindow);
+        this.blacklist = new LinkedList<>(blacklist);
+    }
+    
+    /**
+     * Constructor.
+     * 
+     * @param freqLimitPerTarget frequency limit
+     * @param timeWindow time window
+     * @param activeTimeRange active time range
+     */
+    public Constraint(Integer freqLimitPerTarget, Map<String, String> timeWindow, Map<String, String> activeTimeRange) {
+        this(freqLimitPerTarget, timeWindow);
+        if (activeTimeRange != null) {
+            this.activeTimeRange = Collections.unmodifiableMap(activeTimeRange);
+        }
+    }
+    
+    /**
+     * Constructor.
+     * 
+     * @param freqLimitPerTarget frequency limit
+     * @param timeWindow the time window
+     * @param activeTimeRange active time range
+     * @param blacklist incoming blacklist
+     */
+    public Constraint(Integer freqLimitPerTarget, Map<String, String> timeWindow, Map<String, String> activeTimeRange, 
+                    List<String> blacklist) {
+        this(freqLimitPerTarget, timeWindow);
+        if (activeTimeRange != null) {
+            this.activeTimeRange = Collections.unmodifiableMap(activeTimeRange);
+        }
+        if (blacklist != null) {
+            this.blacklist = new LinkedList<>(blacklist);
+        }
+    }
+    
+    /**
+     * Constructor.
+     * 
+     * @param constraint objec to copy
+     */
+    public Constraint(Constraint constraint) {
+        this.freqLimitPerTarget = constraint.freqLimitPerTarget;
+        this.timeWindow = constraint.timeWindow;
+        if (constraint.activeTimeRange != null) {
+            this.activeTimeRange = Collections.unmodifiableMap(constraint.activeTimeRange);
+        }
+        this.blacklist = new LinkedList<>(constraint.blacklist);
+    }
+
+    public Integer getFreq_limit_per_target() {
+        return freqLimitPerTarget;
+    }
+
+
+    public void setFreq_limit_per_target(Integer freqLimitPerTarget) {
+        this.freqLimitPerTarget = freqLimitPerTarget;
+    }
+
+
+    public Map<String, String> getTime_window() {
+        return timeWindow;
+    }
+
+
+    public void setTime_window(Map<String, String> timeWindow) {
+        this.timeWindow = timeWindow;
+    }
+
+
+    public Map<String, String> getActive_time_range() {
+        return activeTimeRange;
+    }
+
+
+    public void setActive_time_range(Map<String, String> activeTimeRange) {
+        this.activeTimeRange = activeTimeRange;
+    }
+
+    
+    public List<String> getBlacklist() {
+        return blacklist;
+    }
+
+    
+    public void setBlacklist(List<String> blacklist) {
+        this.blacklist = blacklist;
+    }
+    
+    
+    public Integer getMinVnfCount() {
+        return minVnfCount;
+    }
+
+    
+    public void setMinVnfCount(Integer minVnfCount) {
+        this.minVnfCount = minVnfCount;
+    }
+
+    
+    public Integer getMaxVnfCount() {
+        return maxVnfCount;
+    }
+
+    
+    public void setMaxVnfCount(Integer maxVnfCount) {
+        this.maxVnfCount = maxVnfCount;
+    }
+
+    /**
+     * Check if these constraint values are valid.
+     * 
+     * @return true if valid
+     */
+    public boolean isValid() {
+        //
+        // Sonar likes these statements combined as well as not use
+        // boolean literals.
+        //
+        // If the freqLimitPerTarget is null AND the timeWindow is NOT null
+        // OR
+        // timeWindow is null AND the freqLimitPerTarget is NOT null
+        //
+        // then we want to return false (hence the preceding !)
+        //
+        return ! ((freqLimitPerTarget == null && timeWindow != null)
+                        || (timeWindow == null && freqLimitPerTarget != null));
+    }
+    
+    @Override
+    public String toString() {
+        return "Constraint [freq_limit_per_target=" + freqLimitPerTarget + ", time_window=" 
+               + timeWindow + ", active_time_range=" + activeTimeRange + ", blacklist=" + blacklist + "]";
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((freqLimitPerTarget == null) ? 0 : freqLimitPerTarget.hashCode());
+        result = prime * result + ((timeWindow == null) ? 0 : timeWindow.hashCode());
+        result = prime * result + ((activeTimeRange == null) ? 0 : activeTimeRange.hashCode());
+        result = prime * result + ((blacklist == null) ? 0 : blacklist.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null) {
+            return false;
+        }
+        if (getClass() != obj.getClass()) {
+            return false;
+        }
+        Constraint other = (Constraint) obj;
+        return equalsMayBeNull(freqLimitPerTarget, other.freqLimitPerTarget)
+                && equalsMayBeNull(timeWindow, other.timeWindow)
+                && equalsMayBeNull(activeTimeRange, other.activeTimeRange)
+                && equalsMayBeNull(blacklist, other.blacklist);
+    }
+    
+    private boolean equalsMayBeNull(final Object obj1, final Object obj2) {
+        if (obj1 == null) {
+            return obj2 == null;
+        } 
+        return obj1.equals(obj2);
+    }
+}
diff --git a/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/guard/ControlLoopGuard.java b/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/guard/ControlLoopGuard.java
new file mode 100644
index 0000000..b2d243c
--- /dev/null
+++ b/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/guard/ControlLoopGuard.java
@@ -0,0 +1,101 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * policy-yaml
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2019 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.controlloop.policy.guard;
+
+import java.util.LinkedList;
+
+public class ControlLoopGuard {
+    
+    private Guard guard;
+    
+    private LinkedList<GuardPolicy> guards;
+    
+    public ControlLoopGuard() {
+        //DO Nothing Empty Constructor
+    }
+    
+    public ControlLoopGuard(ControlLoopGuard clGuard) {
+        this.guard = new Guard();
+        this.guards = new LinkedList<>(clGuard.guards);
+    }
+    
+    public Guard getGuard() {
+        return guard;
+    }
+
+    public void setGuard(Guard guard) {
+        this.guard = guard;
+    }
+
+    public LinkedList<GuardPolicy> getGuards() {
+        return guards;
+    }
+
+    public void setGuards(LinkedList<GuardPolicy> guards) {
+        this.guards = guards;
+    }
+
+    @Override
+    public String toString() {
+        return "Guard [guard=" + guard + ", GuardPolicies=" + guards + "]";
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((guard == null) ? 0 : guard.hashCode());
+        result = prime * result + ((guards == null) ? 0 : guards.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null) {
+            return false;
+        }
+        if (getClass() != obj.getClass()) {
+            return false;
+        }
+        ControlLoopGuard other = (ControlLoopGuard) obj;
+        if (guard == null) {
+            if (other.guard != null) {
+                return false;
+            }
+        } else if (!guard.equals(other.guard)) {
+            return false;
+        }
+        if (guards == null) {
+            if (other.guards != null) {
+                return false;
+            }
+        } else if (!guards.equals(other.guards)) {
+            return false;
+        }
+        return true;
+    }
+
+    
+}
diff --git a/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/guard/Guard.java b/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/guard/Guard.java
new file mode 100644
index 0000000..163cf06
--- /dev/null
+++ b/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/guard/Guard.java
@@ -0,0 +1,76 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * policy-yaml
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2019 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.controlloop.policy.guard;
+
+public class Guard {
+
+    private static final String DEFAULTVERSION = "2.0.0";
+    
+    private String version = DEFAULTVERSION;
+    
+    public Guard() {
+        //DO Nothing empty Constructor. 
+    }
+    
+    public String getVersion() {
+        return version;
+    }
+
+    public void setVersion(String version) {
+        this.version = version;
+    }
+
+    @Override
+    public String toString() {
+        return "Guard [version=" + version + "]";
+    }
+    
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((version == null) ? 0 : version.hashCode());
+        return result;
+    }
+    
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null) {
+            return false;
+        }
+        if (getClass() != obj.getClass()) {
+            return false;
+        }
+        Guard other = (Guard) obj;
+        if (version == null) {
+            if (other.version != null) {
+                return false;
+            }
+        } else if (!version.equals(other.version)) {
+            return false;
+        }
+        return true;
+    }
+}
diff --git a/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/guard/GuardPolicy.java b/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/guard/GuardPolicy.java
new file mode 100644
index 0000000..4278b81
--- /dev/null
+++ b/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/guard/GuardPolicy.java
@@ -0,0 +1,191 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * policy-yaml
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2019 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.controlloop.policy.guard;
+
+import java.util.LinkedList;
+import java.util.List;
+import java.util.UUID;
+
+public class GuardPolicy {
+
+    private String id = UUID.randomUUID().toString();
+    private String name;
+    private String description;
+    private MatchParameters matchParameters;
+    private LinkedList<Constraint> limitConstraints;
+    
+    public GuardPolicy() {
+        //Do Nothing Empty Constructor. 
+    }
+    
+    public GuardPolicy(String id) {
+        this.id = id;
+    }
+    
+    public GuardPolicy(String name, MatchParameters matchParameters) {
+        this.name = name;
+        this.matchParameters = matchParameters;
+    }
+    
+    /**
+     * Constructor.
+     * 
+     * @param id id
+     * @param name name
+     * @param description description
+     * @param matchParameters match parameters
+     */
+    public GuardPolicy(String id, String name, String description, MatchParameters matchParameters) {
+        this(name, matchParameters);
+        this.id = id;
+        this.description = description;
+    }
+    
+    /**
+     * Constructor.
+     * 
+     * @param name name
+     * @param matchParameters match parameters
+     * @param limitConstraints limit constraints
+     */
+    public GuardPolicy(String name, MatchParameters matchParameters, List<Constraint> limitConstraints) {
+        this(name, matchParameters);
+        if (limitConstraints != null) {
+            this.limitConstraints = (LinkedList<Constraint>) limitConstraints;
+        }
+    }
+    
+    public GuardPolicy(String name, String description, MatchParameters matchParameters, 
+                    List<Constraint> limitConstraints) {
+        this(name, matchParameters, limitConstraints);
+        this.description = description;
+    }
+    
+    public GuardPolicy(String id, String name, String description, MatchParameters matchParameters, 
+                    List<Constraint> limitConstraints) {
+        this(name, description, matchParameters, limitConstraints);
+        this.id = id;
+    }
+    
+    /**
+     * Constructor.
+     * 
+     * @param policy copy object
+     */
+    public GuardPolicy(GuardPolicy policy) {
+        this.id = policy.id;
+        this.name = policy.name;
+        this.description = policy.description;
+        this.matchParameters = new MatchParameters(policy.matchParameters);
+        if (policy.limitConstraints != null) {
+            this.limitConstraints = policy.limitConstraints;
+        }
+    }
+    
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public MatchParameters getMatch_parameters() {
+        return matchParameters;
+    }
+
+    public void setMatch_parameters(MatchParameters matchParameters) {
+        this.matchParameters = matchParameters;
+    }
+
+    public LinkedList<Constraint> getLimit_constraints() {
+        return  limitConstraints;
+    }
+
+    public void setLimit_constraints(LinkedList<Constraint> limitConstraints) {
+        this.limitConstraints = limitConstraints;
+    }
+
+    public boolean isValid() {
+        return (id == null || name == null) ? false : true;
+    }
+    
+    @Override
+    public String toString() {
+        return "Policy [id=" + id + ", name=" + name + ", description=" + description + ", match_parameters=" 
+                + matchParameters + ", limitConstraints=" + limitConstraints + "]";
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((description == null) ? 0 : description.hashCode());
+        result = prime * result + ((id == null) ? 0 : id.hashCode());
+        result = prime * result + ((name == null) ? 0 : name.hashCode());
+        result = prime * result + ((limitConstraints == null) ? 0 : limitConstraints.hashCode());
+        result = prime * result + ((matchParameters == null) ? 0 : matchParameters.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null) {
+            return false;
+        }
+        if (getClass() != obj.getClass()) {
+            return false;
+        }
+        GuardPolicy other = (GuardPolicy) obj;
+        return equalsMayBeNull(description, other.description)
+                && equalsMayBeNull(id, other.id)
+                && equalsMayBeNull(name, other.name)
+                && equalsMayBeNull(limitConstraints, other.limitConstraints)
+                && equalsMayBeNull(matchParameters, other.matchParameters);
+    }
+    
+    private boolean equalsMayBeNull(final Object obj1, final Object obj2) {
+        if ( obj1 == null ) {
+            return obj2 == null;
+        }
+        return obj1.equals(obj2);
+    }        
+}
diff --git a/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/guard/MatchParameters.java b/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/guard/MatchParameters.java
new file mode 100644
index 0000000..e0457e7
--- /dev/null
+++ b/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/guard/MatchParameters.java
@@ -0,0 +1,151 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * policy-yaml
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2019 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.controlloop.policy.guard;
+
+import java.util.LinkedList;
+import java.util.List;
+
+
+public class MatchParameters {
+    private String controlLoopName;
+    private String actor;
+    private String recipe;
+    private List<String> targets;
+
+    public MatchParameters() {
+        // Do Nothing Empty Constructor.
+    }   
+    
+    public MatchParameters(String actor, String recipe) {
+        this.actor = actor;
+        this.recipe = recipe;
+    }
+
+    /**
+     * Constructor.
+     * 
+     * @param actor actor
+     * @param recipe recipe
+     * @param targets targets
+     */
+    public MatchParameters(String actor, String recipe, List<String> targets) {
+        this(actor, recipe);
+        if (targets != null) {
+            this.targets = new LinkedList<>(targets);
+        }
+    }
+
+    public MatchParameters(String controlLoopName, String actor, String recipe, List<String> targets) {
+        this(actor, recipe, targets);
+        this.controlLoopName = controlLoopName;
+    }
+
+    /**
+     * Constructor.
+     * 
+     * @param matchParameters match parameters
+     */
+    public MatchParameters(MatchParameters matchParameters) {
+
+        this.controlLoopName = matchParameters.controlLoopName;
+        this.actor = matchParameters.actor;
+        this.recipe = matchParameters.recipe;
+        if (matchParameters.targets != null) {
+            this.targets = new LinkedList<>(matchParameters.targets);
+        }
+    }
+
+    public String getControlLoopName() {
+        return controlLoopName;
+    }
+
+    public void setControlLoopName(String controlLoopName) {
+        this.controlLoopName = controlLoopName;
+    }
+
+    public String getActor() {
+        return actor;
+    }
+
+    public void setActor(String actor) {
+        this.actor = actor;
+    }
+
+    public String getRecipe() {
+        return recipe;
+    }
+
+    public void setRecipe(String recipe) {
+        this.recipe = recipe;
+    }
+
+    public List<String> getTargets() {
+        return targets;
+    }
+
+    public void setTargets(List<String> targets) {
+        this.targets = targets;
+    }
+
+    @Override
+    public String toString() {
+        return "MatchParameters [controlLoopName=" + controlLoopName + ", actor=" + actor + ", recipe=" + recipe
+                + ", targets=" + targets + "]";
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((actor == null) ? 0 : actor.hashCode());
+        result = prime * result + ((controlLoopName == null) ? 0 : controlLoopName.hashCode());
+        result = prime * result + ((recipe == null) ? 0 : recipe.hashCode());
+        result = prime * result + ((targets == null) ? 0 : targets.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null) {
+            return false;
+        }
+        if (getClass() != obj.getClass()) {
+            return false;
+        }
+        MatchParameters other = (MatchParameters) obj;
+        
+        return equalsMayBeNull(actor, other.actor)
+                && equalsMayBeNull(controlLoopName, other.controlLoopName)
+                && equalsMayBeNull(recipe, other.recipe)
+                && equalsMayBeNull(targets, other.targets);
+    }
+    
+    private boolean equalsMayBeNull(final Object obj1, final Object obj2) {
+        if (obj1 == null) {
+            return obj2 == null;
+        }
+        return obj1.equals(obj2);
+    }
+}
diff --git a/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/guard/builder/ControlLoopGuardBuilder.java b/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/guard/builder/ControlLoopGuardBuilder.java
new file mode 100644
index 0000000..a6c92ee
--- /dev/null
+++ b/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/guard/builder/ControlLoopGuardBuilder.java
@@ -0,0 +1,129 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * policy-yaml
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2019 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.controlloop.policy.guard.builder;
+
+import org.onap.policy.controlloop.policy.builder.BuilderException;
+import org.onap.policy.controlloop.policy.builder.Results;
+import org.onap.policy.controlloop.policy.guard.Constraint;
+import org.onap.policy.controlloop.policy.guard.ControlLoopGuard;
+import org.onap.policy.controlloop.policy.guard.Guard;
+import org.onap.policy.controlloop.policy.guard.GuardPolicy;
+import org.onap.policy.controlloop.policy.guard.builder.impl.ControlLoopGuardBuilderImpl;
+
+public interface ControlLoopGuardBuilder {
+    
+    /**
+     * Adds one or more guard policies to the Control Loop Guard.
+     * 
+     * @param policies policies to add
+     * @return  builder object
+     * @throws BuilderException builder exception
+     */
+    public ControlLoopGuardBuilder  addGuardPolicy(GuardPolicy... policies) throws BuilderException;
+    
+    /**
+     * Removes one or more guard policies from the Control Loop Guard.
+     * 
+     * @param policies policies to add
+     * @return  builder object
+     * @throws BuilderException builder exception
+     */
+    public ControlLoopGuardBuilder  removeGuardPolicy(GuardPolicy... policies) throws BuilderException;
+    
+    /**
+     * Removes all guard policies from the Control Loop Guard.
+     * 
+     * @return  builder object
+     * @throws BuilderException builder exception
+     */
+    public ControlLoopGuardBuilder  removeAllGuardPolicies() throws BuilderException;
+    
+    /**
+     * Adds one or more time limit constraints to the guard policy.
+     * 
+     * @param id (guard policy id)
+     * @param constraints the constraints to add
+     * @return builder object
+     * @throws BuilderException builder exception
+     */
+    public ControlLoopGuardBuilder  addLimitConstraint(String id, Constraint... constraints) throws BuilderException;
+    
+    /**
+     * Removes one or more time limit constraints from the guard policy.
+     * 
+     * @param id (guard policy id)
+     * @param constraints constraints to remove
+     * @return builder object
+     * @throws BuilderException builder exception
+     */
+    public ControlLoopGuardBuilder  removeLimitConstraint(String id, Constraint... constraints) throws BuilderException;
+    
+    /**
+     * Removes all time limit constraints from the guard policy.
+     * 
+     * @param id (guard policy id)
+     * @return builder object
+     * @throws BuilderException builder exception
+     */
+    public ControlLoopGuardBuilder  removeAllLimitConstraints(String id) throws BuilderException;
+    
+    /**
+     *  Simply return a copy of control loop guard.
+     *  
+     *  @return ControlLoopGuard
+     */
+    public ControlLoopGuard getControlLoopGuard();  
+    
+    /**
+     * This will compile and build the YAML specification for the Control Loop Guard. 
+     * Please iterate the Results object for details.
+     * The Results object will contains warnings and errors. 
+     * If the specification compiled successfully, you will be able to retrieve the
+     * YAML.
+     * 
+     * @return Results
+     */
+    public Results  buildSpecification();
+    
+    /**
+     * The Factory is used to build a ControlLoopGuardBuilder implementation.
+     *
+     */
+    public static class Factory {
+        
+        private Factory(){
+            //Do Nothing Private Constructor. 
+        }
+        /**
+         * Build the control loop guard.
+         * 
+         * @param guard the guard
+         * @return ControlLoopGuardBuilder object
+         */
+        
+        public static ControlLoopGuardBuilder   buildControlLoopGuard(Guard guard) {
+            
+            return  new ControlLoopGuardBuilderImpl(guard);
+            
+        }
+    }
+}
diff --git a/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/guard/builder/impl/ControlLoopGuardBuilderImpl.java b/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/guard/builder/impl/ControlLoopGuardBuilderImpl.java
new file mode 100644
index 0000000..a84783b
--- /dev/null
+++ b/models-interactions/model-yaml/src/main/java/org/onap/policy/controlloop/policy/guard/builder/impl/ControlLoopGuardBuilderImpl.java
@@ -0,0 +1,249 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * policy-yaml
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2019 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.controlloop.policy.guard.builder.impl;
+
+import java.util.LinkedList;
+
+import org.onap.policy.controlloop.compiler.CompilerException;
+import org.onap.policy.controlloop.compiler.ControlLoopCompilerCallback;
+import org.onap.policy.controlloop.guard.compiler.ControlLoopGuardCompiler;
+import org.onap.policy.controlloop.policy.builder.BuilderException;
+import org.onap.policy.controlloop.policy.builder.MessageLevel;
+import org.onap.policy.controlloop.policy.builder.Results;
+import org.onap.policy.controlloop.policy.builder.impl.MessageImpl;
+import org.onap.policy.controlloop.policy.builder.impl.ResultsImpl;
+import org.onap.policy.controlloop.policy.guard.Constraint;
+import org.onap.policy.controlloop.policy.guard.ControlLoopGuard;
+import org.onap.policy.controlloop.policy.guard.Guard;
+import org.onap.policy.controlloop.policy.guard.GuardPolicy;
+import org.onap.policy.controlloop.policy.guard.builder.ControlLoopGuardBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.yaml.snakeyaml.DumperOptions;
+import org.yaml.snakeyaml.DumperOptions.FlowStyle;
+import org.yaml.snakeyaml.Yaml;
+
+public class ControlLoopGuardBuilderImpl implements ControlLoopGuardBuilder {
+    private static final String NO_EXISTING_GUARD_POLICY_MATCHING_THE_ID = "No existing guard policy matching the id: ";
+    private static final String THE_ID_OF_TARGET_GUARD_POLICY_MUST_NOT_BE_NULL = 
+                    "The id of target guard policy must not be null";
+    private static Logger logger = LoggerFactory.getLogger(ControlLoopGuardBuilderImpl.class.getName());
+    private ControlLoopGuard clGuard;
+    
+    public ControlLoopGuardBuilderImpl(Guard guard) {
+        clGuard = new ControlLoopGuard();
+        clGuard.setGuard(guard);
+    }
+    
+    @Override
+    public ControlLoopGuardBuilder addGuardPolicy(GuardPolicy... policies) throws BuilderException {
+        if (policies == null) {
+            throw new BuilderException("GuardPolicy must not be null");
+        }
+        for (GuardPolicy policy : policies) {
+            if (!policy.isValid()) {
+                throw new BuilderException("Invalid guard policy - some required fields are missing");
+            }
+            if (clGuard.getGuards() == null) {
+                clGuard.setGuards(new LinkedList<>());
+            }
+            clGuard.getGuards().add(policy);
+        }
+        return this;
+    }
+
+    @Override
+    public ControlLoopGuardBuilder removeGuardPolicy(GuardPolicy... policies) throws BuilderException {
+        if (policies == null) {
+            throw new BuilderException("GuardPolicy must not be null");
+        }
+        if (clGuard.getGuards() == null) {
+            throw new BuilderException("No existing guard policies to remove");
+        }
+        for (GuardPolicy policy : policies) {
+            if (!policy.isValid()) {
+                throw new BuilderException("Invalid guard policy - some required fields are missing");
+            }
+            boolean removed = clGuard.getGuards().remove(policy);
+            if (!removed) {
+                throw new BuilderException("Unknown guard policy: " + policy.getName());
+            }
+        }
+        return this;
+    }
+
+    @Override
+    public ControlLoopGuardBuilder removeAllGuardPolicies() throws BuilderException {
+        clGuard.getGuards().clear();
+        return this;
+    }
+
+    @Override
+    public ControlLoopGuardBuilder addLimitConstraint(String id, Constraint... constraints) throws BuilderException {
+        if (id == null) {
+            throw new BuilderException(THE_ID_OF_TARGET_GUARD_POLICY_MUST_NOT_BE_NULL);
+        }
+        if (constraints == null) {
+            throw new BuilderException("Constraint much not be null");
+        }
+        if (!addLimitConstraints(id,constraints)) {
+            throw new BuilderException(NO_EXISTING_GUARD_POLICY_MATCHING_THE_ID + id);
+        }
+        return this;
+    }
+
+    private boolean addLimitConstraints(String id, Constraint... constraints) throws BuilderException {
+        boolean exist = false;
+        for (GuardPolicy policy: clGuard.getGuards()) {
+            //
+            // We could have only one guard policy matching the id
+            //
+            if (policy.getId().equals(id)) {
+                exist = true;
+                for (Constraint cons: constraints) {
+                    if (!cons.isValid()) {
+                        throw new BuilderException("Invalid guard constraint - some required fields are missing");
+                    }
+                    if (policy.getLimit_constraints() == null) {
+                        policy.setLimit_constraints(new LinkedList<>());
+                    }
+                    policy.getLimit_constraints().add(cons);
+                }
+                break;
+            }
+        }
+        return exist;
+    }
+
+    @Override
+    public ControlLoopGuardBuilder removeLimitConstraint(String id, Constraint... constraints) throws BuilderException {
+        if (id == null) {
+            throw new BuilderException(THE_ID_OF_TARGET_GUARD_POLICY_MUST_NOT_BE_NULL);
+        }
+        if (constraints == null) {
+            throw new BuilderException("Constraint much not be null");
+        }
+        if (!removeConstraints(id, constraints)) {
+            throw new BuilderException(NO_EXISTING_GUARD_POLICY_MATCHING_THE_ID + id);
+        }
+        return this;
+    }
+
+    private boolean removeConstraints(String id, Constraint... constraints) throws BuilderException {
+        boolean exist = false;
+        for (GuardPolicy policy: clGuard.getGuards()) {
+            //
+            // We could have only one guard policy matching the id
+            //
+            if (policy.getId().equals(id)) {
+                exist = true;
+                for (Constraint cons: constraints) {
+                    if (!cons.isValid()) {
+                        throw new BuilderException("Invalid guard constraint - some required fields are missing");
+                    }
+                    boolean removed = policy.getLimit_constraints().remove(cons);
+                    if (!removed) {
+                        throw new BuilderException("Unknown guard constraint: " + cons);
+                    }
+                }
+                break;
+            }
+        }
+        return exist;
+    }
+
+    @Override
+    public ControlLoopGuardBuilder removeAllLimitConstraints(String id) throws BuilderException {
+        if (clGuard.getGuards() == null || clGuard.getGuards().isEmpty()) {
+            throw new BuilderException("No guard policies exist");
+        } 
+        if (id == null) {
+            throw new BuilderException(THE_ID_OF_TARGET_GUARD_POLICY_MUST_NOT_BE_NULL);
+        }
+        boolean exist = false;
+        for (GuardPolicy policy: clGuard.getGuards()) {
+            if (policy.getId().equals(id)) {
+                exist = true;
+                policy.getLimit_constraints().clear();
+            }
+        }
+        if (!exist) {
+            throw new BuilderException(NO_EXISTING_GUARD_POLICY_MATCHING_THE_ID + id);
+        }
+        return this;
+    }
+
+    
+    private class BuilderCompilerCallback implements ControlLoopCompilerCallback {
+
+        private ResultsImpl results = new ResultsImpl();
+        
+        @Override
+        public boolean onWarning(String message) {
+            results.addMessage(new MessageImpl(message, MessageLevel.WARNING));
+            return false;
+        }
+
+        @Override
+        public boolean onError(String message) {
+            results.addMessage(new MessageImpl(message, MessageLevel.ERROR));
+            return false;
+        }
+    }
+    
+    @Override
+    public ControlLoopGuard getControlLoopGuard() {
+        return new ControlLoopGuard(this.clGuard);
+    }   
+    
+    
+    @Override
+    public Results buildSpecification() {
+        //
+        // Dump the specification
+        //
+        DumperOptions options = new DumperOptions();
+        options.setDefaultFlowStyle(FlowStyle.BLOCK);
+        options.setPrettyFlow(true);
+        Yaml yaml = new Yaml(options);
+        String dumpedYaml = yaml.dump(clGuard);
+        //
+        // This is our callback class for our compiler
+        //
+        BuilderCompilerCallback callback = new BuilderCompilerCallback();
+        //
+        // Compile it
+        //
+        try {
+            ControlLoopGuardCompiler.compile(clGuard, callback);
+        } catch (CompilerException e) {
+            logger.error("Build specification threw ", e);
+            callback.results.addMessage(new MessageImpl(e.getMessage(), MessageLevel.EXCEPTION));
+        }
+        //
+        // Save the spec
+        //
+        callback.results.setSpecification(dumpedYaml);
+        return callback.results;
+    }
+
+}
diff --git a/models-interactions/model-yaml/src/test/java/org/onap/policy/controlloop/compiler/CompilerExceptionTest.java b/models-interactions/model-yaml/src/test/java/org/onap/policy/controlloop/compiler/CompilerExceptionTest.java
new file mode 100644
index 0000000..ef3a682
--- /dev/null
+++ b/models-interactions/model-yaml/src/test/java/org/onap/policy/controlloop/compiler/CompilerExceptionTest.java
@@ -0,0 +1,32 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2018 Ericsson. All rights reserved.
+ * Modifications Copyright (C) 2019 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.controlloop.compiler;
+
+import org.junit.Test;
+import org.onap.policy.common.utils.test.ExceptionsTester;
+
+public class CompilerExceptionTest extends ExceptionsTester {
+
+    @Test
+    public void test() throws Exception {
+        test(CompilerException.class);
+    }
+
+}
diff --git a/models-interactions/model-yaml/src/test/java/org/onap/policy/controlloop/compiler/ControlLoopCompilerTest.java b/models-interactions/model-yaml/src/test/java/org/onap/policy/controlloop/compiler/ControlLoopCompilerTest.java
new file mode 100644
index 0000000..1028bde
--- /dev/null
+++ b/models-interactions/model-yaml/src/test/java/org/onap/policy/controlloop/compiler/ControlLoopCompilerTest.java
@@ -0,0 +1,221 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * policy-yaml unit test
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2019 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.controlloop.compiler;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.onap.policy.controlloop.policy.ControlLoopPolicy;
+import org.onap.policy.controlloop.policy.FinalResult;
+
+public class ControlLoopCompilerTest {
+
+    @Rule
+    public ExpectedException expectedException = ExpectedException.none();
+
+    @Test 
+    public void testTest() throws Exception {
+        List<String> expectedOnErrorMessages = new ArrayList<>();
+        expectedOnErrorMessages.add("Operational Policy has an bad ID");
+        expectedOnErrorMessages.add("Policy id is set to a PolicyResult SUCCESS");
+        expectedOnErrorMessages.add("Policy id is set to a FinalResult FINAL_SUCCESS");
+        expectedOnErrorMessages.add("Policy actor is null");
+        expectedOnErrorMessages.add("Policy actor is invalid");
+        expectedOnErrorMessages.add("Policy recipe is null");
+        expectedOnErrorMessages.add("Policy recipe is invalid");
+        expectedOnErrorMessages.add("Policy recipe is invalid");
+        expectedOnErrorMessages.add("Policy recipe is invalid");
+        expectedOnErrorMessages.add("Policy target is null");
+        expectedOnErrorMessages.add("Policy target is invalid");
+        expectedOnErrorMessages.add("Policy success is neither another policy nor FINAL_SUCCESS");
+        expectedOnErrorMessages.add("Policy failure is neither another policy nor FINAL_FAILURE");
+        expectedOnErrorMessages.add("Policy failure retries is neither another policy nor FINAL_FAILURE_RETRIES");
+        expectedOnErrorMessages.add("Policy failure timeout is neither another policy nor FINAL_FAILURE_TIMEOUT");
+        expectedOnErrorMessages.add("Policy failure exception is neither another policy nor FINAL_FAILURE_EXCEPTION");
+        expectedOnErrorMessages.add("Policy failure guard is neither another policy nor FINAL_FAILURE_GUARD");
+        expectedOnErrorMessages.add("Unsupported version for this compiler");
+        expectedOnErrorMessages.add("controlLoop overall timeout is less than the sum of operational policy timeouts.");
+
+        TestControlLoopCompilerCallback testControlLoopCompilerCallback = 
+                        new TestControlLoopCompilerCallback(expectedOnErrorMessages);
+        ControlLoopPolicy controlLoopPolicy = this.test("src/test/resources/v1.0.0/test.yaml", 
+                        testControlLoopCompilerCallback);
+        assertEquals(22, controlLoopPolicy.getPolicies().size());
+        assertTrue(testControlLoopCompilerCallback.areAllExpectedOnErrorsReceived());
+    }
+
+    @Test
+    public void testSuccessConnectedToUnknownPolicy() throws Exception {
+        expectedException.expect(CompilerException.class);
+        expectedException.expectMessage(
+                        "Operation Policy unique-policy-id-1-restart is connected to unknown policy unknown-policy");
+        this.test("src/test/resources/v1.0.0/bad_policy_success_connected_to_unknown_policy.yaml");
+    }
+
+    @Test
+    public void testFailureConnectedToUnknownPolicy() throws Exception {
+        expectedException.expect(CompilerException.class);
+        expectedException.expectMessage(
+                        "Operation Policy unique-policy-id-1-restart is connected to unknown policy unknown-policy");
+        this.test("src/test/resources/v1.0.0/bad_policy_failure_connected_to_unknown_policy.yaml");
+    }
+
+    @Test
+    public void testFailureTimeoutToUnknownPolicy() throws Exception {
+        expectedException.expect(CompilerException.class);
+        expectedException.expectMessage(
+                        "Operation Policy unique-policy-id-1-restart is connected to unknown policy unknown-policy");
+        this.test("src/test/resources/v1.0.0/bad_policy_failure_timeout_connected_to_unknown_policy.yaml");
+    }
+
+    @Test
+    public void testFailureRetriesToUnknownPolicy() throws Exception {
+        expectedException.expect(CompilerException.class);
+        expectedException.expectMessage(
+                        "Operation Policy unique-policy-id-1-restart is connected to unknown policy unknown-policy");
+        this.test("src/test/resources/v1.0.0/bad_policy_failure_retries_connected_to_unknown_policy.yaml");
+    }
+
+    @Test
+    public void testFailureExceptionToUnknownPolicy() throws Exception {
+        expectedException.expect(CompilerException.class);
+        expectedException.expectMessage(
+                        "Operation Policy unique-policy-id-1-restart is connected to unknown policy unknown-policy");
+        this.test("src/test/resources/v1.0.0/bad_policy_failure_exception_connected_to_unknown_policy.yaml");
+    }
+
+    @Test
+    public void testFailureGuardToUnknownPolicy() throws Exception {
+        expectedException.expect(CompilerException.class);
+        expectedException.expectMessage(
+                        "Operation Policy unique-policy-id-1-restart is connected to unknown policy unknown-policy");
+        this.test("src/test/resources/v1.0.0/bad_policy_failure_guard_connected_to_unknown_policy.yaml");
+    }
+
+    @Test 
+    public void testInvalidTriggerPolicyId() throws Exception {
+        expectedException.expect(CompilerException.class);
+        expectedException.expectMessage(
+                        "Unexpected value for trigger_policy, should only be " 
+                        + FinalResult.FINAL_OPENLOOP.toString() + " or a valid Policy ID");
+        this.test("src/test/resources/v1.0.0/bad_trigger_1.yaml");
+    }
+
+    @Test 
+    public void testNoTriggerPolicyId() throws Exception {
+        expectedException.expect(CompilerException.class);
+        this.test("src/test/resources/v1.0.0/bad_trigger_no_trigger_id.yaml");
+    }
+
+    @Test 
+    public void testNoControlLoopName() throws Exception {
+        List<String> expectedOnErrorMessages = new ArrayList<>();
+        expectedOnErrorMessages.add("Missing controlLoopName");
+        expectedOnErrorMessages.add("Unsupported version for this compiler");
+        TestControlLoopCompilerCallback testControlLoopCompilerCallback = 
+                        new TestControlLoopCompilerCallback(expectedOnErrorMessages);
+        this.test("src/test/resources/v1.0.0/bad_control_loop_no_control_loop_name.yaml", 
+                        testControlLoopCompilerCallback);
+        assertTrue(testControlLoopCompilerCallback.areAllExpectedOnErrorsReceived());
+    }
+
+    @Test 
+    public void testInvalidFinalResult() throws Exception {
+        expectedException.expect(CompilerException.class);
+        expectedException.expectMessage(
+                     "Unexpected Final Result for trigger_policy, should only be FINAL_OPENLOOP or a valid Policy ID");
+        this.test("src/test/resources/v1.0.0/bad_trigger_2.yaml");
+    }
+
+    @Test 
+    public void testCompileEmptyFile() throws Exception {
+        expectedException.expect(CompilerException.class);
+        expectedException.expectMessage("Could not parse yaml specification.");
+        this.test("src/test/resources/v1.0.0/empty.yaml");
+    }
+
+    public ControlLoopPolicy test(String testFile) throws Exception {
+        return test(testFile, null);
+    }
+
+    /**
+     * Does the actual test.
+     * 
+     * @param testFile test file
+     * @param controlLoopCompilerCallback callback method
+     * @return the policy object
+     * @throws Exception exception
+     */
+    public ControlLoopPolicy test(String testFile, 
+                    ControlLoopCompilerCallback controlLoopCompilerCallback) throws Exception {
+        try (InputStream is = new FileInputStream(new File(testFile))) {
+            return ControlLoopCompiler.compile(is, controlLoopCompilerCallback);
+        } catch (FileNotFoundException e) {
+            fail(e.getMessage());
+        } catch (IOException e) {
+            fail(e.getMessage());
+        } catch (Exception e) {
+            throw e;
+        }
+        return null;
+    }
+
+    class TestControlLoopCompilerCallback implements ControlLoopCompilerCallback {
+
+        private List<String> expectedOnErrorMessages;
+
+        public TestControlLoopCompilerCallback(List<String> expectedOnErrorMessages) {
+            this.expectedOnErrorMessages = expectedOnErrorMessages;
+        }
+
+        @Override
+        public boolean onWarning(String message) {
+            return true;
+        }
+
+        @Override
+        public boolean onError(String message) {
+            if (!expectedOnErrorMessages.remove(message)) {
+                fail("Unexpected onError message: " + message);
+            }
+            return true;
+        }
+
+        public boolean areAllExpectedOnErrorsReceived() {
+            return expectedOnErrorMessages.size() == 0;
+        }
+
+    }
+
+}
diff --git a/models-interactions/model-yaml/src/test/java/org/onap/policy/controlloop/compiler/ControlLoopGuardCompilerTest.java b/models-interactions/model-yaml/src/test/java/org/onap/policy/controlloop/compiler/ControlLoopGuardCompilerTest.java
new file mode 100644
index 0000000..850a4a3
--- /dev/null
+++ b/models-interactions/model-yaml/src/test/java/org/onap/policy/controlloop/compiler/ControlLoopGuardCompilerTest.java
@@ -0,0 +1,110 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * policy-yaml unit test
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2019 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.controlloop.compiler;
+
+import static org.junit.Assert.fail;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.junit.Test;
+
+import org.onap.policy.controlloop.guard.compiler.ControlLoopGuardCompiler;
+
+public class ControlLoopGuardCompilerTest {
+
+    @Test 
+    public void testTest1() {
+        try {
+            this.test("src/test/resources/v2.0.0-guard/policy_guard_ONAP_demo_vDNS.yaml");
+        } catch (Exception e) {
+            fail(e.getMessage());
+        }
+    }
+
+    @Test 
+    public void testTest2() {
+        try {
+            this.test("src/test/resources/v2.0.0-guard/policy_guard_appc_restart.yaml");
+        } catch (Exception e) {
+            fail(e.getMessage());
+        }
+    }
+
+    @Test 
+    public void testBad1() {
+        try {
+            this.test("src/test/resources/v2.0.0-guard/no_guard_policy.yaml");
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test 
+    public void testBad2() {
+        try {
+            this.test("src/test/resources/v2.0.0-guard/duplicate_guard_policy.yaml");
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test 
+    public void testBad3() {
+        try {
+            this.test("src/test/resources/v2.0.0-guard/no_guard_constraint.yaml");
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test 
+    public void testBad4() {
+        try {
+            this.test("src/test/resources/v2.0.0-guard/duplicate_guard_constraint.yaml");
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * Does the actual test.
+     * 
+     * @param testFile input test file
+     * @throws Exception exception thrown
+     */
+    public void test(String testFile) throws Exception {
+        try (InputStream is = new FileInputStream(new File(testFile))) {
+            ControlLoopGuardCompiler.compile(is, null);
+        } catch (FileNotFoundException e) {
+            fail(e.getMessage());
+        } catch (IOException e) {
+            fail(e.getMessage());
+        } catch (Exception e) {
+            throw e;
+        }
+    }
+
+}
diff --git a/models-interactions/model-yaml/src/test/java/org/onap/policy/controlloop/policy/ControlLoopPolicyBuilderTest.java b/models-interactions/model-yaml/src/test/java/org/onap/policy/controlloop/policy/ControlLoopPolicyBuilderTest.java
new file mode 100644
index 0000000..b95d0e0
--- /dev/null
+++ b/models-interactions/model-yaml/src/test/java/org/onap/policy/controlloop/policy/ControlLoopPolicyBuilderTest.java
@@ -0,0 +1,947 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * policy-yaml unit test
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2019 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.controlloop.policy;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.UUID;
+
+import org.junit.Ignore;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.onap.policy.aai.Pnf;
+import org.onap.policy.aai.PnfType;
+import org.onap.policy.controlloop.policy.builder.BuilderException;
+import org.onap.policy.controlloop.policy.builder.ControlLoopPolicyBuilder;
+import org.onap.policy.controlloop.policy.builder.Message;
+import org.onap.policy.controlloop.policy.builder.MessageLevel;
+import org.onap.policy.controlloop.policy.builder.Results;
+import org.onap.policy.sdc.Resource;
+import org.onap.policy.sdc.ResourceType;
+import org.onap.policy.sdc.Service;
+import org.yaml.snakeyaml.Yaml;
+import org.yaml.snakeyaml.constructor.Constructor;
+import org.yaml.snakeyaml.error.YAMLException;
+
+
+public class ControlLoopPolicyBuilderTest {
+
+    @Rule
+    public ExpectedException expectedException = ExpectedException.none();
+
+    @Test
+    public void testControlLoop() {
+        try {
+            //
+            // Create a builder for our policy
+            //
+            ControlLoopPolicyBuilder builder =
+                    ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 2400);
+            //
+            // Test add services
+            //
+            Service scp = new Service("vSCP");
+            Service usp = new Service("vUSP");
+            Service trinity = new Service("Trinity");
+            builder = builder.addService(scp, usp, trinity);
+            assertTrue(builder.getControlLoop().getServices().size() == 3);
+            //
+            // Test remove services
+            //
+            builder = builder.removeService(scp);
+            assertTrue(builder.getControlLoop().getServices().size() == 2);
+            builder = builder.removeAllServices();
+            assertTrue(builder.getControlLoop().getServices().size() == 0);
+            //
+            // Test add resources
+            //
+            Resource cts = new Resource("vCTS", ResourceType.VF);
+            Resource com = new Resource("vCTS", ResourceType.VF);
+            Resource rar = new Resource("vCTS", ResourceType.VF);
+            builder = builder.addResource(cts, com, rar);
+            assertTrue(builder.getControlLoop().getResources().size() == 3);
+            //
+            // Test remove resources
+            //
+            builder = builder.removeResource(cts);
+            assertTrue(builder.getControlLoop().getResources().size() == 2);
+            builder = builder.removeAllResources();
+            assertTrue(builder.getControlLoop().getResources().size() == 0);
+        } catch (BuilderException e) {
+            fail(e.getMessage());
+        }
+    }
+
+    @Test
+    public void testAddNullService() throws BuilderException {
+        ControlLoopPolicyBuilder builder =
+                ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 2400);
+        expectedException.expect(BuilderException.class);
+        expectedException.expectMessage("Service must not be null");
+        builder.addService((Service) null);
+    }
+
+    @Test
+    public void testAddInvalidService() throws BuilderException {
+        ControlLoopPolicyBuilder builder =
+                ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 2400);
+        expectedException.expect(BuilderException.class);
+        expectedException.expectMessage("Invalid service - need either a serviceUUID or serviceName");
+        builder.addService(new Service());
+    }
+
+    @Test
+    public void testAddServiceWithUuid() throws BuilderException {
+        ControlLoopPolicyBuilder builder =
+                ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 2400);
+        UUID uuid = UUID.randomUUID();
+        Service serviceWithUuid = new Service(uuid);
+        builder.addService(serviceWithUuid);
+        assertTrue(builder.getControlLoop().getServices().size() == 1);
+    }
+
+    @Test
+    public void testAddNullResource() throws BuilderException {
+        ControlLoopPolicyBuilder builder =
+                ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 2400);
+        expectedException.expect(BuilderException.class);
+        expectedException.expectMessage("Resource must not be null");
+        builder.addResource((Resource) null);
+    }
+
+
+    @Test
+    public void testAddInvalidResource() throws BuilderException {
+        ControlLoopPolicyBuilder builder =
+                ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 2400);
+        expectedException.expect(BuilderException.class);
+        expectedException.expectMessage("Invalid resource - need either resourceUUID or resourceName");
+        builder.addResource(new Resource());
+    }
+
+    @Test
+    public void testAddAndRemoveResourceWithUuid() throws BuilderException {
+        ControlLoopPolicyBuilder builder =
+                ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 2400);
+        UUID uuid = UUID.randomUUID();
+        Resource resourceWithUuid = new Resource(uuid);
+        builder.addResource(resourceWithUuid);
+        assertTrue(builder.getControlLoop().getResources().size() == 1);
+
+        builder.removeResource(resourceWithUuid);
+        assertTrue(builder.getControlLoop().getResources().size() == 0);
+    }
+
+    @Test
+    public void testRemoveNullResource() throws BuilderException {
+        ControlLoopPolicyBuilder builder =
+                ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 2400);
+        Resource resource = new Resource("resource1", ResourceType.VF);
+        builder.addResource(resource);
+        expectedException.expect(BuilderException.class);
+        expectedException.expectMessage("Resource must not be null");
+        builder.removeResource((Resource) null);
+    }
+
+    @Test
+    public void testRemoveResourceNoExistingResources() throws BuilderException {
+        ControlLoopPolicyBuilder builder =
+                ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 2400);
+        expectedException.expect(BuilderException.class);
+        expectedException.expectMessage("No existing resources to remove");
+        builder.removeResource(new Resource("resource1", ResourceType.VF));
+    }
+
+    @Test
+    public void testRemoveInvalidResource() throws BuilderException {
+        ControlLoopPolicyBuilder builder =
+                ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 2400);
+        Resource resource = new Resource("resource1", ResourceType.VF);
+        builder.addResource(resource);
+        expectedException.expect(BuilderException.class);
+        expectedException.expectMessage("Invalid resource - need either a resourceUUID or resourceName");
+        builder.removeResource(new Resource());
+    }
+
+    @Test
+    public void testRemoveUnknownResource() throws BuilderException {
+        ControlLoopPolicyBuilder builder =
+                ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 2400);
+        Resource resource = new Resource("resource1", ResourceType.VF);
+        builder.addResource(resource);
+        final String unknownResourceName = "reource2";
+        expectedException.expect(BuilderException.class);
+        expectedException.expectMessage("Unknown resource " + unknownResourceName);
+        builder.removeResource(new Resource(unknownResourceName, ResourceType.VF));
+    }
+
+    @Test
+    public void testControlLoopWithInitialResourceAndServices() {
+        try {
+            Resource cts = new Resource("vCTS", ResourceType.VF);
+            Service scp = new Service("vSCP");
+            Service usp = new Service("vUSP");
+            ControlLoopPolicyBuilder builder = ControlLoopPolicyBuilder.Factory
+                    .buildControlLoop(UUID.randomUUID().toString(), 2400, cts, scp, usp);
+            assertTrue(builder.getControlLoop().getResources().size() == 1);
+            assertTrue(builder.getControlLoop().getServices().size() == 2);
+        } catch (BuilderException e) {
+            fail(e.getMessage());
+        }
+    }
+
+    @Test
+    public void testControlLoopWithInitialResourcesAndService() {
+        try {
+            Resource cts = new Resource("vCTS", ResourceType.VF);
+            Resource com = new Resource("vCTS", ResourceType.VF);
+            Service scp = new Service("vSCP");
+            ControlLoopPolicyBuilder builder = ControlLoopPolicyBuilder.Factory
+                    .buildControlLoop(UUID.randomUUID().toString(), 2400, scp, cts, com);
+            assertTrue(builder.getControlLoop().getServices().size() == 1);
+            assertTrue(builder.getControlLoop().getResources().size() == 2);
+        } catch (BuilderException e) {
+            fail(e.getMessage());
+        }
+    }
+
+    @Test
+    @Ignore
+    // I'VE MARKED THIS TEST CASE AS IGNORE BECAUSE THE TEST CASE FAILS
+    // This test case fails because builder.getControlLoop() returns an instance of ControlLoop
+    // copied using
+    // the ControlLoop(ControlLoop controlLoop) constructor.
+    // This constructor does not copy the value of pnf into the newly created object
+    // On the face of it, this looks like a bug, but perhaps there is a reason for this
+    // PLEASE ADVISE IF THE BEHAVIOUR IS INCORRECT OR THE TEST CASE IS INVALID
+    public void testControlLoopForPnf() {
+        try {
+            Pnf pnf = new Pnf();
+            pnf.setPnfType(PnfType.ENODEB);
+            ControlLoopPolicyBuilder builder =
+                    ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 2400, pnf);
+            assertEquals(pnf, builder.getControlLoop().getPnf());
+
+            builder.removePNF();
+            assertNull(builder.getControlLoop().getPnf());
+        } catch (BuilderException e) {
+            fail(e.getMessage());
+        }
+    }
+
+    @Test
+    @Ignore
+    // Fails for the same reason as the above test case
+    public void testSetAndRemovePnf() throws BuilderException {
+        ControlLoopPolicyBuilder builder =
+                ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 2400);
+        assertNull(builder.getControlLoop().getPnf());
+
+        Pnf pnf = new Pnf();
+        pnf.setPnfType(PnfType.ENODEB);
+        builder.setPNF(pnf);
+        assertEquals(pnf, builder.getControlLoop().getPnf());
+
+        builder.removePNF();
+        assertNull(builder.getControlLoop().getPnf());
+    }
+
+    @Test
+    public void testSetNullPnf() throws BuilderException {
+        ControlLoopPolicyBuilder builder =
+                ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 2400);
+        expectedException.expect(BuilderException.class);
+        expectedException.expectMessage("PNF must not be null");
+        builder.setPNF(null);
+    }
+
+    @Test
+    public void testSetInvalidPnf() throws BuilderException {
+        ControlLoopPolicyBuilder builder =
+                ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 2400);
+        expectedException.expect(BuilderException.class);
+        expectedException.expectMessage("Invalid PNF - need either pnfName or pnfType");
+        builder.setPNF(new Pnf());
+    }
+
+    @Test
+    public void testSetAbatement() throws BuilderException {
+        ControlLoopPolicyBuilder builder =
+                ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 2400);
+        assertFalse(builder.getControlLoop().getAbatement());
+        builder = builder.setAbatement(true);
+        assertTrue(builder.getControlLoop().getAbatement());
+    }
+
+    @Test
+    public void testSetNullAbatement() throws BuilderException {
+        ControlLoopPolicyBuilder builder =
+                ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 2400);
+        expectedException.expect(BuilderException.class);
+        expectedException.expectMessage("abatement must not be null");
+        builder = builder.setAbatement(null);
+    }
+
+    @Test
+    public void testTimeout() {
+        try {
+            //
+            // Create a builder for our policy
+            //
+            ControlLoopPolicyBuilder builder =
+                    ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 2400);
+            //
+            // Test setTimeout
+            //
+            assertTrue(builder.getControlLoop().getTimeout() == 2400);
+            builder = builder.setTimeout(800);
+            assertTrue(builder.getControlLoop().getTimeout() == 800);
+            //
+            // Test calculateTimeout
+            //
+            Policy trigger =
+                    builder.setTriggerPolicy(PolicyParam.builder().id(UUID.randomUUID().toString())
+                            .name("Restart the VM")
+                            .description("Upon getting the trigger event, restart the VM")
+                            .actor("APPC")
+                            .target(new Target(TargetType.VM))
+                            .recipe("Restart")
+                            .payload(null)
+                            .retries(2)
+                            .timeout(300).build());
+            @SuppressWarnings("unused")
+            Policy onRestartFailurePolicy = builder.setPolicyForPolicyResult(
+                    PolicyParam.builder()
+                            .name("Rebuild VM")
+                            .description("If the restart fails, rebuild it")
+                            .actor("APPC")
+                            .target(new Target(TargetType.VM))
+                            .recipe("Rebuild")
+                            .payload(null)
+                            .retries(1)
+                            .timeout(600)
+                            .id(trigger.getId()).build(),
+                            PolicyResult.FAILURE,
+                            PolicyResult.FAILURE_RETRIES,
+                            PolicyResult.FAILURE_TIMEOUT);
+            assertTrue(builder.calculateTimeout().equals(new Integer(300 + 600)));
+            //
+        } catch (BuilderException e) {
+            fail(e.getMessage());
+        }
+    }
+
+    @Test
+    public void testTriggerPolicyMethods() {
+        try {
+            ControlLoopPolicyBuilder builder =
+                    ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 2400);
+            //
+            // Test isOpenLoop
+            //
+            assertTrue(builder.isOpenLoop());
+            //
+            // Test set initial trigger policy
+            //
+            Policy triggerPolicy1 =
+                    builder.setTriggerPolicy(
+                            PolicyParam.builder().id(UUID.randomUUID().toString())
+                            .name("Restart the VM")
+                            .description("Upon getting the trigger event, restart the VM")
+                            .actor("APPC")
+                            .target(new Target(TargetType.VM))
+                            .recipe("Restart")
+                            .payload(null)
+                            .retries(2)
+                            .timeout(300).build());
+            assertTrue(builder.isOpenLoop() == false);
+            assertTrue(builder.getControlLoop().getTrigger_policy().equals(triggerPolicy1.getId()));
+            //
+            // Set trigger policy to a new policy
+            //
+            @SuppressWarnings("unused")
+            Policy triggerPolicy2 =
+                    builder.setTriggerPolicy(
+                            PolicyParam.builder()
+                            .id(UUID.randomUUID().toString())
+                            .name("Rebuild the VM")
+                            .description("Upon getting the trigger event, rebuild the VM")
+                            .actor("APPC")
+                            .target(new Target(TargetType.VM))
+                            .recipe("Rebuild")
+                            .payload(null)
+                            .retries(2)
+                            .timeout(300).build());
+            //
+            // Test set trigger policy to another existing policy
+            //
+            @SuppressWarnings("unused")
+            ControlLoop cl = builder.setExistingTriggerPolicy(triggerPolicy1.getId());
+            assertTrue(builder.getControlLoop().getTrigger_policy().equals(triggerPolicy1.getId()));
+            //
+            // Test get trigger policy
+            //
+            assertTrue(builder.getTriggerPolicy().equals(triggerPolicy1));
+            //
+        } catch (BuilderException e) {
+            fail(e.getMessage());
+        }
+    }
+
+    @Test
+    public void testSetTriggerPolicyNullPolicyId() throws BuilderException {
+        ControlLoopPolicyBuilder builder =
+                ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 2400);
+        expectedException.expect(BuilderException.class);
+        expectedException.expectMessage("Id must not be null");
+        builder.setExistingTriggerPolicy(null);
+    }
+
+    @Test
+    public void testSetTriggerPolicyNoPoliciesExist() throws BuilderException {
+        ControlLoopPolicyBuilder builder =
+                ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 2400);
+        final String unknownPolicyId = "100";
+        expectedException.expect(BuilderException.class);
+        expectedException.expectMessage("Unknown policy " + unknownPolicyId);
+        builder.setExistingTriggerPolicy(unknownPolicyId);
+    }
+
+    @Test
+    public void testSetTriggerPolicyUnknownPolicy() throws BuilderException {
+        ControlLoopPolicyBuilder builder =
+                ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 2400);
+        builder.setTriggerPolicy(
+                PolicyParam.builder()
+                .id(UUID.randomUUID().toString())
+                .name("Restart the VM")
+                .description("Upon getting the trigger event, restart the VM")
+                .actor("APPC")
+                .target(new Target(TargetType.VM))
+                .recipe("Restart")
+                .payload(null)
+                .retries(2)
+                .timeout(300).build());
+        final String unknownPolicyId = "100";
+        expectedException.expect(BuilderException.class);
+        expectedException.expectMessage("Unknown policy " + unknownPolicyId);
+        builder.setExistingTriggerPolicy(unknownPolicyId);
+    }
+
+    @Test
+    public void testAddRemovePolicies() {
+        try {
+            ControlLoopPolicyBuilder builder =
+                    ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 2400);
+            Policy triggerPolicy =
+                    builder.setTriggerPolicy(
+                            PolicyParam.builder()
+                            .id(UUID.randomUUID().toString())
+                            .name("Restart the VM")
+                            .description("Upon getting the trigger event, restart the VM")
+                            .actor("APPC")
+                            .target(new Target(TargetType.VM))
+                            .recipe("Restart")
+                            .payload(null)
+                            .retries(2)
+                            .timeout(300).build());
+            //
+            // Test create a policy and chain it to the results of trigger policy
+            //
+            Policy onRestartFailurePolicy1 = builder.setPolicyForPolicyResult(
+                    PolicyParam.builder()
+                    .name("Rebuild VM")
+                    .description("If the restart fails, rebuild it.")
+                    .actor("APPC")
+                    .target(new Target(TargetType.VM))
+                    .recipe("Rebuild")
+                    .payload(null)
+                    .retries(1)
+                    .timeout(600)
+                    .id(triggerPolicy.getId()).build(),
+                    PolicyResult.FAILURE,
+                    PolicyResult.FAILURE_EXCEPTION,
+                    PolicyResult.FAILURE_RETRIES,
+                    PolicyResult.FAILURE_TIMEOUT,
+                    PolicyResult.FAILURE_GUARD);
+            //
+            assertTrue(builder.getTriggerPolicy().getFailure().equals(onRestartFailurePolicy1.getId()));
+            assertTrue(builder.getTriggerPolicy().getFailure_exception().equals(onRestartFailurePolicy1.getId()));
+            assertTrue(builder.getTriggerPolicy().getFailure_retries().equals(onRestartFailurePolicy1.getId()));
+            assertTrue(builder.getTriggerPolicy().getFailure_timeout().equals(onRestartFailurePolicy1.getId()));
+            assertTrue(builder.getTriggerPolicy().getFailure_guard().equals(onRestartFailurePolicy1.getId()));
+
+            //
+            // Test create a policy and chain it to the results of trigger policy success
+            //
+            Policy onSuccessPolicy1 = builder.setPolicyForPolicyResult(
+                    PolicyParam.builder()
+                    .name("Do something")
+                    .description("If the restart succeeds, do something else.")
+                    .actor("APPC")
+                    .target(new Target(TargetType.VM))
+                    .recipe("SomethingElse")
+                    .payload(null)
+                    .retries(1)
+                    .timeout(600)
+                    .id(triggerPolicy.getId()).build(),
+                    PolicyResult.SUCCESS);
+            //
+            assertTrue(builder.getTriggerPolicy().getSuccess().equals(onSuccessPolicy1.getId()));
+
+            //
+            // Test remove policy
+            //
+            boolean removed = builder.removePolicy(onRestartFailurePolicy1.getId());
+            assertTrue(removed);
+            assertTrue(builder.getTriggerPolicy().getFailure().equals(FinalResult.FINAL_FAILURE.toString()));
+            assertTrue(builder.getTriggerPolicy().getFailure_retries()
+                    .equals(FinalResult.FINAL_FAILURE_RETRIES.toString()));
+            assertTrue(builder.getTriggerPolicy().getFailure_timeout()
+                    .equals(FinalResult.FINAL_FAILURE_TIMEOUT.toString()));
+            assertTrue(
+                    builder.getTriggerPolicy().getFailure_guard().equals(FinalResult.FINAL_FAILURE_GUARD.toString()));
+            //
+            // Create another policy and chain it to the results of trigger policy
+            //
+            final Policy onRestartFailurePolicy2 =
+                    builder.setPolicyForPolicyResult(
+                            PolicyParam.builder()
+                            .name("Rebuild VM")
+                            .description("If the restart fails, rebuild it.")
+                            .actor("APPC")
+                            .target(new Target(TargetType.VM))
+                            .recipe("Rebuild")
+                            .payload(null)
+                            .retries(2)
+                            .timeout(600)
+                            .id(triggerPolicy.getId()).build(),
+                            PolicyResult.FAILURE,
+                            PolicyResult.FAILURE_RETRIES,
+                            PolicyResult.FAILURE_TIMEOUT);
+            //
+            // Test reset policy results
+            //
+            triggerPolicy = builder.resetPolicyResults(triggerPolicy.getId());
+            assertTrue(builder.getTriggerPolicy().getFailure().equals(FinalResult.FINAL_FAILURE.toString()));
+            assertTrue(builder.getTriggerPolicy().getFailure_retries()
+                    .equals(FinalResult.FINAL_FAILURE_RETRIES.toString()));
+            assertTrue(builder.getTriggerPolicy().getFailure_timeout()
+                    .equals(FinalResult.FINAL_FAILURE_TIMEOUT.toString()));
+            //
+            // Test set the policy results to an existing operational policy
+            //
+            Policy onRestartFailurePolicy3 =
+                    builder.setPolicyForPolicyResult(onRestartFailurePolicy2.getId(), triggerPolicy.getId(),
+                            PolicyResult.FAILURE, PolicyResult.FAILURE_RETRIES, PolicyResult.FAILURE_TIMEOUT);
+            assertTrue(builder.getTriggerPolicy().getFailure().equals(onRestartFailurePolicy3.getId()));
+            assertTrue(builder.getTriggerPolicy().getFailure_retries().equals(onRestartFailurePolicy3.getId()));
+            assertTrue(builder.getTriggerPolicy().getFailure_timeout().equals(onRestartFailurePolicy3.getId()));
+            //
+            // Test set the policy result for success to an existing operational policy
+            //
+            Policy onRestartFailurePolicy4 =
+                    builder.setPolicyForPolicyResult(onRestartFailurePolicy2.getId(), triggerPolicy.getId(),
+                            PolicyResult.FAILURE, PolicyResult.FAILURE_EXCEPTION, PolicyResult.FAILURE_GUARD,
+                            PolicyResult.FAILURE_RETRIES, PolicyResult.FAILURE_TIMEOUT, PolicyResult.SUCCESS);
+            assertTrue(builder.getTriggerPolicy().getFailure().equals(onRestartFailurePolicy4.getId()));
+            assertTrue(builder.getTriggerPolicy().getFailure_exception().equals(onRestartFailurePolicy4.getId()));
+            assertTrue(builder.getTriggerPolicy().getFailure_guard().equals(onRestartFailurePolicy4.getId()));
+            assertTrue(builder.getTriggerPolicy().getFailure_retries().equals(onRestartFailurePolicy4.getId()));
+            assertTrue(builder.getTriggerPolicy().getFailure_timeout().equals(onRestartFailurePolicy4.getId()));
+            assertTrue(builder.getTriggerPolicy().getSuccess().equals(onRestartFailurePolicy4.getId()));
+
+            //
+            // Test remove all existing operational policies
+            //
+            builder = builder.removeAllPolicies();
+            assertTrue(builder.getControlLoop().getTrigger_policy().equals(FinalResult.FINAL_OPENLOOP.toString()));
+            //
+        } catch (BuilderException e) {
+            fail(e.getMessage());
+        }
+    }
+
+    @Test
+    public void testAddToUnknownPolicy() throws BuilderException {
+        ControlLoopPolicyBuilder builder =
+                ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 2400);
+        final String policyId = "100";
+        expectedException.expect(BuilderException.class);
+        expectedException.expectMessage("Unknown policy " + policyId);
+
+        builder.setPolicyForPolicyResult(
+                PolicyParam.builder()
+                .name("Rebuild VM")
+                .description("If the restart fails, rebuild it.")
+                .actor("APPC")
+                .target(new Target(TargetType.VM))
+                .recipe("Rebuild")
+                .payload(null)
+                .retries(1)
+                .timeout(600)
+                .id(policyId).build(),
+                PolicyResult.FAILURE,
+                PolicyResult.FAILURE_RETRIES,
+                PolicyResult.FAILURE_TIMEOUT,
+                PolicyResult.FAILURE_GUARD);
+    }
+
+    @Test
+    public void testAddExistingPolicyToUnknownPolicy() throws BuilderException {
+        ControlLoopPolicyBuilder builder =
+                ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 2400);
+        Policy triggerPolicy =
+                builder.setTriggerPolicy(
+                        PolicyParam.builder()
+                        .id(UUID.randomUUID().toString())
+                        .name("Restart the VM")
+                        .description("Upon getting the trigger event, restart the VM")
+                        .actor("APPC")
+                        .target(new Target(TargetType.VM))
+                        .recipe("Restart")
+                        .payload(null)
+                        .retries(2)
+                        .timeout(300).build());
+
+
+        Policy onRestartFailurePolicy = builder.setPolicyForPolicyResult(
+                PolicyParam.builder()
+                .name("Rebuild VM")
+                .description("If the restart fails, rebuild it.")
+                .actor("APPC")
+                .target(new Target(TargetType.VM))
+                .recipe("Rebuild")
+                .payload(null)
+                .retries(1)
+                .timeout(600)
+                .id(triggerPolicy.getId()).build(),
+                PolicyResult.FAILURE);
+
+        final String unknownPolicyId = "100";
+        expectedException.expect(BuilderException.class);
+        expectedException.expectMessage(unknownPolicyId + " does not exist");
+
+        builder.setPolicyForPolicyResult(onRestartFailurePolicy.getId(), unknownPolicyId, PolicyResult.FAILURE);
+    }
+
+    @Test
+    public void testAddUnknownExistingPolicyToPolicy() throws BuilderException {
+        ControlLoopPolicyBuilder builder =
+                ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 2400);
+        Policy triggerPolicy =
+                builder.setTriggerPolicy(
+                        PolicyParam.builder()
+                        .id(UUID.randomUUID().toString())
+                        .name("Restart the VM")
+                        .description("Upon getting the trigger event, restart the VM")
+                        .actor("APPC")
+                        .target(new Target(TargetType.VM))
+                        .recipe("Restart")
+                        .payload(null)
+                        .retries(2)
+                        .timeout(300).build());
+
+        final String unknownPolicyId = "100";
+        expectedException.expect(BuilderException.class);
+        expectedException.expectMessage("Operational policy " + unknownPolicyId + " does not exist");
+
+        builder.setPolicyForPolicyResult(unknownPolicyId, triggerPolicy.getId(), PolicyResult.FAILURE);
+    }
+
+    @Test
+    public void testAddOperationsAccumulateParams() {
+        try {
+            ControlLoopPolicyBuilder builder =
+                    ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 2400);
+            Policy triggerPolicy =
+                    builder.setTriggerPolicy(
+                            PolicyParam.builder()
+                            .id(UUID.randomUUID().toString())
+                            .name("Restart the eNodeB")
+                            .description("Upon getting the trigger event, restart the eNodeB")
+                            .actor("RANController")
+                            .target(new Target(TargetType.PNF))
+                            .recipe("Restart")
+                            .payload(null)
+                            .retries(2)
+                            .timeout(300).build());
+            //
+            // Add the operationsAccumulateParams
+            //
+            triggerPolicy = builder.addOperationsAccumulateParams(triggerPolicy.getId(),
+                    new OperationsAccumulateParams("15m", 5));
+            assertNotNull(builder.getTriggerPolicy().getOperationsAccumulateParams());
+            assertTrue(builder.getTriggerPolicy().getOperationsAccumulateParams().getPeriod().equals("15m"));
+            assertTrue(builder.getTriggerPolicy().getOperationsAccumulateParams().getLimit() == 5);
+            //
+        } catch (BuilderException e) {
+            fail(e.getMessage());
+        }
+    }
+
+
+    @Test
+    public void testBuildSpecification() {
+        try {
+            //
+            // Create the builder
+            //
+            ControlLoopPolicyBuilder builder =
+                    ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 800);
+            //
+            // Set the first invalid trigger policy
+            //
+            final Policy policy1 = builder.setTriggerPolicy(
+                    PolicyParam.builder()
+                    .id(UUID.randomUUID().toString())
+                    .name("Restart the VM")
+                    .description("Upon getting the trigger event, restart the VM")
+                    .actor(null)
+                    .target(null)
+                    .recipe("Instantiate")
+                    .payload(null)
+                    .retries(2)
+                    .timeout(300).build());
+            Results results = builder.buildSpecification();
+            //
+            // Check that ERRORs are in results for invalid policy arguments
+            //
+            boolean invalidActor = false;
+            boolean invalidRecipe = false;
+            boolean invalidTarget = false;
+            for (Message m : results.getMessages()) {
+                if (m.getMessage().equals("Policy actor is null") && m.getLevel() == MessageLevel.ERROR) {
+                    invalidActor = true;
+                }
+                if (m.getMessage().equals("Policy recipe is invalid") && m.getLevel() == MessageLevel.ERROR) {
+                    invalidRecipe = true;
+                }
+                if (m.getMessage().equals("Policy target is null") && m.getLevel() == MessageLevel.ERROR) {
+                    invalidTarget = true;
+                }
+            }
+            //
+            assertTrue(invalidActor);
+            assertTrue(invalidRecipe);
+            assertTrue(invalidTarget);
+            //
+            // Remove the invalid policy
+            //
+            // @SuppressWarnings("unused")
+            boolean removed = builder.removePolicy(policy1.getId());
+            assertTrue(removed);
+            assertTrue(builder.getTriggerPolicy() == null);
+            //
+            // Set a valid trigger policy
+            //
+            Policy policy1a = builder.setTriggerPolicy(
+                    PolicyParam.builder()
+                    .id(UUID.randomUUID().toString())
+                    .name("Rebuild VM")
+                    .description("If the restart fails, rebuild it.")
+                    .actor("APPC")
+                    .target(new Target(TargetType.VM))
+                    .recipe("Rebuild")
+                    .payload(null)
+                    .retries(1)
+                    .timeout(600).build());
+            //
+            // Set a second valid trigger policy
+            //
+            final Policy policy2 =
+                    builder.setTriggerPolicy(
+                            PolicyParam.builder()
+                            .id(UUID.randomUUID().toString())
+                            .name("Restart the VM")
+                            .description("Upon getting the trigger event, restart the VM")
+                            .actor("APPC")
+                            .target(new Target(TargetType.VM))
+                            .recipe("Restart")
+                            .payload(null)
+                            .retries(2)
+                            .timeout(300).build());
+            //
+            // Now, we have policy1 unreachable
+            //
+            results = builder.buildSpecification();
+            boolean unreachable = false;
+            for (Message m : results.getMessages()) {
+                if (m.getMessage().equals("Policy " + policy1a.getId() + " is not reachable.")
+                        && m.getLevel() == MessageLevel.WARNING) {
+                    unreachable = true;
+                    break;
+                }
+            }
+            assertTrue(unreachable);
+            //
+            // Set policy1a for the failure results of policy2
+            //
+            policy1a = builder.setPolicyForPolicyResult(policy1a.getId(), policy2.getId(), PolicyResult.FAILURE,
+                    PolicyResult.FAILURE_RETRIES, PolicyResult.FAILURE_TIMEOUT);
+            results = builder.buildSpecification();
+            boolean invalidTimeout = false;
+            for (Message m : results.getMessages()) {
+                if (m.getMessage()
+                        .equals("controlLoop overall timeout is less than the sum of operational policy timeouts.")
+                        && m.getLevel() == MessageLevel.ERROR) {
+                    invalidTimeout = true;
+                    break;
+                }
+            }
+            assertTrue(invalidTimeout);
+            //
+            // Remove policy2 (revert controlLoop back to open loop)
+            //
+            removed = builder.removePolicy(policy2.getId());
+            //
+            // ControlLoop is open loop now, but it still has policies (policy1)
+            //
+            results = builder.buildSpecification();
+            unreachable = false;
+            for (Message m : results.getMessages()) {
+                if (m.getMessage().equals("Open Loop policy contains policies. The policies will never be invoked.")
+                        && m.getLevel() == MessageLevel.WARNING) {
+                    unreachable = true;
+                    break;
+                }
+            }
+            assertTrue(unreachable);
+            //
+        } catch (BuilderException e) {
+            fail(e.getMessage());
+        }
+    }
+
+
+    @Test
+    public void test1() {
+        this.test("src/test/resources/v1.0.0/policy_Test.yaml");
+    }
+
+    @Test
+    public void testEvilYaml() {
+        try (InputStream is = new FileInputStream(new File("src/test/resources/v1.0.0/test_evil.yaml"))) {
+            //
+            // Read the yaml into our Java Object
+            //
+            Yaml yaml = new Yaml(new Constructor(ControlLoopPolicy.class));
+            yaml.load(is);
+        } catch (FileNotFoundException e) {
+            fail(e.getLocalizedMessage());
+        } catch (IOException e) {
+            fail(e.getLocalizedMessage());
+        } catch (YAMLException e) {
+            //
+            // Should have this
+            //
+        }
+    }
+
+    /**
+     * Does the actual test.
+     * 
+     * @param testFile input file
+     */
+    public void test(String testFile) {
+        try (InputStream is = new FileInputStream(new File(testFile))) {
+            //
+            // Read the yaml into our Java Object
+            //
+            Yaml yaml = new Yaml(new Constructor(ControlLoopPolicy.class));
+            Object obj = yaml.load(is);
+            assertNotNull(obj);
+            assertTrue(obj instanceof ControlLoopPolicy);
+            ControlLoopPolicy policyTobuild = (ControlLoopPolicy) obj;
+            //
+            // Now we're going to try to use the builder to build this.
+            //
+            ControlLoopPolicyBuilder builder = ControlLoopPolicyBuilder.Factory.buildControlLoop(
+                    policyTobuild.getControlLoop().getControlLoopName(), policyTobuild.getControlLoop().getTimeout());
+            //
+            // Add services
+            //
+            if (policyTobuild.getControlLoop().getServices() != null) {
+                builder = builder.addService(policyTobuild.getControlLoop().getServices()
+                        .toArray(new Service[policyTobuild.getControlLoop().getServices().size()]));
+            }
+            //
+            // Add resources
+            //
+            if (policyTobuild.getControlLoop().getResources() != null) {
+                builder = builder.addResource(policyTobuild.getControlLoop().getResources()
+                        .toArray(new Resource[policyTobuild.getControlLoop().getResources().size()]));
+            }
+            //
+            // Set pnf
+            //
+            if (policyTobuild.getControlLoop().getPnf() != null) {
+                builder = builder.setPNF(policyTobuild.getControlLoop().getPnf());
+            }
+            //
+            // Add the policies and be sure to set the trigger policy
+            //
+            if (policyTobuild.getPolicies() != null) {
+                for (Policy policy : policyTobuild.getPolicies()) {
+                    if (policy.getId() == policyTobuild.getControlLoop().getTrigger_policy()) {
+                        builder.setTriggerPolicy(
+                                PolicyParam.builder()
+                                .id(UUID.randomUUID().toString())
+                                .name(policy.getName())
+                                .description(policy.getDescription())
+                                .actor(policy.getActor())
+                                .target(policy.getTarget())
+                                .recipe(policy.getRecipe())
+                                .payload(null)
+                                .retries(policy.getRetry())
+                                .timeout(policy.getTimeout()).build());
+                    }
+                }
+            }
+
+            // Question : how to change policy ID and results by using builder ??
+
+            @SuppressWarnings("unused")
+            Results results = builder.buildSpecification();
+
+        } catch (FileNotFoundException e) {
+            fail(e.getLocalizedMessage());
+        } catch (IOException e) {
+            fail(e.getLocalizedMessage());
+        } catch (BuilderException e) {
+            fail(e.getLocalizedMessage());
+        }
+
+    }
+
+}
diff --git a/models-interactions/model-yaml/src/test/java/org/onap/policy/controlloop/policy/ControlLoopPolicyTest.java b/models-interactions/model-yaml/src/test/java/org/onap/policy/controlloop/policy/ControlLoopPolicyTest.java
new file mode 100644
index 0000000..9c92b75
--- /dev/null
+++ b/models-interactions/model-yaml/src/test/java/org/onap/policy/controlloop/policy/ControlLoopPolicyTest.java
@@ -0,0 +1,141 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * policy-yaml unit test
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2019 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.controlloop.policy;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.junit.Test;
+import org.onap.policy.common.utils.io.Serializer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.yaml.snakeyaml.DumperOptions;
+import org.yaml.snakeyaml.DumperOptions.FlowStyle;
+import org.yaml.snakeyaml.Yaml;
+import org.yaml.snakeyaml.constructor.Constructor;
+
+
+public class ControlLoopPolicyTest {
+    private static final Logger logger = LoggerFactory.getLogger(ControlLoopPolicyTest.class);
+    
+    @Test 
+    public void test1() {
+        this.test("src/test/resources/v1.0.0/policy_Test.yaml");
+    }
+
+    @Test 
+    public void testvService1() {
+        this.test("src/test/resources/v1.0.0/policy_vService.yaml");
+    }
+
+    @Test 
+    public void testOpenLoop() {
+        this.test("src/test/resources/v1.0.0/policy_OpenLoop.yaml");
+    }
+
+    @Test 
+    public void testvdns() {
+        this.test("src/test/resources/v2.0.0/policy_ONAP_demo_vDNS.yaml");
+    }
+
+    @Test 
+    public void testvFirewall() {
+        // Chenfei to fix this.
+        // this.test("src/test/resources/v2.0.0/policy_ONAP_demo_vFirewall.yaml");
+    }
+
+    @Test 
+    public void testvcpe() {
+        this.test("src/test/resources/v2.0.0/policy_ONAP_UseCase_vCPE.yaml");
+    }
+
+    @Test 
+    public void testvpci() {
+        this.test("src/test/resources/v2.0.0/policy_ONAP_UseCase_vPCI.yaml");
+    }
+
+    @Test 
+    public void testvolte() {
+        this.test("src/test/resources/v2.0.0/policy_ONAP_UseCase_VOLTE.yaml");
+    }
+
+    /**
+     * Does the actual test.
+     * 
+     * @param testFile input file
+     */
+    public void test(String testFile) {
+        try (InputStream is = new FileInputStream(new File(testFile))) {
+            //
+            // Read the yaml into our Java Object
+            //
+            Yaml yaml = new Yaml(new Constructor(ControlLoopPolicy.class));
+            Object obj = yaml.load(is);
+            assertNotNull(obj);
+            assertTrue(obj instanceof ControlLoopPolicy);
+            dump(obj);
+            //
+            // Now dump it to a yaml string
+            //
+            DumperOptions options = new DumperOptions();
+            options.setDefaultFlowStyle(FlowStyle.BLOCK);
+            options.setPrettyFlow(true);
+            yaml = new Yaml(options);
+            String dumpedYaml = yaml.dump(obj);
+            logger.debug(dumpedYaml);
+            //
+            // Read that string back into our java object
+            //
+            Object newObject = yaml.load(dumpedYaml);
+            dump(newObject);
+            assertNotNull(newObject);
+            assertTrue(newObject instanceof ControlLoopPolicy);
+            //
+            // Have to comment it out tentatively since it causes junit to fail. 
+            // Seems we cannot use assertEquals here. Need advice.
+            //
+            //assertEquals(newObject, obj);
+            
+            // test serialization
+            ControlLoopPolicy policy = (ControlLoopPolicy) obj;
+            ControlLoopPolicy policy2 = Serializer.roundTrip(policy);
+            assertTrue(policy.equals(policy2));
+            
+        } catch (FileNotFoundException e) {
+            fail(e.getLocalizedMessage());
+        } catch (IOException e) {
+            fail(e.getLocalizedMessage());
+        }
+    }
+
+    public void dump(Object obj) {
+        logger.debug("Dumping ", obj.getClass().getCanonicalName());
+        logger.debug("{}", obj);
+    }
+}
diff --git a/models-interactions/model-yaml/src/test/java/org/onap/policy/controlloop/policy/ControlLoopTest.java b/models-interactions/model-yaml/src/test/java/org/onap/policy/controlloop/policy/ControlLoopTest.java
new file mode 100644
index 0000000..142b51b
--- /dev/null
+++ b/models-interactions/model-yaml/src/test/java/org/onap/policy/controlloop/policy/ControlLoopTest.java
@@ -0,0 +1,183 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2018 Ericsson. All rights reserved.
+ * Modifications Copyright (C) 2018 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2019 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.controlloop.policy;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.Ignore;
+import org.junit.Test;
+
+import org.onap.policy.aai.Pnf;
+import org.onap.policy.common.utils.io.Serializer;
+import org.onap.policy.sdc.Resource;
+import org.onap.policy.sdc.ResourceType;
+import org.onap.policy.sdc.Service;
+
+public class ControlLoopTest {
+
+    private String controlLoopName = "control loop 1";
+    private String version = "1.0.1";
+    private String triggerPolicy = FinalResult.FINAL_OPENLOOP.toString();
+    private Integer timeout = 100;
+    private Boolean abatement = false;
+
+    @Test
+    public void testEqualsSameInstance() {
+        ControlLoop controlLoop1 = new ControlLoop();
+        assertTrue(controlLoop1.equals(controlLoop1));
+    }
+
+    @Test
+    public void testEqualsNull() {
+        ControlLoop controlLoop1 = new ControlLoop();
+        assertFalse(controlLoop1.equals(null));
+    }
+
+    @Test
+    public void testEqualsInstanceOfDiffClass() {
+        ControlLoop controlLoop1 = new ControlLoop();
+        assertFalse(controlLoop1.equals(""));
+    }
+
+    @Test
+    public void testEqualsNoServicesAndResourcesOrTimeout() {
+        final Pnf pnf = new Pnf();
+        pnf.setPnfName("pnf 1");
+
+        ControlLoop controlLoop1 = new ControlLoop();
+        controlLoop1.setControlLoopName(controlLoopName);
+        controlLoop1.setVersion(version);
+        controlLoop1.setPnf(pnf);
+        controlLoop1.setTrigger_policy(triggerPolicy);
+        controlLoop1.setAbatement(abatement);
+
+        ControlLoop controlLoop2 = new ControlLoop();
+        controlLoop2.setControlLoopName(controlLoopName);
+        controlLoop2.setVersion(version);
+        controlLoop2.setPnf(pnf);
+        controlLoop2.setTrigger_policy(triggerPolicy);
+        controlLoop2.setAbatement(abatement);
+
+        assertTrue(controlLoop1.equals(controlLoop2));
+    }
+
+    @Test
+    public void testEquals() throws IOException {
+        final Pnf pnf = new Pnf();
+        pnf.setPnfName("pnf 1");
+
+        ControlLoop controlLoop1 = new ControlLoop();
+        controlLoop1.setControlLoopName(controlLoopName);
+        controlLoop1.setVersion(version);
+        Service service1 = new Service("service1");
+        Service service2 = new Service("service2");
+        List<Service> services = new ArrayList<>();
+        services.add(service1);
+        services.add(service2);
+        controlLoop1.setServices(services);
+        Resource resource1 = new Resource("resource1", ResourceType.VF);
+        Resource resource2 = new Resource("resource2", ResourceType.VFC);
+        List<Resource> resources = new ArrayList<>();
+        resources.add(resource1);
+        resources.add(resource2);
+        controlLoop1.setResources(resources);
+        controlLoop1.setPnf(pnf);
+        controlLoop1.setTrigger_policy(triggerPolicy);
+        controlLoop1.setTimeout(timeout);
+        controlLoop1.setAbatement(abatement);
+
+        ControlLoop controlLoop2 = new ControlLoop();
+        controlLoop2.setControlLoopName(controlLoopName);
+        controlLoop2.setVersion(version);
+        Service controlLoop2Service1 = new Service("service1");
+        Service controlLoop2Service2 = new Service("service2");
+        List<Service> controlLoop2Services = new ArrayList<>();
+        controlLoop2Services.add(controlLoop2Service1);
+        controlLoop2Services.add(controlLoop2Service2);
+        controlLoop2.setServices(controlLoop2Services);
+        Resource controlLoop2Resource1 = new Resource("resource1", ResourceType.VF);
+        Resource controlLoop2Resource2 = new Resource("resource2", ResourceType.VFC);
+        List<Resource> controlLoop2Resources = new ArrayList<>();
+        controlLoop2Resources.add(controlLoop2Resource1);
+        controlLoop2Resources.add(controlLoop2Resource2);
+        controlLoop2.setResources(controlLoop2Resources);
+        controlLoop2.setPnf(pnf);
+        controlLoop2.setTrigger_policy(triggerPolicy);
+        controlLoop2.setTimeout(timeout);
+        controlLoop1.setAbatement(abatement);
+
+        assertTrue(controlLoop1.equals(controlLoop2));
+        assertEquals(controlLoop1.hashCode(), controlLoop2.hashCode());
+
+        controlLoop2 = Serializer.roundTrip(controlLoop1);
+        assertTrue(controlLoop1.equals(controlLoop2));
+        assertEquals(controlLoop1.hashCode(), controlLoop2.hashCode());
+    }
+
+    @Test
+    @Ignore
+    // I'VE MARKED THIS TEST CASE AS IGNORE BECAUSE THE TEST CASE FAILS
+    // This test case fails because the ControlLoop(ControlLoop controlLoop) constructor.
+    // does not copy the value of pnf and version into the newly created object
+    // PLEASE ADVISE IF THE EXISTING BEHAVIOUR IS CORRECT
+    public void testControlLoop() {
+        final Pnf pnf = new Pnf();
+        pnf.setPnfName("pnf 1");
+
+        ControlLoop controlLoop1 = new ControlLoop();
+        controlLoop1.setControlLoopName(controlLoopName);
+        controlLoop1.setVersion(version);
+        Service service1 = new Service("service1");
+        Service service2 = new Service("service2");
+        List<Service> services = new ArrayList<>();
+        services.add(service1);
+        services.add(service2);
+        controlLoop1.setServices(services);
+        Resource resource1 = new Resource("resource1", ResourceType.VF);
+        Resource resource2 = new Resource("resource2", ResourceType.VFC);
+        List<Resource> resources = new ArrayList<>();
+        resources.add(resource1);
+        resources.add(resource2);
+        controlLoop1.setResources(resources);
+        controlLoop1.setPnf(pnf);
+        controlLoop1.setTrigger_policy(triggerPolicy);
+        controlLoop1.setAbatement(abatement);
+
+        ControlLoop controlLoop2 = new ControlLoop(controlLoop1);
+
+        assertEquals(controlLoop1.getControlLoopName(), controlLoop2.getControlLoopName());
+        assertEquals(controlLoop1.getVersion(), controlLoop2.getVersion());
+        assertEquals(controlLoop1.getServices(), controlLoop2.getServices());
+        assertEquals(controlLoop1.getResources(), controlLoop2.getResources());
+        assertEquals(controlLoop1.getPnf(), controlLoop2.getPnf());
+        assertEquals(controlLoop1.getTrigger_policy(), controlLoop2.getTrigger_policy());
+        assertEquals(controlLoop1.getAbatement(), controlLoop2.getAbatement());
+
+        assertTrue(controlLoop1.equals(controlLoop2));
+    }
+
+}
diff --git a/models-interactions/model-yaml/src/test/java/org/onap/policy/controlloop/policy/OperationsAccumulateParamsTest.java b/models-interactions/model-yaml/src/test/java/org/onap/policy/controlloop/policy/OperationsAccumulateParamsTest.java
new file mode 100644
index 0000000..d06f3c0
--- /dev/null
+++ b/models-interactions/model-yaml/src/test/java/org/onap/policy/controlloop/policy/OperationsAccumulateParamsTest.java
@@ -0,0 +1,125 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2018 Ericsson. All rights reserved.
+ * Modifications Copyright (C) 2018 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2019 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.controlloop.policy;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+public class OperationsAccumulateParamsTest {
+
+    @Test
+    public void testConstructor() {
+        OperationsAccumulateParams operationsAccumulateParams = new OperationsAccumulateParams();
+        assertNull(operationsAccumulateParams.getPeriod());
+        assertNull(operationsAccumulateParams.getLimit());
+    }
+
+    @Test
+    public void testConstructorOperationsAccumulateParams() {
+        String period = "15m";
+        Integer limit = 10;
+        OperationsAccumulateParams operationsAccumulateParams1 = 
+                        new OperationsAccumulateParams(period, limit);
+        OperationsAccumulateParams operationsAccumulateParams2 = 
+                        new OperationsAccumulateParams(operationsAccumulateParams1);
+        assertEquals(period, operationsAccumulateParams1.getPeriod());
+        assertEquals(limit, operationsAccumulateParams2.getLimit());
+    }
+
+    @Test
+    public void testOperationsAccumulateParamsStringInteger() {
+        String period = "15m";
+        Integer limit = 10;
+        OperationsAccumulateParams operationsAccumulateParams = new OperationsAccumulateParams(period, limit);
+        assertEquals(period, operationsAccumulateParams.getPeriod());
+        assertEquals(limit, operationsAccumulateParams.getLimit());
+    }
+
+    @Test
+    public void testSetAndGetPeriod() {
+        String period = "15m";
+        OperationsAccumulateParams operationsAccumulateParams = new OperationsAccumulateParams();
+        operationsAccumulateParams.setPeriod(period);
+        assertEquals(period, operationsAccumulateParams.getPeriod());
+    }
+
+    @Test
+    public void testSetLimit() {
+        Integer limit = 10;
+        OperationsAccumulateParams operationsAccumulateParams = new OperationsAccumulateParams();
+        operationsAccumulateParams.setLimit(limit);
+        assertEquals(limit, operationsAccumulateParams.getLimit());
+    }
+
+    @Test
+    public void testToString() {
+        String period = "15m";
+        Integer limit = 10;
+        OperationsAccumulateParams operationsAccumulateParams = new OperationsAccumulateParams(period, limit);
+        assertEquals("OperationsAccumulateParams [period=15m, limit=10]", operationsAccumulateParams.toString());
+    }
+
+    @Test
+    public void testEqualsAndHashCode() {
+        final String period = "15m";
+        final Integer limit = 10;
+        OperationsAccumulateParams operationsAccumulateParams1 = new OperationsAccumulateParams();
+        OperationsAccumulateParams operationsAccumulateParams2 = new OperationsAccumulateParams();
+
+        assertTrue(operationsAccumulateParams1.equals(operationsAccumulateParams2));
+
+        operationsAccumulateParams1.setPeriod(period);
+        assertFalse(operationsAccumulateParams1.equals(operationsAccumulateParams2));
+        operationsAccumulateParams2.setPeriod(period);
+        assertTrue(operationsAccumulateParams1.equals(operationsAccumulateParams2));
+        assertEquals(operationsAccumulateParams1.hashCode(), operationsAccumulateParams2.hashCode());
+
+        operationsAccumulateParams1.setLimit(limit);;
+        assertFalse(operationsAccumulateParams1.equals(operationsAccumulateParams2));
+        operationsAccumulateParams2.setLimit(limit);
+        assertTrue(operationsAccumulateParams1.equals(operationsAccumulateParams2));
+        assertEquals(operationsAccumulateParams1.hashCode(), operationsAccumulateParams2.hashCode());
+    }
+
+
+    @Test
+    public void testEqualsSameObject() {
+        OperationsAccumulateParams operationsAccumulateParams = new OperationsAccumulateParams();
+        assertTrue(operationsAccumulateParams.equals(operationsAccumulateParams));
+    }
+
+    @Test
+    public void testEqualsNull() {
+        OperationsAccumulateParams operationsAccumulateParams = new OperationsAccumulateParams();
+        assertFalse(operationsAccumulateParams.equals(null));
+    }
+
+    @Test
+    public void testEqualsInstanceOfDiffClass() {
+        OperationsAccumulateParams operationsAccumulateParams = new OperationsAccumulateParams();
+        assertFalse(operationsAccumulateParams.equals(""));
+    }
+
+}
diff --git a/models-interactions/model-yaml/src/test/java/org/onap/policy/controlloop/policy/PolicyTest.java b/models-interactions/model-yaml/src/test/java/org/onap/policy/controlloop/policy/PolicyTest.java
new file mode 100644
index 0000000..e87a421
--- /dev/null
+++ b/models-interactions/model-yaml/src/test/java/org/onap/policy/controlloop/policy/PolicyTest.java
@@ -0,0 +1,221 @@
+/*
+ * ============LICENSE_START=======================================================
+ * policy-yaml unit test
+ * ================================================================================
+ * Copyright (C) 2018 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2019 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.controlloop.policy;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+import java.util.Map;
+import java.util.TreeMap;
+import org.junit.Before;
+import org.junit.Test;
+import org.onap.policy.common.utils.io.Serializer;
+
+public class PolicyTest {
+    private Policy policy;
+
+    @Before
+    public void setUp() {
+        policy = new Policy();
+    }
+
+    @Test
+    public void testHashCode() {
+        assertTrue(policy.hashCode() != 0);
+
+        policy.setActor("a");
+        int hc1 = policy.hashCode();
+
+        policy.setActor("b");
+        assertTrue(hc1 != policy.hashCode());
+    }
+
+    @Test
+    public void test() throws IOException {
+        OperationsAccumulateParams operationsAccumulateParams = new OperationsAccumulateParams();
+        operationsAccumulateParams.setLimit(10);
+
+        Map<String, String> payload = new TreeMap<>();
+        payload.put("mykey", "myvalue");
+
+        Target target = new Target();
+        target.setResourceID("myresource");
+
+        policy.setActor("act");
+        policy.setDescription("desc");
+        policy.setFailure("fail");
+        policy.setFailure_exception("failex");
+        policy.setFailure_guard("failguard");
+        policy.setFailure_retries("failretry");
+        policy.setFailure_timeout("failtimeout");
+        policy.setId("myid");
+        policy.setName("myname");
+        policy.setOperationsAccumulateParams(operationsAccumulateParams);
+        policy.setPayload(payload);
+        policy.setRecipe("myrecipe");
+        policy.setRetry(20);
+        policy.setSuccess("succ");
+        policy.setTarget(target);
+        policy.setTimeout(30);
+
+        assertEquals("act", policy.getActor());
+        assertEquals("desc", policy.getDescription());
+        assertEquals("fail", policy.getFailure());
+        assertEquals("failex", policy.getFailure_exception());
+        assertEquals("failguard", policy.getFailure_guard());
+        assertEquals("failretry", policy.getFailure_retries());
+        assertEquals("failtimeout", policy.getFailure_timeout());
+        assertEquals("myid", policy.getId());
+        assertEquals("myname", policy.getName());
+        assertEquals(operationsAccumulateParams, policy.getOperationsAccumulateParams());
+        assertEquals(payload, policy.getPayload());
+        assertEquals("myrecipe", policy.getRecipe());
+        assertEquals(20, policy.getRetry().intValue());
+        assertEquals("succ", policy.getSuccess());
+        assertEquals(target, policy.getTarget());
+        assertEquals(30, policy.getTimeout().intValue());
+
+        assertTrue(policy.equals(policy));
+        assertTrue(policy.hashCode() != new Policy().hashCode());
+        assertFalse(policy.equals(new Policy()));
+
+        Policy policy2 = Serializer.roundTrip(policy);
+        assertTrue(policy.equals(policy2));
+        assertEquals(policy.hashCode(), policy2.hashCode());
+
+        policy2 = new Policy(policy);
+        assertTrue(policy.equals(policy2));
+        assertEquals(policy.hashCode(), policy2.hashCode());
+    }
+
+    @Test
+    public void testPolicyString() {
+        policy = new Policy("justId");
+        assertEquals("justId", policy.getId());
+    }
+
+    @Test
+    public void testPolicyStringStringStringMapOfStringStringTarget() {
+        Map<String, String> payload = new TreeMap<>();
+        payload.put("mykeyB", "myvalueB");
+
+        Target target = new Target();
+        target.setResourceID("myresourceB");
+
+        policy = new Policy("nameB", "actorB", "recipeB", payload, target);
+        assertEquals("nameB", policy.getName());
+        assertEquals("actorB", policy.getActor());
+        assertEquals("recipeB", policy.getRecipe());
+        assertEquals(payload, policy.getPayload());
+        assertEquals(target, policy.getTarget());
+
+        assertTrue(policy.hashCode() != new Policy().hashCode());
+    }
+
+    @Test
+    public void testPolicyStringStringStringMapOfStringStringTargetIntegerInteger() {
+        Map<String, String> payload = new TreeMap<>();
+        payload.put("mykeyC", "myvalueC");
+
+        Target target = new Target();
+        target.setResourceID("myresourceC");
+
+        policy = new Policy("nameC", "actorC", "recipeC", payload, target, 201, 202);
+        assertEquals("nameC", policy.getName());
+        assertEquals("actorC", policy.getActor());
+        assertEquals("recipeC", policy.getRecipe());
+        assertEquals(payload, policy.getPayload());
+        assertEquals(target, policy.getTarget());
+        assertEquals(201, policy.getRetry().intValue());
+        assertEquals(202, policy.getTimeout().intValue());
+
+        assertTrue(policy.hashCode() != new Policy().hashCode());
+    }
+
+    @Test
+    public void testPolicyStringStringStringStringMapOfStringStringTargetStringIntegerInteger() {
+        Map<String, String> payload = new TreeMap<>();
+        payload.put("mykeyD", "myvalueD");
+
+        Target target = new Target();
+        target.setResourceID("myresourceD");
+
+        policy = new Policy(
+                PolicyParam.builder().id("idD")
+                .name("nameD")
+                .description("descD")
+                .actor("actorD")
+                .payload(payload)
+                .target(target)
+                .recipe("recipeD")
+                .retries(301)
+                .timeout(302)
+                .build());
+        assertEquals("idD", policy.getId());
+        assertEquals("nameD", policy.getName());
+        assertEquals("descD", policy.getDescription());
+        assertEquals("actorD", policy.getActor());
+        assertEquals(payload, policy.getPayload());
+        assertEquals(target, policy.getTarget());
+        assertEquals("recipeD", policy.getRecipe());
+        assertEquals(301, policy.getRetry().intValue());
+        assertEquals(302, policy.getTimeout().intValue());
+
+        assertTrue(policy.hashCode() != new Policy().hashCode());
+    }
+
+    @Test
+    public void testIsValid() {
+        assertFalse(policy.isValid());
+
+        Target target = new Target();
+        target.setResourceID("myresourceV");
+
+        policy = new Policy("nameV", "actorV", "recipeV", null, target);
+        assertEquals(null, policy.getPayload());
+        assertTrue(policy.isValid());
+    }
+
+    @Test
+    public void testToString() {
+        assertNotNull(policy.toString());
+    }
+
+    @Test
+    public void testEqualsObject() {
+        assertTrue(policy.equals(policy));
+
+        policy.setId("idE");
+        assertFalse(policy.equals(new Policy()));
+
+        Policy policy2 = new Policy();
+        policy2.setId(policy.getId());
+        assertTrue(policy.equals(policy2));
+
+        policy2.setId("idX");
+        assertFalse(policy.equals(policy2));
+    }
+
+}
diff --git a/models-interactions/model-yaml/src/test/java/org/onap/policy/controlloop/policy/guard/ConstraintTest.java b/models-interactions/model-yaml/src/test/java/org/onap/policy/controlloop/policy/guard/ConstraintTest.java
new file mode 100644
index 0000000..0c8901f
--- /dev/null
+++ b/models-interactions/model-yaml/src/test/java/org/onap/policy/controlloop/policy/guard/ConstraintTest.java
@@ -0,0 +1,256 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2018 Ericsson. All rights reserved.
+ * Modifications Copyright (C) 2018 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2019 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.controlloop.policy.guard;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.junit.Test;
+
+public class ConstraintTest {
+
+    @Test
+    public void testConstraint() {
+        Constraint constraint = new Constraint();
+
+        assertNull(constraint.getFreq_limit_per_target());
+        assertNull(constraint.getTime_window());
+        assertNull(constraint.getActive_time_range());
+        assertNull(constraint.getBlacklist());
+    }
+
+    @Test
+    public void testGetAndSetFreq_limit_per_target() {
+        Integer freqLimitPerTarget = 10;
+        Constraint constraint = new Constraint();
+        constraint.setFreq_limit_per_target(freqLimitPerTarget);
+        assertEquals(freqLimitPerTarget, constraint.getFreq_limit_per_target());
+    }
+
+    @Test
+    public void testGetAndSetTime_window() {
+        Map<String, String> timeWindow = new HashMap<>();
+        timeWindow.put("timeWindowKey", "timeWindowValue");
+        Constraint constraint = new Constraint();
+        constraint.setTime_window(timeWindow);
+        assertEquals(timeWindow, constraint.getTime_window());
+    }
+
+    @Test
+    public void testGetAndSetActive_time_range() {
+        Map<String, String> activeTimeRange = new HashMap<>();
+        activeTimeRange.put("timeWindowKey", "timeWindowValue");
+        Constraint constraint = new Constraint();
+        constraint.setActive_time_range(activeTimeRange);;
+        assertEquals(activeTimeRange, constraint.getActive_time_range());
+    }
+
+    @Test
+    public void testGetAndSetBlacklist() {
+        List<String> blacklist = new ArrayList<>();
+        blacklist.add("blacklist item");
+        Constraint constraint = new Constraint();
+        constraint.setBlacklist(blacklist);
+        assertEquals(blacklist, constraint.getBlacklist());
+    }
+
+    @Test
+    public void testConstraintIntegerMapOfStringString() {
+        Integer freqLimitPerTarget = 10;
+        Map<String, String> timeWindow = new HashMap<>();
+
+        Constraint constraint = new Constraint(freqLimitPerTarget, timeWindow);
+
+        assertEquals(freqLimitPerTarget, constraint.getFreq_limit_per_target());
+        assertEquals(timeWindow, constraint.getTime_window());
+        assertNull(constraint.getActive_time_range());
+        assertNull(constraint.getBlacklist());
+    }
+
+    @Test
+    public void testConstraintListOfString() {
+        List<String> blacklist = new ArrayList<>();
+        blacklist.add("blacklist item");
+        Constraint constraint = new Constraint(blacklist);
+
+        assertNull(constraint.getFreq_limit_per_target());
+        assertNull(constraint.getTime_window());
+        assertNull(constraint.getActive_time_range());
+        assertEquals(blacklist, constraint.getBlacklist());
+    }
+
+    @Test
+    public void testConstraintIntegerMapOfStringStringListOfString() {
+        Integer freqLimitPerTarget = 10;
+        Map<String, String> timeWindow = new HashMap<>();
+        List<String> blacklist = new ArrayList<>();
+        blacklist.add("blacklist item");
+        Constraint constraint = new Constraint(freqLimitPerTarget, timeWindow, blacklist);
+
+        assertEquals(freqLimitPerTarget, constraint.getFreq_limit_per_target());
+        assertEquals(timeWindow, constraint.getTime_window());
+        assertNull(constraint.getActive_time_range());
+        assertEquals(blacklist, constraint.getBlacklist());
+    }
+
+    @Test
+    public void testConstraintIntegerMapOfStringStringMapOfStringString() {
+        Integer freqLimitPerTarget = 10;
+        Map<String, String> timeWindow = new HashMap<>();
+        Map<String, String> activeTimeRange = new HashMap<>();
+        activeTimeRange.put("timeWindowKey", "timeWindowValue");
+        Constraint constraint = new Constraint(freqLimitPerTarget, timeWindow, activeTimeRange);
+
+        assertEquals(freqLimitPerTarget, constraint.getFreq_limit_per_target());
+        assertEquals(timeWindow, constraint.getTime_window());
+        assertEquals(activeTimeRange, constraint.getActive_time_range());
+        assertNull(constraint.getBlacklist());
+
+    }
+
+    @Test
+    public void testConstraintIntegerMapOfStringStringMapOfStringStringListOfString() {
+        Integer freqLimitPerTarget = 10;
+        Map<String, String> timeWindow = new HashMap<>();
+        Map<String, String> activeTimeRange = new HashMap<>();
+        activeTimeRange.put("timeWindowKey", "timeWindowValue");
+        List<String> blacklist = new ArrayList<>();
+        blacklist.add("blacklist item");
+        Constraint constraint = new Constraint(freqLimitPerTarget, timeWindow, activeTimeRange, blacklist);
+
+        assertEquals(freqLimitPerTarget, constraint.getFreq_limit_per_target());
+        assertEquals(timeWindow, constraint.getTime_window());
+        assertEquals(activeTimeRange, constraint.getActive_time_range());
+        assertEquals(blacklist, constraint.getBlacklist());
+    }
+
+    @Test
+    public void testConstraintConstraint() {
+        Integer freqLimitPerTarget = 10;
+        Map<String, String> timeWindow = new HashMap<>();
+        Map<String, String> activeTimeRange = new HashMap<>();
+        activeTimeRange.put("timeWindowKey", "timeWindowValue");
+        List<String> blacklist = new ArrayList<>();
+        blacklist.add("blacklist item");
+        Constraint constraint1 = new Constraint(freqLimitPerTarget, timeWindow, activeTimeRange, blacklist);
+        Constraint constraint2 = new Constraint(constraint1);
+
+        assertEquals(freqLimitPerTarget, constraint2.getFreq_limit_per_target());
+        assertEquals(timeWindow, constraint2.getTime_window());
+        assertEquals(activeTimeRange, constraint2.getActive_time_range());
+        assertEquals(blacklist, constraint2.getBlacklist());
+    }
+
+    @Test
+    public void testIsValid() {
+        Integer freqLimitPerTarget = 10;
+        final Map<String, String> timeWindow = new HashMap<>();
+
+        Constraint constraint = new Constraint();
+        assertTrue(constraint.isValid());
+
+        constraint.setFreq_limit_per_target(freqLimitPerTarget);
+        assertFalse(constraint.isValid());
+
+        constraint.setTime_window(timeWindow);
+        assertTrue(constraint.isValid());
+
+        constraint.setFreq_limit_per_target(null);
+        assertFalse(constraint.isValid());
+    }
+
+    @Test
+    public void testToString() {
+        Integer freqLimitPerTarget = 10;
+        Map<String, String> timeWindow = new HashMap<>();
+        Map<String, String> activeTimeRange = new HashMap<>();
+        activeTimeRange.put("timeWindowKey", "timeWindowValue");
+        List<String> blacklist = new ArrayList<>();
+        blacklist.add("blacklist item");
+        Constraint constraint = new Constraint(freqLimitPerTarget, timeWindow, activeTimeRange, blacklist);
+
+        assertEquals(constraint.toString(), "Constraint [freq_limit_per_target=" + freqLimitPerTarget + ", time_window="
+                + timeWindow + ", active_time_range=" + activeTimeRange + ", blacklist=" + blacklist + "]");
+    }
+
+    @Test
+    public void testEquals() {
+        Integer freqLimitPerTarget = 10;
+        final Map<String, String> timeWindow = new HashMap<>();
+        final Map<String, String> activeTimeRange = new HashMap<>();
+        List<String> blacklist = new ArrayList<>();
+        blacklist.add("blacklist item");
+
+        Constraint constraint1 = new Constraint();
+        Constraint constraint2 = new Constraint();
+        assertTrue(constraint1.equals(constraint2));
+
+        constraint1.setFreq_limit_per_target(freqLimitPerTarget);
+        assertFalse(constraint1.equals(constraint2));
+        constraint2.setFreq_limit_per_target(freqLimitPerTarget);
+        assertTrue(constraint1.equals(constraint2));
+        assertEquals(constraint1.hashCode(), constraint2.hashCode());
+
+        constraint1.setTime_window(timeWindow);
+        assertFalse(constraint1.equals(constraint2));
+        constraint2.setTime_window(timeWindow);
+        assertTrue(constraint1.equals(constraint2));
+        assertEquals(constraint1.hashCode(), constraint2.hashCode());
+
+        constraint1.setActive_time_range(activeTimeRange);
+        assertFalse(constraint1.equals(constraint2));
+        constraint2.setActive_time_range(activeTimeRange);
+        assertTrue(constraint1.equals(constraint2));
+        assertEquals(constraint1.hashCode(), constraint2.hashCode());
+
+        constraint1.setBlacklist(blacklist);
+        assertFalse(constraint1.equals(constraint2));
+        constraint2.setBlacklist(blacklist);
+        assertTrue(constraint1.equals(constraint2));
+        assertEquals(constraint1.hashCode(), constraint2.hashCode());
+    }
+
+    @Test
+    public void testEqualsSameObject() {
+        Constraint constraint = new Constraint();
+        assertTrue(constraint.equals(constraint));
+    }
+
+    @Test
+    public void testEqualsNull() {
+        Constraint constraint = new Constraint();
+        assertFalse(constraint.equals(null));
+    }
+
+    @Test
+    public void testEqualsInstanceOfDiffClass() {
+        Constraint constraint = new Constraint();
+        assertFalse(constraint.equals(""));
+    }
+
+}
diff --git a/models-interactions/model-yaml/src/test/java/org/onap/policy/controlloop/policy/guard/ControlLoopGuardBuilderTest.java b/models-interactions/model-yaml/src/test/java/org/onap/policy/controlloop/policy/guard/ControlLoopGuardBuilderTest.java
new file mode 100644
index 0000000..f289d93
--- /dev/null
+++ b/models-interactions/model-yaml/src/test/java/org/onap/policy/controlloop/policy/guard/ControlLoopGuardBuilderTest.java
@@ -0,0 +1,218 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * policy-yaml unit test
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2019 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.controlloop.policy.guard;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import org.junit.Test;
+import org.onap.policy.controlloop.policy.builder.BuilderException;
+import org.onap.policy.controlloop.policy.builder.Message;
+import org.onap.policy.controlloop.policy.builder.MessageLevel;
+import org.onap.policy.controlloop.policy.builder.Results;
+import org.onap.policy.controlloop.policy.guard.builder.ControlLoopGuardBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.yaml.snakeyaml.Yaml;
+import org.yaml.snakeyaml.constructor.Constructor;
+
+public class ControlLoopGuardBuilderTest {
+    private static final Logger logger = LoggerFactory.getLogger(ControlLoopGuardBuilderTest.class);
+    
+    @Test
+    public void testControlLoopGuard() {
+        try {
+            //
+            // Create a builder
+            //
+            ControlLoopGuardBuilder builder = ControlLoopGuardBuilder.Factory.buildControlLoopGuard(new Guard());
+            //
+            // Assert there is no guard policies yet
+            //
+            Results results = builder.buildSpecification();
+            boolean noGuardPolicies = false;
+            for (Message m : results.getMessages()) {
+                if (m.getMessage().equals("ControlLoop Guard should have at least one guard policies") 
+                                && m.getLevel() == MessageLevel.ERROR) {
+                    noGuardPolicies = true;
+                    break;
+                }
+            }
+            assertTrue(noGuardPolicies);
+            //
+            // Add a guard policy without limit constraint
+            //
+            String clname = "CL_vUSP123";
+            LinkedList<String> targets = new LinkedList<String>();
+            targets.add("s1");
+            targets.add("s2");
+            targets.add("s3");
+            MatchParameters matchParameters = new MatchParameters(clname, "APPC", "Restart", targets);
+            GuardPolicy policy1 = new GuardPolicy("id123", "guardpolicy1", "description aaa", matchParameters);
+            builder = builder.addGuardPolicy(policy1);
+            //
+            // Assert there is no limit constraint associated with the only guard policy
+            //
+            results = builder.buildSpecification();
+            boolean noConstraint = false;
+            for (Message m : results.getMessages()) {
+                if (m.getMessage().equals("Guard policy guardpolicy1 does not have any limit constraint") 
+                                && m.getLevel() == MessageLevel.ERROR) {
+                    noConstraint = true;
+                    break;
+                }
+            }
+            assertTrue(noConstraint);
+            //
+            // Add a constraint to policy1
+            //
+            Map<String, String> activeTimeRange = new HashMap<String, String>();
+            activeTimeRange.put("start", "00:00:00-05:00");
+            activeTimeRange.put("end", "23:59:59-05:00");
+            List<String> blacklist = new LinkedList<String>();
+            blacklist.add("eNodeB_common_id1");
+            blacklist.add("eNodeB_common_id2");
+            Map<String, String> timeWindow = new HashMap<String, String>();
+            timeWindow.put("value", "10");
+            timeWindow.put("units", "minute");
+            Constraint cons = new Constraint(5, timeWindow, activeTimeRange, blacklist);
+            builder = builder.addLimitConstraint(policy1.getId(), cons);
+            //
+            // Add a duplicate constraint to policy1
+            //
+            builder = builder.addLimitConstraint(policy1.getId(), cons);
+            //
+            // Assert there are duplicate constraints associated with the only guard policy
+            //
+            results = builder.buildSpecification();
+            boolean duplicateConstraint = false;
+            for (Message m : results.getMessages()) {
+                if (m.getMessage().equals("Guard policy guardpolicy1 has duplicate limit constraints") 
+                                && m.getLevel() == MessageLevel.WARNING) {
+                    duplicateConstraint = true;
+                    break;
+                }
+            }
+            assertTrue(duplicateConstraint);
+            //
+            // Remove the duplicate constraint
+            //
+            builder = builder.removeLimitConstraint(policy1.getId(), cons);
+            //
+            // Add a duplicate guard policy 
+            //
+            builder = builder.addGuardPolicy(policy1);
+            builder = builder.addLimitConstraint(policy1.getId(), cons);
+            //
+            // Assert there are duplicate guard policies
+            //
+            results = builder.buildSpecification();
+            boolean duplicateGuardPolicy = false;
+            for (Message m : results.getMessages()) {
+                if (m.getMessage().equals("There are duplicate guard policies") 
+                                && m.getLevel() == MessageLevel.WARNING) {
+                    duplicateGuardPolicy = true;
+                    break;
+                }
+            }
+            assertTrue(duplicateGuardPolicy);
+            //
+            // Remove the duplicate guard policy
+            //
+            builder = builder.removeGuardPolicy(policy1);
+            //
+            // Assert there are no Error/Warning message
+            //
+            results = builder.buildSpecification();
+            assertTrue(results.getMessages().size() == 1);
+            //
+        } catch (BuilderException e) {
+            fail(e.getMessage());
+        }
+    }
+    
+    @Test
+    public void test1() {
+        this.test("src/test/resources/v2.0.0-guard/policy_guard_ONAP_demo_vDNS.yaml");
+    }
+    
+    @Test
+    public void test2() {
+        this.test("src/test/resources/v2.0.0-guard/policy_guard_appc_restart.yaml");
+    }
+    
+    /**
+     * Do the actual test.
+     * 
+     * @param testFile input test file
+     */
+    public void test(String testFile) {
+        try (InputStream is = new FileInputStream(new File(testFile))) {
+            //
+            // Read the yaml into our Java Object
+            //
+            Yaml yaml = new Yaml(new Constructor(ControlLoopGuard.class));
+            Object obj = yaml.load(is);
+            assertNotNull(obj);
+            assertTrue(obj instanceof ControlLoopGuard);
+            ControlLoopGuard guardTobuild = (ControlLoopGuard) obj;
+            //
+            // Now we're going to try to use the builder to build this.
+            //
+            ControlLoopGuardBuilder builder = 
+                            ControlLoopGuardBuilder.Factory.buildControlLoopGuard(guardTobuild.getGuard());
+            //
+            // Add guard policy
+            //
+            if (guardTobuild.getGuards() != null) {
+                builder = builder.addGuardPolicy(guardTobuild.getGuards().toArray(
+                                new GuardPolicy[guardTobuild.getGuards().size()]));
+            }
+            //
+            // Build the specification
+            //
+            Results results = builder.buildSpecification();
+            //
+            // Print out the specification
+            //
+            logger.debug(results.getSpecification());
+            //
+        } catch (FileNotFoundException e) {
+            fail(e.getLocalizedMessage());
+        } catch (IOException e) {
+            fail(e.getLocalizedMessage());
+        } catch (BuilderException e) {
+            fail(e.getLocalizedMessage());
+        }
+    }
+}
diff --git a/models-interactions/model-yaml/src/test/java/org/onap/policy/controlloop/policy/guard/ControlLoopGuardTest.java b/models-interactions/model-yaml/src/test/java/org/onap/policy/controlloop/policy/guard/ControlLoopGuardTest.java
new file mode 100644
index 0000000..01d6eb1
--- /dev/null
+++ b/models-interactions/model-yaml/src/test/java/org/onap/policy/controlloop/policy/guard/ControlLoopGuardTest.java
@@ -0,0 +1,170 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * policy-yaml unit test
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2019 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.controlloop.policy.guard;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.LinkedList;
+
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.yaml.snakeyaml.DumperOptions;
+import org.yaml.snakeyaml.DumperOptions.FlowStyle;
+import org.yaml.snakeyaml.Yaml;
+import org.yaml.snakeyaml.constructor.Constructor;
+
+
+public class ControlLoopGuardTest {
+    private static final Logger logger = LoggerFactory.getLogger(ControlLoopGuardTest.class);
+    
+    @Test 
+    public void testGuardvdns() {
+        this.test("src/test/resources/v2.0.0-guard/policy_guard_ONAP_demo_vDNS.yaml");
+    }
+
+    @Test 
+    public void testGuardvusp() {
+        this.test("src/test/resources/v2.0.0-guard/policy_guard_appc_restart.yaml");
+    }
+
+    @Test
+    public void testConstructorControlLoopGuard() {
+        Guard guard1 = new Guard();
+        GuardPolicy guardPolicy1 = new GuardPolicy();
+        GuardPolicy guardPolicy2 = new GuardPolicy();
+        LinkedList<GuardPolicy> guardPolicies = new LinkedList<>();
+        guardPolicies.add(guardPolicy1);
+        guardPolicies.add(guardPolicy2);
+
+        ControlLoopGuard controlLoopGuard1 = new ControlLoopGuard();
+        controlLoopGuard1.setGuard(guard1);
+        controlLoopGuard1.setGuards(guardPolicies);
+        ControlLoopGuard controlLoopGuard2 = new ControlLoopGuard(controlLoopGuard1);
+
+        assertEquals(guard1, controlLoopGuard2.getGuard());
+        assertEquals(guardPolicies, controlLoopGuard2.getGuards());
+    }
+
+    @Test
+    public void testEqualsAndHashCode() {
+        final Guard guard1 = new Guard();
+        GuardPolicy guardPolicy1 = new GuardPolicy();
+        GuardPolicy guardPolicy2 = new GuardPolicy();
+        LinkedList<GuardPolicy> guardPolicies = new LinkedList<>();
+        guardPolicies.add(guardPolicy1);
+        guardPolicies.add(guardPolicy2);
+
+        ControlLoopGuard controlLoopGuard1 = new ControlLoopGuard();
+        ControlLoopGuard controlLoopGuard2 = new ControlLoopGuard();
+
+        assertTrue(controlLoopGuard1.equals(controlLoopGuard2));
+        assertEquals(controlLoopGuard1.hashCode(), controlLoopGuard2.hashCode());
+
+        controlLoopGuard1.setGuard(guard1);
+        assertFalse(controlLoopGuard1.equals(controlLoopGuard2));
+        controlLoopGuard2.setGuard(guard1);
+        assertTrue(controlLoopGuard1.equals(controlLoopGuard2));
+        assertEquals(controlLoopGuard1.hashCode(), controlLoopGuard2.hashCode());
+
+        controlLoopGuard1.setGuards(guardPolicies);
+        assertFalse(controlLoopGuard1.equals(controlLoopGuard2));
+        controlLoopGuard2.setGuards(guardPolicies);
+        assertTrue(controlLoopGuard1.equals(controlLoopGuard2));
+        assertEquals(controlLoopGuard1.hashCode(), controlLoopGuard2.hashCode());
+    }
+
+    @Test
+    public void testEqualsSameObject() {
+        ControlLoopGuard controlLoopGuard = new ControlLoopGuard();
+        assertTrue(controlLoopGuard.equals(controlLoopGuard));
+    }
+
+    @Test
+    public void testEqualsNull() {
+        ControlLoopGuard controlLoopGuard = new ControlLoopGuard();
+        assertFalse(controlLoopGuard.equals(null));
+    }
+
+    @Test
+    public void testEqualsInstanceOfDiffClass() {
+        ControlLoopGuard controlLoopGuard = new ControlLoopGuard();
+        assertFalse(controlLoopGuard.equals(""));
+    }
+
+    /**
+     * Does the actual test.
+     * 
+     * @param testFile input file
+     */
+    public void test(String testFile) {
+        try (InputStream is = new FileInputStream(new File(testFile))) {
+            //
+            // Read the yaml into our Java Object
+            //
+            Yaml yaml = new Yaml(new Constructor(ControlLoopGuard.class));
+            Object obj = yaml.load(is);
+            assertNotNull(obj);
+            assertTrue(obj instanceof ControlLoopGuard);
+            dump(obj);
+            //
+            // Now dump it to a yaml string
+            //
+            DumperOptions options = new DumperOptions();
+            options.setDefaultFlowStyle(FlowStyle.BLOCK);
+            options.setPrettyFlow(true);
+            yaml = new Yaml(options);
+            String dumpedYaml = yaml.dump(obj);
+            logger.debug(dumpedYaml);
+            //
+            // Read that string back into our java object
+            //
+            Object newObject = yaml.load(dumpedYaml);
+            dump(newObject);
+            assertNotNull(newObject);
+            assertTrue(newObject instanceof ControlLoopGuard);
+            //
+            // Have to comment it out tentatively since it causes junit to fail. 
+            // Seems we cannot use assertEquals here. Need advice.
+            //
+            //assertEquals(newObject, obj);
+        } catch (FileNotFoundException e) {
+            fail(e.getLocalizedMessage());
+        } catch (IOException e) {
+            fail(e.getLocalizedMessage());
+        }
+    }
+
+    public void dump(Object obj) {
+        logger.debug("Dumping {}", obj.getClass().getCanonicalName());
+        logger.debug("{}", obj);
+    }
+}
diff --git a/models-interactions/model-yaml/src/test/java/org/onap/policy/controlloop/policy/guard/GuardPolicyTest.java b/models-interactions/model-yaml/src/test/java/org/onap/policy/controlloop/policy/guard/GuardPolicyTest.java
new file mode 100644
index 0000000..a8d183c
--- /dev/null
+++ b/models-interactions/model-yaml/src/test/java/org/onap/policy/controlloop/policy/guard/GuardPolicyTest.java
@@ -0,0 +1,271 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2018 Ericsson. All rights reserved.
+ * Modifications Copyright (C) 2018 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2019 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.controlloop.policy.guard;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.LinkedList;
+import java.util.List;
+
+import org.junit.Test;
+
+public class GuardPolicyTest {
+
+    @Test
+    public void testConstructor() {
+        GuardPolicy guardPolicy = new GuardPolicy();
+
+        assertNotNull(guardPolicy.getId());
+        assertNull(guardPolicy.getName());
+        assertNull(guardPolicy.getDescription());
+        assertNull(guardPolicy.getMatch_parameters());
+        assertNull(guardPolicy.getLimit_constraints());
+    }
+
+    @Test
+    public void testConstructorString() {
+        String id = "guard id";
+        GuardPolicy guardPolicy = new GuardPolicy(id);
+
+        assertEquals(id, guardPolicy.getId());
+        assertNull(guardPolicy.getName());
+        assertNull(guardPolicy.getDescription());
+        assertNull(guardPolicy.getMatch_parameters());
+        assertNull(guardPolicy.getLimit_constraints());
+    }
+
+    @Test
+    public void testConstructorStringStringStringMatchParameters() {
+        String id = "guard id";
+        String name = "guard name";
+        String description = "guard description";
+        MatchParameters matchParameters = new MatchParameters();
+        List<Constraint> limitConstraints = new LinkedList<>();
+        limitConstraints.add(new Constraint());
+        GuardPolicy guardPolicy = new GuardPolicy(id, name, description, matchParameters);
+
+        assertNotNull(guardPolicy.getId());
+        assertEquals(name, guardPolicy.getName());
+        assertEquals(description, guardPolicy.getDescription());
+        assertEquals(matchParameters, guardPolicy.getMatch_parameters());
+        assertNull(guardPolicy.getLimit_constraints());
+    }
+
+    @Test
+    public void testConstructorStringMatchParametersList() {
+        String name = "guard name";
+        MatchParameters matchParameters = new MatchParameters();
+        List<Constraint> limitConstraints = new LinkedList<>();
+        limitConstraints.add(new Constraint());
+        GuardPolicy guardPolicy = new GuardPolicy(name, matchParameters, limitConstraints);
+
+        assertNotNull(guardPolicy.getId());
+        assertEquals(name, guardPolicy.getName());
+        assertNull(guardPolicy.getDescription());
+        assertEquals(matchParameters, guardPolicy.getMatch_parameters());
+        assertEquals(limitConstraints, guardPolicy.getLimit_constraints());
+    }
+
+    @Test
+    public void testConstructorStringStringMatchParametersList() {
+        String name = "guard name";
+        String description = "guard description";
+        MatchParameters matchParameters = new MatchParameters();
+        List<Constraint> limitConstraints = new LinkedList<>();
+        limitConstraints.add(new Constraint());
+        GuardPolicy guardPolicy = new GuardPolicy(name, description, matchParameters, limitConstraints);
+
+        assertNotNull(guardPolicy.getId());
+        assertEquals(name, guardPolicy.getName());
+        assertEquals(description, guardPolicy.getDescription());
+        assertEquals(matchParameters, guardPolicy.getMatch_parameters());
+        assertEquals(limitConstraints, guardPolicy.getLimit_constraints());
+    }
+
+    @Test
+    public void testConstructorStringStringStringMatchParametersList() {
+        String id = "guard id";
+        String name = "guard name";
+        String description = "guard description";
+        MatchParameters matchParameters = new MatchParameters();
+        List<Constraint> limitConstraints = new LinkedList<>();
+        limitConstraints.add(new Constraint());
+        GuardPolicy guardPolicy = new GuardPolicy(id, name, description, matchParameters, limitConstraints);
+
+        assertEquals(id, guardPolicy.getId());
+        assertEquals(name, guardPolicy.getName());
+        assertEquals(description, guardPolicy.getDescription());
+        assertEquals(matchParameters, guardPolicy.getMatch_parameters());
+        assertEquals(limitConstraints, guardPolicy.getLimit_constraints());
+    }
+
+    @Test
+    public void testConstructorGuardPolicy() {
+        String id = "guard id";
+        String name = "guard name";
+        String description = "guard description";
+        MatchParameters matchParameters = new MatchParameters();
+        List<Constraint> limitConstraints = new LinkedList<>();
+        limitConstraints.add(new Constraint());
+        GuardPolicy guardPolicy1 = new GuardPolicy(id, name, description, matchParameters, limitConstraints);
+
+        GuardPolicy guardPolicy2 = new GuardPolicy(guardPolicy1);
+
+
+        assertEquals(id, guardPolicy2.getId());
+        assertEquals(name, guardPolicy2.getName());
+        assertEquals(description, guardPolicy2.getDescription());
+        assertEquals(matchParameters, guardPolicy2.getMatch_parameters());
+        assertEquals(limitConstraints, guardPolicy2.getLimit_constraints());
+    }
+
+    @Test
+    public void testSetAndGetId() {
+        String id = "guard id";
+        GuardPolicy guardPolicy = new GuardPolicy();
+        guardPolicy.setId(id);
+        assertEquals(id, guardPolicy.getId());
+    }
+
+    @Test
+    public void testSetAndGetName() {
+        String name = "guard name";
+        GuardPolicy guardPolicy = new GuardPolicy();
+        guardPolicy.setName(name);
+        assertEquals(name, guardPolicy.getName());
+    }
+
+    @Test
+    public void testSetAndGetDescription() {
+        String description = "guard description";
+        GuardPolicy guardPolicy = new GuardPolicy();
+        guardPolicy.setDescription(description);
+        assertEquals(description, guardPolicy.getDescription());
+    }
+
+    @Test
+    public void testSetAndGetMatchParameters() {
+        MatchParameters matchParameters = new MatchParameters();
+        GuardPolicy guardPolicy = new GuardPolicy();
+        guardPolicy.setMatch_parameters(matchParameters);
+        assertEquals(matchParameters, guardPolicy.getMatch_parameters());
+    }
+
+    @Test
+    public void testSetAndGetLimitConstraints() {
+        LinkedList<Constraint> limitConstraints = new LinkedList<>();
+        limitConstraints.add(new Constraint());
+        GuardPolicy guardPolicy = new GuardPolicy();
+        guardPolicy.setLimit_constraints(limitConstraints);
+        assertEquals(limitConstraints, guardPolicy.getLimit_constraints());
+    }
+
+    @Test
+    public void testIsValid() {
+        GuardPolicy guardPolicy = new GuardPolicy();
+        assertFalse(guardPolicy.isValid());
+
+        guardPolicy.setName("guard name");
+        assertTrue(guardPolicy.isValid());
+
+        guardPolicy.setId(null);
+        assertFalse(guardPolicy.isValid());
+    }
+
+    @Test
+    public void testToString() {
+        String id = "guard id";
+        String name = "guard name";
+        String description = "guard description";
+        MatchParameters matchParameters = new MatchParameters();
+        List<Constraint> limitConstraints = new LinkedList<>();
+        limitConstraints.add(new Constraint());
+        GuardPolicy guardPolicy = new GuardPolicy(id, name, description, matchParameters, limitConstraints);
+
+        assertEquals(guardPolicy.toString(), "Policy [id=guard id, name=guard name, description=guard description, "
+                + "match_parameters=MatchParameters [controlLoopName=null, actor=null, recipe=null, targets=null], "
+                + "limitConstraints=[Constraint [freq_limit_per_target=null, time_window=null, active_time_range=null,"
+                + " blacklist=null]]]", guardPolicy.toString());
+    }
+
+    @Test
+    public void testEquals() {
+        final String id = "guard id";
+        final String name = "guard name";
+        final String description = "guard description";
+        GuardPolicy guardPolicy1 = new GuardPolicy(id);
+        GuardPolicy guardPolicy2 = new GuardPolicy();
+        assertFalse(guardPolicy1.equals(guardPolicy2));
+
+        guardPolicy2.setId(id);
+        assertTrue(guardPolicy1.equals(guardPolicy2));
+        assertEquals(guardPolicy1.hashCode(), guardPolicy2.hashCode());
+
+        guardPolicy1.setName(name);
+        assertFalse(guardPolicy1.equals(guardPolicy2));
+        guardPolicy2.setName(name);
+        assertTrue(guardPolicy1.equals(guardPolicy2));
+        assertEquals(guardPolicy1.hashCode(), guardPolicy2.hashCode());
+
+        guardPolicy1.setDescription(description);
+        assertFalse(guardPolicy1.equals(guardPolicy2));
+        guardPolicy2.setDescription(description);
+        assertTrue(guardPolicy1.equals(guardPolicy2));
+        assertEquals(guardPolicy1.hashCode(), guardPolicy2.hashCode());
+
+        MatchParameters matchParameters = new MatchParameters();
+        guardPolicy1.setMatch_parameters(matchParameters);
+        assertFalse(guardPolicy1.equals(guardPolicy2));
+        guardPolicy2.setMatch_parameters(matchParameters);
+        assertTrue(guardPolicy1.equals(guardPolicy2));
+        assertEquals(guardPolicy1.hashCode(), guardPolicy2.hashCode());
+
+        LinkedList<Constraint> limitConstraints = new LinkedList<>();
+        limitConstraints.add(new Constraint());
+        guardPolicy1.setLimit_constraints(limitConstraints);
+        assertFalse(guardPolicy1.equals(guardPolicy2));
+        guardPolicy2.setLimit_constraints(limitConstraints);
+        assertTrue(guardPolicy1.equals(guardPolicy2));
+        assertEquals(guardPolicy1.hashCode(), guardPolicy2.hashCode());
+    }
+
+    @Test
+    public void testEqualsSameObject() {
+        GuardPolicy guardPolicy = new GuardPolicy();
+        assertTrue(guardPolicy.equals(guardPolicy));
+    }
+
+    @Test
+    public void testEqualsNull() {
+        GuardPolicy guardPolicy = new GuardPolicy();
+        assertFalse(guardPolicy.equals(null));
+    }
+
+    @Test
+    public void testEqualsInstanceOfDiffClass() {
+        GuardPolicy guardPolicy = new GuardPolicy();
+        assertFalse(guardPolicy.equals(""));
+    }
+}
diff --git a/models-interactions/model-yaml/src/test/resources/v1.0.0/bad_control_loop_no_control_loop_name.yaml b/models-interactions/model-yaml/src/test/resources/v1.0.0/bad_control_loop_no_control_loop_name.yaml
new file mode 100644
index 0000000..7685453
--- /dev/null
+++ b/models-interactions/model-yaml/src/test/resources/v1.0.0/bad_control_loop_no_control_loop_name.yaml
@@ -0,0 +1,37 @@
+# Copyright 2018 AT&T Intellectual Property. All rights reserved
+# Modifications Copyright (C) 2019 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.
+controlLoop:
+  controlLoopName: 
+  version: 1.0.0
+  services: 
+    - serviceName: Foo Service
+  resources: 
+    - resourceName: Bar VNF
+      resourceType: VF
+  trigger_policy: unique-policy-id-1-restart
+  timeout: 1200
+
+policies:
+  - id: unique-policy-id-1-restart
+    name: Restart Policy for Trigger Event
+    description:
+    actor: APPC
+    recipe: Restart
+    target:
+      type: VM
+      resourceID: vm1
+    retry: 2
+    timeout: 300
+
diff --git a/models-interactions/model-yaml/src/test/resources/v1.0.0/bad_policy_failure_connected_to_unknown_policy.yaml b/models-interactions/model-yaml/src/test/resources/v1.0.0/bad_policy_failure_connected_to_unknown_policy.yaml
new file mode 100644
index 0000000..cc4d099
--- /dev/null
+++ b/models-interactions/model-yaml/src/test/resources/v1.0.0/bad_policy_failure_connected_to_unknown_policy.yaml
@@ -0,0 +1,37 @@
+# Copyright 2018 AT&T Intellectual Property. All rights reserved
+# Modifications Copyright (C) 2019 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.
+controlLoop:
+  controlLoopName: ControlLoop-TEST-5dfa8fce-bd7a-4424-b60d-ee2ad2f254a3
+  version: 1.0.0
+  services: 
+    - serviceName: Foo Service
+  resources: 
+    - resourceName: Bar VNF
+      resourceType: VF
+  trigger_policy: unique-policy-id-1-restart
+  timeout: 1200
+
+policies:
+  - id: unique-policy-id-1-restart
+    name: Restart Policy for Trigger Event
+    description:
+    actor: APPC
+    recipe: Restart
+    target:
+      type: VM
+      resourceID: vm1
+    retry: 2
+    timeout: 300
+    failure: unknown-policy
diff --git a/models-interactions/model-yaml/src/test/resources/v1.0.0/bad_policy_failure_exception_connected_to_unknown_policy.yaml b/models-interactions/model-yaml/src/test/resources/v1.0.0/bad_policy_failure_exception_connected_to_unknown_policy.yaml
new file mode 100644
index 0000000..c25cf70
--- /dev/null
+++ b/models-interactions/model-yaml/src/test/resources/v1.0.0/bad_policy_failure_exception_connected_to_unknown_policy.yaml
@@ -0,0 +1,37 @@
+# Copyright 2018 AT&T Intellectual Property. All rights reserved
+# Modifications Copyright (C) 2019 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.
+controlLoop:
+  controlLoopName: ControlLoop-TEST-5dfa8fce-bd7a-4424-b60d-ee2ad2f254a3
+  version: 1.0.0
+  services: 
+    - serviceName: Foo Service
+  resources: 
+    - resourceName: Bar VNF
+      resourceType: VF
+  trigger_policy: unique-policy-id-1-restart
+  timeout: 1200
+
+policies:
+  - id: unique-policy-id-1-restart
+    name: Restart Policy for Trigger Event
+    description:
+    actor: APPC
+    recipe: Restart
+    target:
+      type: VM
+      resourceID: vm1
+    retry: 2
+    timeout: 300
+    failure_exception: unknown-policy
diff --git a/models-interactions/model-yaml/src/test/resources/v1.0.0/bad_policy_failure_guard_connected_to_unknown_policy.yaml b/models-interactions/model-yaml/src/test/resources/v1.0.0/bad_policy_failure_guard_connected_to_unknown_policy.yaml
new file mode 100644
index 0000000..50ab0cf
--- /dev/null
+++ b/models-interactions/model-yaml/src/test/resources/v1.0.0/bad_policy_failure_guard_connected_to_unknown_policy.yaml
@@ -0,0 +1,37 @@
+# Copyright 2018 AT&T Intellectual Property. All rights reserved
+# Modifications Copyright (C) 2019 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.
+controlLoop:
+  controlLoopName: ControlLoop-TEST-5dfa8fce-bd7a-4424-b60d-ee2ad2f254a3
+  version: 1.0.0
+  services: 
+    - serviceName: Foo Service
+  resources: 
+    - resourceName: Bar VNF
+      resourceType: VF
+  trigger_policy: unique-policy-id-1-restart
+  timeout: 1200
+
+policies:
+  - id: unique-policy-id-1-restart
+    name: Restart Policy for Trigger Event
+    description:
+    actor: APPC
+    recipe: Restart
+    target:
+      type: VM
+      resourceID: vm1
+    retry: 2
+    timeout: 300
+    failure_guard: unknown-policy
diff --git a/models-interactions/model-yaml/src/test/resources/v1.0.0/bad_policy_failure_retries_connected_to_unknown_policy.yaml b/models-interactions/model-yaml/src/test/resources/v1.0.0/bad_policy_failure_retries_connected_to_unknown_policy.yaml
new file mode 100644
index 0000000..eb8f084
--- /dev/null
+++ b/models-interactions/model-yaml/src/test/resources/v1.0.0/bad_policy_failure_retries_connected_to_unknown_policy.yaml
@@ -0,0 +1,37 @@
+# Copyright 2018 AT&T Intellectual Property. All rights reserved
+# Modifications Copyright (C) 2019 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.
+controlLoop:
+  controlLoopName: ControlLoop-TEST-5dfa8fce-bd7a-4424-b60d-ee2ad2f254a3
+  version: 1.0.0
+  services: 
+    - serviceName: Foo Service
+  resources: 
+    - resourceName: Bar VNF
+      resourceType: VF
+  trigger_policy: unique-policy-id-1-restart
+  timeout: 1200
+
+policies:
+  - id: unique-policy-id-1-restart
+    name: Restart Policy for Trigger Event
+    description:
+    actor: APPC
+    recipe: Restart
+    target:
+      type: VM
+      resourceID: vm1
+    retry: 2
+    timeout: 300
+    failure_retries: unknown-policy
diff --git a/models-interactions/model-yaml/src/test/resources/v1.0.0/bad_policy_failure_timeout_connected_to_unknown_policy.yaml b/models-interactions/model-yaml/src/test/resources/v1.0.0/bad_policy_failure_timeout_connected_to_unknown_policy.yaml
new file mode 100644
index 0000000..77c2963
--- /dev/null
+++ b/models-interactions/model-yaml/src/test/resources/v1.0.0/bad_policy_failure_timeout_connected_to_unknown_policy.yaml
@@ -0,0 +1,37 @@
+# Copyright 2018 AT&T Intellectual Property. All rights reserved
+# Modifications Copyright (C) 2019 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.
+controlLoop:
+  controlLoopName: ControlLoop-TEST-5dfa8fce-bd7a-4424-b60d-ee2ad2f254a3
+  version: 1.0.0
+  services: 
+    - serviceName: Foo Service
+  resources: 
+    - resourceName: Bar VNF
+      resourceType: VF
+  trigger_policy: unique-policy-id-1-restart
+  timeout: 1200
+
+policies:
+  - id: unique-policy-id-1-restart
+    name: Restart Policy for Trigger Event
+    description:
+    actor: APPC
+    recipe: Restart
+    target:
+      type: VM
+      resourceID: vm1
+    retry: 2
+    timeout: 300
+    failure_timeout: unknown-policy
diff --git a/models-interactions/model-yaml/src/test/resources/v1.0.0/bad_policy_success_connected_to_unknown_policy.yaml b/models-interactions/model-yaml/src/test/resources/v1.0.0/bad_policy_success_connected_to_unknown_policy.yaml
new file mode 100644
index 0000000..ee2ee7f
--- /dev/null
+++ b/models-interactions/model-yaml/src/test/resources/v1.0.0/bad_policy_success_connected_to_unknown_policy.yaml
@@ -0,0 +1,37 @@
+# Copyright 2018 AT&T Intellectual Property. All rights reserved
+# Modifications Copyright (C) 2019 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.
+controlLoop:
+  controlLoopName: ControlLoop-TEST-5dfa8fce-bd7a-4424-b60d-ee2ad2f254a3
+  version: 1.0.0
+  services: 
+    - serviceName: Foo Service
+  resources: 
+    - resourceName: Bar VNF
+      resourceType: VF
+  trigger_policy: unique-policy-id-1-restart
+  timeout: 1200
+
+policies:
+  - id: unique-policy-id-1-restart
+    name: Restart Policy for Trigger Event
+    description:
+    actor: APPC
+    recipe: Restart
+    target:
+      type: VM
+      resourceID: vm1
+    retry: 2
+    timeout: 300
+    success: unknown-policy
diff --git a/models-interactions/model-yaml/src/test/resources/v1.0.0/bad_trigger_1.yaml b/models-interactions/model-yaml/src/test/resources/v1.0.0/bad_trigger_1.yaml
new file mode 100644
index 0000000..ad5736b
--- /dev/null
+++ b/models-interactions/model-yaml/src/test/resources/v1.0.0/bad_trigger_1.yaml
@@ -0,0 +1,109 @@
+# Copyright 2018 AT&T Intellectual Property. All rights reserved
+# Modifications Copyright (C) 2019 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.
+controlLoop:
+  controlLoopName: ControlLoop-TEST-5dfa8fce-bd7a-4424-b60d-ee2ad2f254a3
+  version: 1.0.0
+  services: 
+    - serviceName: Foo Service
+  resources: 
+    - resourceName: Bar VNF
+      resourceType: VF
+  trigger_policy: FOO
+  timeout: 1200
+
+policies:
+  - id: unique-policy-id-1-restart
+    name: Restart Policy for Trigger Event
+    description:
+    actor: APPC
+    recipe: Restart
+    target: VM
+    retry: 2
+    timeout: 300
+    success: unique-policy-id-2-healthcheck-restart
+    failure: unique-policy-id-3-rebuild
+    failure_timeout: unique-policy-id-3-rebuild
+    failure_retries: unique-policy-id-3-rebuild
+    failure_exception: final_failure_exception
+  
+  - id: unique-policy-id-2-healthcheck-restart
+    name: HealthCheck Policy
+    description:
+    actor: APPC
+    recipe: HealthCheck
+    target: VM
+    retry: 2
+    timeout: 300
+    success: final_success
+    failure: unique-policy-id-3-rebuild
+    failure_timeout: unique-policy-id-3-rebuild
+    failure_retries: unique-policy-id-3-rebuild
+    failure_exception: final_failure_exception
+  
+  - id: unique-policy-id-3-rebuild
+    name: Rebuild Policy
+    description:
+    actor: APPC
+    recipe: Rebuild
+    target: VM
+    retry: 0
+    timeout: 600
+    success: unique-policy-id-4-healthcheck-rebuild
+    failure: unique-policy-id-5-migrate
+    failure_timeout: unique-policy-id-5-migrate
+    failure_retries: unique-policy-id-5-migrate
+    failure_exception: final_failure_exception
+  
+  - id: unique-policy-id-4-healthcheck-rebuild
+    name: HealthCheck the Rebuild Policy
+    description:
+    actor: APPC
+    recipe: HealthCheck
+    target: VM
+    retry: 2
+    timeout: 300
+    success: final_success
+    failure: unique-policy-id-5-migrate
+    failure_timeout: unique-policy-id-5-migrate
+    failure_retries: unique-policy-id-5-migrate
+    failure_exception: final_failure_exception
+  
+  - id: unique-policy-id-5-migrate
+    name: Migrate Policy
+    description:
+    actor: APPC
+    recipe: Migrate
+    target: VM
+    retry: 0
+    timeout: 600
+    success: unique-policy-id-6-healthcheck-migrate
+    failure: final_failure
+    failure_timeout: final_failure_timeout
+    failure_retries: final_failure_retries
+    failure_exception: final_failure_exception
+
+  - id: unique-policy-id-6-healthcheck-migrate
+    name: Healthcheck the Migrate Policy
+    description:
+    actor: APPC
+    recipe: HealthCheck
+    target: VM
+    retry: 2
+    timeout: 300
+    success: final_success
+    failure: final_failure
+    failure_timeout: final_failure_timeout
+    failure_retries: final_failure_retries
+    failure_exception: final_failure_exception
diff --git a/models-interactions/model-yaml/src/test/resources/v1.0.0/bad_trigger_2.yaml b/models-interactions/model-yaml/src/test/resources/v1.0.0/bad_trigger_2.yaml
new file mode 100644
index 0000000..c04e0ba
--- /dev/null
+++ b/models-interactions/model-yaml/src/test/resources/v1.0.0/bad_trigger_2.yaml
@@ -0,0 +1,109 @@
+# Copyright 2018 AT&T Intellectual Property. All rights reserved
+# Modifications Copyright (C) 2019 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.
+controlLoop:
+  controlLoopName: ControlLoop-TEST-5dfa8fce-bd7a-4424-b60d-ee2ad2f254a3
+  version: 1.0.0
+  services: 
+    - serviceName: Foo Service
+  resources: 
+    - resourceName: Bar VNF
+      resourceType: VF
+  trigger_policy: FINAL_SUCCESS
+  timeout: 1200
+
+policies:
+  - id: unique-policy-id-1-restart
+    name: Restart Policy for Trigger Event
+    description:
+    actor: APPC
+    recipe: Restart
+    target: VM
+    retry: 2
+    timeout: 300
+    success: unique-policy-id-2-healthcheck-restart
+    failure: unique-policy-id-3-rebuild
+    failure_timeout: unique-policy-id-3-rebuild
+    failure_retries: unique-policy-id-3-rebuild
+    failure_exception: final_failure_exception
+  
+  - id: unique-policy-id-2-healthcheck-restart
+    name: HealthCheck Policy
+    description:
+    actor: APPC
+    recipe: HealthCheck
+    target: VM
+    retry: 2
+    timeout: 300
+    success: final_success
+    failure: unique-policy-id-3-rebuild
+    failure_timeout: unique-policy-id-3-rebuild
+    failure_retries: unique-policy-id-3-rebuild
+    failure_exception: final_failure_exception
+  
+  - id: unique-policy-id-3-rebuild
+    name: Rebuild Policy
+    description:
+    actor: APPC
+    recipe: Rebuild
+    target: VM
+    retry: 0
+    timeout: 600
+    success: unique-policy-id-4-healthcheck-rebuild
+    failure: unique-policy-id-5-migrate
+    failure_timeout: unique-policy-id-5-migrate
+    failure_retries: unique-policy-id-5-migrate
+    failure_exception: final_failure_exception
+  
+  - id: unique-policy-id-4-healthcheck-rebuild
+    name: HealthCheck the Rebuild Policy
+    description:
+    actor: APPC
+    recipe: HealthCheck
+    target: VM
+    retry: 2
+    timeout: 300
+    success: final_success
+    failure: unique-policy-id-5-migrate
+    failure_timeout: unique-policy-id-5-migrate
+    failure_retries: unique-policy-id-5-migrate
+    failure_exception: final_failure_exception
+  
+  - id: unique-policy-id-5-migrate
+    name: Migrate Policy
+    description:
+    actor: APPC
+    recipe: Migrate
+    target: VM
+    retry: 0
+    timeout: 600
+    success: unique-policy-id-6-healthcheck-migrate
+    failure: final_failure
+    failure_timeout: final_failure_timeout
+    failure_retries: final_failure_retries
+    failure_exception: final_failure_exception
+
+  - id: unique-policy-id-6-healthcheck-migrate
+    name: Healthcheck the Migrate Policy
+    description:
+    actor: APPC
+    recipe: HealthCheck
+    target: VM
+    retry: 2
+    timeout: 300
+    success: final_success
+    failure: final_failure
+    failure_timeout: final_failure_timeout
+    failure_retries: final_failure_retries
+    failure_exception: final_failure_exception
diff --git a/models-interactions/model-yaml/src/test/resources/v1.0.0/bad_trigger_no_trigger_id.yaml b/models-interactions/model-yaml/src/test/resources/v1.0.0/bad_trigger_no_trigger_id.yaml
new file mode 100644
index 0000000..e5ee3fe
--- /dev/null
+++ b/models-interactions/model-yaml/src/test/resources/v1.0.0/bad_trigger_no_trigger_id.yaml
@@ -0,0 +1,35 @@
+# Copyright 2018 AT&T Intellectual Property. All rights reserved
+# Modifications Copyright (C) 2019 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.
+controlLoop:
+  controlLoopName: ControlLoop-TEST-5dfa8fce-bd7a-4424-b60d-ee2ad2f254a3
+  version: 1.0.0
+  services: 
+    - serviceName: Foo Service
+  resources: 
+    - resourceName: Bar VNF
+      resourceType: VF
+  trigger_policy: 
+  timeout: 1200
+
+policies:
+  - id: unique-policy-id-1-restart
+    name: Restart Policy for Trigger Event
+    description:
+    actor: APPC
+    recipe: Restart
+    target: VM
+    retry: 2
+    timeout: 300
+
diff --git a/models-interactions/model-yaml/src/test/resources/v1.0.0/empty.yaml b/models-interactions/model-yaml/src/test/resources/v1.0.0/empty.yaml
new file mode 100644
index 0000000..5337f9c
--- /dev/null
+++ b/models-interactions/model-yaml/src/test/resources/v1.0.0/empty.yaml
@@ -0,0 +1,14 @@
+# Copyright 2018 AT&T Intellectual Property. All rights reserved
+# Modifications Copyright (C) 2019 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.
diff --git a/models-interactions/model-yaml/src/test/resources/v1.0.0/policy_OpenLoop.yaml b/models-interactions/model-yaml/src/test/resources/v1.0.0/policy_OpenLoop.yaml
new file mode 100644
index 0000000..20ae46e
--- /dev/null
+++ b/models-interactions/model-yaml/src/test/resources/v1.0.0/policy_OpenLoop.yaml
@@ -0,0 +1,26 @@
+# Copyright 2018 AT&T Intellectual Property. All rights reserved
+# Modifications Copyright (C) 2019 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.
+controlLoop:
+  version: 1.0.0
+  controlLoopName: ControlLoop-Open-fac4ae3d-c3f5-4bab-8e54-0a8581ede132
+  services:
+    - serviceName: Service
+  resources:
+    - resourceType: VF
+      resourceName: Example
+  trigger_policy: final_openloop
+  timeout: 0
+
+policies:
diff --git a/models-interactions/model-yaml/src/test/resources/v1.0.0/policy_Test.yaml b/models-interactions/model-yaml/src/test/resources/v1.0.0/policy_Test.yaml
new file mode 100644
index 0000000..73486b0
--- /dev/null
+++ b/models-interactions/model-yaml/src/test/resources/v1.0.0/policy_Test.yaml
@@ -0,0 +1,109 @@
+# Copyright 2018 AT&T Intellectual Property. All rights reserved
+# Modifications Copyright (C) 2019 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.
+controlLoop:
+  controlLoopName: ControlLoop-TEST-5dfa8fce-bd7a-4424-b60d-ee2ad2f254a3
+  version: 1.0.0
+  services: 
+    - serviceName: Foo Service
+  resources: 
+    - resourceName: Bar VNF
+      resourceType: VF
+  trigger_policy: unique-policy-id-1-restart
+  timeout: 1200
+
+policies:
+  - id: unique-policy-id-1-restart
+    name: Restart Policy for Trigger Event
+    description:
+    actor: APPC
+    recipe: Restart
+    target: VM
+    retry: 2
+    timeout: 300
+    success: unique-policy-id-2-healthcheck-restart
+    failure: unique-policy-id-3-rebuild
+    failure_timeout: unique-policy-id-3-rebuild
+    failure_retries: unique-policy-id-3-rebuild
+    failure_exception: final_failure_exception
+  
+  - id: unique-policy-id-2-healthcheck-restart
+    name: HealthCheck Policy
+    description:
+    actor: APPC
+    recipe: HealthCheck
+    target: VM
+    retry: 2
+    timeout: 300
+    success: final_success
+    failure: unique-policy-id-3-rebuild
+    failure_timeout: unique-policy-id-3-rebuild
+    failure_retries: unique-policy-id-3-rebuild
+    failure_exception: final_failure_exception
+  
+  - id: unique-policy-id-3-rebuild
+    name: Rebuild Policy
+    description:
+    actor: APPC
+    recipe: Rebuild
+    target: VM
+    retry: 0
+    timeout: 600
+    success: unique-policy-id-4-healthcheck-rebuild
+    failure: unique-policy-id-5-migrate
+    failure_timeout: unique-policy-id-5-migrate
+    failure_retries: unique-policy-id-5-migrate
+    failure_exception: final_failure_exception
+  
+  - id: unique-policy-id-4-healthcheck-rebuild
+    name: HealthCheck the Rebuild Policy
+    description:
+    actor: APPC
+    recipe: HealthCheck
+    target: VM
+    retry: 2
+    timeout: 300
+    success: final_success
+    failure: unique-policy-id-5-migrate
+    failure_timeout: unique-policy-id-5-migrate
+    failure_retries: unique-policy-id-5-migrate
+    failure_exception: final_failure_exception
+  
+  - id: unique-policy-id-5-migrate
+    name: Migrate Policy
+    description:
+    actor: APPC
+    recipe: Migrate
+    target: VM
+    retry: 0
+    timeout: 600
+    success: unique-policy-id-6-healthcheck-migrate
+    failure: final_failure
+    failure_timeout: final_failure_timeout
+    failure_retries: final_failure_retries
+    failure_exception: final_failure_exception
+
+  - id: unique-policy-id-6-healthcheck-migrate
+    name: Healthcheck the Migrate Policy
+    description:
+    actor: APPC
+    recipe: HealthCheck
+    target: VM
+    retry: 2
+    timeout: 300
+    success: final_success
+    failure: final_failure
+    failure_timeout: final_failure_timeout
+    failure_retries: final_failure_retries
+    failure_exception: final_failure_exception
diff --git a/models-interactions/model-yaml/src/test/resources/v1.0.0/policy_vService.yaml b/models-interactions/model-yaml/src/test/resources/v1.0.0/policy_vService.yaml
new file mode 100644
index 0000000..009a49c
--- /dev/null
+++ b/models-interactions/model-yaml/src/test/resources/v1.0.0/policy_vService.yaml
@@ -0,0 +1,75 @@
+# Copyright 2018 AT&T Intellectual Property. All rights reserved
+# Modifications Copyright (C) 2019 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.
+controlLoop:
+  version: 1.0.0
+  controlLoopName: ControlLoop-vUSP-vCTS-cbed919f-2212-4ef7-8051-fe6308da1bda
+  services: 
+    - serviceName: vUSP
+  resources: 
+    - resourceName: vCTS
+      resourceType: VF
+    - resourceName: vCOM
+      resourceType: VF
+    - resourceName: vRAR
+      resourceType: VF
+    - resourceName: vLCS
+      resourceType: VF
+    - resourceName: v3CB
+      resourceType: VF
+  trigger_policy: unique-policy-id-1-restart
+  timeout: 1200
+
+policies:
+  - id: unique-policy-id-1-restart
+    name: Restart Policy
+    description:
+    actor: APPC
+    recipe: Restart
+    target: VM
+    retry: 2
+    timeout: 300
+    success: final_success
+    failure: unique-policy-id-2-rebuild
+    failure_timeout: unique-policy-id-2-rebuild
+    failure_retries: unique-policy-id-2-rebuild
+    failure_exception: final_failure_exception
+  
+  - id: unique-policy-id-2-rebuild
+    name: Rebuild Policy
+    description:
+    actor: APPC
+    recipe: Rebuild
+    target: VM
+    retry: 0
+    timeout: 600
+    success: final_success
+    failure: unique-policy-id-3-migrate
+    failure_timeout: unique-policy-id-3-migrate
+    failure_retries: unique-policy-id-3-migrate
+    failure_exception: final_failure_exception
+  
+  - id: unique-policy-id-3-migrate
+    name: Migrate Policy
+    description:
+    actor: APPC
+    recipe: Migrate
+    target: VM
+    retry: 0
+    timeout: 600
+    success: final_success
+    failure: final_failure
+    failure_timeout: final_failure_timeout
+    failure_retries: final_failure_retries
+    failure_exception: final_failure_exception
diff --git a/models-interactions/model-yaml/src/test/resources/v1.0.0/test.yaml b/models-interactions/model-yaml/src/test/resources/v1.0.0/test.yaml
new file mode 100644
index 0000000..440e7b3
--- /dev/null
+++ b/models-interactions/model-yaml/src/test/resources/v1.0.0/test.yaml
@@ -0,0 +1,318 @@
+# Copyright 2018 AT&T Intellectual Property. All rights reserved
+# Modifications Copyright (C) 2019 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.
+controlLoop:
+  controlLoopName: ControlLoop-TEST-5dfa8fce-bd7a-4424-b60d-ee2ad2f254a3
+  version: 1.0.0
+  services: 
+    - serviceName: Foo Service
+  resources: 
+    - resourceName: Bar VNF
+      resourceType: VF
+  trigger_policy: unique-policy-id-1-restart
+  timeout: 1200
+
+policies:
+  - id: unique-policy-id-1-restart
+    name: Restart Policy for Trigger Event
+    description:
+    actor: APPC
+    recipe: Restart
+    target:
+      type: VM
+      resourceID: vm1
+    retry: 2
+    timeout: 300
+    success: unique-policy-id-2-modifyconfig
+    failure: unique-policy-id-3-rebuild
+    failure_timeout: unique-policy-id-3-rebuild
+    failure_retries: unique-policy-id-3-rebuild
+    failure_exception: unique-policy-id-7-modifyconfig-for-failure
+    failure_guard: unique-policy-id-7-modifyconfig-for-failure
+  
+  - id: unique-policy-id-2-modifyconfig
+    name: ModifyConfig Policy
+    description:
+    actor: APPC
+    recipe: ModifyConfig
+    target:
+      type: VM
+      resourceID: vm1
+    retry: 2
+    timeout: 300
+    success: FINAL_SUCCESS
+    failure: unique-policy-id-3-rebuild
+    failure_timeout: unique-policy-id-3-rebuild
+    failure_retries: unique-policy-id-3-rebuild
+    failure_exception: FINAL_FAILURE_EXCEPTION
+  
+  - id: unique-policy-id-3-rebuild
+    name: Rebuild Policy
+    description:
+    actor: APPC
+    recipe: Rebuild
+    target:
+      type: VM
+      resourceID: vm1
+    retry: 0
+    timeout: 600
+    success: unique-policy-id-4-modifyconfig
+    failure: unique-policy-id-5-migrate
+    failure_timeout: unique-policy-id-5-migrate
+    failure_retries: unique-policy-id-5-migrate
+    failure_exception: FINAL_FAILURE_EXCEPTION
+  
+  - id: unique-policy-id-4-modifyconfig
+    name: HealthCheck the Rebuild Policy
+    description:
+    actor: APPC
+    recipe: ModifyConfig
+    target:
+      type: VM
+      resourceID: vm1
+    retry: 2
+    timeout: 300
+    success: FINAL_SUCCESS
+    failure: unique-policy-id-5-migrate
+    failure_timeout: unique-policy-id-5-migrate
+    failure_retries: unique-policy-id-5-migrate
+    failure_exception: FINAL_FAILURE_EXCEPTION
+  
+  - id: unique-policy-id-5-migrate
+    name: Migrate Policy
+    description:
+    actor: APPC
+    recipe: Migrate
+    target:
+      type: VM
+      resourceID: vm1
+    retry: 0
+    timeout: 600
+    success: unique-policy-id-6-modifyconfig
+    failure: FINAL_FAILURE
+    failure_timeout: FINAL_FAILURE_TIMEOUT
+    failure_retries: FINAL_FAILURE_RETRIES
+    failure_exception: FINAL_FAILURE_EXCEPTION
+
+  - id: unique-policy-id-6-modifyconfig
+    name: ModifyConfig after Migrate Policy
+    description:
+    actor: APPC
+    recipe: ModifyConfig
+    target: 
+      type: VM
+      resourceID: vm1
+    retry: 2
+    timeout: 300
+    success: FINAL_SUCCESS
+    failure: FINAL_FAILURE
+    failure_timeout: FINAL_FAILURE_TIMEOUT
+    failure_retries: FINAL_FAILURE_RETRIES
+    failure_exception: FINAL_FAILURE_EXCEPTION
+    
+  - id: unique-policy-id-7-modifyconfig-for-failure
+    name: ModifyConfig for Failure
+    description:
+    actor: APPC
+    recipe: ModifyConfig
+    target: 
+      type: VM
+      resourceID: vm1
+    retry: 2
+    timeout: 300
+    success: FINAL_SUCCESS
+    failure: FINAL_FAILURE
+    failure_timeout: FINAL_FAILURE_TIMEOUT
+    failure_retries: FINAL_FAILURE_RETRIES
+    failure_exception: FINAL_FAILURE_EXCEPTION
+    
+  - id: 
+    name: invalid policy - id is null
+    description: 
+    actor: APPC
+    recipe: ModifyConfig
+    target: 
+      type: VM
+      resourceID: vm1
+    retry: 2
+    timeout: 300
+    success: FINAL_SUCCESS
+    
+  - id: SUCCESS
+    name: invalid policy - id is a PolicyResult
+    description: 
+    actor: APPC
+    recipe: ModifyConfig
+    target: 
+      type: VM
+      resourceID: vm1
+    retry: 2
+    timeout: 300
+    success: FINAL_SUCCESS
+    
+  - id: FINAL_SUCCESS
+    name: invalid policy - id is a FinalResult
+    description: 
+    actor: APPC
+    recipe: ModifyConfig
+    target: 
+      type: VM
+      resourceID: vm1
+    retry: 2
+    timeout: 300
+    success: FINAL_SUCCESS
+    
+  - id: invalid-policy-null-actor
+    name: invalid policy - actor is null
+    description: 
+    actor: 
+    recipe: ModifyConfig
+    target: 
+      type: VM
+      resourceID: vm1
+    retry: 2
+    timeout: 300
+    success: FINAL_SUCCESS
+    
+  - id: invalid-policy-unknown-actor
+    name: invalid policy - actor is unknown
+    description: 
+    actor: UnknownActor
+    recipe: ModifyConfig
+    target: 
+      type: VM
+      resourceID: vm1
+    retry: 2
+    timeout: 300
+    success: FINAL_SUCCESS
+
+  - id: invalid-policy-null-receipe
+    name: invalid policy - receipe is null
+    description:
+    actor: APPC
+    recipe: 
+    target: 
+      type: VM
+      resourceID: vm1
+    retry: 2
+    timeout: 300
+    success: FINAL_SUCCESS
+    
+  - id: invalid-policy-unknown-receipe
+    name: invalid policy - unknown receipe
+    description:
+    actor: APPC
+    recipe: UnknownReceipe
+    target: 
+      type: VM
+      resourceID: vm1
+    retry: 2
+    timeout: 300
+    success: FINAL_SUCCESS
+    
+  - id: invalid-policy-null-target
+    name: invalid policy - target is null
+    description:
+    actor: APPC
+    recipe: ModifyConfig
+    target: 
+    retry: 2
+    timeout: 300
+    success: FINAL_SUCCESS
+    
+  - id: invalid-policy-null-target-type
+    name: invalid policy - target type is null
+    description:
+    actor: APPC
+    recipe: ModifyConfig
+    target: 
+      type: 
+      resourceID: vm1
+    retry: 2
+    timeout: 300
+    success: FINAL_SUCCESS
+    
+  - id: invalid-policy-invalid-success-policy
+    name: invalid policy - success policy is invalid
+    description:
+    actor: APPC
+    recipe: ModifyConfig
+    target: 
+      type: VM
+      resourceID: vm1
+    retry: 2
+    timeout: 300
+    success: FINAL_FAILURE
+    
+  - id: invalid-policy-invalid-failure-policy
+    name: invalid policy - failure policy is invalid
+    description:
+    actor: APPC
+    recipe: ModifyConfig
+    target: 
+      type: VM
+      resourceID: vm1
+    retry: 2
+    timeout: 300
+    failure: FINAL_FAILURE_TIMEOUT
+    
+  - id: invalid-policy-invalid-failure-timeout-policy
+    name: invalid policy - failure timeout policy is invalid
+    description:
+    actor: APPC
+    recipe: ModifyConfig
+    target: 
+      type: VM
+      resourceID: vm1
+    retry: 2
+    timeout: 300
+    failure_timeout: FINAL_FAILURE_RETRIES
+    
+  - id: invalid-policy-invalid-failure-retries-policy
+    name: invalid policy - failure retries policy is invalid
+    description:
+    actor: APPC
+    recipe: ModifyConfig
+    target: 
+      type: VM
+      resourceID: vm1
+    retry: 2
+    timeout: 300
+    failure_retries: FINAL_FAILURE_EXCEPTION
+    
+  - id: invalid-policy-invalid-failure-exception-policy
+    name: invalid policy - failure exception policy is invalid
+    description:
+    actor: APPC
+    recipe: ModifyConfig
+    target: 
+      type: VM
+      resourceID: vm1
+    retry: 2
+    timeout: 300
+    failure_exception: FINAL_FAILURE_GUARD
+    
+  - id: invalid-policy-invalid-failure-guard-policy
+    name: invalid policy - failure guard policy is invalid
+    description:
+    actor: APPC
+    recipe: ModifyConfig
+    target: 
+      type: VM
+      resourceID: vm1
+    retry: 2
+    timeout: 300
+    failure_guard: FINAL_SUCCESS
+
+    
diff --git a/models-interactions/model-yaml/src/test/resources/v1.0.0/test_evil.yaml b/models-interactions/model-yaml/src/test/resources/v1.0.0/test_evil.yaml
new file mode 100644
index 0000000..d6127fe
--- /dev/null
+++ b/models-interactions/model-yaml/src/test/resources/v1.0.0/test_evil.yaml
@@ -0,0 +1,39 @@
+# Copyright 2018 AT&T Intellectual Property. All rights reserved
+# Modifications Copyright (C) 2019 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.
+controlLoop:
+  controlLoopName: ControlLoop-TEST-5dfa8fce-bd7a-4424-b60d-ee2ad2f254a3
+  version: 1.0.0
+  services: 
+    - serviceName: Foo Service
+  resources: 
+    - resourceName: Bar VNF
+      resourceType: VF
+  trigger_policy: unique-policy-id-1-restart
+  timeout: 1200
+
+policies:
+  - id: unique-policy-id-1-restart
+    name: Restart Policy for Trigger Event
+    description:
+    actor: MSO
+    recipe: Instantiate
+    target: VM
+    retry: 2
+    timeout: 300
+    success: final_failure_exception
+    failure: final_success
+    failure_timeout: final_success
+    failure_retries: final_success
+    failure_exception: final_failure_exception
diff --git a/models-interactions/model-yaml/src/test/resources/v2.0.0-guard/duplicate_guard_constraint.yaml b/models-interactions/model-yaml/src/test/resources/v2.0.0-guard/duplicate_guard_constraint.yaml
new file mode 100644
index 0000000..b6f92e7
--- /dev/null
+++ b/models-interactions/model-yaml/src/test/resources/v2.0.0-guard/duplicate_guard_constraint.yaml
@@ -0,0 +1,35 @@
+# Copyright 2018 AT&T Intellectual Property. All rights reserved
+# Modifications Copyright (C) 2019 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.
+guard:
+  version: 2.0.0
+
+guards:
+  - id: unique_guard_vUSP_1
+    name: APPC 5 Restart
+    description: 
+      We only allow 5 restarts over 15 minute window during the day time hours (i.e. avoid midnight to 5am)
+    actor: APPC
+    recipe: Restart
+    limit_constraints:
+      #
+      - num: 5
+        time_in_range:
+          arg2: PT5H
+          arg3: PT24H
+      #
+      - num: 5
+        time_in_range:
+          arg2: PT5H
+          arg3: PT24H
\ No newline at end of file
diff --git a/models-interactions/model-yaml/src/test/resources/v2.0.0-guard/duplicate_guard_policy.yaml b/models-interactions/model-yaml/src/test/resources/v2.0.0-guard/duplicate_guard_policy.yaml
new file mode 100644
index 0000000..a510340
--- /dev/null
+++ b/models-interactions/model-yaml/src/test/resources/v2.0.0-guard/duplicate_guard_policy.yaml
@@ -0,0 +1,41 @@
+# Copyright 2018 AT&T Intellectual Property. All rights reserved
+# Modifications Copyright (C) 2019 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.
+guard:
+  version: 2.0.0
+
+guards:
+  - id: unique_guard_vUSP_1
+    name: APPC 5 Restart
+    description: 
+      We only allow 5 restarts over 15 minute window during the day time hours (i.e. avoid midnight to 5am)
+    actor: APPC
+    recipe: Restart
+    limit_constraints:
+      - num: 5
+        time_in_range:
+          arg2: PT5H
+          arg3: PT24H
+  #
+  - id: unique_guard_vUSP_1
+    name: APPC 5 Restart
+    description: 
+      We only allow 5 restarts over 15 minute window during the day time hours (i.e. avoid midnight to 5am)
+    actor: APPC
+    recipe: Restart
+    limit_constraints:
+      - num: 5
+        time_in_range:
+          arg2: PT5H
+          arg3: PT24H
\ No newline at end of file
diff --git a/models-interactions/model-yaml/src/test/resources/v2.0.0-guard/no_guard_constraint.yaml b/models-interactions/model-yaml/src/test/resources/v2.0.0-guard/no_guard_constraint.yaml
new file mode 100644
index 0000000..6f986e1
--- /dev/null
+++ b/models-interactions/model-yaml/src/test/resources/v2.0.0-guard/no_guard_constraint.yaml
@@ -0,0 +1,25 @@
+# Copyright 2018 AT&T Intellectual Property. All rights reserved
+# Modifications Copyright (C) 2019 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.
+guard:
+  version: 2.0.0
+
+guards:
+  - id: unique_guard_vUSP_1
+    name: APPC 5 Restart
+    description: 
+      We only allow 5 restarts over 15 minute window during the day time hours (i.e. avoid midnight to 5am)
+    actor: APPC
+    recipe: Restart
+  
\ No newline at end of file
diff --git a/models-interactions/model-yaml/src/test/resources/v2.0.0-guard/no_guard_policy.yaml b/models-interactions/model-yaml/src/test/resources/v2.0.0-guard/no_guard_policy.yaml
new file mode 100644
index 0000000..a5afca2
--- /dev/null
+++ b/models-interactions/model-yaml/src/test/resources/v2.0.0-guard/no_guard_policy.yaml
@@ -0,0 +1,16 @@
+# Copyright 2018 AT&T Intellectual Property. All rights reserved
+# Modifications Copyright (C) 2019 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.
+guard:
+  version: 2.0.0
diff --git a/models-interactions/model-yaml/src/test/resources/v2.0.0-guard/policy_guard_ONAP_demo_vDNS.yaml b/models-interactions/model-yaml/src/test/resources/v2.0.0-guard/policy_guard_ONAP_demo_vDNS.yaml
new file mode 100644
index 0000000..c71caab
--- /dev/null
+++ b/models-interactions/model-yaml/src/test/resources/v2.0.0-guard/policy_guard_ONAP_demo_vDNS.yaml
@@ -0,0 +1,33 @@
+# Copyright 2018 AT&T Intellectual Property. All rights reserved
+# Modifications Copyright (C) 2019 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.
+guard:
+  version: 2.0.0
+
+guards:
+  - id: unique_guard_ONAP_vDNS_1
+    name: MSO Spinup
+    description: We only spin up 1 instance over a 10 minute window
+    match_parameters:
+      actor: MSO
+      recipe: VF Module Create
+    limit_constraints:
+      - freq_limit_per_target: 1
+        #
+        # https://www.w3.org/TR/xmlschema-2/#duration
+        #
+        time_window:
+          value: 10
+          units: hour
+        
\ No newline at end of file
diff --git a/models-interactions/model-yaml/src/test/resources/v2.0.0-guard/policy_guard_appc_restart.yaml b/models-interactions/model-yaml/src/test/resources/v2.0.0-guard/policy_guard_appc_restart.yaml
new file mode 100644
index 0000000..df682d1
--- /dev/null
+++ b/models-interactions/model-yaml/src/test/resources/v2.0.0-guard/policy_guard_appc_restart.yaml
@@ -0,0 +1,38 @@
+# Copyright 2018 AT&T Intellectual Property. All rights reserved
+# Modifications Copyright (C) 2019 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.
+guard:
+  version: 2.0.0
+
+guards:
+  - id: unique_guard_1
+    name: APPC 5 Restart
+    description: 
+      We only allow 5 restarts over 15 minute window during the day time hours (i.e. avoid midnight to 5am)
+    match_parameters:
+      controlLoopName: CL_NAME_ABC_123
+      actor: APPC
+      recipe: Restart
+      targets:
+        - s1
+          s2
+          s3
+    limit_constraints:
+      - freq_limit_per_target: 5
+        time_window: 
+          value: 15
+          units: minute
+        active_time_range:
+          start: 00:00:00-05:00
+          end: 23:59:59-05:00
\ No newline at end of file
diff --git a/models-interactions/model-yaml/src/test/resources/v2.0.0-guard/policy_guard_blacklist.yaml b/models-interactions/model-yaml/src/test/resources/v2.0.0-guard/policy_guard_blacklist.yaml
new file mode 100644
index 0000000..a835aef
--- /dev/null
+++ b/models-interactions/model-yaml/src/test/resources/v2.0.0-guard/policy_guard_blacklist.yaml
@@ -0,0 +1,31 @@
+# Copyright 2018 AT&T Intellectual Property. All rights reserved
+# Modifications Copyright (C) 2019 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.
+guard:
+  version: 2.0.0
+
+guards:
+  - id: unique_guard_vService_blacklist
+    name: APPC Restart Blacklist
+    description: |
+      We deny restart of the blacklisted targets (avoid midnight to 5am)
+    actor: APPC
+    recipe: Restart
+    limit_constraints:
+      - blacklist:
+          - TargetName1
+          - TargetName2
+        time_in_range:
+          arg2: 00:00:00-05:00
+          arg3: 23:59:59-05:00
\ No newline at end of file
diff --git a/models-interactions/model-yaml/src/test/resources/v2.0.0/Demo-1.0.0-HeatTemplates/resource-59a2ee3fB58045feB5a1-template.yml b/models-interactions/model-yaml/src/test/resources/v2.0.0/Demo-1.0.0-HeatTemplates/resource-59a2ee3fB58045feB5a1-template.yml
new file mode 100644
index 0000000..4b50195
--- /dev/null
+++ b/models-interactions/model-yaml/src/test/resources/v2.0.0/Demo-1.0.0-HeatTemplates/resource-59a2ee3fB58045feB5a1-template.yml
@@ -0,0 +1,1698 @@
+tosca_definitions_version: tosca_simple_yaml_1_0
+metadata:
+  invariantUUID: 4b8d4018-068b-4c33-b9bb-d980798e52c2
+  UUID: d7d28881-b24d-4512-bfee-1e2eb335591f
+  name: 59a2ee3f-b580-45fe-b5a1
+  description: vendor software product
+  type: VF
+  category: Generic
+  subcategory: Abstract
+  resourceVendor: 185c637a-3885-463e-8fd0
+  resourceVendorRelease: '1.0'
+imports:
+- NeutronNet:
+    file: resource-Neutronnet-template.yml
+- NeutronPort:
+    file: resource-Neutronport-template.yml
+- 59a2ee3fB58045feB5a1.nodes.heat.vlb:
+    file: resource-59a2ee3fb58045feb5a1NodesHeatVlb-template.yml
+- 59a2ee3fB58045feB5a1.nodes.heat.vdns:
+    file: resource-59a2ee3fb58045feb5a1NodesHeatVdns-template.yml
+topology_template:
+  inputs:
+    vf_module_id:
+      type: string
+      description: The vLoadBalancer Module ID is provided by ONAP
+    onap_private_subnet_id:
+      type: string
+      description: Private sub-network that connects ONAP component and the VNF
+    repo_url_blob:
+      type: string
+      description: URL of the repository that hosts the demo packages
+    vlb_private_net_cidr:
+      type: string
+      description: The CIDR of the vLoadBalancer private network
+    vlb_private_net_id:
+      type: string
+      description: Private network that connects vLoadBalancer with vDNSs
+    public_net_id:
+      type: string
+      default: 00000000-0000-0000-0000-000000000000
+      description: Public network that enables remote connection to VNF
+    demo_artifacts_version:
+      type: string
+      description: Artifacts (jar, tar.gz) version used in demo vnfs
+    onap_private_net_id:
+      type: string
+      description: Private network that connects ONAP component and the VNF
+    pub_key:
+      type: string
+      description: Public key to be installed on the compute instance
+    vlb_private_ip_1:
+      type: string
+      description: Private IP address that is assigned to the vLoadBalancer to communicate with ONAP components
+    key_name:
+      type: string
+      description: Public/Private key pair name
+    vdns_name_0:
+      type: string
+      description: Name of the vDNS
+    repo_url_artifacts:
+      type: string
+      description: URL of the repository that hosts the demo packages
+    vlb_name_0:
+      type: string
+      description: Name of the vLoadBalancer
+    vdns_private_ip_0:
+      type: string
+      description: Private IP address that is assigned to the vDNS to communicate with the vLoadBalancer
+    vnf_id:
+      type: string
+      description: The VNF ID is provided by ONAP
+    dcae_collector_ip:
+      type: string
+      description: IP address of the DCAE collector
+    vdns_private_ip_1:
+      type: string
+      description: Private IP address that is assigned to the vDNS to communicate with ONAP components
+    dcae_collector_port:
+      type: string
+      description: Port of the DCAE collector
+    vlb_image_name:
+      type: string
+      default: Ubuntu 14.04 LTS (Trusty Tahr) (PVHVM)
+      description: Image to be used for compute instance
+    vlb_flavor_name:
+      type: string
+      default: 4 GB General Purpose v1
+      description: Type of instance (flavor) to be used
+    vlb_private_ip_0:
+      type: string
+      description: Private IP address that is assigned to the vLoadBalancer to communicate with the vDNSs
+    onap_private_net_cidr:
+      type: string
+      description: The CIDR of the protected private network
+  node_templates:
+    vdns_private_1_port:
+      type: org.onap.resource.cp.nodes.heat.network.neutron.Port
+      metadata:
+        invariantUUID: 7feb77d3-dcc5-4826-8a78-0c9089814a45
+        UUID: 06bc8ea7-0f6a-489a-9f8f-c7253653b457
+        version: '1.0'
+        name: NeutronPort
+        description: Represents a logical entity that associates between Compute and Network normative types.
+        type: CP
+        category: Generic
+        subcategory: Network Elements
+      properties:
+        fixed_ips:
+        - subnet:
+            get_input: onap_private_subnet_id
+          ip_address:
+            get_input: vdns_private_ip_1
+        network:
+          get_input: onap_private_net_id
+      requirements:
+      - binding:
+          capability: tosca.capabilities.network.Bindable
+          node: vdns_0
+          relationship: tosca.relationships.network.BindsTo
+    vlb_private_network:
+      type: org.onap.resource.vl.nodes.heat.network.neutron.Net
+      metadata:
+        invariantUUID: 2870cc3a-d6cd-4423-b7f6-2d63619b0eeb
+        UUID: b7e764ba-17f9-4f0a-ad29-29877766ef21
+        version: '1.0'
+        name: NeutronNet
+        description: Represents a network service with optional subnets and advanced configurations.
+        type: VL
+        category: Generic
+        subcategory: Network Elements
+      properties:
+        network_name:
+          get_input: vlb_private_net_id
+        subnets:
+          vlb_private_subnet:
+            name:
+              get_input: vlb_private_net_id
+            cidr:
+              get_input: vlb_private_net_cidr
+    vlb_private_1_port:
+      type: org.onap.resource.cp.nodes.heat.network.neutron.Port
+      metadata:
+        invariantUUID: 7feb77d3-dcc5-4826-8a78-0c9089814a45
+        UUID: 06bc8ea7-0f6a-489a-9f8f-c7253653b457
+        version: '1.0'
+        name: NeutronPort
+        description: Represents a logical entity that associates between Compute and Network normative types.
+        type: CP
+        category: Generic
+        subcategory: Network Elements
+      properties:
+        fixed_ips:
+        - subnet:
+            get_input: onap_private_subnet_id
+          ip_address:
+            get_input: vlb_private_ip_1
+        network:
+          get_input: onap_private_net_id
+      requirements:
+      - binding:
+          capability: tosca.capabilities.network.Bindable
+          node: vlb_0
+          relationship: tosca.relationships.network.BindsTo
+    vdns_0:
+      type: org.onap.resource.vfc.59a2ee3fB58045feB5a1.abstact.nodes.heat.vdns
+      metadata:
+        invariantUUID: ee585c30-127b-492e-b2c1-871dc61d1dde
+        UUID: d816cb01-b5d0-4bbb-b614-f7c3e230ab19
+        version: '1.0'
+        name: 59a2ee3fB58045feB5a1.nodes.heat.vdns
+        description: Not reusable inner VFC
+        type: VFC
+        category: Generic
+        subcategory: Abstract
+      properties:
+        key_name: UNSUPPORTED_RESOURCE_my_keypair
+        flavor:
+          get_input: vlb_flavor_name
+        image:
+          get_input: vlb_image_name
+        metadata:
+          vf_module_id:
+            get_input: vf_module_id
+          vnf_id:
+            get_input: vnf_id
+        user_data_format: RAW
+        name:
+          get_input: vdns_name_0
+    vlb_private_0_port:
+      type: org.onap.resource.cp.nodes.heat.network.neutron.Port
+      metadata:
+        invariantUUID: 7feb77d3-dcc5-4826-8a78-0c9089814a45
+        UUID: 06bc8ea7-0f6a-489a-9f8f-c7253653b457
+        version: '1.0'
+        name: NeutronPort
+        description: Represents a logical entity that associates between Compute and Network normative types.
+        type: CP
+        category: Generic
+        subcategory: Network Elements
+      properties:
+        fixed_ips:
+        - subnet: vlb_private_network
+          ip_address:
+            get_input: vlb_private_ip_0
+        network: vlb_private_network
+      requirements:
+      - link:
+          capability: tosca.capabilities.network.Linkable
+          node: vlb_private_network
+          relationship: tosca.relationships.network.LinksTo
+      - binding:
+          capability: tosca.capabilities.network.Bindable
+          node: vlb_0
+          relationship: tosca.relationships.network.BindsTo
+    vdns_private_0_port:
+      type: org.onap.resource.cp.nodes.heat.network.neutron.Port
+      metadata:
+        invariantUUID: 7feb77d3-dcc5-4826-8a78-0c9089814a45
+        UUID: 06bc8ea7-0f6a-489a-9f8f-c7253653b457
+        version: '1.0'
+        name: NeutronPort
+        description: Represents a logical entity that associates between Compute and Network normative types.
+        type: CP
+        category: Generic
+        subcategory: Network Elements
+      properties:
+        fixed_ips:
+        - subnet:
+            get_input: vlb_private_net_id
+          ip_address:
+            get_input: vdns_private_ip_0
+        network:
+          get_input: vlb_private_net_id
+      requirements:
+      - binding:
+          capability: tosca.capabilities.network.Bindable
+          node: vdns_0
+          relationship: tosca.relationships.network.BindsTo
+    vlb_0:
+      type: org.onap.resource.vfc.59a2ee3fB58045feB5a1.abstact.nodes.heat.vlb
+      metadata:
+        invariantUUID: f7f1d745-cfb1-4aa9-83fc-31280d0ce513
+        UUID: 1821f13e-411f-4b29-87a5-ae935897b2e1
+        version: '1.0'
+        name: 59a2ee3fB58045feB5a1.nodes.heat.vlb
+        description: Not reusable inner VFC
+        type: VFC
+        category: Generic
+        subcategory: Abstract
+      properties:
+        key_name: UNSUPPORTED_RESOURCE_my_keypair
+        flavor:
+          get_input: vlb_flavor_name
+        image:
+          get_input: vlb_image_name
+        metadata:
+          vf_module_id:
+            get_input: vf_module_id
+          vnf_id:
+            get_input: vnf_id
+        user_data_format: RAW
+        name:
+          get_input: vlb_name_0
+  groups:
+    base_vlb:
+      type: org.onap.groups.heat.HeatStack
+      members:
+      - vdns_private_1_port
+      - vlb_private_network
+      - vlb_private_1_port
+      - vdns_0
+      - vlb_private_0_port
+      - vdns_private_0_port
+      - vlb_0
+      metadata:
+        invariantUUID: 097f71b3-90a1-4064-bc83-f76bf30195fe
+        UUID: 4daf7600-0a06-4515-859a-c45ec11abd29
+        version: '1'
+        name: base_vlb
+    59a2ee3fB58045feB5a1..dnsscaling..module-1:
+      type: org.onap.groups.VfModule
+      members:
+      - vdns_private_1_port
+      - vdns_0
+      - vdns_private_0_port
+      metadata:
+        vfModuleModelName: 59a2ee3fB58045feB5a1..dnsscaling..module-1
+        vfModuleModelInvariantUUID: 395d61a9-309b-4c0f-a442-ca47903e231e
+        vfModuleModelUUID: 40846490-abf4-4e1d-8f1a-2286968fa231
+        vfModuleModelVersion: '1'
+      properties:
+        vf_module_type: Expansion
+        vf_module_description:
+        volume_group: false
+    59a2ee3fB58045feB5a1..base_vlb..module-0:
+      type: org.onap.groups.VfModule
+      members:
+      - vdns_private_1_port
+      - vlb_private_network
+      - vlb_private_1_port
+      - vdns_0
+      - vlb_private_0_port
+      - vdns_private_0_port
+      - vlb_0
+      metadata:
+        vfModuleModelName: 59a2ee3fB58045feB5a1..base_vlb..module-0
+        vfModuleModelInvariantUUID: 5ae76f74-6324-4835-a86c-0c96d16afd38
+        vfModuleModelUUID: 17c4f752-a3da-4f3d-9cc5-1c4d28e5442d
+        vfModuleModelVersion: '1'
+      properties:
+        vf_module_type: Base
+        vf_module_description:
+        volume_group: false
+    dnsscaling:
+      type: org.onap.groups.heat.HeatStack
+      members:
+      - vdns_private_1_port
+      - vdns_0
+      - vdns_private_0_port
+      metadata:
+        invariantUUID: 7c2971fa-9369-4fed-a449-a5e21c022f97
+        UUID: ae8c3b79-77d3-425a-8bab-6558007f8392
+        version: '1'
+        name: dnsscaling
+  substitution_mappings:
+    node_type: org.onap.resource.vf.59a2ee3fB58045feB5a1
+    capabilities:
+      vdns_0.memory:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: Volume of RAM allocated to the instance
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Gauge
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: MB
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: memory
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      vdns_0.memory.resident:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: Volume of RAM used by the instance on the physical machine
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Gauge
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: MB
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: memory.resident
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      vdns_0.cpu:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: CPU time used
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Cumulative
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: ns
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: cpu
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      vdns_0.feature:
+        type: tosca.capabilities.Node
+        occurrences:
+        - 1
+        - UNBOUNDED
+      vdns_private_0_port.feature:
+        type: tosca.capabilities.Node
+        occurrences:
+        - 1
+        - UNBOUNDED
+      vdns_0.host:
+        type: tosca.capabilities.Container
+        occurrences:
+        - 1
+        - UNBOUNDED
+        valid_source_types:
+        - tosca.nodes.SoftwareComponent
+        properties:
+          num_cpus:
+            type: integer
+            required: false
+          disk_size:
+            type: scalar-unit.size
+            required: false
+          cpu_frequency:
+            type: scalar-unit.frequency
+            required: false
+          mem_size:
+            type: scalar-unit.size
+            required: false
+      vdns_0.endpoint:
+        type: tosca.capabilities.Endpoint.Admin
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          port_name:
+            type: string
+            required: false
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          secure:
+            type: boolean
+            default: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          url_path:
+            type: string
+            required: false
+      vlb_private_1_port.attachment:
+        type: tosca.capabilities.Attachment
+        occurrences:
+        - 1
+        - UNBOUNDED
+      vlb_0.memory:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: Volume of RAM allocated to the instance
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Gauge
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: MB
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: memory
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      vdns_private_1_port.attachment:
+        type: tosca.capabilities.Attachment
+        occurrences:
+        - 1
+        - UNBOUNDED
+      vlb_0.scalable:
+        type: tosca.capabilities.Scalable
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          max_instances:
+            type: integer
+            default: 1
+          min_instances:
+            type: integer
+            default: 1
+          default_instances:
+            type: integer
+      vlb_0.binding:
+        type: tosca.capabilities.network.Bindable
+        occurrences:
+        - 0
+        - UNBOUNDED
+      vlb_0.vcpus:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: Average disk latency
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Gauge
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: ms
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: vcpus
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      vlb_0.instance:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: Existence of instance
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Gauge
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: instance
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: instance
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      vdns_0.os:
+        type: tosca.capabilities.OperatingSystem
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          distribution:
+            type: string
+            required: false
+          type:
+            type: string
+            required: false
+          version:
+            type: version
+            required: false
+          architecture:
+            type: string
+            required: false
+      vlb_private_0_port.feature:
+        type: tosca.capabilities.Node
+        occurrences:
+        - 1
+        - UNBOUNDED
+      vlb_private_1_port.feature:
+        type: tosca.capabilities.Node
+        occurrences:
+        - 1
+        - UNBOUNDED
+      vlb_0.cpu:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: CPU time used
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Cumulative
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: ns
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: cpu
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      vdns_0.cpu.delta:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: CPU time used since previous datapoint
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Delta
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: ns
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: cpu.delta
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      vlb_0.memory.resident:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: Volume of RAM used by the instance on the physical machine
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Gauge
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: MB
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: memory.resident
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      vdns_0.vcpus:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: Average disk latency
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Gauge
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: ms
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: vcpus
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      vdns_0.memory.usage:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: Volume of RAM used by the instance from the amount of its allocated memory
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Gauge
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: MB
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: memory.usage
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      vlb_0.cpu.delta:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: CPU time used since previous datapoint
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Delta
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: ns
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: cpu.delta
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      vdns_0.instance:type:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: Existence of instance <type> (OpenStack types)
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Gauge
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: instance
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: instance:type
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      vlb_0.os:
+        type: tosca.capabilities.OperatingSystem
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          distribution:
+            type: string
+            required: false
+          type:
+            type: string
+            required: false
+          version:
+            type: version
+            required: false
+          architecture:
+            type: string
+            required: false
+      vlb_private_0_port.attachment:
+        type: tosca.capabilities.Attachment
+        occurrences:
+        - 1
+        - UNBOUNDED
+      vlb_0.host:
+        type: tosca.capabilities.Container
+        occurrences:
+        - 1
+        - UNBOUNDED
+        valid_source_types:
+        - tosca.nodes.SoftwareComponent
+        properties:
+          num_cpus:
+            type: integer
+            required: false
+          disk_size:
+            type: scalar-unit.size
+            required: false
+          cpu_frequency:
+            type: scalar-unit.frequency
+            required: false
+          mem_size:
+            type: scalar-unit.size
+            required: false
+      vlb_0.instance:type:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: Existence of instance <type> (OpenStack types)
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Gauge
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: instance
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: instance:type
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      vlb_private_network.feature:
+        type: tosca.capabilities.Node
+        occurrences:
+        - 1
+        - UNBOUNDED
+      vdns_0.binding:
+        type: tosca.capabilities.network.Bindable
+        occurrences:
+        - 0
+        - UNBOUNDED
+      vlb_private_network.link:
+        type: tosca.capabilities.network.Linkable
+        occurrences:
+        - 0
+        - UNBOUNDED
+      vlb_0.cpu_util:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: Average CPU utilization
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Gauge
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: '%'
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: cpu_util
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      vlb_0.feature:
+        type: tosca.capabilities.Node
+        occurrences:
+        - 1
+        - UNBOUNDED
+      vdns_private_0_port.attachment:
+        type: tosca.capabilities.Attachment
+        occurrences:
+        - 1
+        - UNBOUNDED
+      vdns_0.cpu_util:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: Average CPU utilization
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Gauge
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: '%'
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: cpu_util
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      vdns_0.instance:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: Existence of instance
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Gauge
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: instance
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: instance
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      vlb_private_network.attachment:
+        type: tosca.capabilities.Attachment
+        occurrences:
+        - 1
+        - UNBOUNDED
+      vdns_0.scalable:
+        type: tosca.capabilities.Scalable
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          max_instances:
+            type: integer
+            default: 1
+          min_instances:
+            type: integer
+            default: 1
+          default_instances:
+            type: integer
+      vdns_private_1_port.feature:
+        type: tosca.capabilities.Node
+        occurrences:
+        - 1
+        - UNBOUNDED
+      vlb_0.memory.usage:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: Volume of RAM used by the instance from the amount of its allocated memory
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Gauge
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: MB
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: memory.usage
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      vlb_0.endpoint:
+        type: tosca.capabilities.Endpoint.Admin
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          port_name:
+            type: string
+            required: false
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          secure:
+            type: boolean
+            default: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          url_path:
+            type: string
+            required: false
+    requirements:
+      vdns_0.dependency:
+        occurrences:
+        - 0
+        - UNBOUNDED
+        capability: tosca.capabilities.Node
+        node: tosca.nodes.Root
+        relationship: tosca.relationships.DependsOn
+      vlb_private_1_port.link:
+        occurrences:
+        - 1
+        - 1
+        capability: tosca.capabilities.network.Linkable
+        relationship: tosca.relationships.network.LinksTo
+      vlb_private_0_port.dependency:
+        occurrences:
+        - 0
+        - UNBOUNDED
+        capability: tosca.capabilities.Node
+        node: tosca.nodes.Root
+        relationship: tosca.relationships.DependsOn
+      vdns_private_0_port.dependency:
+        occurrences:
+        - 0
+        - UNBOUNDED
+        capability: tosca.capabilities.Node
+        node: tosca.nodes.Root
+        relationship: tosca.relationships.DependsOn
+      vlb_0.dependency:
+        occurrences:
+        - 0
+        - UNBOUNDED
+        capability: tosca.capabilities.Node
+        node: tosca.nodes.Root
+        relationship: tosca.relationships.DependsOn
+      vdns_private_0_port.link:
+        occurrences:
+        - 1
+        - 1
+        capability: tosca.capabilities.network.Linkable
+        relationship: tosca.relationships.network.LinksTo
+      vdns_0.local_storage:
+        occurrences:
+        - 0
+        - UNBOUNDED
+        capability: tosca.capabilities.Attachment
+        node: tosca.nodes.BlockStorage
+        relationship: tosca.relationships.AttachesTo
+      vlb_private_1_port.dependency:
+        occurrences:
+        - 0
+        - UNBOUNDED
+        capability: tosca.capabilities.Node
+        node: tosca.nodes.Root
+        relationship: tosca.relationships.DependsOn
+      vlb_private_network.dependency:
+        occurrences:
+        - 0
+        - UNBOUNDED
+        capability: tosca.capabilities.Node
+        node: tosca.nodes.Root
+        relationship: tosca.relationships.DependsOn
+      vlb_0.local_storage:
+        occurrences:
+        - 0
+        - UNBOUNDED
+        capability: tosca.capabilities.Attachment
+        node: tosca.nodes.BlockStorage
+        relationship: tosca.relationships.AttachesTo
+      vdns_private_1_port.link:
+        occurrences:
+        - 1
+        - 1
+        capability: tosca.capabilities.network.Linkable
+        relationship: tosca.relationships.network.LinksTo
+      vdns_private_1_port.dependency:
+        occurrences:
+        - 0
+        - UNBOUNDED
+        capability: tosca.capabilities.Node
+        node: tosca.nodes.Root
+        relationship: tosca.relationships.DependsOn
diff --git a/models-interactions/model-yaml/src/test/resources/v2.0.0/Demo-1.0.0-HeatTemplates/resource-Eace933104d443b496b8-template.yml b/models-interactions/model-yaml/src/test/resources/v2.0.0/Demo-1.0.0-HeatTemplates/resource-Eace933104d443b496b8-template.yml
new file mode 100644
index 0000000..c0f4f4d
--- /dev/null
+++ b/models-interactions/model-yaml/src/test/resources/v2.0.0/Demo-1.0.0-HeatTemplates/resource-Eace933104d443b496b8-template.yml
@@ -0,0 +1,2525 @@
+tosca_definitions_version: tosca_simple_yaml_1_0
+metadata:
+  invariantUUID: 06fe411e-d006-4ac3-8b0e-fb4f13cd78d3
+  UUID: 172ce7c5-c2e4-4f8d-b66c-edb49e8e548a
+  name: eace9331-04d4-43b4-96b8
+  description: vendor software product
+  type: VF
+  category: Generic
+  subcategory: Abstract
+  resourceVendor: 31125954-23a0-4d41-95e5
+  resourceVendorRelease: '1.0'
+imports:
+- NeutronPort:
+    file: resource-Neutronport-template.yml
+- Eace933104d443b496b8.nodes.heat.vfw:
+    file: resource-Eace933104d443b496b8NodesHeatVfw-template.yml
+- Eace933104d443b496b8.nodes.heat.vpg:
+    file: resource-Eace933104d443b496b8NodesHeatVpg-template.yml
+- NeutronNet:
+    file: resource-Neutronnet-template.yml
+- Eace933104d443b496b8.nodes.heat.vsn:
+    file: resource-Eace933104d443b496b8NodesHeatVsn-template.yml
+topology_template:
+  inputs:
+    vf_module_id:
+      type: string
+      description: The vFirewall Module ID is provided by onap
+    repo_url_blob:
+      type: string
+      description: URL of the repository that hosts the demo packages
+    public_net_id:
+      type: string
+      default: 00000000-0000-0000-0000-000000000000
+      description: Public network that enables remote connection to VNF
+    vfw_private_ip_1:
+      type: string
+      description: Private IP address that is assigned to the vFirewall to communicate with the vSink
+    vfw_private_ip_0:
+      type: string
+      description: Private IP address that is assigned to the vFirewall to communicate with the vPacketGenerator
+    vfw_private_ip_2:
+      type: string
+      description: Private IP address that is assigned to the vFirewall to communicate with ONAP components
+    vfw_name_0:
+      type: string
+      description: Name of the vFirewall
+    vnf_id:
+      type: string
+      description: The VNF ID is provided by onap
+    dcae_collector_ip:
+      type: string
+      description: IP address of the DCAE collector
+    dcae_collector_port:
+      type: string
+      description: Port of the DCAE collector
+    vpg_private_ip_1:
+      type: string
+      description: Private IP address that is assigned to the vPacketGenerator to communicate with ONAP components
+    vsn_private_ip_0:
+      type: string
+      description: Private IP address that is assigned to the vSink to communicate with the vFirewall
+    vpg_name_0:
+      type: string
+      description: Name of the vPacketGenerator
+    vpg_private_ip_0:
+      type: string
+      description: Private IP address that is assigned to the vPacketGenerator to communicate with the vFirewall
+    vsn_private_ip_1:
+      type: string
+      description: Private IP address that is assigned to the vSink to communicate with ONAP components
+    protected_private_net_cidr:
+      type: string
+      description: The CIDR of the protected private network
+    onap_private_net_cidr:
+      type: string
+      description: The CIDR of the protected private network
+    unprotected_private_net_cidr:
+      type: string
+      description: The CIDR of the unprotected private network
+    onap_private_subnet_id:
+      type: string
+      description: Private sub-network that connects ONAP component and the VNF
+    vsn_name_0:
+      type: string
+      description: Name of the vSink
+    unprotected_private_net_id:
+      type: string
+      description: Private network that connects vPacketGenerator with vFirewall
+    vfw_flavor_name:
+      type: string
+      default: 4 GB General Purpose v1
+      description: Type of instance (flavor) to be used
+    demo_artifacts_version:
+      type: string
+      description: Artifacts (jar, tar.gz) version used in demo vnfs
+    onap_private_net_id:
+      type: string
+      description: Private network that connects ONAP component and the VNF
+    pub_key:
+      type: string
+      description: Public key to be installed on the compute instance
+    key_name:
+      type: string
+      description: Public/Private key pair name
+    repo_url_artifacts:
+      type: string
+      description: URL of the repository that hosts the demo packages
+    vfw_image_name:
+      type: string
+      default: Ubuntu 14.04 LTS (Trusty Tahr) (PVHVM)
+      description: Image to be used for compute instance
+    protected_private_net_id:
+      type: string
+      description: Private network that connects vFirewall with vSink
+  node_templates:
+    vfw_private_0_port:
+      type: org.onap.resource.cp.nodes.heat.network.neutron.Port
+      metadata:
+        invariantUUID: 7feb77d3-dcc5-4826-8a78-0c9089814a45
+        UUID: 06bc8ea7-0f6a-489a-9f8f-c7253653b457
+        version: '1.0'
+        name: NeutronPort
+        description: Represents a logical entity that associates between Compute and Network normative types.
+        type: CP
+        category: Generic
+        subcategory: Network Elements
+      properties:
+        fixed_ips:
+        - subnet: unprotected_private_network
+          ip_address:
+            get_input: vfw_private_ip_0
+        network: unprotected_private_network
+      requirements:
+      - link:
+          capability: tosca.capabilities.network.Linkable
+          node: unprotected_private_network
+          relationship: tosca.relationships.network.LinksTo
+      - binding:
+          capability: tosca.capabilities.network.Bindable
+          node: vfw_0
+          relationship: tosca.relationships.network.BindsTo
+    vsn_private_1_port:
+      type: org.onap.resource.cp.nodes.heat.network.neutron.Port
+      metadata:
+        invariantUUID: 7feb77d3-dcc5-4826-8a78-0c9089814a45
+        UUID: 06bc8ea7-0f6a-489a-9f8f-c7253653b457
+        version: '1.0'
+        name: NeutronPort
+        description: Represents a logical entity that associates between Compute and Network normative types.
+        type: CP
+        category: Generic
+        subcategory: Network Elements
+      properties:
+        fixed_ips:
+        - subnet:
+            get_input: onap_private_subnet_id
+          ip_address:
+            get_input: vsn_private_ip_1
+        network:
+          get_input: onap_private_net_id
+      requirements:
+      - binding:
+          capability: tosca.capabilities.network.Bindable
+          node: vsn_0
+          relationship: tosca.relationships.network.BindsTo
+    unprotected_private_network:
+      type: org.onap.resource.vl.nodes.heat.network.neutron.Net
+      metadata:
+        invariantUUID: 2870cc3a-d6cd-4423-b7f6-2d63619b0eeb
+        UUID: b7e764ba-17f9-4f0a-ad29-29877766ef21
+        version: '1.0'
+        name: NeutronNet
+        description: Represents a network service with optional subnets and advanced configurations.
+        type: VL
+        category: Generic
+        subcategory: Network Elements
+      properties:
+        network_name:
+          get_input: unprotected_private_net_id
+        subnets:
+          unprotected_private_subnet:
+            cidr:
+              get_input: unprotected_private_net_cidr
+    vpg_private_1_port:
+      type: org.onap.resource.cp.nodes.heat.network.neutron.Port
+      metadata:
+        invariantUUID: 7feb77d3-dcc5-4826-8a78-0c9089814a45
+        UUID: 06bc8ea7-0f6a-489a-9f8f-c7253653b457
+        version: '1.0'
+        name: NeutronPort
+        description: Represents a logical entity that associates between Compute and Network normative types.
+        type: CP
+        category: Generic
+        subcategory: Network Elements
+      properties:
+        fixed_ips:
+        - subnet:
+            get_input: onap_private_subnet_id
+          ip_address:
+            get_input: vpg_private_ip_1
+        network:
+          get_input: onap_private_net_id
+      requirements:
+      - binding:
+          capability: tosca.capabilities.network.Bindable
+          node: vpg_0
+          relationship: tosca.relationships.network.BindsTo
+    vfw_0:
+      type: org.onap.resource.vfc.Eace933104d443b496b8.abstact.nodes.heat.vfw
+      metadata:
+        invariantUUID: 0129e34c-d9fa-442d-bb2c-f925d018000a
+        UUID: 7fa1f6c7-c6bd-4444-8db2-63334a5aed1b
+        version: '1.0'
+        name: Eace933104d443b496b8.nodes.heat.vfw
+        description: Not reusable inner VFC
+        type: VFC
+        category: Generic
+        subcategory: Abstract
+      properties:
+        key_name: UNSUPPORTED_RESOURCE_my_keypair
+        flavor:
+          get_input: vfw_flavor_name
+        image:
+          get_input: vfw_image_name
+        metadata:
+          vf_module_id:
+            get_input: vf_module_id
+          vnf_id:
+            get_input: vnf_id
+        user_data_format: RAW
+        name:
+          get_input: vfw_name_0
+    vsn_0:
+      type: org.onap.resource.vfc.Eace933104d443b496b8.abstact.nodes.heat.vsn
+      metadata:
+        invariantUUID: b19f6643-3db0-4d73-b280-94d6f21caa71
+        UUID: 6dca6eb9-330c-4090-a542-7aca5f446e21
+        version: '1.0'
+        name: Eace933104d443b496b8.nodes.heat.vsn
+        description: Not reusable inner VFC
+        type: VFC
+        category: Generic
+        subcategory: Abstract
+      properties:
+        key_name: UNSUPPORTED_RESOURCE_my_keypair
+        flavor:
+          get_input: vfw_flavor_name
+        image:
+          get_input: vfw_image_name
+        metadata:
+          vf_module_id:
+            get_input: vf_module_id
+          vnf_id:
+            get_input: vnf_id
+        user_data_format: RAW
+        name:
+          get_input: vsn_name_0
+    vpg_private_0_port:
+      type: org.onap.resource.cp.nodes.heat.network.neutron.Port
+      metadata:
+        invariantUUID: 7feb77d3-dcc5-4826-8a78-0c9089814a45
+        UUID: 06bc8ea7-0f6a-489a-9f8f-c7253653b457
+        version: '1.0'
+        name: NeutronPort
+        description: Represents a logical entity that associates between Compute and Network normative types.
+        type: CP
+        category: Generic
+        subcategory: Network Elements
+      properties:
+        fixed_ips:
+        - subnet: unprotected_private_network
+          ip_address:
+            get_input: vpg_private_ip_0
+        network: unprotected_private_network
+      requirements:
+      - link:
+          capability: tosca.capabilities.network.Linkable
+          node: unprotected_private_network
+          relationship: tosca.relationships.network.LinksTo
+      - binding:
+          capability: tosca.capabilities.network.Bindable
+          node: vpg_0
+          relationship: tosca.relationships.network.BindsTo
+    vsn_private_0_port:
+      type: org.onap.resource.cp.nodes.heat.network.neutron.Port
+      metadata:
+        invariantUUID: 7feb77d3-dcc5-4826-8a78-0c9089814a45
+        UUID: 06bc8ea7-0f6a-489a-9f8f-c7253653b457
+        version: '1.0'
+        name: NeutronPort
+        description: Represents a logical entity that associates between Compute and Network normative types.
+        type: CP
+        category: Generic
+        subcategory: Network Elements
+      properties:
+        fixed_ips:
+        - subnet: protected_private_network
+          ip_address:
+            get_input: vsn_private_ip_0
+        network: protected_private_network
+      requirements:
+      - link:
+          capability: tosca.capabilities.network.Linkable
+          node: protected_private_network
+          relationship: tosca.relationships.network.LinksTo
+      - binding:
+          capability: tosca.capabilities.network.Bindable
+          node: vsn_0
+          relationship: tosca.relationships.network.BindsTo
+    vfw_private_1_port:
+      type: org.onap.resource.cp.nodes.heat.network.neutron.Port
+      metadata:
+        invariantUUID: 7feb77d3-dcc5-4826-8a78-0c9089814a45
+        UUID: 06bc8ea7-0f6a-489a-9f8f-c7253653b457
+        version: '1.0'
+        name: NeutronPort
+        description: Represents a logical entity that associates between Compute and Network normative types.
+        type: CP
+        category: Generic
+        subcategory: Network Elements
+      properties:
+        fixed_ips:
+        - subnet: protected_private_network
+          ip_address:
+            get_input: vfw_private_ip_1
+        network: protected_private_network
+      requirements:
+      - link:
+          capability: tosca.capabilities.network.Linkable
+          node: protected_private_network
+          relationship: tosca.relationships.network.LinksTo
+      - binding:
+          capability: tosca.capabilities.network.Bindable
+          node: vfw_0
+          relationship: tosca.relationships.network.BindsTo
+    vfw_private_2_port:
+      type: org.onap.resource.cp.nodes.heat.network.neutron.Port
+      metadata:
+        invariantUUID: 7feb77d3-dcc5-4826-8a78-0c9089814a45
+        UUID: 06bc8ea7-0f6a-489a-9f8f-c7253653b457
+        version: '1.0'
+        name: NeutronPort
+        description: Represents a logical entity that associates between Compute and Network normative types.
+        type: CP
+        category: Generic
+        subcategory: Network Elements
+      properties:
+        fixed_ips:
+        - subnet:
+            get_input: onap_private_subnet_id
+          ip_address:
+            get_input: vfw_private_ip_2
+        network:
+          get_input: onap_private_net_id
+      requirements:
+      - binding:
+          capability: tosca.capabilities.network.Bindable
+          node: vfw_0
+          relationship: tosca.relationships.network.BindsTo
+    vpg_0:
+      type: org.onap.resource.vfc.Eace933104d443b496b8.abstact.nodes.heat.vpg
+      metadata:
+        invariantUUID: 7654ae14-4e98-45bc-a8c0-2c43e1805bb4
+        UUID: 5267d6dd-f676-4f98-abec-6387ce6beaf2
+        version: '1.0'
+        name: Eace933104d443b496b8.nodes.heat.vpg
+        description: Not reusable inner VFC
+        type: VFC
+        category: Generic
+        subcategory: Abstract
+      properties:
+        key_name: UNSUPPORTED_RESOURCE_my_keypair
+        flavor:
+          get_input: vfw_flavor_name
+        image:
+          get_input: vfw_image_name
+        metadata:
+          vf_module_id:
+            get_input: vf_module_id
+          vnf_id:
+            get_input: vnf_id
+        user_data_format: RAW
+        name:
+          get_input: vpg_name_0
+    protected_private_network:
+      type: org.onap.resource.vl.nodes.heat.network.neutron.Net
+      metadata:
+        invariantUUID: 2870cc3a-d6cd-4423-b7f6-2d63619b0eeb
+        UUID: b7e764ba-17f9-4f0a-ad29-29877766ef21
+        version: '1.0'
+        name: NeutronNet
+        description: Represents a network service with optional subnets and advanced configurations.
+        type: VL
+        category: Generic
+        subcategory: Network Elements
+      properties:
+        network_name:
+          get_input: protected_private_net_id
+        subnets:
+          protected_private_subnet:
+            cidr:
+              get_input: protected_private_net_cidr
+  groups:
+    base_vfw:
+      type: org.onap.groups.heat.HeatStack
+      members:
+      - vfw_private_0_port
+      - vsn_private_1_port
+      - unprotected_private_network
+      - vpg_private_1_port
+      - vfw_0
+      - vsn_0
+      - vpg_private_0_port
+      - vsn_private_0_port
+      - vfw_private_1_port
+      - vfw_private_2_port
+      - vpg_0
+      - protected_private_network
+      metadata:
+        invariantUUID: 44b0c172-7b61-49b5-a68a-810042087e1f
+        UUID: 24cb02f0-1d72-441f-a327-22d80180deaa
+        version: '1'
+        name: base_vfw
+    Eace933104d443b496b8..base_vfw..module-0:
+      type: org.onap.groups.VfModule
+      members:
+      - vfw_private_0_port
+      - vsn_private_1_port
+      - unprotected_private_network
+      - vpg_private_1_port
+      - vfw_0
+      - vsn_0
+      - vpg_private_0_port
+      - vsn_private_0_port
+      - vfw_private_1_port
+      - vfw_private_2_port
+      - vpg_0
+      - protected_private_network
+      metadata:
+        vfModuleModelName: Eace933104d443b496b8..base_vfw..module-0
+        vfModuleModelInvariantUUID: 58c105fd-9c12-4fb7-8a3e-a5ec280183fb
+        vfModuleModelUUID: ab251d24-4001-4926-aa5c-c01736b36c68
+        vfModuleModelVersion: '1'
+      properties:
+        vf_module_type: Base
+        vf_module_description:
+        volume_group: false
+  substitution_mappings:
+    node_type: org.onap.resource.vf.Eace933104d443b496b8
+    capabilities:
+      vfw_0.instance:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: Existence of instance
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Gauge
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: instance
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: instance
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      vfw_0.scalable:
+        type: tosca.capabilities.Scalable
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          max_instances:
+            type: integer
+            default: 1
+          min_instances:
+            type: integer
+            default: 1
+          default_instances:
+            type: integer
+      vfw_0.instance:type:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: Existence of instance <type> (OpenStack types)
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Gauge
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: instance
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: instance:type
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      protected_private_network.link:
+        type: tosca.capabilities.network.Linkable
+        occurrences:
+        - 0
+        - UNBOUNDED
+      vsn_0.cpu:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: CPU time used
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Cumulative
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: ns
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: cpu
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      vpg_0.instance:type:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: Existence of instance <type> (OpenStack types)
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Gauge
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: instance
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: instance:type
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      unprotected_private_network.attachment:
+        type: tosca.capabilities.Attachment
+        occurrences:
+        - 1
+        - UNBOUNDED
+      vfw_0.memory:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: Volume of RAM allocated to the instance
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Gauge
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: MB
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: memory
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      vpg_0.cpu_util:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: Average CPU utilization
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Gauge
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: '%'
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: cpu_util
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      vpg_0.endpoint:
+        type: tosca.capabilities.Endpoint.Admin
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          port_name:
+            type: string
+            required: false
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          secure:
+            type: boolean
+            default: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          url_path:
+            type: string
+            required: false
+      vpg_private_0_port.attachment:
+        type: tosca.capabilities.Attachment
+        occurrences:
+        - 1
+        - UNBOUNDED
+      vfw_private_1_port.feature:
+        type: tosca.capabilities.Node
+        occurrences:
+        - 1
+        - UNBOUNDED
+      vfw_private_0_port.attachment:
+        type: tosca.capabilities.Attachment
+        occurrences:
+        - 1
+        - UNBOUNDED
+      vpg_0.cpu:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: CPU time used
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Cumulative
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: ns
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: cpu
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      vpg_private_1_port.attachment:
+        type: tosca.capabilities.Attachment
+        occurrences:
+        - 1
+        - UNBOUNDED
+      vsn_0.vcpus:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: Average disk latency
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Gauge
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: ms
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: vcpus
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      vpg_0.cpu.delta:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: CPU time used since previous datapoint
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Delta
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: ns
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: cpu.delta
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      vsn_private_1_port.attachment:
+        type: tosca.capabilities.Attachment
+        occurrences:
+        - 1
+        - UNBOUNDED
+      vsn_0.cpu_util:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: Average CPU utilization
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Gauge
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: '%'
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: cpu_util
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      vpg_0.instance:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: Existence of instance
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Gauge
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: instance
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: instance
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      vpg_0.feature:
+        type: tosca.capabilities.Node
+        occurrences:
+        - 1
+        - UNBOUNDED
+      vpg_0.scalable:
+        type: tosca.capabilities.Scalable
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          max_instances:
+            type: integer
+            default: 1
+          min_instances:
+            type: integer
+            default: 1
+          default_instances:
+            type: integer
+      vpg_0.memory:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: Volume of RAM allocated to the instance
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Gauge
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: MB
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: memory
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      vfw_private_2_port.attachment:
+        type: tosca.capabilities.Attachment
+        occurrences:
+        - 1
+        - UNBOUNDED
+      vsn_0.os:
+        type: tosca.capabilities.OperatingSystem
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          distribution:
+            type: string
+            required: false
+          type:
+            type: string
+            required: false
+          version:
+            type: version
+            required: false
+          architecture:
+            type: string
+            required: false
+      vfw_0.memory.resident:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: Volume of RAM used by the instance on the physical machine
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Gauge
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: MB
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: memory.resident
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      vsn_0.scalable:
+        type: tosca.capabilities.Scalable
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          max_instances:
+            type: integer
+            default: 1
+          min_instances:
+            type: integer
+            default: 1
+          default_instances:
+            type: integer
+      vsn_0.instance:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: Existence of instance
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Gauge
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: instance
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: instance
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      vfw_0.endpoint:
+        type: tosca.capabilities.Endpoint.Admin
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          port_name:
+            type: string
+            required: false
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          secure:
+            type: boolean
+            default: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          url_path:
+            type: string
+            required: false
+      vsn_0.cpu.delta:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: CPU time used since previous datapoint
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Delta
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: ns
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: cpu.delta
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      vfw_0.os:
+        type: tosca.capabilities.OperatingSystem
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          distribution:
+            type: string
+            required: false
+          type:
+            type: string
+            required: false
+          version:
+            type: version
+            required: false
+          architecture:
+            type: string
+            required: false
+      vsn_private_1_port.feature:
+        type: tosca.capabilities.Node
+        occurrences:
+        - 1
+        - UNBOUNDED
+      vsn_private_0_port.feature:
+        type: tosca.capabilities.Node
+        occurrences:
+        - 1
+        - UNBOUNDED
+      vfw_0.memory.usage:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: Volume of RAM used by the instance from the amount of its allocated memory
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Gauge
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: MB
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: memory.usage
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      vsn_0.host:
+        type: tosca.capabilities.Container
+        occurrences:
+        - 1
+        - UNBOUNDED
+        valid_source_types:
+        - tosca.nodes.SoftwareComponent
+        properties:
+          num_cpus:
+            type: integer
+            required: false
+          disk_size:
+            type: scalar-unit.size
+            required: false
+          cpu_frequency:
+            type: scalar-unit.frequency
+            required: false
+          mem_size:
+            type: scalar-unit.size
+            required: false
+      vsn_0.memory:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: Volume of RAM allocated to the instance
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Gauge
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: MB
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: memory
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      unprotected_private_network.link:
+        type: tosca.capabilities.network.Linkable
+        occurrences:
+        - 0
+        - UNBOUNDED
+      vfw_0.host:
+        type: tosca.capabilities.Container
+        occurrences:
+        - 1
+        - UNBOUNDED
+        valid_source_types:
+        - tosca.nodes.SoftwareComponent
+        properties:
+          num_cpus:
+            type: integer
+            required: false
+          disk_size:
+            type: scalar-unit.size
+            required: false
+          cpu_frequency:
+            type: scalar-unit.frequency
+            required: false
+          mem_size:
+            type: scalar-unit.size
+            required: false
+      vsn_private_0_port.attachment:
+        type: tosca.capabilities.Attachment
+        occurrences:
+        - 1
+        - UNBOUNDED
+      vfw_private_2_port.feature:
+        type: tosca.capabilities.Node
+        occurrences:
+        - 1
+        - UNBOUNDED
+      unprotected_private_network.feature:
+        type: tosca.capabilities.Node
+        occurrences:
+        - 1
+        - UNBOUNDED
+      vpg_0.vcpus:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: Average disk latency
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Gauge
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: ms
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: vcpus
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      vpg_0.binding:
+        type: tosca.capabilities.network.Bindable
+        occurrences:
+        - 0
+        - UNBOUNDED
+      vpg_0.host:
+        type: tosca.capabilities.Container
+        occurrences:
+        - 1
+        - UNBOUNDED
+        valid_source_types:
+        - tosca.nodes.SoftwareComponent
+        properties:
+          num_cpus:
+            type: integer
+            required: false
+          disk_size:
+            type: scalar-unit.size
+            required: false
+          cpu_frequency:
+            type: scalar-unit.frequency
+            required: false
+          mem_size:
+            type: scalar-unit.size
+            required: false
+      vsn_0.binding:
+        type: tosca.capabilities.network.Bindable
+        occurrences:
+        - 0
+        - UNBOUNDED
+      protected_private_network.attachment:
+        type: tosca.capabilities.Attachment
+        occurrences:
+        - 1
+        - UNBOUNDED
+      vfw_0.binding:
+        type: tosca.capabilities.network.Bindable
+        occurrences:
+        - 0
+        - UNBOUNDED
+      vpg_0.memory.usage:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: Volume of RAM used by the instance from the amount of its allocated memory
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Gauge
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: MB
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: memory.usage
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      vfw_private_0_port.feature:
+        type: tosca.capabilities.Node
+        occurrences:
+        - 1
+        - UNBOUNDED
+      vsn_0.endpoint:
+        type: tosca.capabilities.Endpoint.Admin
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          port_name:
+            type: string
+            required: false
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          secure:
+            type: boolean
+            default: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          url_path:
+            type: string
+            required: false
+      vfw_0.feature:
+        type: tosca.capabilities.Node
+        occurrences:
+        - 1
+        - UNBOUNDED
+      protected_private_network.feature:
+        type: tosca.capabilities.Node
+        occurrences:
+        - 1
+        - UNBOUNDED
+      vfw_0.cpu:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: CPU time used
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Cumulative
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: ns
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: cpu
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      vsn_0.instance:type:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: Existence of instance <type> (OpenStack types)
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Gauge
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: instance
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: instance:type
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      vpg_0.os:
+        type: tosca.capabilities.OperatingSystem
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          distribution:
+            type: string
+            required: false
+          type:
+            type: string
+            required: false
+          version:
+            type: version
+            required: false
+          architecture:
+            type: string
+            required: false
+      vsn_0.feature:
+        type: tosca.capabilities.Node
+        occurrences:
+        - 1
+        - UNBOUNDED
+      vfw_0.vcpus:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: Average disk latency
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Gauge
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: ms
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: vcpus
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      vfw_0.cpu.delta:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: CPU time used since previous datapoint
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Delta
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: ns
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: cpu.delta
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      vsn_0.memory.resident:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: Volume of RAM used by the instance on the physical machine
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Gauge
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: MB
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: memory.resident
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      vsn_0.memory.usage:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: Volume of RAM used by the instance from the amount of its allocated memory
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Gauge
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: MB
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: memory.usage
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      vfw_private_1_port.attachment:
+        type: tosca.capabilities.Attachment
+        occurrences:
+        - 1
+        - UNBOUNDED
+      vfw_0.cpu_util:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: Average CPU utilization
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Gauge
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: '%'
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: cpu_util
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      vpg_0.memory.resident:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: Volume of RAM used by the instance on the physical machine
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Gauge
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: MB
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: memory.resident
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      vpg_private_0_port.feature:
+        type: tosca.capabilities.Node
+        occurrences:
+        - 1
+        - UNBOUNDED
+      vpg_private_1_port.feature:
+        type: tosca.capabilities.Node
+        occurrences:
+        - 1
+        - UNBOUNDED
+    requirements:
+      vsn_private_1_port.link:
+        occurrences:
+        - 1
+        - 1
+        capability: tosca.capabilities.network.Linkable
+        relationship: tosca.relationships.network.LinksTo
+      vfw_0.local_storage:
+        occurrences:
+        - 0
+        - UNBOUNDED
+        capability: tosca.capabilities.Attachment
+        node: tosca.nodes.BlockStorage
+        relationship: tosca.relationships.AttachesTo
+      vfw_private_1_port.dependency:
+        occurrences:
+        - 0
+        - UNBOUNDED
+        capability: tosca.capabilities.Node
+        node: tosca.nodes.Root
+        relationship: tosca.relationships.DependsOn
+      vpg_private_1_port.link:
+        occurrences:
+        - 1
+        - 1
+        capability: tosca.capabilities.network.Linkable
+        relationship: tosca.relationships.network.LinksTo
+      vsn_0.local_storage:
+        occurrences:
+        - 0
+        - UNBOUNDED
+        capability: tosca.capabilities.Attachment
+        node: tosca.nodes.BlockStorage
+        relationship: tosca.relationships.AttachesTo
+      protected_private_network.dependency:
+        occurrences:
+        - 0
+        - UNBOUNDED
+        capability: tosca.capabilities.Node
+        node: tosca.nodes.Root
+        relationship: tosca.relationships.DependsOn
+      vfw_private_2_port.dependency:
+        occurrences:
+        - 0
+        - UNBOUNDED
+        capability: tosca.capabilities.Node
+        node: tosca.nodes.Root
+        relationship: tosca.relationships.DependsOn
+      vfw_private_2_port.link:
+        occurrences:
+        - 1
+        - 1
+        capability: tosca.capabilities.network.Linkable
+        relationship: tosca.relationships.network.LinksTo
+      unprotected_private_network.dependency:
+        occurrences:
+        - 0
+        - UNBOUNDED
+        capability: tosca.capabilities.Node
+        node: tosca.nodes.Root
+        relationship: tosca.relationships.DependsOn
+      vsn_private_0_port.dependency:
+        occurrences:
+        - 0
+        - UNBOUNDED
+        capability: tosca.capabilities.Node
+        node: tosca.nodes.Root
+        relationship: tosca.relationships.DependsOn
+      vpg_0.local_storage:
+        occurrences:
+        - 0
+        - UNBOUNDED
+        capability: tosca.capabilities.Attachment
+        node: tosca.nodes.BlockStorage
+        relationship: tosca.relationships.AttachesTo
+      vsn_private_1_port.dependency:
+        occurrences:
+        - 0
+        - UNBOUNDED
+        capability: tosca.capabilities.Node
+        node: tosca.nodes.Root
+        relationship: tosca.relationships.DependsOn
+      vfw_0.dependency:
+        occurrences:
+        - 0
+        - UNBOUNDED
+        capability: tosca.capabilities.Node
+        node: tosca.nodes.Root
+        relationship: tosca.relationships.DependsOn
+      vpg_0.dependency:
+        occurrences:
+        - 0
+        - UNBOUNDED
+        capability: tosca.capabilities.Node
+        node: tosca.nodes.Root
+        relationship: tosca.relationships.DependsOn
+      vpg_private_1_port.dependency:
+        occurrences:
+        - 0
+        - UNBOUNDED
+        capability: tosca.capabilities.Node
+        node: tosca.nodes.Root
+        relationship: tosca.relationships.DependsOn
+      vsn_0.dependency:
+        occurrences:
+        - 0
+        - UNBOUNDED
+        capability: tosca.capabilities.Node
+        node: tosca.nodes.Root
+        relationship: tosca.relationships.DependsOn
+      vpg_private_0_port.dependency:
+        occurrences:
+        - 0
+        - UNBOUNDED
+        capability: tosca.capabilities.Node
+        node: tosca.nodes.Root
+        relationship: tosca.relationships.DependsOn
+      vfw_private_0_port.dependency:
+        occurrences:
+        - 0
+        - UNBOUNDED
+        capability: tosca.capabilities.Node
+        node: tosca.nodes.Root
+        relationship: tosca.relationships.DependsOn
diff --git a/models-interactions/model-yaml/src/test/resources/v2.0.0/Demo-1.0.0-HeatTemplates/service-57e66ea70ed645c7970f-template.yml b/models-interactions/model-yaml/src/test/resources/v2.0.0/Demo-1.0.0-HeatTemplates/service-57e66ea70ed645c7970f-template.yml
new file mode 100644
index 0000000..4bfd629
--- /dev/null
+++ b/models-interactions/model-yaml/src/test/resources/v2.0.0/Demo-1.0.0-HeatTemplates/service-57e66ea70ed645c7970f-template.yml
@@ -0,0 +1,677 @@
+tosca_definitions_version: tosca_simple_yaml_1_0
+metadata:
+  invariantUUID: 5cfe6f4a-41bc-4247-8674-ebd4b98e35cc
+  UUID: 0f40bba5-986e-4b3c-803f-ddd1b7b25f24
+  name: 57e66ea7-0ed6-45c7-970f
+  description: catalog service description
+  type: Service
+  category: Network L1-3
+  serviceOnapNaming: false
+  serviceHoming: false
+imports:
+- eace9331-04d4-43b4-96b8:
+    file: resource-Eace933104d443b496b8-template.yml
+topology_template:
+  node_templates:
+    eace9331-04d4-43b4-96b8 1:
+      type: org.onap.resource.vf.Eace933104d443b496b8
+      metadata:
+        invariantUUID: 06fe411e-d006-4ac3-8b0e-fb4f13cd78d3
+        UUID: 172ce7c5-c2e4-4f8d-b66c-edb49e8e548a
+        version: '1.0'
+        name: eace9331-04d4-43b4-96b8
+        description: vendor software product
+        type: VF
+        category: Generic
+        subcategory: Abstract
+  substitution_mappings:
+    node_type: org.onap.service.57e66ea70ed645c7970f
+    capabilities:
+      eace9331-04d4-43b4-96b8 1.memory.resident:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: Volume of RAM used by the instance on the physical machine
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Gauge
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: MB
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: memory.resident
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      eace9331-04d4-43b4-96b8 1.os:
+        type: tosca.capabilities.OperatingSystem
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          distribution:
+            type: string
+            required: false
+          type:
+            type: string
+            required: false
+          version:
+            type: version
+            required: false
+          architecture:
+            type: string
+            required: false
+      eace9331-04d4-43b4-96b8 1.binding:
+        type: tosca.capabilities.network.Bindable
+        occurrences:
+        - 0
+        - UNBOUNDED
+      eace9331-04d4-43b4-96b8 1.host:
+        type: tosca.capabilities.Container
+        occurrences:
+        - 1
+        - UNBOUNDED
+        valid_source_types:
+        - tosca.nodes.SoftwareComponent
+        properties:
+          num_cpus:
+            type: integer
+            required: false
+          disk_size:
+            type: scalar-unit.size
+            required: false
+          cpu_frequency:
+            type: scalar-unit.frequency
+            required: false
+          mem_size:
+            type: scalar-unit.size
+            required: false
+      eace9331-04d4-43b4-96b8 1.instance:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: Existence of instance
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Gauge
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: instance
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: instance
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      eace9331-04d4-43b4-96b8 1.scalable:
+        type: tosca.capabilities.Scalable
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          max_instances:
+            type: integer
+            default: 1
+          min_instances:
+            type: integer
+            default: 1
+          default_instances:
+            type: integer
+      eace9331-04d4-43b4-96b8 1.memory:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: Volume of RAM allocated to the instance
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Gauge
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: MB
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: memory
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      eace9331-04d4-43b4-96b8 1.feature:
+        type: tosca.capabilities.Node
+        occurrences:
+        - 1
+        - UNBOUNDED
+      eace9331-04d4-43b4-96b8 1.vcpus:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: Average disk latency
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Gauge
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: ms
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: vcpus
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      eace9331-04d4-43b4-96b8 1.cpu_util:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: Average CPU utilization
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Gauge
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: '%'
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: cpu_util
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      eace9331-04d4-43b4-96b8 1.cpu.delta:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: CPU time used since previous datapoint
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Delta
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: ns
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: cpu.delta
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      eace9331-04d4-43b4-96b8 1.attachment:
+        type: tosca.capabilities.Attachment
+        occurrences:
+        - 1
+        - UNBOUNDED
+      eace9331-04d4-43b4-96b8 1.cpu:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: CPU time used
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Cumulative
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: ns
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: cpu
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      eace9331-04d4-43b4-96b8 1.instance:type:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: Existence of instance <type> (OpenStack types)
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Gauge
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: instance
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: instance:type
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      eace9331-04d4-43b4-96b8 1.link:
+        type: tosca.capabilities.network.Linkable
+        occurrences:
+        - 0
+        - UNBOUNDED
+      eace9331-04d4-43b4-96b8 1.memory.usage:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: Volume of RAM used by the instance from the amount of its allocated memory
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Gauge
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: MB
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: memory.usage
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      eace9331-04d4-43b4-96b8 1.endpoint:
+        type: tosca.capabilities.Endpoint.Admin
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          port_name:
+            type: string
+            required: false
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          secure:
+            type: boolean
+            default: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          url_path:
+            type: string
+            required: false
+    requirements:
+      eace9331-04d4-43b4-96b8 1.local_storage:
+        occurrences:
+        - 0
+        - UNBOUNDED
+        capability: tosca.capabilities.Attachment
+        node: tosca.nodes.BlockStorage
+        relationship: tosca.relationships.AttachesTo
+      eace9331-04d4-43b4-96b8 1.dependency:
+        occurrences:
+        - 0
+        - UNBOUNDED
+        capability: tosca.capabilities.Node
+        node: tosca.nodes.Root
+        relationship: tosca.relationships.DependsOn
+      eace9331-04d4-43b4-96b8 1.link:
+        occurrences:
+        - 1
+        - 1
+        capability: tosca.capabilities.network.Linkable
+        relationship: tosca.relationships.network.LinksTo
diff --git a/models-interactions/model-yaml/src/test/resources/v2.0.0/Demo-1.0.0-HeatTemplates/service-D473899264974dca9db9-template.yml b/models-interactions/model-yaml/src/test/resources/v2.0.0/Demo-1.0.0-HeatTemplates/service-D473899264974dca9db9-template.yml
new file mode 100644
index 0000000..2293b3a
--- /dev/null
+++ b/models-interactions/model-yaml/src/test/resources/v2.0.0/Demo-1.0.0-HeatTemplates/service-D473899264974dca9db9-template.yml
@@ -0,0 +1,677 @@
+tosca_definitions_version: tosca_simple_yaml_1_0
+metadata:
+  invariantUUID: dc112d6e-7e73-4777-9c6f-1a7fb5fd1b6f
+  UUID: 2eea06c6-e1d3-4c3a-b9c4-478c506eeedf
+  name: d4738992-6497-4dca-9db9
+  description: catalog service description
+  type: Service
+  category: Network L1-3
+  serviceOnapNaming: false
+  serviceHoming: false
+imports:
+- 59a2ee3f-b580-45fe-b5a1:
+    file: resource-59a2ee3fB58045feB5a1-template.yml
+topology_template:
+  node_templates:
+    59a2ee3f-b580-45fe-b5a1 1:
+      type: org.onap.resource.vf.59a2ee3fB58045feB5a1
+      metadata:
+        invariantUUID: 4b8d4018-068b-4c33-b9bb-d980798e52c2
+        UUID: d7d28881-b24d-4512-bfee-1e2eb335591f
+        version: '1.0'
+        name: 59a2ee3f-b580-45fe-b5a1
+        description: vendor software product
+        type: VF
+        category: Generic
+        subcategory: Abstract
+  substitution_mappings:
+    node_type: org.onap.service.D473899264974dca9db9
+    capabilities:
+      59a2ee3f-b580-45fe-b5a1 1.memory.resident:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: Volume of RAM used by the instance on the physical machine
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Gauge
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: MB
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: memory.resident
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      59a2ee3f-b580-45fe-b5a1 1.endpoint:
+        type: tosca.capabilities.Endpoint.Admin
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          port_name:
+            type: string
+            required: false
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          secure:
+            type: boolean
+            default: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          url_path:
+            type: string
+            required: false
+      59a2ee3f-b580-45fe-b5a1 1.attachment:
+        type: tosca.capabilities.Attachment
+        occurrences:
+        - 1
+        - UNBOUNDED
+      59a2ee3f-b580-45fe-b5a1 1.feature:
+        type: tosca.capabilities.Node
+        occurrences:
+        - 1
+        - UNBOUNDED
+      59a2ee3f-b580-45fe-b5a1 1.binding:
+        type: tosca.capabilities.network.Bindable
+        occurrences:
+        - 0
+        - UNBOUNDED
+      59a2ee3f-b580-45fe-b5a1 1.vcpus:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: Average disk latency
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Gauge
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: ms
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: vcpus
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      59a2ee3f-b580-45fe-b5a1 1.host:
+        type: tosca.capabilities.Container
+        occurrences:
+        - 1
+        - UNBOUNDED
+        valid_source_types:
+        - tosca.nodes.SoftwareComponent
+        properties:
+          num_cpus:
+            type: integer
+            required: false
+          disk_size:
+            type: scalar-unit.size
+            required: false
+          cpu_frequency:
+            type: scalar-unit.frequency
+            required: false
+          mem_size:
+            type: scalar-unit.size
+            required: false
+      59a2ee3f-b580-45fe-b5a1 1.memory.usage:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: Volume of RAM used by the instance from the amount of its allocated memory
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Gauge
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: MB
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: memory.usage
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      59a2ee3f-b580-45fe-b5a1 1.instance:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: Existence of instance
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Gauge
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: instance
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: instance
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      59a2ee3f-b580-45fe-b5a1 1.scalable:
+        type: tosca.capabilities.Scalable
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          max_instances:
+            type: integer
+            default: 1
+          min_instances:
+            type: integer
+            default: 1
+          default_instances:
+            type: integer
+      59a2ee3f-b580-45fe-b5a1 1.cpu_util:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: Average CPU utilization
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Gauge
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: '%'
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: cpu_util
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      59a2ee3f-b580-45fe-b5a1 1.instance:type:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: Existence of instance <type> (OpenStack types)
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Gauge
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: instance
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: instance:type
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      59a2ee3f-b580-45fe-b5a1 1.cpu.delta:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: CPU time used since previous datapoint
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Delta
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: ns
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: cpu.delta
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      59a2ee3f-b580-45fe-b5a1 1.memory:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: Volume of RAM allocated to the instance
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Gauge
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: MB
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: memory
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      59a2ee3f-b580-45fe-b5a1 1.link:
+        type: tosca.capabilities.network.Linkable
+        occurrences:
+        - 0
+        - UNBOUNDED
+      59a2ee3f-b580-45fe-b5a1 1.cpu:
+        type: org.onap.capabilities.metric.Ceilometer
+        description: CPU time used
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          initiator:
+            type: string
+            default: source
+          network_name:
+            type: string
+            default: PRIVATE
+            required: false
+          description:
+            type: string
+            description: Description of the metric
+            required: false
+          type:
+            type: string
+            default: Cumulative
+            description: Type of the metric value, for an example, Cumulative, Delta, Gauge and etc.
+            required: true
+          ports:
+            type: map
+            required: false
+            entry_schema:
+              type: PortSpec
+          secure:
+            type: boolean
+            default: false
+          port_name:
+            type: string
+            required: false
+          unit:
+            type: string
+            default: ns
+            description: Unit of the metric value
+            required: true
+          protocol:
+            type: string
+            default: tcp
+          port:
+            type: PortDef
+            required: false
+          name:
+            type: string
+            default: cpu
+            description: Ceilometer metric type name to monitor. (The name ceilometer is using)
+            required: true
+          category:
+            type: string
+            default: compute
+            description: Category of the metric, for an example, compute, disk, network, storage and etc.
+            required: false
+          url_path:
+            type: string
+            required: false
+      59a2ee3f-b580-45fe-b5a1 1.os:
+        type: tosca.capabilities.OperatingSystem
+        occurrences:
+        - 1
+        - UNBOUNDED
+        properties:
+          distribution:
+            type: string
+            required: false
+          type:
+            type: string
+            required: false
+          version:
+            type: version
+            required: false
+          architecture:
+            type: string
+            required: false
+    requirements:
+      59a2ee3f-b580-45fe-b5a1 1.local_storage:
+        occurrences:
+        - 0
+        - UNBOUNDED
+        capability: tosca.capabilities.Attachment
+        node: tosca.nodes.BlockStorage
+        relationship: tosca.relationships.AttachesTo
+      59a2ee3f-b580-45fe-b5a1 1.dependency:
+        occurrences:
+        - 0
+        - UNBOUNDED
+        capability: tosca.capabilities.Node
+        node: tosca.nodes.Root
+        relationship: tosca.relationships.DependsOn
+      59a2ee3f-b580-45fe-b5a1 1.link:
+        occurrences:
+        - 1
+        - 1
+        capability: tosca.capabilities.network.Linkable
+        relationship: tosca.relationships.network.LinksTo
diff --git a/models-interactions/model-yaml/src/test/resources/v2.0.0/pgstreams.json b/models-interactions/model-yaml/src/test/resources/v2.0.0/pgstreams.json
new file mode 100644
index 0000000..4d118af
--- /dev/null
+++ b/models-interactions/model-yaml/src/test/resources/v2.0.0/pgstreams.json
@@ -0,0 +1,26 @@
+{
+    "pg-streams": {
+      "pg-stream": [
+        {
+          "id": "fw_udp1",
+          "is-enabled": "true"
+        },
+        {
+          "id": "fw_udp2",
+          "is-enabled": "true"
+        },
+        {
+          "id": "fw_udp3",
+          "is-enabled": "true"
+        },
+        {
+          "id": "fw_udp4",
+          "is-enabled": "true"
+        },
+        {
+          "id": "fw_udp5",
+          "is-enabled": "true"
+        }
+      ]
+    }
+}
\ No newline at end of file
diff --git a/models-interactions/model-yaml/src/test/resources/v2.0.0/policy_ONAP_UseCase_VOLTE.yaml b/models-interactions/model-yaml/src/test/resources/v2.0.0/policy_ONAP_UseCase_VOLTE.yaml
new file mode 100644
index 0000000..f001e9f
--- /dev/null
+++ b/models-interactions/model-yaml/src/test/resources/v2.0.0/policy_ONAP_UseCase_VOLTE.yaml
@@ -0,0 +1,37 @@
+# Copyright 2018 AT&T Intellectual Property. All rights reserved
+# Modifications Copyright (C) 2019 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.
+controlLoop:
+  version: 2.0.0
+  controlLoopName: ControlLoop-VOLTE-2179b738-fd36-4843-a71a-a8c24c70c55b
+  
+  trigger_policy: unique-policy-id-1-restart
+  timeout: 3600
+
+policies:
+  - id: unique-policy-id-1-restart
+    name: Restart the VM
+    description:
+    actor: VFC
+    recipe: Restart
+    target:
+      type: VM
+    retry: 3
+    timeout: 1200
+    success: final_success
+    failure: final_failure
+    failure_timeout: final_failure_timeout
+    failure_retries: final_failure_retries
+    failure_exception: final_failure_exception
+    failure_guard: final_failure_guard
diff --git a/models-interactions/model-yaml/src/test/resources/v2.0.0/policy_ONAP_UseCase_vCPE.yaml b/models-interactions/model-yaml/src/test/resources/v2.0.0/policy_ONAP_UseCase_vCPE.yaml
new file mode 100644
index 0000000..e1c9b07
--- /dev/null
+++ b/models-interactions/model-yaml/src/test/resources/v2.0.0/policy_ONAP_UseCase_vCPE.yaml
@@ -0,0 +1,37 @@
+# Copyright 2018 AT&T Intellectual Property. All rights reserved
+# Modifications Copyright (C) 2019 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.
+controlLoop:
+  version: 2.0.0
+  controlLoopName: ControlLoop-vCPE-48f0c2c3-a172-4192-9ae3-052274181b6e
+  
+  trigger_policy: unique-policy-id-1-restart
+  timeout: 3600
+
+policies:
+  - id: unique-policy-id-1-restart
+    name: Restart the VM
+    description:
+    actor: APPC
+    recipe: Restart
+    target:
+      type: VM
+    retry: 3
+    timeout: 1200
+    success: final_success
+    failure: final_failure
+    failure_timeout: final_failure_timeout
+    failure_retries: final_failure_retries
+    failure_exception: final_failure_exception
+    failure_guard: final_failure_guard
diff --git a/models-interactions/model-yaml/src/test/resources/v2.0.0/policy_ONAP_UseCase_vPCI.yaml b/models-interactions/model-yaml/src/test/resources/v2.0.0/policy_ONAP_UseCase_vPCI.yaml
new file mode 100644
index 0000000..b5c028b
--- /dev/null
+++ b/models-interactions/model-yaml/src/test/resources/v2.0.0/policy_ONAP_UseCase_vPCI.yaml
@@ -0,0 +1,40 @@
+# Copyright 2018 Wipro Limited Intellectual Property. All rights reserved
+# Modifications Copyright (C) 2019 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.
+controlLoop:
+  version: 3.0.0
+  controlLoopName: ControlLoop-vPCI-fb41f388-a5f2-11e8-98d0-529269fb1459
+  trigger_policy: unique-policy-id-123-modifyconfig
+  timeout: 1200
+  abatement: false
+
+policies:
+  - id: unique-policy-id-123-modifyconfig
+    name: modify PCI config
+    description:
+    actor: SDNR
+    recipe: ModifyConfig
+    target:
+      # These fields are not used
+      resourceID: Eace933104d443b496b8.nodes.heat.vpg
+      type: VNF
+    retry: 0
+    timeout: 300
+    success: final_success
+    failure: final_failure
+    failure_timeout: final_failure_timeout
+    failure_retries: final_failure_retries
+    failure_exception: final_failure_exception
+    failure_guard: final_failure_guard
+
diff --git a/models-interactions/model-yaml/src/test/resources/v2.0.0/policy_ONAP_demo_vDNS.yaml b/models-interactions/model-yaml/src/test/resources/v2.0.0/policy_ONAP_demo_vDNS.yaml
new file mode 100644
index 0000000..4341eb9
--- /dev/null
+++ b/models-interactions/model-yaml/src/test/resources/v2.0.0/policy_ONAP_demo_vDNS.yaml
@@ -0,0 +1,64 @@
+# Copyright 2018 AT&T Intellectual Property. All rights reserved
+# Modifications Copyright (C) 2019 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.
+controlLoop:
+  version: 2.0.0
+  controlLoopName: ControlLoop-vDNS-6f37f56d-a87d-4b85-b6a9-cc953cf779b3
+  services: 
+    - serviceName: d4738992-6497-4dca-9db9
+      serviceInvariantUUID: dc112d6e-7e73-4777-9c6f-1a7fb5fd1b6f
+      serviceUUID: 2eea06c6-e1d3-4c3a-b9c4-478c506eeedf
+#
+# OPTIONAL to specify the exact resource VF and/or VFC(s)
+#
+#  resources:
+#    - resourceInvariantUUID: 4b8d4018-068b-4c33-b9bb-d980798e52c2
+#      resourceUUID: d7d28881-b24d-4512-bfee-1e2eb335591f
+#      resourceVersion: '1.0'
+#      resourceName: 59a2ee3f-b580-45fe-b5a1
+#      resourceType: VF
+#    
+#  resources: 
+#    - resourceInvariantUUID: ee585c30-127b-492e-b2c1-871dc61d1dde
+#      resourceUUID: d816cb01-b5d0-4bbb-b614-f7c3e230ab19
+#      resourceVersion: '1.0'
+#      resourceName: 59a2ee3fB58045feB5a1.nodes.heat.vdns
+#      resourceType: VFC
+#    - resourceInvariantUUID: f7f1d745-cfb1-4aa9-83fc-31280d0ce513
+#      resourceUUID: 1821f13e-411f-4b29-87a5-ae935897b2e1
+#      resourceVersion: '1.0'
+#      resourceName: 59a2ee3fB58045feB5a1.nodes.heat.vlb
+#      resourceType: VFC
+  trigger_policy: unique-policy-id-1-scale-up
+  timeout: 1200
+
+policies:
+  - id: unique-policy-id-1-scale-up
+    name: Create a new VF Module
+    description:
+    actor: SO
+    recipe: VF Module Create
+    target:
+      type: VNF
+    payload:
+      requestParameters: '{"usePreload":true,"userParams":[]}'
+      configurationParameters: '[{"ip-addr":"$.vf-module-topology.vf-module-parameters.param[9]","oam-ip-addr":"$.vf-module-topology.vf-module-parameters.param[16]","enabled":"$.vf-module-topology.vf-module-parameters.param[23]"}]'
+    retry: 0
+    timeout: 1200
+    success: final_success
+    failure: final_failure
+    failure_timeout: final_failure_timeout
+    failure_retries: final_failure_retries
+    failure_exception: final_failure_exception
+    failure_guard: final_failure_guard
diff --git a/models-interactions/model-yaml/src/test/resources/v2.0.0/policy_ONAP_demo_vFirewall.yaml b/models-interactions/model-yaml/src/test/resources/v2.0.0/policy_ONAP_demo_vFirewall.yaml
new file mode 100644
index 0000000..caf3bab
--- /dev/null
+++ b/models-interactions/model-yaml/src/test/resources/v2.0.0/policy_ONAP_demo_vFirewall.yaml
@@ -0,0 +1,72 @@
+# Copyright 2018 AT&T Intellectual Property. All rights reserved
+# Modifications Copyright (C) 2019 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.
+controlLoop:
+  version: 2.0.0
+  controlLoopName: ControlLoop-vFirewall-d0a1dfc6-94f5-4fd4-a5b5-4630b438850a
+  services: 
+    - serviceInvariantUUID: 5cfe6f4a-41bc-4247-8674-ebd4b98e35cc
+      serviceUUID: 0f40bba5-986e-4b3c-803f-ddd1b7b25f24
+      serviceName: 57e66ea7-0ed6-45c7-970f
+#
+# OPTIONAL
+#
+# IF they want this CL restricted to a particular VFC(s)
+#
+#resources:
+#   -  resourceInvariantUUID: 06fe411e-d006-4ac3-8b0e-fb4f13cd78d3
+#      resourceUUID: 172ce7c5-c2e4-4f8d-b66c-edb49e8e548a
+#      resourceVersion: '1.0'
+#      resourceName: eace9331-04d4-43b4-96b8
+#      resourceType: VF
+   
+#  resources: 
+#    - resourceType: VFC
+#      resourceInvariantUUID: b19f6643-3db0-4d73-b280-94d6f21caa71
+#      resourceUUID: 6dca6eb9-330c-4090-a542-7aca5f446e21
+#      resourceVersion: '1.0'
+#      resourceName: Eace933104d443b496b8.nodes.heat.vsn
+#    - resourceName: vFW
+#      resourceType: VFC
+#      resourceInvariantUUID: 0129e34c-d9fa-442d-bb2c-f925d018000a
+#      resourceUUID: 7fa1f6c7-c6bd-4444-8db2-63334a5aed1b
+#      resourceVersion: '1.0'
+#      resourceName: Eace933104d443b496b8.nodes.heat.vfw
+#    - resourceType: VFC
+#      resourceInvariantUUID: 7654ae14-4e98-45bc-a8c0-2c43e1805bb4
+#      resourceUUID: 5267d6dd-f676-4f98-abec-6387ce6beaf2
+#      resourceVersion: '1.0'
+#      resourceName: Eace933104d443b496b8.nodes.heat.vpg
+  trigger_policy: unique-policy-id-1-modifyConfig
+  timeout: 1200
+
+policies:
+  - id: unique-policy-id-1-modifyConfig
+    name: Change the Load Balancer
+    description:
+    actor: APPC
+    recipe: ModifyConfig
+    target:
+      resourceID: Eace933104d443b496b8.nodes.heat.vpg
+    payload:
+      generic-vnf.vnf-id: {generic-vnf.vnf-id}
+      ref$: pgstreams.json
+    retry: 0
+    timeout: 300
+    success: final_success
+    failure: final_failure
+    failure_timeout: final_failure_timeout
+    failure_retries: final_failure_retries
+    failure_exception: final_failure_exception
+    failure_guard: final_failure_guard
diff --git a/models-interactions/model-yaml/src/test/resources/v2.0.0/policy_vService.yaml b/models-interactions/model-yaml/src/test/resources/v2.0.0/policy_vService.yaml
new file mode 100644
index 0000000..2344ab9
--- /dev/null
+++ b/models-interactions/model-yaml/src/test/resources/v2.0.0/policy_vService.yaml
@@ -0,0 +1,135 @@
+# Copyright 2018 AT&T Intellectual Property. All rights reserved
+# Modifications Copyright (C) 2019 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.
+controlLoop:
+  version: 2.0.0
+  controlLoopName: ControlLoop-GENERIC-64cdc9fa-6601-4989-9de7-8f47134aa043
+  #
+  # Example of how someone can fine-grain this
+  # policy for a specific service and/or resources
+  # contained within the service.
+  #
+  services:
+    - serviceName: vFooService
+ 
+  resources:
+    - resourceName: vVNF1
+      resourceType: VFC
+    - resourceName: vVNF2
+      resourceType: VFC
+    - resourceName: vVNF3
+      resourceType: VFC
+    - resourceName: vVNF4
+      resourceType: VFC
+ 
+  trigger_policy: unique-policy-id-1-restart
+  timeout: 1200
+  #
+  # Example of case where an abatement isn't possible
+  # from DCAE to Policy. So Policy should NOT expect
+  #
+  abatement: false
+ 
+policies:
+ 
+  - id: unique-policy-id-1-restart
+    name: Restart Policy
+    description:
+    actor: APPC
+    recipe: Restart
+    target:
+      type: VM
+    retry: 2
+    timeout: 300
+    success: unique-policy-id-1-healthdiagnostic
+    failure: unique-policy-id-2-rebuild
+    failure_timeout: unique-policy-id-2-rebuild
+    failure_retries: unique-policy-id-2-rebuild
+    failure_exception: final_failure_exception
+    failure_guard: unique-policy-id-2-rebuild
+   
+ 
+  - id: unique-policy-id-2-rebuild
+    name: Rebuild Policy
+    description:
+    actor: APPC
+    recipe: Rebuild
+    target:
+      type: VM
+    retry: 0
+    timeout: 600
+    success: unique-policy-id-2-healthdiagnostic
+    failure: unique-policy-id-3-migrate
+    failure_timeout: unique-policy-id-3-migrate
+    failure_retries: unique-policy-id-3-migrate
+    failure_exception: final_failure_exception
+    failure_guard: unique-policy-id-3-migrate
+ 
+  - id: unique-policy-id-3-migrate
+    name: Migrate Policy
+    description:
+    actor: APPC
+    recipe: Migrate
+    target:
+      type: VM
+    retry: 0
+    timeout: 600
+    success: final_success
+    failure: final_failure
+    failure_timeout: final_failure_timeout
+    failure_retries: final_failure_retries
+    failure_exception: final_failure_exception
+    failure_guard: final_failure_guard
+ 
+  - id: unique-policy-id-1-healthdiagnostic
+    name: Do A Health Diagnostic
+    description:
+    actor: APPC
+    recipe: health-diagnostic
+    # Example of a payload
+    payload:
+      health-diagnostic-code: HC01234
+      health-diagnostic-code-parameters: "{\"Junk\":\"--version\",\"Junk2\":\"--help\"}"
+    target:
+      type: VM
+    retry: 0
+    timeout: 600
+    success: final_success
+    failure: unique-policy-id-2-rebuild
+    failure_timeout: unique-policy-id-2-rebuild
+    failure_retries: unique-policy-id-2-rebuild
+    failure_exception: final_failure_exception
+    failure_guard: unique-policy-id-2-rebuild
+ 
+ 
+  - id: unique-policy-id-2-healthdiagnostic
+    name: Do Health Diagnostic
+    description:
+    actor: APPC
+    recipe: health-diagnostic
+    payload:
+      health-diagnostic-code: HC01234
+      health-diagnostic-code-parameters: "{\"Junk\":\"--version\",\"Junk2\":\"--help\"}"
+    target:
+      type: VM
+    retry: 0
+    timeout: 600
+    success: final_success
+    failure: final_failure
+    failure_timeout: final_failure_timeout
+    failure_retries: final_failure_retries
+    failure_exception: final_failure_exception
+    failure_guard: final_failure_guard
+    
+
diff --git a/models-interactions/pom.xml b/models-interactions/pom.xml
index cb1e27a..1a74df0 100644
--- a/models-interactions/pom.xml
+++ b/models-interactions/pom.xml
@@ -30,6 +30,7 @@
   <name>${project.artifactId}</name>
   <modules>
       <module>model-simulators</module>
+      <module>model-yaml</module>
       <module>model-impl</module>
       <module>model-actors</module>
   </modules>