Merge "Config Deploy"
diff --git a/adapters/mso-adapter-utils/src/main/java/org/onap/so/cloudify/beans/DeploymentInfoBuilder.java b/adapters/mso-adapter-utils/src/main/java/org/onap/so/cloudify/beans/DeploymentInfoBuilder.java
index 2e12869..3b945ae 100644
--- a/adapters/mso-adapter-utils/src/main/java/org/onap/so/cloudify/beans/DeploymentInfoBuilder.java
+++ b/adapters/mso-adapter-utils/src/main/java/org/onap/so/cloudify/beans/DeploymentInfoBuilder.java
@@ -44,7 +44,9 @@
     }
 
     public DeploymentInfoBuilder withDeploymentOutputs(Map<String, Object> deploymentOutputs) {
-        this.deploymentOutputs = deploymentOutputs;
+        if (deploymentOutputs != null) {
+            this.deploymentOutputs = deploymentOutputs;
+        }
         return this;
     }
 
diff --git a/adapters/mso-adapter-utils/src/main/java/org/onap/so/cloudify/utils/MsoCloudifyUtils.java b/adapters/mso-adapter-utils/src/main/java/org/onap/so/cloudify/utils/MsoCloudifyUtils.java
index 50bcb8e..6b16194 100644
--- a/adapters/mso-adapter-utils/src/main/java/org/onap/so/cloudify/utils/MsoCloudifyUtils.java
+++ b/adapters/mso-adapter-utils/src/main/java/org/onap/so/cloudify/utils/MsoCloudifyUtils.java
@@ -104,7 +104,6 @@
 @Component
 public class MsoCloudifyUtils extends MsoCommonUtils implements VduPlugin{
 
-    private static final String CLOUDIFY_ERROR = "CloudifyError";
     private static final String CLOUDIFY = "Cloudify";
     private static final String CREATE_DEPLOYMENT = "CreateDeployment";
     private static final String DELETE_DEPLOYMENT = "DeleteDeployment";
@@ -258,11 +257,10 @@
         	if (installWorkflow.getStatus().equals(TERMINATED)) {
 	        	//  Success!
 	        	//  Create and return a DeploymentInfo structure.  Include the Runtime outputs
-                DeploymentOutputs outputs = getDeploymentOutputs (cloudify, deploymentId);
 				return new DeploymentInfoBuilder()
 					.withId(deployment.getId())
 					.withDeploymentInputs(deployment.getInputs())
-					.withDeploymentOutputs(outputs.getOutputs())
+					.withDeploymentOutputs(getDeploymentOutputs(cloudify, deploymentId).get())
 					.fromExecution(installWorkflow)
 					.build();
 	        }
@@ -352,16 +350,21 @@
      * Get the runtime Outputs of a deployment.
      * Return the Map of tag/value outputs.
      */
-    private DeploymentOutputs getDeploymentOutputs (Cloudify cloudify, String deploymentId)
+    private Optional<Map<String, Object>> getDeploymentOutputs (Cloudify cloudify, String deploymentId)
         throws MsoException
     {
     	// Build and send the Cloudify request
-		DeploymentOutputs deploymentOutputs = null;
+		DeploymentOutputs deploymentOutputs;
     	try {
     		GetDeploymentOutputs queryDeploymentOutputs = cloudify.deployments().outputsById(deploymentId);
           logger.debug(queryDeploymentOutputs.toString());
 
     		deploymentOutputs = executeAndRecordCloudifyRequest(queryDeploymentOutputs);
+			if (deploymentOutputs != null) {
+				return Optional.ofNullable(deploymentOutputs.getOutputs());
+			} else {
+				return Optional.empty();
+			}
     	}
     	catch (CloudifyConnectException ce) {
     		// Couldn't connect to Cloudify
@@ -372,7 +375,7 @@
     	catch (CloudifyResponseException re) {
             if (re.getStatus () == 404) {
             	// No Outputs
-            	return null;
+            	return Optional.empty();
             }
             throw new MsoCloudifyException (re.getStatus(), re.getMessage(), re.getLocalizedMessage(), re);
     	}
@@ -380,8 +383,6 @@
     		// Catch-all
     		throw new MsoAdapterException (e.getMessage(), e);
     	}
-
-    	return deploymentOutputs;
     }
 
     /*
@@ -545,7 +546,7 @@
 		}
 		catch (Exception e) {
 			// Catch-all.  Log the message and throw the original exception
-        logger.debug("Cancel workflow {} failed for deployment : {} {}", workflowId, deploymentId, e);
+        logger.debug("Cancel workflow {} failed for deployment {} :", workflowId, deploymentId, e);
         MsoCloudifyException exception = new MsoCloudifyException (-1, "", "", savedException);
 			exception.setPendingWorkflow(true);
 			throw exception;
@@ -579,16 +580,11 @@
 
     	// Build and send the Cloudify request
 		Deployment deployment = new Deployment();
-		DeploymentOutputs outputs = null;
     	try {
     		GetDeployment queryDeployment = cloudify.deployments().byId(deploymentId);
           logger.debug(queryDeployment.toString());
-
-//    		deployment = queryDeployment.execute();
     		deployment = executeAndRecordCloudifyRequest(queryDeployment);
 
-            outputs = getDeploymentOutputs (cloudify, deploymentId);
-
     		//  Next look for the latest execution
     		ListExecutions listExecutions = cloudify.executions().listFiltered ("deployment_id=" + deploymentId, "-created_at");
     		Executions executions = listExecutions.execute();
@@ -604,7 +600,7 @@
 				return new DeploymentInfoBuilder()
 					.withId(deployment.getId())
 					.withDeploymentInputs(deployment.getInputs())
-					.withDeploymentOutputs(outputs.getOutputs())
+					.withDeploymentOutputs(getDeploymentOutputs(cloudify, deploymentId).get())
 					.fromExecution(executions.getItems().get(0))
 					.build();
     		}
@@ -623,7 +619,7 @@
 					return new DeploymentInfoBuilder()
 						.withId(deployment.getId())
 						.withDeploymentInputs(deployment.getInputs())
-						.withDeploymentOutputs(outputs.getOutputs())
+						.withDeploymentOutputs(getDeploymentOutputs(cloudify, deploymentId).get())
 						.build();
             	} else {
             		// Deployment not found.  Default status of a DeploymentInfo object is NOTFOUND
@@ -670,12 +666,11 @@
         logger.debug ("Ready to Uninstall/Delete Deployment ({})", deploymentId);
 
         // Query first to save the trouble if deployment not found
-    	Deployment deployment = null;
-    	try {
+		try {
     		GetDeployment queryDeploymentRequest = cloudify.deployments().byId(deploymentId);
           logger.debug(queryDeploymentRequest.toString());
 
-    		deployment = executeAndRecordCloudifyRequest (queryDeploymentRequest);
+    	//	deployment = executeAndRecordCloudifyRequest (queryDeploymentRequest);
     	}
     	catch (CloudifyResponseException e) {
             // Since this came on the 'Create Deployment' command, nothing was changed
@@ -707,7 +702,7 @@
     	/*
     	 *  Query the outputs before deleting so they can be returned as well
     	 */
-    	DeploymentOutputs outputs = getDeploymentOutputs (cloudify, deploymentId);
+    	//DeploymentOutputs outputs = getDeploymentOutputs (cloudify, deploymentId);
     	
     	/*
     	 * Next execute the "uninstall" workflow.
@@ -745,6 +740,7 @@
         
         // At this point, the deployment has been successfully uninstalled.
         // Next step is to delete the deployment itself
+		Deployment deployment;
         try {
         	DeleteDeployment deleteRequest = cloudify.deployments().deleteByName(deploymentId);
             logger.debug(deleteRequest.toString());
@@ -781,7 +777,7 @@
 		return new DeploymentInfoBuilder()
 			.withId(deployment.getId())
 			.withDeploymentInputs(deployment.getInputs())
-			.withDeploymentOutputs(outputs.getOutputs())
+			.withDeploymentOutputs(getDeploymentOutputs(cloudify, deploymentId).get())
 			.fromExecution(uninstallWorkflow)
 			.build();
     }
diff --git a/adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/utils/MsoHeatUtils.java b/adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/utils/MsoHeatUtils.java
index e8ef86a..0542340 100644
--- a/adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/utils/MsoHeatUtils.java
+++ b/adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/utils/MsoHeatUtils.java
@@ -1295,7 +1295,7 @@
           Set<HeatTemplateParam> paramSet = template.getParameters();
           logger.debug("paramSet has {} entries", paramSet.size());
       } catch (Exception e) {
-          logger.debug("Exception occurred in convertInputMap:" + e.getMessage(), e);
+          logger.debug("Exception occurred in convertInputMap {} :", e.getMessage(), e);
       }
 
 		for (HeatTemplateParam htp : template.getParameters()) {
diff --git a/adapters/mso-adapter-utils/src/test/java/org/onap/so/cloudify/beans/DeploymentInfoBuilderTest.java b/adapters/mso-adapter-utils/src/test/java/org/onap/so/cloudify/beans/DeploymentInfoBuilderTest.java
index 8f172b7..ce13d98 100644
--- a/adapters/mso-adapter-utils/src/test/java/org/onap/so/cloudify/beans/DeploymentInfoBuilderTest.java
+++ b/adapters/mso-adapter-utils/src/test/java/org/onap/so/cloudify/beans/DeploymentInfoBuilderTest.java
@@ -149,6 +149,12 @@
         verifyDeploymentInfoConstruction(workflowIdLastAction, status, expectedDeploymentStatus);
     }
 
+    @Test
+    public void shouldSetEmptyOutputsMapWhenInputIsNull() {
+        DeploymentInfo deploymentInfo = new DeploymentInfoBuilder().withDeploymentOutputs(null).build();
+        assertThat(deploymentInfo.getOutputs()).isEmpty();
+    }
+
     private void verifyDeploymentInfoConstruction(String workflowIdLastAction, String actionStatus,
         DeploymentStatus expectedDeploymentStatus) {
 
diff --git a/adapters/mso-catalog-db-adapter/src/test/java/org/onap/so/db/catalog/client/CatalogDbClientTest.java b/adapters/mso-catalog-db-adapter/src/test/java/org/onap/so/db/catalog/client/CatalogDbClientTest.java
index d28784b..ea8cb5d 100644
--- a/adapters/mso-catalog-db-adapter/src/test/java/org/onap/so/db/catalog/client/CatalogDbClientTest.java
+++ b/adapters/mso-catalog-db-adapter/src/test/java/org/onap/so/db/catalog/client/CatalogDbClientTest.java
@@ -23,13 +23,9 @@
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
-import static org.mockito.Mockito.when;
 
 import java.util.List;
 import java.util.UUID;
-
-import javax.ws.rs.core.UriBuilder;
-
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
@@ -54,20 +50,15 @@
 import org.onap.so.db.catalog.beans.VnfRecipe;
 import org.onap.so.db.catalog.beans.VnfResource;
 import org.onap.so.db.catalog.beans.VnfResourceCustomization;
-import org.onap.so.db.catalog.beans.ExternalServiceToInternalService;
 import org.onap.so.db.catalog.beans.macro.NorthBoundRequest;
 import org.onap.so.db.catalog.beans.macro.RainyDayHandlerStatus;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
-import org.springframework.boot.web.server.LocalServerPort;
 import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.test.mock.mockito.MockBean;
-import org.springframework.security.core.parameters.P;
+import org.springframework.boot.web.server.LocalServerPort;
 import org.springframework.test.context.ActiveProfiles;
 import org.springframework.test.context.junit4.SpringRunner;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
-
 @RunWith(SpringRunner.class)
 @SpringBootTest(classes = CatalogDBApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
 @ActiveProfiles("test")
@@ -201,7 +192,6 @@
         Assert.assertNotNull(vnfResourceCustomization.getVnfResources());
         Assert.assertNotNull(vnfResourceCustomization.getVfModuleCustomizations());
         Assert.assertEquals("vSAMP10a", vnfResourceCustomization.getVnfResources().getModelName());
-
     }
 
     @Test
@@ -659,7 +649,6 @@
             pnfResource.getModelInvariantUUID());
         assertEquals("PNFResource modelVersion", "1.0", pnfResource.getModelVersion());
         assertEquals("PNFResource orchestration mode", "", pnfResource.getOrchestrationMode());
-
     }
 
     @Test
diff --git a/adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/vnf/MsoVnfAdapterImpl.java b/adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/vnf/MsoVnfAdapterImpl.java
index 949027f..b99e34e 100644
--- a/adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/vnf/MsoVnfAdapterImpl.java
+++ b/adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/vnf/MsoVnfAdapterImpl.java
@@ -221,7 +221,7 @@
 				}
 			} catch (Exception e) {
 				// might be ok - both are just blank
-				logger.debug("ERROR trying to parse the volumeGroupHeatStackId " + volumeGroupHeatStackId,e);
+				logger.debug("ERROR trying to parse the volumeGroupHeatStackId {}", volumeGroupHeatStackId,e);
 			}
 			this.createVfModule(cloudSiteId,
 			        cloudOwner,
@@ -520,7 +520,7 @@
     	}
     }
 
-    private void heatbridge(StackInfo heatStack, String cloudSiteId, String tenantId, String genericVnfName,
+    private void heatbridge(StackInfo heatStack, String cloudOwner, String cloudSiteId, String tenantId, String genericVnfName,
         String vfModuleId) {
         try {
             CloudSite cloudSite = cloudConfig.getCloudSite(cloudSiteId).orElseThrow(
@@ -528,7 +528,6 @@
             CloudIdentity cloudIdentity = cloudSite.getIdentityService();
             String heatStackId = heatStack.getCanonicalName().split("/")[1];
 
-            String cloudOwner = "CloudOwner";//cloud owner needs to come from bpmn-adapter
             List<String> oobMgtNetNames = new ArrayList<>();
 
             HeatBridgeApi heatBridgeClient = new HeatBridgeImpl(new AAIResourcesClient(), cloudIdentity,
@@ -586,9 +585,9 @@
             final Object obj = JSON_MAPPER.treeToValue(node, Object.class);
             return JSON_MAPPER.writeValueAsString(obj);
         } catch (JsonParseException jpe) {
-            logger.debug("Error converting json to string " + jpe.getMessage(),jpe);
+            logger.debug("Error converting json to string: {}", jpe.getMessage(),jpe);
         } catch (Exception e) {
-            logger.debug("Error converting json to string " + e.getMessage(),e);
+            logger.debug("Error converting json to string: {}", e.getMessage(),e);
         }
         return "[Error converting json to string]";
     }
@@ -1345,7 +1344,7 @@
             }
             logger.debug ("VF Module {} successfully created", vfModuleName);
             //call heatbridge
-            heatbridge(heatStack, cloudSiteId, tenantId, genericVnfName, vfModuleId);
+            heatbridge(heatStack, cloudOwner, cloudSiteId, tenantId, genericVnfName, vfModuleId);
             return;
         } catch (Exception e) {
         	logger.debug("unhandled exception in create VF",e);
@@ -1904,14 +1903,13 @@
                 			jsonNode = JSON_MAPPER.readTree(jsonString);
                 		} catch (JsonParseException jpe) {
                 			//TODO - what to do here?
-                			//for now - send the error to debug, but just leave it as a String
-                			String errorMessage = jpe.getMessage();
-                			logger.debug("Json Error Converting " + parm.getParamName() + " - " + errorMessage,jpe);
+                			//for now - send the error to debug
+                			logger.debug("Json Error Converting {} - {}", parm.getParamName(), jpe.getMessage(), jpe);
                 			hasJson = false;
                 			jsonNode = null;
                 		} catch (Exception e) {
                         // or here?
-                        logger.debug("Json Error Converting " + parm.getParamName() + " " + e.getMessage(), e);
+                        logger.debug("Json Error Converting {} {}", parm.getParamName(), e.getMessage(), e);
                         hasJson = false;
                         jsonNode = null;
                     }
diff --git a/adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/vnf/MsoVnfPluginAdapterImpl.java b/adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/vnf/MsoVnfPluginAdapterImpl.java
index 2b49290..62c373b 100644
--- a/adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/vnf/MsoVnfPluginAdapterImpl.java
+++ b/adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/vnf/MsoVnfPluginAdapterImpl.java
@@ -415,21 +415,21 @@
             		String str = "" + stackOutputs.get(key);
             		stringOutputs.put(key, str);
             	} catch (Exception e) {
-            		logger.debug("Unable to add " + key + " to outputs", e);
+            		logger.debug("Unable to add {} to outputs", key, e);
             	}
             } else if (stackOutputs.get(key) instanceof JsonNode) {
             	try {
             		String str = this.convertNode((JsonNode) stackOutputs.get(key));
             		stringOutputs.put(key, str);
             	} catch (Exception e) {
-            		logger.debug("Unable to add " + key + " to outputs - exception converting JsonNode", e);
+            		logger.debug("Unable to add {} to outputs - exception converting JsonNode", key, e);
             	}
             } else if (stackOutputs.get(key) instanceof java.util.LinkedHashMap) {
             	try {
 					String str = JSON_MAPPER.writeValueAsString(stackOutputs.get(key));
             		stringOutputs.put(key, str);
             	} catch (Exception e) {
-                  logger.debug("Unable to add " + key + " to outputs - exception converting LinkedHashMap", e);
+                  logger.debug("Unable to add {} to outputs - exception converting LinkedHashMap", key, e);
               }
             } else {
             	try {
diff --git a/adapters/mso-sdnc-adapter/src/main/java/org/onap/so/adapters/sdnc/impl/SDNCRestClient.java b/adapters/mso-sdnc-adapter/src/main/java/org/onap/so/adapters/sdnc/impl/SDNCRestClient.java
index bea4c1b..80f111b 100644
--- a/adapters/mso-sdnc-adapter/src/main/java/org/onap/so/adapters/sdnc/impl/SDNCRestClient.java
+++ b/adapters/mso-sdnc-adapter/src/main/java/org/onap/so/adapters/sdnc/impl/SDNCRestClient.java
@@ -85,7 +85,7 @@
 	@Async
 	public void executeRequest(SDNCAdapterRequest bpelRequest)
 	{
-		
+
 		logger.debug("BPEL Request:" + bpelRequest.toString());
 
 		// Added delay to allow completion of create request to SDNC
@@ -93,7 +93,9 @@
 		try {
 			Thread.sleep(5000);
 		} catch (InterruptedException e) {
-			e.printStackTrace();
+			logger.error("{} {} {} {}", MessageEnum.BPMN_GENERAL_EXCEPTION.toString(), "SDNC",
+				ErrorCode.UnknownError.getValue(), "Exception processing request to SDNC", e);
+
 			Thread.currentThread().interrupt();
 		}
 
@@ -104,12 +106,10 @@
 
 		String sdncReqBody = null;
 
-	
-
 		RequestTunables rt = new RequestTunables(bpelReqId,
 				bpelRequest.getRequestHeader().getMsoAction(),
 				bpelRequest.getRequestHeader().getSvcOperation(),
-				bpelRequest.getRequestHeader().getSvcAction());		
+				bpelRequest.getRequestHeader().getSvcAction());
 		rt = tunablesMapper.setTunables(rt);
 		rt.setSdncaNotificationUrl(env.getProperty(Constants.MY_URL_PROP));
 
@@ -176,8 +176,8 @@
 			sdncResp.setRespCode(con.getResponseCode());
 			sdncResp.setRespMsg(con.getResponseMessage());
 
-			if (con.getResponseCode()>= 200 && con.getResponseCode()<=299) { 
-				in = new BufferedReader(new InputStreamReader(con.getInputStream()));	
+			if (con.getResponseCode()>= 200 && con.getResponseCode()<=299) {
+				in = new BufferedReader(new InputStreamReader(con.getInputStream()));
 				String inputLine;
 				//Not parsing the response -it contains a responseHdr section and data section
 				while ((inputLine = in.readLine()) != null) {
@@ -185,7 +185,7 @@
 				}
 				in.close();
 			}
-			
+
 			sdncResp.setSdncRespXml(response.toString());
 			logger.info("{} :\n {} {}", MessageEnum.RA_RESPONSE_FROM_SDNC.name(), sdncResp.toString(), "SDNC");
 			return(sdncResp);
@@ -314,7 +314,7 @@
 			SDNCCallbackAdapterPortType cbPort = cbSvc.getSDNCCallbackAdapterSoapHttpPort();
 
 			BindingProvider bp = (BindingProvider)cbPort;
-			
+
 			if(null != wsdlUrl) {
 			bp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, wsdlUrl.toExternalForm());
 			}
diff --git a/asdc-controller/pom.xml b/asdc-controller/pom.xml
index 50fbdd4..7b774a2 100644
--- a/asdc-controller/pom.xml
+++ b/asdc-controller/pom.xml
@@ -1,265 +1,270 @@
-<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.so</groupId>
-		<artifactId>so</artifactId>
-		<version>1.4.0-SNAPSHOT</version>
-	</parent>                  
+<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.so</groupId>
+    <artifactId>so</artifactId>
+    <version>1.4.0-SNAPSHOT</version>
+  </parent>
 
-	<groupId>org.onap.so</groupId>
-	<artifactId>asdc-controller</artifactId>
-	<name>asdc-controller</name>
-	<description>ASDC CLient and Controller</description>
-	<properties>
-		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-		<antlr.version>4.7.1</antlr.version>
-		<java.version>1.8</java.version>
-	</properties>
+  <groupId>org.onap.so</groupId>
+  <artifactId>asdc-controller</artifactId>
+  <name>asdc-controller</name>
+  <description>ASDC CLient and Controller</description>
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+    <antlr.version>4.7.1</antlr.version>
+    <java.version>1.8</java.version>
+    <sdc.tosca.version>1.5.0</sdc.tosca.version>
+    <jtosca.version>1.5.0</jtosca.version>
+  </properties>
 
-	<build>
-		<finalName>${project.artifactId}-${project.version}</finalName>
-		<plugins>
-			<plugin>
-				<groupId>org.jacoco</groupId>
-				<artifactId>jacoco-maven-plugin</artifactId>
-				<version>0.7.7.201606060606</version>
-				 <configuration>
-                     <excludes>                        
-+                        <exclude>**/resource-examples/**</exclude>
-                     </excludes>
-                 </configuration>
-				<executions>
-					<execution>
-						<id>default-prepare-agent</id>
-						<goals>
-							<goal>prepare-agent</goal>
-						</goals>
-					</execution>
-					<execution>
-						<id>default-report</id>
-						<goals>
-							<goal>report</goal>
-						</goals>
-					</execution>
-					<execution>
-						<id>default-check</id>
-						<goals>
-							<goal>check</goal>
-						</goals>
-						<configuration>
-							<rules>
-								<rule implementation="org.jacoco.maven.RuleConfiguration">
-									<element>BUNDLE</element>
-									<limits>
-										<limit implementation="org.jacoco.report.check.Limit">
-											<counter>INSTRUCTION</counter>
-											<value>COVEREDRATIO</value>											
-										</limit>
-									</limits>
-								</rule>
-							</rules>
-						</configuration>
-					</execution>
-				</executions>
-			</plugin>
-			<plugin>
-				<groupId>org.antlr</groupId>
-				<artifactId>antlr4-maven-plugin</artifactId>
-				<version>${antlr.version}</version>
-				<executions>
-					<execution>
-						<id>antlr</id>
-						<phase>generate-test-resources</phase>
-						<goals>
-							<goal>antlr4</goal>
-						</goals>
-						<configuration>
-							<visitor>true</visitor>
-							<outputDirectory>${project.build.directory}/generated-sources</outputDirectory>
-						</configuration>
-					</execution>
-				</executions>
-			</plugin>
-			<plugin>
-				<artifactId>maven-compiler-plugin</artifactId>
-				<executions>
-					<execution>
-						<id>default-testCompile</id>
-						<phase>test-compile</phase>
-						<goals>
-							<goal>testCompile</goal>
-						</goals>
-						<configuration>
-							<generatedTestSourcesDirectory>${project.build.directory}/generated-sources</generatedTestSourcesDirectory>
-						</configuration>
-					</execution>
-				</executions>
-			</plugin>
-			<plugin>
-				<groupId>org.springframework.boot</groupId>
-				<artifactId>spring-boot-maven-plugin</artifactId>
-				<configuration>
-                    <mainClass>org.onap.so.asdc.Application</mainClass>
-                </configuration>
-				<executions>
-					<execution>
-						<goals>
-							<goal>repackage</goal>
-						</goals>
-					</execution>
-				</executions>
-			</plugin>
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-dependency-plugin</artifactId>
-				<executions>
-					<execution>
-						<id>extract-docker-file</id>
-					</execution>
-				</executions>
-			</plugin>
-			<plugin>
-				<groupId>io.fabric8</groupId>
-				<artifactId>fabric8-maven-plugin</artifactId>
-				<executions>
-					<execution>
-						<id>start</id>
-					</execution>
-				</executions>
-			</plugin>
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-jar-plugin</artifactId>
-				<executions>					
-					<execution>
-						<id>original</id>
-					</execution>
-				</executions>
-			</plugin>
-		</plugins>
-	</build>
-	<dependencies>
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-web</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>io.swagger</groupId>
-			<artifactId>swagger-jersey2-jaxrs</artifactId>
-			<version>1.5.16</version>
-		</dependency>
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-actuator</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-jersey</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-data-jpa</artifactId>
-			<exclusions>
-				<exclusion>
-					<groupId>org.apache.tomcat</groupId>
-					<artifactId>tomcat-jdbc</artifactId>
-				</exclusion>
-			</exclusions>
-		</dependency>
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-test</artifactId>
-			<scope>test</scope>
-		</dependency>	
-		<dependency>
-			<groupId>org.onap.so</groupId>
-			<artifactId>mso-catalog-db</artifactId>
-			<version>${project.version}</version>
-		</dependency>
-	 	<dependency>
-  			<groupId>org.onap.sdc.sdc-distribution-client</groupId>
-  			<artifactId>sdc-distribution-client</artifactId>
- 			 <version>1.3.0</version>
- 			<exclusions>
-       		 	<exclusion>  
-	         	 	<groupId>org.slf4j</groupId>
-	         	 	<artifactId>slf4j-log4j12</artifactId>
-       		 	</exclusion>
-    	  </exclusions>
-		</dependency>
-		<dependency>
-  			<groupId>org.onap.sdc.sdc-tosca</groupId>
-			<artifactId>sdc-tosca</artifactId>
-			<version>1.4.8</version>
-		</dependency> 
-		<dependency>
-  			<groupId>org.onap.sdc.jtosca</groupId>
-  			<artifactId>jtosca</artifactId>
-  			<version>1.4.8</version>
-		</dependency> 
-		<dependency>
-			<groupId>org.onap.so</groupId>
-			<artifactId>common</artifactId>
-			<version>${project.version}</version>
-		</dependency>
-		<dependency>
-			<groupId>org.onap.so</groupId>
-			<artifactId>mso-api-handler-common</artifactId>
-			<version>${project.version}</version>
-		</dependency>
-		<dependency>
-			<groupId>commons-io</groupId>
-			<artifactId>commons-io</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.onap.so</groupId>
-			<artifactId>mso-requests-db</artifactId>
-			<version>${project.version}</version>
-		</dependency>		
-		<dependency>
-			<groupId>org.onap.so</groupId>
-			<artifactId>mso-requests-db-repositories</artifactId>
-			<version>${project.version}</version>
-		</dependency>
-		<dependency>
-			<groupId>org.antlr</groupId>
-			<artifactId>antlr4</artifactId>
-			<version>${antlr.version}</version>
-			<scope>test</scope>
-			</dependency>
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-configuration-processor</artifactId>
-			<optional>true</optional>
-		</dependency>
-		<dependency>
-			<groupId>org.mariadb.jdbc</groupId>
-			<artifactId>mariadb-java-client</artifactId>
-		</dependency>		
-		<dependency>
-            <groupId>ch.vorburger.mariaDB4j</groupId>
-            <artifactId>mariaDB4j</artifactId>
-            <version>2.2.3</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-			<groupId>org.springframework.cloud</groupId>
-			<artifactId>spring-cloud-contract-wiremock</artifactId>
-			<version>1.2.4.RELEASE</version>
-		</dependency>
-		<dependency>
-			<groupId>io.micrometer</groupId>
-			<artifactId>micrometer-core</artifactId>		
-		</dependency>
-		<dependency>
-			<groupId>io.micrometer</groupId>
-			<artifactId>micrometer-registry-prometheus</artifactId>			
-		</dependency>
-		<dependency>
-			<groupId>javax.interceptor</groupId>
-			<artifactId>javax.interceptor-api</artifactId>
-		</dependency>
-	</dependencies>
+  <build>
+    <finalName>${project.artifactId}-${project.version}</finalName>
+    <plugins>
+      <plugin>
+        <groupId>org.jacoco</groupId>
+        <artifactId>jacoco-maven-plugin</artifactId>
+        <version>0.7.7.201606060606</version>
+        <configuration>
+          <excludes>
+            +
+            <exclude>**/resource-examples/**</exclude>
+          </excludes>
+        </configuration>
+        <executions>
+          <execution>
+            <id>default-prepare-agent</id>
+            <goals>
+              <goal>prepare-agent</goal>
+            </goals>
+          </execution>
+          <execution>
+            <id>default-report</id>
+            <goals>
+              <goal>report</goal>
+            </goals>
+          </execution>
+          <execution>
+            <id>default-check</id>
+            <goals>
+              <goal>check</goal>
+            </goals>
+            <configuration>
+              <rules>
+                <rule implementation="org.jacoco.maven.RuleConfiguration">
+                  <element>BUNDLE</element>
+                  <limits>
+                    <limit implementation="org.jacoco.report.check.Limit">
+                      <counter>INSTRUCTION</counter>
+                      <value>COVEREDRATIO</value>
+                    </limit>
+                  </limits>
+                </rule>
+              </rules>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.antlr</groupId>
+        <artifactId>antlr4-maven-plugin</artifactId>
+        <version>${antlr.version}</version>
+        <executions>
+          <execution>
+            <id>antlr</id>
+            <phase>generate-test-resources</phase>
+            <goals>
+              <goal>antlr4</goal>
+            </goals>
+            <configuration>
+              <visitor>true</visitor>
+              <outputDirectory>${project.build.directory}/generated-sources</outputDirectory>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>default-testCompile</id>
+            <phase>test-compile</phase>
+            <goals>
+              <goal>testCompile</goal>
+            </goals>
+            <configuration>
+              <generatedTestSourcesDirectory>${project.build.directory}/generated-sources
+              </generatedTestSourcesDirectory>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-maven-plugin</artifactId>
+        <configuration>
+          <mainClass>org.onap.so.asdc.Application</mainClass>
+        </configuration>
+        <executions>
+          <execution>
+            <goals>
+              <goal>repackage</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>extract-docker-file</id>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>io.fabric8</groupId>
+        <artifactId>fabric8-maven-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>start</id>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-jar-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>original</id>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+  <dependencies>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-web</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>io.swagger</groupId>
+      <artifactId>swagger-jersey2-jaxrs</artifactId>
+      <version>1.5.16</version>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-actuator</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-jersey</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-data-jpa</artifactId>
+      <exclusions>
+        <exclusion>
+          <groupId>org.apache.tomcat</groupId>
+          <artifactId>tomcat-jdbc</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-test</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.onap.so</groupId>
+      <artifactId>mso-catalog-db</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.onap.sdc.sdc-distribution-client</groupId>
+      <artifactId>sdc-distribution-client</artifactId>
+      <version>1.3.0</version>
+      <exclusions>
+        <exclusion>
+          <groupId>org.slf4j</groupId>
+          <artifactId>slf4j-log4j12</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>org.onap.sdc.sdc-tosca</groupId>
+      <artifactId>sdc-tosca</artifactId>
+      <version>${sdc.tosca.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.onap.sdc.jtosca</groupId>
+      <artifactId>jtosca</artifactId>
+      <version>${jtosca.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.onap.so</groupId>
+      <artifactId>common</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.onap.so</groupId>
+      <artifactId>mso-api-handler-common</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>commons-io</groupId>
+      <artifactId>commons-io</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.onap.so</groupId>
+      <artifactId>mso-requests-db</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.onap.so</groupId>
+      <artifactId>mso-requests-db-repositories</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.antlr</groupId>
+      <artifactId>antlr4</artifactId>
+      <version>${antlr.version}</version>
+
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-configuration-processor</artifactId>
+      <optional>true</optional>
+    </dependency>
+    <dependency>
+      <groupId>org.mariadb.jdbc</groupId>
+      <artifactId>mariadb-java-client</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>ch.vorburger.mariaDB4j</groupId>
+      <artifactId>mariaDB4j</artifactId>
+      <version>2.2.3</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.cloud</groupId>
+      <artifactId>spring-cloud-contract-wiremock</artifactId>
+      <version>1.2.4.RELEASE</version>
+    </dependency>
+    <dependency>
+      <groupId>io.micrometer</groupId>
+      <artifactId>micrometer-core</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>io.micrometer</groupId>
+      <artifactId>micrometer-registry-prometheus</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>javax.interceptor</groupId>
+      <artifactId>javax.interceptor-api</artifactId>
+    </dependency>
+  </dependencies>
 </project>
diff --git a/asdc-controller/src/main/java/org/onap/so/asdc/client/ASDCController.java b/asdc-controller/src/main/java/org/onap/so/asdc/client/ASDCController.java
index fd810e1..c9332e8 100644
--- a/asdc-controller/src/main/java/org/onap/so/asdc/client/ASDCController.java
+++ b/asdc-controller/src/main/java/org/onap/so/asdc/client/ASDCController.java
@@ -24,6 +24,11 @@
 package org.onap.so.asdc.client;
 
 
+import com.fasterxml.jackson.annotation.JsonInclude.Include;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.MapperFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
@@ -31,7 +36,6 @@
 import java.nio.file.Paths;
 import java.util.List;
 import java.util.Optional;
-
 import org.onap.sdc.api.IDistributionClient;
 import org.onap.sdc.api.consumer.IDistributionStatusMessage;
 import org.onap.sdc.api.consumer.IFinalDistrStatusMessage;
@@ -48,6 +52,9 @@
 import org.onap.so.asdc.client.exceptions.ASDCParametersException;
 import org.onap.so.asdc.client.exceptions.ArtifactInstallerException;
 import org.onap.so.asdc.installer.IVfResourceInstaller;
+import org.onap.so.asdc.installer.PnfResourceStructure;
+import org.onap.so.asdc.installer.ResourceStructure;
+import org.onap.so.asdc.installer.ResourceType;
 import org.onap.so.asdc.installer.ToscaResourceStructure;
 import org.onap.so.asdc.installer.VfResourceStructure;
 import org.onap.so.asdc.installer.bpmn.BpmnInstaller;
@@ -65,12 +72,6 @@
 import org.springframework.orm.ObjectOptimisticLockingFailureException;
 import org.springframework.stereotype.Component;
 
-import com.fasterxml.jackson.annotation.JsonInclude.Include;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.DeserializationFeature;
-import com.fasterxml.jackson.databind.MapperFeature;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
 @Component
 public class ASDCController {
 
@@ -79,54 +80,49 @@
     protected boolean isAsdcClientAutoManaged = false;
 
     protected String controllerName;
-    
+
     private ASDCControllerStatus controllerStatus = ASDCControllerStatus.STOPPED;
-    
+
     protected int nbOfNotificationsOngoing = 0;
 
     @Autowired
     private ToscaResourceInstaller toscaInstaller;
-    
+
     @Autowired
     private BpmnInstaller bpmnInstaller;
-    
+
     @Autowired
     private WatchdogDistributionStatusRepository wdsRepo;
-    
+
     @Autowired
     private ASDCConfiguration asdcConfig;
-    
+
     @Autowired
     private ASDCStatusCallBack asdcStatusCallBack;
-    
+
     @Autowired
     private ASDCNotificationCallBack asdcNotificationCallBack;
-    
+
     private IDistributionClient distributionClient;
-    
+
     private static final String UUID_PARAM = "(UUID:";
-    
+
     @Autowired
     private WatchdogDistribution wd;
-   
 
-    public int getNbOfNotificationsOngoing () {
+    public int getNbOfNotificationsOngoing() {
         return nbOfNotificationsOngoing;
-    }    
+    }
 
     public IDistributionClient getDistributionClient() {
-		return distributionClient;
-	}
+        return distributionClient;
+    }
 
+    public void setDistributionClient(IDistributionClient distributionClient) {
+        this.distributionClient = distributionClient;
+    }
 
-
-	public void setDistributionClient(IDistributionClient distributionClient) {
-		this.distributionClient = distributionClient;
-	}
-
-
-
-	protected void changeControllerStatus (ASDCControllerStatus newControllerStatus) {
+    protected void changeControllerStatus(ASDCControllerStatus newControllerStatus) {
         switch (newControllerStatus) {
 
             case BUSY:
@@ -150,97 +146,99 @@
         }
     }
 
-    public ASDCControllerStatus getControllerStatus () {
+    public ASDCControllerStatus getControllerStatus() {
         return this.controllerStatus;
     }
-    
-    public ASDCController () {
-        isAsdcClientAutoManaged = true;        
+
+    public ASDCController() {
+        this("");
     }
 
-    public ASDCController (String controllerConfigName) {
+    public ASDCController(String controllerConfigName) {
         isAsdcClientAutoManaged = true;
         this.controllerName = controllerConfigName;
     }
 
-    public ASDCController (String controllerConfigName, IDistributionClient asdcClient, IVfResourceInstaller resourceinstaller) {
-        distributionClient = asdcClient;       
-    }
-
-    public ASDCController (String controllerConfigName,IDistributionClient asdcClient) {
+    public ASDCController(String controllerConfigName, IDistributionClient asdcClient,
+        IVfResourceInstaller resourceinstaller) {
         distributionClient = asdcClient;
-        this.controllerName = controllerConfigName;     
     }
+
+    public ASDCController(String controllerConfigName, IDistributionClient asdcClient) {
+        distributionClient = asdcClient;
+        this.controllerName = controllerConfigName;
+    }
+
     public String getControllerName() {
-		return controllerName;
-	}
+        return controllerName;
+    }
 
-	public void setControllerName(String controllerName) {
-		this.controllerName = controllerName;
-	}
+    public void setControllerName(String controllerName) {
+        this.controllerName = controllerName;
+    }
 
-	/**
+    /**
      * This method initializes the ASDC Controller and the ASDC Client.
      *
      * @throws ASDCControllerException It throws an exception if the ASDC Client cannot be instantiated or if an init
-     *         attempt is done when already initialized
+     * attempt is done when already initialized
      * @throws ASDCParametersException If there is an issue with the parameters provided
      * @throws IOException In case of issues when trying to load the key file
      */
-    public void initASDC () throws ASDCControllerException {
+    public void initASDC() throws ASDCControllerException {
         String event = "Initialize the ASDC Controller";
         logger.debug(event);
-        if (this.getControllerStatus () != ASDCControllerStatus.STOPPED) {
+        if (this.getControllerStatus() != ASDCControllerStatus.STOPPED) {
             String endEvent = "The controller is already initialized, call the closeASDC method first";
-            throw new ASDCControllerException (endEvent);
+            throw new ASDCControllerException(endEvent);
         }
 
-        if (asdcConfig != null) {          
+        if (asdcConfig != null) {
             asdcConfig.setAsdcControllerName(controllerName);
-        }    
+        }
 
         if (this.distributionClient == null) {
-            distributionClient = DistributionClientFactory.createDistributionClient ();
+            distributionClient = DistributionClientFactory.createDistributionClient();
         }
-        
-        IDistributionClientResult result = this.distributionClient.init (asdcConfig,
-                                                                         asdcNotificationCallBack, asdcStatusCallBack);
-        if (!result.getDistributionActionResult ().equals (DistributionActionResultEnum.SUCCESS)) {
+
+        IDistributionClientResult result = this.distributionClient.init(asdcConfig,
+            asdcNotificationCallBack, asdcStatusCallBack);
+        if (!result.getDistributionActionResult().equals(DistributionActionResultEnum.SUCCESS)) {
             String endEvent = "ASDC distribution client init failed with reason:"
-                              + result.getDistributionMessageResult ();
-            logger.debug (endEvent);
-            this.changeControllerStatus (ASDCControllerStatus.STOPPED);
-            throw new ASDCControllerException ("Initialization of the ASDC Controller failed with reason: "
-                                               + result.getDistributionMessageResult ());
+                + result.getDistributionMessageResult();
+            logger.debug(endEvent);
+            this.changeControllerStatus(ASDCControllerStatus.STOPPED);
+            throw new ASDCControllerException("Initialization of the ASDC Controller failed with reason: "
+                + result.getDistributionMessageResult());
         }
 
-        result = this.distributionClient.start ();
-        if (!result.getDistributionActionResult ().equals (DistributionActionResultEnum.SUCCESS)) {
+        result = this.distributionClient.start();
+        if (!result.getDistributionActionResult().equals(DistributionActionResultEnum.SUCCESS)) {
             String endEvent = "ASDC distribution client start failed with reason:"
-                              + result.getDistributionMessageResult ();
-            logger.debug (endEvent);
-            this.changeControllerStatus (ASDCControllerStatus.STOPPED);
-            throw new ASDCControllerException ("Startup of the ASDC Controller failed with reason: "
-                                               + result.getDistributionMessageResult ());
+                + result.getDistributionMessageResult();
+            logger.debug(endEvent);
+            this.changeControllerStatus(ASDCControllerStatus.STOPPED);
+            throw new ASDCControllerException("Startup of the ASDC Controller failed with reason: "
+                + result.getDistributionMessageResult());
         }
 
-        this.changeControllerStatus (ASDCControllerStatus.IDLE);
+        this.changeControllerStatus(ASDCControllerStatus.IDLE);
         logger.info("{} {} {}", MessageEnum.ASDC_INIT_ASDC_CLIENT_SUC.toString(), "ASDC", "changeControllerStatus");
     }
 
     /**
      * This method closes the ASDC Controller and the ASDC Client.
      *
-     * @throws ASDCControllerException It throws an exception if the ASDC Client cannot be closed because
-     *         it's currently BUSY in processing notifications.
+     * @throws ASDCControllerException It throws an exception if the ASDC Client cannot be closed because it's currently
+     * BUSY in processing notifications.
      */
-    public void closeASDC () throws ASDCControllerException {
+    public void closeASDC() throws ASDCControllerException {
 
-        if (this.getControllerStatus () == ASDCControllerStatus.BUSY) {
-            throw new ASDCControllerException ("Cannot close the ASDC controller as it's currently in BUSY state");
+        if (this.getControllerStatus() == ASDCControllerStatus.BUSY) {
+            throw new ASDCControllerException("Cannot close the ASDC controller as it's currently in BUSY state");
         }
         if (this.distributionClient != null) {
-            this.distributionClient.stop ();
+            this.distributionClient.stop();
             // If auto managed we can set it to Null, ASDCController controls it.
             // In the other case the client of this class has specified it, so we can't reset it
             if (isAsdcClientAutoManaged) {
@@ -249,59 +247,54 @@
             }
 
         }
-        this.changeControllerStatus (ASDCControllerStatus.STOPPED);
+        this.changeControllerStatus(ASDCControllerStatus.STOPPED);
     }
 
-    private boolean checkResourceAlreadyDeployed (VfResourceStructure resource) throws ArtifactInstallerException {
+    private boolean checkResourceAlreadyDeployed(VfResourceStructure resource) throws ArtifactInstallerException {
 
-    	
-   		if (toscaInstaller.isResourceAlreadyDeployed (resource)) {
-    			logger.info("{} {} {} {}", MessageEnum.ASDC_ARTIFACT_ALREADY_EXIST.toString(),
-                    resource.getResourceInstance().getResourceInstanceName(),
-                    resource.getResourceInstance().getResourceUUID(),
-                    resource.getResourceInstance().getResourceName());
+        if (toscaInstaller.isResourceAlreadyDeployed(resource)) {
+            logger.info("{} {} {} {}", MessageEnum.ASDC_ARTIFACT_ALREADY_EXIST.toString(),
+                resource.getResourceInstance().getResourceInstanceName(),
+                resource.getResourceInstance().getResourceUUID(),
+                resource.getResourceInstance().getResourceName());
 
-    			this.sendDeployNotificationsForResource(resource,DistributionStatusEnum.ALREADY_DOWNLOADED,null);
-    			this.sendDeployNotificationsForResource(resource,DistributionStatusEnum.ALREADY_DEPLOYED,null);
+            this.sendDeployNotificationsForResource(resource, DistributionStatusEnum.ALREADY_DOWNLOADED, null);
+            this.sendDeployNotificationsForResource(resource, DistributionStatusEnum.ALREADY_DEPLOYED, null);
 
-    		return true;
-    	} else {
-    		return false;
-    	}
+            return true;
+        } else {
+            return false;
+        }
     }
 
-   
 
-    protected IDistributionClientDownloadResult downloadTheArtifact (IArtifactInfo artifact,
-                                                                   String distributionId) throws ASDCDownloadException {
+    protected IDistributionClientDownloadResult downloadTheArtifact(IArtifactInfo artifact,
+        String distributionId) throws ASDCDownloadException {
 
-        logger.debug("Trying to download the artifact : " + artifact.getArtifactURL ()
-                      + UUID_PARAM
-                      + artifact.getArtifactUUID ()
-                      + ")");
+        logger.info("Trying to download the artifact UUID: {} from URL: {}", artifact.getArtifactUUID(),
+            artifact.getArtifactURL());
         IDistributionClientDownloadResult downloadResult;
 
-
         try {
-            downloadResult = distributionClient.download (artifact);
+            downloadResult = distributionClient.download(artifact);
             if (null == downloadResult) {
-            	logger.info ("{} {}", MessageEnum.ASDC_ARTIFACT_NULL.toString(), artifact.getArtifactUUID());
-            	return downloadResult;
+                logger.info("{} {}", MessageEnum.ASDC_ARTIFACT_NULL.toString(), artifact.getArtifactUUID());
+                return downloadResult;
             }
         } catch (RuntimeException e) {
-            logger.debug ("Not able to download the artifact due to an exception: " + artifact.getArtifactURL ());
-            this.sendASDCNotification (NotificationType.DOWNLOAD,
-                                       artifact.getArtifactURL (),
-                                       asdcConfig.getConsumerID (),
-                                       distributionId,
-                                       DistributionStatusEnum.DOWNLOAD_ERROR,
-                                       e.getMessage (),
-                                       System.currentTimeMillis ());
+            logger.debug("Not able to download the artifact due to an exception: " + artifact.getArtifactURL());
+            this.sendASDCNotification(NotificationType.DOWNLOAD,
+                artifact.getArtifactURL(),
+                asdcConfig.getConsumerID(),
+                distributionId,
+                DistributionStatusEnum.DOWNLOAD_ERROR,
+                e.getMessage(),
+                System.currentTimeMillis());
 
-            throw new ASDCDownloadException ("Exception caught when downloading the artifact", e);
+            throw new ASDCDownloadException("Exception caught when downloading the artifact", e);
         }
 
-        if (DistributionActionResultEnum.SUCCESS.equals(downloadResult.getDistributionActionResult ())) {
+        if (DistributionActionResultEnum.SUCCESS.equals(downloadResult.getDistributionActionResult())) {
             logger.info("{} {} {} {}", MessageEnum.ASDC_ARTIFACT_DOWNLOAD_SUC.toString(), artifact.getArtifactURL(),
                 artifact.getArtifactUUID(), String.valueOf(downloadResult.getArtifactPayload().length));
 
@@ -311,143 +304,144 @@
                 downloadResult.getDistributionMessageResult(), ErrorCode.DataError.getValue(),
                 "ASDC artifact download fail");
 
-            this.sendASDCNotification (NotificationType.DOWNLOAD,
-                                       artifact.getArtifactURL (),
-                                       asdcConfig.getConsumerID (),
-                                       distributionId,
-                                       DistributionStatusEnum.DOWNLOAD_ERROR,
-                                       downloadResult.getDistributionMessageResult (),
-                                       System.currentTimeMillis ());
+            this.sendASDCNotification(NotificationType.DOWNLOAD,
+                artifact.getArtifactURL(),
+                asdcConfig.getConsumerID(),
+                distributionId,
+                DistributionStatusEnum.DOWNLOAD_ERROR,
+                downloadResult.getDistributionMessageResult(),
+                System.currentTimeMillis());
 
-            throw new ASDCDownloadException ("Artifact " + artifact.getArtifactName ()
-                                             + " could not be downloaded from ASDC URL "
-                                             + artifact.getArtifactURL ()
-                                             + UUID_PARAM
-                                             + artifact.getArtifactUUID ()
-                                             + ")"
-                                             + System.lineSeparator ()
-                                             + "Error message is "
-                                             + downloadResult.getDistributionMessageResult ()
-                                             + System.lineSeparator ());
+            throw new ASDCDownloadException("Artifact " + artifact.getArtifactName()
+                + " could not be downloaded from ASDC URL "
+                + artifact.getArtifactURL()
+                + UUID_PARAM
+                + artifact.getArtifactUUID()
+                + ")"
+                + System.lineSeparator()
+                + "Error message is "
+                + downloadResult.getDistributionMessageResult()
+                + System.lineSeparator());
 
         }
 
-        this.sendASDCNotification (NotificationType.DOWNLOAD,
-                                   artifact.getArtifactURL (),
-                                   asdcConfig.getConsumerID (),
-                                   distributionId,
-                                   DistributionStatusEnum.DOWNLOAD_OK,
-                                   null,
-                                   System.currentTimeMillis ());
+        this.sendASDCNotification(NotificationType.DOWNLOAD,
+            artifact.getArtifactURL(),
+            asdcConfig.getConsumerID(),
+            distributionId,
+            DistributionStatusEnum.DOWNLOAD_OK,
+            null,
+            System.currentTimeMillis());
         return downloadResult;
 
     }
 
-    private void writeArtifactToFile (IArtifactInfo artifact,
-    		IDistributionClientDownloadResult resultArtifact) {
+    private void writeArtifactToFile(IArtifactInfo artifact, IDistributionClientDownloadResult resultArtifact) {
 
-        logger.debug(
-            "Trying to write artifact to file : " + artifact.getArtifactURL() + UUID_PARAM + artifact.getArtifactUUID()
-                + ")");
+        String filePath = Paths
+            .get(getMsoConfigPath(), "ASDC", artifact.getArtifactVersion(), artifact.getArtifactName()).normalize()
+            .toString();
 
-        String filePath = Paths.get(System.getProperty("mso.config.path"), "ASDC",  artifact.getArtifactVersion(), artifact.getArtifactName()).normalize().toString();
-    	// make parent directory
-    	File file = new File(filePath);    	
-    	File fileParent = file.getParentFile();
-    	if (!fileParent.exists()) {
-    	    fileParent.mkdirs();
-    	}
+        logger.info("Trying to write artifact UUID: {}, URL: {} to file: {}", artifact.getArtifactUUID(),
+            artifact.getArtifactURL(), filePath);
 
-    	byte[] payloadBytes = resultArtifact.getArtifactPayload();
+        // make parent directory
+        File file = new File(filePath);
+        File fileParent = file.getParentFile();
+        if (!fileParent.exists()) {
+            fileParent.mkdirs();
+        }
 
-    	try (FileOutputStream outFile = new FileOutputStream(filePath)) {
-          logger.info("{} {} {} {}", MessageEnum.ASDC_RECEIVE_SERVICE_NOTIF.toString(), "***WRITE FILE ARTIFACT NAME",
-              "ASDC", artifact.getArtifactName());
-          outFile.write(payloadBytes, 0, payloadBytes.length);
-          outFile.close();
-      } catch (Exception e) {
-          logger.debug("Exception :", e);
-          logger.error("{} {} {} {} {} {} {}", MessageEnum.ASDC_ARTIFACT_DOWNLOAD_FAIL.toString(),
-              artifact.getArtifactName(), artifact.getArtifactURL(), artifact.getArtifactUUID(),
-              resultArtifact.getDistributionMessageResult(), ErrorCode.DataError.getValue(),
-              "ASDC write to file failed");
+        byte[] payloadBytes = resultArtifact.getArtifactPayload();
+
+        try (FileOutputStream outFile = new FileOutputStream(filePath)) {
+            logger.info("{} {} {} {}", MessageEnum.ASDC_RECEIVE_SERVICE_NOTIF.toString(), "***WRITE FILE ARTIFACT NAME",
+                "ASDC", artifact.getArtifactName());
+            outFile.write(payloadBytes, 0, payloadBytes.length);
+        } catch (Exception e) {
+            logger.debug("Exception :", e);
+            logger.error("{} {} {} {} {} {} {}", MessageEnum.ASDC_ARTIFACT_DOWNLOAD_FAIL.toString(),
+                artifact.getArtifactName(), artifact.getArtifactURL(), artifact.getArtifactUUID(),
+                resultArtifact.getDistributionMessageResult(), ErrorCode.DataError.getValue(),
+                "ASDC write to file failed");
         }
 
     }
 
 
-    protected void sendDeployNotificationsForResource(VfResourceStructure vfResourceStructure,DistributionStatusEnum distribStatus, String errorReason) {
+    protected void sendDeployNotificationsForResource(ResourceStructure resourceStructure,
+        DistributionStatusEnum distribStatus, String errorReason) {
 
-    	for (IArtifactInfo artifactInfo : vfResourceStructure.getResourceInstance().getArtifacts()) {
+        for (IArtifactInfo artifactInfo : resourceStructure.getResourceInstance().getArtifacts()) {
 
-    		if ((DistributionStatusEnum.DEPLOY_OK.equals(distribStatus) && !artifactInfo.getArtifactType().equalsIgnoreCase("OTHER") && !vfResourceStructure.isAlreadyDeployed())
-    				// This could be NULL if the artifact is a VF module artifact, this won't be present in the MAP
-    				&& vfResourceStructure.getArtifactsMapByUUID().get(artifactInfo.getArtifactUUID()) != null
-    				&& vfResourceStructure.getArtifactsMapByUUID().get(artifactInfo.getArtifactUUID()).getDeployedInDb() == 0) {
-    			this.sendASDCNotification (NotificationType.DEPLOY,
-	    				artifactInfo.getArtifactURL (),
-	                  asdcConfig.getConsumerID (),
-	                  vfResourceStructure.getNotification().getDistributionID(),
-	                  DistributionStatusEnum.DEPLOY_ERROR,
-	                  "The artifact has not been used by the modules defined in the resource",
-	                  System.currentTimeMillis ());
-    		} else {
-	    		this.sendASDCNotification (NotificationType.DEPLOY,
-	    				artifactInfo.getArtifactURL (),
-	                  asdcConfig.getConsumerID (),
-	                  vfResourceStructure.getNotification().getDistributionID(),
-	                  distribStatus,
-	                  errorReason,
-	                  System.currentTimeMillis ());
-    		}
-    	}
+            if ((DistributionStatusEnum.DEPLOY_OK.equals(distribStatus) && !artifactInfo.getArtifactType()
+                .equalsIgnoreCase("OTHER") && !resourceStructure.isAlreadyDeployed())
+                // This could be NULL if the artifact is a VF module artifact, this won't be present in the MAP
+                && resourceStructure.getArtifactsMapByUUID().get(artifactInfo.getArtifactUUID()) != null
+                && resourceStructure.getArtifactsMapByUUID().get(artifactInfo.getArtifactUUID()).getDeployedInDb()
+                == 0) {
+                this.sendASDCNotification(NotificationType.DEPLOY,
+                    artifactInfo.getArtifactURL(),
+                    asdcConfig.getConsumerID(),
+                    resourceStructure.getNotification().getDistributionID(),
+                    DistributionStatusEnum.DEPLOY_ERROR,
+                    "The artifact has not been used by the modules defined in the resource",
+                    System.currentTimeMillis());
+            } else {
+                this.sendASDCNotification(NotificationType.DEPLOY,
+                    artifactInfo.getArtifactURL(),
+                    asdcConfig.getConsumerID(),
+                    resourceStructure.getNotification().getDistributionID(),
+                    distribStatus,
+                    errorReason,
+                    System.currentTimeMillis());
+            }
+        }
     }
-    
-    protected void sendCsarDeployNotification(INotificationData iNotif, VfResourceStructure resourceStructure, ToscaResourceStructure toscaResourceStructure, boolean deploySuccessful, String errorReason) {
-    	
-		IArtifactInfo csarArtifact = toscaResourceStructure.getToscaArtifact();
-		
-		if(deploySuccessful){
-			
-    		this.sendASDCNotification (NotificationType.DEPLOY,
- 	    			  csarArtifact.getArtifactURL (),
-	                  asdcConfig.getConsumerID (),
-	                  resourceStructure.getNotification().getDistributionID(),
-	                  DistributionStatusEnum.DEPLOY_OK,
-	                  errorReason,
-	                  System.currentTimeMillis ());
-			
-		} else {
-			
-			this.sendASDCNotification (NotificationType.DEPLOY,
-    			  csarArtifact.getArtifactURL (),
-                  asdcConfig.getConsumerID (),
-                  resourceStructure.getNotification().getDistributionID(),
-                  DistributionStatusEnum.DEPLOY_ERROR,
-                  errorReason,
-                  System.currentTimeMillis ());
-			
-		}
+
+    protected void sendCsarDeployNotification(INotificationData iNotif, ResourceStructure resourceStructure,
+        ToscaResourceStructure toscaResourceStructure, boolean deploySuccessful, String errorReason) {
+
+        IArtifactInfo csarArtifact = toscaResourceStructure.getToscaArtifact();
+
+        if (deploySuccessful) {
+
+            this.sendASDCNotification(NotificationType.DEPLOY,
+                csarArtifact.getArtifactURL(),
+                asdcConfig.getConsumerID(),
+                resourceStructure.getNotification().getDistributionID(),
+                DistributionStatusEnum.DEPLOY_OK,
+                errorReason,
+                System.currentTimeMillis());
+
+        } else {
+
+            this.sendASDCNotification(NotificationType.DEPLOY,
+                csarArtifact.getArtifactURL(),
+                asdcConfig.getConsumerID(),
+                resourceStructure.getNotification().getDistributionID(),
+                DistributionStatusEnum.DEPLOY_ERROR,
+                errorReason,
+                System.currentTimeMillis());
+
+        }
     }
-    
-    protected void deployResourceStructure (VfResourceStructure resourceStructure, ToscaResourceStructure toscaResourceStructure) throws ArtifactInstallerException {
+
+    protected void deployResourceStructure(ResourceStructure resourceStructure,
+        ToscaResourceStructure toscaResourceStructure) throws ArtifactInstallerException {
 
         logger.info("{} {} {} {}", MessageEnum.ASDC_START_DEPLOY_ARTIFACT.toString(),
             resourceStructure.getResourceInstance().getResourceInstanceName(),
             resourceStructure.getResourceInstance().getResourceUUID(), "ASDC");
         try {
-        	String resourceType = resourceStructure.getResourceInstance().getResourceType();
-        	String category = resourceStructure.getResourceInstance().getCategory();
-        	if("VF".equals(resourceType) && !"Allotted Resource".equalsIgnoreCase(category)){
-        		resourceStructure.createVfModuleStructures();
-        	}
-        	toscaInstaller.installTheResource(toscaResourceStructure, resourceStructure);        	        				
+            resourceStructure.prepareInstall();
+            toscaInstaller.installTheResource(toscaResourceStructure, resourceStructure);
 
         } catch (ArtifactInstallerException e) {
             logger.info("{} {} {} {} {} {}", MessageEnum.ASDC_ARTIFACT_DOWNLOAD_FAIL.toString(),
                 resourceStructure.getResourceInstance().getResourceName(),
                 resourceStructure.getResourceInstance().getResourceUUID(),
-                String.valueOf(resourceStructure.getVfModuleStructure().size()), "ASDC", "deployResourceStructure");
+                String.valueOf(resourceStructure.getNumberOfResources()), "ASDC", "deployResourceStructure");
             sendDeployNotificationsForResource(resourceStructure, DistributionStatusEnum.DEPLOY_ERROR, e.getMessage());
             throw e;
         }
@@ -456,66 +450,66 @@
             logger.info("{} {} {} {} {} {}", MessageEnum.ASDC_ARTIFACT_DEPLOY_SUC.toString(),
                 resourceStructure.getResourceInstance().getResourceName(),
                 resourceStructure.getResourceInstance().getResourceUUID(),
-                String.valueOf(resourceStructure.getVfModuleStructure().size()), "ASDC", "deployResourceStructure");
+                String.valueOf(resourceStructure.getNumberOfResources()), "ASDC", "deployResourceStructure");
             sendDeployNotificationsForResource(resourceStructure, DistributionStatusEnum.DEPLOY_OK, null);
         }
 
     }
-    
+
 
     private enum NotificationType {
-    	DOWNLOAD, DEPLOY
+        DOWNLOAD, DEPLOY
     }
 
-    protected void sendASDCNotification (NotificationType notificationType,
-                                       String artifactURL,
-                                       String consumerID,
-                                       String distributionID,
-                                       DistributionStatusEnum status,
-                                       String errorReason,
-                                       long timestamp) {
+    protected void sendASDCNotification(NotificationType notificationType,
+        String artifactURL,
+        String consumerID,
+        String distributionID,
+        DistributionStatusEnum status,
+        String errorReason,
+        long timestamp) {
 
-        String event = "Sending " + notificationType.name ()
-                       + "("
-                       + status.name ()
-                       + ")"
-                       + " notification to ASDC for artifact:"
-                       + artifactURL;
+        String event = "Sending " + notificationType.name()
+            + "("
+            + status.name()
+            + ")"
+            + " notification to ASDC for artifact:"
+            + artifactURL;
 
         if (errorReason != null) {
-        	event=event+"("+errorReason+")";
+            event = event + "(" + errorReason + ")";
         }
         logger.info("{} {} {} {} {} {}", MessageEnum.ASDC_SEND_NOTIF_ASDC.toString(), notificationType.name(),
             status.name(), artifactURL, "ASDC", "sendASDCNotification");
-        logger.debug (event);
+        logger.debug(event);
 
         String action = "";
         try {
-            IDistributionStatusMessage message = new DistributionStatusMessage (artifactURL,
-                                                                                consumerID,
-                                                                                distributionID,
-                                                                                status,
-                                                                                timestamp);
+            IDistributionStatusMessage message = new DistributionStatusMessage(artifactURL,
+                consumerID,
+                distributionID,
+                status,
+                timestamp);
 
             switch (notificationType) {
                 case DOWNLOAD:
                     if (errorReason != null) {
-                        this.distributionClient.sendDownloadStatus (message, errorReason);
+                        this.distributionClient.sendDownloadStatus(message, errorReason);
                     } else {
-                        this.distributionClient.sendDownloadStatus (message);
+                        this.distributionClient.sendDownloadStatus(message);
                     }
                     action = "sendDownloadStatus";
                     break;
                 case DEPLOY:
                     if (errorReason != null) {
-                        this.distributionClient.sendDeploymentStatus (message, errorReason);
+                        this.distributionClient.sendDeploymentStatus(message, errorReason);
                     } else {
-                        this.distributionClient.sendDeploymentStatus (message);
+                        this.distributionClient.sendDeploymentStatus(message);
                     }
                     action = "sendDeploymentdStatus";
                     break;
                 default:
-                	break;
+                    break;
             }
         } catch (RuntimeException e) {
             logger.warn("{} {} {} {} {}", MessageEnum.ASDC_SEND_NOTIF_ASDC_EXEC.toString(), "ASDC",
@@ -523,148 +517,150 @@
                 "RuntimeException - sendASDCNotification", e);
         }
     }
-    
-    protected void sendFinalDistributionStatus (
-    		String distributionID,
-    		DistributionStatusEnum status,
-    		String errorReason) {
 
+    protected void sendFinalDistributionStatus(
+        String distributionID,
+        DistributionStatusEnum status,
+        String errorReason) {
 
-        logger.debug("Enter sendFinalDistributionStatus with DistributionID " + distributionID + " and Status of " + status
+        logger.debug(
+            "Enter sendFinalDistributionStatus with DistributionID " + distributionID + " and Status of " + status
                 .name() + " and ErrorReason " + errorReason);
 
-    	long subStarttime = System.currentTimeMillis ();
-    	try {
-    		
-    		
-    		IFinalDistrStatusMessage finalDistribution = new FinalDistributionStatusMessage(distributionID,status,subStarttime, asdcConfig.getConsumerID());
-    		
-    		if(errorReason == null){
-    			this.distributionClient.sendFinalDistrStatus(finalDistribution);
-    		}else{
-    			this.distributionClient.sendFinalDistrStatus(finalDistribution, errorReason);
-    		}
-    		
- 
-    	} catch (RuntimeException e) {
-          logger.debug("Exception caught in sendFinalDistributionStatus {}", e.getMessage());
-          logger.warn("{} {} {} {} {}", MessageEnum.ASDC_SEND_NOTIF_ASDC_EXEC.toString(), "ASDC", "sendASDCNotification",
-                  ErrorCode.SchemaError.getValue(), "RuntimeException - sendASDCNotification", e);
-      }
+        long subStarttime = System.currentTimeMillis();
+        try {
+
+            IFinalDistrStatusMessage finalDistribution = new FinalDistributionStatusMessage(distributionID, status,
+                subStarttime, asdcConfig.getConsumerID());
+
+            if (errorReason == null) {
+                this.distributionClient.sendFinalDistrStatus(finalDistribution);
+            } else {
+                this.distributionClient.sendFinalDistrStatus(finalDistribution, errorReason);
+            }
+
+
+        } catch (RuntimeException e) {
+            logger.debug("Exception caught in sendFinalDistributionStatus {}", e.getMessage());
+            logger.warn("{} {} {} {} {}", MessageEnum.ASDC_SEND_NOTIF_ASDC_EXEC.toString(), "ASDC",
+                "sendASDCNotification",
+                ErrorCode.SchemaError.getValue(), "RuntimeException - sendASDCNotification", e);
+        }
     }
 
-	private Optional<String> getNotificationJson(INotificationData iNotif) {
-		ObjectMapper mapper = new ObjectMapper();
-		mapper.setSerializationInclusion(Include.NON_NULL);
-		mapper.setSerializationInclusion(Include.NON_EMPTY);
-		mapper.setSerializationInclusion(Include.NON_ABSENT);
+    private Optional<String> getNotificationJson(INotificationData iNotif) {
+        ObjectMapper mapper = new ObjectMapper();
+        mapper.setSerializationInclusion(Include.NON_NULL);
+        mapper.setSerializationInclusion(Include.NON_EMPTY);
+        mapper.setSerializationInclusion(Include.NON_ABSENT);
         mapper.enable(MapperFeature.USE_ANNOTATIONS);
         mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
-		Optional<String> returnValue = Optional.empty();
-		try {
-			returnValue = Optional.of(mapper.writeValueAsString(iNotif));
-		} catch (JsonProcessingException e) {
-			logger.error("Error converting incoming ASDC notification to JSON" , e);
-		}
-		return returnValue;
-	}
-	
-    public void treatNotification (INotificationData iNotif) {
+        Optional<String> returnValue = Optional.empty();
+        try {
+            returnValue = Optional.of(mapper.writeValueAsString(iNotif));
+        } catch (JsonProcessingException e) {
+            logger.error("Error converting incoming ASDC notification to JSON", e);
+        }
+        return returnValue;
+    }
 
-    	int noOfArtifacts = 0;
-    	
+    public void treatNotification(INotificationData iNotif) {
 
-    	for (IResourceInstance resource : iNotif.getResources ()) {
-    		noOfArtifacts += resource.getArtifacts ().size ();
-    	}
+        int noOfArtifacts = 0;
+
+        for (IResourceInstance resource : iNotif.getResources()) {
+            noOfArtifacts += resource.getArtifacts().size();
+        }
         logger.info("{} {} {} {}", MessageEnum.ASDC_RECEIVE_CALLBACK_NOTIF.toString(), String.valueOf(noOfArtifacts),
             iNotif.getServiceUUID(), "ASDC");
         try {
-        	logger.debug(ASDCNotificationLogging.dumpASDCNotification(iNotif));
-            logger.info("{} {} {} {}", MessageEnum.ASDC_RECEIVE_SERVICE_NOTIF.toString(), iNotif.getServiceUUID(), "ASDC",
+            logger.debug(ASDCNotificationLogging.dumpASDCNotification(iNotif));
+            logger
+                .info("{} {} {} {}", MessageEnum.ASDC_RECEIVE_SERVICE_NOTIF.toString(), iNotif.getServiceUUID(), "ASDC",
                     "treatNotification");
 
             this.changeControllerStatus(ASDCControllerStatus.BUSY);
-			Optional<String> notificationMessage = getNotificationJson(iNotif);
-			toscaInstaller.processWatchdog(iNotif.getDistributionID(), iNotif.getServiceUUID(), notificationMessage,
-					asdcConfig.getConsumerID());
-			
-			// Process only the Resource artifacts in MSO				
-			this.processResourceNotification(iNotif);
-			
-			//********************************************************************************************************
-			//Start Watchdog loop and wait for all components to complete before reporting final status back. 
-			// **If timer expires first then we will report a Distribution Error back to ASDC
-			//********************************************************************************************************
-        	long initialStartTime = System.currentTimeMillis();
-        	boolean componentsComplete = false;
-        	String distributionStatus = null;
-        	String watchdogError = null;
-        	String overallStatus = null;
-        	int watchDogTimeout = asdcConfig.getWatchDogTimeout() * 1000;
-        	boolean isDeploySuccess = false;        	
-						
-        	while(!componentsComplete && (System.currentTimeMillis() - initialStartTime) < watchDogTimeout)
-        	{
-        		        		
-    			try{        		
-    				distributionStatus = wd.getOverallDistributionStatus(iNotif.getDistributionID());
-    				Thread.sleep(watchDogTimeout / 10);    		
-    			}catch(Exception e){
-    				logger.debug ("Exception in Watchdog Loop {}", e.getMessage());
-    				Thread.sleep(watchDogTimeout / 10);
-    			}
-    			
-    			if(distributionStatus != null && !distributionStatus.equalsIgnoreCase(DistributionStatus.INCOMPLETE.name())){
-    				
-    				if(distributionStatus.equalsIgnoreCase(DistributionStatus.SUCCESS.name())){
-    					isDeploySuccess = true;
-    					overallStatus = DistributionStatusEnum.DISTRIBUTION_COMPLETE_OK.name();
-    				}else{
-    					overallStatus = DistributionStatusEnum.DISTRIBUTION_COMPLETE_ERROR.name();
-    				}    				
-    				componentsComplete = true;
-    			}
-        	}
-        	
-        	if(!componentsComplete){
-        		logger.debug("Timeout of {} seconds was reached before all components reported status", watchDogTimeout);
-        		watchdogError = "Timeout occurred while waiting for all components to report status";
-        		overallStatus = DistributionStatusEnum.DISTRIBUTION_COMPLETE_ERROR.name();
-        	}
-        	
-        	if(distributionStatus == null){        	
-        		overallStatus = DistributionStatusEnum.DISTRIBUTION_COMPLETE_ERROR.name();
-        		logger.debug("DistributionStatus is null for DistributionId: {}", iNotif.getDistributionID());
-        	}
-        	
-        	try {
-        		wd.executePatchAAI(iNotif.getDistributionID(), iNotif.getServiceInvariantUUID(), overallStatus);
-        		logger.debug("A&AI Updated succefully with Distribution Status!");
-        	}
-        	catch(Exception e) {
-              logger.debug("Exception in Watchdog executePatchAAI(): {}", e.getMessage());
-        		watchdogError = "Error calling A&AI " + e.getMessage();
-        		if(e.getCause() != null) {
-        			logger.debug("Exception caused by: {}", e.getCause().getMessage());
-        		}
-        	}
-     	
-        	
-        	if(isDeploySuccess && watchdogError == null){
-        		sendFinalDistributionStatus(iNotif.getDistributionID(), DistributionStatusEnum.DISTRIBUTION_COMPLETE_OK, null);
-        		WatchdogDistributionStatus wds = new WatchdogDistributionStatus(iNotif.getDistributionID());
-        		wds.setDistributionIdStatus(DistributionStatusEnum.DISTRIBUTION_COMPLETE_OK.toString());
-        		wdsRepo.save(wds);
-        	} else {
-        		sendFinalDistributionStatus(iNotif.getDistributionID(), DistributionStatusEnum.DISTRIBUTION_COMPLETE_ERROR, watchdogError);
-        		WatchdogDistributionStatus wds = new WatchdogDistributionStatus(iNotif.getDistributionID());
-        		wds.setDistributionIdStatus(DistributionStatusEnum.DISTRIBUTION_COMPLETE_ERROR.toString());
-        		wdsRepo.save(wds);
-        	}
-        	
+            Optional<String> notificationMessage = getNotificationJson(iNotif);
+            toscaInstaller.processWatchdog(iNotif.getDistributionID(), iNotif.getServiceUUID(), notificationMessage,
+                asdcConfig.getConsumerID());
 
-        } catch(ObjectOptimisticLockingFailureException e) {
+            // Process only the Resource artifacts in MSO
+            this.processResourceNotification(iNotif);
+
+            //********************************************************************************************************
+            //Start Watchdog loop and wait for all components to complete before reporting final status back.
+            // **If timer expires first then we will report a Distribution Error back to ASDC
+            //********************************************************************************************************
+            long initialStartTime = System.currentTimeMillis();
+            boolean componentsComplete = false;
+            String distributionStatus = null;
+            String watchdogError = null;
+            String overallStatus = null;
+            int watchDogTimeout = asdcConfig.getWatchDogTimeout() * 1000;
+            boolean isDeploySuccess = false;
+
+            while (!componentsComplete && (System.currentTimeMillis() - initialStartTime) < watchDogTimeout) {
+
+                try {
+                    distributionStatus = wd.getOverallDistributionStatus(iNotif.getDistributionID());
+                    Thread.sleep(watchDogTimeout / 10);
+                } catch (Exception e) {
+                    logger.debug("Exception in Watchdog Loop {}", e.getMessage());
+                    Thread.sleep(watchDogTimeout / 10);
+                }
+
+                if (distributionStatus != null && !distributionStatus
+                    .equalsIgnoreCase(DistributionStatus.INCOMPLETE.name())) {
+
+                    if (distributionStatus.equalsIgnoreCase(DistributionStatus.SUCCESS.name())) {
+                        isDeploySuccess = true;
+                        overallStatus = DistributionStatusEnum.DISTRIBUTION_COMPLETE_OK.name();
+                    } else {
+                        overallStatus = DistributionStatusEnum.DISTRIBUTION_COMPLETE_ERROR.name();
+                    }
+                    componentsComplete = true;
+                }
+            }
+
+            if (!componentsComplete) {
+                logger
+                    .debug("Timeout of {} seconds was reached before all components reported status", watchDogTimeout);
+                watchdogError = "Timeout occurred while waiting for all components to report status";
+                overallStatus = DistributionStatusEnum.DISTRIBUTION_COMPLETE_ERROR.name();
+            }
+
+            if (distributionStatus == null) {
+                overallStatus = DistributionStatusEnum.DISTRIBUTION_COMPLETE_ERROR.name();
+                logger.debug("DistributionStatus is null for DistributionId: {}", iNotif.getDistributionID());
+            }
+
+            try {
+                wd.executePatchAAI(iNotif.getDistributionID(), iNotif.getServiceInvariantUUID(), overallStatus);
+                logger.debug("A&AI Updated succefully with Distribution Status!");
+            } catch (Exception e) {
+                logger.debug("Exception in Watchdog executePatchAAI(): {}", e.getMessage());
+                watchdogError = "Error calling A&AI " + e.getMessage();
+                if (e.getCause() != null) {
+                    logger.debug("Exception caused by: {}", e.getCause().getMessage());
+                }
+            }
+
+            if (isDeploySuccess && watchdogError == null) {
+                sendFinalDistributionStatus(iNotif.getDistributionID(), DistributionStatusEnum.DISTRIBUTION_COMPLETE_OK,
+                    null);
+                WatchdogDistributionStatus wds = new WatchdogDistributionStatus(iNotif.getDistributionID());
+                wds.setDistributionIdStatus(DistributionStatusEnum.DISTRIBUTION_COMPLETE_OK.toString());
+                wdsRepo.save(wds);
+            } else {
+                sendFinalDistributionStatus(iNotif.getDistributionID(),
+                    DistributionStatusEnum.DISTRIBUTION_COMPLETE_ERROR, watchdogError);
+                WatchdogDistributionStatus wds = new WatchdogDistributionStatus(iNotif.getDistributionID());
+                wds.setDistributionIdStatus(DistributionStatusEnum.DISTRIBUTION_COMPLETE_ERROR.toString());
+                wdsRepo.save(wds);
+            }
+
+
+        } catch (ObjectOptimisticLockingFailureException e) {
 
             logger.debug("OptimisticLockingFailure for DistributionId: {} Another process "
                     + "has already altered this distribution, so not going to process it on this site.",
@@ -675,9 +671,10 @@
 
         } catch (Exception e) {
             logger.error("", MessageEnum.ASDC_GENERAL_EXCEPTION_ARG.toString(),
-                          "Unexpected exception caught during the notification processing",  "ASDC",
-                "treatNotification", ErrorCode.SchemaError.getValue(), "RuntimeException in treatNotification",
-                          e);
+                "Unexpected exception caught during the notification processing", "ASDC",
+                "treatNotification", ErrorCode.SchemaError.getValue(),
+                "RuntimeException in treatNotification",
+                e);
 
             try {
                 wd.executePatchAAI(iNotif.getDistributionID(), iNotif.getServiceInvariantUUID(),
@@ -690,167 +687,168 @@
                     logger.debug("Exception caused by: {}", aaiException.getCause().getMessage());
                 }
             }
-            
-             sendFinalDistributionStatus(iNotif.getDistributionID(), DistributionStatusEnum.DISTRIBUTION_COMPLETE_ERROR, e.getMessage());
-             
-        	 WatchdogDistributionStatus wds = new WatchdogDistributionStatus(iNotif.getDistributionID());
-        	 wds.setDistributionIdStatus(DistributionStatusEnum.DISTRIBUTION_COMPLETE_ERROR.toString());
-        	 wdsRepo.save(wds);
-            
+
+            sendFinalDistributionStatus(iNotif.getDistributionID(), DistributionStatusEnum.DISTRIBUTION_COMPLETE_ERROR,
+                e.getMessage());
+
+            WatchdogDistributionStatus wds = new WatchdogDistributionStatus(iNotif.getDistributionID());
+            wds.setDistributionIdStatus(DistributionStatusEnum.DISTRIBUTION_COMPLETE_ERROR.toString());
+            wdsRepo.save(wds);
+
         } finally {
-            this.changeControllerStatus (ASDCControllerStatus.IDLE);
+            this.changeControllerStatus(ASDCControllerStatus.IDLE);
         }
     }
 
-    protected void processResourceNotification (INotificationData iNotif) {
-    	// For each artifact, create a structure describing the VFModule in a ordered flat level
-    	VfResourceStructure resourceStructure = null;
-    	ToscaResourceStructure toscaResourceStructure = new ToscaResourceStructure();
-    	boolean deploySuccessful = true;
-    	boolean hasVFResource = false;
-    	String errorMessage = null;
+    protected void processResourceNotification(INotificationData iNotif) {
+        // For each artifact, create a structure describing the VFModule in a ordered flat level
+        ResourceStructure resourceStructure = null;
+        String msoConfigPath = getMsoConfigPath();
+        ToscaResourceStructure toscaResourceStructure = new ToscaResourceStructure(msoConfigPath);
+        boolean deploySuccessful = true;
+        String errorMessage = null;
 
-    	try {
-    		
-   			this.processCsarServiceArtifacts(iNotif, toscaResourceStructure);
-   			IArtifactInfo iArtifact = toscaResourceStructure.getToscaArtifact();
-   			String filePath = System.getProperty("mso.config.path") + "/ASDC/" + iArtifact.getArtifactVersion() + "/" + iArtifact.getArtifactName();
-   			File csarFile = new File(filePath);
-   			String csarFilePath = csarFile.getAbsolutePath();
-   			if (bpmnInstaller.containsWorkflows(csarFilePath)) {
-   				bpmnInstaller.installBpmn(csarFilePath);
-   			}   			
-   			   		 	
-    		for (IResourceInstance resource : iNotif.getResources()){
-    			
-    			resourceStructure = new VfResourceStructure(iNotif,resource);
-    			
-  	           	String resourceType = resourceStructure.getResourceInstance().getResourceType();
-            	String category = resourceStructure.getResourceInstance().getCategory();
-    				       	
-                logger.debug("Processing Resource Type: " + resourceType + " and Model UUID: " + resourceStructure
-                    .getResourceInstance().getResourceUUID());
-                	
-				if("VF".equals(resourceType) && !"Allotted Resource".equalsIgnoreCase(category)){
-					
-					hasVFResource = true;
-			
-	    			for (IArtifactInfo artifact : resource.getArtifacts()) {
-	    				IDistributionClientDownloadResult resultArtifact = this.downloadTheArtifact(artifact,
-	    						iNotif.getDistributionID());
-	    				if (resultArtifact != null) {
-	    					    					
-	    					if (ASDCConfiguration.VF_MODULES_METADATA.equals(artifact.getArtifactType())) {
-	    						logger.debug("VF_MODULE_ARTIFACT: "+ new String(resultArtifact.getArtifactPayload(),"UTF-8"));
-	    						logger.debug(ASDCNotificationLogging.dumpVfModuleMetaDataList(resourceStructure.decodeVfModuleArtifact
-                      (resultArtifact.getArtifactPayload())));
-	    					}
-	    					resourceStructure.addArtifactToStructure(distributionClient,artifact, resultArtifact);
-	    				}
-	    			}
-	    			
-					//Deploy VF resource and artifacts
-					logger.debug("Preparing to deploy Service: {}", iNotif.getServiceUUID());
-					try{
-						
-						this.deployResourceStructure(resourceStructure, toscaResourceStructure);
-
-				 	} catch(ArtifactInstallerException e){
-				 		deploySuccessful = false;
-				 		errorMessage = e.getMessage();
-				 		logger.error("Exception occurred", e);
-				 	}  
-				}
-						
-    		} 	
-    		
-  			// There are cases where the Service has no VF resources, those are handled here
-   			if (!hasVFResource) {
-   				
-   				logger.debug("No resources found for Service: {}", iNotif.getServiceUUID());
-				
-   				try{
-   					resourceStructure = new VfResourceStructure(iNotif,new ResourceInstance()); 
-   					
-					this.deployResourceStructure(resourceStructure, toscaResourceStructure);
-
-			 	} catch(ArtifactInstallerException e){
-			 		deploySuccessful = false;
-			 		errorMessage = e.getMessage();
-			 		logger.error("Exception occurred", e);
-		   }
-   		}
-			 this.sendCsarDeployNotification(iNotif, resourceStructure, toscaResourceStructure, deploySuccessful, errorMessage);
-    		
-    	} catch (ASDCDownloadException | UnsupportedEncodingException e) {
-          logger.error("{} {} {} {} {} {}", MessageEnum.ASDC_GENERAL_EXCEPTION_ARG.toString(),
-              "Exception caught during Installation of artifact", "ASDC", "processResourceNotification",
-              ErrorCode.BusinessProcesssError.getValue(), "Exception in processResourceNotification", e);
-      }
-    }
-    protected void processCsarServiceArtifacts (INotificationData iNotif, ToscaResourceStructure toscaResourceStructure) {
-    	
-    	List<IArtifactInfo> serviceArtifacts = iNotif.getServiceArtifacts();
-    	
-    		for(IArtifactInfo artifact : serviceArtifacts){
-    		
-    			if(artifact.getArtifactType().equals(ASDCConfiguration.TOSCA_CSAR)){
- 				
-    				try{
-    					
-    					toscaResourceStructure.setToscaArtifact(artifact);
-    					
-    					IDistributionClientDownloadResult resultArtifact = this.downloadTheArtifact(artifact,iNotif.getDistributionID());
-    					
-    					writeArtifactToFile(artifact, resultArtifact);
-    					
-    					toscaResourceStructure.updateResourceStructure(artifact);
-    					
-    					toscaResourceStructure.setServiceVersion(iNotif.getServiceVersion());
-    					
-    					logger.debug(ASDCNotificationLogging.dumpCSARNotification(iNotif, toscaResourceStructure));
-    					
-
-    				} catch(Exception e){
-    					logger.error("{} {} {} {} {} {}", MessageEnum.ASDC_GENERAL_EXCEPTION_ARG.toString(),
-    							"Exception caught during processCsarServiceArtifacts", "ASDC", "processCsarServiceArtifacts",
-                  ErrorCode.BusinessProcesssError.getValue(), "Exception in processCsarServiceArtifacts", e);
-    				}
-    			}
-    			else if(artifact.getArtifactType().equals(ASDCConfiguration.WORKFLOWS)){
-     				
-    				try{   					
-    					
-    					IDistributionClientDownloadResult resultArtifact = this.downloadTheArtifact(artifact,iNotif.getDistributionID());
-    					
-    					writeArtifactToFile(artifact, resultArtifact);
-    					
-    					toscaResourceStructure.setToscaArtifact(artifact);
-    					
-    					logger.debug(ASDCNotificationLogging.dumpASDCNotification(iNotif));
-    					
-
-    				} catch(Exception e){
-                logger.info("Whats the error {}", e.getMessage());
-                logger.error("{} {} {} {} {} {}", MessageEnum.ASDC_GENERAL_EXCEPTION_ARG.toString(),
-                    "Exception caught during processCsarServiceArtifacts", "ASDC", "processCsarServiceArtifacts",
-                    ErrorCode.BusinessProcesssError.getValue(), "Exception in processCsarServiceArtifacts",
-                    e);
+        try {
+            this.processCsarServiceArtifacts(iNotif, toscaResourceStructure);
+            IArtifactInfo iArtifact = toscaResourceStructure.getToscaArtifact();
+            String filePath =
+                msoConfigPath + "/ASDC/" + iArtifact.getArtifactVersion() + "/" + iArtifact
+                    .getArtifactName();
+            File csarFile = new File(filePath);
+            String csarFilePath = csarFile.getAbsolutePath();
+            if (bpmnInstaller.containsWorkflows(csarFilePath)) {
+                bpmnInstaller.installBpmn(csarFilePath);
             }
-    			}
 
-    				
-    		}
+            for (IResourceInstance resource : iNotif.getResources()) {
+
+                String resourceType = resource.getResourceType();
+                String category = resource.getCategory();
+
+                logger.info("Processing Resource Type: {}, Model UUID: {}", resourceType, resource.getResourceUUID());
+
+                if ("VF".equals(resourceType) && !"Allotted Resource".equalsIgnoreCase(category)) {
+                    resourceStructure = new VfResourceStructure(iNotif, resource);
+                } else if ("PNF".equals(resourceType)) {
+                    resourceStructure = new PnfResourceStructure(iNotif, resource);
+                } else {
+                    // There are cases where the Service has no VF resources, those are handled here
+                    logger.info("No resources found for Service: {}", iNotif.getServiceUUID());
+                    resourceStructure = new VfResourceStructure(iNotif, new ResourceInstance());
+                    resourceStructure.setResourceType(ResourceType.OTHER);
+                }
+
+                for (IArtifactInfo artifact : resource.getArtifacts()) {
+                    IDistributionClientDownloadResult resultArtifact = this.downloadTheArtifact(artifact,
+                        iNotif.getDistributionID());
+                    if (resultArtifact != null) {
+                        resourceStructure.addArtifactToStructure(distributionClient, artifact, resultArtifact);
+                    }
+                }
+
+                //Deploy VF resource and artifacts
+                logger.debug("Preparing to deploy Service: {}", iNotif.getServiceUUID());
+                try {
+                    this.deployResourceStructure(resourceStructure, toscaResourceStructure);
+                } catch (ArtifactInstallerException e) {
+                    deploySuccessful = false;
+                    errorMessage = e.getMessage();
+                    logger.error("Exception occurred", e);
+                }
+
+                this.sendCsarDeployNotification(iNotif, resourceStructure, toscaResourceStructure, deploySuccessful,
+                    errorMessage);
+            }
+
+
+        } catch (ASDCDownloadException | UnsupportedEncodingException e) {
+            logger.error("{} {} {} {} {} {}", MessageEnum.ASDC_GENERAL_EXCEPTION_ARG.toString(),
+                "Exception caught during Installation of artifact", "ASDC", "processResourceNotification",
+                ErrorCode.BusinessProcesssError.getValue(), "Exception in processResourceNotification", e);
+        }
     }
-    
-    private static final String UNKNOWN="Unknown";
-    
+
+    private String getMsoConfigPath() {
+        String msoConfigPath = System.getProperty("mso.config.path");
+        if (msoConfigPath == null) {
+            logger.info("Unable to find the system property mso.config.path, use the default configuration");
+            msoConfigPath = asdcConfig.getPropertyOrNull("mso.config.defaultpath");
+        }
+        if (msoConfigPath == null) {
+            logger.info("Unable to find the property: {} from configuration.", "mso.config.defaultpath");
+            msoConfigPath = "";
+        }
+        logger.info("MSO config path is: {}", msoConfigPath);
+        return msoConfigPath;
+    }
+
+    protected void processCsarServiceArtifacts(INotificationData iNotif,
+        ToscaResourceStructure toscaResourceStructure) {
+
+        List<IArtifactInfo> serviceArtifacts = iNotif.getServiceArtifacts();
+
+        for (IArtifactInfo artifact : serviceArtifacts) {
+
+            if (artifact.getArtifactType().equals(ASDCConfiguration.TOSCA_CSAR)) {
+
+                try {
+
+                    toscaResourceStructure.setToscaArtifact(artifact);
+
+                    IDistributionClientDownloadResult resultArtifact = this
+                        .downloadTheArtifact(artifact, iNotif.getDistributionID());
+
+                    writeArtifactToFile(artifact, resultArtifact);
+
+                    toscaResourceStructure.updateResourceStructure(artifact);
+
+                    toscaResourceStructure.setServiceVersion(iNotif.getServiceVersion());
+
+                    logger.debug(ASDCNotificationLogging.dumpCSARNotification(iNotif, toscaResourceStructure));
+
+
+                } catch (Exception e) {
+                    logger.error("{} {} {} {} {} {}", MessageEnum.ASDC_GENERAL_EXCEPTION_ARG.toString(),
+                        "Exception caught during processCsarServiceArtifacts", "ASDC", "processCsarServiceArtifacts",
+                        ErrorCode.BusinessProcesssError.getValue(),
+                        "Exception in processCsarServiceArtifacts", e);
+                }
+            } else if (artifact.getArtifactType().equals(ASDCConfiguration.WORKFLOWS)) {
+
+                try {
+
+                    IDistributionClientDownloadResult resultArtifact = this
+                        .downloadTheArtifact(artifact, iNotif.getDistributionID());
+
+                    writeArtifactToFile(artifact, resultArtifact);
+
+                    toscaResourceStructure.setToscaArtifact(artifact);
+
+                    logger.debug(ASDCNotificationLogging.dumpASDCNotification(iNotif));
+
+
+                } catch (Exception e) {
+                    logger.info("Whats the error {}", e.getMessage());
+                    logger.error("{} {} {} {} {} {}", MessageEnum.ASDC_GENERAL_EXCEPTION_ARG.toString(),
+                        "Exception caught during processCsarServiceArtifacts", "ASDC", "processCsarServiceArtifacts",
+                        ErrorCode.BusinessProcesssError.getValue(),
+                        "Exception in processCsarServiceArtifacts",
+                        e);
+                }
+            }
+
+
+        }
+    }
+
+    private static final String UNKNOWN = "Unknown";
+
     /**
      * @return the address of the ASDC we are connected to.
      */
-    public String getAddress () {
+    public String getAddress() {
         if (asdcConfig != null) {
-            return asdcConfig.getAsdcAddress ();
+            return asdcConfig.getAsdcAddress();
         }
         return UNKNOWN;
     }
@@ -858,9 +856,9 @@
     /**
      * @return the environment name of the ASDC we are connected to.
      */
-    public String getEnvironment () {
+    public String getEnvironment() {
         if (asdcConfig != null) {
-            return asdcConfig.getEnvironmentName ();
+            return asdcConfig.getEnvironmentName();
         }
         return UNKNOWN;
     }
diff --git a/asdc-controller/src/main/java/org/onap/so/asdc/client/test/emulators/ArtifactInfoImpl.java b/asdc-controller/src/main/java/org/onap/so/asdc/client/test/emulators/ArtifactInfoImpl.java
index ed97f5b..759d88f 100644
--- a/asdc-controller/src/main/java/org/onap/so/asdc/client/test/emulators/ArtifactInfoImpl.java
+++ b/asdc-controller/src/main/java/org/onap/so/asdc/client/test/emulators/ArtifactInfoImpl.java
@@ -41,7 +41,7 @@
 	private ArtifactInfoImpl generatedArtifact;
 	private List<IArtifactInfo> relatedArtifactsInfo;
 	private List<ArtifactInfoImpl> relatedArtifactsImpl;
-	ArtifactInfoImpl(){}
+	public ArtifactInfoImpl(){}
 	
 	private ArtifactInfoImpl(IArtifactInfo iArtifactInfo){
 		artifactName = iArtifactInfo.getArtifactName();
diff --git a/asdc-controller/src/main/java/org/onap/so/asdc/client/test/emulators/NotificationDataImpl.java b/asdc-controller/src/main/java/org/onap/so/asdc/client/test/emulators/NotificationDataImpl.java
index cbe16d8..9462cc8 100644
--- a/asdc-controller/src/main/java/org/onap/so/asdc/client/test/emulators/NotificationDataImpl.java
+++ b/asdc-controller/src/main/java/org/onap/so/asdc/client/test/emulators/NotificationDataImpl.java
@@ -129,6 +129,10 @@
 		}
 		return ret;
 	}
+
+	public void setResources(List<ResourceInfoImpl> resources){
+		this.resources = resources;
+	}
 	
 	public List<ResourceInfoImpl> getResourcesImpl(){
 		return resources;
diff --git a/asdc-controller/src/main/java/org/onap/so/asdc/client/test/emulators/ResourceInfoImpl.java b/asdc-controller/src/main/java/org/onap/so/asdc/client/test/emulators/ResourceInfoImpl.java
index dad7e64..9103ae1 100644
--- a/asdc-controller/src/main/java/org/onap/so/asdc/client/test/emulators/ResourceInfoImpl.java
+++ b/asdc-controller/src/main/java/org/onap/so/asdc/client/test/emulators/ResourceInfoImpl.java
@@ -31,7 +31,7 @@
 import com.fasterxml.jackson.annotation.JsonIgnore;
 
 public class ResourceInfoImpl implements IResourceInstance{
-	ResourceInfoImpl (){}
+	public ResourceInfoImpl (){}
 	private String resourceInstanceName;
 	private String resourceCustomizationUUID;
 	private String resourceName;
diff --git a/asdc-controller/src/main/java/org/onap/so/asdc/installer/PnfResourceStructure.java b/asdc-controller/src/main/java/org/onap/so/asdc/installer/PnfResourceStructure.java
new file mode 100644
index 0000000..1c1351b
--- /dev/null
+++ b/asdc-controller/src/main/java/org/onap/so/asdc/installer/PnfResourceStructure.java
@@ -0,0 +1,50 @@
+/*
+ * ============LICENSE_START=======================================================
+ *  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=========================================================
+ */
+
+package org.onap.so.asdc.installer;
+
+import java.io.UnsupportedEncodingException;
+import org.onap.sdc.api.IDistributionClient;
+import org.onap.sdc.api.notification.IArtifactInfo;
+import org.onap.sdc.api.notification.INotificationData;
+import org.onap.sdc.api.notification.IResourceInstance;
+import org.onap.sdc.api.results.IDistributionClientDownloadResult;
+import org.onap.so.asdc.client.exceptions.ArtifactInstallerException;
+
+/**
+ * This class represents the PNF resource structure.
+ */
+public class PnfResourceStructure extends ResourceStructure {
+
+    public PnfResourceStructure(INotificationData notificationData, IResourceInstance resourceInstance) {
+        super(notificationData, resourceInstance);
+        this.resourceType = ResourceType.PNF_RESOURCE;
+    }
+
+    @Override
+    public void addArtifactToStructure(IDistributionClient distributionClient, IArtifactInfo artifactinfo,
+        IDistributionClientDownloadResult clientResult) throws UnsupportedEncodingException {
+
+    }
+
+    @Override
+    public void prepareInstall() throws ArtifactInstallerException {
+
+    }
+}
diff --git a/asdc-controller/src/main/java/org/onap/so/asdc/installer/ResourceStructure.java b/asdc-controller/src/main/java/org/onap/so/asdc/installer/ResourceStructure.java
new file mode 100644
index 0000000..53cc74f
--- /dev/null
+++ b/asdc-controller/src/main/java/org/onap/so/asdc/installer/ResourceStructure.java
@@ -0,0 +1,152 @@
+/*
+ * ============LICENSE_START=======================================================
+ *  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=========================================================
+ */
+
+package org.onap.so.asdc.installer;
+
+import java.io.UnsupportedEncodingException;
+import java.util.HashMap;
+import java.util.Map;
+import org.onap.sdc.api.IDistributionClient;
+import org.onap.sdc.api.notification.IArtifactInfo;
+import org.onap.sdc.api.notification.INotificationData;
+import org.onap.sdc.api.notification.IResourceInstance;
+import org.onap.sdc.api.results.IDistributionClientDownloadResult;
+import org.onap.so.asdc.client.exceptions.ArtifactInstallerException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Abstract class to represent the resource structure.
+ *
+ * This structure exists to avoid having issues if the order of the resource artifact of tree structure is not good.
+ */
+public abstract class ResourceStructure {
+
+    /**
+     * Flag to indicate whether the resource is deployed successfully.
+     */
+    protected boolean isDeployedSuccessfully = false;
+
+    /**
+     * Flag to indicate whether the resource is already deployed.
+     */
+    protected boolean isAlreadyDeployed = false;
+
+    /**
+     * The resource type.
+     */
+    protected ResourceType resourceType;
+
+    /**
+     * The Raw notification data.
+     */
+    protected INotificationData notificationData;
+
+    /**
+     * The resource we will try to deploy.
+     */
+    protected IResourceInstance resourceInstance;
+
+    /**
+     * Number of resources provided by the resource structure.
+     */
+    protected int NumberOfResources;
+
+    /**
+     * The list of artifacts existing in this resource hashed by UUID.
+     */
+    protected final Map<String, VfModuleArtifact> artifactsMapByUUID;
+
+    public ResourceStructure(INotificationData notificationData, IResourceInstance resourceInstance) {
+        this.notificationData = notificationData;
+        this.resourceInstance = resourceInstance;
+        artifactsMapByUUID = new HashMap<>();
+    }
+
+    /**
+     * Add artifact to the resource structure.
+     *
+     * @param distributionClient
+     * @param artifactinfo
+     * @param clientResult
+     * @throws UnsupportedEncodingException
+     */
+    public abstract void addArtifactToStructure(IDistributionClient distributionClient, IArtifactInfo artifactinfo,
+        IDistributionClientDownloadResult clientResult) throws UnsupportedEncodingException;
+
+    /**
+     * Prepare the resource for installation.
+     *
+     * @throws ArtifactInstallerException
+     */
+    public abstract void prepareInstall() throws ArtifactInstallerException;
+
+    public boolean isDeployedSuccessfully() {
+        return isDeployedSuccessfully;
+    }
+
+    public void setDeployedSuccessfully(boolean deployedSuccessfully) {
+        isDeployedSuccessfully = deployedSuccessfully;
+    }
+
+    public boolean isAlreadyDeployed() {
+        return isAlreadyDeployed;
+    }
+
+    public void setAlreadyDeployed(boolean alreadyDeployed) {
+        isAlreadyDeployed = alreadyDeployed;
+    }
+
+    public ResourceType getResourceType() {
+        return resourceType;
+    }
+
+    public void setResourceType(ResourceType resourceType) {
+        this.resourceType = resourceType;
+    }
+
+    public INotificationData getNotification() {
+        return notificationData;
+    }
+
+    public void setNotification(INotificationData notificationData) {
+        this.notificationData = notificationData;
+    }
+
+    public IResourceInstance getResourceInstance() {
+        return resourceInstance;
+    }
+
+    public void setResourceInstance(IResourceInstance resourceInstance) {
+        this.resourceInstance = resourceInstance;
+    }
+
+    public int getNumberOfResources() {
+        return NumberOfResources;
+    }
+
+    public void setNumberOfResources(int numberOfResources) {
+        NumberOfResources = numberOfResources;
+    }
+
+    public Map<String, VfModuleArtifact> getArtifactsMapByUUID() {
+        return artifactsMapByUUID;
+    }
+
+}
diff --git a/asdc-controller/src/main/java/org/onap/so/asdc/installer/ResourceType.java b/asdc-controller/src/main/java/org/onap/so/asdc/installer/ResourceType.java
new file mode 100644
index 0000000..8d55f57
--- /dev/null
+++ b/asdc-controller/src/main/java/org/onap/so/asdc/installer/ResourceType.java
@@ -0,0 +1,41 @@
+/*
+ * ============LICENSE_START=======================================================
+ *  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=========================================================
+ */
+
+package org.onap.so.asdc.installer;
+
+/**
+ * This enum defines the resource type, it's used for tosca parsing, extraction and ingestion in SO.
+ */
+public enum ResourceType {
+
+    /**
+     * VF resource and the category is not allotted_resource.
+     */
+    VF_RESOURCE,
+
+    /**
+     * PNF resource.
+     */
+    PNF_RESOURCE,
+
+    /**
+     * Other resource type, including VF resource of allotted_resource category.
+     */
+    OTHER
+}
diff --git a/asdc-controller/src/main/java/org/onap/so/asdc/installer/ToscaResourceStructure.java b/asdc-controller/src/main/java/org/onap/so/asdc/installer/ToscaResourceStructure.java
index 6616bf4..3efc503 100644
--- a/asdc-controller/src/main/java/org/onap/so/asdc/installer/ToscaResourceStructure.java
+++ b/asdc-controller/src/main/java/org/onap/so/asdc/installer/ToscaResourceStructure.java
@@ -43,6 +43,7 @@
 import org.onap.so.db.catalog.beans.NetworkInstanceGroup;
 import org.onap.so.db.catalog.beans.NetworkResource;
 import org.onap.so.db.catalog.beans.NetworkResourceCustomization;
+import org.onap.so.db.catalog.beans.PnfResourceCustomization;
 import org.onap.so.db.catalog.beans.Service;
 import org.onap.so.db.catalog.beans.ServiceProxyResourceCustomization;
 import org.onap.so.db.catalog.beans.TempNetworkHeatTemplateLookup;
@@ -54,8 +55,16 @@
 import org.onap.so.logger.MessageEnum;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
 
 public class ToscaResourceStructure {
+
+	protected static final Logger logger = LoggerFactory.getLogger(ToscaResourceStructure.class);
+
+	/**
+	 * mso config path, used for the config files, like download csar files.
+	 */
+	private String msoConfigPath;
 	
 	Metadata serviceMetadata;
 	private Service catalogService;
@@ -100,6 +109,8 @@
 	private VfModuleCustomization vfModuleCustomization;
 
 	private VnfResourceCustomization vnfResourceCustomization;
+
+	private PnfResourceCustomization pnfResourceCustomization;
 		
 	private AllottedResource allottedResource;
 	
@@ -111,22 +122,21 @@
 	
 	private ToscaCsar toscaCsar;
 	
-	protected static final Logger logger = LoggerFactory.getLogger(ToscaResourceStructure.class);
-		
-	
 	public ToscaResourceStructure(){
+		this(System.getProperty("mso.config.path"));
 	}
-	
+
+	public ToscaResourceStructure(final String msoConfigPath){
+		this.msoConfigPath = msoConfigPath;
+		logger.info("MSO config path is: {}", msoConfigPath);
+	}
+
 	public void updateResourceStructure(IArtifactInfo artifact) throws ASDCDownloadException {
-		
-				
+
 		try {
-				
 			SdcToscaParserFactory factory = SdcToscaParserFactory.getInstance();//Autoclosable
-			
-			logger.debug("MSO config path is: " + System.getProperty("mso.config.path"));
-			
-			String filePath = Paths.get(System.getProperty("mso.config.path"), "ASDC",  artifact.getArtifactVersion(), artifact.getArtifactName()).normalize().toString();
+
+			String filePath = Paths.get(msoConfigPath, "ASDC",  artifact.getArtifactVersion(), artifact.getArtifactName()).normalize().toString();
 
 			File spoolFile = new File(filePath);
 
@@ -137,7 +147,7 @@
 			sdcCsarHelper = factory.getSdcCsarHelper(spoolFile.getAbsolutePath(),false);
 
 		}catch(Exception e){
-			logger.info("System out {}", e.getMessage());
+			logger.debug(e.getMessage(), e);
 			logger.error("{} {} {} {} {} {}", MessageEnum.ASDC_GENERAL_EXCEPTION_ARG.toString(),
 				"Exception caught during parser *****LOOK********* " + artifact.getArtifactName(), "ASDC",
 				"processResourceNotification", ErrorCode.BusinessProcesssError.getValue(),
@@ -259,6 +269,15 @@
 		this.vnfResourceCustomization = vnfResourceCustomization;
 	}
 
+	public PnfResourceCustomization getPnfResourceCustomization() {
+		return pnfResourceCustomization;
+	}
+
+	public void setPnfResourceCustomization(PnfResourceCustomization pnfResourceCustomization) {
+		this.pnfResourceCustomization = pnfResourceCustomization;
+	}
+
+
 	public VfModuleCustomization getCatalogVfModuleCustomization() {
 		return vfModuleCustomization;
 	}
diff --git a/asdc-controller/src/main/java/org/onap/so/asdc/installer/VfModuleArtifact.java b/asdc-controller/src/main/java/org/onap/so/asdc/installer/VfModuleArtifact.java
index 92fc598..cb4761c 100644
--- a/asdc-controller/src/main/java/org/onap/so/asdc/installer/VfModuleArtifact.java
+++ b/asdc-controller/src/main/java/org/onap/so/asdc/installer/VfModuleArtifact.java
@@ -42,8 +42,7 @@
 	private HeatEnvironment heatEnvironment;
 		
 	public VfModuleArtifact(IArtifactInfo artifactinfo,IDistributionClientDownloadResult clientResult) throws UnsupportedEncodingException {
-		artifactInfo=artifactinfo;
-		result = new String(clientResult.getArtifactPayload(), "UTF-8");
+		this(artifactinfo, clientResult, null);
 	}
 	
 	public VfModuleArtifact(IArtifactInfo artifactinfo,IDistributionClientDownloadResult clientResult, String modifiedHeatTemplate) throws UnsupportedEncodingException {
diff --git a/asdc-controller/src/main/java/org/onap/so/asdc/installer/VfResourceStructure.java b/asdc-controller/src/main/java/org/onap/so/asdc/installer/VfResourceStructure.java
index 5b24dc5..402af16 100644
--- a/asdc-controller/src/main/java/org/onap/so/asdc/installer/VfResourceStructure.java
+++ b/asdc-controller/src/main/java/org/onap/so/asdc/installer/VfResourceStructure.java
@@ -10,9 +10,9 @@
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -31,6 +31,7 @@
 import java.util.Map;
 import org.onap.so.asdc.client.ASDCConfiguration;
 import org.onap.so.asdc.client.exceptions.ArtifactInstallerException;
+import org.onap.so.asdc.util.ASDCNotificationLogging;
 import org.onap.so.db.catalog.beans.AllottedResourceCustomization;
 import org.onap.so.db.catalog.beans.NetworkResourceCustomization;
 import org.onap.so.db.catalog.beans.Service;
@@ -49,186 +50,156 @@
 import org.slf4j.LoggerFactory;
 
 /**
- * This structure exists to avoid having issues if the order of the vfResource/vfmodule artifact is not good (tree structure).
- *
+ * This structure exists to avoid having issues if the order of the vfResource/vfmodule artifact is not good (tree
+ * structure).
  */
+public class VfResourceStructure extends ResourceStructure {
+
+    protected static final Logger logger = LoggerFactory.getLogger(VfResourceStructure.class);
+
+    /**
+     * The list of VfModules defined for this resource.
+     */
+    private final List<VfModuleStructure> vfModulesStructureList;
+
+    /**
+     * The list of VfModulesMetadata defined for this resource.
+     */
+    private List<IVfModuleData> vfModulesMetadataList;
+
+    private VnfResource catalogVnfResource;
+
+    private NetworkResourceCustomization catalogNetworkResourceCustomization;
+
+    private AllottedResourceCustomization catalogResourceCustomization;
+
+    private Service catalogService;
 
 
-public class VfResourceStructure {
-	
-	protected static final Logger logger = LoggerFactory.getLogger(VfResourceStructure.class);
+    public VfResourceStructure(INotificationData notificationdata, IResourceInstance resourceinstance) {
+        super(notificationdata, resourceinstance);
+        this.resourceType = ResourceType.VF_RESOURCE;
+        vfModulesStructureList = new LinkedList<>();
+    }
 
-	private boolean isDeployedSuccessfully=false;
-	/**
-	 * The Raw notification data.
-	 */
-	private final INotificationData notification;
-	/**
-	 * The Raw notification data.
-	 */
-	private boolean isAlreadyDeployed=false;
+    public void addArtifactToStructure(IDistributionClient distributionClient, IArtifactInfo artifactinfo,
+        IDistributionClientDownloadResult clientResult) throws UnsupportedEncodingException {
+        this.addArtifactToStructure(distributionClient, artifactinfo, clientResult, null);
+    }
 
-	/**
-	 * The resource we will try to deploy.
-	 */
-	private final IResourceInstance resourceInstance;
+    public void addArtifactToStructure(IDistributionClient distributionClient, IArtifactInfo artifactinfo,
+        IDistributionClientDownloadResult clientResult, String modifiedHeatTemplate)
+        throws UnsupportedEncodingException {
+        VfModuleArtifact vfModuleArtifact = new VfModuleArtifact(artifactinfo, clientResult, modifiedHeatTemplate);
+        addArtifactByType(artifactinfo, clientResult, vfModuleArtifact);
+        if (ASDCConfiguration.VF_MODULES_METADATA.equals(artifactinfo.getArtifactType())) {
+            logger.debug("VF_MODULE_ARTIFACT: " + new String(clientResult.getArtifactPayload(), "UTF-8"));
+            logger.debug(ASDCNotificationLogging.dumpVfModuleMetaDataList(vfModulesMetadataList));
+        }
+    }
 
-	/**
-	 * The list of VfModules defined for this resource.
-	 */
-	private final List<VfModuleStructure> vfModulesStructureList;
+    protected void addArtifactByType(IArtifactInfo artifactinfo, IDistributionClientDownloadResult clientResult,
+        VfModuleArtifact vfModuleArtifact) throws UnsupportedEncodingException {
 
-	/**
-	 * The list of VfModulesMetadata defined for this resource.
-	 */
-	private List<IVfModuleData> vfModulesMetadataList;
+        switch (artifactinfo.getArtifactType()) {
+            case ASDCConfiguration.HEAT:
+            case ASDCConfiguration.HEAT_ENV:
+            case ASDCConfiguration.HEAT_VOL:
+            case ASDCConfiguration.HEAT_NESTED:    // For 1607 only 1 level tree is supported
+            case ASDCConfiguration.HEAT_ARTIFACT:
+            case ASDCConfiguration.HEAT_NET:
+            case ASDCConfiguration.OTHER:
+                artifactsMapByUUID.put(artifactinfo.getArtifactUUID(), vfModuleArtifact);
+                break;
+            case ASDCConfiguration.VF_MODULES_METADATA:
+                vfModulesMetadataList = this.decodeVfModuleArtifact(clientResult.getArtifactPayload());
+                break;
+            default:
+                break;
+        }
+    }
 
-	private VnfResource catalogVnfResource;
+    public void prepareInstall() throws ArtifactInstallerException{
+        createVfModuleStructures();
+    }
 
-	private NetworkResourceCustomization catalogNetworkResourceCustomization;
-	
-	private AllottedResourceCustomization catalogResourceCustomization;
+    public void createVfModuleStructures() throws ArtifactInstallerException {
 
-	private Service catalogService;
-	
-	/**
-	 * The list of artifacts existing in this resource hashed by UUID.
-	 */
-	private final Map<String, VfModuleArtifact> artifactsMapByUUID;
+        //for vender tosca VNF there is no VFModule in VF
+        if (vfModulesMetadataList == null) {
+            logger.info("{} {} {} {}", MessageEnum.ASDC_GENERAL_INFO.toString(), "There is no VF mudules in the VF.",
+                "ASDC",
+                "createVfModuleStructures");
+            return;
+        }
+        for (IVfModuleData vfModuleMeta : vfModulesMetadataList) {
+            vfModulesStructureList.add(new VfModuleStructure(this, vfModuleMeta));
+        }
+        setNumberOfResources(vfModulesMetadataList.size());
+    }
 
+    public List<VfModuleStructure> getVfModuleStructure() {
+        return vfModulesStructureList;
+    }
 
-	public VfResourceStructure(INotificationData notificationdata, IResourceInstance resourceinstance) {
-		notification=notificationdata;
-		resourceInstance=resourceinstance;
-		vfModulesStructureList = new LinkedList<>();
-		artifactsMapByUUID = new HashMap<>();
-	}
-	
-	public void addArtifactToStructure(IDistributionClient distributionClient,IArtifactInfo artifactinfo,IDistributionClientDownloadResult clientResult) throws UnsupportedEncodingException {
-		VfModuleArtifact vfModuleArtifact = new VfModuleArtifact(artifactinfo,clientResult);
-		addArtifactByType(artifactinfo,clientResult,vfModuleArtifact);
-	}
-	
-	public void addArtifactToStructure(IDistributionClient distributionClient,IArtifactInfo artifactinfo,IDistributionClientDownloadResult clientResult, String modifiedHeatTemplate) throws UnsupportedEncodingException {
-		VfModuleArtifact vfModuleArtifact = new VfModuleArtifact(artifactinfo,clientResult,modifiedHeatTemplate);
-		addArtifactByType(artifactinfo,clientResult,vfModuleArtifact);
-	}
-	
-	protected void addArtifactByType(IArtifactInfo artifactinfo,IDistributionClientDownloadResult clientResult, VfModuleArtifact vfModuleArtifact) throws UnsupportedEncodingException {
+    public Map<String, VfModuleArtifact> getArtifactsMapByUUID() {
+        return artifactsMapByUUID;
+    }
 
-		switch(artifactinfo.getArtifactType()) {
-			case ASDCConfiguration.HEAT:
-			case ASDCConfiguration.HEAT_ENV:
-			case ASDCConfiguration.HEAT_VOL:
-			case ASDCConfiguration.HEAT_NESTED:    // For 1607 only 1 level tree is supported
-			case ASDCConfiguration.HEAT_ARTIFACT:
-			case ASDCConfiguration.HEAT_NET:
-			case ASDCConfiguration.OTHER:
-				artifactsMapByUUID.put(artifactinfo.getArtifactUUID(), vfModuleArtifact);
-				break;
-			case ASDCConfiguration.VF_MODULES_METADATA:
-				vfModulesMetadataList = this.decodeVfModuleArtifact(clientResult.getArtifactPayload());	
-				break;
-			default:
-				break;
-		}
-	}
+    public List<VfModuleStructure> getVfModulesStructureList() {
+        return vfModulesStructureList;
+    }
 
-	public void createVfModuleStructures() throws ArtifactInstallerException {
+    public VnfResource getCatalogVnfResource() {
+        return catalogVnfResource;
+    }
 
-		//for vender tosca VNF there is no VFModule in VF
-		if (vfModulesMetadataList == null) {
-			logger.info("{} {} {} {}", MessageEnum.ASDC_GENERAL_INFO.toString(), "There is no VF mudules in the VF.", "ASDC",
-				"createVfModuleStructures");
-			return;
-		}
-			for (IVfModuleData vfModuleMeta:vfModulesMetadataList) {
-				vfModulesStructureList.add(new VfModuleStructure(this,vfModuleMeta));
-			}
-		}
+    public void setCatalogVnfResource(VnfResource catalogVnfResource) {
+        this.catalogVnfResource = catalogVnfResource;
+    }
 
-	public INotificationData getNotification() {
-		return notification;
-	}
+    // Network Only
+    public NetworkResourceCustomization getCatalogNetworkResourceCustomization() {
+        return catalogNetworkResourceCustomization;
+    }
 
-	public IResourceInstance getResourceInstance() {
-		return resourceInstance;
-	}
+    // Network Only
+    public void setCatalogNetworkResourceCustomization(
+        NetworkResourceCustomization catalogNetworkResourceCustomization) {
+        this.catalogNetworkResourceCustomization = catalogNetworkResourceCustomization;
+    }
 
-	public List<VfModuleStructure> getVfModuleStructure() {
-		return vfModulesStructureList;
-	}
+    public AllottedResourceCustomization getCatalogResourceCustomization() {
+        return catalogResourceCustomization;
+    }
 
-	public boolean isDeployedSuccessfully() {
-		return isDeployedSuccessfully;
-	}
+    public void setCatalogResourceCustomization(
+        AllottedResourceCustomization catalogResourceCustomization) {
+        this.catalogResourceCustomization = catalogResourceCustomization;
+    }
 
-	public void setSuccessfulDeployment() {
-		isDeployedSuccessfully = true;
-	}
-	
-	public boolean isAlreadyDeployed() {
-		return isAlreadyDeployed;
-	}
+    public Service getCatalogService() {
+        return catalogService;
+    }
 
-	public void setAlreadyDeployed(boolean isAlreadyDeployed) {
-		this.isAlreadyDeployed = isAlreadyDeployed;
-	}
+    public void setCatalogService(Service catalogService) {
+        this.catalogService = catalogService;
+    }
 
-	public Map<String, VfModuleArtifact> getArtifactsMapByUUID() {
-		return artifactsMapByUUID;
-	}
+    public List<IVfModuleData> decodeVfModuleArtifact(byte[] arg0) {
+        try {
+            List<IVfModuleData> listVFModuleMetaData = new ObjectMapper()
+                .readValue(arg0, new TypeReference<List<VfModuleMetaData>>() {
+                });
+            return listVFModuleMetaData;
 
-	public List<VfModuleStructure> getVfModulesStructureList() {
-		return vfModulesStructureList;
-	}
-
-	public VnfResource getCatalogVnfResource() {
-		return catalogVnfResource;
-	}
-
-	public void setCatalogVnfResource(VnfResource catalogVnfResource) {
-		this.catalogVnfResource = catalogVnfResource;
-	}
-
-	// Network Only
-	public NetworkResourceCustomization getCatalogNetworkResourceCustomization() {
-		return catalogNetworkResourceCustomization;
-	}
-	// Network Only
-	public void setCatalogNetworkResourceCustomization(NetworkResourceCustomization catalogNetworkResourceCustomization) {
-		this.catalogNetworkResourceCustomization = catalogNetworkResourceCustomization;
-	}
-
-	public AllottedResourceCustomization getCatalogResourceCustomization() {
-		return catalogResourceCustomization;
-	}
-
-	public void setCatalogResourceCustomization(
-			AllottedResourceCustomization catalogResourceCustomization) {
-		this.catalogResourceCustomization = catalogResourceCustomization;
-	}
-
-	public Service getCatalogService() {
-		return catalogService;
-	}
-
-	public void setCatalogService(Service catalogService) {
-		this.catalogService = catalogService;
-	}
-
-	public List<IVfModuleData> decodeVfModuleArtifact(byte[] arg0) {
-		try {
-			List<IVfModuleData> listVFModuleMetaData = new ObjectMapper().readValue(arg0, new TypeReference<List<VfModuleMetaData>>(){});
-			return listVFModuleMetaData;
-
-		} catch (JsonParseException e) {
-			logger.debug("JsonParseException : ",e);
-		} catch (JsonMappingException e) {
-			logger.debug("JsonMappingException : ",e);
-		} catch (IOException e) {
-			logger.debug("IOException : ",e);
-		}
-		return null;
-	}
+        } catch (JsonParseException e) {
+            logger.debug("JsonParseException : ", e);
+        } catch (JsonMappingException e) {
+            logger.debug("JsonMappingException : ", e);
+        } catch (IOException e) {
+            logger.debug("IOException : ", e);
+        }
+        return null;
+    }
 }
diff --git a/asdc-controller/src/main/java/org/onap/so/asdc/installer/heat/ToscaResourceInstaller.java b/asdc-controller/src/main/java/org/onap/so/asdc/installer/heat/ToscaResourceInstaller.java
index 5af427a..db639da 100644
--- a/asdc-controller/src/main/java/org/onap/so/asdc/installer/heat/ToscaResourceInstaller.java
+++ b/asdc-controller/src/main/java/org/onap/so/asdc/installer/heat/ToscaResourceInstaller.java
@@ -10,9 +10,9 @@
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -24,6 +24,8 @@
 package org.onap.so.asdc.installer.heat;
 
 
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import java.sql.Timestamp;
 import java.util.ArrayList;
 import java.util.Date;
@@ -35,13 +37,15 @@
 import java.util.Optional;
 import java.util.Set;
 import java.util.stream.Collectors;
-
 import org.hibernate.exception.ConstraintViolationException;
 import org.hibernate.exception.LockAcquisitionException;
 import org.onap.sdc.api.notification.IArtifactInfo;
 import org.onap.sdc.api.notification.IResourceInstance;
 import org.onap.sdc.api.notification.IStatusData;
+import org.onap.sdc.tosca.parser.api.IEntityDetails;
 import org.onap.sdc.tosca.parser.api.ISdcCsarHelper;
+import org.onap.sdc.tosca.parser.elements.queries.EntityQuery;
+import org.onap.sdc.tosca.parser.elements.queries.TopologyTemplateQuery;
 import org.onap.sdc.tosca.parser.enums.SdcTypes;
 import org.onap.sdc.tosca.parser.impl.SdcPropertyNames;
 import org.onap.sdc.toscaparser.api.CapabilityAssignment;
@@ -62,6 +66,8 @@
 import org.onap.so.asdc.installer.ASDCElementInfo;
 import org.onap.so.asdc.installer.BigDecimalVersion;
 import org.onap.so.asdc.installer.IVfModuleData;
+import org.onap.so.asdc.installer.PnfResourceStructure;
+import org.onap.so.asdc.installer.ResourceStructure;
 import org.onap.so.asdc.installer.ToscaResourceStructure;
 import org.onap.so.asdc.installer.VfModuleArtifact;
 import org.onap.so.asdc.installer.VfModuleStructure;
@@ -84,6 +90,8 @@
 import org.onap.so.db.catalog.beans.NetworkInstanceGroup;
 import org.onap.so.db.catalog.beans.NetworkResource;
 import org.onap.so.db.catalog.beans.NetworkResourceCustomization;
+import org.onap.so.db.catalog.beans.PnfResource;
+import org.onap.so.db.catalog.beans.PnfResourceCustomization;
 import org.onap.so.db.catalog.beans.Service;
 import org.onap.so.db.catalog.beans.ServiceProxyResourceCustomization;
 import org.onap.so.db.catalog.beans.SubType;
@@ -109,6 +117,8 @@
 import org.onap.so.db.catalog.data.repository.InstanceGroupRepository;
 import org.onap.so.db.catalog.data.repository.NetworkResourceCustomizationRepository;
 import org.onap.so.db.catalog.data.repository.NetworkResourceRepository;
+import org.onap.so.db.catalog.data.repository.PnfCustomizationRepository;
+import org.onap.so.db.catalog.data.repository.PnfResourceRepository;
 import org.onap.so.db.catalog.data.repository.ServiceProxyResourceCustomizationRepository;
 import org.onap.so.db.catalog.data.repository.ServiceRepository;
 import org.onap.so.db.catalog.data.repository.TempNetworkHeatTemplateRepository;
@@ -133,2007 +143,2323 @@
 import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Transactional;
 
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
 @Component
 public class ToscaResourceInstaller {
 
-	protected static final String NODES_VRF_ENTRY = "org.openecomp.nodes.VRFEntry";
+    protected static final String NODES_VRF_ENTRY = "org.openecomp.nodes.VRFEntry";
 
-	protected static final String VLAN_NETWORK_RECEPTOR = "org.openecomp.nodes.VLANNetworkReceptor";
+    protected static final String VLAN_NETWORK_RECEPTOR = "org.openecomp.nodes.VLANNetworkReceptor";
 
-	protected static final String ALLOTTED_RESOURCE = "Allotted Resource";
+    protected static final String ALLOTTED_RESOURCE = "Allotted Resource";
 
-	protected static final String MULTI_STAGE_DESIGN = "multi_stage_design";
+    protected static final String MULTI_STAGE_DESIGN = "multi_stage_design";
 
-	protected static final String SCALABLE = "scalable";
+    protected static final String SCALABLE = "scalable";
 
-	protected static final String BASIC = "BASIC";
+    protected static final String BASIC = "BASIC";
 
-	protected static final String PROVIDER = "PROVIDER";
+    protected static final String PROVIDER = "PROVIDER";
 
-	protected static final String HEAT = "HEAT";
+    protected static final String HEAT = "HEAT";
 
-	protected static final String MANUAL_RECORD = "MANUAL_RECORD";
+    protected static final String MANUAL_RECORD = "MANUAL_RECORD";
 
-	protected static final String MSO = "SO";
+    protected static final String MSO = "SO";
+
+    protected static final String SDNC_MODEL_NAME = "sdnc_model_name";
+
+    protected static final String SDNC_MODEL_VERSION = "sdnc_model_version";
+
+    private static String CUSTOMIZATION_UUID = "customizationUUID";
 
 
-	@Autowired
-	protected ServiceRepository serviceRepo;
-	
-	@Autowired
-	protected InstanceGroupRepository instanceGroupRepo;
-	
-	@Autowired
-	protected ServiceProxyResourceCustomizationRepository serviceProxyCustomizationRepo;
-	
-	@Autowired
-	protected CollectionResourceRepository collectionRepo;
-	
-	@Autowired
-	protected CollectionResourceCustomizationRepository collectionCustomizationRepo;
-	
-	@Autowired
-	protected ConfigurationResourceCustomizationRepository configCustomizationRepo;
-	
-	@Autowired
-	protected ConfigurationResourceRepository configRepo;
+    @Autowired
+    protected ServiceRepository serviceRepo;
 
-	@Autowired
-	protected VnfResourceRepository vnfRepo;
+    @Autowired
+    protected InstanceGroupRepository instanceGroupRepo;
 
-	@Autowired
-	protected VnfCustomizationRepository vnfCustomizationRepo;
-	
-	@Autowired
-	protected VFModuleRepository vfModuleRepo;
+    @Autowired
+    protected ServiceProxyResourceCustomizationRepository serviceProxyCustomizationRepo;
 
-	@Autowired
-	protected VFModuleCustomizationRepository vfModuleCustomizationRepo;	
-	
-	@Autowired
-	protected VnfcInstanceGroupCustomizationRepository vnfcInstanceGroupCustomizationRepo;	
-	
-	@Autowired
-	protected VnfcCustomizationRepository vnfcCustomizationRepo;
-	
-	@Autowired
-	protected CvnfcCustomizationRepository cvnfcCustomizationRepo;
+    @Autowired
+    protected CollectionResourceRepository collectionRepo;
 
-	@Autowired
-	protected AllottedResourceRepository allottedRepo;
+    @Autowired
+    protected CollectionResourceCustomizationRepository collectionCustomizationRepo;
 
-	@Autowired
-	protected AllottedResourceCustomizationRepository allottedCustomizationRepo;
+    @Autowired
+    protected ConfigurationResourceCustomizationRepository configCustomizationRepo;
 
-	@Autowired
-	protected NetworkResourceRepository networkRepo;
-	 
-	@Autowired
-	protected HeatTemplateRepository heatRepo;
+    @Autowired
+    protected ConfigurationResourceRepository configRepo;
 
-	@Autowired
-	protected NetworkResourceCustomizationRepository networkCustomizationRepo;
+    @Autowired
+    protected VnfResourceRepository vnfRepo;
 
-	@Autowired
-	protected WatchdogComponentDistributionStatusRepository watchdogCDStatusRepository;
-	@Autowired
-	protected WatchdogDistributionStatusRepository watchdogDistributionStatusRepository;
-	@Autowired
-	protected WatchdogServiceModVerIdLookupRepository watchdogModVerIdLookupRepository;	
-	
-	@Autowired
-	protected TempNetworkHeatTemplateRepository tempNetworkLookupRepo;
-	
-	@Autowired
-	protected ExternalServiceToInternalServiceRepository externalServiceToInternalServiceRepository;
-	
-	protected static final Logger logger = LoggerFactory.getLogger(ToscaResourceInstaller.class);
+    @Autowired
+    protected VnfCustomizationRepository vnfCustomizationRepo;
 
-	public boolean isResourceAlreadyDeployed(VfResourceStructure vfResourceStruct) throws ArtifactInstallerException {
-		boolean status = false;
-		VfResourceStructure vfResourceStructure = vfResourceStruct;
-		try {
-		    status = vfResourceStructure.isDeployedSuccessfully();
-		} catch (RuntimeException e) {
-		    status = false;
-		}
-		try {					
-			Service existingService = serviceRepo.findOneByModelUUID(vfResourceStructure.getNotification().getServiceUUID()); 
-			if(existingService != null)
-				status = true;
-			if (status) {
-				logger.info(vfResourceStructure.getResourceInstance().getResourceInstanceName(),
-						vfResourceStructure.getResourceInstance().getResourceCustomizationUUID(),
-						vfResourceStructure.getNotification().getServiceName(),
-						BigDecimalVersion.castAndCheckNotificationVersionToString(
-								vfResourceStructure.getNotification().getServiceVersion()),
-						vfResourceStructure.getNotification().getServiceUUID(),
-						vfResourceStructure.getResourceInstance().getResourceName(), "", "");
-				WatchdogComponentDistributionStatus wdStatus = new WatchdogComponentDistributionStatus(vfResourceStruct.getNotification().getDistributionID(), MSO);
-				wdStatus.setComponentDistributionStatus(DistributionStatusEnum.COMPONENT_DONE_OK.name());
-				watchdogCDStatusRepository.saveAndFlush(wdStatus);
-			} else {			
-				logger.info(vfResourceStructure.getResourceInstance().getResourceInstanceName(),
-						vfResourceStructure.getResourceInstance().getResourceCustomizationUUID(),
-						vfResourceStructure.getNotification().getServiceName(),
-						BigDecimalVersion.castAndCheckNotificationVersionToString(
-								vfResourceStructure.getNotification().getServiceVersion()),
-						vfResourceStructure.getNotification().getServiceUUID(),
-						vfResourceStructure.getResourceInstance().getResourceName(), "", "");
-			}
-			return status;
-		} catch (Exception e) {
-			logger
-				.error("{} {} {}", MessageEnum.ASDC_ARTIFACT_CHECK_EXC.toString(), ErrorCode.SchemaError.getValue(),
-					"Exception - isResourceAlreadyDeployed");
-			throw new ArtifactInstallerException("Exception caught during checking existence of the VNF Resource.", e);
-		}
-	}
+    @Autowired
+    protected VFModuleRepository vfModuleRepo;
 
-	public void installTheComponentStatus(IStatusData iStatus) throws ArtifactInstallerException {
-		logger.debug("Entering installTheComponentStatus for distributionId {} and ComponentName {}",
-			iStatus.getDistributionID(), iStatus.getComponentName());
+    @Autowired
+    protected VFModuleCustomizationRepository vfModuleCustomizationRepo;
 
-		try {
-			WatchdogComponentDistributionStatus cdStatus = new WatchdogComponentDistributionStatus(iStatus.getDistributionID(),
-					iStatus.getComponentName());
-			cdStatus.setComponentDistributionStatus(iStatus.getStatus().toString());
-			watchdogCDStatusRepository.save(cdStatus);
+    @Autowired
+    protected VnfcInstanceGroupCustomizationRepository vnfcInstanceGroupCustomizationRepo;
 
-		} catch (Exception e) {
-			logger.debug("Exception caught in installTheComponentStatus {}", e.getMessage());
-			throw new ArtifactInstallerException("Exception caught in installTheComponentStatus " + e.getMessage());
-		}
-	}
+    @Autowired
+    protected VnfcCustomizationRepository vnfcCustomizationRepo;
 
-	@Transactional(rollbackFor = { ArtifactInstallerException.class })
-	public void installTheResource(ToscaResourceStructure toscaResourceStruct, VfResourceStructure vfResourceStruct)
-			throws ArtifactInstallerException {		
-		VfResourceStructure vfResourceStructure = vfResourceStruct;
-		extractHeatInformation(toscaResourceStruct, vfResourceStructure);	
+    @Autowired
+    protected CvnfcCustomizationRepository cvnfcCustomizationRepo;
 
-		// PCLO: in case of deployment failure, use a string that will represent
-		// the type of artifact that failed...
-		List<ASDCElementInfo> artifactListForLogging = new ArrayList<>();
-		try {
-			createToscaCsar(toscaResourceStruct);			
-			Service service = createService(toscaResourceStruct, vfResourceStruct);
-			
-			processResourceSequence(toscaResourceStruct, service);
-			processVFResources(toscaResourceStruct, service, vfResourceStructure);
-			List<NodeTemplate> allottedResourceList = toscaResourceStruct.getSdcCsarHelper().getAllottedResources();
-			processAllottedResources(toscaResourceStruct, service, allottedResourceList);
-			processNetworks(toscaResourceStruct, service);	
-			// process Network Collections
-			processNetworkCollections(toscaResourceStruct, service);
-			// Process Service Proxy & Configuration
-			processServiceProxyAndConfiguration(toscaResourceStruct, service);
-			
-			serviceRepo.save(service);
-			
-			WatchdogComponentDistributionStatus status = new WatchdogComponentDistributionStatus(vfResourceStruct.getNotification().getDistributionID(), MSO);
-			status.setComponentDistributionStatus(DistributionStatusEnum.COMPONENT_DONE_OK.name());
-			watchdogCDStatusRepository.save(status);
+    @Autowired
+    protected AllottedResourceRepository allottedRepo;
 
-			toscaResourceStruct.setSuccessfulDeployment();
+    @Autowired
+    protected AllottedResourceCustomizationRepository allottedCustomizationRepo;
 
-		} catch (Exception e) {
-			logger.debug("Exception :", e);
-			WatchdogComponentDistributionStatus status = new WatchdogComponentDistributionStatus(vfResourceStruct.getNotification().getDistributionID(), MSO);
-			status.setComponentDistributionStatus(DistributionStatusEnum.COMPONENT_DONE_ERROR.name());
-			watchdogCDStatusRepository.save(status);
-			Throwable dbExceptionToCapture = e;
-			while (!(dbExceptionToCapture instanceof ConstraintViolationException
-					|| dbExceptionToCapture instanceof LockAcquisitionException)
-					&& (dbExceptionToCapture.getCause() != null)) {
-				dbExceptionToCapture = dbExceptionToCapture.getCause();
-			}
+    @Autowired
+    protected NetworkResourceRepository networkRepo;
 
-			if (dbExceptionToCapture instanceof ConstraintViolationException
-					|| dbExceptionToCapture instanceof LockAcquisitionException) {
-				logger.warn("{} {} {} {} {}", MessageEnum.ASDC_ARTIFACT_ALREADY_DEPLOYED.toString(),
-					vfResourceStructure.getResourceInstance().getResourceName(),
-					vfResourceStructure.getNotification().getServiceVersion(), ErrorCode.DataError.getValue(),
-					"Exception - ASCDC Artifact already deployed", e);
-			} else {
-				String elementToLog = (!artifactListForLogging.isEmpty()
-						? artifactListForLogging.get(artifactListForLogging.size() - 1).toString()
-						: "No element listed");
-				logger.error("{} {} {} {}", MessageEnum.ASDC_ARTIFACT_INSTALL_EXC.toString(), elementToLog,
-					ErrorCode.DataError.getValue(),
-					"Exception caught during installation of " + vfResourceStructure.getResourceInstance().getResourceName()
-						+ ". Transaction rollback", e);
-				throw new ArtifactInstallerException("Exception caught during installation of "
-						+ vfResourceStructure.getResourceInstance().getResourceName() + ". Transaction rollback.", e);
-			}
-		}
-	}
+    @Autowired
+    protected HeatTemplateRepository heatRepo;
+
+    @Autowired
+    protected NetworkResourceCustomizationRepository networkCustomizationRepo;
+
+    @Autowired
+    protected WatchdogComponentDistributionStatusRepository watchdogCDStatusRepository;
+    @Autowired
+    protected WatchdogDistributionStatusRepository watchdogDistributionStatusRepository;
+    @Autowired
+    protected WatchdogServiceModVerIdLookupRepository watchdogModVerIdLookupRepository;
+
+    @Autowired
+    protected TempNetworkHeatTemplateRepository tempNetworkLookupRepo;
+
+    @Autowired
+    protected ExternalServiceToInternalServiceRepository externalServiceToInternalServiceRepository;
+
+    @Autowired
+    protected PnfResourceRepository pnfResourceRepository;
+
+    @Autowired
+    protected PnfCustomizationRepository pnfCustomizationRepository;
+
+    protected static final Logger logger = LoggerFactory.getLogger(ToscaResourceInstaller.class);
+
+    public boolean isResourceAlreadyDeployed(VfResourceStructure vfResourceStruct) throws ArtifactInstallerException {
+        boolean status = false;
+        VfResourceStructure vfResourceStructure = vfResourceStruct;
+        try {
+            status = vfResourceStructure.isDeployedSuccessfully();
+        } catch (RuntimeException e) {
+            status = false;
+        }
+        try {
+            Service existingService = serviceRepo
+                .findOneByModelUUID(vfResourceStructure.getNotification().getServiceUUID());
+            if (existingService != null) {
+                status = true;
+            }
+            if (status) {
+                logger.info(vfResourceStructure.getResourceInstance().getResourceInstanceName(),
+                    vfResourceStructure.getResourceInstance().getResourceCustomizationUUID(),
+                    vfResourceStructure.getNotification().getServiceName(),
+                    BigDecimalVersion.castAndCheckNotificationVersionToString(
+                        vfResourceStructure.getNotification().getServiceVersion()),
+                    vfResourceStructure.getNotification().getServiceUUID(),
+                    vfResourceStructure.getResourceInstance().getResourceName(), "", "");
+                WatchdogComponentDistributionStatus wdStatus = new WatchdogComponentDistributionStatus(
+                    vfResourceStruct.getNotification().getDistributionID(), MSO);
+                wdStatus.setComponentDistributionStatus(DistributionStatusEnum.COMPONENT_DONE_OK.name());
+                watchdogCDStatusRepository.saveAndFlush(wdStatus);
+            } else {
+                logger.info(vfResourceStructure.getResourceInstance().getResourceInstanceName(),
+                    vfResourceStructure.getResourceInstance().getResourceCustomizationUUID(),
+                    vfResourceStructure.getNotification().getServiceName(),
+                    BigDecimalVersion.castAndCheckNotificationVersionToString(
+                        vfResourceStructure.getNotification().getServiceVersion()),
+                    vfResourceStructure.getNotification().getServiceUUID(),
+                    vfResourceStructure.getResourceInstance().getResourceName(), "", "");
+            }
+            return status;
+        } catch (Exception e) {
+            logger
+                .error("{} {} {}", MessageEnum.ASDC_ARTIFACT_CHECK_EXC.toString(),
+                    ErrorCode.SchemaError.getValue(),
+                    "Exception - isResourceAlreadyDeployed");
+            throw new ArtifactInstallerException("Exception caught during checking existence of the VNF Resource.", e);
+        }
+    }
+
+    public void installTheComponentStatus(IStatusData iStatus) throws ArtifactInstallerException {
+        logger.debug("Entering installTheComponentStatus for distributionId {} and ComponentName {}",
+            iStatus.getDistributionID(), iStatus.getComponentName());
+
+        try {
+            WatchdogComponentDistributionStatus cdStatus = new WatchdogComponentDistributionStatus(
+                iStatus.getDistributionID(),
+                iStatus.getComponentName());
+            cdStatus.setComponentDistributionStatus(iStatus.getStatus().toString());
+            watchdogCDStatusRepository.save(cdStatus);
+
+        } catch (Exception e) {
+            logger.debug("Exception caught in installTheComponentStatus {}", e.getMessage());
+            throw new ArtifactInstallerException("Exception caught in installTheComponentStatus " + e.getMessage());
+        }
+    }
+
+    @Transactional(rollbackFor = {ArtifactInstallerException.class})
+    public void installTheResource(ToscaResourceStructure toscaResourceStruct, ResourceStructure resourceStruct)
+        throws ArtifactInstallerException {
+        if (resourceStruct instanceof VfResourceStructure) {
+            installTheVfResouce(toscaResourceStruct, (VfResourceStructure) resourceStruct);
+        } else if (resourceStruct instanceof PnfResourceStructure) {
+            installPnfResource(toscaResourceStruct, (PnfResourceStructure) resourceStruct);
+        } else {
+            logger.warn("Unrecognized resource type");
+        }
+    }
+
+    private void installPnfResource(ToscaResourceStructure toscaResourceStruct, PnfResourceStructure resourceStruct)
+        throws ArtifactInstallerException {
+
+        // PCLO: in case of deployment failure, use a string that will represent
+        // the type of artifact that failed...
+        List<ASDCElementInfo> artifactListForLogging = new ArrayList<>();
+        try {
+            createToscaCsar(toscaResourceStruct);
+            Service service = createService(toscaResourceStruct, resourceStruct);
+
+            processResourceSequence(toscaResourceStruct, service);
+            processPnfResources(toscaResourceStruct, service, resourceStruct);
+            serviceRepo.save(service);
+
+            WatchdogComponentDistributionStatus status = new WatchdogComponentDistributionStatus(
+                resourceStruct.getNotification().getDistributionID(), MSO);
+            status.setComponentDistributionStatus(DistributionStatusEnum.COMPONENT_DONE_OK.name());
+            watchdogCDStatusRepository.save(status);
+
+            toscaResourceStruct.setSuccessfulDeployment();
+
+        } catch (Exception e) {
+            logger.debug("Exception :", e);
+            WatchdogComponentDistributionStatus status = new WatchdogComponentDistributionStatus(
+                resourceStruct.getNotification().getDistributionID(), MSO);
+            status.setComponentDistributionStatus(DistributionStatusEnum.COMPONENT_DONE_ERROR.name());
+            watchdogCDStatusRepository.save(status);
+            Throwable dbExceptionToCapture = e;
+            while (!(dbExceptionToCapture instanceof ConstraintViolationException
+                || dbExceptionToCapture instanceof LockAcquisitionException)
+                && (dbExceptionToCapture.getCause() != null)) {
+                dbExceptionToCapture = dbExceptionToCapture.getCause();
+            }
+
+            if (dbExceptionToCapture instanceof ConstraintViolationException
+                || dbExceptionToCapture instanceof LockAcquisitionException) {
+                logger.warn("{} {} {} {} {}", MessageEnum.ASDC_ARTIFACT_ALREADY_DEPLOYED.toString(),
+                    resourceStruct.getResourceInstance().getResourceName(),
+                    resourceStruct.getNotification().getServiceVersion(), ErrorCode.DataError.getValue(),
+                    "Exception - ASCDC Artifact already deployed", e);
+            } else {
+                String elementToLog = (!artifactListForLogging.isEmpty()
+                    ? artifactListForLogging.get(artifactListForLogging.size() - 1).toString()
+                    : "No element listed");
+                logger.error("{} {} {} {}", MessageEnum.ASDC_ARTIFACT_INSTALL_EXC.toString(), elementToLog,
+                    ErrorCode.DataError.getValue(),
+                    "Exception caught during installation of " + resourceStruct.getResourceInstance()
+                        .getResourceName()
+                        + ". Transaction rollback", e);
+                throw new ArtifactInstallerException("Exception caught during installation of "
+                    + resourceStruct.getResourceInstance().getResourceName() + ". Transaction rollback.", e);
+            }
+        }
+    }
+
+    private void installTheVfResouce(ToscaResourceStructure toscaResourceStruct, VfResourceStructure resourceStruct)
+        throws ArtifactInstallerException {
+        VfResourceStructure vfResourceStructure = resourceStruct;
+        extractHeatInformation(toscaResourceStruct, vfResourceStructure);
+
+        // PCLO: in case of deployment failure, use a string that will represent
+        // the type of artifact that failed...
+        List<ASDCElementInfo> artifactListForLogging = new ArrayList<>();
+        try {
+            createToscaCsar(toscaResourceStruct);
+            Service service = createService(toscaResourceStruct, resourceStruct);
+
+            processResourceSequence(toscaResourceStruct, service);
+            processVFResources(toscaResourceStruct, service, vfResourceStructure);
+            List<NodeTemplate> allottedResourceList = toscaResourceStruct.getSdcCsarHelper().getAllottedResources();
+            processAllottedResources(toscaResourceStruct, service, allottedResourceList);
+            processNetworks(toscaResourceStruct, service);
+            // process Network Collections
+            processNetworkCollections(toscaResourceStruct, service);
+            // Process Service Proxy & Configuration
+            processServiceProxyAndConfiguration(toscaResourceStruct, service);
+
+            serviceRepo.save(service);
+
+            WatchdogComponentDistributionStatus status = new WatchdogComponentDistributionStatus(
+                resourceStruct.getNotification().getDistributionID(), MSO);
+            status.setComponentDistributionStatus(DistributionStatusEnum.COMPONENT_DONE_OK.name());
+            watchdogCDStatusRepository.save(status);
+
+            toscaResourceStruct.setSuccessfulDeployment();
+
+        } catch (Exception e) {
+            logger.debug("Exception :", e);
+            WatchdogComponentDistributionStatus status = new WatchdogComponentDistributionStatus(
+                resourceStruct.getNotification().getDistributionID(), MSO);
+            status.setComponentDistributionStatus(DistributionStatusEnum.COMPONENT_DONE_ERROR.name());
+            watchdogCDStatusRepository.save(status);
+            Throwable dbExceptionToCapture = e;
+            while (!(dbExceptionToCapture instanceof ConstraintViolationException
+                || dbExceptionToCapture instanceof LockAcquisitionException)
+                && (dbExceptionToCapture.getCause() != null)) {
+                dbExceptionToCapture = dbExceptionToCapture.getCause();
+            }
+
+            if (dbExceptionToCapture instanceof ConstraintViolationException
+                || dbExceptionToCapture instanceof LockAcquisitionException) {
+                logger.warn("{} {} {} {} {}", MessageEnum.ASDC_ARTIFACT_ALREADY_DEPLOYED.toString(),
+                    vfResourceStructure.getResourceInstance().getResourceName(),
+                    vfResourceStructure.getNotification().getServiceVersion(), ErrorCode.DataError.getValue(),
+                    "Exception - ASCDC Artifact already deployed", e);
+            } else {
+                String elementToLog = (!artifactListForLogging.isEmpty()
+                    ? artifactListForLogging.get(artifactListForLogging.size() - 1).toString()
+                    : "No element listed");
+                logger.error("{} {} {} {}", MessageEnum.ASDC_ARTIFACT_INSTALL_EXC.toString(), elementToLog,
+                    ErrorCode.DataError.getValue(),
+                    "Exception caught during installation of " + vfResourceStructure.getResourceInstance()
+                        .getResourceName()
+                        + ". Transaction rollback", e);
+                throw new ArtifactInstallerException("Exception caught during installation of "
+                    + vfResourceStructure.getResourceInstance().getResourceName() + ". Transaction rollback.", e);
+            }
+        }
+    }
 
 
-	List<NodeTemplate> getRequirementList(List<NodeTemplate> resultList, List<NodeTemplate> nodeTemplates,
-														 ISdcCsarHelper iSdcCsarHelper) {
+    List<NodeTemplate> getRequirementList(List<NodeTemplate> resultList, List<NodeTemplate> nodeTemplates,
+        ISdcCsarHelper iSdcCsarHelper) {
 
-		List<NodeTemplate> nodes = new ArrayList<NodeTemplate>();
-		nodes.addAll(nodeTemplates);
+        List<NodeTemplate> nodes = new ArrayList<NodeTemplate>();
+        nodes.addAll(nodeTemplates);
 
-		for (NodeTemplate nodeTemplate : nodeTemplates) {
-			RequirementAssignments requirement = iSdcCsarHelper.getRequirementsOf(nodeTemplate);
-			List<RequirementAssignment> reqAs = requirement.getAll();
-			for (RequirementAssignment ra : reqAs) {
-				String reqNode = ra.getNodeTemplateName();
-				for (NodeTemplate rNode : resultList) {
-					if (rNode.getName().equals(reqNode)) {
-						if(!resultList.contains(nodeTemplate)) {
-							resultList.add(nodeTemplate);
-						}
-						if(nodes.contains(nodeTemplate)) {
-							nodes.remove(nodeTemplate);
-						}
-						break;
-					}
-				}
-			}
-		}
+        for (NodeTemplate nodeTemplate : nodeTemplates) {
+            RequirementAssignments requirement = iSdcCsarHelper.getRequirementsOf(nodeTemplate);
+            List<RequirementAssignment> reqAs = requirement.getAll();
+            for (RequirementAssignment ra : reqAs) {
+                String reqNode = ra.getNodeTemplateName();
+                for (NodeTemplate rNode : resultList) {
+                    if (rNode.getName().equals(reqNode)) {
+                        if (!resultList.contains(nodeTemplate)) {
+                            resultList.add(nodeTemplate);
+                        }
+                        if (nodes.contains(nodeTemplate)) {
+                            nodes.remove(nodeTemplate);
+                        }
+                        break;
+                    }
+                }
+            }
+        }
 
-		if (!nodes.isEmpty()) {
-			getRequirementList(resultList, nodes, iSdcCsarHelper);
-		}
+        if (!nodes.isEmpty()) {
+            getRequirementList(resultList, nodes, iSdcCsarHelper);
+        }
 
-		return resultList;
-	}
+        return resultList;
+    }
 
-	// This method retrieve resource sequence from csar file
-	void processResourceSequence(ToscaResourceStructure toscaResourceStructure, Service service) {
-		List<String> resouceSequence = new ArrayList<String>();
-		List<NodeTemplate> resultList = new ArrayList<NodeTemplate>();
+    // This method retrieve resource sequence from csar file
+    void processResourceSequence(ToscaResourceStructure toscaResourceStructure, Service service) {
+        List<String> resouceSequence = new ArrayList<String>();
+        List<NodeTemplate> resultList = new ArrayList<NodeTemplate>();
 
-		ISdcCsarHelper iSdcCsarHelper = toscaResourceStructure.getSdcCsarHelper();
-		List<NodeTemplate> nodeTemplates = iSdcCsarHelper.getServiceNodeTemplates();
-		List<NodeTemplate> nodes = new ArrayList<NodeTemplate>();
-		nodes.addAll(nodeTemplates);
+        ISdcCsarHelper iSdcCsarHelper = toscaResourceStructure.getSdcCsarHelper();
+        List<NodeTemplate> nodeTemplates = iSdcCsarHelper.getServiceNodeTemplates();
+        List<NodeTemplate> nodes = new ArrayList<NodeTemplate>();
+        nodes.addAll(nodeTemplates);
 
-		for (NodeTemplate nodeTemplate : nodeTemplates) {
-			RequirementAssignments requirement = iSdcCsarHelper.getRequirementsOf(nodeTemplate);
+        for (NodeTemplate nodeTemplate : nodeTemplates) {
+            RequirementAssignments requirement = iSdcCsarHelper.getRequirementsOf(nodeTemplate);
 
-			if (requirement == null || requirement.getAll() == null || requirement.getAll().isEmpty()) {
-				resultList.add(nodeTemplate);
-				nodes.remove(nodeTemplate);
-			}
-		}
+            if (requirement == null || requirement.getAll() == null || requirement.getAll().isEmpty()) {
+                resultList.add(nodeTemplate);
+                nodes.remove(nodeTemplate);
+            }
+        }
 
-		resultList = getRequirementList(resultList, nodes, iSdcCsarHelper);
+        resultList = getRequirementList(resultList, nodes, iSdcCsarHelper);
 
-		for (NodeTemplate node : resultList) {
-			String templateName = node.getMetaData().getValue("name");
-			if (!resouceSequence.contains(templateName)) {
-				resouceSequence.add(templateName);
-			}
-		}
+        for (NodeTemplate node : resultList) {
+            String templateName = node.getMetaData().getValue("name");
+            if (!resouceSequence.contains(templateName)) {
+                resouceSequence.add(templateName);
+            }
+        }
 
-		String resourceSeqStr = resouceSequence.stream().collect(Collectors.joining(","));
-		service.setResourceOrder(resourceSeqStr);
-		logger.debug(" resourceSeq for service uuid(" + service.getModelUUID() + ") : " + resourceSeqStr);
-	}
+        String resourceSeqStr = resouceSequence.stream().collect(Collectors.joining(","));
+        service.setResourceOrder(resourceSeqStr);
+        logger.debug(" resourceSeq for service uuid(" + service.getModelUUID() + ") : " + resourceSeqStr);
+    }
 
-	private static String CUSTOMIZATION_UUID = "customizationUUID";
+    private static String getValue(Object value, List<Input> servInputs) {
+        String output = null;
+        if (value instanceof Map) {
+            // currently this logic handles only one level of nesting.
+            return ((LinkedHashMap) value).values().toArray()[0].toString();
+        } else if (value instanceof GetInput) {
+            String inputName = ((GetInput) value).getInputName();
 
-	private static String getValue(Object value, List<Input> servInputs) {
-		String output = null;
-		if(value instanceof Map) {
-			// currently this logic handles only one level of nesting.
-			return ((LinkedHashMap) value).values().toArray()[0].toString();
-		} else if(value instanceof GetInput) {
-			String inputName = ((GetInput)value).getInputName();
+            for (Input input : servInputs) {
+                if (input.getName().equals(inputName)) {
+                    // keep both input name and default value
+                    // if service input does not supplies value the use default value
+                    String defaultValue = input.getDefault() != null ? (String) input.getDefault().toString() : "";
+                    output = inputName + "|" + defaultValue;// return default value
+                }
+            }
 
-			for(Input input : servInputs) {
-				if(input.getName().equals(inputName)) {
-					// keep both input name and default value
-					// if service input does not supplies value the use default value
-					String defaultValue = input.getDefault() != null ? (String) input.getDefault().toString() : "";
-					output =  inputName + "|" + defaultValue;// return default value
-				}
-			}
+        } else {
+            output = value != null ? value.toString() : "";
+        }
+        return output; // return property value
+    }
 
-		} else {
-			output = value != null ? value.toString() : "";
-		}
-		return output; // return property value
-	}
+    String getResourceInput(ToscaResourceStructure toscaResourceStructure, String resourceCustomizationUuid)
+        throws ArtifactInstallerException {
+        Map<String, String> resouceRequest = new HashMap<>();
+        ISdcCsarHelper iSdcCsarHelper = toscaResourceStructure.getSdcCsarHelper();
 
-	String getResourceInput(ToscaResourceStructure toscaResourceStructure, String resourceCustomizationUuid) throws ArtifactInstallerException {
-		Map<String, String> resouceRequest = new HashMap<>();
-		ISdcCsarHelper iSdcCsarHelper = toscaResourceStructure.getSdcCsarHelper();
+        List<Input> serInput = iSdcCsarHelper.getServiceInputs();
+        Optional<NodeTemplate> nodeTemplateOpt = iSdcCsarHelper.getServiceNodeTemplates().stream()
+            .filter(e -> e.getMetaData().getValue(CUSTOMIZATION_UUID).equals(resourceCustomizationUuid)).findFirst();
+        if (nodeTemplateOpt.isPresent()) {
+            NodeTemplate nodeTemplate = nodeTemplateOpt.get();
+            LinkedHashMap<String, Property> resourceProperties = nodeTemplate.getProperties();
 
-		List<Input> serInput = iSdcCsarHelper.getServiceInputs();
-		Optional<NodeTemplate> nodeTemplateOpt = iSdcCsarHelper.getServiceNodeTemplates().stream()
-				.filter(e -> e.getMetaData().getValue(CUSTOMIZATION_UUID).equals(resourceCustomizationUuid)).findFirst();
-		if(nodeTemplateOpt.isPresent()) {
-			NodeTemplate nodeTemplate = nodeTemplateOpt.get();
-			LinkedHashMap<String, Property> resourceProperties = nodeTemplate.getProperties();
+            for (String key : resourceProperties.keySet()) {
+                Property property = resourceProperties.get(key);
 
-			for(String key : resourceProperties.keySet()) {
-				Property property = resourceProperties.get(key);
+                String value = getValue(property.getValue(), serInput);
+                resouceRequest.put(key, value);
+            }
+        }
 
-				String value = getValue(property.getValue(), serInput);
-				resouceRequest.put(key, value);
-			}
-		}
+        try {
+            ObjectMapper objectMapper = new ObjectMapper();
+            String jsonStr = objectMapper.writeValueAsString(resouceRequest);
 
-		try {
-			ObjectMapper objectMapper = new ObjectMapper();
-			String jsonStr = objectMapper.writeValueAsString(resouceRequest);
+            jsonStr = jsonStr.replace("\"", "\\\"");
+            logger.debug(
+                "resource request for resource customization id (" + resourceCustomizationUuid + ") : " + jsonStr);
+            return jsonStr;
+        } catch (JsonProcessingException e) {
+            logger.error("resource input could not be deserialized for resource customization id ("
+                + resourceCustomizationUuid + ")");
+            throw new ArtifactInstallerException("resource input could not be parsed", e);
+        }
+    }
 
-			jsonStr = jsonStr.replace("\"", "\\\"");
-			logger.debug("resource request for resource customization id (" + resourceCustomizationUuid + ") : " + jsonStr);
-			return jsonStr;
-		} catch (JsonProcessingException e) {
-			logger.error("resource input could not be deserialized for resource customization id ("
-					+ resourceCustomizationUuid + ")");
-			throw new ArtifactInstallerException("resource input could not be parsed", e);
-		}
-	}
+    protected void processNetworks(ToscaResourceStructure toscaResourceStruct,
+        Service service) throws ArtifactInstallerException {
+        List<NodeTemplate> nodeTemplatesVLList = toscaResourceStruct.getSdcCsarHelper().getServiceVlList();
 
-    protected void processNetworks (ToscaResourceStructure toscaResourceStruct,
-                                    Service service) throws ArtifactInstallerException {
-        List <NodeTemplate> nodeTemplatesVLList = toscaResourceStruct.getSdcCsarHelper ().getServiceVlList ();
-
-		if (nodeTemplatesVLList != null) {
-			for (NodeTemplate vlNode : nodeTemplatesVLList) {
-                String networkResourceModelName = vlNode.getMetaData ().getValue (SdcPropertyNames.PROPERTY_NAME_NAME);
+        if (nodeTemplatesVLList != null) {
+            for (NodeTemplate vlNode : nodeTemplatesVLList) {
+                String networkResourceModelName = vlNode.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_NAME);
 
                 TempNetworkHeatTemplateLookup tempNetworkLookUp =
-                                                                tempNetworkLookupRepo.findFirstBynetworkResourceModelName (networkResourceModelName);
+                    tempNetworkLookupRepo.findFirstBynetworkResourceModelName(networkResourceModelName);
 
                 if (tempNetworkLookUp != null) {
                     HeatTemplate heatTemplate =
-                                              heatRepo.findByArtifactUuid (tempNetworkLookUp.getHeatTemplateArtifactUuid ());
+                        heatRepo.findByArtifactUuid(tempNetworkLookUp.getHeatTemplateArtifactUuid());
                     if (heatTemplate != null) {
                         NetworkResourceCustomization networkCustomization =
-                                                                          createNetwork (vlNode,
-                                                                                         toscaResourceStruct,
-                                                                                         heatTemplate,
-                                                                                         tempNetworkLookUp.getAicVersionMax (),
-                                                                                         tempNetworkLookUp.getAicVersionMin (),
-                                                                                         service);
-                        service.getNetworkCustomizations ().add (networkCustomization);
+                            createNetwork(vlNode,
+                                toscaResourceStruct,
+                                heatTemplate,
+                                tempNetworkLookUp.getAicVersionMax(),
+                                tempNetworkLookUp.getAicVersionMin(),
+                                service);
+                        service.getNetworkCustomizations().add(networkCustomization);
                     } else {
-                        throw new ArtifactInstallerException ("No HeatTemplate found for artifactUUID: "
-                                                              + tempNetworkLookUp.getHeatTemplateArtifactUuid ());
-					}
-				} else {
-                    NetworkResourceCustomization networkCustomization = createNetwork (vlNode,
-                                                                                       toscaResourceStruct,
-                                                                                       null,
-                                                                                       null,
-                                                                                       null,
-                                                                                       service);
-                    service.getNetworkCustomizations().add (networkCustomization);
-                    logger.debug ("No NetworkResourceName found in TempNetworkHeatTemplateLookup for "
-									+ networkResourceModelName);
-				}					
-				
-			}
-		}
-	}
+                        throw new ArtifactInstallerException("No HeatTemplate found for artifactUUID: "
+                            + tempNetworkLookUp.getHeatTemplateArtifactUuid());
+                    }
+                } else {
+                    NetworkResourceCustomization networkCustomization = createNetwork(vlNode,
+                        toscaResourceStruct,
+                        null,
+                        null,
+                        null,
+                        service);
+                    service.getNetworkCustomizations().add(networkCustomization);
+                    logger.debug("No NetworkResourceName found in TempNetworkHeatTemplateLookup for "
+                        + networkResourceModelName);
+                }
 
-	protected void processAllottedResources(ToscaResourceStructure toscaResourceStruct, Service service,
-			List<NodeTemplate> allottedResourceList) {
-		if (allottedResourceList != null) {
-			for (NodeTemplate allottedNode : allottedResourceList) {									
-				service.getAllottedCustomizations()
-						.add(createAllottedResource(allottedNode, toscaResourceStruct, service));				
-			}
-		}
-	}
-	
-	
-	protected ConfigurationResource getConfigurationResource(NodeTemplate nodeTemplate) {
-		Metadata metadata = nodeTemplate.getMetaData();
-		ConfigurationResource configResource = new ConfigurationResource();
-		configResource.setModelName(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_NAME));
-		configResource.setModelInvariantUUID(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_INVARIANTUUID));
-		configResource.setModelUUID(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_UUID));
-		configResource.setModelVersion(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_VERSION));
-		configResource.setDescription(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_DESCRIPTION));
-		configResource.setToscaNodeType(nodeTemplate.getType());
-		return configResource;
-	}
-	
-	protected ConfigurationResourceCustomization getConfigurationResourceCustomization(NodeTemplate nodeTemplate, ToscaResourceStructure toscaResourceStructure, 
-			ServiceProxyResourceCustomization spResourceCustomization ) {
-		Metadata metadata = nodeTemplate.getMetaData();
-		
-		ConfigurationResource configResource = getConfigurationResource(nodeTemplate);
-		
-		ConfigurationResourceCustomization configCustomizationResource = new ConfigurationResourceCustomization();
-		
-		Set<ConfigurationResourceCustomization> configResourceCustomizationSet = new HashSet<>();
-		
-		configCustomizationResource.setModelCustomizationUUID(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID));
-		configCustomizationResource.setModelInstanceName(nodeTemplate.getName());
-		
-		configCustomizationResource.setNfFunction(toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(nodeTemplate, SdcPropertyNames.PROPERTY_NAME_NFFUNCTION));
-		configCustomizationResource.setNfRole(toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(nodeTemplate, SdcPropertyNames.PROPERTY_NAME_NFROLE));
-		configCustomizationResource.setNfType(toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(nodeTemplate, SdcPropertyNames.PROPERTY_NAME_NFTYPE));
-	 	configCustomizationResource.setServiceProxyResourceCustomizationUUID(spResourceCustomization.getModelCustomizationUUID());
-	
-	 	configCustomizationResource.setConfigurationResource(configResource);
-		configResourceCustomizationSet.add(configCustomizationResource);
+            }
+        }
+    }
 
-		configResource.setConfigurationResourceCustomization(configResourceCustomizationSet); 	
-		return configCustomizationResource;
-	}
-	
-	
-	protected Optional<ConfigurationResourceCustomization> getVnrNodeTemplate(List<NodeTemplate> configurationNodeTemplatesList,  
-			ToscaResourceStructure toscaResourceStructure, ServiceProxyResourceCustomization spResourceCustomization) {
-		Optional<ConfigurationResourceCustomization> configurationResourceCust = Optional.empty();
-		for (NodeTemplate nodeTemplate : configurationNodeTemplatesList) {
-			StatefulEntityType entityType = nodeTemplate.getTypeDefinition();
-		 	String type = entityType.getType();
-		 	
-		 	if(VLAN_NETWORK_RECEPTOR.equals(type)) {
-		 		configurationResourceCust= Optional.of(getConfigurationResourceCustomization(nodeTemplate, 
-		 				toscaResourceStructure,spResourceCustomization));
-		 		break;
-		 	}
-		}
-		
-		return configurationResourceCust;
-	}
-		
-	protected void processServiceProxyAndConfiguration(ToscaResourceStructure toscaResourceStruct, Service service) {
-		
-		List<NodeTemplate> serviceProxyResourceList = toscaResourceStruct.getSdcCsarHelper().getServiceNodeTemplateBySdcType(SdcTypes.SERVICE_PROXY);
-		
-		List<NodeTemplate> configurationNodeTemplatesList = toscaResourceStruct.getSdcCsarHelper().getServiceNodeTemplateBySdcType(SdcTypes.CONFIGURATION);
-		
-		List<ServiceProxyResourceCustomization> serviceProxyList = new ArrayList<ServiceProxyResourceCustomization>();		
-		List<ConfigurationResourceCustomization> configurationResourceList = new ArrayList<ConfigurationResourceCustomization>();
-		
-		ServiceProxyResourceCustomization serviceProxy = null;
-		
-		if (serviceProxyResourceList != null) {
-			for (NodeTemplate spNode : serviceProxyResourceList) {
-				serviceProxy = createServiceProxy(spNode, service, toscaResourceStruct);								
-				serviceProxyList.add(serviceProxy);
-				Optional<ConfigurationResourceCustomization> vnrResourceCustomization = getVnrNodeTemplate(configurationNodeTemplatesList,toscaResourceStruct,serviceProxy);
-				
-				for (NodeTemplate configNode : configurationNodeTemplatesList) {
-										
-						List<RequirementAssignment> requirementsList = toscaResourceStruct.getSdcCsarHelper().getRequirementsOf(configNode).getAll();
-						for (RequirementAssignment requirement :  requirementsList) {
-							if (requirement.getNodeTemplateName().equals(spNode.getName())) {
-								ConfigurationResourceCustomization configurationResource = createConfiguration(configNode, toscaResourceStruct, serviceProxy, vnrResourceCustomization);
-								
-								Optional<ConfigurationResourceCustomization> matchingObject = configurationResourceList.stream()
-									    .filter(configurationResourceCustomization -> configNode.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID).equals(configurationResource.getModelCustomizationUUID()))
-									    .findFirst();
-								if(!matchingObject.isPresent()){																	
-									configurationResourceList.add(configurationResource);
-								}
-								
-								break;
-							}
-						}
-				}
-	
-			}
-		}
-		
-		service.setConfigurationCustomizations(configurationResourceList);
-		service.setServiceProxyCustomizations(serviceProxyList);
-	}
-	
-	protected void processNetworkCollections(ToscaResourceStructure toscaResourceStruct, Service service) {
-		
-		List<NodeTemplate> networkCollectionList = toscaResourceStruct.getSdcCsarHelper().getServiceNodeTemplateBySdcType(SdcTypes.CR);
-		
-		if (networkCollectionList != null) {
-			for (NodeTemplate crNode : networkCollectionList) {	
-				
-				createNetworkCollection(crNode, toscaResourceStruct, service);
-				collectionRepo.saveAndFlush(toscaResourceStruct.getCatalogCollectionResource());
-				
-				List<NetworkInstanceGroup> networkInstanceGroupList = toscaResourceStruct.getCatalogNetworkInstanceGroup();
-				for(NetworkInstanceGroup networkInstanceGroup : networkInstanceGroupList){
-					instanceGroupRepo.saveAndFlush(networkInstanceGroup);
-				}
-	
-			}
-		}
-		service.getCollectionResourceCustomizations().add(toscaResourceStruct.getCatalogCollectionResourceCustomization());
-	}
+    protected void processAllottedResources(ToscaResourceStructure toscaResourceStruct, Service service,
+        List<NodeTemplate> allottedResourceList) {
+        if (allottedResourceList != null) {
+            for (NodeTemplate allottedNode : allottedResourceList) {
+                service.getAllottedCustomizations()
+                    .add(createAllottedResource(allottedNode, toscaResourceStruct, service));
+            }
+        }
+    }
 
 
-	protected void processVFResources (ToscaResourceStructure toscaResourceStruct, Service service, VfResourceStructure vfResourceStructure)
-			throws Exception{
-		logger.debug("processVFResources");
-		
-		List<NodeTemplate> vfNodeTemplatesList = toscaResourceStruct.getSdcCsarHelper().getServiceVfList();
-//		String servicecategory = toscaResourceStruct.getCatalogService().getCategory();
-//		String serviceType = toscaResourceStruct.getCatalogService().getServiceType();
-		
-		for (NodeTemplate nodeTemplate : vfNodeTemplatesList) {
-			Metadata metadata = nodeTemplate.getMetaData();
-			String vfCustomizationCategory = metadata.getValue(SdcPropertyNames.PROPERTY_NAME_CATEGORY);
-			logger.debug("VF Category is : " + vfCustomizationCategory);
-			
-			// Do not treat Allotted Resources as VNF resources
-			if(ALLOTTED_RESOURCE.equalsIgnoreCase(vfCustomizationCategory)){
-				continue;
-			}
+    protected ConfigurationResource getConfigurationResource(NodeTemplate nodeTemplate) {
+        Metadata metadata = nodeTemplate.getMetaData();
+        ConfigurationResource configResource = new ConfigurationResource();
+        configResource.setModelName(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_NAME));
+        configResource.setModelInvariantUUID(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_INVARIANTUUID));
+        configResource.setModelUUID(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_UUID));
+        configResource.setModelVersion(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_VERSION));
+        configResource.setDescription(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_DESCRIPTION));
+        configResource.setToscaNodeType(nodeTemplate.getType());
+        return configResource;
+    }
 
-			String vfCustomizationUUID = metadata.getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID);
-			logger.debug("VFCustomizationUUID=" + vfCustomizationUUID);
+    protected ConfigurationResourceCustomization getConfigurationResourceCustomization(NodeTemplate nodeTemplate,
+        ToscaResourceStructure toscaResourceStructure,
+        ServiceProxyResourceCustomization spResourceCustomization) {
+        Metadata metadata = nodeTemplate.getMetaData();
 
-			IResourceInstance vfNotificationResource = vfResourceStructure.getResourceInstance();
+        ConfigurationResource configResource = getConfigurationResource(nodeTemplate);
 
-			// Make sure the VF ResourceCustomizationUUID from the notification and tosca
-			// customizations match before comparing their VF Modules UUID's
-			logger.debug("Checking if Notification VF ResourceCustomizationUUID: "
-					+ vfNotificationResource.getResourceCustomizationUUID() + " matches Tosca VF Customization UUID: "
-					+ vfCustomizationUUID);
+        ConfigurationResourceCustomization configCustomizationResource = new ConfigurationResourceCustomization();
 
-			if (vfCustomizationUUID.equals(vfNotificationResource.getResourceCustomizationUUID())) {
-				logger.debug("vfCustomizationUUID: " + vfCustomizationUUID
-						+ " matches vfNotificationResource CustomizationUUID");				
-				
-				processVfModules(toscaResourceStruct, vfResourceStructure, service, nodeTemplate, metadata,
-						vfCustomizationCategory);
-			} else {
-				logger.debug("Notification VF ResourceCustomizationUUID: "
-						+ vfNotificationResource.getResourceCustomizationUUID() + " doesn't match "
-						+ "Tosca VF Customization UUID: " + vfCustomizationUUID);
-			}
-		}
-	}
-	
-	
-	protected void processVfModules(ToscaResourceStructure toscaResourceStruct, VfResourceStructure vfResourceStructure,
-			Service service, NodeTemplate nodeTemplate, Metadata metadata, String vfCustomizationCategory) throws Exception {
-		
-		logger.debug("VF Category is : " + vfCustomizationCategory);
-		
-		if(vfResourceStructure.getVfModuleStructure() != null && !vfResourceStructure.getVfModuleStructure().isEmpty())
-		{
+        Set<ConfigurationResourceCustomization> configResourceCustomizationSet = new HashSet<>();
 
-			String vfCustomizationUUID = toscaResourceStruct.getSdcCsarHelper()
-					.getMetadataPropertyValue(metadata, SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID);
-			logger.debug("VFCustomizationUUID=" + vfCustomizationUUID);	
-			
-			IResourceInstance vfNotificationResource = vfResourceStructure.getResourceInstance();		
-			
-			// Make sure the VF ResourceCustomizationUUID from the notification and tosca customizations match before comparing their VF Modules UUID's
-			logger.debug("Checking if Notification VF ResourceCustomizationUUID: " + vfNotificationResource.getResourceCustomizationUUID() + 
-					           " matches Tosca VF Customization UUID: " +  vfCustomizationUUID);
-			
-			if(vfCustomizationUUID.equals(vfNotificationResource.getResourceCustomizationUUID())){
-				
-				logger.debug("vfCustomizationUUID: " + vfCustomizationUUID + " matches vfNotificationResource CustomizationUUID");
-			
-				VnfResourceCustomization vnfResource = createVnfResource(nodeTemplate, toscaResourceStruct, service);
-				
-				Set<CvnfcCustomization> existingCvnfcSet = new HashSet<CvnfcCustomization>(); 
-				Set<VnfcCustomization> existingVnfcSet = new HashSet<VnfcCustomization>();
-								
-				for (VfModuleStructure vfModuleStructure : vfResourceStructure.getVfModuleStructure()) {
-					
-					logger.debug("vfModuleStructure:" + vfModuleStructure.toString());
-					List<org.onap.sdc.toscaparser.api.Group> vfGroups = toscaResourceStruct
-							.getSdcCsarHelper().getVfModulesByVf(vfCustomizationUUID);
-					IVfModuleData vfMetadata = vfModuleStructure.getVfModuleMetadata();						
-					
-					logger.debug("Comparing Vf_Modules_Metadata CustomizationUUID : " + vfMetadata.getVfModuleModelCustomizationUUID());
-					
-					Optional<org.onap.sdc.toscaparser.api.Group> matchingObject = vfGroups.stream()
-							.peek(group -> logger.debug("To Csar Group VFModuleModelCustomizationUUID " + group.getMetadata().getValue("vfModuleModelCustomizationUUID")))
-						    .filter(group -> group.getMetadata().getValue("vfModuleModelCustomizationUUID").equals(vfMetadata.getVfModuleModelCustomizationUUID()))
-						    .findFirst();
-					if(matchingObject.isPresent()){
-						VfModuleCustomization vfModuleCustomization = createVFModuleResource(matchingObject.get(), nodeTemplate, toscaResourceStruct, 
-																							 vfResourceStructure,vfMetadata, vnfResource, service, existingCvnfcSet, existingVnfcSet);
-						vfModuleCustomization.getVfModule().setVnfResources(vnfResource.getVnfResources());
-					}else
-						throw new Exception("Cannot find matching VFModule Customization in Csar for Vf_Modules_Metadata: " + vfMetadata.getVfModuleModelCustomizationUUID());
-					
-				}
-				service.getVnfCustomizations().add(vnfResource);
-			} else{
-				logger.debug("Notification VF ResourceCustomizationUUID: " + vfNotificationResource.getResourceCustomizationUUID() + " doesn't match " +
-						     "Tosca VF Customization UUID: " +  vfCustomizationUUID);
-			}
-		}
-	}
+        configCustomizationResource
+            .setModelCustomizationUUID(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID));
+        configCustomizationResource.setModelInstanceName(nodeTemplate.getName());
 
-	public void processWatchdog(String distributionId, String servideUUID, Optional<String> distributionNotification,
-			String consumerId) {
-		WatchdogServiceModVerIdLookup modVerIdLookup = new WatchdogServiceModVerIdLookup(distributionId, servideUUID,
-				distributionNotification, consumerId);
-		watchdogModVerIdLookupRepository.saveAndFlush(modVerIdLookup);
-		
-		try{
-		
-			WatchdogDistributionStatus distributionStatus = new WatchdogDistributionStatus(distributionId);
-			watchdogDistributionStatusRepository.saveAndFlush(distributionStatus);
-			
-		} catch(ObjectOptimisticLockingFailureException e){
-			logger.debug("ObjectOptimisticLockingFailureException in processWatchdog : " + e.toString());
-			throw e;
-		}
-	}
-	
-	protected void extractHeatInformation(ToscaResourceStructure toscaResourceStruct,
-			VfResourceStructure vfResourceStructure) {
-		for (VfModuleArtifact vfModuleArtifact : vfResourceStructure.getArtifactsMapByUUID().values()) {
+        configCustomizationResource.setNfFunction(toscaResourceStructure.getSdcCsarHelper()
+            .getNodeTemplatePropertyLeafValue(nodeTemplate, SdcPropertyNames.PROPERTY_NAME_NFFUNCTION));
+        configCustomizationResource.setNfRole(toscaResourceStructure.getSdcCsarHelper()
+            .getNodeTemplatePropertyLeafValue(nodeTemplate, SdcPropertyNames.PROPERTY_NAME_NFROLE));
+        configCustomizationResource.setNfType(toscaResourceStructure.getSdcCsarHelper()
+            .getNodeTemplatePropertyLeafValue(nodeTemplate, SdcPropertyNames.PROPERTY_NAME_NFTYPE));
+        configCustomizationResource
+            .setServiceProxyResourceCustomizationUUID(spResourceCustomization.getModelCustomizationUUID());
 
-			switch (vfModuleArtifact.getArtifactInfo().getArtifactType()) {
-			case ASDCConfiguration.HEAT:
-			case ASDCConfiguration.HEAT_NESTED:
-				createHeatTemplateFromArtifact(vfResourceStructure, toscaResourceStruct,
-						vfModuleArtifact);
-				break;
-			case ASDCConfiguration.HEAT_VOL:
-				createHeatTemplateFromArtifact(vfResourceStructure, toscaResourceStruct,
-						vfModuleArtifact);
-				VfModuleArtifact envModuleArtifact = getHeatEnvArtifactFromGeneratedArtifact(vfResourceStructure, vfModuleArtifact);
-				createHeatEnvFromArtifact(vfResourceStructure, envModuleArtifact);
-				break;
-			case ASDCConfiguration.HEAT_ENV:
-				createHeatEnvFromArtifact(vfResourceStructure, vfModuleArtifact);
-				break;
-			case ASDCConfiguration.HEAT_ARTIFACT:
-				createHeatFileFromArtifact(vfResourceStructure, vfModuleArtifact,
-						toscaResourceStruct);
-				break;
-			case ASDCConfiguration.HEAT_NET:
-			case ASDCConfiguration.OTHER:
-				logger.warn("{} {} {} {}", MessageEnum.ASDC_ARTIFACT_TYPE_NOT_SUPPORT.toString(),
-					vfModuleArtifact.getArtifactInfo().getArtifactType() + "(Artifact Name:" + vfModuleArtifact.getArtifactInfo()
-						.getArtifactName() + ")", ErrorCode.DataError.getValue(), "Artifact type not supported");
-				break;
-			default:
-				break;
+        configCustomizationResource.setConfigurationResource(configResource);
+        configResourceCustomizationSet.add(configCustomizationResource);
 
-			}
-		}
-	}
+        configResource.setConfigurationResourceCustomization(configResourceCustomizationSet);
+        return configCustomizationResource;
+    }
 
-	protected VfModuleArtifact getHeatEnvArtifactFromGeneratedArtifact(VfResourceStructure vfResourceStructure,
-			VfModuleArtifact vfModuleArtifact) {
-		String artifactName = vfModuleArtifact.getArtifactInfo().getArtifactName();
-		artifactName = artifactName.substring(0, artifactName.indexOf('.'));
-		for (VfModuleArtifact moduleArtifact : vfResourceStructure.getArtifactsMapByUUID().values()) {
-			if (moduleArtifact.getArtifactInfo().getArtifactName().contains(artifactName)
-					&& moduleArtifact.getArtifactInfo().getArtifactType().equals(ASDCConfiguration.HEAT_ENV)) {
-				return moduleArtifact;
-			}
-		}
-		return null;
-	}
 
-	public String verifyTheFilePrefixInArtifacts(String filebody, VfResourceStructure vfResourceStructure,
-			List<String> listTypes) {
-		String newFileBody = filebody;
-		for (VfModuleArtifact moduleArtifact : vfResourceStructure.getArtifactsMapByUUID().values()) {
+    protected Optional<ConfigurationResourceCustomization> getVnrNodeTemplate(
+        List<NodeTemplate> configurationNodeTemplatesList,
+        ToscaResourceStructure toscaResourceStructure, ServiceProxyResourceCustomization spResourceCustomization) {
+        Optional<ConfigurationResourceCustomization> configurationResourceCust = Optional.empty();
+        for (NodeTemplate nodeTemplate : configurationNodeTemplatesList) {
+            StatefulEntityType entityType = nodeTemplate.getTypeDefinition();
+            String type = entityType.getType();
 
-			if (listTypes.contains(moduleArtifact.getArtifactInfo().getArtifactType())) {
+            if (VLAN_NETWORK_RECEPTOR.equals(type)) {
+                configurationResourceCust = Optional.of(getConfigurationResourceCustomization(nodeTemplate,
+                    toscaResourceStructure, spResourceCustomization));
+                break;
+            }
+        }
 
-				newFileBody = verifyTheFilePrefixInString(newFileBody,
-						moduleArtifact.getArtifactInfo().getArtifactName());
-			}
-		}
-		return newFileBody;
-	}
+        return configurationResourceCust;
+    }
 
-	public String verifyTheFilePrefixInString(final String body, final String filenameToVerify) {
+    protected void processServiceProxyAndConfiguration(ToscaResourceStructure toscaResourceStruct, Service service) {
 
-		String needlePrefix = "file:///";
-		String prefixedFilenameToVerify = needlePrefix + filenameToVerify;
+        List<NodeTemplate> serviceProxyResourceList = toscaResourceStruct.getSdcCsarHelper()
+            .getServiceNodeTemplateBySdcType(SdcTypes.SERVICE_PROXY);
 
-		if ((body == null) || (body.length() == 0) || (filenameToVerify == null) || (filenameToVerify.length() == 0)) {
-			return body;
-		}
+        List<NodeTemplate> configurationNodeTemplatesList = toscaResourceStruct.getSdcCsarHelper()
+            .getServiceNodeTemplateBySdcType(SdcTypes.CONFIGURATION);
 
-		StringBuilder sb = new StringBuilder(body.length());
+        List<ServiceProxyResourceCustomization> serviceProxyList = new ArrayList<ServiceProxyResourceCustomization>();
+        List<ConfigurationResourceCustomization> configurationResourceList = new ArrayList<ConfigurationResourceCustomization>();
 
-		int currentIndex = 0;
-		int startIndex = 0;
+        ServiceProxyResourceCustomization serviceProxy = null;
 
-		while (currentIndex != -1) {
-			startIndex = currentIndex;
-			currentIndex = body.indexOf(prefixedFilenameToVerify, startIndex);
+        if (serviceProxyResourceList != null) {
+            for (NodeTemplate spNode : serviceProxyResourceList) {
+                serviceProxy = createServiceProxy(spNode, service, toscaResourceStruct);
+                serviceProxyList.add(serviceProxy);
+                Optional<ConfigurationResourceCustomization> vnrResourceCustomization = getVnrNodeTemplate(
+                    configurationNodeTemplatesList, toscaResourceStruct, serviceProxy);
 
-			if (currentIndex == -1) {
-				break;
-			}
-			// We append from the startIndex up to currentIndex (start of File
-			// Name)
-			sb.append(body.substring(startIndex, currentIndex));
-			sb.append(filenameToVerify);
+                for (NodeTemplate configNode : configurationNodeTemplatesList) {
 
-			currentIndex += prefixedFilenameToVerify.length();
-		}
+                    List<RequirementAssignment> requirementsList = toscaResourceStruct.getSdcCsarHelper()
+                        .getRequirementsOf(configNode).getAll();
+                    for (RequirementAssignment requirement : requirementsList) {
+                        if (requirement.getNodeTemplateName().equals(spNode.getName())) {
+                            ConfigurationResourceCustomization configurationResource = createConfiguration(configNode,
+                                toscaResourceStruct, serviceProxy, vnrResourceCustomization);
 
-		sb.append(body.substring(startIndex));
+                            Optional<ConfigurationResourceCustomization> matchingObject = configurationResourceList
+                                .stream()
+                                .filter(configurationResourceCustomization -> configNode.getMetaData()
+                                    .getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID)
+                                    .equals(configurationResource.getModelCustomizationUUID()))
+                                .findFirst();
+                            if (!matchingObject.isPresent()) {
+                                configurationResourceList.add(configurationResource);
+                            }
 
-		return sb.toString();
-	}
+                            break;
+                        }
+                    }
+                }
 
-	protected void createHeatTemplateFromArtifact(VfResourceStructure vfResourceStructure,
-			ToscaResourceStructure toscaResourceStruct, VfModuleArtifact vfModuleArtifact) {
-		HeatTemplate heatTemplate = new HeatTemplate();
-		List<String> typeList = new ArrayList<>();
-		typeList.add(ASDCConfiguration.HEAT_NESTED);
-		typeList.add(ASDCConfiguration.HEAT_ARTIFACT);
+            }
+        }
 
-		heatTemplate.setTemplateBody(
-				verifyTheFilePrefixInArtifacts(vfModuleArtifact.getResult(), vfResourceStructure, typeList));
-		heatTemplate.setTemplateName(vfModuleArtifact.getArtifactInfo().getArtifactName());
+        service.setConfigurationCustomizations(configurationResourceList);
+        service.setServiceProxyCustomizations(serviceProxyList);
+    }
+
+    protected void processNetworkCollections(ToscaResourceStructure toscaResourceStruct, Service service) {
+
+        List<NodeTemplate> networkCollectionList = toscaResourceStruct.getSdcCsarHelper()
+            .getServiceNodeTemplateBySdcType(SdcTypes.CR);
+
+        if (networkCollectionList != null) {
+            for (NodeTemplate crNode : networkCollectionList) {
+
+                createNetworkCollection(crNode, toscaResourceStruct, service);
+                collectionRepo.saveAndFlush(toscaResourceStruct.getCatalogCollectionResource());
+
+                List<NetworkInstanceGroup> networkInstanceGroupList = toscaResourceStruct
+                    .getCatalogNetworkInstanceGroup();
+                for (NetworkInstanceGroup networkInstanceGroup : networkInstanceGroupList) {
+                    instanceGroupRepo.saveAndFlush(networkInstanceGroup);
+                }
+
+            }
+        }
+        service.getCollectionResourceCustomizations()
+            .add(toscaResourceStruct.getCatalogCollectionResourceCustomization());
+    }
+
+
+    protected void processVFResources(ToscaResourceStructure toscaResourceStruct, Service service,
+        VfResourceStructure vfResourceStructure)
+        throws Exception {
+        logger.debug("processVFResources");
+
+        List<NodeTemplate> vfNodeTemplatesList = toscaResourceStruct.getSdcCsarHelper().getServiceVfList();
+
+        for (NodeTemplate nodeTemplate : vfNodeTemplatesList) {
+            Metadata metadata = nodeTemplate.getMetaData();
+            String vfCustomizationCategory = metadata.getValue(SdcPropertyNames.PROPERTY_NAME_CATEGORY);
+            logger.debug("VF Category is : " + vfCustomizationCategory);
+
+            // Do not treat Allotted Resources as VNF resources
+            if (ALLOTTED_RESOURCE.equalsIgnoreCase(vfCustomizationCategory)) {
+                continue;
+            }
+
+            String vfCustomizationUUID = metadata.getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID);
+            logger.debug("VFCustomizationUUID=" + vfCustomizationUUID);
+
+            IResourceInstance vfNotificationResource = vfResourceStructure.getResourceInstance();
+
+            // Make sure the VF ResourceCustomizationUUID from the notification and tosca
+            // customizations match before comparing their VF Modules UUID's
+            logger.debug("Checking if Notification VF ResourceCustomizationUUID: "
+                + vfNotificationResource.getResourceCustomizationUUID() + " matches Tosca VF Customization UUID: "
+                + vfCustomizationUUID);
+
+            if (vfCustomizationUUID.equals(vfNotificationResource.getResourceCustomizationUUID())) {
+                logger.debug("vfCustomizationUUID: " + vfCustomizationUUID
+                    + " matches vfNotificationResource CustomizationUUID");
+
+                processVfModules(toscaResourceStruct, vfResourceStructure, service, nodeTemplate, metadata,
+                    vfCustomizationCategory);
+            } else {
+                logger.debug("Notification VF ResourceCustomizationUUID: "
+                    + vfNotificationResource.getResourceCustomizationUUID() + " doesn't match "
+                    + "Tosca VF Customization UUID: " + vfCustomizationUUID);
+            }
+        }
+    }
+
+    /**
+     * This is used to process the PNF specific resource, including resource and resource_customization. {@link
+     * IEntityDetails} based API is used to retrieve information. Please check {@link ISdcCsarHelper} for details.
+     */
+    protected void processPnfResources(ToscaResourceStructure toscaResourceStruct, Service service,
+        PnfResourceStructure resourceStructure) throws Exception {
+        logger.info("Processing PNF resource: {}", resourceStructure.getResourceInstance().getResourceUUID());
+
+        ISdcCsarHelper sdcCsarHelper = toscaResourceStruct.getSdcCsarHelper();
+        EntityQuery entityQuery = EntityQuery.newBuilder(SdcTypes.PNF).build();
+        TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.SERVICE).build();
+
+        List<IEntityDetails> entityDetailsList = sdcCsarHelper.getEntity(entityQuery, topologyTemplateQuery, false);
+        for (IEntityDetails entityDetails : entityDetailsList) {
+            Metadata metadata = entityDetails.getMetadata();
+            String customizationUUID = metadata.getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID);
+            String modelUuid = metadata.getValue(SdcPropertyNames.PROPERTY_NAME_UUID);
+            String notifCustomizationUUID = resourceStructure.getResourceInstance().getResourceCustomizationUUID();
+            if (customizationUUID != null && customizationUUID.equals(notifCustomizationUUID)) {
+                logger.info("Resource customization UUID: {} is the same as notified resource customizationUUID: {}",
+                    customizationUUID, notifCustomizationUUID);
+
+                if (checkExistingPnfResourceCutomization(customizationUUID)) {
+                    logger.info("Resource customization UUID: {} already deployed", customizationUUID);
+                } else {
+                    PnfResource pnfResource = findExistingPnfResource(service, modelUuid);
+                    if (pnfResource == null) {
+                        pnfResource = createPnfResource(entityDetails);
+                    }
+                    PnfResourceCustomization pnfResourceCustomization = createPnfResourceCustomization(entityDetails,
+                        pnfResource);
+                    pnfResource.getPnfResourceCustomizations().add(pnfResourceCustomization);
+                    toscaResourceStruct.setPnfResourceCustomization(pnfResourceCustomization);
+                    service.getPnfCustomizations().add(pnfResourceCustomization);
+                }
+            } else {
+                logger
+                    .warn("Resource customization UUID: {} is NOT the same as notified resource customizationUUID: {}",
+                        customizationUUID, notifCustomizationUUID);
+            }
+        }
+    }
+
+    private PnfResource findExistingPnfResource(Service service, String modelUuid) {
+        PnfResource pnfResource = null;
+        for (PnfResourceCustomization pnfResourceCustomization : service.getPnfCustomizations()) {
+            if (pnfResourceCustomization.getPnfResources() != null && pnfResourceCustomization.getPnfResources()
+                .getModelUUID().equals(modelUuid)) {
+                pnfResource = pnfResourceCustomization.getPnfResources();
+            }
+        }
+        if (pnfResource == null) {
+            pnfResource = pnfResourceRepository.findById(modelUuid).orElse(pnfResource);
+        }
+        return pnfResource;
+    }
+
+    private boolean checkExistingPnfResourceCutomization(String customizationUUID) {
+        return pnfCustomizationRepository.findById(customizationUUID).isPresent();
+    }
+
+    /**
+     * Construct the {@link PnfResource} from {@link IEntityDetails} object.
+     */
+    private PnfResource createPnfResource(IEntityDetails entity) {
+        PnfResource pnfResource = new PnfResource();
+        Metadata metadata = entity.getMetadata();
+        pnfResource.setModelInvariantUUID(
+            testNull(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_INVARIANTUUID)));
+        pnfResource.setModelName(testNull(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_NAME)));
+        pnfResource.setModelUUID(testNull(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_UUID)));
+        pnfResource.setModelVersion(
+            testNull(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_VERSION)));
+        pnfResource.setDescription(
+            testNull(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_DESCRIPTION)));
+        pnfResource.setCategory(testNull(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_CATEGORY)));
+        pnfResource.setSubCategory(testNull(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_SUBCATEGORY)));
+        pnfResource.setToscaNodeType(entity.getToscaType());
+        return pnfResource;
+    }
+
+    /**
+     * Construct the {@link PnfResourceCustomization} from {@link IEntityDetails} object.
+     */
+    private PnfResourceCustomization createPnfResourceCustomization(IEntityDetails entityDetails,
+        PnfResource pnfResource) {
+
+        PnfResourceCustomization pnfResourceCustomization = new PnfResourceCustomization();
+        Metadata metadata = entityDetails.getMetadata();
+        Map<String, Property> properties = entityDetails.getProperties();
+        pnfResourceCustomization
+            .setModelCustomizationUUID(testNull(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID)));
+        pnfResourceCustomization.setModelInstanceName(entityDetails.getName());
+        pnfResourceCustomization
+            .setNfFunction(getStringValue(properties.get(SdcPropertyNames.PROPERTY_NAME_NFFUNCTION)));
+        pnfResourceCustomization.setNfNamingCode(getStringValue(properties.get(SdcPropertyNames.PROPERTY_NAME_NFCODE)));
+        pnfResourceCustomization.setNfRole(getStringValue(properties.get(SdcPropertyNames.PROPERTY_NAME_NFROLE)));
+        pnfResourceCustomization.setNfType(getStringValue(properties.get(SdcPropertyNames.PROPERTY_NAME_NFTYPE)));
+        pnfResourceCustomization.setMultiStageDesign(getStringValue(properties.get(MULTI_STAGE_DESIGN)));
+        pnfResourceCustomization.setBlueprintName(getStringValue(properties.get(SDNC_MODEL_NAME)));
+        pnfResourceCustomization.setBlueprintVersion(getStringValue(properties.get(SDNC_MODEL_VERSION)));
+
+        pnfResourceCustomization.setPnfResources(pnfResource);
+
+        return pnfResourceCustomization;
+    }
+
+    /**
+     * Get value from {@link Property} and cast to String value. Return empty String if property is null value.
+     */
+    private String getStringValue(Property property) {
+        if (null == property) {
+            return "";
+        }
+        Object value = property.getValue();
+        return String.valueOf(value);
+    }
+
+    protected void processVfModules(ToscaResourceStructure toscaResourceStruct, VfResourceStructure vfResourceStructure,
+        Service service, NodeTemplate nodeTemplate, Metadata metadata, String vfCustomizationCategory)
+        throws Exception {
+
+        logger.debug("VF Category is : " + vfCustomizationCategory);
+
+        VnfResourceCustomization vnfResource = createVnfResource(nodeTemplate, toscaResourceStruct, service);
+
+        if (vfResourceStructure.getVfModuleStructure() != null && !vfResourceStructure.getVfModuleStructure()
+            .isEmpty()) {
+
+            String vfCustomizationUUID = toscaResourceStruct.getSdcCsarHelper()
+                .getMetadataPropertyValue(metadata, SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID);
+            logger.debug("VFCustomizationUUID=" + vfCustomizationUUID);
+
+            IResourceInstance vfNotificationResource = vfResourceStructure.getResourceInstance();
+
+            // Make sure the VF ResourceCustomizationUUID from the notification and tosca customizations match before comparing their VF Modules UUID's
+            logger.debug("Checking if Notification VF ResourceCustomizationUUID: " + vfNotificationResource
+                .getResourceCustomizationUUID() +
+                " matches Tosca VF Customization UUID: " + vfCustomizationUUID);
+
+            if (vfCustomizationUUID.equals(vfNotificationResource.getResourceCustomizationUUID())) {
+
+                logger.debug("vfCustomizationUUID: " + vfCustomizationUUID
+                    + " matches vfNotificationResource CustomizationUUID");
+
+                Set<CvnfcCustomization> existingCvnfcSet = new HashSet<CvnfcCustomization>();
+                Set<VnfcCustomization> existingVnfcSet = new HashSet<VnfcCustomization>();
+
+                for (VfModuleStructure vfModuleStructure : vfResourceStructure.getVfModuleStructure()) {
+
+                    logger.debug("vfModuleStructure:" + vfModuleStructure.toString());
+                    List<org.onap.sdc.toscaparser.api.Group> vfGroups = toscaResourceStruct
+                        .getSdcCsarHelper().getVfModulesByVf(vfCustomizationUUID);
+                    IVfModuleData vfMetadata = vfModuleStructure.getVfModuleMetadata();
+
+                    logger.debug("Comparing Vf_Modules_Metadata CustomizationUUID : " + vfMetadata
+                        .getVfModuleModelCustomizationUUID());
+
+                    Optional<org.onap.sdc.toscaparser.api.Group> matchingObject = vfGroups.stream()
+                        .peek(group -> logger.debug(
+                            "To Csar Group VFModuleModelCustomizationUUID " + group.getMetadata()
+                                .getValue("vfModuleModelCustomizationUUID")))
+                        .filter(group -> group.getMetadata().getValue("vfModuleModelCustomizationUUID")
+                            .equals(vfMetadata.getVfModuleModelCustomizationUUID()))
+                        .findFirst();
+                    if (matchingObject.isPresent()) {
+                        VfModuleCustomization vfModuleCustomization = createVFModuleResource(matchingObject.get(),
+                            nodeTemplate, toscaResourceStruct,
+                            vfResourceStructure, vfMetadata, vnfResource, service, existingCvnfcSet, existingVnfcSet);
+                        vfModuleCustomization.getVfModule().setVnfResources(vnfResource.getVnfResources());
+                    } else {
+                        throw new Exception(
+                            "Cannot find matching VFModule Customization in Csar for Vf_Modules_Metadata: " + vfMetadata
+                                .getVfModuleModelCustomizationUUID());
+                    }
+
+                }
+
+            } else {
+                logger.debug("Notification VF ResourceCustomizationUUID: " + vfNotificationResource
+                    .getResourceCustomizationUUID() + " doesn't match " +
+                    "Tosca VF Customization UUID: " + vfCustomizationUUID);
+            }
+        }
+
+        service.getVnfCustomizations().add(vnfResource);
+    }
+
+    public void processWatchdog(String distributionId, String servideUUID, Optional<String> distributionNotification,
+        String consumerId) {
+        WatchdogServiceModVerIdLookup modVerIdLookup = new WatchdogServiceModVerIdLookup(distributionId, servideUUID,
+            distributionNotification, consumerId);
+        watchdogModVerIdLookupRepository.saveAndFlush(modVerIdLookup);
+
+        try {
+
+            WatchdogDistributionStatus distributionStatus = new WatchdogDistributionStatus(distributionId);
+            watchdogDistributionStatusRepository.saveAndFlush(distributionStatus);
+
+        } catch (ObjectOptimisticLockingFailureException e) {
+            logger.debug("ObjectOptimisticLockingFailureException in processWatchdog : " + e.toString());
+            throw e;
+        }
+    }
+
+    protected void extractHeatInformation(ToscaResourceStructure toscaResourceStruct,
+        VfResourceStructure vfResourceStructure) {
+        for (VfModuleArtifact vfModuleArtifact : vfResourceStructure.getArtifactsMapByUUID().values()) {
+
+            switch (vfModuleArtifact.getArtifactInfo().getArtifactType()) {
+                case ASDCConfiguration.HEAT:
+                case ASDCConfiguration.HEAT_NESTED:
+                    createHeatTemplateFromArtifact(vfResourceStructure, toscaResourceStruct,
+                        vfModuleArtifact);
+                    break;
+                case ASDCConfiguration.HEAT_VOL:
+                    createHeatTemplateFromArtifact(vfResourceStructure, toscaResourceStruct,
+                        vfModuleArtifact);
+                    VfModuleArtifact envModuleArtifact = getHeatEnvArtifactFromGeneratedArtifact(vfResourceStructure,
+                        vfModuleArtifact);
+                    createHeatEnvFromArtifact(vfResourceStructure, envModuleArtifact);
+                    break;
+                case ASDCConfiguration.HEAT_ENV:
+                    createHeatEnvFromArtifact(vfResourceStructure, vfModuleArtifact);
+                    break;
+                case ASDCConfiguration.HEAT_ARTIFACT:
+                    createHeatFileFromArtifact(vfResourceStructure, vfModuleArtifact,
+                        toscaResourceStruct);
+                    break;
+                case ASDCConfiguration.HEAT_NET:
+                case ASDCConfiguration.OTHER:
+                    logger.warn("{} {} {} {}", MessageEnum.ASDC_ARTIFACT_TYPE_NOT_SUPPORT.toString(),
+                        vfModuleArtifact.getArtifactInfo().getArtifactType() + "(Artifact Name:" + vfModuleArtifact
+                            .getArtifactInfo()
+                            .getArtifactName() + ")", ErrorCode.DataError.getValue(),
+                        "Artifact type not supported");
+                    break;
+                default:
+                    break;
+
+            }
+        }
+    }
+
+    protected VfModuleArtifact getHeatEnvArtifactFromGeneratedArtifact(VfResourceStructure vfResourceStructure,
+        VfModuleArtifact vfModuleArtifact) {
+        String artifactName = vfModuleArtifact.getArtifactInfo().getArtifactName();
+        artifactName = artifactName.substring(0, artifactName.indexOf('.'));
+        for (VfModuleArtifact moduleArtifact : vfResourceStructure.getArtifactsMapByUUID().values()) {
+            if (moduleArtifact.getArtifactInfo().getArtifactName().contains(artifactName)
+                && moduleArtifact.getArtifactInfo().getArtifactType().equals(ASDCConfiguration.HEAT_ENV)) {
+                return moduleArtifact;
+            }
+        }
+        return null;
+    }
+
+    public String verifyTheFilePrefixInArtifacts(String filebody, VfResourceStructure vfResourceStructure,
+        List<String> listTypes) {
+        String newFileBody = filebody;
+        for (VfModuleArtifact moduleArtifact : vfResourceStructure.getArtifactsMapByUUID().values()) {
+
+            if (listTypes.contains(moduleArtifact.getArtifactInfo().getArtifactType())) {
+
+                newFileBody = verifyTheFilePrefixInString(newFileBody,
+                    moduleArtifact.getArtifactInfo().getArtifactName());
+            }
+        }
+        return newFileBody;
+    }
+
+    public String verifyTheFilePrefixInString(final String body, final String filenameToVerify) {
+
+        String needlePrefix = "file:///";
+        String prefixedFilenameToVerify = needlePrefix + filenameToVerify;
+
+        if ((body == null) || (body.length() == 0) || (filenameToVerify == null) || (filenameToVerify.length() == 0)) {
+            return body;
+        }
+
+        StringBuilder sb = new StringBuilder(body.length());
+
+        int currentIndex = 0;
+        int startIndex = 0;
+
+        while (currentIndex != -1) {
+            startIndex = currentIndex;
+            currentIndex = body.indexOf(prefixedFilenameToVerify, startIndex);
+
+            if (currentIndex == -1) {
+                break;
+            }
+            // We append from the startIndex up to currentIndex (start of File
+            // Name)
+            sb.append(body.substring(startIndex, currentIndex));
+            sb.append(filenameToVerify);
+
+            currentIndex += prefixedFilenameToVerify.length();
+        }
+
+        sb.append(body.substring(startIndex));
+
+        return sb.toString();
+    }
+
+    protected void createHeatTemplateFromArtifact(VfResourceStructure vfResourceStructure,
+        ToscaResourceStructure toscaResourceStruct, VfModuleArtifact vfModuleArtifact) {
+        HeatTemplate heatTemplate = new HeatTemplate();
+        List<String> typeList = new ArrayList<>();
+        typeList.add(ASDCConfiguration.HEAT_NESTED);
+        typeList.add(ASDCConfiguration.HEAT_ARTIFACT);
+
+        heatTemplate.setTemplateBody(
+            verifyTheFilePrefixInArtifacts(vfModuleArtifact.getResult(), vfResourceStructure, typeList));
+        heatTemplate.setTemplateName(vfModuleArtifact.getArtifactInfo().getArtifactName());
+
+        if (vfModuleArtifact.getArtifactInfo().getArtifactTimeout() != null) {
+            heatTemplate.setTimeoutMinutes(vfModuleArtifact.getArtifactInfo().getArtifactTimeout());
+        } else {
+            heatTemplate.setTimeoutMinutes(240);
+        }
+
+        heatTemplate.setDescription(vfModuleArtifact.getArtifactInfo().getArtifactDescription());
+        heatTemplate.setVersion(BigDecimalVersion
+            .castAndCheckNotificationVersionToString(vfModuleArtifact.getArtifactInfo().getArtifactVersion()));
+        heatTemplate.setArtifactUuid(vfModuleArtifact.getArtifactInfo().getArtifactUUID());
+
+        if (vfModuleArtifact.getArtifactInfo().getArtifactChecksum() != null) {
+            heatTemplate.setArtifactChecksum(vfModuleArtifact.getArtifactInfo().getArtifactChecksum());
+        } else {
+            heatTemplate.setArtifactChecksum(MANUAL_RECORD);
+        }
+
+        Set<HeatTemplateParam> heatParam = extractHeatTemplateParameters(
+            vfModuleArtifact.getResult(), vfModuleArtifact.getArtifactInfo().getArtifactUUID());
+        heatTemplate.setParameters(heatParam);
+        vfModuleArtifact.setHeatTemplate(heatTemplate);
+    }
+
+    protected void createHeatEnvFromArtifact(VfResourceStructure vfResourceStructure,
+        VfModuleArtifact vfModuleArtifact) {
+        HeatEnvironment heatEnvironment = new HeatEnvironment();
+        heatEnvironment.setName(vfModuleArtifact.getArtifactInfo().getArtifactName());
+        List<String> typeList = new ArrayList<>();
+        typeList.add(ASDCConfiguration.HEAT);
+        typeList.add(ASDCConfiguration.HEAT_VOL);
+        heatEnvironment.setEnvironment(
+            verifyTheFilePrefixInArtifacts(vfModuleArtifact.getResult(), vfResourceStructure, typeList));
+        heatEnvironment.setDescription(vfModuleArtifact.getArtifactInfo().getArtifactDescription());
+        heatEnvironment.setVersion(BigDecimalVersion
+            .castAndCheckNotificationVersionToString(vfModuleArtifact.getArtifactInfo().getArtifactVersion()));
+        heatEnvironment.setArtifactUuid(vfModuleArtifact.getArtifactInfo().getArtifactUUID());
+
+        if (vfModuleArtifact.getArtifactInfo().getArtifactChecksum() != null) {
+            heatEnvironment.setArtifactChecksum(vfModuleArtifact.getArtifactInfo().getArtifactChecksum());
+        } else {
+            heatEnvironment.setArtifactChecksum(MANUAL_RECORD);
+        }
+        vfModuleArtifact.setHeatEnvironment(heatEnvironment);
+    }
+
+    protected void createHeatFileFromArtifact(VfResourceStructure vfResourceStructure,
+        VfModuleArtifact vfModuleArtifact, ToscaResourceStructure toscaResourceStruct) {
+
+        HeatFiles heatFile = new HeatFiles();
+        heatFile.setAsdcUuid(vfModuleArtifact.getArtifactInfo().getArtifactUUID());
+        heatFile.setDescription(vfModuleArtifact.getArtifactInfo().getArtifactDescription());
+        heatFile.setFileBody(vfModuleArtifact.getResult());
+        heatFile.setFileName(vfModuleArtifact.getArtifactInfo().getArtifactName());
+        heatFile.setVersion(BigDecimalVersion
+            .castAndCheckNotificationVersionToString(vfModuleArtifact.getArtifactInfo().getArtifactVersion()));
+        toscaResourceStruct.setHeatFilesUUID(vfModuleArtifact.getArtifactInfo().getArtifactUUID());
+        if (vfModuleArtifact.getArtifactInfo().getArtifactChecksum() != null) {
+            heatFile.setArtifactChecksum(vfModuleArtifact.getArtifactInfo().getArtifactChecksum());
+        } else {
+            heatFile.setArtifactChecksum(MANUAL_RECORD);
+        }
+        vfModuleArtifact.setHeatFiles(heatFile);
+    }
+
+    protected Service createService(ToscaResourceStructure toscaResourceStructure,
+        ResourceStructure resourceStructure) {
+
+        Metadata serviceMetadata = toscaResourceStructure.getServiceMetadata();
+
+        Service service = new Service();
+
+        if (serviceMetadata != null) {
+
+            if (toscaResourceStructure.getServiceVersion() != null) {
+                service.setModelVersion(toscaResourceStructure.getServiceVersion());
+            }
+
+            service.setServiceType(serviceMetadata.getValue("serviceType"));
+            service.setServiceRole(serviceMetadata.getValue("serviceRole"));
+            service.setCategory(serviceMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_CATEGORY));
+            service.setDescription(serviceMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_DESCRIPTION));
+            service.setModelName(serviceMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_NAME));
+            service.setModelUUID(serviceMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_UUID));
+            service.setEnvironmentContext(serviceMetadata.getValue("environmentContext"));
+
+            if (resourceStructure != null) {
+                service.setWorkloadContext(resourceStructure.getNotification().getWorkloadContext());
+            }
+
+            service.setModelInvariantUUID(serviceMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_INVARIANTUUID));
+            service.setCsar(toscaResourceStructure.getCatalogToscaCsar());
+        }
+
+        toscaResourceStructure.setCatalogService(service);
+        return service;
+    }
+
+    protected ServiceProxyResourceCustomization createServiceProxy(NodeTemplate nodeTemplate, Service service,
+        ToscaResourceStructure toscaResourceStructure) {
+
+        Metadata spMetadata = nodeTemplate.getMetaData();
+
+        ServiceProxyResourceCustomization spCustomizationResource = new ServiceProxyResourceCustomization();
+
+        Set<ServiceProxyResourceCustomization> serviceProxyCustomizationSet = new HashSet<>();
+
+        spCustomizationResource.setModelName(spMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_NAME));
+        spCustomizationResource
+            .setModelInvariantUUID(spMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_INVARIANTUUID));
+        spCustomizationResource.setModelUUID(spMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_UUID));
+        spCustomizationResource.setModelVersion(spMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_VERSION));
+        spCustomizationResource.setDescription(spMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_DESCRIPTION));
+
+        spCustomizationResource
+            .setModelCustomizationUUID(spMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID));
+        spCustomizationResource.setModelInstanceName(nodeTemplate.getName());
+        spCustomizationResource.setToscaNodeType(nodeTemplate.getType());
+
+        String sourceServiceUUID = spMetadata.getValue("sourceModelUuid");
+
+        Service sourceService = serviceRepo.findOneByModelUUID(sourceServiceUUID);
+
+        spCustomizationResource.setSourceService(sourceService);
+        spCustomizationResource.setToscaNodeType(nodeTemplate.getType());
+        serviceProxyCustomizationSet.add(spCustomizationResource);
+
+        toscaResourceStructure.setCatalogServiceProxyResourceCustomization(spCustomizationResource);
+
+        return spCustomizationResource;
+    }
+
+    protected ConfigurationResourceCustomization createConfiguration(NodeTemplate nodeTemplate,
+        ToscaResourceStructure toscaResourceStructure, ServiceProxyResourceCustomization spResourceCustomization,
+        Optional<ConfigurationResourceCustomization> vnrResourceCustomization) {
+
+        ConfigurationResourceCustomization configCustomizationResource = getConfigurationResourceCustomization(
+            nodeTemplate,
+            toscaResourceStructure, spResourceCustomization);
+
+        ConfigurationResource configResource = getConfigurationResource(nodeTemplate);
+
+        Set<ConfigurationResourceCustomization> configResourceCustomizationSet = new HashSet<>();
+
+        StatefulEntityType entityType = nodeTemplate.getTypeDefinition();
+        String type = entityType.getType();
+
+        if (NODES_VRF_ENTRY.equals(type)) {
+            configCustomizationResource.setConfigResourceCustomization(vnrResourceCustomization.orElse(null));
+        }
+
+        configCustomizationResource.setConfigurationResource(configResource);
+
+        configResourceCustomizationSet.add(configCustomizationResource);
+
+        configResource.setConfigurationResourceCustomization(configResourceCustomizationSet);
+
+        toscaResourceStructure.setCatalogConfigurationResource(configResource);
+
+        toscaResourceStructure.setCatalogConfigurationResourceCustomization(configCustomizationResource);
+
+        return configCustomizationResource;
+    }
+
+    protected ConfigurationResource createFabricConfiguration(NodeTemplate nodeTemplate,
+        ToscaResourceStructure toscaResourceStructure) {
+
+        Metadata fabricMetadata = nodeTemplate.getMetaData();
+
+        ConfigurationResource configResource = new ConfigurationResource();
+
+        configResource.setModelName(fabricMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_NAME));
+        configResource.setModelInvariantUUID(fabricMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_INVARIANTUUID));
+        configResource.setModelUUID(fabricMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_UUID));
+        configResource.setModelVersion(fabricMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_VERSION));
+        configResource.setDescription(fabricMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_DESCRIPTION));
+        configResource.setToscaNodeType(nodeTemplate.getType());
+
+        return configResource;
+    }
+
+    protected void createToscaCsar(ToscaResourceStructure toscaResourceStructure) {
+        ToscaCsar toscaCsar = new ToscaCsar();
+        if (toscaResourceStructure.getToscaArtifact().getArtifactChecksum() != null) {
+            toscaCsar.setArtifactChecksum(toscaResourceStructure.getToscaArtifact().getArtifactChecksum());
+        } else {
+            toscaCsar.setArtifactChecksum(MANUAL_RECORD);
+        }
+        toscaCsar.setArtifactUUID(toscaResourceStructure.getToscaArtifact().getArtifactUUID());
+        toscaCsar.setName(toscaResourceStructure.getToscaArtifact().getArtifactName());
+        toscaCsar.setVersion(toscaResourceStructure.getToscaArtifact().getArtifactVersion());
+        toscaCsar.setDescription(toscaResourceStructure.getToscaArtifact().getArtifactDescription());
+        toscaCsar.setUrl(toscaResourceStructure.getToscaArtifact().getArtifactURL());
+
+        toscaResourceStructure.setCatalogToscaCsar(toscaCsar);
+    }
+
+    protected VnfcCustomization findExistingVfc(Set<VnfcCustomization> vnfcCustomizations, String customizationUUID) {
+        VnfcCustomization vnfcCustomization = null;
+        for (VnfcCustomization vnfcCustom : vnfcCustomizations) {
+            if (vnfcCustom != null && vnfcCustom.getModelCustomizationUUID().equals(customizationUUID)) {
+                vnfcCustomization = vnfcCustom;
+            }
+        }
+
+        if (vnfcCustomization == null) {
+            vnfcCustomization = vnfcCustomizationRepo.findOneByModelCustomizationUUID(customizationUUID);
+        }
+
+        return vnfcCustomization;
+    }
+
+    protected CvnfcCustomization findExistingCvfc(Set<CvnfcCustomization> cvnfcCustomizations,
+        String customizationUUID) {
+        CvnfcCustomization cvnfcCustomization = null;
+        for (CvnfcCustomization cvnfcCustom : cvnfcCustomizations) {
+            if (cvnfcCustom != null && cvnfcCustom.getModelCustomizationUUID().equals(customizationUUID)) {
+                cvnfcCustomization = cvnfcCustom;
+            }
+        }
+
+        if (cvnfcCustomization == null) {
+            cvnfcCustomization = cvnfcCustomizationRepo.findOneByModelCustomizationUUID(customizationUUID);
+        }
+
+        return cvnfcCustomization;
+    }
+
+    protected NetworkResourceCustomization createNetwork(NodeTemplate networkNodeTemplate,
+        ToscaResourceStructure toscaResourceStructure, HeatTemplate heatTemplate, String aicMax, String aicMin,
+        Service service) {
+
+        NetworkResourceCustomization networkResourceCustomization = networkCustomizationRepo
+            .findOneByModelCustomizationUUID(
+                networkNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID));
+
+        boolean networkUUIDsMatch = true;
+        // Check to make sure the NetworkResourceUUID on the Customization record matches the NetworkResourceUUID from the distribution.
+        // If not we'll update the Customization record with latest from the distribution
+        if (networkResourceCustomization != null) {
+            String existingNetworkModelUUID = networkResourceCustomization.getNetworkResource().getModelUUID();
+            String latestNetworkModelUUID = networkNodeTemplate.getMetaData()
+                .getValue(SdcPropertyNames.PROPERTY_NAME_UUID);
+
+            if (!existingNetworkModelUUID.equals(latestNetworkModelUUID)) {
+                networkUUIDsMatch = false;
+            }
+
+        }
+
+        if (networkResourceCustomization != null && !networkUUIDsMatch) {
+
+            NetworkResource networkResource = createNetworkResource(networkNodeTemplate, toscaResourceStructure,
+                heatTemplate,
+                aicMax, aicMin);
+
+            networkResourceCustomization.setNetworkResource(networkResource);
+
+            networkCustomizationRepo.saveAndFlush(networkResourceCustomization);
+
+        } else if (networkResourceCustomization == null) {
+            networkResourceCustomization = createNetworkResourceCustomization(networkNodeTemplate,
+                toscaResourceStructure);
+
+            NetworkResource networkResource = findExistingNetworkResource(service,
+                networkNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_UUID));
+            if (networkResource == null) {
+                networkResource = createNetworkResource(networkNodeTemplate, toscaResourceStructure, heatTemplate,
+                    aicMax, aicMin);
+            }
+
+            networkResource.addNetworkResourceCustomization(networkResourceCustomization);
+            networkResourceCustomization.setNetworkResource(networkResource);
+        }
+
+        return networkResourceCustomization;
+    }
+
+    protected NetworkResource findExistingNetworkResource(Service service, String modelUUID) {
+        NetworkResource networkResource = null;
+        for (NetworkResourceCustomization networkCustom : service.getNetworkCustomizations()) {
+            if (networkCustom.getNetworkResource() != null
+                && networkCustom.getNetworkResource().getModelUUID().equals(modelUUID)) {
+                networkResource = networkCustom.getNetworkResource();
+            }
+        }
+        if (networkResource == null) {
+            networkResource = networkRepo.findResourceByModelUUID(modelUUID);
+        }
+
+        return networkResource;
+    }
+
+    protected NetworkResourceCustomization createNetworkResourceCustomization(NodeTemplate networkNodeTemplate,
+        ToscaResourceStructure toscaResourceStructure) {
+        NetworkResourceCustomization networkResourceCustomization = new NetworkResourceCustomization();
+        networkResourceCustomization.setModelInstanceName(
+            testNull(networkNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_NAME)));
+        networkResourceCustomization.setModelCustomizationUUID(
+            testNull(networkNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID)));
+
+        networkResourceCustomization.setNetworkTechnology(
+            testNull(toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(networkNodeTemplate,
+                SdcPropertyNames.PROPERTY_NAME_NETWORKTECHNOLOGY)));
+        networkResourceCustomization.setNetworkType(testNull(toscaResourceStructure.getSdcCsarHelper()
+            .getNodeTemplatePropertyLeafValue(networkNodeTemplate, SdcPropertyNames.PROPERTY_NAME_NETWORKTYPE)));
+        networkResourceCustomization.setNetworkRole(testNull(toscaResourceStructure.getSdcCsarHelper()
+            .getNodeTemplatePropertyLeafValue(networkNodeTemplate, SdcPropertyNames.PROPERTY_NAME_NETWORKROLE)));
+        networkResourceCustomization.setNetworkScope(testNull(toscaResourceStructure.getSdcCsarHelper()
+            .getNodeTemplatePropertyLeafValue(networkNodeTemplate, SdcPropertyNames.PROPERTY_NAME_NETWORKSCOPE)));
+        return networkResourceCustomization;
+    }
+
+    protected NetworkResource createNetworkResource(NodeTemplate networkNodeTemplate,
+        ToscaResourceStructure toscaResourceStructure, HeatTemplate heatTemplate, String aicMax, String aicMin) {
+        NetworkResource networkResource = new NetworkResource();
+        String providerNetwork = toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(
+            networkNodeTemplate, SdcPropertyNames.PROPERTY_NAME_PROVIDERNETWORK_ISPROVIDERNETWORK);
+
+        if ("true".equalsIgnoreCase(providerNetwork)) {
+            networkResource.setNeutronNetworkType(PROVIDER);
+        } else {
+            networkResource.setNeutronNetworkType(BASIC);
+        }
+
+        networkResource.setModelName(
+            testNull(networkNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_NAME)));
+
+        networkResource.setModelInvariantUUID(
+            testNull(networkNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_INVARIANTUUID)));
+        networkResource.setModelUUID(
+            testNull(networkNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_UUID)));
+        networkResource.setModelVersion(
+            testNull(networkNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_VERSION)));
+
+        networkResource.setAicVersionMax(aicMax);
+        networkResource.setAicVersionMin(aicMin);
+        networkResource.setToscaNodeType(networkNodeTemplate.getType());
+        networkResource.setDescription(
+            testNull(networkNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_DESCRIPTION)));
+        networkResource.setOrchestrationMode(HEAT);
+        networkResource.setHeatTemplate(heatTemplate);
+        return networkResource;
+    }
+
+    protected CollectionNetworkResourceCustomization createNetworkCollection(NodeTemplate networkNodeTemplate,
+        ToscaResourceStructure toscaResourceStructure, Service service) {
+
+        CollectionNetworkResourceCustomization collectionNetworkResourceCustomization = new CollectionNetworkResourceCustomization();
+
+        // **** Build Object to populate Collection_Resource table
+        CollectionResource collectionResource = new CollectionResource();
+
+        collectionResource
+            .setModelName(networkNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_NAME));
+        collectionResource.setModelInvariantUUID(
+            networkNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_INVARIANTUUID));
+        collectionResource
+            .setModelUUID(networkNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_UUID));
+        collectionResource
+            .setModelVersion(networkNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_VERSION));
+        collectionResource
+            .setDescription(networkNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_DESCRIPTION));
+        collectionResource.setToscaNodeType(networkNodeTemplate.getType());
+
+        toscaResourceStructure.setCatalogCollectionResource(collectionResource);
+
+        // **** Build object to populate Collection_Resource_Customization table
+        NetworkCollectionResourceCustomization ncfc = new NetworkCollectionResourceCustomization();
+
+        ncfc.setFunction(toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(networkNodeTemplate,
+            "cr_function"));
+        ncfc.setRole(toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(networkNodeTemplate,
+            "cr_role"));
+        ncfc.setType(toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(networkNodeTemplate,
+            "cr_type"));
+
+        ncfc.setModelInstanceName(networkNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_NAME));
+        ncfc.setModelCustomizationUUID(
+            networkNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID));
+
+        Set<CollectionNetworkResourceCustomization> networkResourceCustomizationSet = new HashSet<>();
+        networkResourceCustomizationSet.add(collectionNetworkResourceCustomization);
+
+        ncfc.setNetworkResourceCustomization(networkResourceCustomizationSet);
+
+        ncfc.setCollectionResource(collectionResource);
+        toscaResourceStructure.setCatalogCollectionResourceCustomization(ncfc);
+
+        //*** Build object to populate the Instance_Group table
+        List<Group> groupList = toscaResourceStructure.getSdcCsarHelper()
+            .getGroupsOfOriginOfNodeTemplateByToscaGroupType(networkNodeTemplate,
+                "org.openecomp.groups.NetworkCollection");
+
+        List<NetworkInstanceGroup> networkInstanceGroupList = new ArrayList<>();
+
+        List<CollectionResourceInstanceGroupCustomization> collectionResourceInstanceGroupCustomizationList = new ArrayList<CollectionResourceInstanceGroupCustomization>();
+
+        for (Group group : groupList) {
+
+            NetworkInstanceGroup networkInstanceGroup = new NetworkInstanceGroup();
+            Metadata instanceMetadata = group.getMetadata();
+            networkInstanceGroup.setModelName(instanceMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_NAME));
+            networkInstanceGroup
+                .setModelInvariantUUID(instanceMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_INVARIANTUUID));
+            networkInstanceGroup.setModelUUID(instanceMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_UUID));
+            networkInstanceGroup.setModelVersion(instanceMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_VERSION));
+            networkInstanceGroup.setToscaNodeType(group.getType());
+            networkInstanceGroup.setRole(SubType.SUB_INTERFACE.toString()); // Set
+            // Role
+            networkInstanceGroup.setType(InstanceGroupType.L3_NETWORK); // Set
+            // type
+            networkInstanceGroup.setCollectionResource(collectionResource);
+
+            // ****Build object to populate
+            // Collection_Resource_Instance_Group_Customization table
+            CollectionResourceInstanceGroupCustomization crInstanceGroupCustomization = new CollectionResourceInstanceGroupCustomization();
+            crInstanceGroupCustomization.setInstanceGroup(networkInstanceGroup);
+            crInstanceGroupCustomization.setModelUUID(instanceMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_UUID));
+            crInstanceGroupCustomization.setModelCustomizationUUID(
+                networkNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID));
+
+            // Loop through the template policy to find the subinterface_network_quantity property name.  Then extract the value for it.
+            List<Policy> policyList = toscaResourceStructure.getSdcCsarHelper()
+                .getPoliciesOfOriginOfNodeTemplateByToscaPolicyType(networkNodeTemplate,
+                    "org.openecomp.policies.scaling.Fixed");
+
+            if (policyList != null) {
+                for (Policy policy : policyList) {
+                    for (String policyNetworkCollection : policy.getTargets()) {
+
+                        if (policyNetworkCollection.equalsIgnoreCase(group.getName())) {
+
+                            Map<String, Object> propMap = policy.getPolicyProperties();
+
+                            if (propMap.get("quantity") != null) {
+
+                                String quantity = toscaResourceStructure.getSdcCsarHelper()
+                                    .getNodeTemplatePropertyLeafValue(networkNodeTemplate,
+                                        getPropertyInput(propMap.get("quantity").toString()));
+
+                                if (quantity != null) {
+                                    crInstanceGroupCustomization
+                                        .setSubInterfaceNetworkQuantity(Integer.parseInt(quantity));
+                                }
+
+                            }
+
+                        }
+                    }
+                }
+            }
+
+            crInstanceGroupCustomization.setDescription(
+                toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(networkNodeTemplate,
+                    instanceMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_NAME)
+                        + "_network_collection_description"));
+            crInstanceGroupCustomization.setFunction(
+                toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(networkNodeTemplate,
+                    instanceMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_NAME)
+                        + "_network_collection_function"));
+            crInstanceGroupCustomization.setCollectionResourceCust(ncfc);
+            collectionResourceInstanceGroupCustomizationList.add(crInstanceGroupCustomization);
+
+            networkInstanceGroup
+                .setCollectionInstanceGroupCustomizations(collectionResourceInstanceGroupCustomizationList);
+
+            networkInstanceGroupList.add(networkInstanceGroup);
+
+            toscaResourceStructure.setCatalogNetworkInstanceGroup(networkInstanceGroupList);
+
+            List<NodeTemplate> vlNodeList = toscaResourceStructure.getSdcCsarHelper()
+                .getNodeTemplateBySdcType(networkNodeTemplate, SdcTypes.VL);
+
+            List<CollectionNetworkResourceCustomization> collectionNetworkResourceCustomizationList = new ArrayList<>();
+
+            //*****Build object to populate the NetworkResource table
+            NetworkResource networkResource = new NetworkResource();
+
+            for (NodeTemplate vlNodeTemplate : vlNodeList) {
+
+                String providerNetwork = toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(
+                    vlNodeTemplate, SdcPropertyNames.PROPERTY_NAME_PROVIDERNETWORK_ISPROVIDERNETWORK);
+
+                if ("true".equalsIgnoreCase(providerNetwork)) {
+                    networkResource.setNeutronNetworkType(PROVIDER);
+                } else {
+                    networkResource.setNeutronNetworkType(BASIC);
+                }
+
+                networkResource
+                    .setModelName(vlNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_NAME));
+
+                networkResource.setModelInvariantUUID(
+                    vlNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_INVARIANTUUID));
+                networkResource
+                    .setModelUUID(vlNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_UUID));
+                networkResource
+                    .setModelVersion(vlNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_VERSION));
+
+                networkResource.setAicVersionMax(
+                    vlNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_MAXINSTANCES));
+
+                TempNetworkHeatTemplateLookup tempNetworkLookUp = tempNetworkLookupRepo
+                    .findFirstBynetworkResourceModelName(
+                        vlNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_NAME));
+
+                if (tempNetworkLookUp != null) {
+
+                    HeatTemplate heatTemplate = heatRepo
+                        .findByArtifactUuid(tempNetworkLookUp.getHeatTemplateArtifactUuid());
+                    networkResource.setHeatTemplate(heatTemplate);
+
+                    networkResource.setAicVersionMin(tempNetworkLookUp.getAicVersionMin());
+
+                }
+
+                networkResource.setToscaNodeType(vlNodeTemplate.getType());
+                networkResource
+                    .setDescription(vlNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_DESCRIPTION));
+                networkResource.setOrchestrationMode(HEAT);
+
+                // Build object to populate the
+                // Collection_Network_Resource_Customization table
+                for (NodeTemplate memberNode : group.getMemberNodes()) {
+                    collectionNetworkResourceCustomization.setModelInstanceName(memberNode.getName());
+                }
+
+                collectionNetworkResourceCustomization.setModelCustomizationUUID(
+                    vlNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID));
+
+                collectionNetworkResourceCustomization.setNetworkTechnology(
+                    toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(vlNodeTemplate,
+                        SdcPropertyNames.PROPERTY_NAME_NETWORKTECHNOLOGY));
+                collectionNetworkResourceCustomization.setNetworkType(toscaResourceStructure.getSdcCsarHelper()
+                    .getNodeTemplatePropertyLeafValue(vlNodeTemplate, SdcPropertyNames.PROPERTY_NAME_NETWORKTYPE));
+                collectionNetworkResourceCustomization.setNetworkRole(toscaResourceStructure.getSdcCsarHelper()
+                    .getNodeTemplatePropertyLeafValue(vlNodeTemplate, SdcPropertyNames.PROPERTY_NAME_NETWORKROLE));
+                collectionNetworkResourceCustomization.setNetworkScope(toscaResourceStructure.getSdcCsarHelper()
+                    .getNodeTemplatePropertyLeafValue(vlNodeTemplate, SdcPropertyNames.PROPERTY_NAME_NETWORKSCOPE));
+                collectionNetworkResourceCustomization.setInstanceGroup(networkInstanceGroup);
+                collectionNetworkResourceCustomization.setNetworkResource(networkResource);
+                collectionNetworkResourceCustomization.setNetworkResourceCustomization(ncfc);
+
+                collectionNetworkResourceCustomizationList.add(collectionNetworkResourceCustomization);
+            }
+
+        }
+
+        return collectionNetworkResourceCustomization;
+    }
+
+    protected VnfcInstanceGroupCustomization createVNFCInstanceGroup(NodeTemplate vnfcNodeTemplate, Group group,
+        VnfResourceCustomization vnfResourceCustomization, ToscaResourceStructure toscaResourceStructure) {
+
+        Metadata instanceMetadata = group.getMetadata();
+        // Populate InstanceGroup
+        VFCInstanceGroup vfcInstanceGroup = new VFCInstanceGroup();
+
+        vfcInstanceGroup.setModelName(instanceMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_NAME));
+        vfcInstanceGroup.setModelInvariantUUID(instanceMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_INVARIANTUUID));
+        vfcInstanceGroup.setModelUUID(instanceMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_UUID));
+        vfcInstanceGroup.setModelVersion(instanceMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_VERSION));
+        vfcInstanceGroup.setToscaNodeType(group.getType());
+        vfcInstanceGroup.setRole("SUB-INTERFACE");   // Set Role
+        vfcInstanceGroup.setType(InstanceGroupType.VNFC);  // Set type
+
+        //Populate VNFCInstanceGroupCustomization
+        VnfcInstanceGroupCustomization vfcInstanceGroupCustom = new VnfcInstanceGroupCustomization();
+
+        vfcInstanceGroupCustom.setModelCustomizationUUID(vnfResourceCustomization.getModelCustomizationUUID());
+        vfcInstanceGroupCustom.setModelUUID(instanceMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_UUID));
+        vfcInstanceGroupCustom.setDescription(instanceMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_DESCRIPTION));
+
+        String getInputName = null;
+        String groupProperty = toscaResourceStructure.getSdcCsarHelper()
+            .getGroupPropertyLeafValue(group, "vfc_instance_group_function");
+        if (groupProperty != null) {
+            int getInputIndex = groupProperty.indexOf("{get_input=");
+            if (getInputIndex > -1) {
+                getInputName = groupProperty.substring(getInputIndex + 11, groupProperty.length() - 1);
+            }
+        }
+        vfcInstanceGroupCustom.setFunction(
+            toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(vnfcNodeTemplate, getInputName));
+
+        vfcInstanceGroupCustom.setInstanceGroup(vfcInstanceGroup);
+        vfcInstanceGroupCustom.setVnfResourceCust(vnfResourceCustomization);
+
+        return vfcInstanceGroupCustom;
+
+    }
+
+    protected VfModuleCustomization createVFModuleResource(Group group, NodeTemplate vfTemplate,
+        ToscaResourceStructure toscaResourceStructure, VfResourceStructure vfResourceStructure,
+        IVfModuleData vfModuleData, VnfResourceCustomization vnfResource, Service service,
+        Set<CvnfcCustomization> existingCvnfcSet, Set<VnfcCustomization> existingVnfcSet) {
+
+        VfModuleCustomization vfModuleCustomization = findExistingVfModuleCustomization(vnfResource,
+            vfModuleData.getVfModuleModelCustomizationUUID());
+        if (vfModuleCustomization == null) {
+            VfModule vfModule = findExistingVfModule(vnfResource,
+                vfTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_VFMODULEMODELUUID));
+            Metadata vfMetadata = group.getMetadata();
+            if (vfModule == null) {
+                vfModule = createVfModule(group, toscaResourceStructure, vfModuleData, vfMetadata);
+            }
+
+            vfModuleCustomization = createVfModuleCustomization(group, toscaResourceStructure, vfModule, vfModuleData);
+            setHeatInformationForVfModule(toscaResourceStructure, vfResourceStructure, vfModule, vfModuleCustomization,
+                vfMetadata);
+            vfModuleCustomization.setVfModule(vfModule);
+            vfModule.getVfModuleCustomization().add(vfModuleCustomization);
+            vnfResource.getVfModuleCustomizations().add(vfModuleCustomization);
+        } else {
+            vfResourceStructure.setAlreadyDeployed(true);
+        }
+
+        //******************************************************************************************************************
+        //* Extract VFC's and CVFC's then add them to VFModule
+        //******************************************************************************************************************
+
+        Set<VnfVfmoduleCvnfcConfigurationCustomization> vnfVfmoduleCvnfcConfigurationCustomizations = new HashSet<VnfVfmoduleCvnfcConfigurationCustomization>();
+        Set<CvnfcCustomization> cvnfcCustomizations = new HashSet<CvnfcCustomization>();
+        Set<VnfcCustomization> vnfcCustomizations = new HashSet<VnfcCustomization>();
+
+        // Only set the CVNFC if this vfModule group is a member of it.
+        List<NodeTemplate> groupMembers = toscaResourceStructure.getSdcCsarHelper()
+            .getMembersOfVfModule(vfTemplate, group);
+        String vfModuleMemberName = null;
+
+        for (NodeTemplate node : groupMembers) {
+            vfModuleMemberName = node.getName();
+        }
+
+        // Extract CVFC lists
+        List<NodeTemplate> cvfcList = toscaResourceStructure.getSdcCsarHelper()
+            .getNodeTemplateBySdcType(vfTemplate, SdcTypes.CVFC);
+
+        for (NodeTemplate cvfcTemplate : cvfcList) {
+
+            CvnfcCustomization existingCvnfcCustomization = findExistingCvfc(existingCvnfcSet,
+                cvfcTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID));
+
+            if (vfModuleMemberName != null && vfModuleMemberName.equalsIgnoreCase(cvfcTemplate.getName())) {
+
+                //Extract associated VFC - Should always be just one
+                List<NodeTemplate> vfcList = toscaResourceStructure.getSdcCsarHelper()
+                    .getNodeTemplateBySdcType(cvfcTemplate, SdcTypes.VFC);
+
+                for (NodeTemplate vfcTemplate : vfcList) {
+
+                    VnfcCustomization vnfcCustomization = new VnfcCustomization();
+                    VnfcCustomization existingVnfcCustomization = null;
+
+                    existingVnfcCustomization = findExistingVfc(existingVnfcSet,
+                        vfcTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID));
+
+                    if (existingVnfcCustomization == null) {
+                        vnfcCustomization = new VnfcCustomization();
+                    } else {
+                        vnfcCustomization = existingVnfcCustomization;
+                    }
+
+                    // Only Add Abstract VNFC's to our DB, ignore all others
+                    if (existingVnfcCustomization == null && vfcTemplate.getMetaData()
+                        .getValue(SdcPropertyNames.PROPERTY_NAME_SUBCATEGORY).equalsIgnoreCase("Abstract")) {
+                        vnfcCustomization.setModelCustomizationUUID(
+                            vfcTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID));
+                        vnfcCustomization.setModelInstanceName(vfcTemplate.getName());
+                        vnfcCustomization.setModelInvariantUUID(
+                            vfcTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_INVARIANTUUID));
+                        vnfcCustomization
+                            .setModelName(vfcTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_NAME));
+                        vnfcCustomization
+                            .setModelUUID(vfcTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_UUID));
+
+                        vnfcCustomization.setModelVersion(
+                            testNull(vfcTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_VERSION)));
+                        vnfcCustomization.setDescription(
+                            testNull(vfcTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_DESCRIPTION)));
+                        vnfcCustomization.setToscaNodeType(testNull(vfcTemplate.getType()));
+
+                        vnfcCustomizations.add(vnfcCustomization);
+                        existingVnfcSet.add(vnfcCustomization);
+                    }
+
+                    // This check is needed incase the VFC subcategory is something other than Abstract.  In that case we want to skip adding that record to our DB.
+                    if (vnfcCustomization.getModelCustomizationUUID() != null) {
+
+                        CvnfcCustomization cvnfcCustomization = null;
+
+                        if (existingCvnfcCustomization != null) {
+                            cvnfcCustomization = existingCvnfcCustomization;
+                        } else {
+
+                            cvnfcCustomization = new CvnfcCustomization();
+                            cvnfcCustomization.setModelCustomizationUUID(
+                                cvfcTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID));
+                            cvnfcCustomization.setModelInstanceName(cvfcTemplate.getName());
+                            cvnfcCustomization.setModelInvariantUUID(
+                                cvfcTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_INVARIANTUUID));
+                            cvnfcCustomization
+                                .setModelName(cvfcTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_NAME));
+                            cvnfcCustomization
+                                .setModelUUID(cvfcTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_UUID));
+
+                            cvnfcCustomization.setModelVersion(
+                                testNull(cvfcTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_VERSION)));
+                            cvnfcCustomization.setDescription(
+                                testNull(
+                                    cvfcTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_DESCRIPTION)));
+                            cvnfcCustomization.setToscaNodeType(testNull(cvfcTemplate.getType()));
+
+                            if (existingVnfcCustomization != null) {
+                                cvnfcCustomization.setVnfcCustomization(existingVnfcCustomization);
+                            } else {
+                                cvnfcCustomization.setVnfcCustomization(vnfcCustomization);
+                            }
+
+                            cvnfcCustomization.setNfcFunction(toscaResourceStructure.getSdcCsarHelper()
+                                .getNodeTemplatePropertyLeafValue(cvfcTemplate, "nfc_function"));
+                            cvnfcCustomization.setNfcNamingCode(toscaResourceStructure.getSdcCsarHelper()
+                                .getNodeTemplatePropertyLeafValue(cvfcTemplate, "nfc_naming_code"));
+                            cvnfcCustomization.setVfModuleCustomization(vfModuleCustomization);
+                            cvnfcCustomization.setVnfResourceCustomization(vnfResource);
+
+                            cvnfcCustomizations.add(cvnfcCustomization);
+                            existingCvnfcSet.add(cvnfcCustomization);
+                        }
+
+                        //*****************************************************************************************************************************************
+                        //* Extract Fabric Configuration
+                        //*****************************************************************************************************************************************
+
+                        List<NodeTemplate> fabricConfigList = toscaResourceStructure.getSdcCsarHelper()
+                            .getNodeTemplateBySdcType(vfTemplate, SdcTypes.CONFIGURATION);
+
+                        for (NodeTemplate fabricTemplate : fabricConfigList) {
+
+                            ConfigurationResource fabricConfig = null;
+
+                            ConfigurationResource existingConfig = findExistingConfiguration(service,
+                                fabricTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_UUID));
+
+                            if (existingConfig == null) {
+
+                                fabricConfig = createFabricConfiguration(fabricTemplate, toscaResourceStructure);
+
+                            } else {
+                                fabricConfig = existingConfig;
+                            }
+
+                            VnfVfmoduleCvnfcConfigurationCustomization vnfVfmoduleCvnfcConfigurationCustomization = createVfCnvfConfigCustomization(
+                                fabricTemplate, toscaResourceStructure,
+                                vnfResource, vfModuleCustomization, cvnfcCustomization, fabricConfig, vfTemplate,
+                                vfModuleMemberName);
+
+                            vnfVfmoduleCvnfcConfigurationCustomizations.add(vnfVfmoduleCvnfcConfigurationCustomization);
+                        }
+
+                    }
+
+                }
+
+            }
+
+        }
+
+        vfModuleCustomization.setCvnfcCustomization(cvnfcCustomizations);
+        vfModuleCustomization
+            .setVnfVfmoduleCvnfcConfigurationCustomization(vnfVfmoduleCvnfcConfigurationCustomizations);
+
+        return vfModuleCustomization;
+    }
+
+    protected VnfVfmoduleCvnfcConfigurationCustomization createVfCnvfConfigCustomization(NodeTemplate fabricTemplate,
+        ToscaResourceStructure toscaResourceStruct,
+        VnfResourceCustomization vnfResource, VfModuleCustomization vfModuleCustomization,
+        CvnfcCustomization cvnfcCustomization,
+        ConfigurationResource configResource, NodeTemplate vfTemplate, String vfModuleMemberName) {
+
+        Metadata fabricMetadata = fabricTemplate.getMetaData();
+
+        VnfVfmoduleCvnfcConfigurationCustomization vfModuleToCvnfc = new VnfVfmoduleCvnfcConfigurationCustomization();
+
+        vfModuleToCvnfc.setConfigurationResource(configResource);
+        vfModuleToCvnfc.setCvnfcCustomization(cvnfcCustomization);
+        vfModuleToCvnfc
+            .setModelCustomizationUUID(fabricMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID));
+        vfModuleToCvnfc.setModelInstanceName(fabricTemplate.getName());
+        vfModuleToCvnfc.setVfModuleCustomization(vfModuleCustomization);
+        vfModuleToCvnfc.setVnfResourceCustomization(vnfResource);
 
-		if (vfModuleArtifact.getArtifactInfo().getArtifactTimeout() != null) {
-			heatTemplate.setTimeoutMinutes(vfModuleArtifact.getArtifactInfo().getArtifactTimeout());
-		} else {
-			heatTemplate.setTimeoutMinutes(240);
-		}
+        List<Policy> policyList = toscaResourceStruct.getSdcCsarHelper()
+            .getPoliciesOfOriginOfNodeTemplateByToscaPolicyType(vfTemplate, "org.openecomp.policies.External");
 
-		heatTemplate.setDescription(vfModuleArtifact.getArtifactInfo().getArtifactDescription());
-		heatTemplate.setVersion(BigDecimalVersion
-				.castAndCheckNotificationVersionToString(vfModuleArtifact.getArtifactInfo().getArtifactVersion()));
-		heatTemplate.setArtifactUuid(vfModuleArtifact.getArtifactInfo().getArtifactUUID());
+        if (policyList != null) {
+            for (Policy policy : policyList) {
 
-		if (vfModuleArtifact.getArtifactInfo().getArtifactChecksum() != null) {
-			heatTemplate.setArtifactChecksum(vfModuleArtifact.getArtifactInfo().getArtifactChecksum());
-		} else {
-			heatTemplate.setArtifactChecksum(MANUAL_RECORD);
-		}
+                for (String policyCvfcTarget : policy.getTargets()) {
 
-		Set<HeatTemplateParam> heatParam = extractHeatTemplateParameters(
-				vfModuleArtifact.getResult(), vfModuleArtifact.getArtifactInfo().getArtifactUUID());
-		heatTemplate.setParameters(heatParam);	
-		vfModuleArtifact.setHeatTemplate(heatTemplate);
-	}
+                    if (policyCvfcTarget.equalsIgnoreCase(vfModuleMemberName)) {
 
-	protected void createHeatEnvFromArtifact(VfResourceStructure vfResourceStructure,
-			VfModuleArtifact vfModuleArtifact) {
-		HeatEnvironment heatEnvironment = new HeatEnvironment();
-		heatEnvironment.setName(vfModuleArtifact.getArtifactInfo().getArtifactName());
-		List<String> typeList = new ArrayList<>();
-		typeList.add(ASDCConfiguration.HEAT);
-		typeList.add(ASDCConfiguration.HEAT_VOL);
-		heatEnvironment.setEnvironment(
-				verifyTheFilePrefixInArtifacts(vfModuleArtifact.getResult(), vfResourceStructure, typeList));
-		heatEnvironment.setDescription(vfModuleArtifact.getArtifactInfo().getArtifactDescription());
-		heatEnvironment.setVersion(BigDecimalVersion
-				.castAndCheckNotificationVersionToString(vfModuleArtifact.getArtifactInfo().getArtifactVersion()));	
-		heatEnvironment.setArtifactUuid(vfModuleArtifact.getArtifactInfo().getArtifactUUID());
+                        Map<String, Object> propMap = policy.getPolicyProperties();
 
-		if (vfModuleArtifact.getArtifactInfo().getArtifactChecksum() != null) {
-			heatEnvironment.setArtifactChecksum(vfModuleArtifact.getArtifactInfo().getArtifactChecksum());
-		} else {
-			heatEnvironment.setArtifactChecksum(MANUAL_RECORD);
-		}		
-		vfModuleArtifact.setHeatEnvironment(heatEnvironment);
-	}
+                        if (propMap.get("type").toString().equalsIgnoreCase("Fabric Policy")) {
+                            vfModuleToCvnfc.setPolicyName(propMap.get("name").toString());
+                        }
+                    }
+                }
+            }
+        }
 
-	protected void createHeatFileFromArtifact(VfResourceStructure vfResourceStructure,
-		VfModuleArtifact vfModuleArtifact, ToscaResourceStructure toscaResourceStruct) {
-		
-		HeatFiles heatFile = new HeatFiles();	
-		heatFile.setAsdcUuid(vfModuleArtifact.getArtifactInfo().getArtifactUUID());
-		heatFile.setDescription(vfModuleArtifact.getArtifactInfo().getArtifactDescription());
-		heatFile.setFileBody(vfModuleArtifact.getResult());
-		heatFile.setFileName(vfModuleArtifact.getArtifactInfo().getArtifactName());
-		heatFile.setVersion(BigDecimalVersion
-				.castAndCheckNotificationVersionToString(vfModuleArtifact.getArtifactInfo().getArtifactVersion()));
-		toscaResourceStruct.setHeatFilesUUID(vfModuleArtifact.getArtifactInfo().getArtifactUUID());
-		if (vfModuleArtifact.getArtifactInfo().getArtifactChecksum() != null) {
-			heatFile.setArtifactChecksum(vfModuleArtifact.getArtifactInfo().getArtifactChecksum());
-		} else {
-			heatFile.setArtifactChecksum(MANUAL_RECORD);
-		}
-		vfModuleArtifact.setHeatFiles(heatFile);
-	}
+        vfModuleToCvnfc.setConfigurationFunction(
+            toscaResourceStruct.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(fabricTemplate, "function"));
+        vfModuleToCvnfc.setConfigurationRole(
+            toscaResourceStruct.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(fabricTemplate, "role"));
+        vfModuleToCvnfc.setConfigurationType(
+            toscaResourceStruct.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(fabricTemplate, "type"));
 
-	protected Service createService(ToscaResourceStructure toscaResourceStructure,
-			VfResourceStructure vfResourceStructure) {
+        return vfModuleToCvnfc;
+    }
 
-		Metadata serviceMetadata = toscaResourceStructure.getServiceMetadata();
+    protected ConfigurationResource findExistingConfiguration(Service service, String modelUUID) {
+        ConfigurationResource configResource = null;
+        for (ConfigurationResourceCustomization configurationResourceCustom : service
+            .getConfigurationCustomizations()) {
+            if (configurationResourceCustom.getConfigurationResource() != null
+                && configurationResourceCustom.getConfigurationResource().getModelUUID().equals(modelUUID)) {
+                configResource = configurationResourceCustom.getConfigurationResource();
+            }
+        }
+        if (configResource == null) {
+            configResource = configRepo.findResourceByModelUUID(modelUUID);
+        }
 
-		Service service = new Service();
+        return configResource;
+    }
 
-		if (serviceMetadata != null) {
+    protected VfModuleCustomization findExistingVfModuleCustomization(VnfResourceCustomization vnfResource,
+        String vfModuleModelCustomizationUUID) {
+        VfModuleCustomization vfModuleCustomization = null;
+        for (VfModuleCustomization vfModuleCustom : vnfResource.getVfModuleCustomizations()) {
+            if (vfModuleCustom.getModelCustomizationUUID().equalsIgnoreCase(vfModuleModelCustomizationUUID)) {
+                vfModuleCustomization = vfModuleCustom;
+            }
+        }
+        if (vfModuleCustomization == null) {
+            vfModuleCustomization = vfModuleCustomizationRepo
+                .findByModelCustomizationUUID(vfModuleModelCustomizationUUID);
+        }
 
-			if (toscaResourceStructure.getServiceVersion() != null) {
-				service.setModelVersion(toscaResourceStructure.getServiceVersion());
-			}
+        return vfModuleCustomization;
+    }
 
-			service.setServiceType(serviceMetadata.getValue("serviceType"));
-			service.setServiceRole(serviceMetadata.getValue("serviceRole"));
+    protected VfModule findExistingVfModule(VnfResourceCustomization vnfResource, String modelUUID) {
+        VfModule vfModule = null;
+        for (VfModuleCustomization vfModuleCustom : vnfResource.getVfModuleCustomizations()) {
+            if (vfModuleCustom.getVfModule() != null && vfModuleCustom.getVfModule().getModelUUID().equals(modelUUID)) {
+                vfModule = vfModuleCustom.getVfModule();
+            }
+        }
+        if (vfModule == null) {
+            vfModule = vfModuleRepo.findByModelUUID(modelUUID);
+        }
 
-			service.setDescription(serviceMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_DESCRIPTION));
-			service.setModelName(serviceMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_NAME));
-			service.setModelUUID(serviceMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_UUID));
-			service.setEnvironmentContext(serviceMetadata.getValue("environmentContext"));
+        return vfModule;
+    }
 
-			if (vfResourceStructure != null) 
-				service.setWorkloadContext(vfResourceStructure.getNotification().getWorkloadContext());
-						
-			service.setModelInvariantUUID(serviceMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_INVARIANTUUID));
-			service.setCsar(toscaResourceStructure.getCatalogToscaCsar());			
-		}
-		
-		
-		toscaResourceStructure.setCatalogService(service); 
-		return service;
-	}
-	
-	protected ServiceProxyResourceCustomization createServiceProxy(NodeTemplate nodeTemplate, Service service, ToscaResourceStructure toscaResourceStructure) {
+    protected VfModuleCustomization createVfModuleCustomization(Group group,
+        ToscaResourceStructure toscaResourceStructure, VfModule vfModule, IVfModuleData vfModuleData) {
+        VfModuleCustomization vfModuleCustomization = new VfModuleCustomization();
 
-		Metadata spMetadata = nodeTemplate.getMetaData();
-		
-		ServiceProxyResourceCustomization spCustomizationResource = new ServiceProxyResourceCustomization();
-		
-		Set<ServiceProxyResourceCustomization> serviceProxyCustomizationSet = new HashSet<>();
-		
-		spCustomizationResource.setModelName(spMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_NAME));
-		spCustomizationResource.setModelInvariantUUID(spMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_INVARIANTUUID));
-		spCustomizationResource.setModelUUID(spMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_UUID));
-		spCustomizationResource.setModelVersion(spMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_VERSION));
-		spCustomizationResource.setDescription(spMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_DESCRIPTION));	
-				
-		spCustomizationResource.setModelCustomizationUUID(spMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID));
-		spCustomizationResource.setModelInstanceName(nodeTemplate.getName());
-		spCustomizationResource.setToscaNodeType(nodeTemplate.getType());
-		
-		String sourceServiceUUID = spMetadata.getValue("sourceModelUuid");
-		
-		Service sourceService = serviceRepo.findOneByModelUUID(sourceServiceUUID);	
-		
-		spCustomizationResource.setSourceService(sourceService);
-		spCustomizationResource.setToscaNodeType(nodeTemplate.getType());
-		serviceProxyCustomizationSet.add(spCustomizationResource);
+        vfModuleCustomization.setModelCustomizationUUID(vfModuleData.getVfModuleModelCustomizationUUID());
 
-		
-		toscaResourceStructure.setCatalogServiceProxyResourceCustomization(spCustomizationResource);
-		
-		return spCustomizationResource;
-	}
-	
-	protected ConfigurationResourceCustomization createConfiguration(NodeTemplate nodeTemplate, 
-			ToscaResourceStructure toscaResourceStructure, ServiceProxyResourceCustomization spResourceCustomization,
-			Optional<ConfigurationResourceCustomization> vnrResourceCustomization) {
+        vfModuleCustomization.setVfModule(vfModule);
 
-		ConfigurationResourceCustomization configCustomizationResource = getConfigurationResourceCustomization(nodeTemplate, 
- 				toscaResourceStructure,spResourceCustomization);
-		
-		ConfigurationResource configResource = getConfigurationResource(nodeTemplate);
-		
-		Set<ConfigurationResourceCustomization> configResourceCustomizationSet = new HashSet<>();
-		
-		StatefulEntityType entityType = nodeTemplate.getTypeDefinition();
-	 	String type = entityType.getType();
-	 	
-	 	if(NODES_VRF_ENTRY.equals(type)) {
-	 		configCustomizationResource.setConfigResourceCustomization(vnrResourceCustomization.orElse(null));
-	 	}
-			
-		configCustomizationResource.setConfigurationResource(configResource);
-		
-		configResourceCustomizationSet.add(configCustomizationResource);
+        String initialCount = toscaResourceStructure.getSdcCsarHelper().getGroupPropertyLeafValue(group,
+            SdcPropertyNames.PROPERTY_NAME_INITIALCOUNT);
+        if (initialCount != null && initialCount.length() > 0) {
+            vfModuleCustomization.setInitialCount(Integer.valueOf(initialCount));
+        }
 
-		configResource.setConfigurationResourceCustomization(configResourceCustomizationSet); 	
-		
-		toscaResourceStructure.setCatalogConfigurationResource(configResource);
-		
-		toscaResourceStructure.setCatalogConfigurationResourceCustomization(configCustomizationResource);
-		
-		return configCustomizationResource;
-	}
-	
-	protected ConfigurationResource createFabricConfiguration(NodeTemplate nodeTemplate, ToscaResourceStructure toscaResourceStructure) {
-		
-		Metadata fabricMetadata = nodeTemplate.getMetaData();
-		
-		ConfigurationResource configResource = new ConfigurationResource();
-		
-		configResource.setModelName(fabricMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_NAME));
-		configResource.setModelInvariantUUID(fabricMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_INVARIANTUUID));
-		configResource.setModelUUID(fabricMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_UUID));
-		configResource.setModelVersion(fabricMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_VERSION));
-		configResource.setDescription(fabricMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_DESCRIPTION));
-		configResource.setToscaNodeType(nodeTemplate.getType());
-		
-		return configResource;
-	}
+        vfModuleCustomization.setInitialCount(Integer.valueOf(toscaResourceStructure.getSdcCsarHelper()
+            .getGroupPropertyLeafValue(group, SdcPropertyNames.PROPERTY_NAME_INITIALCOUNT)));
 
-	protected void createToscaCsar(ToscaResourceStructure toscaResourceStructure) {
-		ToscaCsar toscaCsar = new ToscaCsar();
-		if (toscaResourceStructure.getToscaArtifact().getArtifactChecksum() != null) {
-			toscaCsar.setArtifactChecksum(toscaResourceStructure.getToscaArtifact().getArtifactChecksum());
-		} else {
-			toscaCsar.setArtifactChecksum(MANUAL_RECORD);
-		}
-		toscaCsar.setArtifactUUID(toscaResourceStructure.getToscaArtifact().getArtifactUUID());
-		toscaCsar.setName(toscaResourceStructure.getToscaArtifact().getArtifactName());
-		toscaCsar.setVersion(toscaResourceStructure.getToscaArtifact().getArtifactVersion());
-		toscaCsar.setDescription(toscaResourceStructure.getToscaArtifact().getArtifactDescription());
-		toscaCsar.setUrl(toscaResourceStructure.getToscaArtifact().getArtifactURL());
+        String availabilityZoneCount = toscaResourceStructure.getSdcCsarHelper().getGroupPropertyLeafValue(group,
+            SdcPropertyNames.PROPERTY_NAME_AVAILABILITYZONECOUNT);
+        if (availabilityZoneCount != null && availabilityZoneCount.length() > 0) {
+            vfModuleCustomization.setAvailabilityZoneCount(Integer.valueOf(availabilityZoneCount));
+        }
 
-		toscaResourceStructure.setCatalogToscaCsar(toscaCsar);
-	}
-	
-	protected VnfcCustomization findExistingVfc(Set<VnfcCustomization> vnfcCustomizations, String customizationUUID) {
-		VnfcCustomization vnfcCustomization = null;
-		for(VnfcCustomization vnfcCustom : vnfcCustomizations){
-			if (vnfcCustom != null && vnfcCustom.getModelCustomizationUUID().equals(customizationUUID)) {
-				vnfcCustomization = vnfcCustom;
-			}
-		}
-		
-		if(vnfcCustomization==null)
-			vnfcCustomization = vnfcCustomizationRepo.findOneByModelCustomizationUUID(customizationUUID);
-		
-		return vnfcCustomization;
-	}
-	
-	protected CvnfcCustomization findExistingCvfc(Set<CvnfcCustomization> cvnfcCustomizations, String customizationUUID) {
-		CvnfcCustomization cvnfcCustomization = null;
-		for(CvnfcCustomization cvnfcCustom : cvnfcCustomizations){
-			if (cvnfcCustom != null && cvnfcCustom.getModelCustomizationUUID().equals(customizationUUID)) {
-				cvnfcCustomization = cvnfcCustom;
-			}
-		}
-		
-		if(cvnfcCustomization==null)
-			cvnfcCustomization = cvnfcCustomizationRepo.findOneByModelCustomizationUUID(customizationUUID);
-		
-		return cvnfcCustomization;
-	}
+        vfModuleCustomization.setLabel(toscaResourceStructure.getSdcCsarHelper().getGroupPropertyLeafValue(group,
+            SdcPropertyNames.PROPERTY_NAME_VFMODULELABEL));
 
-	protected  NetworkResourceCustomization createNetwork(NodeTemplate networkNodeTemplate,
-			ToscaResourceStructure toscaResourceStructure, HeatTemplate heatTemplate, String aicMax, String aicMin,Service service) {
-		
-		NetworkResourceCustomization networkResourceCustomization=networkCustomizationRepo.findOneByModelCustomizationUUID(networkNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID));
-				
-		boolean networkUUIDsMatch = true;
-		// Check to make sure the NetworkResourceUUID on the Customization record matches the NetworkResourceUUID from the distribution.  
-		// If not we'll update the Customization record with latest from the distribution
-		if(networkResourceCustomization != null){
-			String existingNetworkModelUUID = networkResourceCustomization.getNetworkResource().getModelUUID();
-			String latestNetworkModelUUID = networkNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_UUID);
-			
-			if(!existingNetworkModelUUID.equals(latestNetworkModelUUID)){
-				networkUUIDsMatch = false;
-			}
-		
-		}
+        String maxInstances = toscaResourceStructure.getSdcCsarHelper().getGroupPropertyLeafValue(group,
+            SdcPropertyNames.PROPERTY_NAME_MAXVFMODULEINSTANCES);
+        if (maxInstances != null && maxInstances.length() > 0) {
+            vfModuleCustomization.setMaxInstances(Integer.valueOf(maxInstances));
+        }
 
-		if (networkResourceCustomization!=null && !networkUUIDsMatch){
-			
-			NetworkResource networkResource = createNetworkResource(networkNodeTemplate, toscaResourceStructure, heatTemplate,
-					aicMax, aicMin);
-			
-			networkResourceCustomization.setNetworkResource(networkResource);			
-					
-			networkCustomizationRepo.saveAndFlush(networkResourceCustomization);
-			
-		}
-		else if(networkResourceCustomization==null){
-			networkResourceCustomization = createNetworkResourceCustomization(networkNodeTemplate,
-					toscaResourceStructure);
-					
-			NetworkResource networkResource = findExistingNetworkResource(service,
-					networkNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_UUID));
-					if(networkResource == null)
-				networkResource = createNetworkResource(networkNodeTemplate, toscaResourceStructure, heatTemplate,
-						aicMax, aicMin);
+        String minInstances = toscaResourceStructure.getSdcCsarHelper().getGroupPropertyLeafValue(group,
+            SdcPropertyNames.PROPERTY_NAME_MINVFMODULEINSTANCES);
+        if (minInstances != null && minInstances.length() > 0) {
+            vfModuleCustomization.setMinInstances(Integer.valueOf(minInstances));
+        }
+        return vfModuleCustomization;
+    }
 
-					networkResource.addNetworkResourceCustomization(networkResourceCustomization);		
-					networkResourceCustomization.setNetworkResource(networkResource);
-		}
-		
-		return networkResourceCustomization;
-	}
-	
-	protected  NetworkResource findExistingNetworkResource(Service service, String modelUUID) {
-		NetworkResource networkResource = null;
-		for(NetworkResourceCustomization networkCustom : service.getNetworkCustomizations()){
-			if (networkCustom.getNetworkResource() != null
-					&& networkCustom.getNetworkResource().getModelUUID().equals(modelUUID)) {
-					networkResource = networkCustom.getNetworkResource();
-			}
-		}
-		if(networkResource==null)
-			networkResource = networkRepo.findResourceByModelUUID(modelUUID);
-		
-		return networkResource;
-	}
-	
-	protected NetworkResourceCustomization createNetworkResourceCustomization(NodeTemplate networkNodeTemplate,
-			ToscaResourceStructure toscaResourceStructure) {
-		NetworkResourceCustomization networkResourceCustomization = new NetworkResourceCustomization();
-		networkResourceCustomization.setModelInstanceName(
-				testNull(networkNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_NAME)));
-		networkResourceCustomization.setModelCustomizationUUID(
-				testNull(networkNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID)));		
+    protected VfModule createVfModule(Group group, ToscaResourceStructure toscaResourceStructure,
+        IVfModuleData vfModuleData, Metadata vfMetadata) {
+        VfModule vfModule = new VfModule();
+        String vfModuleModelUUID = vfModuleData.getVfModuleModelUUID();
 
-		networkResourceCustomization.setNetworkTechnology(
-				testNull(toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(networkNodeTemplate,
-						SdcPropertyNames.PROPERTY_NAME_NETWORKTECHNOLOGY)));
-		networkResourceCustomization.setNetworkType(testNull(toscaResourceStructure.getSdcCsarHelper()
-				.getNodeTemplatePropertyLeafValue(networkNodeTemplate, SdcPropertyNames.PROPERTY_NAME_NETWORKTYPE)));
-		networkResourceCustomization.setNetworkRole(testNull(toscaResourceStructure.getSdcCsarHelper()
-				.getNodeTemplatePropertyLeafValue(networkNodeTemplate, SdcPropertyNames.PROPERTY_NAME_NETWORKROLE)));
-		networkResourceCustomization.setNetworkScope(testNull(toscaResourceStructure.getSdcCsarHelper()
-				.getNodeTemplatePropertyLeafValue(networkNodeTemplate, SdcPropertyNames.PROPERTY_NAME_NETWORKSCOPE)));
-		return networkResourceCustomization;
-	}
+        if (vfModuleModelUUID == null) {
+            vfModuleModelUUID = testNull(toscaResourceStructure.getSdcCsarHelper().getMetadataPropertyValue(vfMetadata,
+                SdcPropertyNames.PROPERTY_NAME_VFMODULEMODELUUID));
+        } else if (vfModuleModelUUID.indexOf('.') > -1) {
+            vfModuleModelUUID = vfModuleModelUUID.substring(0, vfModuleModelUUID.indexOf('.'));
+        }
 
-	protected NetworkResource createNetworkResource(NodeTemplate networkNodeTemplate,
-			ToscaResourceStructure toscaResourceStructure, HeatTemplate heatTemplate, String aicMax, String aicMin) {
-		NetworkResource networkResource = new NetworkResource();
-		String providerNetwork = toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(
-				networkNodeTemplate, SdcPropertyNames.PROPERTY_NAME_PROVIDERNETWORK_ISPROVIDERNETWORK);
+        vfModule.setModelInvariantUUID(testNull(toscaResourceStructure.getSdcCsarHelper()
+            .getMetadataPropertyValue(vfMetadata, SdcPropertyNames.PROPERTY_NAME_VFMODULEMODELINVARIANTUUID)));
+        vfModule.setModelName(testNull(toscaResourceStructure.getSdcCsarHelper().getMetadataPropertyValue(vfMetadata,
+            SdcPropertyNames.PROPERTY_NAME_VFMODULEMODELNAME)));
+        vfModule.setModelUUID(vfModuleModelUUID);
+        vfModule.setModelVersion(testNull(toscaResourceStructure.getSdcCsarHelper().getMetadataPropertyValue(vfMetadata,
+            SdcPropertyNames.PROPERTY_NAME_VFMODULEMODELVERSION)));
+        vfModule.setDescription(testNull(toscaResourceStructure.getSdcCsarHelper().getMetadataPropertyValue(vfMetadata,
+            SdcPropertyNames.PROPERTY_NAME_DESCRIPTION)));
 
-		if ("true".equalsIgnoreCase(providerNetwork)) {
-			networkResource.setNeutronNetworkType(PROVIDER);
-		} else {
-			networkResource.setNeutronNetworkType(BASIC);
-		}
+        String vfModuleType = toscaResourceStructure.getSdcCsarHelper().getGroupPropertyLeafValue(group,
+            SdcPropertyNames.PROPERTY_NAME_VFMODULETYPE);
+        if (vfModuleType != null && "Base".equalsIgnoreCase(vfModuleType)) {
+            vfModule.setIsBase(true);
+        } else {
+            vfModule.setIsBase(false);
+        }
+        return vfModule;
+    }
 
-		networkResource.setModelName(
-				testNull(networkNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_NAME)));
+    protected void setHeatInformationForVfModule(ToscaResourceStructure toscaResourceStructure,
+        VfResourceStructure vfResourceStructure, VfModule vfModule, VfModuleCustomization vfModuleCustomization,
+        Metadata vfMetadata) {
 
-		networkResource.setModelInvariantUUID(
-				testNull(networkNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_INVARIANTUUID)));
-		networkResource.setModelUUID(
-				testNull(networkNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_UUID)));
-		networkResource.setModelVersion(
-				testNull(networkNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_VERSION)));
+        Optional<VfModuleStructure> matchingObject = vfResourceStructure.getVfModuleStructure().stream()
+            .filter(vfModuleStruct -> vfModuleStruct.getVfModuleMetadata().getVfModuleModelUUID()
+                .equalsIgnoreCase(toscaResourceStructure.getSdcCsarHelper().getMetadataPropertyValue(vfMetadata,
+                    SdcPropertyNames.PROPERTY_NAME_VFMODULEMODELUUID)))
+            .findFirst();
 
-		networkResource.setAicVersionMax(aicMax);		
-		networkResource.setAicVersionMin(aicMin);
-		networkResource.setToscaNodeType(networkNodeTemplate.getType());
-		networkResource.setDescription(
-				testNull(networkNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_DESCRIPTION)));
-		networkResource.setOrchestrationMode(HEAT);	
-		networkResource.setHeatTemplate(heatTemplate); 
-		return networkResource;
-	}
-	
-	protected  CollectionNetworkResourceCustomization createNetworkCollection(NodeTemplate networkNodeTemplate,
-			ToscaResourceStructure toscaResourceStructure, Service service) {
+        if (matchingObject.isPresent()) {
+            List<HeatFiles> heatFilesList = new ArrayList<>();
+            List<HeatTemplate> volumeHeatChildTemplates = new ArrayList<HeatTemplate>();
+            List<HeatTemplate> heatChildTemplates = new ArrayList<HeatTemplate>();
+            HeatTemplate parentHeatTemplate = new HeatTemplate();
+            String parentArtifactType = null;
+            Set<String> artifacts = new HashSet<>(matchingObject.get().getVfModuleMetadata().getArtifacts());
+            for (VfModuleArtifact vfModuleArtifact : vfResourceStructure.getArtifactsMapByUUID().values()) {
 
-		CollectionNetworkResourceCustomization collectionNetworkResourceCustomization = new CollectionNetworkResourceCustomization();
+                List<HeatTemplate> childNestedHeatTemplates = new ArrayList<HeatTemplate>();
 
-		// **** Build Object to populate Collection_Resource table
-		CollectionResource collectionResource = new CollectionResource();
+                if (artifacts.contains(vfModuleArtifact.getArtifactInfo().getArtifactUUID())) {
+                    checkVfModuleArtifactType(vfModule, vfModuleCustomization, heatFilesList, vfModuleArtifact,
+                        childNestedHeatTemplates, parentHeatTemplate, vfResourceStructure);
+                }
 
-		collectionResource
-				.setModelName(networkNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_NAME));
-		collectionResource.setModelInvariantUUID(
-				networkNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_INVARIANTUUID));
-		collectionResource
-				.setModelUUID(networkNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_UUID));
-		collectionResource
-				.setModelVersion(networkNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_VERSION));
-		collectionResource
-				.setDescription(networkNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_DESCRIPTION));
-		collectionResource.setToscaNodeType(networkNodeTemplate.getType());
+                if (vfModuleArtifact.getArtifactInfo().getArtifactType().equals(ASDCConfiguration.HEAT_NESTED)) {
+                    parentArtifactType = identifyParentOfNestedTemplate(matchingObject.get(), vfModuleArtifact);
 
-		toscaResourceStructure.setCatalogCollectionResource(collectionResource);
+                    if (!childNestedHeatTemplates.isEmpty()) {
 
-		// **** Build object to populate Collection_Resource_Customization table
-		NetworkCollectionResourceCustomization ncfc = new NetworkCollectionResourceCustomization();
-		
-		ncfc.setFunction(toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(networkNodeTemplate,
-				"cr_function"));
-		ncfc.setRole(toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(networkNodeTemplate,
-				"cr_role"));
-		ncfc.setType(toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(networkNodeTemplate,
-				"cr_type"));
+                        if (parentArtifactType != null && parentArtifactType
+                            .equalsIgnoreCase(ASDCConfiguration.HEAT_VOL)) {
+                            volumeHeatChildTemplates.add(childNestedHeatTemplates.get(0));
+                        } else {
+                            heatChildTemplates.add(childNestedHeatTemplates.get(0));
+                        }
+                    }
+                }
 
-		ncfc.setModelInstanceName(networkNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_NAME));
-		ncfc.setModelCustomizationUUID(
-				networkNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID));
-		
-		Set<CollectionNetworkResourceCustomization> networkResourceCustomizationSet = new HashSet<>();
-		networkResourceCustomizationSet.add(collectionNetworkResourceCustomization);
+            }
+            if (!heatFilesList.isEmpty()) {
+                vfModule.setHeatFiles(heatFilesList);
+            }
 
-		ncfc.setNetworkResourceCustomization(networkResourceCustomizationSet);
+            // Set all Child Templates related to HEAT_VOLUME
+            if (!volumeHeatChildTemplates.isEmpty()) {
+                if (vfModule.getVolumeHeatTemplate() != null) {
+                    vfModule.getVolumeHeatTemplate().setChildTemplates(volumeHeatChildTemplates);
+                } else {
+                    logger.debug("VolumeHeatTemplate not set in setHeatInformationForVfModule()");
+                }
+            }
 
-		ncfc.setCollectionResource(collectionResource);
-		toscaResourceStructure.setCatalogCollectionResourceCustomization(ncfc);
-		
-		//*** Build object to populate the Instance_Group table
-		List<Group> groupList = toscaResourceStructure.getSdcCsarHelper()
-				.getGroupsOfOriginOfNodeTemplateByToscaGroupType(networkNodeTemplate,
-						"org.openecomp.groups.NetworkCollection");
-		
-		List<NetworkInstanceGroup> networkInstanceGroupList = new ArrayList<>();
+            // Set all Child Templates related to HEAT
+            if (!heatChildTemplates.isEmpty()) {
+                if (vfModule.getModuleHeatTemplate() != null) {
+                    vfModule.getModuleHeatTemplate().setChildTemplates(heatChildTemplates);
+                } else {
+                    logger.debug("ModuleHeatTemplate not set in setHeatInformationForVfModule()");
+                }
+            }
+        }
+    }
 
-		List<CollectionResourceInstanceGroupCustomization> collectionResourceInstanceGroupCustomizationList = new ArrayList<CollectionResourceInstanceGroupCustomization>();
+    protected void checkVfModuleArtifactType(VfModule vfModule, VfModuleCustomization vfModuleCustomization,
+        List<HeatFiles> heatFilesList, VfModuleArtifact vfModuleArtifact, List<HeatTemplate> nestedHeatTemplates,
+        HeatTemplate parentHeatTemplate, VfResourceStructure vfResourceStructure) {
+        if (vfModuleArtifact.getArtifactInfo().getArtifactType().equals(ASDCConfiguration.HEAT)) {
+            vfModuleArtifact.incrementDeployedInDB();
+            vfModule.setModuleHeatTemplate(vfModuleArtifact.getHeatTemplate());
+        } else if (vfModuleArtifact.getArtifactInfo().getArtifactType().equals(ASDCConfiguration.HEAT_VOL)) {
+            vfModule.setVolumeHeatTemplate(vfModuleArtifact.getHeatTemplate());
+            VfModuleArtifact volVfModuleArtifact = this
+                .getHeatEnvArtifactFromGeneratedArtifact(vfResourceStructure, vfModuleArtifact);
+            vfModuleCustomization.setVolumeHeatEnv(volVfModuleArtifact.getHeatEnvironment());
+            vfModuleArtifact.incrementDeployedInDB();
+        } else if (vfModuleArtifact.getArtifactInfo().getArtifactType().equals(ASDCConfiguration.HEAT_ENV)) {
+            if (vfModuleArtifact.getHeatEnvironment().getName().contains("volume")) {
+                vfModuleCustomization.setVolumeHeatEnv(vfModuleArtifact.getHeatEnvironment());
+            } else {
+                vfModuleCustomization.setHeatEnvironment(vfModuleArtifact.getHeatEnvironment());
+            }
+            vfModuleArtifact.incrementDeployedInDB();
+        } else if (vfModuleArtifact.getArtifactInfo().getArtifactType().equals(ASDCConfiguration.HEAT_ARTIFACT)) {
+            heatFilesList.add(vfModuleArtifact.getHeatFiles());
+            vfModuleArtifact.incrementDeployedInDB();
+        } else if (vfModuleArtifact.getArtifactInfo().getArtifactType().equals(ASDCConfiguration.HEAT_NESTED)) {
+            nestedHeatTemplates.add(vfModuleArtifact.getHeatTemplate());
+            vfModuleArtifact.incrementDeployedInDB();
+        }
+    }
 
-		for (Group group : groupList) { 
-			
-			NetworkInstanceGroup networkInstanceGroup = new NetworkInstanceGroup();
-			Metadata instanceMetadata = group.getMetadata();
-			networkInstanceGroup.setModelName(instanceMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_NAME));
-			networkInstanceGroup
-					.setModelInvariantUUID(instanceMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_INVARIANTUUID));
-			networkInstanceGroup.setModelUUID(instanceMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_UUID));
-			networkInstanceGroup.setModelVersion(instanceMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_VERSION));
-			networkInstanceGroup.setToscaNodeType(group.getType());
-			networkInstanceGroup.setRole(SubType.SUB_INTERFACE.toString()); // Set
-																			// Role
-			networkInstanceGroup.setType(InstanceGroupType.L3_NETWORK); // Set
-																		// type
-			networkInstanceGroup.setCollectionResource(collectionResource);
-		
-			// ****Build object to populate
-			// Collection_Resource_Instance_Group_Customization table
-			CollectionResourceInstanceGroupCustomization crInstanceGroupCustomization = new CollectionResourceInstanceGroupCustomization();
-			crInstanceGroupCustomization.setInstanceGroup(networkInstanceGroup);
-			crInstanceGroupCustomization.setModelUUID(instanceMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_UUID));
-			crInstanceGroupCustomization.setModelCustomizationUUID(
-					networkNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID));
-		
-			// Loop through the template policy to find the subinterface_network_quantity property name.  Then extract the value for it.
-			List<Policy> policyList = toscaResourceStructure.getSdcCsarHelper().getPoliciesOfOriginOfNodeTemplateByToscaPolicyType(networkNodeTemplate, "org.openecomp.policies.scaling.Fixed");
-			
-			if(policyList != null){
-				for(Policy policy : policyList){
-					for(String policyNetworkCollection : policy.getTargets()){
-						
-						if(policyNetworkCollection.equalsIgnoreCase(group.getName())){
-						
-							Map<String, Object> propMap = policy.getPolicyProperties();
-					
-							if(propMap.get("quantity") != null){
-																
-								String quantity = toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(networkNodeTemplate, getPropertyInput(propMap.get("quantity").toString())); 
-					
-								if(quantity != null){
-									crInstanceGroupCustomization.setSubInterfaceNetworkQuantity(Integer.parseInt(quantity));
-								}
-												
-						    }
-					
-				       }
-				    }
-			    }	
-			}
-					
-			crInstanceGroupCustomization.setDescription(
-					toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(networkNodeTemplate,
-							instanceMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_NAME)
-									+ "_network_collection_description"));
-			crInstanceGroupCustomization.setFunction(
-					toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(networkNodeTemplate,
-							instanceMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_NAME)
-									+ "_network_collection_function"));
-			crInstanceGroupCustomization.setCollectionResourceCust(ncfc);
-			collectionResourceInstanceGroupCustomizationList.add(crInstanceGroupCustomization);
+    protected VnfResourceCustomization createVnfResource(NodeTemplate vfNodeTemplate,
+        ToscaResourceStructure toscaResourceStructure, Service service) {
+        VnfResourceCustomization vnfResourceCustomization = vnfCustomizationRepo.findOneByModelCustomizationUUID(
+            vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID));
+        if (vnfResourceCustomization == null) {
+            VnfResource vnfResource = findExistingVnfResource(service,
+                vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_UUID));
 
-			networkInstanceGroup
-					.setCollectionInstanceGroupCustomizations(collectionResourceInstanceGroupCustomizationList);
+            if (vnfResource == null) {
+                vnfResource = createVnfResource(vfNodeTemplate);
+            }
 
-			networkInstanceGroupList.add(networkInstanceGroup);
+            vnfResourceCustomization = createVnfResourceCustomization(vfNodeTemplate, toscaResourceStructure,
+                vnfResource);
+            vnfResourceCustomization.setVnfResources(vnfResource);
+            vnfResource.getVnfResourceCustomizations().add(vnfResourceCustomization);
 
+            // Fetch VNFC Instance Group Info
+            List<Group> groupList = toscaResourceStructure.getSdcCsarHelper()
+                .getGroupsOfOriginOfNodeTemplateByToscaGroupType(vfNodeTemplate,
+                    "org.openecomp.groups.VfcInstanceGroup");
 
-		toscaResourceStructure.setCatalogNetworkInstanceGroup(networkInstanceGroupList);
+            for (Group group : groupList) {
 
-		List<NodeTemplate> vlNodeList = toscaResourceStructure.getSdcCsarHelper()
-				.getNodeTemplateBySdcType(networkNodeTemplate, SdcTypes.VL);
-		
-		List<CollectionNetworkResourceCustomization> collectionNetworkResourceCustomizationList = new ArrayList<>();
-		
-		//*****Build object to populate the NetworkResource table
-		NetworkResource networkResource = new NetworkResource();
-		
-		for(NodeTemplate vlNodeTemplate : vlNodeList){
+                VnfcInstanceGroupCustomization vnfcInstanceGroupCustomization = createVNFCInstanceGroup(vfNodeTemplate,
+                    group, vnfResourceCustomization, toscaResourceStructure);
 
-			String providerNetwork = toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(
-					vlNodeTemplate, SdcPropertyNames.PROPERTY_NAME_PROVIDERNETWORK_ISPROVIDERNETWORK);
+                vnfcInstanceGroupCustomizationRepo.saveAndFlush(vnfcInstanceGroupCustomization);
+            }
+        }
+        return vnfResourceCustomization;
+    }
 
-			if ("true".equalsIgnoreCase(providerNetwork)) {
-				networkResource.setNeutronNetworkType(PROVIDER);
-			} else {
-				networkResource.setNeutronNetworkType(BASIC);
-			}
+    protected VnfResource findExistingVnfResource(Service service, String modelUUID) {
+        VnfResource vnfResource = null;
+        for (VnfResourceCustomization vnfResourceCustom : service.getVnfCustomizations()) {
+            if (vnfResourceCustom.getVnfResources() != null
+                && vnfResourceCustom.getVnfResources().getModelUUID().equals(modelUUID)) {
+                vnfResource = vnfResourceCustom.getVnfResources();
+            }
+        }
+        if (vnfResource == null) {
+            vnfResource = vnfRepo.findResourceByModelUUID(modelUUID);
+        }
 
-			networkResource.setModelName(vlNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_NAME));
+        return vnfResource;
+    }
 
-			networkResource.setModelInvariantUUID(
-					vlNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_INVARIANTUUID));
-			networkResource.setModelUUID(vlNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_UUID));
-			networkResource
-					.setModelVersion(vlNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_VERSION));
+    protected VnfResourceCustomization createVnfResourceCustomization(NodeTemplate vfNodeTemplate,
+        ToscaResourceStructure toscaResourceStructure, VnfResource vnfResource) {
+        VnfResourceCustomization vnfResourceCustomization = new VnfResourceCustomization();
+        vnfResourceCustomization.setModelCustomizationUUID(
+            testNull(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID)));
+        vnfResourceCustomization.setModelInstanceName(vfNodeTemplate.getName());
 
-			networkResource.setAicVersionMax(
-					vlNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_MAXINSTANCES));
-			
-			TempNetworkHeatTemplateLookup tempNetworkLookUp = tempNetworkLookupRepo.findFirstBynetworkResourceModelName(
-					vlNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_NAME));
-			
-			if (tempNetworkLookUp != null ) {	
-					
-				HeatTemplate heatTemplate = heatRepo
-						.findByArtifactUuid(tempNetworkLookUp.getHeatTemplateArtifactUuid());
-					networkResource.setHeatTemplate(heatTemplate);
-					
-					networkResource.setAicVersionMin(tempNetworkLookUp.getAicVersionMin());
-					
-			}
+        vnfResourceCustomization.setNfFunction(testNull(toscaResourceStructure.getSdcCsarHelper()
+            .getNodeTemplatePropertyLeafValue(vfNodeTemplate, SdcPropertyNames.PROPERTY_NAME_NFFUNCTION)));
+        vnfResourceCustomization.setNfNamingCode(testNull(toscaResourceStructure.getSdcCsarHelper()
+            .getNodeTemplatePropertyLeafValue(vfNodeTemplate, "nf_naming_code")));
+        vnfResourceCustomization.setNfRole(testNull(toscaResourceStructure.getSdcCsarHelper()
+            .getNodeTemplatePropertyLeafValue(vfNodeTemplate, SdcPropertyNames.PROPERTY_NAME_NFROLE)));
+        vnfResourceCustomization.setNfType(testNull(toscaResourceStructure.getSdcCsarHelper()
+            .getNodeTemplatePropertyLeafValue(vfNodeTemplate, SdcPropertyNames.PROPERTY_NAME_NFTYPE)));
 
-			networkResource.setToscaNodeType(vlNodeTemplate.getType());
-			networkResource
-					.setDescription(vlNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_DESCRIPTION));
-			networkResource.setOrchestrationMode(HEAT);
-			
-			// Build object to populate the
-			// Collection_Network_Resource_Customization table
-			for (NodeTemplate memberNode : group.getMemberNodes()) {
-				collectionNetworkResourceCustomization.setModelInstanceName(memberNode.getName());
-			}
+        vnfResourceCustomization.setMultiStageDesign(toscaResourceStructure.getSdcCsarHelper()
+            .getNodeTemplatePropertyLeafValue(vfNodeTemplate, MULTI_STAGE_DESIGN));
 
-			collectionNetworkResourceCustomization.setModelCustomizationUUID(
-					vlNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID));
+        vnfResourceCustomization.setBlueprintName(testNull(toscaResourceStructure.getSdcCsarHelper()
+            .getNodeTemplatePropertyLeafValue(vfNodeTemplate, SDNC_MODEL_NAME)));
 
-			collectionNetworkResourceCustomization.setNetworkTechnology(
-					toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(vlNodeTemplate,
-							SdcPropertyNames.PROPERTY_NAME_NETWORKTECHNOLOGY));
-			collectionNetworkResourceCustomization.setNetworkType(toscaResourceStructure.getSdcCsarHelper()
-					.getNodeTemplatePropertyLeafValue(vlNodeTemplate, SdcPropertyNames.PROPERTY_NAME_NETWORKTYPE));
-			collectionNetworkResourceCustomization.setNetworkRole(toscaResourceStructure.getSdcCsarHelper()
-					.getNodeTemplatePropertyLeafValue(vlNodeTemplate, SdcPropertyNames.PROPERTY_NAME_NETWORKROLE));
-			collectionNetworkResourceCustomization.setNetworkScope(toscaResourceStructure.getSdcCsarHelper()
-					.getNodeTemplatePropertyLeafValue(vlNodeTemplate, SdcPropertyNames.PROPERTY_NAME_NETWORKSCOPE));
-			collectionNetworkResourceCustomization.setInstanceGroup(networkInstanceGroup);
-			collectionNetworkResourceCustomization.setNetworkResource(networkResource);
-			collectionNetworkResourceCustomization.setNetworkResourceCustomization(ncfc);
-			
-			collectionNetworkResourceCustomizationList.add(collectionNetworkResourceCustomization);
-		   }
+        vnfResourceCustomization.setBlueprintVersion(testNull(toscaResourceStructure.getSdcCsarHelper()
+            .getNodeTemplatePropertyLeafValue(vfNodeTemplate, SDNC_MODEL_VERSION)));
 
-		}
-		
-		return collectionNetworkResourceCustomization;
-	}
-	
-	protected VnfcInstanceGroupCustomization createVNFCInstanceGroup(NodeTemplate vnfcNodeTemplate, Group group,
-			VnfResourceCustomization vnfResourceCustomization, ToscaResourceStructure toscaResourceStructure) {
+        vnfResourceCustomization.setVnfResources(vnfResource);
+        vnfResourceCustomization.setAvailabilityZoneMaxCount(Integer.getInteger(
+            vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_AVAILABILITYZONECOUNT)));
 
-			Metadata instanceMetadata = group.getMetadata();
-			// Populate InstanceGroup
-			VFCInstanceGroup vfcInstanceGroup = new VFCInstanceGroup();
-			
-			vfcInstanceGroup.setModelName(instanceMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_NAME));
-			vfcInstanceGroup.setModelInvariantUUID(instanceMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_INVARIANTUUID));
-			vfcInstanceGroup.setModelUUID(instanceMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_UUID));
-			vfcInstanceGroup.setModelVersion(instanceMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_VERSION));
-			vfcInstanceGroup.setToscaNodeType(group.getType());
-			vfcInstanceGroup.setRole("SUB-INTERFACE");   // Set Role
-			vfcInstanceGroup.setType(InstanceGroupType.VNFC);  // Set type	
-			
-			//Populate VNFCInstanceGroupCustomization
-			VnfcInstanceGroupCustomization vfcInstanceGroupCustom = new VnfcInstanceGroupCustomization();
-			
-			vfcInstanceGroupCustom.setModelCustomizationUUID(vnfResourceCustomization.getModelCustomizationUUID());
-			vfcInstanceGroupCustom.setModelUUID(instanceMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_UUID));
-			vfcInstanceGroupCustom.setDescription(instanceMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_DESCRIPTION));
-						
-			String getInputName = null;
-			String groupProperty = toscaResourceStructure.getSdcCsarHelper().getGroupPropertyLeafValue(group, "vfc_instance_group_function"); 
-			if (groupProperty != null) { 
-			int getInputIndex = groupProperty.indexOf("{get_input="); 
-				if (getInputIndex > -1) { 
-					getInputName = groupProperty.substring(getInputIndex+11, groupProperty.length()-1); 
-				} 
-			}
-			vfcInstanceGroupCustom.setFunction(toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(vnfcNodeTemplate, getInputName));
-			
-			vfcInstanceGroupCustom.setInstanceGroup(vfcInstanceGroup);
-			vfcInstanceGroupCustom.setVnfResourceCust(vnfResourceCustomization);		
-			
-		return vfcInstanceGroupCustom;
+        CapabilityAssignments vnfCustomizationCapability = toscaResourceStructure.getSdcCsarHelper()
+            .getCapabilitiesOf(vfNodeTemplate);
 
-	}
-		
-	protected VfModuleCustomization createVFModuleResource(Group group, NodeTemplate vfTemplate,
-			ToscaResourceStructure toscaResourceStructure, VfResourceStructure vfResourceStructure,
-			IVfModuleData vfModuleData, VnfResourceCustomization vnfResource, Service service, Set<CvnfcCustomization> existingCvnfcSet, Set<VnfcCustomization> existingVnfcSet) {
-		
-		VfModuleCustomization vfModuleCustomization = findExistingVfModuleCustomization(vnfResource,
-				vfModuleData.getVfModuleModelCustomizationUUID());
-		if(vfModuleCustomization == null){		
-			VfModule vfModule = findExistingVfModule(vnfResource,
-					vfTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_VFMODULEMODELUUID));
-			Metadata vfMetadata = group.getMetadata();
-			if(vfModule==null)
-				vfModule=createVfModule(group, toscaResourceStructure, vfModuleData, vfMetadata);
-			
-			vfModuleCustomization = createVfModuleCustomization(group, toscaResourceStructure, vfModule, vfModuleData);
-			setHeatInformationForVfModule(toscaResourceStructure, vfResourceStructure, vfModule, vfModuleCustomization,
-					vfMetadata);
-			vfModuleCustomization.setVfModule(vfModule);
-			vfModule.getVfModuleCustomization().add(vfModuleCustomization);
-			vnfResource.getVfModuleCustomizations().add(vfModuleCustomization);
-		} else {
-			vfResourceStructure.setAlreadyDeployed(true);
-		}
-		
-		//******************************************************************************************************************
-		//* Extract VFC's and CVFC's then add them to VFModule
-		//******************************************************************************************************************
-		
-		Set<VnfVfmoduleCvnfcConfigurationCustomization> vnfVfmoduleCvnfcConfigurationCustomizations = new HashSet<VnfVfmoduleCvnfcConfigurationCustomization>();		
-		Set<CvnfcCustomization> cvnfcCustomizations = new HashSet<CvnfcCustomization>();
-		Set<VnfcCustomization> vnfcCustomizations = new HashSet<VnfcCustomization>();
-		
-		// Only set the CVNFC if this vfModule group is a member of it.  
-		List<NodeTemplate> groupMembers = toscaResourceStructure.getSdcCsarHelper().getMembersOfVfModule(vfTemplate, group); 
-		String vfModuleMemberName = null;
-		
-		for(NodeTemplate node : groupMembers){		
-			vfModuleMemberName = node.getName();
-		}
-		
-		// Extract CVFC lists
-		List<NodeTemplate> cvfcList = toscaResourceStructure.getSdcCsarHelper().getNodeTemplateBySdcType(vfTemplate, SdcTypes.CVFC);
-						
-		for(NodeTemplate cvfcTemplate : cvfcList) {
-			
-			if(vfModuleMemberName != null && vfModuleMemberName.equalsIgnoreCase(cvfcTemplate.getName())){
-			
-			//Extract associated VFC - Should always be just one
-			List<NodeTemplate> vfcList = toscaResourceStructure.getSdcCsarHelper().getNodeTemplateBySdcType(cvfcTemplate, SdcTypes.VFC);
-						
-			for(NodeTemplate vfcTemplate : vfcList) {
-				
-				VnfcCustomization vnfcCustomization = new VnfcCustomization();
-				VnfcCustomization existingVnfcCustomization = null;
-				
-				existingVnfcCustomization = findExistingVfc(existingVnfcSet, vfcTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID));
-				
-				if(existingVnfcCustomization == null){
-					vnfcCustomization = new VnfcCustomization();
-				} else {
-					vnfcCustomization = existingVnfcCustomization;
-				}
-					
-				// Only Add Abstract VNFC's to our DB, ignore all others
-				if(existingVnfcCustomization == null && vfcTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_SUBCATEGORY).equalsIgnoreCase("Abstract")){
-					vnfcCustomization.setModelCustomizationUUID(vfcTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID));
-					vnfcCustomization.setModelInstanceName(vfcTemplate.getName());
-					vnfcCustomization.setModelInvariantUUID(vfcTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_INVARIANTUUID));
-					vnfcCustomization.setModelName(vfcTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_NAME));
-					vnfcCustomization.setModelUUID(vfcTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_UUID));
-	
-					vnfcCustomization.setModelVersion(
-							testNull(vfcTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_VERSION)));
-					vnfcCustomization.setDescription(
-							testNull(vfcTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_DESCRIPTION)));
-					vnfcCustomization.setToscaNodeType(testNull(vfcTemplate.getType()));
-					
-					vnfcCustomizations.add(vnfcCustomization);
-					existingVnfcSet.add(vnfcCustomization);
-				}
-			
-			// This check is needed incase the VFC subcategory is something other than Abstract.  In that case we want to skip adding that record to our DB.
-			if(vnfcCustomization.getModelCustomizationUUID() != null){
-				
-					CvnfcCustomization cvnfcCustomization = new CvnfcCustomization();
-	
-					cvnfcCustomization = new CvnfcCustomization();
-					cvnfcCustomization.setModelCustomizationUUID(cvfcTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID));
-					cvnfcCustomization.setModelInstanceName(cvfcTemplate.getName());
-					cvnfcCustomization.setModelInvariantUUID(cvfcTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_INVARIANTUUID));
-					cvnfcCustomization.setModelName(cvfcTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_NAME));
-					cvnfcCustomization.setModelUUID(cvfcTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_UUID));
-		
-					cvnfcCustomization.setModelVersion(
-							testNull(cvfcTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_VERSION)));
-					cvnfcCustomization.setDescription(
-							testNull(cvfcTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_DESCRIPTION)));
-					cvnfcCustomization.setToscaNodeType(testNull(cvfcTemplate.getType()));
-					
-					if(existingVnfcCustomization != null){
-						cvnfcCustomization.setVnfcCustomization(existingVnfcCustomization);
-					}else{
-						cvnfcCustomization.setVnfcCustomization(vnfcCustomization);
-					}
-					
-					cvnfcCustomization.setNfcFunction(toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(cvfcTemplate, "nfc_function"));
-					cvnfcCustomization.setNfcNamingCode(toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(cvfcTemplate, "nfc_naming_code"));
-					cvnfcCustomization.setVfModuleCustomization(vfModuleCustomization);
-					cvnfcCustomization.setVnfResourceCustomization(vnfResource);
-	
-					cvnfcCustomizations.add(cvnfcCustomization);
-					existingCvnfcSet.add(cvnfcCustomization);				
-			
-			//*****************************************************************************************************************************************
-			//* Extract Fabric Configuration
-			//*****************************************************************************************************************************************
-			
-			List<NodeTemplate> fabricConfigList = toscaResourceStructure.getSdcCsarHelper().getNodeTemplateBySdcType(vfTemplate, SdcTypes.CONFIGURATION);
-								
-			for(NodeTemplate fabricTemplate : fabricConfigList) {
-										
-				ConfigurationResource fabricConfig = null;
-				
-				ConfigurationResource existingConfig = findExistingConfiguration(service, fabricTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_UUID));
-								
-				if(existingConfig == null){
-					
-					fabricConfig = createFabricConfiguration(fabricTemplate, toscaResourceStructure);
-					
-				}else {
-					fabricConfig = existingConfig;
-				}				
-				
-				VnfVfmoduleCvnfcConfigurationCustomization vnfVfmoduleCvnfcConfigurationCustomization = createVfCnvfConfigCustomization(fabricTemplate, toscaResourceStructure, 
-																			   vnfResource, vfModuleCustomization, cvnfcCustomization, fabricConfig, vfTemplate, vfModuleMemberName);
-				vnfVfmoduleCvnfcConfigurationCustomizations.add(vnfVfmoduleCvnfcConfigurationCustomization);
-			}
-			cvnfcCustomization.setVnfVfmoduleCvnfcConfigurationCustomization(vnfVfmoduleCvnfcConfigurationCustomizations);
-			}
-			
-		   }
-			
-		  }
-		} 
-		vfModuleCustomization.setCvnfcCustomization(cvnfcCustomizations);
-		vfModuleCustomization.setVnfVfmoduleCvnfcConfigurationCustomization(vnfVfmoduleCvnfcConfigurationCustomizations);
-		
-		return vfModuleCustomization;
-	}
-	
-	protected VnfVfmoduleCvnfcConfigurationCustomization createVfCnvfConfigCustomization(NodeTemplate fabricTemplate, ToscaResourceStructure toscaResourceStruct, 
-            VnfResourceCustomization vnfResource, VfModuleCustomization vfModuleCustomization, CvnfcCustomization cvnfcCustomization,
-            ConfigurationResource configResource, NodeTemplate vfTemplate, String vfModuleMemberName) {
+        if (vnfCustomizationCapability != null) {
+            CapabilityAssignment capAssign = vnfCustomizationCapability.getCapabilityByName(SCALABLE);
 
-		Metadata fabricMetadata = fabricTemplate.getMetaData();	
-				
-		VnfVfmoduleCvnfcConfigurationCustomization vfModuleToCvnfc = new VnfVfmoduleCvnfcConfigurationCustomization();
-		
-		vfModuleToCvnfc.setConfigurationResource(configResource);
-		vfModuleToCvnfc.setCvnfcCustomization(cvnfcCustomization);
-		vfModuleToCvnfc.setModelCustomizationUUID(fabricMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID));
-		vfModuleToCvnfc.setModelInstanceName(fabricTemplate.getName());
-		vfModuleToCvnfc.setVfModuleCustomization(vfModuleCustomization);
-		vfModuleToCvnfc.setVnfResourceCustomization(vnfResource);
-		
-		List<Policy> policyList = toscaResourceStruct.getSdcCsarHelper().getPoliciesOfOriginOfNodeTemplateByToscaPolicyType(vfTemplate, "org.openecomp.policies.External");
-		
-		if(policyList != null){
-			for(Policy policy : policyList){
-				
-				for(String policyCvfcTarget : policy.getTargets()){
-					
-					if(policyCvfcTarget.equalsIgnoreCase(vfModuleMemberName)){
-				
-						Map<String, Object> propMap = policy.getPolicyProperties();
+            if (capAssign != null) {
+                vnfResourceCustomization.setMinInstances(Integer.getInteger(toscaResourceStructure.getSdcCsarHelper()
+                    .getCapabilityPropertyLeafValue(capAssign, SdcPropertyNames.PROPERTY_NAME_MININSTANCES)));
+                vnfResourceCustomization.setMaxInstances(Integer.getInteger(toscaResourceStructure.getSdcCsarHelper()
+                    .getCapabilityPropertyLeafValue(capAssign, SdcPropertyNames.PROPERTY_NAME_MAXINSTANCES)));
+            }
 
-						if(propMap.get("type").toString().equalsIgnoreCase("Fabric Policy")){
-							vfModuleToCvnfc.setPolicyName(propMap.get("name").toString());
-						}
-					}
-			    }
-		    }			
-		}
-		
-		vfModuleToCvnfc.setConfigurationFunction(toscaResourceStruct.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(fabricTemplate, "function"));
-		vfModuleToCvnfc.setConfigurationRole(toscaResourceStruct.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(fabricTemplate, "role"));
-		vfModuleToCvnfc.setConfigurationType(toscaResourceStruct.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(fabricTemplate, "type"));
-			
-		return vfModuleToCvnfc;
-	}
-		
-	protected ConfigurationResource findExistingConfiguration(Service service, String modelUUID) {
-		ConfigurationResource configResource = null;
-		for(ConfigurationResourceCustomization configurationResourceCustom : service.getConfigurationCustomizations()){
-			if (configurationResourceCustom.getConfigurationResource() != null
-					&& configurationResourceCustom.getConfigurationResource().getModelUUID().equals(modelUUID)) {
-				configResource = configurationResourceCustom.getConfigurationResource();
-			}
-		}
-		if(configResource==null)
-			configResource = configRepo.findResourceByModelUUID(modelUUID);
-		
-		return configResource;
-	}
-		
-	protected VfModuleCustomization findExistingVfModuleCustomization(VnfResourceCustomization vnfResource,
-			String vfModuleModelCustomizationUUID) {
-		VfModuleCustomization vfModuleCustomization = null;
-		for(VfModuleCustomization vfModuleCustom : vnfResource.getVfModuleCustomizations()){
-			if(vfModuleCustom.getModelCustomizationUUID().equalsIgnoreCase(vfModuleModelCustomizationUUID)){
-				vfModuleCustomization = vfModuleCustom;
-			}
-		}
-		if(vfModuleCustomization==null)
-			vfModuleCustomization = vfModuleCustomizationRepo
-					.findByModelCustomizationUUID(vfModuleModelCustomizationUUID);
-		
-		return vfModuleCustomization;
-	}
+        }
 
-	protected VfModule findExistingVfModule(VnfResourceCustomization vnfResource, String modelUUID) {
-		VfModule vfModule = null;
-		for(VfModuleCustomization vfModuleCustom : vnfResource.getVfModuleCustomizations()){
-			if(vfModuleCustom.getVfModule() != null && vfModuleCustom.getVfModule().getModelUUID().equals(modelUUID)){
-				vfModule = vfModuleCustom.getVfModule();
-			}
-		}
-		if(vfModule==null)
-			vfModule = vfModuleRepo.findByModelUUID(modelUUID);
-		
-		return vfModule;
-	}
+        toscaResourceStructure.setCatalogVnfResourceCustomization(vnfResourceCustomization);
 
-	protected VfModuleCustomization createVfModuleCustomization(Group group,
-			ToscaResourceStructure toscaResourceStructure, VfModule vfModule, IVfModuleData vfModuleData) {
-		VfModuleCustomization vfModuleCustomization = new VfModuleCustomization();
-		
-		vfModuleCustomization.setModelCustomizationUUID(vfModuleData.getVfModuleModelCustomizationUUID());
+        return vnfResourceCustomization;
+    }
 
-		vfModuleCustomization.setVfModule(vfModule);
+    protected VnfResource createVnfResource(NodeTemplate vfNodeTemplate) {
+        VnfResource vnfResource = new VnfResource();
+        vnfResource.setModelInvariantUUID(
+            testNull(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_INVARIANTUUID)));
+        vnfResource.setModelName(testNull(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_NAME)));
+        vnfResource.setModelUUID(testNull(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_UUID)));
 
-		String initialCount = toscaResourceStructure.getSdcCsarHelper().getGroupPropertyLeafValue(group,
-				SdcPropertyNames.PROPERTY_NAME_INITIALCOUNT);
-		if (initialCount != null && initialCount.length() > 0) {
-			vfModuleCustomization.setInitialCount(Integer.valueOf(initialCount));
-		}
+        vnfResource.setModelVersion(
+            testNull(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_VERSION)));
+        vnfResource.setDescription(
+            testNull(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_DESCRIPTION)));
+        vnfResource.setOrchestrationMode(HEAT);
+        vnfResource.setToscaNodeType(testNull(vfNodeTemplate.getType()));
+        vnfResource.setAicVersionMax(
+            testNull(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_MAXINSTANCES)));
+        vnfResource.setAicVersionMin(
+            testNull(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_MININSTANCES)));
+        vnfResource.setCategory(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_CATEGORY));
+        vnfResource.setSubCategory(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_SUBCATEGORY));
 
-		vfModuleCustomization.setInitialCount(Integer.valueOf(toscaResourceStructure.getSdcCsarHelper()
-				.getGroupPropertyLeafValue(group, SdcPropertyNames.PROPERTY_NAME_INITIALCOUNT)));
+        return vnfResource;
+    }
 
-		String availabilityZoneCount = toscaResourceStructure.getSdcCsarHelper().getGroupPropertyLeafValue(group,
-				SdcPropertyNames.PROPERTY_NAME_AVAILABILITYZONECOUNT);
-		if (availabilityZoneCount != null && availabilityZoneCount.length() > 0) {
-			vfModuleCustomization.setAvailabilityZoneCount(Integer.valueOf(availabilityZoneCount));
-		}
+    protected AllottedResourceCustomization createAllottedResource(NodeTemplate nodeTemplate,
+        ToscaResourceStructure toscaResourceStructure, Service service) {
+        AllottedResourceCustomization allottedResourceCustomization = allottedCustomizationRepo
+            .findOneByModelCustomizationUUID(
+                nodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID));
 
-		vfModuleCustomization.setLabel(toscaResourceStructure.getSdcCsarHelper().getGroupPropertyLeafValue(group,
-				SdcPropertyNames.PROPERTY_NAME_VFMODULELABEL));
+        if (allottedResourceCustomization == null) {
+            AllottedResource allottedResource = findExistingAllottedResource(service,
+                nodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_UUID));
 
-		String maxInstances = toscaResourceStructure.getSdcCsarHelper().getGroupPropertyLeafValue(group,
-				SdcPropertyNames.PROPERTY_NAME_MAXVFMODULEINSTANCES);
-		if (maxInstances != null && maxInstances.length() > 0) {
-			vfModuleCustomization.setMaxInstances(Integer.valueOf(maxInstances));
-		}
+            if (allottedResource == null) {
+                allottedResource = createAR(nodeTemplate);
+            }
 
-		String minInstances = toscaResourceStructure.getSdcCsarHelper().getGroupPropertyLeafValue(group,
-				SdcPropertyNames.PROPERTY_NAME_MINVFMODULEINSTANCES);
-		if (minInstances != null && minInstances.length() > 0) {
-			vfModuleCustomization.setMinInstances(Integer.valueOf(minInstances));
-		}
-		return vfModuleCustomization;
-	}
+            toscaResourceStructure.setAllottedResource(allottedResource);
+            allottedResourceCustomization = createAllottedResourceCustomization(nodeTemplate, toscaResourceStructure);
+            allottedResourceCustomization.setAllottedResource(allottedResource);
+            allottedResource.getAllotedResourceCustomization().add(allottedResourceCustomization);
+        }
+        return allottedResourceCustomization;
+    }
 
-	protected VfModule createVfModule(Group group, ToscaResourceStructure toscaResourceStructure,
-			IVfModuleData vfModuleData, Metadata vfMetadata) {
-		VfModule vfModule = new VfModule();
-		String vfModuleModelUUID = vfModuleData.getVfModuleModelUUID();
+    protected AllottedResource findExistingAllottedResource(Service service, String modelUUID) {
+        AllottedResource allottedResource = null;
+        for (AllottedResourceCustomization allottedResourceCustom : service.getAllottedCustomizations()) {
+            if (allottedResourceCustom.getAllottedResource() != null
+                && allottedResourceCustom.getAllottedResource().getModelUUID().equals(modelUUID)) {
+                allottedResource = allottedResourceCustom.getAllottedResource();
+            }
+        }
+        if (allottedResource == null) {
+            allottedResource = allottedRepo.findResourceByModelUUID(modelUUID);
+        }
 
-		if(vfModuleModelUUID == null) {
-			vfModuleModelUUID = testNull(toscaResourceStructure.getSdcCsarHelper().getMetadataPropertyValue(vfMetadata,
-					SdcPropertyNames.PROPERTY_NAME_VFMODULEMODELUUID));
-		} else if (vfModuleModelUUID.indexOf('.') > -1) {
-			vfModuleModelUUID = vfModuleModelUUID.substring(0, vfModuleModelUUID.indexOf('.'));
-		}
+        return allottedResource;
+    }
 
-		vfModule.setModelInvariantUUID(testNull(toscaResourceStructure.getSdcCsarHelper()
-				.getMetadataPropertyValue(vfMetadata, SdcPropertyNames.PROPERTY_NAME_VFMODULEMODELINVARIANTUUID)));
-		vfModule.setModelName(testNull(toscaResourceStructure.getSdcCsarHelper().getMetadataPropertyValue(vfMetadata,
-				SdcPropertyNames.PROPERTY_NAME_VFMODULEMODELNAME)));
-		vfModule.setModelUUID(vfModuleModelUUID);
-		vfModule.setModelVersion(testNull(toscaResourceStructure.getSdcCsarHelper().getMetadataPropertyValue(vfMetadata,
-				SdcPropertyNames.PROPERTY_NAME_VFMODULEMODELVERSION)));
-		vfModule.setDescription(testNull(toscaResourceStructure.getSdcCsarHelper().getMetadataPropertyValue(vfMetadata,
-				SdcPropertyNames.PROPERTY_NAME_DESCRIPTION)));
+    protected AllottedResourceCustomization createAllottedResourceCustomization(NodeTemplate nodeTemplate,
+        ToscaResourceStructure toscaResourceStructure) {
+        AllottedResourceCustomization allottedResourceCustomization = new AllottedResourceCustomization();
+        allottedResourceCustomization.setModelCustomizationUUID(
+            testNull(nodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID)));
+        allottedResourceCustomization.setModelInstanceName(nodeTemplate.getName());
 
-		String vfModuleType = toscaResourceStructure.getSdcCsarHelper().getGroupPropertyLeafValue(group,
-				SdcPropertyNames.PROPERTY_NAME_VFMODULETYPE);
-		if (vfModuleType != null && "Base".equalsIgnoreCase(vfModuleType)) {
-			vfModule.setIsBase(true);
-		} else {
-			vfModule.setIsBase(false);
-		}
-		return vfModule;
-	}
+        allottedResourceCustomization.setNfFunction(testNull(toscaResourceStructure.getSdcCsarHelper()
+            .getNodeTemplatePropertyLeafValue(nodeTemplate, SdcPropertyNames.PROPERTY_NAME_NFFUNCTION)));
+        allottedResourceCustomization.setNfNamingCode(testNull(toscaResourceStructure.getSdcCsarHelper()
+            .getNodeTemplatePropertyLeafValue(nodeTemplate, "nf_naming_code")));
+        allottedResourceCustomization.setNfRole(testNull(toscaResourceStructure.getSdcCsarHelper()
+            .getNodeTemplatePropertyLeafValue(nodeTemplate, SdcPropertyNames.PROPERTY_NAME_NFROLE)));
+        allottedResourceCustomization.setNfType(testNull(toscaResourceStructure.getSdcCsarHelper()
+            .getNodeTemplatePropertyLeafValue(nodeTemplate, SdcPropertyNames.PROPERTY_NAME_NFTYPE)));
 
-	protected void setHeatInformationForVfModule(ToscaResourceStructure toscaResourceStructure,
-			VfResourceStructure vfResourceStructure, VfModule vfModule, VfModuleCustomization vfModuleCustomization,
-			Metadata vfMetadata) {
-				
-		Optional<VfModuleStructure> matchingObject = vfResourceStructure.getVfModuleStructure().stream()
-				.filter(vfModuleStruct -> vfModuleStruct.getVfModuleMetadata().getVfModuleModelUUID()
-						.equalsIgnoreCase(toscaResourceStructure.getSdcCsarHelper().getMetadataPropertyValue(vfMetadata,
-								SdcPropertyNames.PROPERTY_NAME_VFMODULEMODELUUID)))
-				.findFirst();
+        List<NodeTemplate> vfcNodes = toscaResourceStructure.getSdcCsarHelper()
+            .getVfcListByVf(allottedResourceCustomization.getModelCustomizationUUID());
 
-		if (matchingObject.isPresent()) {
-			List<HeatFiles> heatFilesList = new ArrayList<>();
-			List<HeatTemplate> volumeHeatChildTemplates = new ArrayList<HeatTemplate>();
-			List<HeatTemplate> heatChildTemplates = new ArrayList<HeatTemplate>();
-			HeatTemplate parentHeatTemplate = new HeatTemplate();
-			String parentArtifactType = null;
-			Set<String> artifacts = new HashSet<>(matchingObject.get().getVfModuleMetadata().getArtifacts());
-			for (VfModuleArtifact vfModuleArtifact : vfResourceStructure.getArtifactsMapByUUID().values()) {
-				
-				List<HeatTemplate> childNestedHeatTemplates = new ArrayList<HeatTemplate>();
-				
-				if (artifacts.contains(vfModuleArtifact.getArtifactInfo().getArtifactUUID())) {
-					checkVfModuleArtifactType(vfModule, vfModuleCustomization, heatFilesList, vfModuleArtifact,
-							childNestedHeatTemplates, parentHeatTemplate, vfResourceStructure);
-				}
-				
-				if(vfModuleArtifact.getArtifactInfo().getArtifactType().equals(ASDCConfiguration.HEAT_NESTED)){
-					parentArtifactType = identifyParentOfNestedTemplate(matchingObject.get(), vfModuleArtifact);
-					
-					if(!childNestedHeatTemplates.isEmpty()){
-					
-						if (parentArtifactType != null && parentArtifactType.equalsIgnoreCase(ASDCConfiguration.HEAT_VOL)) {
-							volumeHeatChildTemplates.add(childNestedHeatTemplates.get(0));
-						} else {
-							heatChildTemplates.add(childNestedHeatTemplates.get(0));
-						}
-					}
-				}
-				
-			}
-			if(!heatFilesList.isEmpty()){
-				vfModule.setHeatFiles(heatFilesList);
-			}
-			
-			
-			// Set all Child Templates related to HEAT_VOLUME
-			if(!volumeHeatChildTemplates.isEmpty()){
-				if(vfModule.getVolumeHeatTemplate() != null){
-					vfModule.getVolumeHeatTemplate().setChildTemplates(volumeHeatChildTemplates);
-				}else{
-					logger.debug("VolumeHeatTemplate not set in setHeatInformationForVfModule()");
-				}
-			}
-			
-			// Set all Child Templates related to HEAT
-			if(!heatChildTemplates.isEmpty()){
-				if(vfModule.getModuleHeatTemplate() != null){
-					vfModule.getModuleHeatTemplate().setChildTemplates(heatChildTemplates);
-				}else{
-					logger.debug("ModuleHeatTemplate not set in setHeatInformationForVfModule()");
-				}
-			}
-		}
-	}
+        if (vfcNodes != null) {
+            for (NodeTemplate vfcNode : vfcNodes) {
 
-	protected void checkVfModuleArtifactType(VfModule vfModule, VfModuleCustomization vfModuleCustomization,
-			List<HeatFiles> heatFilesList, VfModuleArtifact vfModuleArtifact, List<HeatTemplate> nestedHeatTemplates,
-			HeatTemplate parentHeatTemplate, VfResourceStructure vfResourceStructure) {
-		if (vfModuleArtifact.getArtifactInfo().getArtifactType().equals(ASDCConfiguration.HEAT)) {
-			vfModuleArtifact.incrementDeployedInDB();
-			vfModule.setModuleHeatTemplate(vfModuleArtifact.getHeatTemplate());
-		} else if (vfModuleArtifact.getArtifactInfo().getArtifactType().equals(ASDCConfiguration.HEAT_VOL)) {
-			vfModule.setVolumeHeatTemplate(vfModuleArtifact.getHeatTemplate());
-			VfModuleArtifact volVfModuleArtifact = this.getHeatEnvArtifactFromGeneratedArtifact(vfResourceStructure, vfModuleArtifact);
-			vfModuleCustomization.setVolumeHeatEnv(volVfModuleArtifact.getHeatEnvironment());
-			vfModuleArtifact.incrementDeployedInDB();
-		} else if (vfModuleArtifact.getArtifactInfo().getArtifactType().equals(ASDCConfiguration.HEAT_ENV)) {
-			if(vfModuleArtifact.getHeatEnvironment().getName().contains("volume")) {
-				vfModuleCustomization.setVolumeHeatEnv(vfModuleArtifact.getHeatEnvironment());
-			} else { 
-			vfModuleCustomization.setHeatEnvironment(vfModuleArtifact.getHeatEnvironment());
-			}
-			vfModuleArtifact.incrementDeployedInDB();
-		} else if (vfModuleArtifact.getArtifactInfo().getArtifactType().equals(ASDCConfiguration.HEAT_ARTIFACT)) {
-			heatFilesList.add(vfModuleArtifact.getHeatFiles());							
-			vfModuleArtifact.incrementDeployedInDB();
-		} else if (vfModuleArtifact.getArtifactInfo().getArtifactType().equals(ASDCConfiguration.HEAT_NESTED)) {
-			nestedHeatTemplates.add(vfModuleArtifact.getHeatTemplate());				
-			vfModuleArtifact.incrementDeployedInDB();
-		}
-	}
+                allottedResourceCustomization.setProvidingServiceModelUUID(toscaResourceStructure.getSdcCsarHelper()
+                    .getNodeTemplatePropertyLeafValue(vfcNode, "providing_service_uuid"));
+                allottedResourceCustomization.setProvidingServiceModelInvariantUUID(
+                    toscaResourceStructure.getSdcCsarHelper()
+                        .getNodeTemplatePropertyLeafValue(vfcNode, "providing_service_invariant_uuid"));
+                allottedResourceCustomization.setProvidingServiceModelName(toscaResourceStructure.getSdcCsarHelper()
+                    .getNodeTemplatePropertyLeafValue(vfcNode, "providing_service_name"));
+            }
+        }
 
-	protected VnfResourceCustomization createVnfResource(NodeTemplate vfNodeTemplate,
-			ToscaResourceStructure toscaResourceStructure, Service service) {
-		VnfResourceCustomization vnfResourceCustomization = vnfCustomizationRepo.findOneByModelCustomizationUUID(
-				vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID));
-		if(vnfResourceCustomization == null){		
-			VnfResource vnfResource = findExistingVnfResource(service,
-					vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_UUID));
-			
-			if(vnfResource==null)
-				vnfResource=createVnfResource(vfNodeTemplate);
-			
-			vnfResourceCustomization = createVnfResourceCustomization(vfNodeTemplate, toscaResourceStructure,
-					vnfResource);
-			vnfResourceCustomization.setVnfResources(vnfResource);
-			vnfResource.getVnfResourceCustomizations().add(vnfResourceCustomization);
-			
-			// Fetch VNFC Instance Group Info				
-			List<Group> groupList = toscaResourceStructure.getSdcCsarHelper()
-					.getGroupsOfOriginOfNodeTemplateByToscaGroupType(vfNodeTemplate,
-							"org.openecomp.groups.VfcInstanceGroup");
-				
-			for (Group group : groupList) { 
-				
-					VnfcInstanceGroupCustomization vnfcInstanceGroupCustomization = createVNFCInstanceGroup(vfNodeTemplate, group, vnfResourceCustomization, toscaResourceStructure);
-					
-					vnfcInstanceGroupCustomizationRepo.saveAndFlush(vnfcInstanceGroupCustomization);				
-			}			
-		}
-		return vnfResourceCustomization;
-	}
-	
-	protected VnfResource findExistingVnfResource(Service service, String modelUUID) {
-		VnfResource vnfResource = null;
-		for(VnfResourceCustomization vnfResourceCustom : service.getVnfCustomizations()){
-			if (vnfResourceCustom.getVnfResources() != null
-					&& vnfResourceCustom.getVnfResources().getModelUUID().equals(modelUUID)) {
-				vnfResource = vnfResourceCustom.getVnfResources();
-			}
-		}
-		if(vnfResource==null)
-			vnfResource = vnfRepo.findResourceByModelUUID(modelUUID);
-		
-		return vnfResource;
-	}
+        CapabilityAssignments arCustomizationCapability = toscaResourceStructure.getSdcCsarHelper()
+            .getCapabilitiesOf(nodeTemplate);
 
-	protected VnfResourceCustomization createVnfResourceCustomization(NodeTemplate vfNodeTemplate,
-			ToscaResourceStructure toscaResourceStructure, VnfResource vnfResource) {
-		VnfResourceCustomization vnfResourceCustomization = new VnfResourceCustomization();
-		vnfResourceCustomization.setModelCustomizationUUID(
-				testNull(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID)));
-		vnfResourceCustomization.setModelInstanceName(vfNodeTemplate.getName());
+        if (arCustomizationCapability != null) {
+            CapabilityAssignment capAssign = arCustomizationCapability.getCapabilityByName(SCALABLE);
 
-		vnfResourceCustomization.setNfFunction(testNull(toscaResourceStructure.getSdcCsarHelper()
-				.getNodeTemplatePropertyLeafValue(vfNodeTemplate, SdcPropertyNames.PROPERTY_NAME_NFFUNCTION)));
-		vnfResourceCustomization.setNfNamingCode(testNull(toscaResourceStructure.getSdcCsarHelper()
-				.getNodeTemplatePropertyLeafValue(vfNodeTemplate, "nf_naming_code")));
-		vnfResourceCustomization.setNfRole(testNull(toscaResourceStructure.getSdcCsarHelper()
-				.getNodeTemplatePropertyLeafValue(vfNodeTemplate, SdcPropertyNames.PROPERTY_NAME_NFROLE)));
-		vnfResourceCustomization.setNfType(testNull(toscaResourceStructure.getSdcCsarHelper()
-				.getNodeTemplatePropertyLeafValue(vfNodeTemplate, SdcPropertyNames.PROPERTY_NAME_NFTYPE)));
+            if (capAssign != null) {
+                allottedResourceCustomization.setMinInstances(
+                    Integer.getInteger(toscaResourceStructure.getSdcCsarHelper().getCapabilityPropertyLeafValue(
+                        capAssign, SdcPropertyNames.PROPERTY_NAME_MININSTANCES)));
+                allottedResourceCustomization.setMaxInstances(
+                    Integer.getInteger(toscaResourceStructure.getSdcCsarHelper().getCapabilityPropertyLeafValue(
+                        capAssign, SdcPropertyNames.PROPERTY_NAME_MAXINSTANCES)));
+            }
+        }
+        return allottedResourceCustomization;
+    }
 
-		vnfResourceCustomization.setMultiStageDesign(toscaResourceStructure.getSdcCsarHelper()
-				.getNodeTemplatePropertyLeafValue(vfNodeTemplate, MULTI_STAGE_DESIGN));
+    protected AllottedResource createAR(NodeTemplate nodeTemplate) {
+        AllottedResource allottedResource = new AllottedResource();
+        allottedResource
+            .setModelUUID(testNull(nodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_UUID)));
+        allottedResource.setModelInvariantUUID(
+            testNull(nodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_INVARIANTUUID)));
+        allottedResource
+            .setModelName(testNull(nodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_NAME)));
+        allottedResource
+            .setModelVersion(testNull(nodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_VERSION)));
+        allottedResource.setToscaNodeType(testNull(nodeTemplate.getType()));
+        allottedResource.setSubcategory(
+            testNull(nodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_SUBCATEGORY)));
+        allottedResource
+            .setDescription(nodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_DESCRIPTION));
+        return allottedResource;
+    }
 
-		vnfResourceCustomization.setVnfResources(vnfResource);
-		vnfResourceCustomization.setAvailabilityZoneMaxCount(Integer.getInteger(
-				vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_AVAILABILITYZONECOUNT)));	
+    protected Set<HeatTemplateParam> extractHeatTemplateParameters(String yamlFile, String artifactUUID) {
+        // Scan the payload downloadResult and extract the HeatTemplate
+        // parameters
+        YamlEditor yamlEditor = new YamlEditor(yamlFile.getBytes());
+        return yamlEditor.getParameterList(artifactUUID);
+    }
 
-		CapabilityAssignments vnfCustomizationCapability = toscaResourceStructure.getSdcCsarHelper()
-				.getCapabilitiesOf(vfNodeTemplate);
+    protected String testNull(Object object) {
 
-		if (vnfCustomizationCapability != null) {
-			CapabilityAssignment capAssign = vnfCustomizationCapability.getCapabilityByName(SCALABLE);
+        if (object == null) {
+            return null;
+        } else if (object.equals("NULL")) {
+            return null;
+        } else if (object instanceof Integer) {
+            return object.toString();
+        } else if (object instanceof String) {
+            return (String) object;
+        } else {
+            return "Type not recognized";
+        }
+    }
 
-			if (capAssign != null) {
-				vnfResourceCustomization.setMinInstances(Integer.getInteger(toscaResourceStructure.getSdcCsarHelper()
-						.getCapabilityPropertyLeafValue(capAssign, SdcPropertyNames.PROPERTY_NAME_MININSTANCES)));
-				vnfResourceCustomization.setMaxInstances(Integer.getInteger(toscaResourceStructure.getSdcCsarHelper()
-						.getCapabilityPropertyLeafValue(capAssign, SdcPropertyNames.PROPERTY_NAME_MAXINSTANCES)));
-			}
+    protected static String identifyParentOfNestedTemplate(VfModuleStructure vfModuleStructure,
+        VfModuleArtifact heatNestedArtifact) {
 
-		}
-		
-		toscaResourceStructure.setCatalogVnfResourceCustomization(vnfResourceCustomization);
-		
-		return vnfResourceCustomization;
-	}
+        if (vfModuleStructure.getArtifactsMap().get(ASDCConfiguration.HEAT) != null && vfModuleStructure
+            .getArtifactsMap().get(ASDCConfiguration.HEAT).get(0).getArtifactInfo().getRelatedArtifacts() != null) {
+            for (IArtifactInfo unknownArtifact : vfModuleStructure.getArtifactsMap().get(ASDCConfiguration.HEAT).get(0)
+                .getArtifactInfo().getRelatedArtifacts()) {
+                if (heatNestedArtifact.getArtifactInfo().getArtifactUUID().equals(unknownArtifact.getArtifactUUID())) {
+                    return ASDCConfiguration.HEAT;
+                }
 
-	protected VnfResource createVnfResource(NodeTemplate vfNodeTemplate) {
-		VnfResource vnfResource = new VnfResource();
-		vnfResource.setModelInvariantUUID(
-				testNull(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_INVARIANTUUID)));
-		vnfResource.setModelName(testNull(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_NAME)));
-		vnfResource.setModelUUID(testNull(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_UUID)));
+            }
+        }
 
-		vnfResource.setModelVersion(
-				testNull(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_VERSION)));
-		vnfResource.setDescription(
-				testNull(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_DESCRIPTION)));
-		vnfResource.setOrchestrationMode(HEAT);
-		vnfResource.setToscaNodeType(testNull(vfNodeTemplate.getType()));
-		vnfResource.setAicVersionMax(
-				testNull(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_MAXINSTANCES)));
-		vnfResource.setAicVersionMin(
-				testNull(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_MININSTANCES)));
-		vnfResource.setCategory(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_CATEGORY));
-		vnfResource.setSubCategory(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_SUBCATEGORY));
-		
-		return vnfResource;
-	}
+        if (vfModuleStructure.getArtifactsMap().get(ASDCConfiguration.HEAT_VOL) != null
+            && vfModuleStructure.getArtifactsMap().get(ASDCConfiguration.HEAT_VOL).get(0).getArtifactInfo()
+            .getRelatedArtifacts() != null) {
+            for (IArtifactInfo unknownArtifact : vfModuleStructure.getArtifactsMap().get(ASDCConfiguration.HEAT_VOL)
+                .get(0).getArtifactInfo().getRelatedArtifacts()) {
+                if (heatNestedArtifact.getArtifactInfo().getArtifactUUID().equals(unknownArtifact.getArtifactUUID())) {
+                    return ASDCConfiguration.HEAT_VOL;
+                }
 
-	protected AllottedResourceCustomization createAllottedResource(NodeTemplate nodeTemplate,
-			ToscaResourceStructure toscaResourceStructure, Service service) {
-		AllottedResourceCustomization allottedResourceCustomization = allottedCustomizationRepo
-				.findOneByModelCustomizationUUID(
-				nodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID));
-			
-		if(allottedResourceCustomization == null){			
-			AllottedResource allottedResource = findExistingAllottedResource(service,
-					nodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_UUID));
-			
-			if(allottedResource==null)
-				allottedResource=createAR(nodeTemplate);
-			
-			toscaResourceStructure.setAllottedResource(allottedResource);			
-			allottedResourceCustomization = createAllottedResourceCustomization(nodeTemplate, toscaResourceStructure);
-			allottedResourceCustomization.setAllottedResource(allottedResource);
-			allottedResource.getAllotedResourceCustomization().add(allottedResourceCustomization);
-		}
-		return allottedResourceCustomization;
-	}
-	
-	protected AllottedResource findExistingAllottedResource(Service service, String modelUUID) {
-		AllottedResource allottedResource = null;
-		for(AllottedResourceCustomization allottedResourceCustom : service.getAllottedCustomizations()){
-			if (allottedResourceCustom.getAllottedResource() != null
-					&& allottedResourceCustom.getAllottedResource().getModelUUID().equals(modelUUID)) {
-				allottedResource = allottedResourceCustom.getAllottedResource();
-			}
-		}
-		if(allottedResource==null)
-			allottedResource = allottedRepo.findResourceByModelUUID(modelUUID);
-		
-		return allottedResource;
-	}
-	
-	protected AllottedResourceCustomization createAllottedResourceCustomization(NodeTemplate nodeTemplate,
-			ToscaResourceStructure toscaResourceStructure) {
-		AllottedResourceCustomization allottedResourceCustomization = new AllottedResourceCustomization();
-		allottedResourceCustomization.setModelCustomizationUUID(
-				testNull(nodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID)));
-		allottedResourceCustomization.setModelInstanceName(nodeTemplate.getName());
-		
+            }
+        }
 
-		allottedResourceCustomization.setNfFunction(testNull(toscaResourceStructure.getSdcCsarHelper()
-				.getNodeTemplatePropertyLeafValue(nodeTemplate, SdcPropertyNames.PROPERTY_NAME_NFFUNCTION)));
-		allottedResourceCustomization.setNfNamingCode(testNull(toscaResourceStructure.getSdcCsarHelper()
-				.getNodeTemplatePropertyLeafValue(nodeTemplate, "nf_naming_code")));
-		allottedResourceCustomization.setNfRole(testNull(toscaResourceStructure.getSdcCsarHelper()
-				.getNodeTemplatePropertyLeafValue(nodeTemplate, SdcPropertyNames.PROPERTY_NAME_NFROLE)));
-		allottedResourceCustomization.setNfType(testNull(toscaResourceStructure.getSdcCsarHelper()
-				.getNodeTemplatePropertyLeafValue(nodeTemplate, SdcPropertyNames.PROPERTY_NAME_NFTYPE)));
+        // Does not belong to anything
+        return null;
 
-		List<NodeTemplate> vfcNodes = toscaResourceStructure.getSdcCsarHelper().getVfcListByVf(allottedResourceCustomization.getModelCustomizationUUID());
-		
-		if(vfcNodes != null){
-			for(NodeTemplate vfcNode : vfcNodes){
-			
-				allottedResourceCustomization.setProvidingServiceModelUUID(toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(vfcNode, "providing_service_uuid"));
-				allottedResourceCustomization.setProvidingServiceModelInvariantUUID(toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(vfcNode, "providing_service_invariant_uuid"));
-				allottedResourceCustomization.setProvidingServiceModelName(toscaResourceStructure.getSdcCsarHelper().getNodeTemplatePropertyLeafValue(vfcNode, "providing_service_name"));
-			}
-		}
-		
+    }
 
-		CapabilityAssignments arCustomizationCapability = toscaResourceStructure.getSdcCsarHelper()
-				.getCapabilitiesOf(nodeTemplate);
+    protected static String createVNFName(VfResourceStructure vfResourceStructure) {
 
-		if (arCustomizationCapability != null) {
-			CapabilityAssignment capAssign = arCustomizationCapability.getCapabilityByName(SCALABLE);
+        return vfResourceStructure.getNotification().getServiceName() + "/"
+            + vfResourceStructure.getResourceInstance().getResourceInstanceName();
+    }
 
-			if (capAssign != null) {
-				allottedResourceCustomization.setMinInstances(
-						Integer.getInteger(toscaResourceStructure.getSdcCsarHelper().getCapabilityPropertyLeafValue(
-								capAssign, SdcPropertyNames.PROPERTY_NAME_MININSTANCES)));
-				allottedResourceCustomization.setMaxInstances(
-						Integer.getInteger(toscaResourceStructure.getSdcCsarHelper().getCapabilityPropertyLeafValue(
-								capAssign, SdcPropertyNames.PROPERTY_NAME_MAXINSTANCES)));
-			}
-		}
-		return allottedResourceCustomization;
-	}
+    protected static String createVfModuleName(VfModuleStructure vfModuleStructure) {
 
-	protected AllottedResource createAR(NodeTemplate nodeTemplate) {
-		AllottedResource allottedResource = new AllottedResource();
-		allottedResource
-		.setModelUUID(testNull(nodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_UUID)));
-		allottedResource.setModelInvariantUUID(
-				testNull(nodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_INVARIANTUUID)));
-		allottedResource
-		.setModelName(testNull(nodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_NAME)));
-		allottedResource
-		.setModelVersion(testNull(nodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_VERSION)));
-		allottedResource.setToscaNodeType(testNull(nodeTemplate.getType()));
-		allottedResource.setSubcategory(
-				testNull(nodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_SUBCATEGORY)));
-		allottedResource
-		.setDescription(nodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_DESCRIPTION));
-		return allottedResource;
-	}
+        return createVNFName(vfModuleStructure.getParentVfResource()) + "::"
+            + vfModuleStructure.getVfModuleMetadata().getVfModuleModelName();
+    }
 
-	protected Set<HeatTemplateParam> extractHeatTemplateParameters(String yamlFile, String artifactUUID) {
-		// Scan the payload downloadResult and extract the HeatTemplate
-		// parameters
-		YamlEditor yamlEditor = new YamlEditor(yamlFile.getBytes());
-		return yamlEditor.getParameterList(artifactUUID);
-	}	
+    protected String getPropertyInput(String propertyName) {
 
-	protected String testNull(Object object) {
+        String inputName = new String();
 
-		if (object == null) {
-			return null;
-		} else if (object.equals("NULL")) {
-			return null;
-		} else if (object instanceof Integer) {
-			return object.toString();
-		} else if (object instanceof String) {
-			return (String) object;
-		} else {
-			return "Type not recognized";
-		}
-	}
-	
-	protected static String identifyParentOfNestedTemplate(VfModuleStructure vfModuleStructure,
-			VfModuleArtifact heatNestedArtifact) {
+        if (propertyName != null) {
+            int getInputIndex = propertyName.indexOf("{get_input=");
+            if (getInputIndex > -1) {
+                inputName = propertyName.substring(getInputIndex + 11, propertyName.length() - 1);
+            }
+        }
 
-		if (vfModuleStructure.getArtifactsMap().get(ASDCConfiguration.HEAT) != null && vfModuleStructure
-				.getArtifactsMap().get(ASDCConfiguration.HEAT).get(0).getArtifactInfo().getRelatedArtifacts() != null) {
-			for (IArtifactInfo unknownArtifact : vfModuleStructure.getArtifactsMap().get(ASDCConfiguration.HEAT).get(0)
-					.getArtifactInfo().getRelatedArtifacts()) {
-				if (heatNestedArtifact.getArtifactInfo().getArtifactUUID().equals(unknownArtifact.getArtifactUUID())) {
-					return ASDCConfiguration.HEAT;
-				}
+        return inputName;
+    }
 
-			}
-		} 
-		
-		if (vfModuleStructure.getArtifactsMap().get(ASDCConfiguration.HEAT_VOL) != null 
-				&& vfModuleStructure.getArtifactsMap().get(ASDCConfiguration.HEAT_VOL).get(0).getArtifactInfo()
-						.getRelatedArtifacts() != null) {
-			for (IArtifactInfo unknownArtifact : vfModuleStructure.getArtifactsMap().get(ASDCConfiguration.HEAT_VOL)
-					.get(0).getArtifactInfo().getRelatedArtifacts()) {
-				if (heatNestedArtifact.getArtifactInfo().getArtifactUUID().equals(unknownArtifact.getArtifactUUID())) {
-					return ASDCConfiguration.HEAT_VOL;
-				}
-			
-			}
-		}
-		
-		// Does not belong to anything
-		return null;
-			
-	}
-	
-	protected static String createVNFName(VfResourceStructure vfResourceStructure) {
 
-		return vfResourceStructure.getNotification().getServiceName() + "/"
-				+ vfResourceStructure.getResourceInstance().getResourceInstanceName();
-	}
+    protected static Timestamp getCurrentTimeStamp() {
 
-	protected static String createVfModuleName(VfModuleStructure vfModuleStructure) {
-		
-		return createVNFName(vfModuleStructure.getParentVfResource()) + "::"
-				+ vfModuleStructure.getVfModuleMetadata().getVfModuleModelName();
-	}
-	
-	protected String getPropertyInput(String propertyName){
-	
-		String inputName = new String();
-		
-		if (propertyName != null) { 
-			int getInputIndex = propertyName.indexOf("{get_input="); 
-			if (getInputIndex > -1) { 
-				inputName = propertyName.substring(getInputIndex+11, propertyName.length()-1); 
-			} 
-		}
-		
-		return inputName;
-	}
-	
-	
-	protected static Timestamp getCurrentTimeStamp() {
-		
-		return new Timestamp(new Date().getTime());
-	}
+        return new Timestamp(new Date().getTime());
+    }
 
 }
diff --git a/asdc-controller/src/test/java/org/onap/so/asdc/client/ASDCControllerITTest.java b/asdc-controller/src/test/java/org/onap/so/asdc/client/ASDCControllerITTest.java
new file mode 100644
index 0000000..c0c6612
--- /dev/null
+++ b/asdc-controller/src/test/java/org/onap/so/asdc/client/ASDCControllerITTest.java
@@ -0,0 +1,442 @@
+/*
+ * ============LICENSE_START=======================================================
+ *  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=========================================================
+ */
+
+package org.onap.so.asdc.client;
+
+import static com.github.tomakehurst.wiremock.client.WireMock.ok;
+import static com.github.tomakehurst.wiremock.client.WireMock.post;
+import static com.github.tomakehurst.wiremock.client.WireMock.stubFor;
+import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.fail;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.UUID;
+import javax.persistence.EntityNotFoundException;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TestName;
+import org.onap.so.asdc.BaseTest;
+import org.onap.so.asdc.client.exceptions.ASDCControllerException;
+import org.onap.so.asdc.client.test.emulators.ArtifactInfoImpl;
+import org.onap.so.asdc.client.test.emulators.DistributionClientEmulator;
+import org.onap.so.asdc.client.test.emulators.NotificationDataImpl;
+import org.onap.so.asdc.client.test.emulators.ResourceInfoImpl;
+import org.onap.so.db.catalog.beans.PnfResource;
+import org.onap.so.db.catalog.beans.PnfResourceCustomization;
+import org.onap.so.db.catalog.beans.Service;
+import org.onap.so.db.catalog.beans.ToscaCsar;
+import org.onap.so.db.catalog.beans.VnfResource;
+import org.onap.so.db.catalog.beans.VnfResourceCustomization;
+import org.onap.so.db.catalog.data.repository.PnfCustomizationRepository;
+import org.onap.so.db.catalog.data.repository.PnfResourceRepository;
+import org.onap.so.db.catalog.data.repository.ServiceRepository;
+import org.onap.so.db.catalog.data.repository.ToscaCsarRepository;
+import org.onap.so.db.catalog.data.repository.VnfCustomizationRepository;
+import org.onap.so.db.catalog.data.repository.VnfResourceRepository;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * This is used to run some basic integration test(BIT) for ASDC controller. It will test the csar install and all the
+ * testing csar files are located underneath src/main/resources/download folder,
+ *
+ * PNF csar: service-Testservice140-csar.csar VNF csar: service-Svc140-VF-csar.csar
+ */
+@Transactional
+public class ASDCControllerITTest extends BaseTest {
+
+    private Logger logger = LoggerFactory.getLogger(ASDCControllerITTest.class);
+
+    @Rule
+    public TestName testName = new TestName();
+
+    private String serviceUuid;
+    private String serviceInvariantUuid;
+
+    /**
+     * Random UUID served as distribution UUID.
+     */
+    private String distributionId;
+    private String artifactUuid;
+
+    @Autowired
+    private ASDCController asdcController;
+
+    @Autowired
+    private PnfResourceRepository pnfResourceRepository;
+
+    @Autowired
+    private PnfCustomizationRepository pnfCustomizationRepository;
+
+    @Autowired
+    private VnfResourceRepository vnfResourceRepository;
+
+    @Autowired
+    private VnfCustomizationRepository vnfCustomizationRepository;
+
+    @Autowired
+    private ToscaCsarRepository toscaCsarRepository;
+
+    @Autowired
+    private ServiceRepository serviceRepository;
+
+    private DistributionClientEmulator distributionClient;
+
+    @Before
+    public void setUp() {
+        distributionId = UUID.randomUUID().toString();
+        artifactUuid = UUID.randomUUID().toString();
+        logger.info("Using distributionId: {}, artifactUUID: {} for testcase: {}", distributionId, artifactUuid,
+            testName.getMethodName());
+
+        distributionClient = new DistributionClientEmulator();
+        distributionClient.setResourcePath("src/test/resources");
+        asdcController.setDistributionClient(distributionClient);
+        try {
+            asdcController.initASDC();
+        } catch (ASDCControllerException e) {
+            logger.error(e.getMessage(), e);
+            fail(e.getMessage());
+        }
+    }
+
+    @After
+    public void shutDown() {
+        try {
+            asdcController.closeASDC();
+        } catch (ASDCControllerException e) {
+            logger.error(e.getMessage(), e);
+            fail(e.getMessage());
+        }
+    }
+
+    /**
+     * Mock the AAI using wireshark.
+     */
+    private void initMockAaiServer(final String serviceUuid, final String serviceInvariantUuid) {
+        String modelEndpoint = "/aai/v15/service-design-and-creation/models/model/" + serviceInvariantUuid
+            + "/model-vers/model-ver/" + serviceUuid + "?depth=0";
+
+        stubFor(post(urlEqualTo(modelEndpoint)).willReturn(ok()));
+    }
+
+    /**
+     * Test with service-Testservice140-csar.csar.
+     */
+    @Test
+    public void treatNotification_ValidPnfResource_ExpectedOutput() {
+
+        /**
+         * service UUID/invariantUUID from global metadata in service-Testservice140-template.yml.
+         */
+        String serviceUuid = "efaea486-561f-4159-9191-a8d3cb346728";
+        String serviceInvariantUuid = "f2edfbf4-bb0a-4fe7-a57a-71362d4b0b23";
+
+        initMockAaiServer(serviceUuid, serviceInvariantUuid);
+
+        NotificationDataImpl notificationData = new NotificationDataImpl();
+        notificationData.setServiceUUID(serviceUuid);
+        notificationData.setDistributionID(distributionId);
+        notificationData.setServiceInvariantUUID(serviceInvariantUuid);
+        notificationData.setServiceVersion("1.0");
+
+        ResourceInfoImpl resourceInfo = constructPnfResourceInfo();
+        List<ResourceInfoImpl> resourceInfoList = new ArrayList<>();
+        resourceInfoList.add(resourceInfo);
+        notificationData.setResources(resourceInfoList);
+
+        ArtifactInfoImpl artifactInfo = constructPnfServiceArtifact();
+        List<ArtifactInfoImpl> artifactInfoList = new ArrayList<>();
+        artifactInfoList.add(artifactInfo);
+        notificationData.setServiceArtifacts(artifactInfoList);
+
+        try {
+            asdcController.treatNotification(notificationData);
+            logger.info("Checking the database for PNF ingestion");
+
+            /**
+             * Check the tosca csar entity, it should be the same as provided from NotficationData.
+             */
+            ToscaCsar toscaCsar = toscaCsarRepository.findById(artifactUuid)
+                .orElseThrow(() -> new EntityNotFoundException("Tosca csar: " + artifactUuid + " not found"));
+            assertEquals("tosca csar UUID", artifactUuid, toscaCsar.getArtifactUUID());
+            assertEquals("tosca csar name", "service-Testservice140-csar.csar", toscaCsar.getName());
+            assertEquals("tosca csar version", "1.0", toscaCsar.getVersion());
+            assertNull("tosca csar descrption", toscaCsar.getDescription());
+            assertEquals("tosca csar checksum", "MANUAL_RECORD", toscaCsar.getArtifactChecksum());
+            assertEquals("toscar csar URL", "/download/service-Testservice140-csar.csar", toscaCsar.getUrl());
+
+            /**
+             * Check the service entity, it should be the same as global metadata information in service-Testservice140-template.yml inside csar.
+             */
+            Service service = serviceRepository.findById(serviceUuid)
+                .orElseThrow(() -> new EntityNotFoundException("Service: " + serviceUuid + " not found"));
+            assertEquals("model UUID", "efaea486-561f-4159-9191-a8d3cb346728", service.getModelUUID());
+            assertEquals("model name", "TestService140", service.getModelName());
+            assertEquals("model invariantUUID", "f2edfbf4-bb0a-4fe7-a57a-71362d4b0b23",
+                service.getModelInvariantUUID());
+            assertEquals("model version", "1.0", service.getModelVersion());
+            assertEquals("description", "Test Service for extended attributes of PNF resource",
+                service.getDescription().trim());
+            assertEquals("tosca csar artifact UUID", artifactUuid, service.getCsar().getArtifactUUID());
+            assertEquals("service type", "Network", service.getServiceType());
+            assertEquals("service role", "nfv", service.getServiceRole());
+            assertEquals("environment context", "General_Revenue-Bearing", service.getEnvironmentContext());
+            assertEquals("service category", "Network Service", service.getCategory());
+            assertNull("workload context", service.getWorkloadContext());
+            assertEquals("resource order", "Test140PNF", service.getResourceOrder());
+
+            /**
+             * Check PNF resource, it should be the same as metadata in the topology template in service-Testservice140-template.yml
+             * OR
+             * global metadata in the resource-Test140pnf-template.yml
+             */
+            String pnfResourceKey = "9c54e269-122b-4e8a-8b2a-6eac849b441a";
+            PnfResource pnfResource = pnfResourceRepository.findById(pnfResourceKey)
+                .orElseThrow(() -> new EntityNotFoundException("PNF resource:" + pnfResourceKey + " not found"));
+            assertNull("orchestration mode", pnfResource.getOrchestrationMode());
+            assertEquals("Description", "Oracle", pnfResource.getDescription().trim());
+            assertEquals("model UUID", pnfResourceKey, pnfResource.getModelUUID());
+            assertEquals("model invariant UUID", "d832a027-75f3-455d-9de4-f02fcdee7e7e",
+                pnfResource.getModelInvariantUUID());
+            assertEquals("model version", "1.0", pnfResource.getModelVersion());
+            assertEquals("model name", "Test140PNF", pnfResource.getModelName());
+            assertEquals("tosca node type", "org.openecomp.resource.pnf.Test140pnf", pnfResource.getToscaNodeType());
+            assertEquals("resource category", "Application L4+", pnfResource.getCategory());
+            assertEquals("resource sub category", "Call Control", pnfResource.getSubCategory());
+
+            /**
+             * Check PNF resource customization, it should be the same as metadata in the topology template in service-Testservice140-template.yml
+             * OR
+             * global metadata in the resource-Test140pnf-template.yml
+             */
+            String pnfCustomizationKey = "428a3d73-f962-4cc2-ba62-2483c45d6b12";
+            PnfResourceCustomization pnfCustomization = pnfCustomizationRepository
+                .findById(pnfCustomizationKey).orElseThrow(
+                    () -> new EntityNotFoundException(
+                        "PNF resource customization: " + pnfCustomizationKey + " not found"));
+            assertEquals("model customizationUUID", pnfCustomizationKey, pnfCustomization.getModelCustomizationUUID());
+            assertEquals("model instance name", "Test140PNF 0", pnfCustomization.getModelInstanceName());
+            assertEquals("NF type", "", pnfCustomization.getNfType());
+            assertEquals("NF Role", "nf", pnfCustomization.getNfRole());
+            assertEquals("NF function", "nf", pnfCustomization.getNfFunction());
+            assertEquals("NF naming code", "", pnfCustomization.getNfNamingCode());
+            assertEquals("PNF resource model UUID", pnfResourceKey, pnfCustomization.getPnfResources().getModelUUID());
+            assertEquals("Multi stage design", "", pnfCustomization.getMultiStageDesign());
+            assertNull("resource input", pnfCustomization.getResourceInput());
+            assertEquals("cds blueprint name(sdnc_model_name property)", pnfCustomization.getBlueprintName(),
+                pnfCustomization.getBlueprintName());
+            assertEquals("cds blueprint version(sdnc_model_version property)", pnfCustomization.getBlueprintVersion(),
+                pnfCustomization.getBlueprintVersion());
+
+            /**
+             * Check the pnf resource customization with service mapping
+             */
+            List<PnfResourceCustomization> pnfCustList = service.getPnfCustomizations();
+            assertEquals("PNF resource customization entity", 1, pnfCustList.size());
+            assertEquals(pnfCustomizationKey, pnfCustList.get(0).getModelCustomizationUUID());
+
+        } catch (Exception e) {
+            logger.info(e.getMessage(), e);
+            fail(e.getMessage());
+        }
+    }
+
+    private ArtifactInfoImpl constructPnfServiceArtifact() {
+        ArtifactInfoImpl artifactInfo = new ArtifactInfoImpl();
+        artifactInfo.setArtifactType(ASDCConfiguration.TOSCA_CSAR);
+        artifactInfo.setArtifactURL("/download/service-Testservice140-csar.csar");
+        artifactInfo.setArtifactName("service-Testservice140-csar.csar");
+        artifactInfo.setArtifactVersion("1.0");
+        artifactInfo.setArtifactUUID(artifactUuid);
+        return artifactInfo;
+    }
+
+    /**
+     * Construct the PnfResourceInfo based on the resource-Test140Pnf-template.yml from
+     * service-Testservice140-csar.csar.
+     */
+    private ResourceInfoImpl constructPnfResourceInfo() {
+        ResourceInfoImpl resourceInfo = new ResourceInfoImpl();
+        resourceInfo.setResourceInstanceName("Test140PNF");
+        resourceInfo.setResourceInvariantUUID("d832a027-75f3-455d-9de4-f02fcdee7e7e");
+        resourceInfo.setResoucreType("PNF");
+        resourceInfo.setCategory("Application L4+");
+        resourceInfo.setSubcategory("Call Control");
+        resourceInfo.setResourceUUID("9c54e269-122b-4e8a-8b2a-6eac849b441a");
+        resourceInfo.setResourceCustomizationUUID("428a3d73-f962-4cc2-ba62-2483c45d6b12");
+        resourceInfo.setResourceVersion("1.0");
+        return resourceInfo;
+    }
+
+    /**
+     * Testing with the service-Svc140-VF-csar.csar.
+     */
+    @Test
+    public void treatNotification_ValidVnfResource_ExpectedOutput() {
+
+        /**
+         * service UUID/invariantUUID from global metadata in resource-Testvf140-template.yml.
+         */
+        String serviceUuid = "28944a37-de3f-46ec-9c60-b57036fbd26d";
+        String serviceInvariantUuid = "9e900d3e-1e2e-4124-a5c2-4345734dc9de";
+
+        initMockAaiServer(serviceUuid, serviceInvariantUuid);
+
+        NotificationDataImpl notificationData = new NotificationDataImpl();
+        notificationData.setServiceUUID(serviceUuid);
+        notificationData.setDistributionID(distributionId);
+        notificationData.setServiceInvariantUUID(serviceInvariantUuid);
+        notificationData.setServiceVersion("1.0");
+
+        ResourceInfoImpl resourceInfo = constructVnfResourceInfo();
+        List<ResourceInfoImpl> resourceInfoList = new ArrayList<>();
+        resourceInfoList.add(resourceInfo);
+        notificationData.setResources(resourceInfoList);
+
+        ArtifactInfoImpl artifactInfo = constructVnfServiceArtifact();
+        List<ArtifactInfoImpl> artifactInfoList = new ArrayList<>();
+        artifactInfoList.add(artifactInfo);
+        notificationData.setServiceArtifacts(artifactInfoList);
+
+        try {
+            asdcController.treatNotification(notificationData);
+            logger.info("Checking the database for VNF ingestion");
+
+            /**
+             * Check the tosca csar entity, it should be the same as provided from NotficationData.
+             */
+            ToscaCsar toscaCsar = toscaCsarRepository.findById(artifactUuid)
+                .orElseThrow(() -> new EntityNotFoundException("Tosca csar: " + artifactUuid + " not found"));
+            assertEquals("tosca csar UUID", artifactUuid, toscaCsar.getArtifactUUID());
+            assertEquals("tosca csar name", "service-Svc140-VF-csar.csar", toscaCsar.getName());
+            assertEquals("tosca csar version", "1.0", toscaCsar.getVersion());
+            assertNull("tosca csar descrption", toscaCsar.getDescription());
+            assertEquals("tosca csar checksum", "MANUAL_RECORD", toscaCsar.getArtifactChecksum());
+            assertEquals("toscar csar URL", "/download/service-Svc140-VF-csar.csar", toscaCsar.getUrl());
+
+            /**
+             * Check the service entity, it should be the same as global metadata information in service-Testservice140-template.yml inside csar.
+             */
+            Service service = serviceRepository.findById(serviceUuid)
+                .orElseThrow(() -> new EntityNotFoundException("Service: " + serviceUuid + " not found"));
+            assertEquals("model UUID", serviceUuid, service.getModelUUID());
+            assertEquals("model name", "SVC140", service.getModelName());
+            assertEquals("model invariantUUID", serviceInvariantUuid,
+                service.getModelInvariantUUID());
+            assertEquals("model version", "1.0", service.getModelVersion());
+            assertEquals("description", "SVC140",
+                service.getDescription().trim());
+            assertEquals("tosca csar artifact UUID", artifactUuid, service.getCsar().getArtifactUUID());
+            assertEquals("service type", "ST", service.getServiceType());
+            assertEquals("service role", "Sr", service.getServiceRole());
+            assertEquals("environment context", "General_Revenue-Bearing", service.getEnvironmentContext());
+            assertEquals("service category", "Network Service", service.getCategory());
+            assertNull("workload context", service.getWorkloadContext());
+            assertEquals("resource order", "TestVF140", service.getResourceOrder());
+
+            /**
+             * Check VNF resource, it should be the same as metadata in the topology template in service-Testservice140-template.yml
+             * OR
+             * global metadata in the resource-Testservice140-template.yml
+             */
+            String vnfResourceKey = "d20d3ea9-2f54-4071-8b5c-fd746dde245e";
+            VnfResource vnfResource = vnfResourceRepository.findById(vnfResourceKey)
+                .orElseThrow(() -> new EntityNotFoundException("VNF resource:" + vnfResourceKey + " not found"));
+            assertEquals("orchestration mode", "HEAT", vnfResource.getOrchestrationMode());
+            assertEquals("Description", "TestPNF140", vnfResource.getDescription().trim());
+            assertEquals("model UUID", vnfResourceKey, vnfResource.getModelUUID());
+            assertEquals("model invariant UUID", "7a4bffa2-fac5-4b8b-b348-0bdf313a1aeb",
+                vnfResource.getModelInvariantUUID());
+            assertEquals("model version", "1.0", vnfResource.getModelVersion());
+            assertEquals("model name", "TestVF140", vnfResource.getModelName());
+            assertEquals("tosca node type", "org.openecomp.resource.vf.Testvf140", vnfResource.getToscaNodeType());
+            assertEquals("resource category", "Application L4+", vnfResource.getCategory());
+            assertEquals("resource sub category", "Database", vnfResource.getSubCategory());
+
+            /**
+             * Check VNF resource customization, it should be the same as metadata in the topology template in service-Testservice140-template.yml
+             * OR
+             * global metadata in the resource-Testservice140-template.yml
+             */
+            String vnfCustomizationKey = "ca1c8455-8ce2-4a76-a037-3f4cf01cffa0";
+            VnfResourceCustomization vnfCustomization = vnfCustomizationRepository
+                .findById(vnfCustomizationKey).orElseThrow(
+                    () -> new EntityNotFoundException(
+                        "VNF resource customization: " + vnfCustomizationKey + " not found"));
+            assertEquals("model customizationUUID", vnfCustomizationKey, vnfCustomization.getModelCustomizationUUID());
+            assertEquals("model instance name", "TestVF140 0", vnfCustomization.getModelInstanceName());
+            assertNull("NF type", vnfCustomization.getNfType());
+            assertNull("NF Role", vnfCustomization.getNfRole());
+            assertNull("NF function", vnfCustomization.getNfFunction());
+            assertNull("NF naming code", vnfCustomization.getNfNamingCode());
+            assertEquals("VNF resource model UUID", vnfResourceKey, vnfCustomization.getVnfResources().getModelUUID());
+            assertEquals("Multi stage design", "false", vnfCustomization.getMultiStageDesign());
+            assertNull("resource input", vnfCustomization.getResourceInput());
+            assertEquals("cds blueprint name(sdnc_model_name property)", vnfCustomization.getBlueprintName(),
+                vnfCustomization.getBlueprintName());
+            assertEquals("cds blueprint version(sdnc_model_version property)", vnfCustomization.getBlueprintVersion(),
+                vnfCustomization.getBlueprintVersion());
+            /**
+             * Check the vnf resource customization with service mapping
+             */
+            List<VnfResourceCustomization> vnfCustList = service.getVnfCustomizations();
+            assertEquals("VNF resource customization entity", 1, vnfCustList.size());
+            assertEquals(vnfCustomizationKey, vnfCustList.get(0).getModelCustomizationUUID());
+        } catch (Exception e) {
+            logger.info(e.getMessage(), e);
+            fail(e.getMessage());
+        }
+    }
+
+    private ArtifactInfoImpl constructVnfServiceArtifact() {
+        ArtifactInfoImpl artifactInfo = new ArtifactInfoImpl();
+        artifactInfo.setArtifactType(ASDCConfiguration.TOSCA_CSAR);
+        artifactInfo.setArtifactURL("/download/service-Svc140-VF-csar.csar");
+        artifactInfo.setArtifactName("service-Svc140-VF-csar.csar");
+        artifactInfo.setArtifactVersion("1.0");
+        artifactInfo.setArtifactUUID(artifactUuid);
+        return artifactInfo;
+    }
+
+    /**
+     * Construct the PnfResourceInfo based on the resource-Testvf140-template.yml from service-Svc140-VF-csar.csar.
+     */
+    private ResourceInfoImpl constructVnfResourceInfo() {
+        ResourceInfoImpl resourceInfo = new ResourceInfoImpl();
+        resourceInfo.setResourceInstanceName("TestVF140");
+        resourceInfo.setResourceInvariantUUID("7a4bffa2-fac5-4b8b-b348-0bdf313a1aeb");
+        resourceInfo.setResoucreType("VF");
+        resourceInfo.setCategory("Application L4+");
+        resourceInfo.setSubcategory("Database");
+        resourceInfo.setResourceUUID("d20d3ea9-2f54-4071-8b5c-fd746dde245e");
+        resourceInfo.setResourceCustomizationUUID("ca1c8455-8ce2-4a76-a037-3f4cf01cffa0");
+        resourceInfo.setResourceVersion("1.0");
+        resourceInfo.setArtifacts(Collections.EMPTY_LIST);
+        return resourceInfo;
+    }
+}
diff --git a/asdc-controller/src/test/resources/ASDC/.gitignore b/asdc-controller/src/test/resources/ASDC/.gitignore
index e54786b..836e68d 100644
--- a/asdc-controller/src/test/resources/ASDC/.gitignore
+++ b/asdc-controller/src/test/resources/ASDC/.gitignore
@@ -1 +1 @@
-/*.csar
+*.*/*.csar
diff --git a/asdc-controller/src/test/resources/application-test.yaml b/asdc-controller/src/test/resources/application-test.yaml
index caaa5dd..5ba8521 100644
--- a/asdc-controller/src/test/resources/application-test.yaml
+++ b/asdc-controller/src/test/resources/application-test.yaml
@@ -14,7 +14,7 @@
     initialization-mode: always
   jpa:   
     generate-ddl: false
-    show-sql: false
+    show-sql: true
     hibernate:
       ddl-auto: none
       naming-strategy: org.hibernate.cfg.ImprovedNamingStrategy
@@ -97,3 +97,5 @@
     enabled: false
   aai:
     endpoint: http://localhost:${wiremock.server.port}
+  config:
+    defaultpath: src/test/resources
diff --git a/asdc-controller/src/test/resources/download/service-Svc140-VF-csar.csar b/asdc-controller/src/test/resources/download/service-Svc140-VF-csar.csar
new file mode 100644
index 0000000..0de1b0b
--- /dev/null
+++ b/asdc-controller/src/test/resources/download/service-Svc140-VF-csar.csar
Binary files differ
diff --git a/asdc-controller/src/test/resources/download/service-Testservice140-csar.csar b/asdc-controller/src/test/resources/download/service-Testservice140-csar.csar
new file mode 100644
index 0000000..bd9a1dc
--- /dev/null
+++ b/asdc-controller/src/test/resources/download/service-Testservice140-csar.csar
Binary files differ
diff --git a/asdc-controller/src/test/resources/schema.sql b/asdc-controller/src/test/resources/schema.sql
index aef33c3..1035817 100644
--- a/asdc-controller/src/test/resources/schema.sql
+++ b/asdc-controller/src/test/resources/schema.sql
@@ -399,6 +399,8 @@
   `vnf_resource_model_uuid` varchar(200) not null,
   `multi_stage_design` varchar(20) default null,
   `resource_input` varchar(20000) default null,
+  `cds_blueprint_name` varchar(200) default null,
+  `cds_blueprint_version` varchar(20) default null,
   primary key (`model_customization_uuid`),
   key `fk_vnf_resource_customization__vnf_resource1_idx` (`vnf_resource_model_uuid`),
   constraint `fk_vnf_resource_customization__vnf_resource1` foreign key (`vnf_resource_model_uuid`) references `vnf_resource` (`model_uuid`) on delete cascade on update cascade
@@ -801,27 +803,41 @@
 
 
 CREATE TABLE IF NOT EXISTS vnf_vfmodule_cvnfc_configuration_customization (
-  `ID` INT(11) NOT NULL AUTO_INCREMENT, 
-  `MODEL_CUSTOMIZATION_UUID` VARCHAR(200) NOT NULL, 
-  `MODEL_INSTANCE_NAME` VARCHAR(200) NOT NULL, 
-  `CONFIGURATION_TYPE` VARCHAR(200) NULL, 
-  `CONFIGURATION_ROLE` VARCHAR(200) NULL, 
-  `CONFIGURATION_FUNCTION` VARCHAR(200) NULL, 
-  `POLICY_NAME` VARCHAR(200) NULL, 
-  `CREATION_TIMESTAMP` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, 
-  `CONFIGURATION_MODEL_UUID` VARCHAR(200) NOT NULL,
-  `VNF_RESOURCE_CUST_MODEL_CUSTOMIZATION_UUID` VARCHAR(200) DEFAULT NULL,
-  `VF_MODULE_MODEL_CUSTOMIZATION_UUID` VARCHAR(200) DEFAULT NULL, 
-  `CVNFC_CUSTOMIZATION_ID` INT(11) DEFAULT NULL,
-  PRIMARY KEY (`ID`), 
-  INDEX `fk_vnf_vfmodule_cvnfc_config_cust__configuration_idx` (`CONFIGURATION_MODEL_UUID` ASC), 
- 
-  CONSTRAINT `fk_vnf_vfmod_cvnfc_config_cust__configuration_resource` FOREIGN KEY (`CONFIGURATION_MODEL_UUID`) 
-  REFERENCES `configuration` (`MODEL_UUID`) ON DELETE CASCADE ON UPDATE CASCADE
-) ENGINE = INNODB AUTO_INCREMENT = 20654 DEFAULT CHARACTER SET = LATIN1;
+    `ID` INT(11) NOT NULL AUTO_INCREMENT,
+    `MODEL_CUSTOMIZATION_UUID` VARCHAR(200) NOT NULL,
+    `VNF_RESOURCE_CUST_MODEL_CUSTOMIZATION_UUID` VARCHAR(200) NOT NULL,
+    `VF_MODULE_MODEL_CUSTOMIZATION_UUID` VARCHAR(200) NOT NULL,
+    `CVNFC_MODEL_CUSTOMIZATION_UUID` VARCHAR(200) NOT NULL,
+    `MODEL_INSTANCE_NAME` VARCHAR(200) NOT NULL,
+    `CONFIGURATION_TYPE` VARCHAR(200) NULL,
+    `CONFIGURATION_ROLE` VARCHAR(200) NULL,
+    `CONFIGURATION_FUNCTION` VARCHAR(200) NULL,
+    `POLICY_NAME` VARCHAR(200) NULL,
+    `CREATION_TIMESTAMP` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    `CONFIGURATION_MODEL_UUID` VARCHAR(200) NOT NULL,
+    PRIMARY KEY (`ID`),
+    INDEX `fk_vnf_vfmodule_cvnfc_config_cust__configuration_idx` (`CONFIGURATION_MODEL_UUID` ASC),
+    UNIQUE INDEX `UK_vnf_vfmodule_cvnfc_configuration_customization` (`VNF_RESOURCE_CUST_MODEL_CUSTOMIZATION_UUID` ASC , `VF_MODULE_MODEL_CUSTOMIZATION_UUID` ASC , `CVNFC_MODEL_CUSTOMIZATION_UUID` ASC , `MODEL_CUSTOMIZATION_UUID` ASC),
+    INDEX `fk_vnf_vfmodule_cvnfc_config_cust__cvnfc_cust1_idx` (`CVNFC_MODEL_CUSTOMIZATION_UUID` ASC),
+    INDEX `fk_vnf_vfmodule_cvnfc_config_cust__vf_module_cust_idx` (`VF_MODULE_MODEL_CUSTOMIZATION_UUID` ASC),
+    INDEX `fk_vnf_vfmodule_cvnfc_config_cust__vnf_res_cust_idx` (`VNF_RESOURCE_CUST_MODEL_CUSTOMIZATION_UUID` ASC),
+    CONSTRAINT `fk_vnf_vfmod_cvnfc_config_cust__configuration_resource` FOREIGN KEY (`CONFIGURATION_MODEL_UUID`)
+        REFERENCES `configuration` (`MODEL_UUID`)
+        ON DELETE CASCADE ON UPDATE CASCADE,
+    CONSTRAINT `fk_cvnfc_configuration_customization__cvnfc_customization1` FOREIGN KEY (`CVNFC_MODEL_CUSTOMIZATION_UUID`)
+        REFERENCES `cvnfc_customization` (`MODEL_CUSTOMIZATION_UUID`)
+        ON DELETE CASCADE ON UPDATE CASCADE,
+    CONSTRAINT `fk_vnf_configuration_cvnfc_customization__vf_module_customiza1` FOREIGN KEY (`VF_MODULE_MODEL_CUSTOMIZATION_UUID`)
+        REFERENCES `vf_module_customization` (`MODEL_CUSTOMIZATION_UUID`)
+        ON DELETE CASCADE ON UPDATE CASCADE,
+    CONSTRAINT `fk_vfmodule_cvnfc_configuration_customization__vnf_resource_c1` FOREIGN KEY (`VNF_RESOURCE_CUST_MODEL_CUSTOMIZATION_UUID`)
+        REFERENCES `vnf_resource_customization` (`MODEL_CUSTOMIZATION_UUID`)
+        ON DELETE CASCADE ON UPDATE CASCADE
+)  ENGINE=INNODB AUTO_INCREMENT=20654 DEFAULT CHARACTER SET=LATIN1;
+
 
 CREATE TABLE IF NOT EXISTS `pnf_resource` (
-  `ORCHESTRATION_MODE` varchar(20) NOT NULL DEFAULT 'HEAT',
+  `ORCHESTRATION_MODE` varchar(20) DEFAULT NULL,
   `DESCRIPTION` varchar(1200) DEFAULT NULL,
   `CREATION_TIMESTAMP` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
   `MODEL_UUID` varchar(200) NOT NULL,
@@ -857,6 +873,7 @@
   `RESOURCE_MODEL_CUSTOMIZATION_UUID` varchar(200) NOT NULL,
   PRIMARY KEY (`SERVICE_MODEL_UUID`,`RESOURCE_MODEL_CUSTOMIZATION_UUID`)
 )ENGINE=InnoDB DEFAULT CHARSET=latin1;
+
 --------START Request DB SCHEMA --------
 CREATE DATABASE requestdb;
 USE requestdb;
diff --git a/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/AbstractServiceTaskProcessor.groovy b/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/AbstractServiceTaskProcessor.groovy
index 484be19..1ceafb6 100644
--- a/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/AbstractServiceTaskProcessor.groovy
+++ b/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/AbstractServiceTaskProcessor.groovy
@@ -148,7 +148,7 @@
 		} catch (BpmnError e) {
 			throw e
 		} catch (Exception e) {
-			logger.error('Caught exception in ' + method, e)
+			logger.error('Caught exception in {}: {}', method, e.getMessage(), e)
 			exceptionUtil.buildAndThrowWorkflowException(execution, 1002, "Invalid Message")
 		}
 	}
@@ -522,8 +522,7 @@
 				throw bpmnError
 			}
 			catch(Exception e) {
-				e.printStackTrace()
-				logger.debug('Unexpected error encountered - ' + e.getMessage())
+				logger.debug('Unexpected error encountered - {}', e.getMessage(), e)
 				(new ExceptionUtil()).buildAndThrowWorkflowException(execution, 9999, e.getMessage())
 			}
 			finally {
@@ -645,7 +644,7 @@
 				rollbackEnabled = defaultRollback
 			}
 		}
-		
+
 		execution.setVariable(prefix+"backoutOnFailure", rollbackEnabled)
 		logger.debug('rollbackEnabled (aka backoutOnFailure): ' + rollbackEnabled)
 	}
diff --git a/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/CreateAAIVfModule.groovy b/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/CreateAAIVfModule.groovy
index c1f9f5b..e9e7d1e 100644
--- a/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/CreateAAIVfModule.groovy
+++ b/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/CreateAAIVfModule.groovy
@@ -63,8 +63,8 @@
 		execution.setVariable("CAAIVfMod_moduleExists",false)
 		execution.setVariable("CAAIVfMod_baseModuleConflict", false)
 		execution.setVariable("CAAIVfMod_vnfNameFromAAI", null)
-		
-		
+
+
 		// CreateAAIVfModule workflow response variable placeholders
 		execution.setVariable("CAAIVfMod_queryGenericVnfResponseCode",null)
 		execution.setVariable("CAAIVfMod_queryGenericVnfResponse","")
@@ -80,14 +80,14 @@
 		execution.setVariable("CreateAAIVfModuleResponse","")
 		execution.setVariable("RollbackData", null)
 
-	}	
-	
+	}
+
 	// parse the incoming CREATE_VF_MODULE request and store the Generic VNF
 	// and VF Module data in the flow DelegateExecution
 	public void preProcessRequest(DelegateExecution execution) {
 		initProcessVariables(execution)
 
-		def vnfId = execution.getVariable("vnfId")		
+		def vnfId = execution.getVariable("vnfId")
 		if (vnfId == null || vnfId.isEmpty()) {
 			execution.setVariable("CAAIVfMod_newGenericVnf", true)
 			execution.setVariable("CAAIVfMod_vnfId","")
@@ -96,14 +96,14 @@
 			execution.setVariable("CAAIVfMod_vnfId",vnfId)
 		}
 
-		def vnfName = execution.getVariable("vnfName")		
+		def vnfName = execution.getVariable("vnfName")
 		execution.setVariable("CAAIVfMod_vnfName", vnfName)
 
 		String vnfType = execution.getVariable("vnfType")
         execution.setVariable("CAAIVfMod_vnfType", StringUtils.defaultString(vnfType))
 
 		execution.setVariable("CAAIVfMod_serviceId", execution.getVariable("serviceId"))
-		
+
 		String personaModelId = execution.getVariable("personaModelId")
         execution.setVariable("CAAIVfMod_personaId",StringUtils.defaultString(personaModelId))
 
@@ -219,8 +219,7 @@
 			execution.setVariable("CAAIVfMod_createGenericVnfResponseCode", 201)
 			execution.setVariable("CAAIVfMod_createGenericVnfResponse", "Vnf Created")
 		} catch (Exception ex) {
-			ex.printStackTrace()
-			logger.debug("Exception occurred while executing AAI PUT:" + ex.getMessage())
+			logger.debug("Exception occurred while executing AAI PUT: {}", ex.getMessage(), ex)
 			exceptionUtil.buildAndThrowWorkflowException(execution, 5000, "Internal Error - Occured in createGenericVnf.")
 		}
 	}
diff --git a/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/CreateAAIVfModuleVolumeGroup.groovy b/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/CreateAAIVfModuleVolumeGroup.groovy
index dc48711..7e46784 100644
--- a/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/CreateAAIVfModuleVolumeGroup.groovy
+++ b/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/CreateAAIVfModuleVolumeGroup.groovy
@@ -121,8 +121,7 @@
 					execution.setVariable('CAAIVfModVG_getVfModuleResponse', "VF-Module Not found!!")
 				}
 			}catch (Exception ex) {
-				ex.printStackTrace()
-				logger.debug('Exception occurred while executing AAI GET:' + ex.getMessage())
+				logger.debug('Exception occurred while executing AAI GET: {}', ex.getMessage(), ex)
 				execution.setVariable('CAAIVfModVG_getVfModuleResponseCode', 500)
 				execution.setVariable('CAAIVfModVG_getVfModuleResponse', 'AAI GET Failed:' + ex.getMessage())
 			}
@@ -174,8 +173,7 @@
 				logger.debug("CreateAAIVfModule Response code: " + 200)
 				logger.debug("CreateAAIVfModule Response: " + "Success")
 			} catch (Exception ex) {
-				ex.printStackTrace()
-				logger.debug('Exception occurred while executing AAI PUT:' + ex.getMessage())
+				logger.debug('Exception occurred while executing AAI PUT: {}', ex.getMessage(), ex)
 				execution.setVariable('CAAIVfModVG_updateVfModuleResponseCode', 500)
 				execution.setVariable('CAAIVfModVG_updateVfModuleResponse', 'AAI PUT Failed:' + ex.getMessage())
 			}
diff --git a/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/DeleteAAIVfModule.groovy b/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/DeleteAAIVfModule.groovy
index 83f3145..4bce23e 100644
--- a/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/DeleteAAIVfModule.groovy
+++ b/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/DeleteAAIVfModule.groovy
@@ -76,7 +76,7 @@
 	// send a GET request to AA&I to retrieve the Generic Vnf/Vf Module information based on a Vnf Id
 	// expect a 200 response with the information in the response body or a 404 if the Generic Vnf does not exist
 	public void queryAAIForGenericVnf(DelegateExecution execution) {
-		
+
 		def vnfId = execution.getVariable("DAAIVfMod_vnfId")
 
 		try {
@@ -112,8 +112,7 @@
 			execution.setVariable("DAAIVfMod_deleteGenericVnfResponseCode", 200)
 			execution.setVariable("DAAIVfMod_deleteGenericVnfResponse", "Vnf Deleted")
 		} catch (Exception ex) {
-			ex.printStackTrace()
-			logger.debug("Exception occurred while executing AAI DELETE:" + ex.getMessage())
+			logger.debug("Exception occurred while executing AAI DELETE: {}", ex.getMessage(), ex)
 			exceptionUtil.buildAndThrowWorkflowException(execution, 5000, "Internal Error - Occured during deleteGenericVnf")
 		}
 	}
@@ -131,8 +130,7 @@
 			execution.setVariable("DAAIVfMod_deleteVfModuleResponseCode", 200)
 			execution.setVariable("DAAIVfMod_deleteVfModuleResponse", "Vf Module Deleted")
 		} catch (Exception ex) {
-			ex.printStackTrace()
-			logger.debug("Exception occurred while executing AAI PUT:" + ex.getMessage())
+			logger.debug("Exception occurred while executing AAI PUT: {}", ex.getMessage(), ex)
 			exceptionUtil.buildAndThrowWorkflowException(execution, 5000, "Internal Error - Occured during deleteVfModule")
 		}
 	}
diff --git a/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/GenerateVfModuleName.groovy b/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/GenerateVfModuleName.groovy
index 740d9f7..f008130 100644
--- a/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/GenerateVfModuleName.groovy
+++ b/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/GenerateVfModuleName.groovy
@@ -151,8 +151,7 @@
 					}
 				}
 			} catch (Exception ex) {
-				ex.printStackTrace()
-				logger.debug('Exception occurred while executing AAI GET:' + ex.getMessage())
+				logger.debug('Exception occurred while executing AAI GET: {}', ex.getMessage(), ex)
 				exceptionUtil.buildAndThrowWorkflowException(execution, 1002, 'AAI GET Failed:' + ex.getMessage())
 			}
 			logger.trace('Exited ' + method)
diff --git a/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/MsoUtils.groovy b/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/MsoUtils.groovy
index 92c1579..f371cce 100644
--- a/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/MsoUtils.groovy
+++ b/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/MsoUtils.groovy
@@ -126,7 +126,7 @@
 
 
 	/***** Utilities when using XmlParser *****/
-	
+
 	/**
 	 * Convert a Node into a String by deserializing it and formatting it.
 	 *
@@ -883,7 +883,7 @@
 				callbackUrlToUse = callbackUrlToUse.replaceAll("(http://)(.*)(:28080*)", {orig, first, torepl, last -> "${first}${qualifiedHostName}${last}"})
 			}
 		}catch(Exception e){
-				log("DEBUG", "unable to grab qualified host name, using what's in urn properties for callbackurl. Exception was: " + e.printStackTrace())
+			logger.debug("Unable to grab qualified host name, using what's in urn properties for callbackurl. Exception was: {}", e.getMessage(), e)
 		}
 		return callbackUrlToUse
 
diff --git a/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/SDNCAdapter.groovy b/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/SDNCAdapter.groovy
index d909a77..a7bb707 100644
--- a/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/SDNCAdapter.groovy
+++ b/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/SDNCAdapter.groovy
@@ -166,7 +166,7 @@
 
 			logger.debug(UrnPropertiesReader.getVariable("mso.adapters.sdnc.endpoint", execution))
 		}catch(Exception e){
-			logger.debug('Internal Error occured during PreProcess Method: ', e)
+			logger.debug('Internal Error occured during PreProcess Method: {}', e.getMessage(), e)
 			exceptionUtil.buildAndThrowWorkflowException(execution, 9999, 'Internal Error occured during PreProcess Method') // TODO: what message and error code?
 		}
 		logger.trace("End pre Process SDNCRequestScript ")
diff --git a/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/SDNCAdapterRestV1.groovy b/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/SDNCAdapterRestV1.groovy
index 9d7ce82..69d5f02 100644
--- a/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/SDNCAdapterRestV1.groovy
+++ b/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/SDNCAdapterRestV1.groovy
@@ -165,7 +165,7 @@
 					logger.debug(getProcessKey(execution) + ": Unable to encode BasicAuth credentials for SDNCAdapter")
 					logger.error("{} {} {} {}", MessageEnum.BPMN_GENERAL_EXCEPTION_ARG.toString(),
 							getProcessKey(execution) + ": Unable to encode BasicAuth credentials for SDNCAdapter",
-							"BPMN", ErrorCode.UnknownError.getValue());
+							"BPMN", ErrorCode.UnknownError.getValue(), ex);
 				}
 			}
 
diff --git a/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/SDNCAdapterRestV2.groovy b/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/SDNCAdapterRestV2.groovy
index c1d68c5..f91bf54 100644
--- a/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/SDNCAdapterRestV2.groovy
+++ b/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/SDNCAdapterRestV2.groovy
@@ -161,7 +161,7 @@
 					logger.debug(getProcessKey(execution) + ": Unable to encode BasicAuth credentials for SDNCAdapter")
 					logger.error("{} {} {} {}", MessageEnum.BPMN_GENERAL_EXCEPTION_ARG.toString(),
 							getProcessKey(execution) + ": Unable to encode BasicAuth credentials for SDNCAdapter",
-							"BPMN", ErrorCode.UnknownError.getValue());
+							"BPMN", ErrorCode.UnknownError.getValue(), ex);
 				}
 			}
 
diff --git a/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/UpdateAAIGenericVnf.groovy b/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/UpdateAAIGenericVnf.groovy
index 796ee43..a40bf59 100644
--- a/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/UpdateAAIGenericVnf.groovy
+++ b/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/UpdateAAIGenericVnf.groovy
@@ -206,7 +206,7 @@
 				// Construct payload
 				managementV6AddressEntry = updateGenericVnfNode(origRequest, 'management-v6-address')
 			}
-			
+
 			// Handle orchestration-status
 			String orchestrationStatus = execution.getVariable('UAAIGenVnf_orchestrationStatus')
 			String orchestrationStatusEntry = null
@@ -214,7 +214,7 @@
 				// Construct payload
 				orchestrationStatusEntry = updateGenericVnfNode(origRequest, 'orchestration-status')
 			}
-			
+
 			org.onap.aai.domain.yang.GenericVnf payload = new org.onap.aai.domain.yang.GenericVnf();
 			payload.setVnfId(vnfId)
 			payload.setPersonaModelVersion(personaModelVersionEntry)
@@ -227,8 +227,7 @@
 			try {
 				getAAIClient().update(uri,payload)
 			} catch (Exception ex) {
-				ex.printStackTrace()
-				logger.debug('Exception occurred while executing AAI PATCH:' + ex.getMessage())
+				logger.debug('Exception occurred while executing AAI PATCH: {}', ex.getMessage(), ex)
 				execution.setVariable('UAAIGenVnf_updateGenericVnfResponseCode', 500)
 				execution.setVariable('UAAIGenVnf_updateGenericVnfResponse', 'AAI PATCH Failed:' + ex.getMessage())
 			}
@@ -258,9 +257,9 @@
 			return ""
 		}
 		else {
-			return elementValue		
+			return elementValue
 		}
-		
+
 	}
 
 	/**
diff --git a/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/VidUtils.groovy b/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/VidUtils.groovy
index 259a787..1960caf 100644
--- a/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/VidUtils.groovy
+++ b/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/VidUtils.groovy
@@ -69,7 +69,7 @@
 	public String createXmlVolumeRequest(Map requestMap, String action, String serviceInstanceId) {
 		createXmlVolumeRequest(requestMap, action, serviceInstanceId, '')
 	}
-	
+
 
 	/**
 	 * Create a volume-request XML using a map
@@ -84,9 +84,9 @@
 		def serviceName = ''
 		def modelCustomizationName = ''
 		def asdcServiceModelVersion = ''
-		
+
 		def suppressRollback = requestMap.requestDetails.requestInfo.suppressRollback
-		
+
 		def backoutOnFailure = ""
 		if(suppressRollback != null){
 			if ( suppressRollback == true) {
@@ -95,7 +95,7 @@
 				backoutOnFailure = "true"
 			}
 		}
-		
+
 		def volGrpName = requestMap.requestDetails.requestInfo?.instanceName ?: ''
 		def serviceId = requestMap.requestDetails.requestParameters?.serviceId ?: ''
 		def relatedInstanceList = requestMap.requestDetails.relatedInstanceList
@@ -108,16 +108,16 @@
 				modelCustomizationName = it.relatedInstance.modelInfo?.modelInstanceName
 			}
 		}
-		
+
 		vnfType = serviceName + '/' + modelCustomizationName
-		
+
 		def userParams = requestMap.requestDetails?.requestParameters?.userParams
 		def userParamsNode = ''
 		if(userParams != null) {
 			userParamsNode = buildUserParams(userParams)
 		}
 		def modelCustomizationId = requestMap.requestDetails?.modelInfo?.modelCustomizationUuid ?: ''
-		
+
 		String xmlReq = """
 		<volume-request xmlns="http://www.w3.org/2001/XMLSchema">
 			<request-info>
@@ -145,9 +145,9 @@
 		// return a pretty-print of the volume-request xml without the preamble
 		return groovy.xml.XmlUtil.serialize(xmlReq.normalize().replaceAll("\t", "").replaceAll("\n", "")).replaceAll("(<\\?[^<]*\\?>\\s*[\\r\\n]*)?", "") 
 	}
-	
+
 	/**
-	 * A common method that can be used to build volume-params node from a map. 
+	 * A common method that can be used to build volume-params node from a map.
 	 * @param Map userParams
 	 * @return
 	 */
@@ -166,9 +166,9 @@
 	}
 
 	/**
-	 * A common method that can be used to extract 'requestDetails' 
+	 * A common method that can be used to extract 'requestDetails'
 	 * @param String json
-	 * @return String json requestDetails  
+	 * @return String json requestDetails
 	 */
 	@Deprecated
 	public getJsonRequestDetails(String jsonInput) {
@@ -183,10 +183,10 @@
 				return rtn
 			} else {
 			    return rtn
-			}	
+			}
 		}
 	}
-	
+
 	/**
 	 * A common method that can be used to extract 'requestDetails' in Xml
 	 * @param String json
@@ -203,17 +203,17 @@
 			return XmlTool.normalize(XML.toString(jsonObj))
 		}
 	}
-	
+
 	/**
 	 * Create a network-request XML using a map
- 	 * @param execution 
-	 * @param xmlRequestDetails - requestDetails in xml 
+ 	 * @param execution
+	 * @param xmlRequestDetails - requestDetails in xml
 	 * @return
 	 * Note: See latest version: createXmlNetworkRequestInstance()
 	 */
 
 	public String createXmlNetworkRequestInfra(execution, def networkJsonIncoming) {
-	
+
 		def requestId = execution.getVariable("requestId")
 		def serviceInstanceId = execution.getVariable("serviceInstanceId")
 		def requestAction = execution.getVariable("requestAction")
@@ -225,13 +225,13 @@
 			def instanceName =  reqMap.requestDetails.requestInfo.instanceName
 			def modelCustomizationId =  reqMap.requestDetails.modelInfo.modelCustomizationId
 			if (modelCustomizationId == null) {
-				modelCustomizationId =  reqMap.requestDetails.modelInfo.modelCustomizationUuid !=null ?  
+				modelCustomizationId =  reqMap.requestDetails.modelInfo.modelCustomizationUuid !=null ?
 				                        reqMap.requestDetails.modelInfo.modelCustomizationUuid : ""
 			}
 			def modelName = reqMap.requestDetails.modelInfo.modelName
 			def lcpCloudRegionId = reqMap.requestDetails.cloudConfiguration.lcpCloudRegionId
 			def tenantId = reqMap.requestDetails.cloudConfiguration.tenantId
-			def serviceId = reqMap.requestDetails.requestInfo.productFamilyId 
+			def serviceId = reqMap.requestDetails.requestInfo.productFamilyId
 			def suppressRollback = reqMap.requestDetails.requestInfo.suppressRollback.toString()
 			def backoutOnFailure = "true"
 			if(suppressRollback != null){
@@ -241,7 +241,7 @@
 					backoutOnFailure = "true"
 				}
 			}
-		
+
 			//def userParams = reqMap.requestDetails.requestParameters.userParams
 			//def userParamsNode = buildUserParams(userParams)
 			def userParams = reqMap.requestDetails?.requestParameters?.userParams
@@ -249,26 +249,26 @@
 			if(userParams != null) {
 				userParamsNode = buildUserParams(userParams)
 			}
-			
+
 			//'sdncVersion' = current, '1610' (non-RPC SDNC) or '1702' (RPC SDNC)
 			def sdncVersion =  execution.getVariable("sdncVersion")
-			
+
 			String xmlReq = """
-			<network-request xmlns="http://www.w3.org/2001/XMLSchema"> 
-			 <request-info> 
+			<network-request xmlns="http://www.w3.org/2001/XMLSchema">
+			 <request-info>
 	            <request-id>${MsoUtils.xmlEscape(requestId)}</request-id>
-			 	<action>${MsoUtils.xmlEscape(requestAction)}</action> 
-			 	<source>VID</source> 
+			 	<action>${MsoUtils.xmlEscape(requestAction)}</action>
+			 	<source>VID</source>
 			 	<service-instance-id>${MsoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
-			 </request-info> 
+			 </request-info>
 			 <network-inputs>
-			 	<network-id>${MsoUtils.xmlEscape(networkId)}</network-id> 
-			 	<network-name>${MsoUtils.xmlEscape(instanceName)}</network-name> 
+			 	<network-id>${MsoUtils.xmlEscape(networkId)}</network-id>
+			 	<network-name>${MsoUtils.xmlEscape(instanceName)}</network-name>
 			 	<network-type>${MsoUtils.xmlEscape(modelName)}</network-type>
-				<modelCustomizationId>${MsoUtils.xmlEscape(modelCustomizationId)}</modelCustomizationId> 
-			 	<aic-cloud-region>${MsoUtils.xmlEscape(lcpCloudRegionId)}</aic-cloud-region> 
+				<modelCustomizationId>${MsoUtils.xmlEscape(modelCustomizationId)}</modelCustomizationId>
+			 	<aic-cloud-region>${MsoUtils.xmlEscape(lcpCloudRegionId)}</aic-cloud-region>
 			 	<tenant-id>${MsoUtils.xmlEscape(tenantId)}</tenant-id>
-			 	<service-id>${MsoUtils.xmlEscape(serviceId)}</service-id> 
+			 	<service-id>${MsoUtils.xmlEscape(serviceId)}</service-id>
 			 	<backout-on-failure>${MsoUtils.xmlEscape(backoutOnFailure)}</backout-on-failure>
                 <sdncVersion>${MsoUtils.xmlEscape(sdncVersion)}</sdncVersion>
 			 </network-inputs>
@@ -281,8 +281,7 @@
 			return groovy.xml.XmlUtil.serialize(xmlReq.normalize().replaceAll("\t", "").replaceAll("\n", "")).replaceAll("(<\\?[^<]*\\?>\\s*[\\r\\n]*)?", "")
 
 		} catch(Exception e) {
-			logger.debug("{} {}", "Error in Vid Utils", e.getCause())
-			e.printStackTrace();
+			logger.debug("Error in Vid Utils: {}", e.getCause(), e)
 			throw e
 		}
 	}
@@ -299,7 +298,7 @@
 		def networkModelVersion = ""
 		def networkModelCustomizationUuid = ""
 		def networkModelInvariantUuid = ""
-		
+
 		// verify the DB Catalog response JSON structure
 		def networkModelInfo = execution.getVariable("networkModelInfo")
 		def jsonSlurper = new JsonSlurper()
@@ -326,14 +325,14 @@
 			} catch (Exception ex) {
 		    	throw ex
 			}
-		}		
-		
+		}
+
 		def serviceModelUuid = ""
 		def serviceModelName = ""
 		def serviceModelVersion = ""
 		def serviceModelCustomizationUuid = ""
 		def serviceModelInvariantUuid = ""
-		
+
 		// verify the DB Catalog response JSON structure
 		def serviceModelInfo = execution.getVariable("serviceModelInfo")
 		def jsonServiceSlurper = new JsonSlurper()
@@ -361,8 +360,8 @@
 				throw ex
 			}
 		}
-		
-		
+
+
 		def subscriptionServiceType = execution.getVariable("subscriptionServiceType") != null ? execution.getVariable("subscriptionServiceType") : ""
 		def globalSubscriberId = execution.getVariable("globalSubscriberId") != null ? execution.getVariable("globalSubscriberId") : ""
 		def requestId = execution.getVariable("msoRequestId")
@@ -382,88 +381,88 @@
 				backoutOnFailure = "true"
 			}
 		}
-		
+
 		//'sdncVersion' = current, '1610' (non-RPC SDNC) or '1702' (RPC SDNC)
 		def sdncVersion =  execution.getVariable("sdncVersion")
-		
+
 		def source = "VID"
 		def action = execution.getVariable("action")
-				
+
 		def userParamsNode = ""
 		def userParams = execution.getVariable("networkInputParams")
 		if(userParams != null) {
 		   userParamsNode = buildUserParams(userParams)
 		}
-		
+
 		String xmlReq = """
-		<network-request xmlns="http://www.w3.org/2001/XMLSchema"> 
-		 <request-info> 
+		<network-request xmlns="http://www.w3.org/2001/XMLSchema">
+		 <request-info>
             <request-id>${MsoUtils.xmlEscape(requestId)}</request-id>
-		 	<action>${MsoUtils.xmlEscape(action)}</action> 
-		 	<source>${MsoUtils.xmlEscape(source)}</source> 
+		 	<action>${MsoUtils.xmlEscape(action)}</action>
+		 	<source>${MsoUtils.xmlEscape(source)}</source>
 		 	<service-instance-id>${MsoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
-		 </request-info> 
-		 <network-inputs> 
-		 	<network-id>${MsoUtils.xmlEscape(networkId)}</network-id> 
-		 	<network-name>${MsoUtils.xmlEscape(networkName)}</network-name> 
+		 </request-info>
+		 <network-inputs>
+		 	<network-id>${MsoUtils.xmlEscape(networkId)}</network-id>
+		 	<network-name>${MsoUtils.xmlEscape(networkName)}</network-name>
 		 	<network-type>${MsoUtils.xmlEscape(networkModelName)}</network-type>
 		 	<subscription-service-type>${MsoUtils.xmlEscape(subscriptionServiceType)}</subscription-service-type>
             <global-customer-id>${MsoUtils.xmlEscape(globalSubscriberId)}</global-customer-id>
-		 	<aic-cloud-region>${MsoUtils.xmlEscape(aicCloudReqion)}</aic-cloud-region> 
+		 	<aic-cloud-region>${MsoUtils.xmlEscape(aicCloudReqion)}</aic-cloud-region>
 		 	<tenant-id>${MsoUtils.xmlEscape(tenantId)}</tenant-id>
-		 	<service-id>${MsoUtils.xmlEscape(serviceId)}</service-id> 
+		 	<service-id>${MsoUtils.xmlEscape(serviceId)}</service-id>
 		 	<backout-on-failure>${MsoUtils.xmlEscape(backoutOnFailure)}</backout-on-failure>
 			<failIfExist>${MsoUtils.xmlEscape(failIfExist)}</failIfExist>
             <networkModelInfo>
               <modelName>${MsoUtils.xmlEscape(networkModelName)}</modelName>
               <modelUuid>${MsoUtils.xmlEscape(networkModelUuid)}</modelUuid>
-              <modelInvariantUuid>${MsoUtils.xmlEscape(networkModelInvariantUuid)}</modelInvariantUuid>            
+              <modelInvariantUuid>${MsoUtils.xmlEscape(networkModelInvariantUuid)}</modelInvariantUuid>
               <modelVersion>${MsoUtils.xmlEscape(networkModelVersion)}</modelVersion>
               <modelCustomizationUuid>${MsoUtils.xmlEscape(networkModelCustomizationUuid)}</modelCustomizationUuid>
 		    </networkModelInfo>
             <serviceModelInfo>
               <modelName>${MsoUtils.xmlEscape(serviceModelName)}</modelName>
               <modelUuid>${MsoUtils.xmlEscape(serviceModelUuid)}</modelUuid>
-              <modelInvariantUuid>${MsoUtils.xmlEscape(serviceModelInvariantUuid)}</modelInvariantUuid>            
+              <modelInvariantUuid>${MsoUtils.xmlEscape(serviceModelInvariantUuid)}</modelInvariantUuid>
               <modelVersion>${MsoUtils.xmlEscape(serviceModelVersion)}</modelVersion>
               <modelCustomizationUuid>${MsoUtils.xmlEscape(serviceModelCustomizationUuid)}</modelCustomizationUuid>
-             
-		    </serviceModelInfo>										      			
-            <sdncVersion>${MsoUtils.xmlEscape(sdncVersion)}</sdncVersion>                    
+
+		    </serviceModelInfo>
+            <sdncVersion>${MsoUtils.xmlEscape(sdncVersion)}</sdncVersion>
 		 </network-inputs>
 		 <network-params>
 			${userParamsNode}
-		 </network-params> 
+		 </network-params>
 		</network-request>
 		"""
 		// return a pretty-print of the volume-request xml without the preamble
 		return groovy.xml.XmlUtil.serialize(xmlReq.normalize().replaceAll("\t", "").replaceAll("\n", "")).replaceAll("(<\\?[^<]*\\?>\\s*[\\r\\n]*)?", "")
-			
+
 	}
-	
+
 	/**
 	 * Create a vnf-request XML using a map
-	 * @param requestMap - map created from VID JSON 
+	 * @param requestMap - map created from VID JSON
 	 * @param action
 	 * @return
 	 */
 	public String createXmlVfModuleRequest(execution, Map requestMap, String action, String serviceInstanceId) {
-				
+
 		//def relatedInstanceList = requestMap.requestDetails.relatedInstanceList
-		
+
 		//relatedInstanceList.each {
 		//	if (it.relatedInstance.modelInfo.modelType == 'vnf') {
 		//		vnfType = it.relatedInstance.modelInfo.modelName
 		//		vnfId = it.relatedInstance.modelInfo.modelInvariantId
 		//	}
 		//}
-		
+
 		def vnfName = ''
 		def asdcServiceModelInfo = ''
-				
+
 		def relatedInstanceList = requestMap.requestDetails?.relatedInstanceList
-		
-		
+
+
 		if (relatedInstanceList != null) {
 			relatedInstanceList.each {
 				if (it.relatedInstance.modelInfo?.modelType == 'service') {
@@ -474,30 +473,30 @@
 				}
 			}
 		}
-		
+
 		def vnfType = execution.getVariable('vnfType')
 		def vnfId = execution.getVariable('vnfId')
 
 		def vfModuleId = execution.getVariable('vfModuleId')
 		def volumeGroupId = execution.getVariable('volumeGroupId')
 		def userParams = requestMap.requestDetails?.requestParameters?.userParams
-		
-		
+
+
 		def userParamsNode = ''
 		if(userParams != null) {
 			userParamsNode = buildUserParams(userParams)
 		}
-		
+
 		def isBaseVfModule = "false"
 		if (execution.getVariable('isBaseVfModule') == true) {
 			isBaseVfModule = "true"		
 		}
-		
+
 		def requestId = execution.getVariable("mso-request-id")		
 		def vfModuleName = requestMap.requestDetails?.requestInfo?.instanceName ?: ''
 		def vfModuleModelName = requestMap.requestDetails?.modelInfo?.modelName ?: ''
 		def suppressRollback = requestMap.requestDetails?.requestInfo?.suppressRollback
-		
+
 		def backoutOnFailure = ""
 		if(suppressRollback != null){
 			if ( suppressRollback == true) {
@@ -506,14 +505,14 @@
 				backoutOnFailure = "true"
 			}
 		}
-		
+
 		def serviceId = requestMap.requestDetails?.requestParameters?.serviceId ?: ''
 		def aicCloudRegion = requestMap.requestDetails?.cloudConfiguration?.lcpCloudRegionId ?: ''
 		def tenantId = requestMap.requestDetails?.cloudConfiguration?.tenantId ?: ''
 		def personaModelId = requestMap.requestDetails?.modelInfo?.modelInvariantUuid ?: ''
 		def personaModelVersion = requestMap.requestDetails?.modelInfo?.modelUuid ?: ''
 		def modelCustomizationId = requestMap.requestDetails?.modelInfo?.modelCustomizationUuid ?: ''
-		
+
 		String xmlReq = """
 		<vnf-request>
 			<request-info>
@@ -524,17 +523,17 @@
 			</request-info>
 			<vnf-inputs>
 				<!-- not in use in 1610 -->
-				<vnf-name>${MsoUtils.xmlEscape(vnfName)}</vnf-name>					
+				<vnf-name>${MsoUtils.xmlEscape(vnfName)}</vnf-name>
 				<vnf-type>${MsoUtils.xmlEscape(vnfType)}</vnf-type>
 				<vnf-id>${MsoUtils.xmlEscape(vnfId)}</vnf-id>
 				<volume-group-id>${MsoUtils.xmlEscape(volumeGroupId)}</volume-group-id>
 				<vf-module-id>${MsoUtils.xmlEscape(vfModuleId)}</vf-module-id>
-				<vf-module-name>${MsoUtils.xmlEscape(vfModuleName)}</vf-module-name>				
+				<vf-module-name>${MsoUtils.xmlEscape(vfModuleName)}</vf-module-name>
 				<vf-module-model-name>${MsoUtils.xmlEscape(vfModuleModelName)}</vf-module-model-name>
 				<model-customization-id>${MsoUtils.xmlEscape(modelCustomizationId)}</model-customization-id>
 				<is-base-vf-module>${MsoUtils.xmlEscape(isBaseVfModule)}</is-base-vf-module>
 				<asdc-service-model-version>${MsoUtils.xmlEscape(asdcServiceModelInfo)}</asdc-service-model-version>
-				<aic-cloud-region>${MsoUtils.xmlEscape(aicCloudRegion)}</aic-cloud-region>				
+				<aic-cloud-region>${MsoUtils.xmlEscape(aicCloudRegion)}</aic-cloud-region>
 				<tenant-id>${MsoUtils.xmlEscape(tenantId)}</tenant-id>
 				<service-id>${MsoUtils.xmlEscape(serviceId)}</service-id>
 				<backout-on-failure>${MsoUtils.xmlEscape(backoutOnFailure)}</backout-on-failure>
@@ -546,10 +545,10 @@
 			</vnf-params>
 		</vnf-request>
 		"""
-	
+
 		// return a pretty-print of the volume-request xml without the preamble
 		return groovy.xml.XmlUtil.serialize(xmlReq.normalize().replaceAll("\t", "").replaceAll("\n", "")).replaceAll("(<\\?[^<]*\\?>\\s*[\\r\\n]*)?", "") 
 	}
-	
+
 
 }
diff --git a/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/VnfAdapterRestV1.groovy b/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/VnfAdapterRestV1.groovy
index ac67d94..aacd385 100644
--- a/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/VnfAdapterRestV1.groovy
+++ b/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/VnfAdapterRestV1.groovy
@@ -294,7 +294,7 @@
 				} catch (IOException ex) {
 					logger.error("{} {} {} {}", MessageEnum.BPMN_GENERAL_EXCEPTION_ARG.toString(),
 							getProcessKey(execution) + ": Unable to encode BasicAuth credentials for VnfAdapter",
-							"BPMN", ErrorCode.UnknownError.getValue());
+							"BPMN", ErrorCode.UnknownError.getValue(), ex);
 				}
 			}
 
@@ -398,7 +398,7 @@
 				vnfAdapterWorkflowException(execution, callback)
 			}
 		} catch (Exception e) {
-			logger.debug("Error encountered within VnfAdapterRest ProcessCallback method", e)
+			logger.debug("Error encountered within VnfAdapterRest ProcessCallback method: {}", e.getMessage(), e)
 			exceptionUtil.buildAndThrowWorkflowException(execution, 7020, "Error encountered within VnfAdapterRest ProcessCallback method")
 		}
 	}
diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/validation/FlowValidatorRunner.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/validation/FlowValidatorRunner.java
index 5352fc2..2cc6415 100644
--- a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/validation/FlowValidatorRunner.java
+++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/validation/FlowValidatorRunner.java
@@ -146,7 +146,7 @@
 				result.add(klass.newInstance());
 			}
 		} catch (InstantiationException | IllegalAccessException e) {
-			logger.error("failed to build validator list for " + clazz.getName(), e);
+			logger.error("failed to build validator list for {}", clazz.getName(), e);
 			throw new RuntimeException(e);
 		}
 		
diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/tasks/ExtractPojosForBB.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/tasks/ExtractPojosForBB.java
index 260a942..8af6e80 100644
--- a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/tasks/ExtractPojosForBB.java
+++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/tasks/ExtractPojosForBB.java
@@ -49,7 +49,7 @@
 	public <T> T extractByKey(BuildingBlockExecution execution, ResourceKey key) throws BBObjectNotFoundException {
 		return extractByKey(execution, key, execution.getLookupMap().get(key));
 	}
-	protected <T> T extractByKey(BuildingBlockExecution execution, ResourceKey key, String value)
+	public <T> T extractByKey(BuildingBlockExecution execution, ResourceKey key, String value)
 			throws BBObjectNotFoundException {
 
 		Optional<T> result = Optional.empty();
diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/cds/AbstractCDSProcessingBBUtils.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/cds/AbstractCDSProcessingBBUtils.java
index 29abe44..0b2ef92 100644
--- a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/cds/AbstractCDSProcessingBBUtils.java
+++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/cds/AbstractCDSProcessingBBUtils.java
@@ -25,11 +25,11 @@
 import java.util.concurrent.atomic.AtomicReference;
 
 import org.camunda.bpm.engine.delegate.DelegateExecution;
-import org.onap.ccsdk.apps.controllerblueprints.common.api.ActionIdentifiers;
-import org.onap.ccsdk.apps.controllerblueprints.common.api.CommonHeader;
-import org.onap.ccsdk.apps.controllerblueprints.common.api.EventType;
-import org.onap.ccsdk.apps.controllerblueprints.processing.api.ExecutionServiceInput;
-import org.onap.ccsdk.apps.controllerblueprints.processing.api.ExecutionServiceOutput;
+import org.onap.ccsdk.cds.controllerblueprints.common.api.ActionIdentifiers;
+import org.onap.ccsdk.cds.controllerblueprints.common.api.CommonHeader;
+import org.onap.ccsdk.cds.controllerblueprints.common.api.EventType;
+import org.onap.ccsdk.cds.controllerblueprints.processing.api.ExecutionServiceInput;
+import org.onap.ccsdk.cds.controllerblueprints.processing.api.ExecutionServiceOutput;
 import org.onap.so.client.PreconditionFailedException;
 import org.onap.so.client.RestPropertiesLoader;
 import org.onap.so.client.cds.beans.AbstractCDSPropertiesBean;
diff --git a/bpmn/MSOCoreBPMN/src/test/java/org/onap/so/bpmn/core/domain/VnfResourceTest.java b/bpmn/MSOCoreBPMN/src/test/java/org/onap/so/bpmn/core/domain/VnfResourceTest.java
index a83337f..5271bb3 100644
--- a/bpmn/MSOCoreBPMN/src/test/java/org/onap/so/bpmn/core/domain/VnfResourceTest.java
+++ b/bpmn/MSOCoreBPMN/src/test/java/org/onap/so/bpmn/core/domain/VnfResourceTest.java
@@ -22,13 +22,17 @@
 import static org.junit.Assert.*;
 
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.List;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 import org.junit.Test;
 
 public class VnfResourceTest {
-	
+
+	private final static String ALL_VF_MODULES_JSON =
+		"{\"ArrayList\":[{\"resourceType\":\"MODULE\",\"resourceInstance\":{},\"homingSolution\":{\"license\":{},\"rehome\":false},\"vfModuleName\":\"vfModuleName\",\"vfModuleType\":\"vfModuleType\",\"heatStackId\":\"heatStackId\",\"hasVolumeGroup\":true,\"isBase\":true,\"vfModuleLabel\":\"vfModuleLabel\",\"initialCount\":0},{\"resourceType\":\"MODULE\",\"resourceInstance\":{},\"homingSolution\":{\"license\":{},\"rehome\":false},\"vfModuleName\":\"vfModuleName\",\"vfModuleType\":\"vfModuleType\",\"heatStackId\":\"heatStackId\",\"hasVolumeGroup\":true,\"isBase\":true,\"vfModuleLabel\":\"vfModuleLabel\",\"initialCount\":0}]}";
+
 	private VnfResource vnf= new VnfResource();
 	List<ModuleResource> moduleResources;
 
@@ -63,4 +67,34 @@
 		assertTrue(vnfResource != null);
 	}
 
+	@Test
+	public void testVfModules() {
+
+		moduleResources = new ArrayList<>();
+
+		ModuleResource moduleresource = new ModuleResource();
+		moduleresource.setVfModuleName("vfModuleName");
+		moduleresource.setHeatStackId("heatStackId");
+		moduleresource.setIsBase(true);
+		moduleresource.setVfModuleLabel("vfModuleLabel");
+		moduleresource.setInitialCount(0);
+		moduleresource.setVfModuleType("vfModuleType");
+		moduleresource.setHasVolumeGroup(true);
+
+		moduleResources.add(moduleresource);
+
+		vnf.setModules(moduleResources);
+		assertEquals(vnf.getVfModules(), moduleResources);
+
+		List<ModuleResource> moduleResources = vnf.getAllVfModuleObjects();
+		assertEquals(1, moduleResources.size());
+
+		vnf.addVfModule(moduleresource);
+		moduleResources = vnf.getAllVfModuleObjects();
+		assertEquals(2, moduleResources.size());
+
+		assertEquals(ALL_VF_MODULES_JSON, vnf.getAllVfModulesJson());
+
+	}
+
 }
diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/CreateNetworkInstance.groovy b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/CreateNetworkInstance.groovy
index 19fe018..d588da3 100644
--- a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/CreateNetworkInstance.groovy
+++ b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/CreateNetworkInstance.groovy
@@ -416,7 +416,7 @@
 
 		} catch (Exception ex) {
 			String errorException = "  Bpmn error encountered in CreateNetworkInstance flow. FalloutHandlerRequest,  buildErrorResponse()"
-			logger.debug("Exception error in CreateNetworkInstance flow,  buildErrorResponse(): "  + ex.getMessage())
+			logger.debug("Exception error in CreateNetworkInstance flow,  buildErrorResponse(): {}", ex.getMessage(), ex)
 			falloutHandlerRequest =
 			"""<aetgt:FalloutHandlerRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
 					                             xmlns:ns="http://org.onap/so/request/types/v1"
diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoCreateVfModule.groovy b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoCreateVfModule.groovy
index 7a606d5..eface7b 100644
--- a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoCreateVfModule.groovy
+++ b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoCreateVfModule.groovy
@@ -668,8 +668,7 @@
 			rollbackData.put("VFMODULE", "rollbackPrepareUpdateVfModule", "true")
 			execution.setVariable("rollbackData", rollbackData)
 		} catch (Exception ex) {
-				ex.printStackTrace()
-				logger.debug('Exception occurred while postProcessing CreateAAIVfModule request:' + ex.getMessage())
+				logger.debug('Exception occurred while postProcessing CreateAAIVfModule request: {}', ex.getMessage(), ex)
 				exceptionUtil.buildAndThrowWorkflowException(execution, 1002, 'Bad response from CreateAAIVfModule' + ex.getMessage())
 		}
 		logger.trace('Exited ' + method)
@@ -741,8 +740,7 @@
 					}
 				}
 			} catch (Exception ex) {
-				ex.printStackTrace()
-				logger.debug('Exception occurred while executing AAI GET:' + ex.getMessage())
+				logger.debug('Exception occurred while executing AAI GET: {}', ex.getMessage(), ex)
 				exceptionUtil.buildAndThrowWorkflowException(execution, 1002, 'AAI GET Failed:' + ex.getMessage())
 			}
 			logger.trace('Exited ' + method)
@@ -822,17 +820,16 @@
 					}
 				}
 			} catch (Exception ex) {
-				ex.printStackTrace()
-				logger.debug('Exception occurred while executing AAI GET:' + ex.getMessage())
+				logger.debug('Exception occurred while executing AAI GET: {}', ex.getMessage(), ex)
 				exceptionUtil.buildAndThrowWorkflowException(execution, 1002, 'AAI GET Failed:' + ex.getMessage())
 			}
 			logger.trace('Exited ' + method)
 		} catch (BpmnError e) {
 			throw e;
 		} catch (Exception e) {
-			logger.error("{} {} {} {} {}", MessageEnum.BPMN_GENERAL_EXCEPTION_ARG.toString(),
+			logger.error("{} {} {} {} {} {}", MessageEnum.BPMN_GENERAL_EXCEPTION_ARG.toString(),
 					'Caught exception in ' + method, "BPMN",
-					ErrorCode.UnknownError.getValue(), "Exception is:\n" + e);
+					ErrorCode.UnknownError.getValue(), "Exception is:\n" + e, e);
 			exceptionUtil.buildAndThrowWorkflowException(execution, 1002, 'Error in queryAAIVfModuleForStatus(): ' + e.getMessage())
 		}
 	}
diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoCreateVnf.groovy b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoCreateVnf.groovy
index 5f160bb..e1b0776 100644
--- a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoCreateVnf.groovy
+++ b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoCreateVnf.groovy
@@ -362,7 +362,7 @@
 			resourceClient.connect(uri, siUri)
 
 		}catch(Exception ex) {
-			logger.debug("Error Occured in DoCreateVnf CreateGenericVnf Process ", ex)
+			logger.debug("Error Occured in DoCreateVnf CreateGenericVnf Process: {}", ex.getMessage(), ex)
 			exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Internal Error - Occured in DoCreateVnf CreateGenericVnf Process")
 		}
 		logger.trace("COMPLETED DoCreateVnf CreateGenericVnf Process")
diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoDeleteVfModule.groovy b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoDeleteVfModule.groovy
index 05ccfa0..2623381 100644
--- a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoDeleteVfModule.groovy
+++ b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoDeleteVfModule.groovy
@@ -621,8 +621,7 @@
                     logger.debug("Received orchestration status from A&AI: " + orchestrationStatus)
                 }
 			} catch (Exception ex) {
-				ex.printStackTrace()
-				logger.debug('Exception occurred while executing AAI GET:' + ex.getMessage())
+				logger.debug('Exception occurred while executing AAI GET: {}', ex.getMessage(), ex)
 				exceptionUtil.buildAndThrowWorkflowException(execution, 1002, 'AAI GET Failed:' + ex.getMessage())
 			}
 			logger.trace('Exited ' + method)
diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoDeleteVfModuleFromVnf.groovy b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoDeleteVfModuleFromVnf.groovy
index 47aec46..f0182e5 100644
--- a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoDeleteVfModuleFromVnf.groovy
+++ b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoDeleteVfModuleFromVnf.groovy
@@ -50,7 +50,7 @@
 
 public class DoDeleteVfModuleFromVnf extends VfModuleBase {
     private static final Logger logger = LoggerFactory.getLogger( DoDeleteVfModuleFromVnf.class);
-	
+
 	def Prefix="DDVFMV_"
 	ExceptionUtil exceptionUtil = new ExceptionUtil()
 	JsonUtils jsonUtil = new JsonUtils()
@@ -66,7 +66,7 @@
 		initProcessVariables(execution)
 
 		try {
-			
+
 				// Building Block-type request
 
 				// Set mso-request-id to request-id for VNF Adapter interface
@@ -75,7 +75,7 @@
 				execution.setVariable("requestId", requestId)
 				logger.debug("msoRequestId: " + requestId)
 				String tenantId = execution.getVariable("tenantId")
-				logger.debug("tenantId: " + tenantId)				
+				logger.debug("tenantId: " + tenantId)
 				String cloudSiteId = execution.getVariable("lcpCloudRegionId")
 				execution.setVariable("cloudSiteId", cloudSiteId)
 				logger.debug("cloudSiteId: " + cloudSiteId)
@@ -102,15 +102,15 @@
 				}
 				else {
 					execution.setVariable(Prefix + "serviceInstanceIdToSdnc", serviceInstanceId)
-				}				
+				}
 				
 				String sdncVersion = execution.getVariable("sdncVersion")
 				if (sdncVersion == null) {
 					sdncVersion = "1707"
 				}
 				execution.setVariable(Prefix + "sdncVersion", sdncVersion)
-				logger.debug("Incoming Sdnc Version is: " + sdncVersion)				
-				
+				logger.debug("Incoming Sdnc Version is: " + sdncVersion)
+
 				String sdncCallbackUrl = (String) UrnPropertiesReader.getVariable("mso.workflow.sdncadapter.callback",execution)
 				if (sdncCallbackUrl == null || sdncCallbackUrl.trim().isEmpty()) {
 					def msg = 'Required variable \'mso.workflow.sdncadapter.callback\' is missing'
@@ -122,8 +122,6 @@
 				logger.debug("SDNC Callback URL: " + sdncCallbackUrl)
 				logger.debug("SDNC Callback URL is: " + sdncCallbackUrl)
 
-			
-			
 		}catch(BpmnError b){
 			throw b
 		}catch(Exception e){
@@ -131,7 +129,7 @@
 			exceptionUtil.buildAndThrowWorkflowException(execution, 2000, "Internal Error encountered in PreProcess method!")
 		}
 	}
-	
+
 	public void queryAAIForVfModule(DelegateExecution execution) {
 		def method = getClass().getSimpleName() + '.queryAAIForVfModule(' +
 			'execution=' + execution.getId() +
@@ -154,8 +152,7 @@
 					execution.setVariable('DDVMFV_getVnfResponse', "Generic Vnf not found!")
 				}
 			} catch (Exception ex) {
-				ex.printStackTrace()
-				logger.debug('Exception occurred while executing AAI GET:' + ex.getMessage())
+				logger.debug('Exception occurred while executing AAI GET: {}', ex.getMessage(), ex)
 				execution.setVariable('DDVMFV_getVnfResponseCode', 500)
 				execution.setVariable('DDVFMV_getVnfResponse', 'AAI GET Failed:' + ex.getMessage())
 			}
@@ -169,7 +166,7 @@
 			exceptionUtil.buildAndThrowWorkflowException(execution, 1002, 'Error in queryAAIForVfModule(): ' + e.getMessage())
 		}
 	}
-	
+
 	/**
 	 * Validate the VF Module.  That is, confirm that a VF Module with the input VF Module ID
 	 * exists in the retrieved Generic VNF.  Then, check to make sure that if that VF Module
diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoDeleteVnfAndModules.groovy b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoDeleteVnfAndModules.groovy
index fb62bab..ca367d0 100644
--- a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoDeleteVnfAndModules.groovy
+++ b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoDeleteVnfAndModules.groovy
@@ -322,7 +322,7 @@
 							}
 							if (vfModuleBaseEntry != null) {
 								vfModulesList.add(vfModuleBaseEntry)
-							}					
+							}
 						}
 				}else{
 					execution.setVariable('DCVFM_queryAAIVfModuleResponseCode', 404)
@@ -331,8 +331,7 @@
 				}
 				execution.setVariable("DDVAM_vfModules", vfModulesList)
 			} catch (Exception ex) {
-				ex.printStackTrace()
-				logger.debug('Exception occurred while executing AAI GET:' + ex.getMessage())
+				logger.debug('Exception occurred while executing AAI GET: {}', ex.getMessage(), ex)
 				exceptionUtil.buildAndThrowWorkflowException(execution, 1002, 'AAI GET Failed:' + ex.getMessage())
 			}
 			logger.trace('Exited ' + method)
diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoUpdateVfModule.groovy b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoUpdateVfModule.groovy
index 013f66b..a05d252 100644
--- a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoUpdateVfModule.groovy
+++ b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoUpdateVfModule.groovy
@@ -1041,8 +1041,7 @@
 					}
 				}
 			} catch (Exception ex) {
-				ex.printStackTrace()
-				logger.debug('Exception occurred while executing AAI GET:' + ex.getMessage())
+				logger.debug('Exception occurred while executing AAI GET: {}', ex.getMessage(), ex)
 				exceptionUtil.buildAndThrowWorkflowException(execution, 1002, 'AAI GET Failed:' + ex.getMessage())
 			}
 			logger.trace('Exited ' + method)
@@ -1051,7 +1050,7 @@
 		} catch (Exception e) {
 			logger.error("{} {} {} {} {}", MessageEnum.BPMN_GENERAL_EXCEPTION_ARG.toString(),
 					'Caught exception in ' + method, "BPMN",
-					ErrorCode.UnknownError.getValue(), "Exception is:\n" + e);
+					ErrorCode.UnknownError.getValue(), "Exception is:\n" + e, e);
 			exceptionUtil.buildAndThrowWorkflowException(execution, 1002, 'Error in queryAAIVfModule(): ' + e.getMessage())
 		}
 	}
diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoUpdateVnfAndModules.groovy b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoUpdateVnfAndModules.groovy
index 3dd5e61..eb788a8 100644
--- a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoUpdateVnfAndModules.groovy
+++ b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoUpdateVnfAndModules.groovy
@@ -265,8 +265,7 @@
 				}
 				execution.setVariable("DUVAM_vfModules", vfModulesList)
 			} catch (Exception ex) {
-				ex.printStackTrace()
-				logger.debug('Exception occurred while executing AAI GET:' + ex.getMessage())
+				logger.debug('Exception occurred while executing AAI GET: {}', ex.getMessage(), ex)
 				exceptionUtil.buildAndThrowWorkflowException(execution, 1002, 'AAI GET Failed:' + ex.getMessage())
 			}
 			logger.trace('Exited ' + method)
diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/UpdateNetworkInstance.groovy b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/UpdateNetworkInstance.groovy
index 0b46a5a..b12da9f 100644
--- a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/UpdateNetworkInstance.groovy
+++ b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/UpdateNetworkInstance.groovy
@@ -362,7 +362,7 @@
 
 		} catch (Exception ex) {
 			String errorException = "  Bpmn error encountered in UpdateNetworkInstance flow. FalloutHandlerRequest,  buildErrorResponse() - "
-			logger.debug("Exception error in UpdateNetworkInstance flow,  buildErrorResponse(): " +  ex.getMessage())
+			logger.debug("Exception error in UpdateNetworkInstance flow,  buildErrorResponse(): {}", ex.getMessage(), ex)
 			falloutHandlerRequest =
 			"""<aetgt:FalloutHandlerRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
 					                             xmlns:ns="http://org.onap/so/request/types/v1"
diff --git a/common/pom.xml b/common/pom.xml
index 883d48c..2a9f88f 100644
--- a/common/pom.xml
+++ b/common/pom.xml
@@ -15,7 +15,7 @@
         <grpc.version>1.17.1</grpc.version>
         <protobuf.version>3.6.1</protobuf.version>
         <grpc.netty.version>4.1.30.Final</grpc.netty.version>
-        <ccsdk.version>0.4.1-SNAPSHOT</ccsdk.version>
+        <ccsdk.version>0.4.2-SNAPSHOT</ccsdk.version>
     </properties>
 
     <dependencies>
@@ -143,7 +143,7 @@
 
         <!-- CDS dependencies -->
         <dependency>
-            <groupId>org.onap.ccsdk.apps.components</groupId>
+            <groupId>org.onap.ccsdk.cds.components</groupId>
             <artifactId>proto-definition</artifactId>
             <version>${ccsdk.version}</version>
         </dependency>
diff --git a/common/src/main/java/org/onap/so/client/RestTemplateConfig.java b/common/src/main/java/org/onap/so/client/RestTemplateConfig.java
index 34ad6ef..0633ae7 100644
--- a/common/src/main/java/org/onap/so/client/RestTemplateConfig.java
+++ b/common/src/main/java/org/onap/so/client/RestTemplateConfig.java
@@ -26,6 +26,7 @@
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
 import org.springframework.http.client.BufferingClientHttpRequestFactory;
 import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
 import org.springframework.web.client.RestTemplate;
@@ -39,6 +40,7 @@
     private HttpComponentsClientConfiguration httpComponentsClientConfiguration;
 
     @Bean
+    @Primary
     public RestTemplate restTemplate() {
         final RestTemplate restTemplate = new RestTemplate();
         restTemplate
diff --git a/common/src/main/java/org/onap/so/client/cds/CDSProcessingClient.java b/common/src/main/java/org/onap/so/client/cds/CDSProcessingClient.java
index 756c26d..9b2fd3f 100644
--- a/common/src/main/java/org/onap/so/client/cds/CDSProcessingClient.java
+++ b/common/src/main/java/org/onap/so/client/cds/CDSProcessingClient.java
@@ -25,7 +25,7 @@
 import io.grpc.internal.PickFirstLoadBalancerProvider;
 import io.grpc.netty.NettyChannelBuilder;
 import java.util.concurrent.CountDownLatch;
-import org.onap.ccsdk.apps.controllerblueprints.processing.api.ExecutionServiceInput;
+import org.onap.ccsdk.cds.controllerblueprints.processing.api.ExecutionServiceInput;
 import org.onap.so.client.PreconditionFailedException;
 import org.onap.so.client.RestPropertiesLoader;
 import org.slf4j.Logger;
diff --git a/common/src/main/java/org/onap/so/client/cds/CDSProcessingHandler.java b/common/src/main/java/org/onap/so/client/cds/CDSProcessingHandler.java
index 1791be2..4b86493 100644
--- a/common/src/main/java/org/onap/so/client/cds/CDSProcessingHandler.java
+++ b/common/src/main/java/org/onap/so/client/cds/CDSProcessingHandler.java
@@ -23,11 +23,11 @@
 import io.grpc.ManagedChannel;
 import io.grpc.stub.StreamObserver;
 import java.util.concurrent.CountDownLatch;
-import org.onap.ccsdk.apps.controllerblueprints.common.api.ActionIdentifiers;
-import org.onap.ccsdk.apps.controllerblueprints.processing.api.BluePrintProcessingServiceGrpc;
-import org.onap.ccsdk.apps.controllerblueprints.processing.api.BluePrintProcessingServiceGrpc.BluePrintProcessingServiceStub;
-import org.onap.ccsdk.apps.controllerblueprints.processing.api.ExecutionServiceInput;
-import org.onap.ccsdk.apps.controllerblueprints.processing.api.ExecutionServiceOutput;
+import org.onap.ccsdk.cds.controllerblueprints.common.api.ActionIdentifiers;
+import org.onap.ccsdk.cds.controllerblueprints.processing.api.BluePrintProcessingServiceGrpc;
+import org.onap.ccsdk.cds.controllerblueprints.processing.api.BluePrintProcessingServiceGrpc.BluePrintProcessingServiceStub;
+import org.onap.ccsdk.cds.controllerblueprints.processing.api.ExecutionServiceInput;
+import org.onap.ccsdk.cds.controllerblueprints.processing.api.ExecutionServiceOutput;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/common/src/main/java/org/onap/so/client/cds/CDSProcessingListener.java b/common/src/main/java/org/onap/so/client/cds/CDSProcessingListener.java
index 8c92a58..ed7b4e5 100644
--- a/common/src/main/java/org/onap/so/client/cds/CDSProcessingListener.java
+++ b/common/src/main/java/org/onap/so/client/cds/CDSProcessingListener.java
@@ -20,7 +20,7 @@
 
 package org.onap.so.client.cds;
 
-import org.onap.ccsdk.apps.controllerblueprints.processing.api.ExecutionServiceOutput;
+import org.onap.ccsdk.cds.controllerblueprints.processing.api.ExecutionServiceOutput;
 
 public interface CDSProcessingListener {
 
diff --git a/common/src/test/java/org/onap/so/client/cds/CDSProcessingClientTest.java b/common/src/test/java/org/onap/so/client/cds/CDSProcessingClientTest.java
index 135277f..f6bf214 100644
--- a/common/src/test/java/org/onap/so/client/cds/CDSProcessingClientTest.java
+++ b/common/src/test/java/org/onap/so/client/cds/CDSProcessingClientTest.java
@@ -42,10 +42,10 @@
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 import org.mockito.Mock;
-import org.onap.ccsdk.apps.controllerblueprints.common.api.ActionIdentifiers;
-import org.onap.ccsdk.apps.controllerblueprints.processing.api.BluePrintProcessingServiceGrpc.BluePrintProcessingServiceImplBase;
-import org.onap.ccsdk.apps.controllerblueprints.processing.api.ExecutionServiceInput;
-import org.onap.ccsdk.apps.controllerblueprints.processing.api.ExecutionServiceOutput;
+import org.onap.ccsdk.cds.controllerblueprints.common.api.ActionIdentifiers;
+import org.onap.ccsdk.cds.controllerblueprints.processing.api.BluePrintProcessingServiceGrpc.BluePrintProcessingServiceImplBase;
+import org.onap.ccsdk.cds.controllerblueprints.processing.api.ExecutionServiceInput;
+import org.onap.ccsdk.cds.controllerblueprints.processing.api.ExecutionServiceOutput;
 
 @RunWith(JUnit4.class)
 public class CDSProcessingClientTest {
diff --git a/common/src/test/java/org/onap/so/client/cds/TestCDSProcessingListener.java b/common/src/test/java/org/onap/so/client/cds/TestCDSProcessingListener.java
index 977f1d4..ce515e1 100644
--- a/common/src/test/java/org/onap/so/client/cds/TestCDSProcessingListener.java
+++ b/common/src/test/java/org/onap/so/client/cds/TestCDSProcessingListener.java
@@ -21,7 +21,7 @@
 package org.onap.so.client.cds;
 
 import io.grpc.Status;
-import org.onap.ccsdk.apps.controllerblueprints.processing.api.ExecutionServiceOutput;
+import org.onap.ccsdk.cds.controllerblueprints.processing.api.ExecutionServiceOutput;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/common/src/test/java/org/onap/so/client/cds/TestCDSPropertiesImpl.java b/common/src/test/java/org/onap/so/client/cds/TestCDSPropertiesImpl.java
index b0e6709..636f928 100644
--- a/common/src/test/java/org/onap/so/client/cds/TestCDSPropertiesImpl.java
+++ b/common/src/test/java/org/onap/so/client/cds/TestCDSPropertiesImpl.java
@@ -15,7 +15,6 @@
  */
 package org.onap.so.client.cds;
 
-import java.net.MalformedURLException;
 import java.net.URL;
 
 public class TestCDSPropertiesImpl implements CDSProperties {
diff --git a/mso-catalog-db/src/main/java/org/onap/so/db/catalog/data/repository/PnfCustomizationRepository.java b/mso-catalog-db/src/main/java/org/onap/so/db/catalog/data/repository/PnfCustomizationRepository.java
index 8252b24..7527a79 100644
--- a/mso-catalog-db/src/main/java/org/onap/so/db/catalog/data/repository/PnfCustomizationRepository.java
+++ b/mso-catalog-db/src/main/java/org/onap/so/db/catalog/data/repository/PnfCustomizationRepository.java
@@ -21,11 +21,8 @@
 
 import org.onap.so.db.catalog.beans.PnfResourceCustomization;
 import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.rest.core.annotation.RepositoryRestResource;
 
-import java.util.List;
-
 @RepositoryRestResource(collectionResourceRel = "pnfResourceCustomization", path = "pnfResourceCustomization")
 public interface PnfCustomizationRepository extends JpaRepository<PnfResourceCustomization, String> {
 
diff --git a/mso-catalog-db/src/main/java/org/onap/so/db/catalog/data/repository/VnfCustomizationRepository.java b/mso-catalog-db/src/main/java/org/onap/so/db/catalog/data/repository/VnfCustomizationRepository.java
index 17ae017..525c628 100644
--- a/mso-catalog-db/src/main/java/org/onap/so/db/catalog/data/repository/VnfCustomizationRepository.java
+++ b/mso-catalog-db/src/main/java/org/onap/so/db/catalog/data/repository/VnfCustomizationRepository.java
@@ -7,9 +7,9 @@
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -21,7 +21,6 @@
 package org.onap.so.db.catalog.data.repository;
 
 import java.util.List;
-
 import org.onap.so.db.catalog.beans.VnfResourceCustomization;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.Query;
@@ -29,11 +28,13 @@
 
 @RepositoryRestResource(collectionResourceRel = "vnfResourceCustomization", path = "vnfResourceCustomization")
 public interface VnfCustomizationRepository extends JpaRepository<VnfResourceCustomization, String> {
-	List<VnfResourceCustomization> findByModelCustomizationUUID(String modelCustomizationUUID);
 
-	VnfResourceCustomization findOneByModelCustomizationUUID(String modelCustomizationUuid);
+    List<VnfResourceCustomization> findByModelCustomizationUUID(String modelCustomizationUUID);
 
-	@Query(value = "SELECT * FROM vnf_resource_customization WHERE MODEL_INSTANCE_NAME = ?1 AND VNF_RESOURCE_MODEL_UUID = ?2 LIMIT 1;", nativeQuery = true)
-	VnfResourceCustomization findByModelInstanceNameAndVnfResources(String modelInstanceName, String vnfResourceModelUUID);
+    VnfResourceCustomization findOneByModelCustomizationUUID(String modelCustomizationUuid);
+
+    @Query(value = "SELECT * FROM vnf_resource_customization WHERE MODEL_INSTANCE_NAME = ?1 AND VNF_RESOURCE_MODEL_UUID = ?2 LIMIT 1;", nativeQuery = true)
+    VnfResourceCustomization findByModelInstanceNameAndVnfResources(String modelInstanceName,
+        String vnfResourceModelUUID);
 
 }
\ No newline at end of file
diff --git a/mso-catalog-db/src/test/java/org/onap/so/db/catalog/data/repository/PnfCustomizationRepositoryTest.java b/mso-catalog-db/src/test/java/org/onap/so/db/catalog/data/repository/PnfCustomizationRepositoryTest.java
index c5e95fc..7ac80e2 100644
--- a/mso-catalog-db/src/test/java/org/onap/so/db/catalog/data/repository/PnfCustomizationRepositoryTest.java
+++ b/mso-catalog-db/src/test/java/org/onap/so/db/catalog/data/repository/PnfCustomizationRepositoryTest.java
@@ -20,7 +20,6 @@
 package org.onap.so.db.catalog.data.repository;
 
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 
 import org.junit.Test;
@@ -29,9 +28,6 @@
 import org.onap.so.db.catalog.beans.PnfResourceCustomization;
 import org.onap.so.db.catalog.exceptions.NoEntityFoundException;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.util.CollectionUtils;
-
-import java.util.List;
 
 public class PnfCustomizationRepositoryTest extends BaseTest {
 
diff --git a/mso-catalog-db/src/test/java/org/onap/so/db/catalog/data/repository/VnfCustomizationRepositoryTest.java b/mso-catalog-db/src/test/java/org/onap/so/db/catalog/data/repository/VnfCustomizationRepositoryTest.java
index 8e2e1e0..be21ea9 100644
--- a/mso-catalog-db/src/test/java/org/onap/so/db/catalog/data/repository/VnfCustomizationRepositoryTest.java
+++ b/mso-catalog-db/src/test/java/org/onap/so/db/catalog/data/repository/VnfCustomizationRepositoryTest.java
@@ -23,6 +23,7 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 
+import java.util.List;
 import org.junit.Test;
 import org.onap.so.db.catalog.BaseTest;
 import org.onap.so.db.catalog.beans.VnfResource;
@@ -30,8 +31,6 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.util.CollectionUtils;
 
-import java.util.List;
-
 
 public class VnfCustomizationRepositoryTest extends BaseTest {
 
diff --git a/mso-catalog-db/src/test/resources/schema.sql b/mso-catalog-db/src/test/resources/schema.sql
index d53d892..7068ef9 100644
--- a/mso-catalog-db/src/test/resources/schema.sql
+++ b/mso-catalog-db/src/test/resources/schema.sql
@@ -956,7 +956,7 @@
 ) ENGINE = INNODB AUTO_INCREMENT = 20654 DEFAULT CHARACTER SET = LATIN1;
 
 CREATE TABLE IF NOT EXISTS `pnf_resource` (
-  `ORCHESTRATION_MODE` varchar(20) NOT NULL DEFAULT 'HEAT',
+  `ORCHESTRATION_MODE` varchar(20) DEFAULT NULL,
   `DESCRIPTION` varchar(1200) DEFAULT NULL,
   `CREATION_TIMESTAMP` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
   `MODEL_UUID` varchar(200) NOT NULL,
diff --git a/packages/docker/src/main/docker/docker-files/Dockerfile.so-base-image b/packages/docker/src/main/docker/docker-files/Dockerfile.so-base-image
index de446b7..cf50868 100644
--- a/packages/docker/src/main/docker/docker-files/Dockerfile.so-base-image
+++ b/packages/docker/src/main/docker/docker-files/Dockerfile.so-base-image
@@ -11,7 +11,7 @@
 RUN apk update && apk upgrade
 
 # Install commonly needed tools
-RUN apk --no-cache add curl netcat-openbsd sudo
+RUN apk --no-cache add curl netcat-openbsd sudo nss
 
 # Create 'so' user
 RUN addgroup -g 1000 so && adduser -S -u 1000 -G so -s /bin/sh so