Merge "Sonar fixes Reduce selectExecutionList method"
diff --git a/INFO.yaml b/INFO.yaml
index 7e1f91f..470e0d2 100644
--- a/INFO.yaml
+++ b/INFO.yaml
@@ -26,7 +26,7 @@
       server: 'n/a'
       channel: 'n/a'
       repeats: 'weekly'
-      time: '14:00 UTC'
+      time: '13:30 UTC'
 repositories:
     - so
     - so-chef-repo
@@ -45,41 +45,16 @@
       company: 'Ericsson'
       id: 'byungwoojun'
       timezone: 'America/New_York'
-    - name: 'DeWayne Filppi'
-      email: 'dewayne@cloudify.co'
-      company: 'Cloudify'
-      id: 'dfilppi'
-      timezone: 'America/Los_Angeles'
     - name: 'Max Benjamin'
       email: 'max.benjamin@att.com'
       company: 'ATT'
       id: 'mfour'
       timezone: 'America/New_York'
-    - name: 'Yan Yang'
-      email: 'yangyanyj@chinamobile.com'
-      company: 'China Mobile'
-      id: 'yangyan'
-      timezone: 'Asia/Shanghai'
-    - name: 'Marcus Williams'
-      email: 'marcus.williams@intel.com'
-      company: 'Intel'
-      id: 'mgkwill'
-      timezone: 'America/Los_Angeles'
-    - name: 'Sanchita Pathak'
-      email: 'sanchita@techmahindra.com'
-      company: 'Tech Mahindra'
-      id: 'sanchitap'
-      timezone: 'Asia/Kolkata'
     - name: 'Steve Smokowski'
       email: 'ss835w@att.com'
       company: 'ATT'
       id: 'stevesmokowski'
       timezone: 'America/New_York'
-    - name: 'Subhash Kumar Singh'
-      email: 'Subhash.Kumar.Singh@huawei.com'
-      company: 'Huawei'
-      id: 'subhash_singh'
-      timezone: 'Asia/Kolkata'
     - name: 'Lukasz Muszkieta'
       email: 'lukasz.muszkieta@nokia.com'
       company: 'Nokia'
@@ -115,4 +90,9 @@
         - type: 'addition'
           name: 'Max Benjamin'
           link: 'https://lists.onap.org/g/onap-tsc/message/4981?p=,,,20,0,0,0::Created,,committer,20,2,0,31638681'
-
+        - type: 'removal'
+          name: 'DeWayne Filppi'
+          name: 'Yan Yang'
+          name: 'Marcus Williams'
+          name: 'Sanchita Pathak'
+          name: 'Subhash Kumar Singh'
diff --git a/adapters/etsi-sol003-adapter/pom.xml b/adapters/etsi-sol003-adapter/pom.xml
index fe34ff4..9ea25a5 100644
--- a/adapters/etsi-sol003-adapter/pom.xml
+++ b/adapters/etsi-sol003-adapter/pom.xml
@@ -16,7 +16,7 @@
     <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
     <version-swagger-codegen>2.3.1</version-swagger-codegen>
     <gson-fire-version>1.8.2</gson-fire-version>
-    <retrofit-version>2.3.0</retrofit-version>
+    <retrofit-version>2.7.2</retrofit-version>
     <threetenbp-version>1.3.5</threetenbp-version>
     <oltu-version>1.0.1</oltu-version>
     <swagger-core-version>1.5.21</swagger-core-version>
diff --git a/adapters/mso-catalog-db-adapter/src/main/java/org/onap/so/adapters/catalogdb/rest/CatalogDbAdapterRest.java b/adapters/mso-catalog-db-adapter/src/main/java/org/onap/so/adapters/catalogdb/rest/CatalogDbAdapterRest.java
index f283af1..aa039c6 100644
--- a/adapters/mso-catalog-db-adapter/src/main/java/org/onap/so/adapters/catalogdb/rest/CatalogDbAdapterRest.java
+++ b/adapters/mso-catalog-db-adapter/src/main/java/org/onap/so/adapters/catalogdb/rest/CatalogDbAdapterRest.java
@@ -655,4 +655,36 @@
         return Response.status(HttpStatus.SC_NOT_FOUND).header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
                 .build();
     }
+
+    @GET
+    @Path("processingFlags")
+    @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
+    @Transactional(readOnly = true)
+    public Response getAllProcessingFlags() {
+        return getAllProcessingFlagsImpl();
+    }
+
+    public Response getAllProcessingFlagsImpl() {
+        List<ProcessingFlags> processingFlags = null;
+
+        int respStatus = HttpStatus.SC_OK;
+        try {
+            processingFlags = processingFlagsRepo.findAll();
+            if (processingFlags == null) {
+                logger.debug("ProcessingFlags not found");
+                respStatus = HttpStatus.SC_NOT_FOUND;
+            } else {
+
+                logger.debug("ProcessingFlags processingFlags = {}", processingFlags.toString());
+            }
+            return Response.status(respStatus).entity(processingFlags)
+                    .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON).build();
+        } catch (Exception e) {
+            logger.error("Exception - queryProcesssingFlags", e);
+            CatalogQueryException excResp = new CatalogQueryException(e.getMessage(),
+                    CatalogQueryExceptionCategory.INTERNAL, Boolean.FALSE, null);
+            return Response.status(HttpStatus.SC_INTERNAL_SERVER_ERROR)
+                    .entity(new GenericEntity<CatalogQueryException>(excResp) {}).build();
+        }
+    }
 }
diff --git a/adapters/mso-catalog-db-adapter/src/main/resources/db/migration/R__MacroData.sql b/adapters/mso-catalog-db-adapter/src/main/resources/db/migration/R__MacroData.sql
index a5e546e..91a0dbd 100644
--- a/adapters/mso-catalog-db-adapter/src/main/resources/db/migration/R__MacroData.sql
+++ b/adapters/mso-catalog-db-adapter/src/main/resources/db/migration/R__MacroData.sql
@@ -84,16 +84,17 @@
 ('Service-Macro-Delete', '3', 'DeactivateVolumeGroupBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Delete' and CLOUD_OWNER = 'DEFAULT')),
 ('Service-Macro-Delete', '4', 'DeleteVolumeGroupBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Delete' and CLOUD_OWNER = 'DEFAULT')),
 ('Service-Macro-Delete', '5', 'DeactivateVnfBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Delete' and CLOUD_OWNER = 'DEFAULT')),
-('Service-Macro-Delete', '6', 'DeactivateNetworkBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Delete' and CLOUD_OWNER = 'DEFAULT')),
-('Service-Macro-Delete', '7', 'DeleteNetworkBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Delete' and CLOUD_OWNER = 'DEFAULT')),
-('Service-Macro-Delete', '8', 'DeactivateNetworkCollectionBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Delete' and CLOUD_OWNER = 'DEFAULT')),
-('Service-Macro-Delete', '9', 'DeleteNetworkCollectionBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Delete' and CLOUD_OWNER = 'DEFAULT')),
-('Service-Macro-Delete', '10', 'DeactivateServiceInstanceBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Delete' and CLOUD_OWNER = 'DEFAULT')),
-('Service-Macro-Delete', '11', 'UnassignVfModuleBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Delete' and CLOUD_OWNER = 'DEFAULT')),
-('Service-Macro-Delete', '12', 'UnassignVolumeGroupBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Delete' and CLOUD_OWNER = 'DEFAULT')),
-('Service-Macro-Delete', '13', 'UnassignVnfBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Delete' and CLOUD_OWNER = 'DEFAULT')),
-('Service-Macro-Delete', '14', 'UnassignNetworkBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Delete' and CLOUD_OWNER = 'DEFAULT')),
-('Service-Macro-Delete', '15', 'UnassignServiceInstanceBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Delete' and CLOUD_OWNER = 'DEFAULT')),
+('Service-Macro-Delete', '6', 'DeactivatePnfBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Delete' and CLOUD_OWNER = 'DEFAULT')),
+('Service-Macro-Delete', '7', 'DeactivateNetworkBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Delete' and CLOUD_OWNER = 'DEFAULT')),
+('Service-Macro-Delete', '8', 'DeleteNetworkBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Delete' and CLOUD_OWNER = 'DEFAULT')),
+('Service-Macro-Delete', '9', 'DeactivateNetworkCollectionBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Delete' and CLOUD_OWNER = 'DEFAULT')),
+('Service-Macro-Delete', '10', 'DeleteNetworkCollectionBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Delete' and CLOUD_OWNER = 'DEFAULT')),
+('Service-Macro-Delete', '11', 'DeactivateServiceInstanceBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Delete' and CLOUD_OWNER = 'DEFAULT')),
+('Service-Macro-Delete', '12', 'UnassignVfModuleBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Delete' and CLOUD_OWNER = 'DEFAULT')),
+('Service-Macro-Delete', '13', 'UnassignVolumeGroupBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Delete' and CLOUD_OWNER = 'DEFAULT')),
+('Service-Macro-Delete', '14', 'UnassignVnfBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Delete' and CLOUD_OWNER = 'DEFAULT')),
+('Service-Macro-Delete', '15', 'UnassignNetworkBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Delete' and CLOUD_OWNER = 'DEFAULT')),
+('Service-Macro-Delete', '16', 'UnassignServiceInstanceBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Service-Macro-Delete' and CLOUD_OWNER = 'DEFAULT')),
 ('Network-Create', '1', 'AssignNetworkBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Network-Create' and CLOUD_OWNER = 'DEFAULT')),
 ('Network-Create', '2', 'CreateNetworkBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Network-Create' and CLOUD_OWNER = 'DEFAULT')),
 ('Network-Create', '3', 'ActivateNetworkBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Network-Create' and CLOUD_OWNER = 'DEFAULT')),
@@ -280,6 +281,7 @@
 ('DeactivateVolumeGroupBB', 'VOLUME_GROUP', 'DEACTIVATE'),
 ('DeactivateVfModuleBB', 'VF_MODULE', 'DEACTIVATE'),
 ('DeactivateNetworkBB', 'NETWORK', 'DEACTIVATE'),
+('DeactivatePnfBB', 'NO_VALIDATE', 'DEACTIVATE'),
 
 
 ('ChangeModelServiceInstanceBB', 'SERVICE', 'CHANGEMODEL'),
@@ -929,3 +931,13 @@
 ('VNFConfigModifyActivity','*','*','*','*','Manual','Abort','*', '*'),
 ('VNFUnsetInMaintFlagActivity','*','*','*','*','Manual','Abort','*', '*'),
 ('VNFUnsetClosedLoopDisabledActivity','*','*','*','*','Manual','Abort','*', '*');
+
+UPDATE orchestration_flow_reference set FLOW_NAME='ControllerExecutionBB', SCOPE='vnf', ACTION='config-assign' WHERE COMPOSITE_ACTION = 'Service-Macro-Create' and FLOW_NAME = 'ConfigAssignVnfBB';
+UPDATE orchestration_flow_reference set FLOW_NAME='ControllerExecutionBB', SCOPE='vnf', ACTION='config-deploy' WHERE COMPOSITE_ACTION = 'Service-Macro-Create' and FLOW_NAME = 'ConfigDeployVnfBB';
+UPDATE orchestration_flow_reference set FLOW_NAME='ControllerExecutionBB', SCOPE='vnf', ACTION='HealthCheck' WHERE COMPOSITE_ACTION = 'VFModule-ScaleOut' and FLOW_NAME = 'GenericVnfHealthCheckBB';
+UPDATE orchestration_flow_reference set FLOW_NAME='ControllerExecutionBB', SCOPE='vfmodule', ACTION='ScaleOutReconfiguration' WHERE COMPOSITE_ACTION = 'VFModule-ScaleOut' and FLOW_NAME = 'GenericVnfHealthCheckBB';
+
+INSERT INTO orchestration_flow_reference(COMPOSITE_ACTION, SEQ_NO, FLOW_NAME, FLOW_VERSION, NB_REQ_REF_LOOKUP_ID, SCOPE, ACTION) VALUES
+('VFModule-Delete', '1', 'ControllerExecutionBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'VFModule-Delete' and CLOUD_OWNER = 'DEFAULT'), "vnf", "HealthCheck"),
+('VFModule-Delete', '2', 'ControllerExecutionBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'VFModule-Delete' and CLOUD_OWNER = 'DEFAULT'), "vfmodule", "ScaleInReconfiguration"),
+('VFModule-Delete', '6', 'ControllerExecutionBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'VFModule-Delete' and CLOUD_OWNER = 'DEFAULT'), "vnf", "HealthCheck");
\ No newline at end of file
diff --git a/adapters/mso-catalog-db-adapter/src/test/java/org/onap/so/adapters/catalogdb/catalogrest/CatalogDBRestTest.java b/adapters/mso-catalog-db-adapter/src/test/java/org/onap/so/adapters/catalogdb/catalogrest/CatalogDBRestTest.java
index 04161e9..3906229 100644
--- a/adapters/mso-catalog-db-adapter/src/test/java/org/onap/so/adapters/catalogdb/catalogrest/CatalogDBRestTest.java
+++ b/adapters/mso-catalog-db-adapter/src/test/java/org/onap/so/adapters/catalogdb/catalogrest/CatalogDBRestTest.java
@@ -21,7 +21,9 @@
 package org.onap.so.adapters.catalogdb.catalogrest;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 import java.io.IOException;
+import java.util.List;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 import org.json.JSONException;
@@ -37,6 +39,7 @@
 import org.springframework.http.HttpMethod;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.util.UriComponentsBuilder;
+import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
 
 
@@ -831,6 +834,34 @@
     }
 
     @Test
+    public void testGetAllProcessingFlags() throws Exception {
+        HttpEntity<String> entity = new HttpEntity<String>(null, headers);
+        headers.set("Accept", MediaType.APPLICATION_JSON);
+
+        UriComponentsBuilder builder =
+                UriComponentsBuilder.fromHttpUrl(createURLWithPort(ECOMP_MSO_CATALOG_PROCESSING_FLAGS));
+
+        ResponseEntity<String> response =
+                restTemplate.exchange(builder.toUriString(), HttpMethod.GET, entity, String.class);
+
+        assertEquals(Response.Status.OK.getStatusCode(), response.getStatusCode().value());
+        ObjectMapper mapper = new ObjectMapper();
+
+        List<ProcessingFlags> processingFlagsResponse =
+                mapper.readValue(response.getBody(), new TypeReference<List<ProcessingFlags>>() {});
+
+        boolean testFlagFound = false;
+        for (int i = 0; i < processingFlagsResponse.size(); i++) {
+            if (processingFlagsResponse.get(i).getFlag().equals("TESTFLAG")) {
+                assertEquals(processingFlagsResponse.get(i).getEndpoint(), "TESTENDPOINT");
+                assertEquals(processingFlagsResponse.get(i).getDescription(), "TEST FLAG");
+                testFlagFound = true;
+            }
+        }
+        assertTrue(testFlagFound);
+    }
+
+    @Test
     public void testSetProcessingFlagsFlagValue() throws JSONException {
         ProcessingFlags updatedProcessingFlag = new ProcessingFlags();
         updatedProcessingFlag.setFlag("TESTFLAG");
diff --git a/adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/tasks/inventory/CreateAAIInventory.java b/adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/tasks/inventory/CreateAAIInventory.java
index df4229c..12751f8 100644
--- a/adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/tasks/inventory/CreateAAIInventory.java
+++ b/adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/tasks/inventory/CreateAAIInventory.java
@@ -35,6 +35,7 @@
 import org.openstack4j.model.compute.Image;
 import org.openstack4j.model.compute.Server;
 import org.openstack4j.model.heat.Resource;
+import org.openstack4j.model.network.Network;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -72,6 +73,10 @@
             List<Resource> stackResources =
                     heatBridgeClient.queryNestedHeatStackResources(cloudInformation.getTemplateInstanceId());
 
+            List<Network> osNetworks = heatBridgeClient.getAllOpenstackProviderNetworks(stackResources);
+            heatBridgeClient.buildAddNetworksToAaiAction(cloudInformation.getVnfId(), cloudInformation.getVfModuleId(),
+                    osNetworks);
+
             List<Server> osServers = heatBridgeClient.getAllOpenstackServers(stackResources);
 
             heatBridgeClient.createPserversAndPinterfacesIfNotPresentInAai(stackResources);
diff --git a/adapters/mso-openstack-adapters/src/main/java/org/onap/so/heatbridge/HeatBridgeApi.java b/adapters/mso-openstack-adapters/src/main/java/org/onap/so/heatbridge/HeatBridgeApi.java
index 9c09886..a4e6ccc 100644
--- a/adapters/mso-openstack-adapters/src/main/java/org/onap/so/heatbridge/HeatBridgeApi.java
+++ b/adapters/mso-openstack-adapters/src/main/java/org/onap/so/heatbridge/HeatBridgeApi.java
@@ -38,6 +38,7 @@
 import org.openstack4j.model.compute.Image;
 import org.openstack4j.model.compute.Server;
 import org.openstack4j.model.heat.Resource;
+import org.openstack4j.model.network.Network;
 
 /**
  * Defines the contract to extract Heat Stack Resources from Openstack and inventory it to AAI. This API is used only to
@@ -88,6 +89,14 @@
     List<Server> getAllOpenstackServers(List<Resource> stackResources);
 
     /**
+     * Query the Openstack provider network objects from the list of stack resources
+     *
+     * @param stackResources A list of stack based resources
+     * @return A list of Openstack Network objects
+     */
+    List<Network> getAllOpenstackProviderNetworks(final List<Resource> stackResources);
+
+    /**
      * Extract Openstack Image objects from a a list of Server objects
      *
      * @param servers A list of Openstack Server objects
@@ -104,6 +113,15 @@
     List<Flavor> extractOpenstackFlavorsFromServers(List<Server> servers);
 
     /**
+     * Query and build AAI actions for Openstack Compute resources to AAI's l3-network objects with its subnets
+     *
+     * @param genericVnfId AAI generic-vnf-id
+     * @param vfModuleId AAI vf-module-id
+     * @param networks Openstack Network list
+     */
+    void buildAddNetworksToAaiAction(final String genericVnfId, final String vfModuleId, List<Network> networks);
+
+    /**
      * Query and build AAI actions for Openstack Image resources to AAI's image objects
      *
      * @param images List of Openstack Image objects
diff --git a/adapters/mso-openstack-adapters/src/main/java/org/onap/so/heatbridge/HeatBridgeImpl.java b/adapters/mso-openstack-adapters/src/main/java/org/onap/so/heatbridge/HeatBridgeImpl.java
index fae3539..9295800 100644
--- a/adapters/mso-openstack-adapters/src/main/java/org/onap/so/heatbridge/HeatBridgeImpl.java
+++ b/adapters/mso-openstack-adapters/src/main/java/org/onap/so/heatbridge/HeatBridgeImpl.java
@@ -49,11 +49,15 @@
 import org.onap.aai.domain.yang.Flavor;
 import org.onap.aai.domain.yang.Image;
 import org.onap.aai.domain.yang.L3InterfaceIpv4AddressList;
+import org.onap.aai.domain.yang.L3Network;
 import org.onap.aai.domain.yang.LInterface;
 import org.onap.aai.domain.yang.PInterface;
 import org.onap.aai.domain.yang.Pserver;
+import org.onap.aai.domain.yang.Relationship;
+import org.onap.aai.domain.yang.RelationshipList;
 import org.onap.aai.domain.yang.SriovPf;
 import org.onap.aai.domain.yang.SriovPfs;
+import org.onap.aai.domain.yang.Subnets;
 import org.onap.aai.domain.yang.SriovVf;
 import org.onap.aai.domain.yang.SriovVfs;
 import org.onap.aai.domain.yang.VfModule;
@@ -198,6 +202,16 @@
     }
 
     @Override
+    public List<Network> getAllOpenstackProviderNetworks(final List<Resource> stackResources) {
+        Objects.requireNonNull(osClient, ERR_MSG_NULL_OS_CLIENT);
+        // Filter Openstack Compute resources
+        List<String> providerNetworkIds =
+                extractStackResourceIdsByResourceType(stackResources, HeatBridgeConstants.OS_NEUTRON_PROVIDERNET);
+        return providerNetworkIds.stream().map(providerNetworkId -> osClient.getNetworkById(providerNetworkId))
+                .collect(Collectors.toList());
+    }
+
+    @Override
     public List<org.openstack4j.model.compute.Image> extractOpenstackImagesFromServers(final List<Server> servers) {
         Objects.requireNonNull(osClient, ERR_MSG_NULL_OS_CLIENT);
         return servers.stream().map(Server::getImage)
@@ -211,6 +225,27 @@
                 .filter(distinctByProperty(org.openstack4j.model.compute.Flavor::getId)).collect(Collectors.toList());
     }
 
+    public void buildAddNetworksToAaiAction(final String genericVnfId, final String vfModuleId,
+            List<Network> networks) {
+        networks.forEach(network -> {
+            L3Network l3Network = aaiHelper.buildNetwork(network);
+            if (l3Network != null) {
+                l3Network.setSubnets(buildSunets(network));
+
+                RelationshipList relationshipList = new RelationshipList();
+                List<Relationship> relationships = relationshipList.getRelationship();
+
+                relationships.add(aaiHelper.getRelationshipToVfModule(genericVnfId, vfModuleId));
+                relationships.add(aaiHelper.getRelationshipToTenant(cloudOwner, cloudRegionId, tenantId));
+
+                l3Network.setRelationshipList(relationshipList);
+                transaction.createIfNotExists(
+                        AAIUriFactory.createResourceUri(AAIObjectType.L3_NETWORK, l3Network.getNetworkId()),
+                        Optional.of(l3Network));
+            }
+        });
+    }
+
     @Override
     public void buildAddImagesToAaiAction(final List<org.openstack4j.model.compute.Image> images)
             throws HeatBridgeException {
@@ -338,6 +373,20 @@
         return pserverMap;
     }
 
+    private Subnets buildSunets(Network network) {
+        Subnets aaiSubnets = new Subnets();
+        List<String> subnetIds = network.getSubnets();
+
+        subnetIds.forEach(subnetId -> {
+            Subnet subnet = osClient.getSubnetById(subnetId);
+            org.onap.aai.domain.yang.Subnet aaiSubnet = aaiHelper.buildSubnet(subnet);
+            if (aaiSubnet != null) {
+                aaiSubnets.getSubnet().add(aaiSubnet);
+            }
+        });
+        return aaiSubnets;
+    }
+
     private void createPServerIfNotExists(Map<String, Pserver> serverHostnames) {
         for (Pserver pserver : serverHostnames.values()) {
             AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.PSERVER, pserver.getHostname());
@@ -494,9 +543,9 @@
         Objects.requireNonNull(vnfId, "Null vnf-id!");
         Objects.requireNonNull(vfModuleId, "Null vf-module-id!");
         try {
-            Optional<VfModule> vfModule = resourcesClient.get(
-                    AAIUriFactory.createResourceUri(AAIObjectType.VF_MODULE, vnfId, vfModuleId, NotFoundException.class)
-                            .depth(Depth.ONE))
+            Optional<VfModule> vfModule = resourcesClient
+                    .get(AAIUriFactory.createResourceUri(AAIObjectType.VF_MODULE, vnfId, vfModuleId).depth(Depth.ONE),
+                            NotFoundException.class)
                     .asBean(VfModule.class);
 
             AAIResultWrapper resultWrapper = new AAIResultWrapper(vfModule.get());
@@ -570,9 +619,10 @@
                 Vserver vserver = vserverWrapper.asBean(Vserver.class).get();
                 List<String> pciIds = HeatBridgeUtils.extractPciIdsFromVServer(vserver);
                 if (CollectionUtils.isNotEmpty(pciIds)) {
-                    List<String> matchingPservers = vserverRelationships.get().getRelatedLinks(AAIObjectType.PSERVER);
+                    List<AAIResourceUri> matchingPservers =
+                            vserverRelationships.get().getRelatedUris(AAIObjectType.PSERVER);
                     if (matchingPservers != null && matchingPservers.size() == 1) {
-                        pserverToPciIdMap.put(matchingPservers.get(0), pciIds);
+                        pserverToPciIdMap.put(matchingPservers.get(0).getURIKeys().get("hostname"), pciIds);
                     }
                 }
             }
diff --git a/adapters/mso-openstack-adapters/src/main/java/org/onap/so/heatbridge/constants/HeatBridgeConstants.java b/adapters/mso-openstack-adapters/src/main/java/org/onap/so/heatbridge/constants/HeatBridgeConstants.java
index fdf7ce3..71c6a96 100644
--- a/adapters/mso-openstack-adapters/src/main/java/org/onap/so/heatbridge/constants/HeatBridgeConstants.java
+++ b/adapters/mso-openstack-adapters/src/main/java/org/onap/so/heatbridge/constants/HeatBridgeConstants.java
@@ -40,6 +40,7 @@
     public static final Integer OS_DEFAULT_HEAT_NESTING = 5;
     public static final String OS_SERVER_RESOURCE_TYPE = "OS::Nova::Server";
     public static final String OS_PORT_RESOURCE_TYPE = "OS::Neutron::Port";
+    public static final String OS_NEUTRON_PROVIDERNET = "OS::Neutron::ProviderNet";
     public static final String OS_SRIOV_PORT_TYPE = "direct";
     public static final String OS_PCI_SLOT_KEY = "pci_slot";
     public static final String OS_PHYSICAL_NETWORK_KEY = "physical_network";
@@ -64,6 +65,8 @@
     public static final String AAI_VF_MODULE_ID = "vf-module.vf-module-id";
     public static final String AAI_IMAGE = "image";
     public static final String AAI_IMAGE_ID = "image.image-id";
+    public static final String AAI_TENANT = "tenant";
+    public static final String AAI_TENANT_ID = "tenant.tenant-id";
     public static final String AAI_CLOUD_OWNER = "cloud-region.cloud-owner";
     public static final String AAI_CLOUD_REGION_ID = "cloud-region.cloud-region-id";
     public static final String AAI_FLAVOR = "flavor";
diff --git a/adapters/mso-openstack-adapters/src/main/java/org/onap/so/heatbridge/helpers/AaiHelper.java b/adapters/mso-openstack-adapters/src/main/java/org/onap/so/heatbridge/helpers/AaiHelper.java
index c4d9cbe..7d4e92d 100644
--- a/adapters/mso-openstack-adapters/src/main/java/org/onap/so/heatbridge/helpers/AaiHelper.java
+++ b/adapters/mso-openstack-adapters/src/main/java/org/onap/so/heatbridge/helpers/AaiHelper.java
@@ -42,6 +42,7 @@
 import org.apache.commons.lang3.StringUtils;
 import org.onap.aai.domain.yang.Flavor;
 import org.onap.aai.domain.yang.Image;
+import org.onap.aai.domain.yang.L3Network;
 import org.onap.aai.domain.yang.PInterface;
 import org.onap.aai.domain.yang.Pserver;
 import org.onap.aai.domain.yang.Relationship;
@@ -54,7 +55,9 @@
 import org.onap.aaiclient.client.aai.entities.uri.AAIUriFactory;
 import org.onap.so.heatbridge.constants.HeatBridgeConstants;
 import org.openstack4j.model.compute.Server;
+import org.openstack4j.model.network.Network;
 import org.openstack4j.model.network.Port;
+import org.openstack4j.model.network.Subnet;
 import com.google.common.base.Preconditions;
 
 /**
@@ -131,6 +134,49 @@
         return relationshipList;
     }
 
+    public Relationship getRelationshipToVfModule(String vnfId, String vfModuleId) {
+        return buildRelationship(AAIUriFactory.createResourceUri(AAIObjectType.VF_MODULE, vnfId, vfModuleId));
+    }
+
+    public Relationship getRelationshipToTenant(String cloudOwner, String cloudRegionId, String tenantId) {
+        return buildRelationship(
+                AAIUriFactory.createResourceUri(AAIObjectType.TENANT, cloudOwner, cloudRegionId, tenantId));
+    }
+
+    public org.onap.aai.domain.yang.Subnet buildSubnet(Subnet subnet) {
+        org.onap.aai.domain.yang.Subnet aaiSubnet = new org.onap.aai.domain.yang.Subnet();
+        aaiSubnet.setSubnetId(subnet.getId());
+        aaiSubnet.setDhcpEnabled(subnet.isDHCPEnabled());
+
+        aaiSubnet.setSubnetName(subnet.getName());
+        aaiSubnet.setGatewayAddress(subnet.getGateway());
+        aaiSubnet.setCidrMask(subnet.getCidr());
+        aaiSubnet.setIpVersion(subnet.getIpVersion().name());
+        return aaiSubnet;
+    }
+
+    public L3Network buildNetwork(Network network) {
+        if (network.getId() == null) {
+            return null;
+        }
+        L3Network l3Network = new L3Network();
+        l3Network.setNetworkId(network.getId());
+        l3Network.setIsBoundToVpn(true);
+        l3Network.setIsProviderNetwork(true);
+
+        // optional fields
+        l3Network.setIsSharedNetwork(network.isShared());
+        l3Network.setIsExternalNetwork(network.isRouterExternal());
+        l3Network.setOperationalStatus(String.valueOf(network.isAdminStateUp()));
+        if (network.getName() != null) {
+            l3Network.setNetworkName(network.getName());
+        }
+        if (network.getProviderPhyNet() != null) {
+            l3Network.setPhysicalNetworkName(network.getProviderPhyNet());
+        }
+        return l3Network;
+    }
+
     /**
      * Transform Openstack Server object to AAI Vserver object
      *
diff --git a/adapters/mso-openstack-adapters/src/test/java/org/onap/so/heatbridge/HeatBridgeImplTest.java b/adapters/mso-openstack-adapters/src/test/java/org/onap/so/heatbridge/HeatBridgeImplTest.java
index 643dd4c..8c21e3f 100644
--- a/adapters/mso-openstack-adapters/src/test/java/org/onap/so/heatbridge/HeatBridgeImplTest.java
+++ b/adapters/mso-openstack-adapters/src/test/java/org/onap/so/heatbridge/HeatBridgeImplTest.java
@@ -85,9 +85,11 @@
 import org.openstack4j.model.compute.Server.Status;
 import org.openstack4j.model.heat.Resource;
 import org.openstack4j.model.network.IP;
+import org.openstack4j.model.network.IPVersionType;
 import org.openstack4j.model.network.Network;
 import org.openstack4j.model.network.NetworkType;
 import org.openstack4j.model.network.Port;
+import org.openstack4j.model.network.Subnet;
 import org.openstack4j.openstack.heat.domain.HeatResource;
 import org.openstack4j.openstack.heat.domain.HeatResource.Resources;
 import org.springframework.core.env.Environment;
@@ -450,6 +452,70 @@
     }
 
     @Test
+    public void testUpdateNetworksToAai() throws HeatBridgeException {
+
+        Subnet subnet1 = mock(Subnet.class);
+        when(subnet1.getId()).thenReturn("test-subnet1-id");
+        when(subnet1.getName()).thenReturn("test-subnet1-name");
+        when(subnet1.isDHCPEnabled()).thenReturn(true);
+        when(subnet1.getGateway()).thenReturn("test-subnet1-gateway");
+        when(subnet1.getCidr()).thenReturn("test-subnet1-gateway");
+        when(subnet1.getIpVersion()).thenReturn(IPVersionType.V4);
+
+        Subnet subnet2 = mock(Subnet.class);
+        when(subnet2.getId()).thenReturn("test-subnet2-id");
+        when(subnet2.getName()).thenReturn("test-subnet2-name");
+        when(subnet2.isDHCPEnabled()).thenReturn(true);
+        when(subnet2.getGateway()).thenReturn("test-subnet1-gateway");
+        when(subnet2.getCidr()).thenReturn("test-subnet1-gateway");
+        when(subnet2.getIpVersion()).thenReturn(IPVersionType.V6);
+
+        when(osClient.getSubnetById(subnet1.getId())).thenReturn(subnet1);
+        when(osClient.getSubnetById(subnet2.getId())).thenReturn(subnet2);
+
+        List<String> subnetIds = Arrays.asList(subnet1.getId(), subnet2.getId());
+
+        // Arrange
+        Network network1 = mock(Network.class);
+        when(network1.getId()).thenReturn("test-network1-id");
+        when(network1.isShared()).thenReturn(true);
+        when(network1.isRouterExternal()).thenReturn(true);
+        when(network1.isAdminStateUp()).thenReturn(true);
+        when(network1.getProviderPhyNet()).thenReturn("sriov-network1");
+        when(network1.getName()).thenReturn("network1");
+        when(network1.getSubnets()).thenReturn(subnetIds);
+
+        Network network2 = mock(Network.class);
+        when(network2.getId()).thenReturn("test-network2-id");
+        when(network2.isShared()).thenReturn(true);
+        when(network2.isRouterExternal()).thenReturn(true);
+        when(network2.isAdminStateUp()).thenReturn(true);
+        when(network2.getProviderPhyNet()).thenReturn("sriov-network2");
+        when(network2.getName()).thenReturn("network2");
+        when(network2.getSubnets()).thenReturn(subnetIds);
+
+        String vnfId = "some-uuiid-of-the-vnf";
+        String vfModuleId = "some-uuiid-of-the-vf-module";
+
+        Subnet subnet = mock(Subnet.class);
+
+        List<Network> networks = Arrays.asList(network1, network2);
+
+        // Act #1
+        heatbridge.buildAddNetworksToAaiAction(vnfId, vfModuleId, networks);
+
+        // Assert #1
+        verify(transaction, times(2)).createIfNotExists(any(AAIResourceUri.class), any(Optional.class));
+
+        // Act #2
+        heatbridge.buildAddNetworksToAaiAction(vnfId, vfModuleId, networks);
+
+        // Assert #2
+        verify(transaction, times(4)).createIfNotExists(any(AAIResourceUri.class), any(Optional.class));
+
+    }
+
+    @Test
     public void testUpdateVserverLInterfacesToAai_skipVlans() throws HeatBridgeException {
         // Arrange
         List<Resource> stackResources = (List<Resource>) extractTestStackResources();
diff --git a/adapters/pom.xml b/adapters/pom.xml
index 9e703b9..56d4328 100644
--- a/adapters/pom.xml
+++ b/adapters/pom.xml
@@ -22,7 +22,6 @@
     <module>mso-vfc-adapter</module>
     <module>mso-openstack-adapters</module>
     <module>etsi-sol003-adapter</module>
-    <module>etsi-sol002-adapter</module>
     <module>mso-nssmf-adapter</module>
     <module>so-appc-orchestrator</module>
   </modules>
diff --git a/bpmn/MSOCommonBPMN/pom.xml b/bpmn/MSOCommonBPMN/pom.xml
index c395b01..0c61cc3 100644
--- a/bpmn/MSOCommonBPMN/pom.xml
+++ b/bpmn/MSOCommonBPMN/pom.xml
@@ -182,7 +182,7 @@
     <dependency>
       <groupId>commons-beanutils</groupId>
       <artifactId>commons-beanutils</artifactId>
-      <version>1.9.3</version>
+      <version>1.9.4</version>
     </dependency>
     <dependency>
       <groupId>org.springframework.boot</groupId>
diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetup.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetup.java
index 0cdf8a6..e65e1a8 100644
--- a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetup.java
+++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetup.java
@@ -62,6 +62,7 @@
 import org.onap.so.bpmn.servicedecomposition.bbobjects.Tenant;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.VfModule;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.Vnfc;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.Pnf;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.VolumeGroup;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.VpnBinding;
 import org.onap.so.bpmn.servicedecomposition.entities.ConfigurationResourceKeys;
@@ -1854,6 +1855,7 @@
         this.mapOwningEntity(relationships.getByType(AAIObjectType.OWNING_ENTITY), serviceInstance);
         this.mapL3Networks(relationships.getRelatedAAIUris(AAIObjectType.L3_NETWORK), serviceInstance.getNetworks());
         this.mapGenericVnfs(relationships.getRelatedAAIUris(AAIObjectType.GENERIC_VNF), serviceInstance.getVnfs());
+        this.mapPnfs(relationships.getRelatedAAIUris(AAIObjectType.PNF), serviceInstance.getPnfs());
         this.mapCollection(relationships.getByType(AAIObjectType.COLLECTION), serviceInstance);
         this.mapConfigurations(relationships.getRelatedAAIUris(AAIObjectType.CONFIGURATION),
                 serviceInstance.getConfigurations());
@@ -1905,6 +1907,19 @@
         return genericVnf;
     }
 
+    protected void mapPnfs(List<AAIResourceUri> list, List<Pnf> pnfs) {
+        for (AAIResourceUri aaiResourceUri : list) {
+            pnfs.add(this.mapPnf(aaiResourceUri));
+        }
+    }
+
+    protected Pnf mapPnf(AAIResourceUri aaiResourceUri) {
+        AAIResultWrapper aaiPnfWrapper = this.bbInputSetupUtils.getAAIResourceDepthOne(aaiResourceUri);
+        Optional<org.onap.aai.domain.yang.Pnf> aaiPnfWrapperOp =
+                aaiPnfWrapper.asBean(org.onap.aai.domain.yang.Pnf.class);
+        return aaiPnfWrapperOp.map(pnf -> this.mapperLayer.mapAAIPnfIntoPnf(pnf)).orElse(null);
+    }
+
     protected List<InstanceGroup> mapInstanceGroups(List<AAIResultWrapper> instanceGroups) {
         List<InstanceGroup> instanceGroupsList = new ArrayList<>();
         for (AAIResultWrapper volumeGroupWrapper : instanceGroups) {
diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetupMapperLayer.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetupMapperLayer.java
index 67d073d..2bb383e 100644
--- a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetupMapperLayer.java
+++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetupMapperLayer.java
@@ -52,6 +52,7 @@
 import org.onap.so.bpmn.servicedecomposition.bbobjects.Tenant;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.VfModule;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.Vnfc;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.Pnf;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.VolumeGroup;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.VpnBinding;
 import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey;
@@ -323,6 +324,10 @@
         return genericVnf;
     }
 
+    protected Pnf mapAAIPnfIntoPnf(org.onap.aai.domain.yang.Pnf aaiPnf) {
+        return modelMapper.map(aaiPnf, Pnf.class);
+    }
+
     protected void mapAllLicensesIntoGenericVnf(org.onap.aai.domain.yang.GenericVnf aaiGenericVnf,
             GenericVnf genericVnf) {
         if (aaiGenericVnf.getLicenses() != null) {
diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/restproperties/CDSPropertiesImpl.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/restproperties/CDSPropertiesImpl.java
index 64c4565..2efd74d 100644
--- a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/restproperties/CDSPropertiesImpl.java
+++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/restproperties/CDSPropertiesImpl.java
@@ -80,4 +80,14 @@
     public int getTimeout() {
         return Integer.parseInt(Objects.requireNonNull(UrnPropertiesReader.getVariable(TIMEOUT)));
     }
+
+    @Override
+    public boolean getUseSSL() {
+        return false;
+    }
+
+    @Override
+    public boolean getUseBasicAuth() {
+        return true;
+    }
 }
diff --git a/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetupMapperLayerTest.java b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetupMapperLayerTest.java
index 13d2b7d..4755e58 100644
--- a/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetupMapperLayerTest.java
+++ b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetupMapperLayerTest.java
@@ -39,6 +39,7 @@
 import org.onap.so.bpmn.servicedecomposition.bbobjects.Configuration;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.Customer;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.Pnf;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.L3Network;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.LineOfBusiness;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.NetworkPolicy;
@@ -75,7 +76,6 @@
 import org.onap.so.db.catalog.beans.Service;
 import org.onap.so.db.catalog.beans.VfModuleCustomization;
 import org.onap.so.db.catalog.beans.VnfResourceCustomization;
-import org.onap.so.db.catalog.beans.CvnfcConfigurationCustomization;
 import org.onap.so.db.catalog.beans.VnfcCustomization;
 import org.onap.so.serviceinstancebeans.CloudConfiguration;
 import org.onap.so.serviceinstancebeans.RequestDetails;
@@ -422,6 +422,17 @@
     }
 
     @Test
+    public void testMapAAIPnfIntoPnf() throws IOException {
+        Pnf expected = mapper.readValue(new File(RESOURCE_PATH + "PnfExpected.json"), Pnf.class);
+        org.onap.aai.domain.yang.Pnf aaiPnf =
+                mapper.readValue(new File(RESOURCE_PATH + "aaiPnfInput.json"), org.onap.aai.domain.yang.Pnf.class);
+
+        Pnf actual = bbInputSetupMapperLayer.mapAAIPnfIntoPnf(aaiPnf);
+
+        assertThat(actual, sameBeanAs(expected));
+    }
+
+    @Test
     public void testMapAAICollectionIntoCollection() throws JsonParseException, JsonMappingException, IOException {
         org.onap.aai.domain.yang.Collection aaiCollection = mapper
                 .readValue(new File(RESOURCE_PATH + "CollectionInput.json"), org.onap.aai.domain.yang.Collection.class);
diff --git a/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetupTest.java b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetupTest.java
index 9e9c6f3..dd79d27 100644
--- a/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetupTest.java
+++ b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetupTest.java
@@ -69,6 +69,7 @@
 import org.onap.so.bpmn.servicedecomposition.bbobjects.Configuration;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.Customer;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.Pnf;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.InstanceGroup;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.L3Network;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.LineOfBusiness;
@@ -1815,6 +1816,29 @@
     }
 
     @Test
+    public void testMapPnfs() throws JsonProcessingException {
+        org.onap.aai.domain.yang.Pnf expectedAAI = new org.onap.aai.domain.yang.Pnf();
+        org.onap.aai.domain.yang.RelationshipList relationshipList = new org.onap.aai.domain.yang.RelationshipList();
+        org.onap.aai.domain.yang.Relationship relationship = new org.onap.aai.domain.yang.Relationship();
+        relationshipList.getRelationship().add(relationship);
+        expectedAAI.setRelationshipList(relationshipList);
+
+        Pnf expected = new Pnf();
+        AAIResourceUri aaiResourceUri = AAIUriFactory.createResourceUri(AAIObjectType.PNF, "pnfId");
+        AAIResultWrapper pnfWrapper =
+                new AAIResultWrapper(new AAICommonObjectMapperProvider().getMapper().writeValueAsString(expectedAAI));
+
+        doReturn(pnfWrapper).when(SPY_bbInputSetupUtils).getAAIResourceDepthOne(aaiResourceUri);
+        doReturn(expected).when(bbInputSetupMapperLayer).mapAAIPnfIntoPnf(isA(org.onap.aai.domain.yang.Pnf.class));
+
+        List<Pnf> pnfs = new ArrayList<>();
+
+        SPY_bbInputSetup.mapPnfs(Arrays.asList(aaiResourceUri), pnfs);
+
+        assertEquals(expected, pnfs.get(0));
+    }
+
+    @Test
     public void testMapVolumeGroups() throws JsonProcessingException {
         org.onap.aai.domain.yang.VolumeGroup expectedAAI = new org.onap.aai.domain.yang.VolumeGroup();
 
diff --git a/bpmn/MSOCommonBPMN/src/test/resources/__files/ExecuteBuildingBlock/PnfExpected.json b/bpmn/MSOCommonBPMN/src/test/resources/__files/ExecuteBuildingBlock/PnfExpected.json
new file mode 100644
index 0000000..460f72a
--- /dev/null
+++ b/bpmn/MSOCommonBPMN/src/test/resources/__files/ExecuteBuildingBlock/PnfExpected.json
@@ -0,0 +1,8 @@
+{
+	"pnf-id":"pnfId",
+	"pnf-name":"pnfName",
+	"nf-role":"gNB",
+	"orchestration-status":"INVENTORIED",
+	"cloud-region":null,
+	"model-info-pnf":null
+}
\ No newline at end of file
diff --git a/bpmn/MSOCommonBPMN/src/test/resources/__files/ExecuteBuildingBlock/aaiPnfInput.json b/bpmn/MSOCommonBPMN/src/test/resources/__files/ExecuteBuildingBlock/aaiPnfInput.json
new file mode 100644
index 0000000..da0039c
--- /dev/null
+++ b/bpmn/MSOCommonBPMN/src/test/resources/__files/ExecuteBuildingBlock/aaiPnfInput.json
@@ -0,0 +1,38 @@
+{
+	"pnfName":"pnfName",
+	"pnfName2":null,
+	"selflink":null,
+	"pnfName2Source":null,
+	"pnfId":"pnfId",
+	"nfNamingCode":null,
+	"equipType":null,
+	"equipVendor":null,
+	"equipModel":null,
+	"managementOption":null,
+	"orchestrationStatus":"INVENTORIED",
+	"ipaddressV4Oam":null,
+	"swVersion":null,
+	"inMaint":null,
+	"frameId":null,
+	"serialNumber":null,
+	"ipaddressV4Loopback0":null,
+	"ipaddressV6Loopback0":null,
+	"ipaddressV4Aim":null,
+	"ipaddressV6Aim":null,
+	"ipaddressV6Oam":null,
+	"invStatus":null,
+	"resourceVersion":null,
+	"provStatus":null,
+	"nfRole":"gNB",
+	"adminStatus":null,
+	"operationalStatus":null,
+	"modelCustomizationId":null,
+	"modelInvariantId":null,
+	"modelVersionId":null,
+	"pnfIpv4Address":null,
+	"pnfIpv6Address":null,
+	"softwareVersions":null,
+	"relationshipList":null,
+	"lagInterfaces":null,
+	"vrfs":null
+}
\ No newline at end of file
diff --git a/bpmn/mso-infrastructure-bpmn/pom.xml b/bpmn/mso-infrastructure-bpmn/pom.xml
index 0df49c1..9c9a7f9 100644
--- a/bpmn/mso-infrastructure-bpmn/pom.xml
+++ b/bpmn/mso-infrastructure-bpmn/pom.xml
@@ -342,6 +342,10 @@
           <groupId>javax.servlet</groupId>
           <artifactId>servlet-api</artifactId>
         </exclusion>
+        <exclusion>
+          <groupId>log4j</groupId>
+          <artifactId>log4j</artifactId>
+        </exclusion>
       </exclusions>
     </dependency>
   </dependencies>
diff --git a/bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/DeactivatePnfBB.bpmn b/bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/DeactivatePnfBB.bpmn
new file mode 100644
index 0000000..f01f810
--- /dev/null
+++ b/bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/DeactivatePnfBB.bpmn
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="Definitions_1a52v2f" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="4.0.0">
+  <bpmn:collaboration id="Collaboration_0go8wi3">
+    <bpmn:participant id="Participant_1dwc5st" name="SO&#10;Deactivate PNF" processRef="DeactivatePnfBB" />
+    <bpmn:participant id="Participant_0gycee4" name="AAI" />
+    <bpmn:messageFlow id="MessageFlow_0xh6bkn" sourceRef="UpdatePnfOrchestrationStatusToInventoried" targetRef="Participant_0gycee4" />
+  </bpmn:collaboration>
+  <bpmn:process id="DeactivatePnfBB" name="DeactivatePnfBB" isExecutable="true">
+    <bpmn:sequenceFlow id="SequenceFlow_0l6rtzy" sourceRef="UpdatePnfOrchestrationStatusToInventoried" targetRef="PnfInventoried" />
+    <bpmn:sequenceFlow id="SequenceFlow_1fu9o4x" sourceRef="DeactivatePnf_StartEvent" targetRef="UpdatePnfOrchestrationStatusToInventoried" />
+    <bpmn:endEvent id="PnfInventoried" name="Pnf Inventoried">
+      <bpmn:incoming>SequenceFlow_0l6rtzy</bpmn:incoming>
+    </bpmn:endEvent>
+    <bpmn:serviceTask id="UpdatePnfOrchestrationStatusToInventoried" name="Update Pnf Orchestration Status to Inventoried" camunda:expression="${AAIUpdateTasks.updateOrchestrationStatusInventoriedPnf(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
+      <bpmn:incoming>SequenceFlow_1fu9o4x</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_0l6rtzy</bpmn:outgoing>
+    </bpmn:serviceTask>
+    <bpmn:startEvent id="DeactivatePnf_StartEvent">
+      <bpmn:outgoing>SequenceFlow_1fu9o4x</bpmn:outgoing>
+    </bpmn:startEvent>
+  </bpmn:process>
+  <bpmndi:BPMNDiagram id="BPMNDiagram_1">
+    <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Collaboration_0go8wi3">
+      <bpmndi:BPMNShape id="Participant_1dwc5st_di" bpmnElement="Participant_1dwc5st" isHorizontal="true">
+        <dc:Bounds x="160" y="80" width="646" height="391" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_1fu9o4x_di" bpmnElement="SequenceFlow_1fu9o4x">
+        <di:waypoint x="255" y="287" />
+        <di:waypoint x="461" y="287" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_0l6rtzy_di" bpmnElement="SequenceFlow_0l6rtzy">
+        <di:waypoint x="561" y="287" />
+        <di:waypoint x="722" y="287" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="EndEvent_1wfgsdz_di" bpmnElement="PnfInventoried">
+        <dc:Bounds x="722" y="269" width="36" height="36" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="705" y="312" width="74" height="14" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ServiceTask_1ix8822_di" bpmnElement="UpdatePnfOrchestrationStatusToInventoried">
+        <dc:Bounds x="461" y="247" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="StartEvent_1g3euow_di" bpmnElement="DeactivatePnf_StartEvent">
+        <dc:Bounds x="219" y="269" width="36" height="36" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="Participant_0gycee4_di" bpmnElement="Participant_0gycee4" isHorizontal="true">
+        <dc:Bounds x="260" y="567" width="502" height="60" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="MessageFlow_0xh6bkn_di" bpmnElement="MessageFlow_0xh6bkn">
+        <di:waypoint x="511" y="327" />
+        <di:waypoint x="511" y="567" />
+      </bpmndi:BPMNEdge>
+    </bpmndi:BPMNPlane>
+  </bpmndi:BPMNDiagram>
+</bpmn:definitions>
diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/GenericPnfTaskProcessor.groovy b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/GenericPnfTaskProcessor.groovy
new file mode 100644
index 0000000..727a750
--- /dev/null
+++ b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/GenericPnfTaskProcessor.groovy
@@ -0,0 +1,127 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2020 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+
+package org.onap.so.bpmn.infrastructure.scripts
+
+import org.camunda.bpm.engine.delegate.DelegateExecution
+import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
+import org.onap.so.bpmn.common.scripts.ExceptionUtil
+import org.onap.so.bpmn.common.scripts.MsoUtils
+import org.onap.so.bpmn.common.workflow.context.WorkflowContext
+import org.onap.so.bpmn.common.workflow.context.WorkflowContextHolder
+import org.onap.so.bpmn.core.WorkflowException
+import org.slf4j.Logger
+import org.slf4j.LoggerFactory
+
+import static org.onap.so.bpmn.infrastructure.pnf.delegate.ExecutionVariableNames.PNF_CORRELATION_ID
+import static org.onap.so.bpmn.infrastructure.pnf.delegate.ExecutionVariableNames.REQUEST_ID
+
+class GenericPnfTaskProcessor extends AbstractServiceTaskProcessor {
+    private static final Logger logger = LoggerFactory.getLogger(GenericPnfTaskProcessor.class)
+
+    ExceptionUtil exceptionUtil = new ExceptionUtil()
+    String prefix = "Generic_"
+
+    @Override
+    void preProcessRequest(DelegateExecution execution) {
+    }
+
+    void sendResponse(DelegateExecution execution) {
+        def requestId = execution.getVariable(REQUEST_ID)
+        def instanceId = execution.getVariable(PNF_CORRELATION_ID)
+        logger.debug("Send response for requestId: {}, instanceId: {}", requestId, instanceId)
+
+        String response = """{"requestReferences":{"requestId":"${requestId}", "instanceId":"${instanceId}"}}""".trim()
+        sendWorkflowResponse(execution, 200, response)
+    }
+
+    static WorkflowContext getWorkflowContext(DelegateExecution execution) {
+        String requestId = execution.getVariable(REQUEST_ID)
+        return WorkflowContextHolder.getInstance().getWorkflowContext(requestId)
+    }
+
+    void prepareCompletion(DelegateExecution execution) {
+        try {
+            String requestId = execution.getVariable(REQUEST_ID)
+            logger.debug("Prepare Completion of PNF for requestId: {}", requestId)
+
+            String msoCompletionRequest =
+                    """<aetgt:MsoCompletionRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
+                                xmlns:ns="http://org.onap/so/request/types/v1">
+                        <request-info xmlns="http://org.onap/so/infra/vnf-request/v1">
+                            <request-id>${MsoUtils.xmlEscape(requestId)}</request-id>
+                            <action>UPDATE</action>
+                            <source>VID</source>
+                        </request-info>
+                        <aetgt:status-message>Activity is successful.</aetgt:status-message>
+                        <aetgt:mso-bpel-name>${execution.getProcessDefinitionId()}</aetgt:mso-bpel-name>
+                    </aetgt:MsoCompletionRequest>"""
+            String xmlMsoCompletionRequest = utils.formatXml(msoCompletionRequest)
+
+            execution.setVariable(prefix + "CompleteMsoProcessRequest", xmlMsoCompletionRequest)
+
+            logger.debug("CompleteMsoProcessRequest of PNF - " + "\n" + xmlMsoCompletionRequest)
+        } catch (Exception e) {
+            String msg = "Prepare Completion error for PNF - " + e.getMessage()
+            logger.error(msg)
+            exceptionUtil.buildAndThrowWorkflowException(execution, 2000, msg)
+        }
+    }
+
+    void prepareFalloutHandler(DelegateExecution execution) {
+        WorkflowContext workflowContext = getWorkflowContext(execution)
+        if (workflowContext == null) {
+            logger.debug("Error occurred before sending response to API handler, and send it now")
+            sendResponse(execution)
+        }
+
+        try {
+            String requestId = execution.getVariable(REQUEST_ID)
+            logger.debug("Prepare FalloutHandler of PNF for requestId: {}", requestId)
+
+            WorkflowException workflowException = execution.getVariable("WorkflowException")
+            String errorCode = String.valueOf(workflowException.getErrorCode())
+            String errorMessage = workflowException.getErrorMessage()
+            String falloutHandlerRequest =
+                    """<aetgt:FalloutHandlerRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
+                                xmlns:ns="http://org.onap/so/request/types/v1">
+                        <request-info xmlns="http://org.onap/so/infra/vnf-request/v1">
+                            <request-id>${MsoUtils.xmlEscape(requestId)}</request-id>
+                            <action>UPDATE</action>
+                            <source>VID</source>
+                        </request-info>
+                        <aetgt:WorkflowException xmlns:aetgt="http://org.onap/so/workflow/schema/v1">
+                            <aetgt:ErrorMessage>${MsoUtils.xmlEscape(errorMessage)}</aetgt:ErrorMessage>
+                            <aetgt:ErrorCode>${MsoUtils.xmlEscape(errorCode)}</aetgt:ErrorCode>
+                        </aetgt:WorkflowException>
+                    </aetgt:FalloutHandlerRequest>"""
+            String xmlFalloutHandlerRequest = utils.formatXml(falloutHandlerRequest)
+
+            execution.setVariable(prefix + "FalloutHandlerRequest", xmlFalloutHandlerRequest)
+
+            logger.debug("FalloutHandlerRequest of PNF - " + "\n" + xmlFalloutHandlerRequest)
+        } catch (Exception e) {
+            String msg = "Prepare FalloutHandler error for PNF - " + e.getMessage()
+            logger.error(msg)
+            exceptionUtil.buildAndThrowWorkflowException(execution, 2000, msg)
+        }
+    }
+}
diff --git a/bpmn/so-bpmn-infrastructure-flows/src/main/resources/process/GenericPnfHealthCheck.bpmn b/bpmn/so-bpmn-infrastructure-flows/src/main/resources/process/GenericPnfHealthCheck.bpmn
new file mode 100644
index 0000000..1722137
--- /dev/null
+++ b/bpmn/so-bpmn-infrastructure-flows/src/main/resources/process/GenericPnfHealthCheck.bpmn
@@ -0,0 +1,203 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="Definitions_1yd8m0g" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="4.0.0">
+  <bpmn:process id="GenericPnfHealthCheck" name="GenericPnfHealthCheck" isExecutable="true">
+    <bpmn:startEvent id="pnfHealthCheck_startEvent" name="Start Flow">
+      <bpmn:outgoing>SequenceFlow_1ng4b6l</bpmn:outgoing>
+    </bpmn:startEvent>
+    <bpmn:serviceTask id="ServiceTask_042uz7m" name="PNF Request Dispatcher" camunda:delegateExpression="${GenericPnfDispatcher}">
+      <bpmn:incoming>SequenceFlow_1ng4b6l</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_12ejx4m</bpmn:outgoing>
+    </bpmn:serviceTask>
+    <bpmn:sequenceFlow id="SequenceFlow_12ejx4m" sourceRef="ServiceTask_042uz7m" targetRef="ScriptTask_10klpg9" />
+    <bpmn:endEvent id="pnfHealthCheck_endEvent" name="End">
+      <bpmn:incoming>SequenceFlow_0tle5zb</bpmn:incoming>
+      <bpmn:terminateEventDefinition />
+    </bpmn:endEvent>
+    <bpmn:sequenceFlow id="SequenceFlow_1ng4b6l" sourceRef="pnfHealthCheck_startEvent" targetRef="ServiceTask_042uz7m" />
+    <bpmn:exclusiveGateway id="ExclusiveGateway_0x6h0yi" default="SequenceFlow_0piri91">
+      <bpmn:incoming>SequenceFlow_0j26xlx</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_0piri91</bpmn:outgoing>
+      <bpmn:outgoing>Flow_015z1h4</bpmn:outgoing>
+    </bpmn:exclusiveGateway>
+    <bpmn:endEvent id="EndEvent_180lm4y">
+      <bpmn:incoming>SequenceFlow_0piri91</bpmn:incoming>
+      <bpmn:errorEventDefinition id="ErrorEventDefinition_0fm5he7" errorRef="Error_12cpov5" />
+    </bpmn:endEvent>
+    <bpmn:sequenceFlow id="SequenceFlow_0piri91" name="Failure" sourceRef="ExclusiveGateway_0x6h0yi" targetRef="EndEvent_180lm4y" />
+    <bpmn:scriptTask id="ScriptTask_10klpg9" name="Send Response" scriptFormat="groovy">
+      <bpmn:incoming>SequenceFlow_12ejx4m</bpmn:incoming>
+      <bpmn:outgoing>Flow_12uv2m0</bpmn:outgoing>
+      <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.*
+def taskProcessor = new GenericPnfTaskProcessor()
+taskProcessor.sendResponse(execution)</bpmn:script>
+    </bpmn:scriptTask>
+    <bpmn:scriptTask id="ScriptTask_1igtc83" name="Prepare Completion" scriptFormat="groovy">
+      <bpmn:incoming>Flow_015z1h4</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_0ipc3nt</bpmn:outgoing>
+      <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.*
+def taskProcessor = new GenericPnfTaskProcessor()
+taskProcessor.prepareCompletion(execution)</bpmn:script>
+    </bpmn:scriptTask>
+    <bpmn:sequenceFlow id="SequenceFlow_0ipc3nt" sourceRef="ScriptTask_1igtc83" targetRef="CallActivity_0o1mi8u" />
+    <bpmn:callActivity id="CallActivity_0o1mi8u" name="Complete Process" calledElement="CompleteMsoProcess">
+      <bpmn:extensionElements>
+        <camunda:in source="PnfSwUpgrade_CompleteMsoProcessRequest" target="CompleteMsoProcessRequest" />
+      </bpmn:extensionElements>
+      <bpmn:incoming>SequenceFlow_0ipc3nt</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_0tle5zb</bpmn:outgoing>
+    </bpmn:callActivity>
+    <bpmn:sequenceFlow id="SequenceFlow_0tle5zb" sourceRef="CallActivity_0o1mi8u" targetRef="pnfHealthCheck_endEvent" />
+    <bpmn:subProcess id="SubProcess_02p6q4s" name="Subprocess for FalloutHandler" triggeredByEvent="true">
+      <bpmn:startEvent id="StartEvent_149ecdm" name="Catch All Errors">
+        <bpmn:outgoing>SequenceFlow_05haut5</bpmn:outgoing>
+        <bpmn:errorEventDefinition id="ErrorEventDefinition_1" />
+      </bpmn:startEvent>
+      <bpmn:scriptTask id="ScriptTask_0gov132" name="Prepare FalloutHandler" scriptFormat="groovy">
+        <bpmn:incoming>SequenceFlow_05haut5</bpmn:incoming>
+        <bpmn:outgoing>SequenceFlow_09y0mpc</bpmn:outgoing>
+        <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.*
+def pnfSwUpgrade = new PNFSoftwareUpgrade()
+pnfSwUpgrade.prepareFalloutHandler(execution)</bpmn:script>
+      </bpmn:scriptTask>
+      <bpmn:callActivity id="CallActivity_00psvtk" name="Call FalloutHandler" calledElement="FalloutHandler">
+        <bpmn:extensionElements>
+          <camunda:in source="PnfSwUpgrade_FalloutHandlerRequest" target="FalloutHandlerRequest" />
+        </bpmn:extensionElements>
+        <bpmn:incoming>SequenceFlow_09y0mpc</bpmn:incoming>
+        <bpmn:outgoing>SequenceFlow_1tcjlty</bpmn:outgoing>
+      </bpmn:callActivity>
+      <bpmn:endEvent id="EndEvent_1vq2glg" name="End">
+        <bpmn:incoming>SequenceFlow_1tcjlty</bpmn:incoming>
+        <bpmn:terminateEventDefinition id="TerminateEventDefinition_0994ojb" />
+      </bpmn:endEvent>
+      <bpmn:sequenceFlow id="SequenceFlow_05haut5" sourceRef="StartEvent_149ecdm" targetRef="ScriptTask_0gov132" />
+      <bpmn:sequenceFlow id="SequenceFlow_09y0mpc" sourceRef="ScriptTask_0gov132" targetRef="CallActivity_00psvtk" />
+      <bpmn:sequenceFlow id="SequenceFlow_1tcjlty" sourceRef="CallActivity_00psvtk" targetRef="EndEvent_1vq2glg" />
+    </bpmn:subProcess>
+    <bpmn:serviceTask id="ServiceTask_0slpaht" name="HealthCheck" camunda:delegateExpression="${ControllerExecutionDE}">
+      <bpmn:extensionElements>
+        <camunda:inputOutput>
+          <camunda:inputParameter name="action">healthCheck</camunda:inputParameter>
+          <camunda:inputParameter name="scope">pnf</camunda:inputParameter>
+          <camunda:inputParameter name="mode">async</camunda:inputParameter>
+        </camunda:inputOutput>
+      </bpmn:extensionElements>
+      <bpmn:incoming>Flow_12uv2m0</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_0j26xlx</bpmn:outgoing>
+    </bpmn:serviceTask>
+    <bpmn:sequenceFlow id="SequenceFlow_0j26xlx" sourceRef="ServiceTask_0slpaht" targetRef="ExclusiveGateway_0x6h0yi" />
+    <bpmn:sequenceFlow id="Flow_015z1h4" name="Success" sourceRef="ExclusiveGateway_0x6h0yi" targetRef="ScriptTask_1igtc83">
+      <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">#{execution.getVariable("ControllerStatus").equals("Success")}</bpmn:conditionExpression>
+    </bpmn:sequenceFlow>
+    <bpmn:sequenceFlow id="Flow_12uv2m0" sourceRef="ScriptTask_10klpg9" targetRef="ServiceTask_0slpaht" />
+  </bpmn:process>
+  <bpmn:error id="Error_12cpov5" name="MSOWorkflowException" errorCode="MSOWorkflowException" />
+  <bpmndi:BPMNDiagram id="BPMNDiagram_1">
+    <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="GenericPnfHealthCheck">
+      <bpmndi:BPMNEdge id="Flow_12uv2m0_di" bpmnElement="Flow_12uv2m0">
+        <di:waypoint x="530" y="120" />
+        <di:waypoint x="590" y="120" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="Flow_015z1h4_di" bpmnElement="Flow_015z1h4">
+        <di:waypoint x="825" y="120" />
+        <di:waypoint x="900" y="120" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="842" y="102" width="43" height="14" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_0j26xlx_di" bpmnElement="SequenceFlow_0j26xlx">
+        <di:waypoint x="690" y="120" />
+        <di:waypoint x="775" y="120" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_0tle5zb_di" bpmnElement="SequenceFlow_0tle5zb">
+        <di:waypoint x="1180" y="120" />
+        <di:waypoint x="1262" y="120" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_0ipc3nt_di" bpmnElement="SequenceFlow_0ipc3nt">
+        <di:waypoint x="1000" y="120" />
+        <di:waypoint x="1080" y="120" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_0piri91_di" bpmnElement="SequenceFlow_0piri91">
+        <di:waypoint x="800" y="145" />
+        <di:waypoint x="800" y="202" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="793" y="145" width="35" height="14" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_1ng4b6l_di" bpmnElement="SequenceFlow_1ng4b6l">
+        <di:waypoint x="178" y="120" />
+        <di:waypoint x="270" y="120" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_12ejx4m_di" bpmnElement="SequenceFlow_12ejx4m">
+        <di:waypoint x="370" y="120" />
+        <di:waypoint x="430" y="120" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="pnfHealthCheck_startEvent">
+        <dc:Bounds x="142" y="102" width="36" height="36" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="137" y="145" width="51" height="14" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ServiceTask_042uz7n_di" bpmnElement="ServiceTask_042uz7m">
+        <dc:Bounds x="270" y="80" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="EndEvent_1w3jv30_di" bpmnElement="pnfHealthCheck_endEvent">
+        <dc:Bounds x="1262" y="102" width="36" height="36" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="1271" y="145" width="20" height="14" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ExclusiveGateway_0x6h0ni_di" bpmnElement="ExclusiveGateway_0x6h0yi" isMarkerVisible="true">
+        <dc:Bounds x="775" y="95" width="50" height="50" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="EndEvent_180lm4y_di" bpmnElement="EndEvent_180lm4y">
+        <dc:Bounds x="782" y="202" width="36" height="36" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ScriptTask_10klpg8_di" bpmnElement="ScriptTask_10klpg9">
+        <dc:Bounds x="430" y="80" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ScriptTask_1igtc83_di" bpmnElement="ScriptTask_1igtc83">
+        <dc:Bounds x="900" y="80" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="CallActivity_0o1mi8u_di" bpmnElement="CallActivity_0o1mi8u">
+        <dc:Bounds x="1080" y="80" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="SubProcess_02p6q4s_di" bpmnElement="SubProcess_02p6q4s" isExpanded="true">
+        <dc:Bounds x="370" y="430" width="650" height="190" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_1tcjlty_di" bpmnElement="SequenceFlow_1tcjlty">
+        <di:waypoint x="810" y="530" />
+        <di:waypoint x="882" y="530" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_09y0mpc_di" bpmnElement="SequenceFlow_09y0mpc">
+        <di:waypoint x="640" y="530" />
+        <di:waypoint x="710" y="530" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_05haut5_di" bpmnElement="SequenceFlow_05haut5">
+        <di:waypoint x="478" y="530" />
+        <di:waypoint x="540" y="530" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="StartEvent_1r4h504_di" bpmnElement="StartEvent_149ecdm">
+        <dc:Bounds x="442" y="512" width="36" height="36" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="421" y="553" width="78" height="14" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ScriptTask_0gov132_di" bpmnElement="ScriptTask_0gov132">
+        <dc:Bounds x="540" y="490" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="CallActivity_00psvtk_di" bpmnElement="CallActivity_00psvtk">
+        <dc:Bounds x="710" y="490" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="EndEvent_1vq2glg_di" bpmnElement="EndEvent_1vq2glg">
+        <dc:Bounds x="882" y="512" width="36" height="36" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="891" y="555" width="20" height="14" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ServiceTask_0slpahe_di" bpmnElement="ServiceTask_0slpaht">
+        <dc:Bounds x="590" y="80" width="100" height="80" />
+      </bpmndi:BPMNShape>
+    </bpmndi:BPMNPlane>
+  </bpmndi:BPMNDiagram>
+</bpmn:definitions>
diff --git a/bpmn/so-bpmn-infrastructure-flows/src/test/java/org/onap/so/bpmn/infrastructure/process/PNFSoftwareUpgradeTest.java b/bpmn/so-bpmn-infrastructure-flows/src/test/java/org/onap/so/bpmn/infrastructure/process/PNFSoftwareUpgradeTest.java
index 22cf72b..0bf14d7 100644
--- a/bpmn/so-bpmn-infrastructure-flows/src/test/java/org/onap/so/bpmn/infrastructure/process/PNFSoftwareUpgradeTest.java
+++ b/bpmn/so-bpmn-infrastructure-flows/src/test/java/org/onap/so/bpmn/infrastructure/process/PNFSoftwareUpgradeTest.java
@@ -1,7 +1,6 @@
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2020 Nordix Foundation.
- *  Modifications Copyright (C) 2020 Huawei Technologies Co., Ltd.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/bpmn/so-bpmn-infrastructure-flows/src/test/java/org/onap/so/bpmn/infrastructure/process/PnfHealthCheckTest.java b/bpmn/so-bpmn-infrastructure-flows/src/test/java/org/onap/so/bpmn/infrastructure/process/PnfHealthCheckTest.java
new file mode 100644
index 0000000..2423ad8
--- /dev/null
+++ b/bpmn/so-bpmn-infrastructure-flows/src/test/java/org/onap/so/bpmn/infrastructure/process/PnfHealthCheckTest.java
@@ -0,0 +1,234 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2020 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.bpmn.infrastructure.process;
+
+import com.google.protobuf.Struct;
+import org.camunda.bpm.engine.runtime.ProcessInstance;
+import org.junit.Before;
+import org.junit.Test;
+import org.onap.aaiclient.client.aai.AAIVersion;
+import org.onap.ccsdk.cds.controllerblueprints.common.api.ActionIdentifiers;
+import org.onap.ccsdk.cds.controllerblueprints.common.api.CommonHeader;
+import org.onap.ccsdk.cds.controllerblueprints.processing.api.ExecutionServiceInput;
+import org.onap.so.BaseBPMNTest;
+import org.onap.so.GrpcNettyServer;
+import org.onap.so.bpmn.infrastructure.pnf.delegate.ExecutionVariableNames;
+import org.onap.so.bpmn.mock.FileUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import static com.github.tomakehurst.wiremock.client.WireMock.*;
+import static org.assertj.core.api.Assertions.fail;
+import static org.camunda.bpm.engine.test.assertions.bpmn.BpmnAwareAssertions.assertThat;
+
+/**
+ * Basic Integration test for GenericPnfHealthCheck.bpmn workflow.
+ */
+public class PnfHealthCheckTest extends BaseBPMNTest {
+
+    private final Logger logger = LoggerFactory.getLogger(getClass());
+
+    private static final long WORKFLOW_WAIT_TIME = 1000L;
+
+    private static final String TEST_PROCESSINSTANCE_KEY = "GenericPnfHealthCheck";
+    private static final AAIVersion VERSION = AAIVersion.LATEST;
+    private static final Map<String, Object> executionVariables = new HashMap<>();
+    private static final String REQUEST_ID = "50ae41ad-049c-4fe2-9950-539f111120f5";
+    private static final String ACTION_NAME = "healthCheck";
+    private final String CLASS_NAME = getClass().getSimpleName();
+    private String requestObject;
+    private String responseObject;
+
+    @Autowired
+    private GrpcNettyServer grpcNettyServer;
+
+    @Before
+    public void setUp() {
+        executionVariables.clear();
+        grpcNettyServer.getDetailedMessages().clear();
+
+        requestObject = FileUtil.readResourceFile("request/" + CLASS_NAME + ".json");
+        responseObject = FileUtil.readResourceFile("response/" + CLASS_NAME + ".json");
+
+        executionVariables.put("bpmnRequest", requestObject);
+        executionVariables.put("requestId", REQUEST_ID);
+
+        /**
+         * This variable indicates that the flow was invoked asynchronously. It's injected by {@link WorkflowProcessor}.
+         */
+        executionVariables.put("isAsyncProcess", "true");
+        executionVariables.put(ExecutionVariableNames.PRC_CUSTOMIZATION_UUID, "38dc9a92-214c-11e7-93ae-92361f002680");
+
+        /**
+         * Temporary solution to add pnfCorrelationId to context. this value is getting from the request to SO api
+         * handler and then convert to CamundaInput
+         */
+        executionVariables.put(ExecutionVariableNames.PNF_CORRELATION_ID, "PNFDemo");
+    }
+
+
+    @Test
+    public void workflow_validInput_expectedOutput() throws InterruptedException {
+
+        mockCatalogDb();
+        mockRequestDb();
+        mockAai();
+
+        final String msoRequestId = UUID.randomUUID().toString();
+        executionVariables.put(ExecutionVariableNames.MSO_REQUEST_ID, msoRequestId);
+
+        final String testBusinessKey = UUID.randomUUID().toString();
+        logger.info("Test the process instance: {} with business key: {}", TEST_PROCESSINSTANCE_KEY, testBusinessKey);
+
+        ProcessInstance pi =
+                runtimeService.startProcessInstanceByKey(TEST_PROCESSINSTANCE_KEY, testBusinessKey, executionVariables);
+
+        int waitCount = 10;
+        while (!isProcessInstanceEnded() && waitCount >= 0) {
+            Thread.sleep(WORKFLOW_WAIT_TIME);
+            waitCount--;
+        }
+
+        // Layout is to reflect the bpmn visual layout
+        assertThat(pi).isEnded().hasPassedInOrder("pnfHealthCheck_startEvent", "ServiceTask_042uz7m",
+                "ScriptTask_10klpg9", "ServiceTask_0slpaht", "ExclusiveGateway_0x6h0yi", "ScriptTask_1igtc83",
+                "CallActivity_0o1mi8u", "pnfHealthCheck_endEvent");
+
+        List<ExecutionServiceInput> detailedMessages = grpcNettyServer.getDetailedMessages();
+        logger.debug("Size of detailedMessage is {}", detailedMessages.size());
+        assertThat(detailedMessages.size() == 1).isTrue();
+        int count = 0;
+        try {
+            for (ExecutionServiceInput eSI : detailedMessages) {
+                if (ACTION_NAME.equals(eSI.getActionIdentifiers().getActionName())
+                        && eSI.getCommonHeader().getRequestId().equals(msoRequestId)) {
+                    checkWithActionName(eSI, ACTION_NAME);
+                    count++;
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            fail("PNFHealthCheck request exception", e);
+        }
+        assertThat(count == 1).isTrue();
+    }
+
+    private boolean isProcessInstanceEnded() {
+        return runtimeService.createProcessInstanceQuery().processDefinitionKey(TEST_PROCESSINSTANCE_KEY)
+                .singleResult() == null;
+    }
+
+    private void checkWithActionName(ExecutionServiceInput executionServiceInput, String action) {
+
+        logger.info("Checking the " + action + " request");
+        ActionIdentifiers actionIdentifiers = executionServiceInput.getActionIdentifiers();
+
+        /**
+         * the fields of actionIdentifiers should match the one in the response/PnfHealthCheck_catalogdb.json.
+         */
+        assertThat(actionIdentifiers.getBlueprintName()).isEqualTo("test_pnf_health_check_restconf");
+        assertThat(actionIdentifiers.getBlueprintVersion()).isEqualTo("1.0.0");
+        assertThat(actionIdentifiers.getActionName()).isEqualTo(action);
+        assertThat(actionIdentifiers.getMode()).isEqualTo("async");
+
+        CommonHeader commonHeader = executionServiceInput.getCommonHeader();
+        assertThat(commonHeader.getOriginatorId()).isEqualTo("SO");
+
+        Struct payload = executionServiceInput.getPayload();
+        Struct requeststruct = payload.getFieldsOrThrow(action + "-request").getStructValue();
+
+        assertThat(requeststruct.getFieldsOrThrow("resolution-key").getStringValue()).isEqualTo("PNFDemo");
+        Struct propertiesStruct = requeststruct.getFieldsOrThrow(action + "-properties").getStructValue();
+
+        assertThat(propertiesStruct.getFieldsOrThrow("pnf-name").getStringValue()).isEqualTo("PNFDemo");
+        assertThat(propertiesStruct.getFieldsOrThrow("service-model-uuid").getStringValue())
+                .isEqualTo("32daaac6-5017-4e1e-96c8-6a27dfbe1421");
+        assertThat(propertiesStruct.getFieldsOrThrow("pnf-customization-uuid").getStringValue())
+                .isEqualTo("38dc9a92-214c-11e7-93ae-92361f002680");
+    }
+
+    private void mockAai() {
+
+        String aaiPnfEntry =
+                "{  \n" + "   \"pnf-name\":\"PNFDemo\",\n" + "   \"pnf-id\":\"testtest\",\n" + "   \"in-maint\":true,\n"
+                        + "   \"resource-version\":\"1541720264047\",\n" + "   \"swVersion\":\"demo-1.1\",\n"
+                        + "   \"ipaddress-v4-oam\":\"1.1.1.1\",\n" + "   \"ipaddress-v6-oam\":\"::/128\"\n" + "}";
+
+        /**
+         * PUT the PNF correlation ID to AAI.
+         */
+        wireMockServer.stubFor(put(urlEqualTo("/aai/" + VERSION + "/network/pnfs/pnf/PNFDemo")));
+
+        /**
+         * Get the PNF entry from AAI.
+         */
+        wireMockServer.stubFor(
+                get(urlEqualTo("/aai/" + VERSION + "/network/pnfs/pnf/PNFDemo")).willReturn(okJson(aaiPnfEntry)));
+
+        /**
+         * Post the pnf to AAI
+         */
+        wireMockServer.stubFor(post(urlEqualTo("/aai/" + VERSION + "/network/pnfs/pnf/PNFDemo")));
+    }
+
+    private void mockRequestDb() {
+        /**
+         * Update Request DB
+         */
+        wireMockServer.stubFor(put(urlEqualTo("/infraActiveRequests/" + REQUEST_ID)));
+
+    }
+
+    /**
+     * Mock the catalobdb rest interface.
+     */
+    private void mockCatalogDb() {
+
+        String catalogdbClientResponse = FileUtil.readResourceFile("response/" + CLASS_NAME + "_catalogdb.json");
+
+
+        /**
+         * Return valid json for the model UUID in the request file.
+         */
+        wireMockServer
+                .stubFor(get(urlEqualTo("/v2/serviceResources?serviceModelUuid=32daaac6-5017-4e1e-96c8-6a27dfbe1421"))
+                        .willReturn(okJson(responseObject)));
+
+        /**
+         * Return valid json for the service model InvariantUUID as specified in the request file.
+         */
+        wireMockServer.stubFor(
+                get(urlEqualTo("/v2/serviceResources?serviceModelInvariantUuid=339b7a2f-9524-4dbf-9eee-f2e05521df3f"))
+                        .willReturn(okJson(responseObject)));
+
+        /**
+         * Return valid spring data rest json for the service model UUID as specified in the request file.
+         */
+        wireMockServer.stubFor(get(urlEqualTo(
+                "/pnfResourceCustomization/search/findPnfResourceCustomizationByModelUuid?SERVICE_MODEL_UUID=32daaac6-5017-4e1e-96c8-6a27dfbe1421"))
+                        .willReturn(okJson(catalogdbClientResponse)));
+    }
+
+}
diff --git a/bpmn/so-bpmn-infrastructure-flows/src/test/resources/request/PnfHealthCheckTest.json b/bpmn/so-bpmn-infrastructure-flows/src/test/resources/request/PnfHealthCheckTest.json
new file mode 100644
index 0000000..7cfe9f5
--- /dev/null
+++ b/bpmn/so-bpmn-infrastructure-flows/src/test/resources/request/PnfHealthCheckTest.json
@@ -0,0 +1,50 @@
+{
+  "requestDetails":{
+    "requestInfo":{
+      "source":"VID",
+      "suppressRollback":false,
+      "requestorId":"demo",
+      "productFamilyId":"SWUPid"
+    },
+    "modelInfo":{
+      "modelType":"service",
+      "modelInvariantUuid":"339b7a2f-9524-4dbf-9eee-f2e05521df3f",
+      "modelInvariantId":"339b7a2f-9524-4dbf-9eee-f2e05521df3f",
+      "modelUuid":"32daaac6-5017-4e1e-96c8-6a27dfbe1421",
+      "modelName":"PNF_int_service_2",
+      "modelVersion":"1.0"
+    },
+    "requestParameters":{
+      "userParams":[
+        {
+          "name":"aic_zone",
+          "value":"nova"
+        },
+        {
+          "name":"pnfId",
+          "value":"PNFDemo"
+        },
+        {
+          "name":"pnfName",
+          "value":"PNFDemo"
+        }
+      ],
+      "subscriptionServiceType":"SWUP",
+      "aLaCarte":false
+    },
+    "cloudConfiguration":{
+      "lcpCloudRegionId":"regionOne",
+      "tenantId":"09a63533072f4a579d5c99c3b8fe94c6"
+    },
+    "subscriberInfo":{
+      "globalSubscriberId":"ADemoCustomerInEric"
+    },
+    "project":{
+      "projectName":"Project-Demonstration"
+    },
+    "owningEntity":{
+      "owningEntityId":"5eae949c-1c50-4780-b8b5-7cbeb08856b4",
+      "owningEntityName":"OE-Demonstration"
+    }
+  }
+}
\ No newline at end of file
diff --git a/bpmn/so-bpmn-infrastructure-flows/src/test/resources/response/PnfHealthCheckTest.json b/bpmn/so-bpmn-infrastructure-flows/src/test/resources/response/PnfHealthCheckTest.json
new file mode 100644
index 0000000..3253984
--- /dev/null
+++ b/bpmn/so-bpmn-infrastructure-flows/src/test/resources/response/PnfHealthCheckTest.json
@@ -0,0 +1,26 @@
+{
+  "serviceResources":{
+    "modelInfo":{
+      "modelInvariantId":"439b7a2f-9524-4dbf-9eee-f2e05521df3f",
+      "modelUuid":"42daaac6-5017-4e1e-96c8-6a27dfbe1421",
+      "modelName":"PNF_int_service_2",
+      "modelVersion":"1.0"
+    },
+    "serviceType":"NA",
+    "environmentContext":"Luna",
+    "serviceRole":"NA",
+    "workloadContext":"Oxygen",
+    "serviceVnfs":[
+
+    ],
+    "serviceNetworks":[
+
+    ],
+    "serviceAllottedResources":[
+
+    ],
+    "configResource":[
+
+    ]
+  }
+}
\ No newline at end of file
diff --git a/bpmn/so-bpmn-infrastructure-flows/src/test/resources/response/PnfHealthCheckTest_catalogdb.json b/bpmn/so-bpmn-infrastructure-flows/src/test/resources/response/PnfHealthCheckTest_catalogdb.json
new file mode 100644
index 0000000..fc9399d
--- /dev/null
+++ b/bpmn/so-bpmn-infrastructure-flows/src/test/resources/response/PnfHealthCheckTest_catalogdb.json
@@ -0,0 +1,39 @@
+{
+  "_embedded": {
+    "pnfResourceCustomization": [
+      {
+        "modelCustomizationUUID": "38dc9a92-214c-11e7-93ae-92361f002680",
+        "modelInstanceName": "PNF routing",
+        "created": "2019-03-08 12:00:29.000",
+        "nfFunction": "routing",
+        "nfType": "routing",
+        "nfRole": "routing",
+        "nfNamingCode": "routing",
+        "multiStageDesign": null,
+        "resourceInput": null,
+        "blueprintName": "test_pnf_health_check_restconf",
+        "blueprintVersion": "1.0.0",
+        "skipPostInstConf": false,
+        "softwareVersion": "1.0.0",
+        "creationTimestamp": "2019-03-08T12:00:29.000+0000",
+        "controllerActor": "cds",
+        "_links": {
+          "self": {
+            "href": "http://localhost:41023/pnfResourceCustomization/38dc9a92-214c-11e7-93ae-92361f002680"
+          },
+          "pnfResourceCustomization": {
+            "href": "http://localhost:41023/pnfResourceCustomization/38dc9a92-214c-11e7-93ae-92361f002680"
+          },
+          "pnfResources": {
+            "href": "http://localhost:41023/pnfResourceCustomization/38dc9a92-214c-11e7-93ae-92361f002680/pnfResources"
+          }
+        }
+      }
+    ]
+  },
+  "_links": {
+    "self": {
+      "href": "http://localhost:41023/pnfResourceCustomization/search/findPnfResourceCustomizationByModelUuid?SERVICE_MODEL_UUID=4df8b6de-2083-11e7-93ae-92361f002676"
+    }
+  }
+}
\ No newline at end of file
diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAICreateTasks.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAICreateTasks.java
index e3181c3..55edf0b 100644
--- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAICreateTasks.java
+++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAICreateTasks.java
@@ -260,7 +260,7 @@
     public void createPnf(BuildingBlockExecution execution) {
         try {
             Pnf pnf = extractPojosForBB.extractByKey(execution, ResourceKey.PNF);
-            aaiPnfResources.checkIfPnfExistsInAaiAndCanBeUsed(pnf.getPnfName());
+            aaiPnfResources.checkIfPnfExistsInAaiAndCanBeUsed(pnf);
             ServiceInstance serviceInstance =
                     extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID);
             aaiPnfResources.createPnfAndConnectServiceInstance(pnf, serviceInstance);
diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAIUpdateTasks.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAIUpdateTasks.java
index cc63023..6c98909 100644
--- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAIUpdateTasks.java
+++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAIUpdateTasks.java
@@ -90,6 +90,13 @@
     }
 
     /**
+     * BPMN access method to update status of Pnf to Inventoried in AAI
+     */
+    public void updateOrchestrationStatusInventoriedPnf(BuildingBlockExecution execution) {
+        updateOrchestrationStatusForPnf(execution, OrchestrationStatus.INVENTORIED);
+    }
+
+    /**
      * BPMN access method to update status of Pnf to Active in AAI
      */
     public void updateOrchestrationStatusActivePnf(BuildingBlockExecution execution) {
diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/vnfm/tasks/utils/SdncInputParametersProvider.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/vnfm/tasks/utils/SdncInputParametersProvider.java
index 6831a65..92ed61d 100644
--- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/vnfm/tasks/utils/SdncInputParametersProvider.java
+++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/vnfm/tasks/utils/SdncInputParametersProvider.java
@@ -50,11 +50,8 @@
 public class SdncInputParametersProvider extends AbstractInputParametersProvider<GenericVnf> {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(SdncInputParametersProvider.class);
-
     private static final String VNF_PARAMETERS_PATH = "$..vnf-parameters";
-
     private final SDNCClient sdncClient;
-
     private final ObjectMapper mapper;
 
     @Autowired
@@ -68,34 +65,12 @@
         final String vnfName = genericVnf.getVnfName();
         final String vnfType = getVnfType(genericVnf);
         final String url = getPreloadVnfsUrl(vnfName, vnfType);
+        final InputParameter inputParameter = parseInputParametersUsingUrl(url);
 
-        try {
-            LOGGER.debug("Will query sdnc for input parameters using url: {}", url);
-            final String jsonResponse = sdncClient.get(url);
-            final String json = JsonPathUtil.getInstance().locateResult(jsonResponse, VNF_PARAMETERS_PATH).orElse(null);
-
-            try {
-
-                if (json != null) {
-                    final List<VnfParameter> vnfParametersArray =
-                            mapper.readValue(json, new TypeReference<List<VnfParameter>>() {});
-                    final Map<String, String> vnfParametersMap = getVnfParameterMap(vnfParametersArray);
-                    final Map<String, String> additionalParameters = getAdditionalParameters(vnfParametersMap);
-                    final List<ExternalVirtualLink> extVirtualLinks = getExtVirtualLinks(vnfParametersMap);
-                    final InputParameter inputParameter = new InputParameter(additionalParameters, extVirtualLinks);
-                    LOGGER.info("InputParameter found in sdnc response : {}", inputParameter);
-                    return inputParameter;
-                }
-
-            } catch (final IOException exception) {
-                LOGGER.error("Unable to parse vnf parameters : {}", json, exception);
-            }
-        } catch (final Exception exception) {
-            LOGGER.error("Unable to retrieve/parse input parameters using URL: {} ", url, exception);
-        }
+        if (inputParameter != null)
+            return inputParameter;
         LOGGER.warn("No input parameters found ...");
         return NullInputParameter.NULL_INSTANCE;
-
     }
 
     private List<ExternalVirtualLink> getExtVirtualLinks(final Map<String, String> vnfParametersMap) {
@@ -109,19 +84,18 @@
 
     private Map<String, String> getAdditionalParameters(final Map<String, String> vnfParametersMap) {
         final String additionalParamsString = vnfParametersMap.get(ADDITIONAL_PARAMS);
+
         if (additionalParamsString != null && !additionalParamsString.isEmpty()) {
             return parseAdditionalParameters(additionalParamsString);
         }
         return Collections.emptyMap();
     }
 
-
     private Map<String, String> getVnfParameterMap(final List<VnfParameter> array) {
         if (array != null) {
             return array.stream().filter(vnfParam -> vnfParam.getName() != null && vnfParam.getValue() != null)
                     .collect(Collectors.toMap(VnfParameter::getName, VnfParameter::getValue));
         }
-
         return Collections.emptyMap();
     }
 
@@ -131,10 +105,43 @@
 
     private String getVnfType(final GenericVnf genericVnf) {
         final ModelInfoGenericVnf modelInfoGenericVnf = genericVnf.getModelInfoGenericVnf();
-        if (modelInfoGenericVnf != null && modelInfoGenericVnf.getModelName() != null) {
+        if (modelInfoGenericVnf != null) {
             return modelInfoGenericVnf.getModelName();
         }
         return genericVnf.getVnfType();
     }
 
+    private InputParameter parseInputParametersUsingUrl(String url) {
+        try {
+            LOGGER.debug("Will query sdnc for input parameters using url: {}", url);
+            final String jsonResponse = sdncClient.get(url);
+            final String json = JsonPathUtil.getInstance().locateResult(jsonResponse, VNF_PARAMETERS_PATH).orElse(null);
+            final InputParameter inputParameter = parseVnfParameters(json);
+
+            if (inputParameter != null)
+                return inputParameter;
+        } catch (final Exception exception) {
+            LOGGER.error("Unable to retrieve/parse input parameters using URL: {} ", url, exception);
+        }
+        return null;
+    }
+
+    private InputParameter parseVnfParameters(String json) {
+        try {
+            if (json != null) {
+                final List<VnfParameter> vnfParametersArray =
+                        mapper.readValue(json, new TypeReference<List<VnfParameter>>() {});
+                final Map<String, String> vnfParametersMap = getVnfParameterMap(vnfParametersArray);
+                final Map<String, String> additionalParameters = getAdditionalParameters(vnfParametersMap);
+                final List<ExternalVirtualLink> extVirtualLinks = getExtVirtualLinks(vnfParametersMap);
+                final InputParameter inputParameter = new InputParameter(additionalParameters, extVirtualLinks);
+                LOGGER.info("InputParameter found in sdnc response : {}", inputParameter);
+                return inputParameter;
+            }
+
+        } catch (final IOException exception) {
+            LOGGER.error("Unable to parse vnf parameters : {}", json, exception);
+        }
+        return null;
+    }
 }
diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/vnfm/tasks/utils/UserParamInputParametersProvider.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/vnfm/tasks/utils/UserParamInputParametersProvider.java
index ac939d0..bdd738b 100644
--- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/vnfm/tasks/utils/UserParamInputParametersProvider.java
+++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/vnfm/tasks/utils/UserParamInputParametersProvider.java
@@ -40,12 +40,12 @@
             final InputParameter inputParameter = new InputParameter();
             final Object additionalParams = userParams.get(ADDITIONAL_PARAMS);
 
-            if (additionalParams != null && additionalParams instanceof String) {
+            if (additionalParams instanceof String) {
                 inputParameter.setAdditionalParams(parseAdditionalParameters(additionalParams.toString()));
             }
 
             final Object extVirtualLinks = userParams.get(EXT_VIRTUAL_LINKS);
-            if (extVirtualLinks != null && extVirtualLinks instanceof String) {
+            if (extVirtualLinks instanceof String) {
                 inputParameter.setExtVirtualLinks(parseExternalVirtualLinks(extVirtualLinks.toString()));
             }
             LOGGER.info("InputParameter found in userParams : {}", inputParameter);
diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/vnfm/tasks/utils/VnfParameter.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/vnfm/tasks/utils/VnfParameter.java
index 0d45dad..2491c99 100644
--- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/vnfm/tasks/utils/VnfParameter.java
+++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/vnfm/tasks/utils/VnfParameter.java
@@ -35,30 +35,18 @@
     @JsonProperty("vnf-parameter-value")
     private String value;
 
-    /**
-     * @return the name
-     */
     public String getName() {
         return name;
     }
 
-    /**
-     * @param name the name to set
-     */
     public void setName(final String name) {
         this.name = name;
     }
 
-    /**
-     * @return the value
-     */
     public String getValue() {
         return value;
     }
 
-    /**
-     * @param value the value to set
-     */
     public void setValue(final String value) {
         this.value = value;
     }
@@ -66,10 +54,9 @@
     @Override
     public int hashCode() {
         final int prime = 31;
-        int result = 1;
-        result = prime * result + ((name == null) ? 0 : name.hashCode());
-        result = prime * result + ((value == null) ? 0 : value.hashCode());
-        return Objects.hash(name, value);
+        int nameResult = prime + ((name == null) ? 0 : name.hashCode());
+        int valueResult = prime + ((value == null) ? 0 : value.hashCode());
+        return Objects.hash(nameResult, valueResult);
     }
 
     @Override
@@ -78,7 +65,6 @@
             VnfParameter other = (VnfParameter) obj;
             return Objects.equals(name, other.name) && Objects.equals(value, other.value);
         }
-
         return false;
     }
 
@@ -86,5 +72,4 @@
     public String toString() {
         return "VnfParameter [name=" + name + ", value=" + value + "]";
     }
-
 }
diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/GenericPnfDispatcher.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/GenericPnfDispatcher.java
new file mode 100644
index 0000000..72a8590
--- /dev/null
+++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/GenericPnfDispatcher.java
@@ -0,0 +1,174 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2020 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.bpmn.infrastructure.flowspecific.tasks;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.camunda.bpm.engine.delegate.DelegateExecution;
+import org.camunda.bpm.engine.delegate.JavaDelegate;
+import org.onap.aai.domain.yang.Pnf;
+import org.onap.so.bpmn.core.json.JsonUtils;
+import org.onap.so.bpmn.infrastructure.pnf.management.PnfManagement;
+import org.onap.so.client.exception.ExceptionBuilder;
+import org.onap.so.db.catalog.beans.PnfResourceCustomization;
+import org.onap.so.db.catalog.client.CatalogDbClient;
+import org.onap.so.serviceinstancebeans.RequestDetails;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import static org.onap.so.bpmn.infrastructure.pnf.delegate.ExecutionVariableNames.*;
+
+/**
+ * This implementation of {@link JavaDelegate} is used to populate the execution object for pnf actions
+ */
+@Component
+public class GenericPnfDispatcher implements JavaDelegate {
+
+    private final Logger logger = LoggerFactory.getLogger(getClass());
+    private static final String SERVICE_INSTANCE_NAME = "serviceInstanceName";
+    private static final String BPMN_REQUEST = "bpmnRequest";
+    private static final String RESOURCE_CUSTOMIZATION_UUID_PARAM = "resource_customization_uuid";
+    private static final String PNF_NAME = "pnfName";
+
+    // ERROR CODE for variable not found in the delegation Context
+    private static final int ERROR_CODE = 601;
+
+    @Autowired
+    private PnfManagement pnfManagement;
+
+    @Autowired
+    private ExceptionBuilder exceptionUtil;
+
+    @Autowired
+    private CatalogDbClient catalogDbClient;
+
+    @Autowired
+    private ObjectMapper mapper;
+
+    @Override
+    public void execute(DelegateExecution delegateExecution) throws Exception {
+        logger.debug("Running execute block for activity id: {}, name: {}", delegateExecution.getCurrentActivityId(),
+                delegateExecution.getCurrentActivityName());
+
+        RequestDetails bpmnRequestDetails = requestVerification(delegateExecution);
+
+        final String serviceInstanceName = bpmnRequestDetails.getRequestInfo().getInstanceName();
+        final String pnfName;
+        if (delegateExecution.getVariable(PNF_NAME) == null
+                || String.valueOf(delegateExecution.getVariable(PNF_NAME)).trim().isEmpty()) {
+            pnfName = bpmnRequestDetails.getRequestParameters().getUserParamValue(PNF_NAME);
+        } else {
+            pnfName = String.valueOf(delegateExecution.getVariable(PNF_NAME));
+        }
+        final String serviceModelUuid = bpmnRequestDetails.getModelInfo().getModelUuid();
+        final List<Map<String, Object>> userParams = bpmnRequestDetails.getRequestParameters().getUserParams();
+        final Pnf pnf = getPnfByPnfName(delegateExecution, pnfName);
+        final List<PnfResourceCustomization> pnfCustomizations =
+                getPnfResourceCustomizations(delegateExecution, serviceModelUuid);
+        final PnfResourceCustomization pnfResourceCustomization = pnfCustomizations.get(0);
+        final String payload = bpmnRequestDetails.getRequestParameters().getPayload();
+
+        populateExecution(delegateExecution, bpmnRequestDetails, pnfResourceCustomization, pnf, serviceInstanceName,
+                pnfName, serviceModelUuid, userParams, payload);
+
+        logger.trace("Completed dispatcher request for PNF.");
+    }
+
+    private RequestDetails requestVerification(DelegateExecution delegateExecution) throws IOException {
+        RequestDetails bpmnRequestDetails = mapper.readValue(
+                JsonUtils.getJsonValue(String.valueOf(delegateExecution.getVariable(BPMN_REQUEST)), "requestDetails"),
+                RequestDetails.class);
+
+        throwIfNull(delegateExecution, bpmnRequestDetails.getModelInfo(), SERVICE_MODEL_INFO);
+        throwIfNull(delegateExecution, bpmnRequestDetails.getRequestInfo(), "RequestInfo");
+        throwIfNull(delegateExecution, bpmnRequestDetails.getRequestParameters(), "RequestParameters");
+        throwIfNull(delegateExecution, bpmnRequestDetails.getRequestParameters().getUserParams(), "UserParams");
+
+        return bpmnRequestDetails;
+    }
+
+    private void populateExecution(DelegateExecution delegateExecution, RequestDetails bpmnRequestDetails,
+            PnfResourceCustomization pnfResourceCustomization, Pnf pnf, String serviceInstanceName, String pnfName,
+            String serviceModelUuid, List<Map<String, Object>> userParams, String payload) {
+
+        delegateExecution.setVariable(SERVICE_MODEL_INFO, bpmnRequestDetails.getModelInfo());
+        delegateExecution.setVariable(SERVICE_INSTANCE_NAME, serviceInstanceName);
+        delegateExecution.setVariable(PNF_CORRELATION_ID, pnfName);
+        delegateExecution.setVariable(MODEL_UUID, serviceModelUuid);
+        delegateExecution.setVariable(PNF_UUID, pnf.getPnfId());
+        delegateExecution.setVariable(PRC_BLUEPRINT_NAME, pnfResourceCustomization.getBlueprintName());
+        delegateExecution.setVariable(PRC_BLUEPRINT_VERSION, pnfResourceCustomization.getBlueprintVersion());
+        delegateExecution.setVariable(PRC_CUSTOMIZATION_UUID, pnfResourceCustomization.getModelCustomizationUUID());
+        delegateExecution.setVariable(RESOURCE_CUSTOMIZATION_UUID_PARAM,
+                pnfResourceCustomization.getModelCustomizationUUID());
+        delegateExecution.setVariable(PRC_INSTANCE_NAME, pnfResourceCustomization.getModelInstanceName());
+        delegateExecution.setVariable(PRC_CONTROLLER_ACTOR, pnfResourceCustomization.getControllerActor());
+
+        for (Map<String, Object> param : userParams) {
+            if (param.containsKey("name") && param.containsKey("value")) {
+                delegateExecution.setVariable(param.get("name").toString(), param.get("value").toString());
+            }
+        }
+
+        delegateExecution.setVariable(REQUEST_PAYLOAD, payload);
+    }
+
+    private Pnf getPnfByPnfName(DelegateExecution delegateExecution, String pnfName) {
+        Optional<Pnf> pnfOptional = Optional.empty();
+        try {
+            pnfOptional = pnfManagement.getEntryFor(pnfName);
+        } catch (IOException e) {
+            throwExceptionWithWarn(delegateExecution, "Unable to fetch from AAI" + e.getMessage());
+        }
+        if (!pnfOptional.isPresent()) {
+            throwExceptionWithWarn(delegateExecution, "AAI entry for PNF: " + pnfName + " does not exist");
+        }
+        return pnfOptional.get();
+    }
+
+    private List<PnfResourceCustomization> getPnfResourceCustomizations(DelegateExecution delegateExecution,
+            String serviceModelUuid) {
+        List<PnfResourceCustomization> pnfCustomizations =
+                catalogDbClient.getPnfResourceCustomizationByModelUuid(serviceModelUuid);
+
+        if (pnfCustomizations == null || pnfCustomizations.isEmpty()) {
+            throwExceptionWithWarn(delegateExecution,
+                    "Unable to find the PNF resource customizations of model service UUID:  " + serviceModelUuid);
+        }
+        return pnfCustomizations;
+    }
+
+    private void throwIfNull(DelegateExecution delegateExecution, Object obj, String param) {
+        if (obj == null) {
+            throwExceptionWithWarn(delegateExecution,
+                    "Unable to find the parameter: " + param + " in the execution context");
+        }
+    }
+
+    private void throwExceptionWithWarn(DelegateExecution delegateExecution, String exceptionMsg) {
+        logger.warn(exceptionMsg);
+        exceptionUtil.buildAndThrowWorkflowException(delegateExecution, ERROR_CODE, exceptionMsg);
+    }
+}
diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowAction.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowAction.java
index 803b244..9781f78 100644
--- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowAction.java
+++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowAction.java
@@ -37,6 +37,7 @@
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
+import org.apache.commons.lang3.SerializationUtils;
 import org.camunda.bpm.engine.delegate.DelegateExecution;
 import org.javatuples.Pair;
 import org.onap.aai.domain.yang.GenericVnf;
@@ -499,9 +500,8 @@
         return vnfcs;
     }
 
-    protected <T> List<T> getRelatedResourcesInVnfc(Vnfc vnfc, Class<T> resultClass, AAIObjectType type) {
-
-        List<T> configurations = new ArrayList<>();
+    protected <T> T getRelatedResourcesInVnfc(Vnfc vnfc, Class<T> resultClass, AAIObjectType type) throws Exception {
+        T configuration = null;
         AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.VNFC, vnfc.getVnfcName());
         AAIResultWrapper vnfcResultsWrapper = bbInputSetupUtils.getAAIResourceDepthOne(uri);
         Optional<Relationships> relationshipsOp = vnfcResultsWrapper.getRelationships();
@@ -511,12 +511,19 @@
             Relationships relationships = relationshipsOp.get();
             List<AAIResultWrapper> configurationResultWrappers =
                     this.getResultWrappersFromRelationships(relationships, type);
-            for (AAIResultWrapper configurationResultWrapper : configurationResultWrappers) {
-                Optional<T> configurationOp = configurationResultWrapper.asBean(resultClass);
-                configurationOp.ifPresent(configurations::add);
+            if (configurationResultWrappers.size() > 1) {
+                String multipleRelationshipsError =
+                        "Multiple relationships exist from VNFC " + vnfc.getVnfcName() + " to Configurations";
+                throw new Exception(multipleRelationshipsError);
+            }
+            if (!configurationResultWrappers.isEmpty()) {
+                Optional<T> configurationOp = configurationResultWrappers.get(0).asBean(resultClass);
+                if (configurationOp.isPresent()) {
+                    configuration = configurationOp.get();
+                }
             }
         }
-        return configurations;
+        return configuration;
     }
 
     protected List<AAIResultWrapper> getResultWrappersFromRelationships(Relationships relationships,
@@ -558,33 +565,26 @@
         List<org.onap.aai.domain.yang.Vnfc> vnfcs = getRelatedResourcesInVfModule(vnfId, vfModuleId,
                 org.onap.aai.domain.yang.Vnfc.class, AAIObjectType.VNFC);
         for (org.onap.aai.domain.yang.Vnfc vnfc : vnfcs) {
-            List<org.onap.aai.domain.yang.Configuration> configurations = getRelatedResourcesInVnfc(vnfc,
+            WorkflowResourceIds workflowIdsCopy = SerializationUtils.clone(dataObj.getWorkflowResourceIds());
+            org.onap.aai.domain.yang.Configuration configuration = getRelatedResourcesInVnfc(vnfc,
                     org.onap.aai.domain.yang.Configuration.class, AAIObjectType.CONFIGURATION);
-            if (configurations.size() > 1) {
-                String multipleRelationshipsError =
-                        "Multiple relationships exist from VNFC " + vnfc.getVnfcName() + " to Configurations";
-                buildAndThrowException(dataObj.getExecution(), "Exception in getConfigBuildingBlock: ",
-                        new Exception(multipleRelationshipsError));
-            }
-            for (org.onap.aai.domain.yang.Configuration configuration : configurations) {
-                dataObj.getWorkflowResourceIds().setConfigurationId(configuration.getConfigurationId());
-                for (OrchestrationFlow orchFlow : result) {
-                    dataObj.getResourceKey().setVfModuleCustomizationId(vfModuleCustomizationUUID);
-                    dataObj.getResourceKey().setCvnfModuleCustomizationId(vnfc.getModelCustomizationId());
-                    dataObj.getResourceKey().setVnfCustomizationId(vnfCustomizationUUID);
-                    String vnfcName = getVnfcNameForConfiguration(configuration);
-                    if (vnfcName == null || vnfcName.isEmpty()) {
-                        buildAndThrowException(dataObj.getExecution(), "Exception in create execution list "
-                                + ": VnfcName does not exist or is null while there is a configuration for the vfModule",
-                                new Exception("Vnfc and Configuration do not match"));
-                    }
-                    ExecuteBuildingBlock ebb =
-                            buildExecuteBuildingBlock(orchFlow, dataObj.getRequestId(), dataObj.getResourceKey(),
-                                    dataObj.getApiVersion(), dataObj.getResourceId(), dataObj.getRequestAction(),
-                                    dataObj.isaLaCarte(), dataObj.getVnfType(), dataObj.getWorkflowResourceIds(),
-                                    dataObj.getRequestDetails(), false, null, vnfcName, true, null);
-                    flowsToExecuteConfigs.add(ebb);
+            workflowIdsCopy.setConfigurationId(configuration.getConfigurationId());
+            for (OrchestrationFlow orchFlow : result) {
+                dataObj.getResourceKey().setVfModuleCustomizationId(vfModuleCustomizationUUID);
+                dataObj.getResourceKey().setCvnfModuleCustomizationId(vnfc.getModelCustomizationId());
+                dataObj.getResourceKey().setVnfCustomizationId(vnfCustomizationUUID);
+                String vnfcName = vnfc.getVnfcName();
+                if (vnfcName == null || vnfcName.isEmpty()) {
+                    buildAndThrowException(dataObj.getExecution(), "Exception in create execution list "
+                            + ": VnfcName does not exist or is null while there is a configuration for the vfModule",
+                            new Exception("Vnfc and Configuration do not match"));
                 }
+                ExecuteBuildingBlock ebb = buildExecuteBuildingBlock(orchFlow, dataObj.getRequestId(),
+                        dataObj.getResourceKey(), dataObj.getApiVersion(), dataObj.getResourceId(),
+                        dataObj.getRequestAction(), dataObj.isaLaCarte(), dataObj.getVnfType(), workflowIdsCopy,
+                        dataObj.getRequestDetails(), false, null, vnfcName, true, null);
+                flowsToExecuteConfigs.add(ebb);
+
             }
         }
         return flowsToExecuteConfigs;
@@ -652,23 +652,6 @@
         return orchFlows;
     }
 
-    protected String getVnfcNameForConfiguration(org.onap.aai.domain.yang.Configuration configuration) {
-        AAIResultWrapper wrapper = new AAIResultWrapper(configuration);
-        Optional<Relationships> relationshipsOp = wrapper.getRelationships();
-        if (!relationshipsOp.isPresent()) {
-            logger.debug("No relationships were found for Configuration in AAI");
-            return null;
-        }
-        Relationships relationships = relationshipsOp.get();
-        List<AAIResultWrapper> vnfcResultWrappers = relationships.getByType(AAIObjectType.VNFC);
-        if (vnfcResultWrappers.size() != 1) {
-            logger.debug("Too many vnfcs or no vnfc found that are related to configuration");
-        }
-        Optional<Vnfc> vnfcOp = vnfcResultWrappers.get(0).asBean(Vnfc.class);
-        return vnfcOp.map(Vnfc::getVnfcName).orElse(null);
-
-    }
-
     protected List<Resource> sortVfModulesByBaseFirst(List<Resource> vfModuleResources) {
         int count = 0;
         for (Resource resource : vfModuleResources) {
@@ -992,6 +975,7 @@
                     bbInputSetup.getExistingServiceInstance(serviceInstanceAAI);
             resourceList.add(new Resource(WorkflowType.SERVICE, serviceInstanceMSO.getServiceInstanceId(), false));
             traverseServiceInstanceMSOVnfs(resourceList, aaiResourceIds, serviceInstanceMSO);
+            traverseServiceInstanceMSOPnfs(resourceList, aaiResourceIds, serviceInstanceMSO);
             if (serviceInstanceMSO.getNetworks() != null) {
                 for (org.onap.so.bpmn.servicedecomposition.bbobjects.L3Network network : serviceInstanceMSO
                         .getNetworks()) {
@@ -1049,6 +1033,18 @@
         }
     }
 
+    private void traverseServiceInstanceMSOPnfs(List<Resource> resourceList,
+            List<Pair<WorkflowType, String>> aaiResourceIds,
+            org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance serviceInstanceMSO) {
+        if (serviceInstanceMSO.getPnfs() == null) {
+            return;
+        }
+        for (org.onap.so.bpmn.servicedecomposition.bbobjects.Pnf pnf : serviceInstanceMSO.getPnfs()) {
+            aaiResourceIds.add(new Pair<>(WorkflowType.PNF, pnf.getPnfId()));
+            resourceList.add(new Resource(WorkflowType.PNF, pnf.getPnfId(), false));
+        }
+    }
+
     private void traverseVnfModules(List<Resource> resourceList, List<Pair<WorkflowType, String>> aaiResourceIds,
             org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf vnf) {
         if (vnf.getVfModules() == null) {
diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionBBTasks.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionBBTasks.java
index 343b25e..7420df1 100644
--- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionBBTasks.java
+++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionBBTasks.java
@@ -334,6 +334,7 @@
                             && !rollbackFlow.getBuildingBlock().getBpmnFlowName().contains("FabricConfiguration")) {
                         rollbackFlowsFiltered.remove(rollbackFlow);
                     } else if (rollbackFlow.getBuildingBlock().getBpmnFlowName().contains("Delete")
+                            && !rollbackFlow.getBuildingBlock().getBpmnFlowName().contains("FabricConfiguration")
                             && ROLLBACKTOCREATED.equals(handlingCode)) {
                         rollbackFlowsFiltered.remove(rollbackFlow);
                     }
@@ -458,11 +459,10 @@
         }
     }
 
-    protected String getConfigurationId(Vnfc vnfc) {
-        List<Configuration> configurations =
+    protected String getConfigurationId(Vnfc vnfc) throws Exception {
+        Configuration configuration =
                 workflowAction.getRelatedResourcesInVnfc(vnfc, Configuration.class, AAIObjectType.CONFIGURATION);
-        if (!configurations.isEmpty()) {
-            Configuration configuration = configurations.get(0);
+        if (configuration != null) {
             return configuration.getConfigurationId();
         } else {
             return UUID.randomUUID().toString();
diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/listeners/HomingListener.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/listeners/HomingListener.java
index 6254aae..bc32489 100644
--- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/listeners/HomingListener.java
+++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/listeners/HomingListener.java
@@ -39,13 +39,12 @@
     public void run(List<ExecuteBuildingBlock> flowsToExecute, ExecuteBuildingBlock currentBB,
             BuildingBlockExecution execution) {
 
-        boolean homing = (boolean) execution.getVariable("homing");
-        boolean calledHoming = (boolean) execution.getVariable("calledHoming");
+        boolean homing = execution.getVariable("homing");
+        boolean calledHoming = execution.getVariable("calledHoming");
         if (homing && !calledHoming) {
             currentBB.setHoming(true);
             execution.setVariable("calledHoming", true);
         }
     }
 
-
 }
diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/AAIPnfResources.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/AAIPnfResources.java
index 3b22cd9..3da1719 100644
--- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/AAIPnfResources.java
+++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/AAIPnfResources.java
@@ -22,6 +22,7 @@
 
 import com.google.common.base.Strings;
 import java.util.Optional;
+import org.apache.commons.lang3.StringUtils;
 import org.onap.aai.domain.yang.RelatedToProperty;
 import org.onap.aai.domain.yang.Relationship;
 import org.onap.aai.domain.yang.RelationshipData;
@@ -68,11 +69,39 @@
         injectionHelper.getAaiClient().update(pnfURI, aaiObjectMapper.mapPnf(pnfCopy));
     }
 
-    public void checkIfPnfExistsInAaiAndCanBeUsed(String pnfName) throws Exception {
-        Optional<org.onap.aai.domain.yang.Pnf> pnfFromAai = injectionHelper.getAaiClient()
-                .get(org.onap.aai.domain.yang.Pnf.class, AAIUriFactory.createResourceUri(AAIObjectType.PNF, pnfName));
+    public void checkIfPnfExistsInAaiAndCanBeUsed(Pnf pnf) throws Exception {
+        Optional<org.onap.aai.domain.yang.Pnf> pnfFromAai =
+                injectionHelper.getAaiClient().get(org.onap.aai.domain.yang.Pnf.class,
+                        AAIUriFactory.createResourceUri(AAIObjectType.PNF, pnf.getPnfName()));
         if (pnfFromAai.isPresent()) {
             checkIfPnfCanBeUsed(pnfFromAai.get());
+            updatePnfInAAI(pnf, pnfFromAai.get());
+        }
+    }
+
+    private void updatePnfInAAI(Pnf pnf, org.onap.aai.domain.yang.Pnf pnfFromAai) {
+        updatePnfFields(pnf, pnfFromAai);
+        injectionHelper.getAaiClient().update(AAIUriFactory.createResourceUri(AAIObjectType.PNF, pnf.getPnfName()),
+                pnfFromAai);
+        logger.debug("updatePnfInAAI: {}", pnfFromAai);
+    }
+
+    private void updatePnfFields(Pnf pnf, org.onap.aai.domain.yang.Pnf pnfFromAai) {
+        if (pnf.getModelInfoPnf() != null
+                && StringUtils.isNotBlank(pnf.getModelInfoPnf().getModelCustomizationUuid())) {
+            pnfFromAai.setModelCustomizationId(pnf.getModelInfoPnf().getModelCustomizationUuid());
+        }
+        if (pnf.getModelInfoPnf() != null && StringUtils.isNotBlank(pnf.getModelInfoPnf().getModelInvariantUuid())) {
+            pnfFromAai.setModelInvariantId(pnf.getModelInfoPnf().getModelInvariantUuid());
+        }
+        if (pnf.getModelInfoPnf() != null && StringUtils.isNotBlank(pnf.getModelInfoPnf().getModelUuid())) {
+            pnfFromAai.setModelVersionId(pnf.getModelInfoPnf().getModelUuid());
+        }
+        if (pnf.getOrchestrationStatus() != null && StringUtils.isNotBlank(pnf.getOrchestrationStatus().toString())) {
+            pnfFromAai.setOrchestrationStatus(pnf.getOrchestrationStatus().toString());
+        }
+        if (StringUtils.isNotBlank(pnf.getRole())) {
+            pnfFromAai.setNfRole(pnf.getRole());
         }
     }
 
diff --git a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAIUpdateTasksTest.java b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAIUpdateTasksTest.java
index a7dfe7f..28d2abc 100644
--- a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAIUpdateTasksTest.java
+++ b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAIUpdateTasksTest.java
@@ -161,6 +161,26 @@
     }
 
     @Test
+    public void updateOrchestrationStatusInventoriedPnfTest() throws Exception {
+        Pnf pnf = preparePnfAndExtractForPnf();
+        doNothing().when(aaiPnfResources).updateOrchestrationStatusPnf(pnf, OrchestrationStatus.INVENTORIED);
+
+        aaiUpdateTasks.updateOrchestrationStatusInventoriedPnf(execution);
+
+        verify(aaiPnfResources, times(1)).updateOrchestrationStatusPnf(pnf, OrchestrationStatus.INVENTORIED);
+    }
+
+    @Test
+    public void updateOrchestrationStatusInventoriedPnfExceptionTest() throws Exception {
+        Pnf pnf = preparePnfAndExtractForPnf();
+        doThrow(RuntimeException.class).when(aaiPnfResources).updateOrchestrationStatusPnf(pnf,
+                OrchestrationStatus.INVENTORIED);
+
+        expectedException.expect(BpmnError.class);
+        aaiUpdateTasks.updateOrchestrationStatusInventoriedPnf(execution);
+    }
+
+    @Test
     public void updateOrchestrationStatusActivePnfTest() throws Exception {
         Pnf pnf = preparePnfAndExtractForPnf();
         doNothing().when(aaiPnfResources).updateOrchestrationStatusPnf(pnf, OrchestrationStatus.ACTIVE);
diff --git a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionBBTasksTest.java b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionBBTasksTest.java
index 1aa7640..a7ee89f 100644
--- a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionBBTasksTest.java
+++ b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionBBTasksTest.java
@@ -400,6 +400,42 @@
     }
 
     @Test
+    public void rollbackExecutionRollbackToCreatedWithFabricTest() {
+        execution.setVariable("isRollback", false);
+        execution.setVariable("handlingCode", "RollbackToCreated");
+        execution.setVariable("requestAction", EMPTY_STRING);
+        execution.setVariable("resourceName", EMPTY_STRING);
+        List<ExecuteBuildingBlock> flowsToExecute = new ArrayList<>();
+
+        BuildingBlock buildingBlock1 = new BuildingBlock().setBpmnFlowName("AssignVfModuleBB");
+        ExecuteBuildingBlock ebb1 = new ExecuteBuildingBlock().setBuildingBlock(buildingBlock1);
+        flowsToExecute.add(ebb1);
+
+        BuildingBlock buildingBlock2 = new BuildingBlock().setBpmnFlowName("CreateVfModuleBB");
+        ExecuteBuildingBlock ebb2 = new ExecuteBuildingBlock().setBuildingBlock(buildingBlock2);
+        flowsToExecute.add(ebb2);
+
+        BuildingBlock buildingBlock3 = new BuildingBlock().setBpmnFlowName("ActivateVfModuleBB");
+        ExecuteBuildingBlock ebb3 = new ExecuteBuildingBlock().setBuildingBlock(buildingBlock3);
+        flowsToExecute.add(ebb3);
+
+        BuildingBlock buildingBlock4 = new BuildingBlock().setBpmnFlowName("AddFabricConfigurationBB");
+        ExecuteBuildingBlock ebb4 = new ExecuteBuildingBlock().setBuildingBlock(buildingBlock4);
+        flowsToExecute.add(ebb4);
+
+        execution.setVariable("flowsToExecute", flowsToExecute);
+        execution.setVariable("gCurrentSequence", 4);
+
+        workflowActionBBTasks.rollbackExecutionPath(execution);
+        List<ExecuteBuildingBlock> ebbs = (List<ExecuteBuildingBlock>) execution.getVariable("flowsToExecute");
+        assertEquals(0, execution.getVariable("gCurrentSequence"));
+        assertEquals(2, ebbs.size());
+        assertEquals("DeleteFabricConfigurationBB", ebbs.get(0).getBuildingBlock().getBpmnFlowName());
+        assertEquals("DeactivateVfModuleBB", ebbs.get(1).getBuildingBlock().getBpmnFlowName());
+
+    }
+
+    @Test
     public void rollbackExecutionRollbackToCreatedTest() {
         execution.setVariable("isRollback", false);
         execution.setVariable("handlingCode", "RollbackToCreated");
@@ -642,7 +678,7 @@
     }
 
     @Test
-    public void getConfigurationId() {
+    public void getConfigurationId() throws Exception {
         org.onap.aai.domain.yang.Vnfc vnfc = new org.onap.aai.domain.yang.Vnfc();
         vnfc.setModelInvariantId("modelInvariantId");
         vnfc.setVnfcName("testVnfcName");
diff --git a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionTest.java b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionTest.java
index 8f10456..407a844 100644
--- a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionTest.java
+++ b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionTest.java
@@ -43,6 +43,7 @@
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.when;
+import com.fasterxml.jackson.databind.DeserializationFeature;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import java.io.IOException;
 import java.net.MalformedURLException;
@@ -116,6 +117,15 @@
 
 public class WorkflowActionTest extends BaseTaskTest {
 
+    private static final String MACRO_ACTIVATE_DELETE_UNASSIGN_JSON = "Macro/ServiceMacroActivateDeleteUnassign.json";
+    private static final String MACRO_ASSIGN_JSON = "Macro/ServiceMacroAssign.json";
+    private static final String MACRO_ASSIGN_NO_CLOUD_JSON = "Macro/ServiceMacroAssignNoCloud.json";
+    private static final String VF_MODULE_CREATE_WITH_FABRIC_JSON = "VfModuleCreateWithFabric.json";
+    private static final String VF_MODULE_REPLACE_REBUILD_VOLUME_GROUPS_JSON =
+            "VfModuleReplaceRebuildVolumeGroups.json";
+    private static final String MACRO_CREATE_NETWORK_COLLECTION_JSON = "Macro/CreateNetworkCollection.json";
+    private static final String MACRO_VNF_MACRO_REPLACE_JSON = "Macro/VnfMacroReplace.json";
+
     @Mock
     protected Environment environment;
     @InjectMocks
@@ -163,13 +173,8 @@
     public void selectExecutionListALaCarteNetworkCreateTest() throws Exception {
         String gAction = "createInstance";
         String resource = "Network";
-        execution.setVariable("mso-request-id", "00f704ca-c5e5-4f95-a72c-6889db7b0688");
-        execution.setVariable("requestAction", gAction);
-        String bpmnRequest =
-                new String(Files.readAllBytes(Paths.get("src/test/resources/__files/Macro/ServiceMacroAssign.json")));
-        execution.setVariable("bpmnRequest", bpmnRequest);
-        execution.setVariable("aLaCarte", true);
-        execution.setVariable("apiVersion", "7");
+        String bpmnRequest = readBpmnRequestFromFile(MACRO_ASSIGN_JSON);
+        initExecution(gAction, bpmnRequest, true);
         execution.setVariable("requestUri", "v6/networks/123");
 
         NorthBoundRequest northBoundRequest = new NorthBoundRequest();
@@ -188,13 +193,8 @@
     public void selectExecutionListALaCarteNetworkDeleteTest() throws Exception {
         String gAction = "deleteInstance";
         String resource = "Network";
-        execution.setVariable("mso-request-id", "00f704ca-c5e5-4f95-a72c-6889db7b0688");
-        execution.setVariable("requestAction", gAction);
-        String bpmnRequest =
-                new String(Files.readAllBytes(Paths.get("src/test/resources/__files/Macro/ServiceMacroAssign.json")));
-        execution.setVariable("bpmnRequest", bpmnRequest);
-        execution.setVariable("aLaCarte", true);
-        execution.setVariable("apiVersion", "7");
+        String bpmnRequest = readBpmnRequestFromFile(MACRO_ASSIGN_JSON);
+        initExecution(gAction, bpmnRequest, true);
         execution.setVariable("requestUri", "v6/networks/123");
 
         NorthBoundRequest northBoundRequest = new NorthBoundRequest();
@@ -213,13 +213,8 @@
     public void selectExecutionListALaCarteServiceCreateTest() throws Exception {
         String gAction = "createInstance";
         String resource = "Service";
-        execution.setVariable("mso-request-id", "00f704ca-c5e5-4f95-a72c-6889db7b0688");
-        execution.setVariable("requestAction", gAction);
-        String bpmnRequest =
-                new String(Files.readAllBytes(Paths.get("src/test/resources/__files/Macro/ServiceMacroAssign.json")));
-        execution.setVariable("bpmnRequest", bpmnRequest);
-        execution.setVariable("aLaCarte", true);
-        execution.setVariable("apiVersion", "7");
+        String bpmnRequest = readBpmnRequestFromFile(MACRO_ASSIGN_JSON);
+        initExecution(gAction, bpmnRequest, true);
         execution.setVariable("requestUri", "v6/serviceInstances/123");
 
 
@@ -235,87 +230,11 @@
     }
 
     @Test
-    public void selectExecutionListExceptionAlreadyBuiltTest() throws Exception {
-        DelegateExecution delegateExecution = new DelegateExecutionFake();
-        String gAction = "deleteInstance";
-        String resource = "VfModule";
-        delegateExecution.setVariable("mso-request-id", "00f704ca-c5e5-4f95-a72c-6889db7b0688");
-        delegateExecution.setVariable("requestAction", gAction);
-        String bpmnRequest =
-                new String(Files.readAllBytes(Paths.get("src/test/resources/__files/VfModuleCreateWithFabric.json")));
-        delegateExecution.setVariable("bpmnRequest", bpmnRequest);
-        delegateExecution.setVariable("aLaCarte", true);
-        delegateExecution.setVariable("apiVersion", "7");
-        delegateExecution.setVariable("requestUri",
-                "v7/serviceInstances/f647e3ef-6d2e-4cd3-bff4-8df4634208de/vnfs/b80b16a5-f80d-4ffa-91c8-bd47c7438a3d/vfModules");
-
-        NorthBoundRequest northBoundRequest = new NorthBoundRequest();
-        List<OrchestrationFlow> orchFlows = createFlowList("DeactivateVfModuleBB", "DeleteVfModuleBB",
-                "UnassignVfModuleBB", "DeactivateFabricConfigurationBB", "UnassignFabricConfigurationBB");
-        northBoundRequest.setOrchestrationFlowList(orchFlows);
-
-        when(catalogDbClient.getNorthBoundRequestByActionAndIsALaCarteAndRequestScopeAndCloudOwner(gAction, resource,
-                true, "my-custom-cloud-owner")).thenReturn(northBoundRequest);
-
-        doAnswer(invocation -> {
-            DelegateExecutionFake execution = invocation.getArgument(0);
-            execution.setVariable("WorkflowException", "exception");
-            execution.setVariable("WorkflowExceptionErrorMessage", "errorMessage");
-            throw new BpmnError("WorkflowException");
-        }).when(exceptionUtil).buildAndThrowWorkflowException(delegateExecution, 7000,
-                "Exception in getConfigBuildingBlock: Multiple relationships exist from VNFC testVnfcName to Configurations");
-
-
-        org.onap.aai.domain.yang.GenericVnf vnf = new org.onap.aai.domain.yang.GenericVnf();
-        vnf.setVnfId("vnf0");
-        vnf.setModelCustomizationId("modelCustomizationId");
-        when(bbSetupUtils.getAAIGenericVnf(any())).thenReturn(vnf);
-
-        org.onap.aai.domain.yang.VfModule vfModule = new org.onap.aai.domain.yang.VfModule();
-        vfModule.setModelCustomizationId("modelCustomizationId");
-        when(bbSetupUtils.getAAIVfModule(any(), any())).thenReturn(vfModule);
-
-        List<org.onap.aai.domain.yang.Vnfc> vnfcs = new ArrayList<org.onap.aai.domain.yang.Vnfc>();
-        org.onap.aai.domain.yang.Vnfc vnfc = new org.onap.aai.domain.yang.Vnfc();
-        vnfc.setModelInvariantId("modelInvariantId");
-        vnfc.setVnfcName("testVnfcName");
-        vnfcs.add(vnfc);
-        doReturn(vnfcs).when(SPY_workflowAction).getRelatedResourcesInVfModule(any(), any(), any(), any());
-
-        List<org.onap.aai.domain.yang.Configuration> configurations =
-                new ArrayList<org.onap.aai.domain.yang.Configuration>();
-        org.onap.aai.domain.yang.Configuration configuration = new org.onap.aai.domain.yang.Configuration();
-        configuration.setConfigurationId("configurationId");
-        configuration.setModelCustomizationId("modelCustimizationId");
-        configuration.setConfigurationName("testConfigurationName");
-        configurations.add(configuration);
-        org.onap.aai.domain.yang.Configuration configuration1 = new org.onap.aai.domain.yang.Configuration();
-        configuration1.setConfigurationId("configurationId");
-        configuration1.setModelCustomizationId("modelCustimizationId");
-        configuration1.setConfigurationName("testConfigurationName");
-        configurations.add(configuration1);
-        doReturn(configurations).when(SPY_workflowAction).getRelatedResourcesInVnfc(any(), any(), any());
-
-        doReturn("testName").when(SPY_workflowAction).getVnfcNameForConfiguration(any());
-
-        thrown.expect(BpmnError.class);
-        SPY_workflowAction.selectExecutionList(delegateExecution);
-        assertEquals(
-                "Exception in getConfigBuildingBlock: Multiple relationships exist from VNFC testVnfcName to Configurations",
-                delegateExecution.getVariable("WorkflowException"));
-    }
-
-    @Test
     public void selectExecutionListDuplicateNameExceptionTest() throws Exception {
         String gAction = "createInstance";
-        execution.setVariable("mso-request-id", "00f704ca-c5e5-4f95-a72c-6889db7b0688");
-        String bpmnRequest =
-                new String(Files.readAllBytes(Paths.get("src/test/resources/__files/Macro/ServiceMacroAssign.json")));
-        execution.setVariable("bpmnRequest", bpmnRequest);
-        execution.setVariable("aLaCarte", true);
-        execution.setVariable("apiVersion", "7");
+        String bpmnRequest = readBpmnRequestFromFile(MACRO_ASSIGN_JSON);
+        initExecution(gAction, bpmnRequest, true);
         execution.setVariable("requestUri", "v6/serviceInstances");
-        execution.setVariable("requestAction", gAction);
 
         doThrow(new DuplicateNameException(
                 "serviceInstance with name (instanceName) and different version id (3c40d244-808e-42ca-b09a-256d83d19d0a) already exists. The name must be unique."))
@@ -334,16 +253,10 @@
     public void selectExecutionListServiceMacroAssignTest() throws Exception {
         String gAction = "assignInstance";
         String resource = "Service";
-        execution.setVariable("mso-request-id", "00f704ca-c5e5-4f95-a72c-6889db7b0688");
-        execution.setVariable("requestAction", gAction);
-        String bpmnRequest =
-                new String(Files.readAllBytes(Paths.get("src/test/resources/__files/Macro/ServiceMacroAssign.json")));
-        execution.setVariable("bpmnRequest", bpmnRequest);
-        execution.setVariable("aLaCarte", false);
-        execution.setVariable("apiVersion", "7");
+        String bpmnRequest = readBpmnRequestFromFile(MACRO_ASSIGN_JSON);
+        initExecution(gAction, bpmnRequest, false);
         execution.setVariable("requestUri", "v6/serviceInstances/123");
 
-
         NorthBoundRequest northBoundRequest = new NorthBoundRequest();
         List<OrchestrationFlow> orchFlows = createFlowList("AssignServiceInstanceBB", "AssignNetworkBB", "AssignVnfBB",
                 "AssignVolumeGroupBB", "AssignVfModuleBB");
@@ -388,16 +301,10 @@
     public void selectExecutionListServiceMacroAssignNoCloudTest() throws Exception {
         String gAction = "assignInstance";
         String resource = "Service";
-        execution.setVariable("mso-request-id", "00f704ca-c5e5-4f95-a72c-6889db7b0688");
-        execution.setVariable("requestAction", gAction);
-        String bpmnRequest = new String(
-                Files.readAllBytes(Paths.get("src/test/resources/__files/Macro/ServiceMacroAssignNoCloud.json")));
-        execution.setVariable("bpmnRequest", bpmnRequest);
-        execution.setVariable("aLaCarte", false);
-        execution.setVariable("apiVersion", "7");
+        String bpmnRequest = readBpmnRequestFromFile(MACRO_ASSIGN_NO_CLOUD_JSON);
+        initExecution(gAction, bpmnRequest, false);
         execution.setVariable("requestUri", "v6/serviceInstances/123");
 
-
         NorthBoundRequest northBoundRequest = new NorthBoundRequest();
         List<OrchestrationFlow> orchFlows = createFlowList("AssignServiceInstanceBB", "AssignNetworkBB", "AssignVnfBB",
                 "AssignVolumeGroupBB", "AssignVfModuleBB");
@@ -443,16 +350,10 @@
     public void selectExecutionListServiceMacroActivateTest() throws Exception {
         String gAction = "activateInstance";
         String resource = "Service";
-        execution.setVariable("mso-request-id", "00f704ca-c5e5-4f95-a72c-6889db7b0688");
-        execution.setVariable("requestAction", gAction);
-        String bpmnRequest = new String(Files
-                .readAllBytes(Paths.get("src/test/resources/__files/Macro/ServiceMacroActivateDeleteUnassign.json")));
-        execution.setVariable("bpmnRequest", bpmnRequest);
-        execution.setVariable("aLaCarte", false);
-        execution.setVariable("apiVersion", "7");
+        String bpmnRequest = readBpmnRequestFromFile(MACRO_ACTIVATE_DELETE_UNASSIGN_JSON);
+        initExecution(gAction, bpmnRequest, false);
         execution.setVariable("requestUri", "v6/serviceInstances/si0");
 
-
         NorthBoundRequest northBoundRequest = new NorthBoundRequest();
         List<OrchestrationFlow> orchFlows =
                 createFlowList("CreateNetworkBB", "ActivateNetworkBB", "CreateVolumeGroupBB", "ActivateVolumeGroupBB",
@@ -467,7 +368,6 @@
                 new org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf();
         vnf.setVnfId("vnf0");
 
-
         org.onap.so.bpmn.servicedecomposition.bbobjects.VfModule vfModule = buildVfModule();
         vnf.getVfModules().add(vfModule);
         org.onap.so.bpmn.servicedecomposition.bbobjects.VfModule vfModule2 = buildVfModule();
@@ -497,23 +397,16 @@
         assertEquals("testVfModuleId2", ebbs.get(5).getWorkflowResourceIds().getVfModuleId());
         assertEquals("vnf0", ebbs.get(6).getWorkflowResourceIds().getVnfId());
         assertEquals("si0", ebbs.get(7).getWorkflowResourceIds().getServiceInstanceId());
-
     }
 
     @Test
     public void selectExecutionListServiceMacroDeactivateTest() throws Exception {
         String gAction = "deactivateInstance";
         String resource = "Service";
-        execution.setVariable("mso-request-id", "00f704ca-c5e5-4f95-a72c-6889db7b0688");
-        execution.setVariable("requestAction", gAction);
-        String bpmnRequest = new String(Files
-                .readAllBytes(Paths.get("src/test/resources/__files/Macro/ServiceMacroActivateDeleteUnassign.json")));
-        execution.setVariable("bpmnRequest", bpmnRequest);
-        execution.setVariable("aLaCarte", false);
-        execution.setVariable("apiVersion", "7");
+        String bpmnRequest = readBpmnRequestFromFile(MACRO_ACTIVATE_DELETE_UNASSIGN_JSON);
+        initExecution(gAction, bpmnRequest, false);
         execution.setVariable("requestUri", "v6/serviceInstances/123");
 
-
         NorthBoundRequest northBoundRequest = new NorthBoundRequest();
         List<OrchestrationFlow> orchFlows = createFlowList("DeactivateServiceInstanceBB");
         northBoundRequest.setOrchestrationFlowList(orchFlows);
@@ -529,16 +422,10 @@
     public void selectExecutionListServiceMacroEmptyServiceTest() throws Exception {
         String gAction = "createInstance";
         String resource = "Service";
-        execution.setVariable("mso-request-id", "00f704ca-c5e5-4f95-a72c-6889db7b0688");
-        execution.setVariable("requestAction", gAction);
-        String bpmnRequest = new String(Files
-                .readAllBytes(Paths.get("src/test/resources/__files/Macro/ServiceMacroActivateDeleteUnassign.json")));
-        execution.setVariable("bpmnRequest", bpmnRequest);
-        execution.setVariable("aLaCarte", false);
-        execution.setVariable("apiVersion", "7");
+        String bpmnRequest = readBpmnRequestFromFile(MACRO_ACTIVATE_DELETE_UNASSIGN_JSON);
+        initExecution(gAction, bpmnRequest, false);
         execution.setVariable("requestUri", "v6/serviceInstances/123");
 
-
         NorthBoundRequest northBoundRequest = new NorthBoundRequest();
         northBoundRequest.setIsToplevelflow(true);
         List<OrchestrationFlow> orchFlows = createFlowList("AssignServiceInstanceBB", "CreateNetworkCollectionBB",
@@ -561,16 +448,10 @@
     public void selectExecutionListServiceMacroCreateJustNetworkTest() throws Exception {
         String gAction = "createInstance";
         String resource = "Service";
-        execution.setVariable("mso-request-id", "00f704ca-c5e5-4f95-a72c-6889db7b0688");
-        execution.setVariable("requestAction", gAction);
-        String bpmnRequest = new String(Files
-                .readAllBytes(Paths.get("src/test/resources/__files/Macro/ServiceMacroActivateDeleteUnassign.json")));
-        execution.setVariable("bpmnRequest", bpmnRequest);
-        execution.setVariable("aLaCarte", false);
-        execution.setVariable("apiVersion", "7");
+        String bpmnRequest = readBpmnRequestFromFile(MACRO_ACTIVATE_DELETE_UNASSIGN_JSON);
+        initExecution(gAction, bpmnRequest, false);
         execution.setVariable("requestUri", "v6/serviceInstances/123");
 
-
         NorthBoundRequest northBoundRequest = new NorthBoundRequest();
         northBoundRequest.setIsToplevelflow(true);
         List<OrchestrationFlow> orchFlows = createFlowList("AssignServiceInstanceBB", "CreateNetworkCollectionBB",
@@ -597,16 +478,10 @@
     public void selectExecutionListServiceMacroCreateWithNetworkCollectionTest() throws Exception {
         String gAction = "createInstance";
         String resource = "Service";
-        execution.setVariable("mso-request-id", "00f704ca-c5e5-4f95-a72c-6889db7b0688");
-        execution.setVariable("requestAction", gAction);
-        String bpmnRequest = new String(Files
-                .readAllBytes(Paths.get("src/test/resources/__files/Macro/ServiceMacroActivateDeleteUnassign.json")));
-        execution.setVariable("bpmnRequest", bpmnRequest);
-        execution.setVariable("aLaCarte", false);
-        execution.setVariable("apiVersion", "7");
+        String bpmnRequest = readBpmnRequestFromFile(MACRO_ACTIVATE_DELETE_UNASSIGN_JSON);
+        initExecution(gAction, bpmnRequest, false);
         execution.setVariable("requestUri", "v6/serviceInstances/123");
 
-
         NorthBoundRequest northBoundRequest = new NorthBoundRequest();
         northBoundRequest.setIsToplevelflow(true);
         List<OrchestrationFlow> orchFlows = createFlowList("AssignServiceInstanceBB", "CreateNetworkCollectionBB",
@@ -692,16 +567,10 @@
     public void selectExecutionListServiceMacroCreateWithUserParams() throws Exception {
         String gAction = "createInstance";
         String resource = "Service";
-        execution.setVariable("mso-request-id", "00f704ca-c5e5-4f95-a72c-6889db7b0688");
-        execution.setVariable("requestAction", gAction);
-        String bpmnRequest =
-                new String(Files.readAllBytes(Paths.get("src/test/resources/__files/Macro/ServiceMacroAssign.json")));
-        execution.setVariable("bpmnRequest", bpmnRequest);
-        execution.setVariable("aLaCarte", false);
-        execution.setVariable("apiVersion", "7");
+        String bpmnRequest = readBpmnRequestFromFile(MACRO_ASSIGN_JSON);
+        initExecution(gAction, bpmnRequest, false);
         execution.setVariable("requestUri", "v6/serviceInstances/123");
 
-
         NorthBoundRequest northBoundRequest = new NorthBoundRequest();
         List<OrchestrationFlow> orchFlows = createFlowList("AssignServiceInstanceBB", "CreateNetworkCollectionBB",
                 "AssignNetworkBB", "AssignVnfBB", "AssignVolumeGroupBB", "AssignVfModuleBB", "CreateNetworkBB",
@@ -774,21 +643,16 @@
     public void selectExecutionListServiceMacroDeleteTest() throws Exception {
         String gAction = "deleteInstance";
         String resource = "Service";
-        execution.setVariable("mso-request-id", "00f704ca-c5e5-4f95-a72c-6889db7b0688");
-        execution.setVariable("requestAction", gAction);
-        String bpmnRequest = new String(Files
-                .readAllBytes(Paths.get("src/test/resources/__files/Macro/ServiceMacroActivateDeleteUnassign.json")));
-        execution.setVariable("bpmnRequest", bpmnRequest);
-        execution.setVariable("aLaCarte", false);
-        execution.setVariable("apiVersion", "7");
+        String bpmnRequest = readBpmnRequestFromFile(MACRO_ACTIVATE_DELETE_UNASSIGN_JSON);
+        initExecution(gAction, bpmnRequest, false);
         execution.setVariable("requestUri", "v6/serviceInstances/123");
 
-
         NorthBoundRequest northBoundRequest = new NorthBoundRequest();
         List<OrchestrationFlow> orchFlows = createFlowList("DeactivateVfModuleBB", "DeleteVfModuleBB",
-                "DeactivateVolumeGroupBB", "DeleteVolumeGroupBB", "DeactivateVnfBB", "DeactivateNetworkBB",
-                "DeleteNetworkBB", "DeleteNetworkCollectionBB", "DeactivateServiceInstanceBB", "UnassignVfModuleBB",
-                "UnassignVolumeGroupBB", "UnassignVnfBB", "UnassignNetworkBB", "UnassignServiceInstanceBB");
+                "DeactivateVolumeGroupBB", "DeleteVolumeGroupBB", "DeactivateVnfBB", "DeactivatePnfBB",
+                "DeactivateNetworkBB", "DeleteNetworkBB", "DeleteNetworkCollectionBB", "DeactivateServiceInstanceBB",
+                "UnassignVfModuleBB", "UnassignVolumeGroupBB", "UnassignVnfBB", "UnassignNetworkBB",
+                "UnassignServiceInstanceBB");
         northBoundRequest.setOrchestrationFlowList(orchFlows);
 
         ServiceInstance serviceInstanceAAI = new ServiceInstance();
@@ -797,7 +661,10 @@
                 new org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance();
         org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf vnf =
                 new org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf();
+        org.onap.so.bpmn.servicedecomposition.bbobjects.Pnf pnf =
+                new org.onap.so.bpmn.servicedecomposition.bbobjects.Pnf();
         vnf.setVnfId("vnfId123");
+        pnf.setPnfId("pnfId123");
 
         org.onap.so.bpmn.servicedecomposition.bbobjects.VfModule vfModule = buildVfModule();
         vnf.getVfModules().add(vfModule);
@@ -810,6 +677,7 @@
         vnf.getVolumeGroups().add(volumeGroup);
 
         serviceInstanceMSO.getVnfs().add(vnf);
+        serviceInstanceMSO.getPnfs().add(pnf);
 
         doReturn(serviceInstanceAAI).when(bbSetupUtils).getAAIServiceInstanceById("123");
         doReturn(serviceInstanceMSO).when(bbInputSetup).getExistingServiceInstance(serviceInstanceAAI);
@@ -819,24 +687,53 @@
         List<ExecuteBuildingBlock> ebbs = (List<ExecuteBuildingBlock>) execution.getVariable("flowsToExecute");
         assertEqualsBulkFlowName(ebbs, "DeactivateVfModuleBB", "DeactivateVfModuleBB", "DeleteVfModuleBB",
                 "DeleteVfModuleBB", "DeactivateVolumeGroupBB", "DeleteVolumeGroupBB", "DeactivateVnfBB",
-                "DeactivateServiceInstanceBB", "UnassignVfModuleBB", "UnassignVfModuleBB", "UnassignVolumeGroupBB",
-                "UnassignVnfBB", "UnassignServiceInstanceBB");
+                "DeactivatePnfBB", "DeactivateServiceInstanceBB", "UnassignVfModuleBB", "UnassignVfModuleBB",
+                "UnassignVolumeGroupBB", "UnassignVnfBB", "UnassignServiceInstanceBB");
+    }
+
+    @Test
+    public void selectExecutionListServiceMacroDeleteWithPnfTest() throws Exception {
+        String gAction = "deleteInstance";
+        String resource = "Service";
+        String bpmnRequest = readBpmnRequestFromFile(MACRO_ACTIVATE_DELETE_UNASSIGN_JSON);
+        initExecution(gAction, bpmnRequest, false);
+        execution.setVariable("requestUri", "v6/serviceInstances/123");
+
+        NorthBoundRequest northBoundRequest = new NorthBoundRequest();
+        List<OrchestrationFlow> orchFlows = createFlowList("DeactivateVfModuleBB", "DeleteVfModuleBB",
+                "DeactivateVolumeGroupBB", "DeleteVolumeGroupBB", "DeactivateVnfBB", "DeactivatePnfBB",
+                "DeactivateNetworkBB", "DeleteNetworkBB", "DeleteNetworkCollectionBB", "DeactivateServiceInstanceBB",
+                "UnassignVfModuleBB", "UnassignVolumeGroupBB", "UnassignVnfBB", "UnassignNetworkBB",
+                "UnassignServiceInstanceBB");
+        northBoundRequest.setOrchestrationFlowList(orchFlows);
+
+        ServiceInstance serviceInstanceAAI = new ServiceInstance();
+        serviceInstanceAAI.setServiceInstanceId("aaisi123");
+        org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance serviceInstanceMSO =
+                new org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance();
+        org.onap.so.bpmn.servicedecomposition.bbobjects.Pnf pnf =
+                new org.onap.so.bpmn.servicedecomposition.bbobjects.Pnf();
+        pnf.setPnfId("pnfId123");
+
+        serviceInstanceMSO.getPnfs().add(pnf);
+
+        doReturn(serviceInstanceAAI).when(bbSetupUtils).getAAIServiceInstanceById("123");
+        doReturn(serviceInstanceMSO).when(bbInputSetup).getExistingServiceInstance(serviceInstanceAAI);
+        when(catalogDbClient.getNorthBoundRequestByActionAndIsALaCarteAndRequestScopeAndCloudOwner(gAction, resource,
+                false, "my-custom-cloud-owner")).thenReturn(northBoundRequest);
+        workflowAction.selectExecutionList(execution);
+        List<ExecuteBuildingBlock> ebbs = (List<ExecuteBuildingBlock>) execution.getVariable("flowsToExecute");
+        assertEqualsBulkFlowName(ebbs, "DeactivatePnfBB", "DeactivateServiceInstanceBB", "UnassignServiceInstanceBB");
     }
 
     @Test
     public void selectExecutionListServiceMacroUnassignTest() throws Exception {
         String gAction = "unassignInstance";
         String resource = "Service";
-        execution.setVariable("mso-request-id", "00f704ca-c5e5-4f95-a72c-6889db7b0688");
-        execution.setVariable("requestAction", gAction);
-        String bpmnRequest = new String(Files
-                .readAllBytes(Paths.get("src/test/resources/__files/Macro/ServiceMacroActivateDeleteUnassign.json")));
-        execution.setVariable("bpmnRequest", bpmnRequest);
-        execution.setVariable("aLaCarte", false);
-        execution.setVariable("apiVersion", "7");
+        String bpmnRequest = readBpmnRequestFromFile(MACRO_ACTIVATE_DELETE_UNASSIGN_JSON);
+        initExecution(gAction, bpmnRequest, false);
         execution.setVariable("requestUri", "v6/serviceInstances/123");
 
-
         NorthBoundRequest northBoundRequest = new NorthBoundRequest();
         List<OrchestrationFlow> orchFlows = createFlowList("UnassignVfModuleBB", "UnassignVolumeGroupBB",
                 "UnassignVnfBB", "UnassignNetworkBB", "UnassignServiceInstanceBB");
@@ -876,16 +773,10 @@
     public void selectExecutionListServiceMacroDeleteNetworkCollectionTest() throws Exception {
         String gAction = "deleteInstance";
         String resource = "Service";
-        execution.setVariable("mso-request-id", "00f704ca-c5e5-4f95-a72c-6889db7b0688");
-        execution.setVariable("requestAction", gAction);
-        String bpmnRequest = new String(Files
-                .readAllBytes(Paths.get("src/test/resources/__files/Macro/ServiceMacroActivateDeleteUnassign.json")));
-        execution.setVariable("bpmnRequest", bpmnRequest);
-        execution.setVariable("aLaCarte", false);
-        execution.setVariable("apiVersion", "7");
+        String bpmnRequest = readBpmnRequestFromFile(MACRO_ACTIVATE_DELETE_UNASSIGN_JSON);
+        initExecution(gAction, bpmnRequest, false);
         execution.setVariable("requestUri", "v6/serviceInstances/123");
 
-
         NorthBoundRequest northBoundRequest = new NorthBoundRequest();
         List<OrchestrationFlow> orchFlows = createFlowList("DeactivateVfModuleBB", "DeleteVfModuleBB",
                 "DeactivateVolumeGroupBB", "DeleteVolumeGroupBB", "DeactivateVnfBB", "DeactivateNetworkBB",
@@ -925,13 +816,8 @@
     public void selectExecutionListVnfMacroRecreateTest() throws Exception {
         String gAction = "recreateInstance";
         String resource = "Vnf";
-        execution.setVariable("mso-request-id", "00f704ca-c5e5-4f95-a72c-6889db7b0688");
-        execution.setVariable("requestAction", gAction);
-        String bpmnRequest =
-                new String(Files.readAllBytes(Paths.get("src/test/resources/__files/Macro/VnfMacroReplace.json")));
-        execution.setVariable("bpmnRequest", bpmnRequest);
-        execution.setVariable("aLaCarte", false);
-        execution.setVariable("apiVersion", "7");
+        String bpmnRequest = readBpmnRequestFromFile(MACRO_VNF_MACRO_REPLACE_JSON);
+        initExecution(gAction, bpmnRequest, false);
         execution.setVariable("requestUri", "v7/serviceInstances/123/vnfs/1234/recreate");
         execution.setVariable("serviceInstanceId", "123");
         execution.setVariable("vnfId", "1234");
@@ -979,13 +865,8 @@
     public void selectExecutionListVnfMacroReplaceTest() throws Exception {
         String gAction = "replaceInstance";
         String resource = "Vnf";
-        execution.setVariable("mso-request-id", "00f704ca-c5e5-4f95-a72c-6889db7b0688");
-        execution.setVariable("requestAction", gAction);
-        String bpmnRequest =
-                new String(Files.readAllBytes(Paths.get("src/test/resources/__files/Macro/VnfMacroReplace.json")));
-        execution.setVariable("bpmnRequest", bpmnRequest);
-        execution.setVariable("aLaCarte", false);
-        execution.setVariable("apiVersion", "7");
+        String bpmnRequest = readBpmnRequestFromFile(MACRO_VNF_MACRO_REPLACE_JSON);
+        initExecution(gAction, bpmnRequest, false);
         execution.setVariable("requestUri", "v7/serviceInstances/123/vnfs/1234/replace");
         execution.setVariable("serviceInstanceId", "123");
         execution.setVariable("vnfId", "1234");
@@ -1052,16 +933,10 @@
     public void selectExecutionListNetworkCollectionMacroCreate() throws Exception {
         String gAction = "createInstance";
         String resource = "NetworkCollection";
-        execution.setVariable("mso-request-id", "00f704ca-c5e5-4f95-a72c-6889db7b0688");
-        execution.setVariable("requestAction", gAction);
-        String bpmnRequest = new String(
-                Files.readAllBytes(Paths.get("src/test/resources/__files/Macro/CreateNetworkCollection.json")));
-        execution.setVariable("bpmnRequest", bpmnRequest);
-        execution.setVariable("aLaCarte", false);
-        execution.setVariable("apiVersion", "7");
+        String bpmnRequest = readBpmnRequestFromFile(MACRO_CREATE_NETWORK_COLLECTION_JSON);
+        initExecution(gAction, bpmnRequest, false);
         execution.setVariable("requestUri", "v6/serviceInstances/123/networkCollections/123");
 
-
         NorthBoundRequest northBoundRequest = new NorthBoundRequest();
         List<OrchestrationFlow> orchFlows = createFlowList("CreateNetworkCollectionBB", "AssignNetworkBB",
                 "CreateNetworkBB", "ActivateNetworkBB", "ActivateNetworkCollectionBB");
@@ -1089,13 +964,8 @@
     public void selectExecutionListNetworkCollectionMacroDelete() throws Exception {
         String gAction = "deleteInstance";
         String resource = "NetworkCollection";
-        execution.setVariable("mso-request-id", "00f704ca-c5e5-4f95-a72c-6889db7b0688");
-        execution.setVariable("requestAction", gAction);
-        String bpmnRequest = new String(
-                Files.readAllBytes(Paths.get("src/test/resources/__files/Macro/CreateNetworkCollection.json")));
-        execution.setVariable("bpmnRequest", bpmnRequest);
-        execution.setVariable("aLaCarte", false);
-        execution.setVariable("apiVersion", "7");
+        String bpmnRequest = readBpmnRequestFromFile(MACRO_CREATE_NETWORK_COLLECTION_JSON);
+        initExecution(gAction, bpmnRequest, false);
         execution.setVariable("requestUri", "v6/serviceInstances/123/networkCollections/123");
 
         NorthBoundRequest northBoundRequest = new NorthBoundRequest();
@@ -1124,17 +994,11 @@
     public void selectExecutionListALaCarteVfModuleNoFabricCreateTest() throws Exception {
         String gAction = "createInstance";
         String resource = "VfModule";
-        execution.setVariable("mso-request-id", "00f704ca-c5e5-4f95-a72c-6889db7b0688");
-        execution.setVariable("requestAction", gAction);
-        String bpmnRequest =
-                new String(Files.readAllBytes(Paths.get("src/test/resources/__files/VfModuleCreateWithFabric.json")));
-        execution.setVariable("bpmnRequest", bpmnRequest);
-        execution.setVariable("aLaCarte", true);
-        execution.setVariable("apiVersion", "7");
+        String bpmnRequest = readBpmnRequestFromFile(VF_MODULE_CREATE_WITH_FABRIC_JSON);
+        initExecution(gAction, bpmnRequest, true);
         execution.setVariable("requestUri",
                 "v7/serviceInstances/f647e3ef-6d2e-4cd3-bff4-8df4634208de/vnfs/b80b16a5-f80d-4ffa-91c8-bd47c7438a3d/vfModules");
 
-
         NorthBoundRequest northBoundRequest = new NorthBoundRequest();
         List<OrchestrationFlow> orchFlows = createFlowList("AssignVfModuleBB", "CreateVfModuleBB", "ActivateVfModuleBB",
                 "AssignFabricConfigurationBB", "ActivateFabricConfigurationBB");
@@ -1151,13 +1015,8 @@
     public void selectExecutionListALaCarteVfModuleFabricCreateTest() throws Exception {
         String gAction = "createInstance";
         String resource = "VfModule";
-        execution.setVariable("mso-request-id", "00f704ca-c5e5-4f95-a72c-6889db7b0688");
-        execution.setVariable("requestAction", gAction);
-        String bpmnRequest =
-                new String(Files.readAllBytes(Paths.get("src/test/resources/__files/VfModuleCreateWithFabric.json")));
-        execution.setVariable("bpmnRequest", bpmnRequest);
-        execution.setVariable("aLaCarte", true);
-        execution.setVariable("apiVersion", "7");
+        String bpmnRequest = readBpmnRequestFromFile(VF_MODULE_CREATE_WITH_FABRIC_JSON);
+        initExecution(gAction, bpmnRequest, true);
         execution.setVariable("requestUri",
                 "v7/serviceInstances/f647e3ef-6d2e-4cd3-bff4-8df4634208de/vnfs/b80b16a5-f80d-4ffa-91c8-bd47c7438a3d/vfModules");
 
@@ -1210,13 +1069,8 @@
     public void selectExecutionListALaCarteVfModuleNoVolumeGroupReplaceTest() throws Exception {
         String gAction = "replaceInstance";
         String resource = "VfModule";
-        execution.setVariable("mso-request-id", "00f704ca-c5e5-4f95-a72c-6889db7b0688");
-        execution.setVariable("requestAction", gAction);
-        String bpmnRequest =
-                new String(Files.readAllBytes(Paths.get("src/test/resources/__files/VfModuleCreateWithFabric.json")));
-        execution.setVariable("bpmnRequest", bpmnRequest);
-        execution.setVariable("aLaCarte", true);
-        execution.setVariable("apiVersion", "7");
+        String bpmnRequest = readBpmnRequestFromFile(VF_MODULE_CREATE_WITH_FABRIC_JSON);
+        initExecution(gAction, bpmnRequest, true);
         execution.setVariable("requestUri",
                 "v7/serviceInstances/f647e3ef-6d2e-4cd3-bff4-8df4634208de/vnfs/b80b16a5-f80d-4ffa-91c8-bd47c7438a3d/vfModules/1234");
 
@@ -1236,13 +1090,8 @@
     public void selectExecutionListALaCarteVfModuleNoVolumeGroupReplaceRetainAssignmentsTest() throws Exception {
         String gAction = "replaceInstanceRetainAssignments";
         String resource = "VfModule";
-        execution.setVariable("mso-request-id", "00f704ca-c5e5-4f95-a72c-6889db7b0688");
-        execution.setVariable("requestAction", gAction);
-        String bpmnRequest =
-                new String(Files.readAllBytes(Paths.get("src/test/resources/__files/VfModuleCreateWithFabric.json")));
-        execution.setVariable("bpmnRequest", bpmnRequest);
-        execution.setVariable("aLaCarte", true);
-        execution.setVariable("apiVersion", "7");
+        String bpmnRequest = readBpmnRequestFromFile(VF_MODULE_CREATE_WITH_FABRIC_JSON);
+        initExecution(gAction, bpmnRequest, true);
         execution.setVariable("requestUri",
                 "v7/serviceInstances/f647e3ef-6d2e-4cd3-bff4-8df4634208de/vnfs/b80b16a5-f80d-4ffa-91c8-bd47c7438a3d/vfModules/1234");
 
@@ -1261,13 +1110,8 @@
     public void selectExecutionListALaCarteVfModuleVolumeGroupToNoVolumeGroupReplaceTest() throws Exception {
         String gAction = "replaceInstance";
         String resource = "VfModule";
-        execution.setVariable("mso-request-id", "00f704ca-c5e5-4f95-a72c-6889db7b0688");
-        execution.setVariable("requestAction", gAction);
-        String bpmnRequest =
-                new String(Files.readAllBytes(Paths.get("src/test/resources/__files/VfModuleCreateWithFabric.json")));
-        execution.setVariable("bpmnRequest", bpmnRequest);
-        execution.setVariable("aLaCarte", true);
-        execution.setVariable("apiVersion", "7");
+        String bpmnRequest = readBpmnRequestFromFile(VF_MODULE_CREATE_WITH_FABRIC_JSON);
+        initExecution(gAction, bpmnRequest, true);
         execution.setVariable("requestUri",
                 "v7/serviceInstances/f647e3ef-6d2e-4cd3-bff4-8df4634208de/vnfs/b80b16a5-f80d-4ffa-91c8-bd47c7438a3d/vfModules/1234");
         execution.setVariable("vnfId", "b80b16a5-f80d-4ffa-91c8-bd47c7438a3d");
@@ -1294,13 +1138,8 @@
             throws Exception {
         String gAction = "replaceInstanceRetainAssignments";
         String resource = "VfModule";
-        execution.setVariable("mso-request-id", "00f704ca-c5e5-4f95-a72c-6889db7b0688");
-        execution.setVariable("requestAction", gAction);
-        String bpmnRequest =
-                new String(Files.readAllBytes(Paths.get("src/test/resources/__files/VfModuleCreateWithFabric.json")));
-        execution.setVariable("bpmnRequest", bpmnRequest);
-        execution.setVariable("aLaCarte", true);
-        execution.setVariable("apiVersion", "7");
+        String bpmnRequest = readBpmnRequestFromFile(VF_MODULE_CREATE_WITH_FABRIC_JSON);
+        initExecution(gAction, bpmnRequest, true);
         execution.setVariable("requestUri",
                 "v7/serviceInstances/f647e3ef-6d2e-4cd3-bff4-8df4634208de/vnfs/b80b16a5-f80d-4ffa-91c8-bd47c7438a3d/vfModules/1234");
         execution.setVariable("vnfId", "b80b16a5-f80d-4ffa-91c8-bd47c7438a3d");
@@ -1327,13 +1166,8 @@
     public void selectExecutionListALaCarteVfModuleKeepVolumeGroupReplaceTest() throws Exception {
         String gAction = "replaceInstance";
         String resource = "VfModule";
-        execution.setVariable("mso-request-id", "00f704ca-c5e5-4f95-a72c-6889db7b0688");
-        execution.setVariable("requestAction", gAction);
-        String bpmnRequest =
-                new String(Files.readAllBytes(Paths.get("src/test/resources/__files/VfModuleCreateWithFabric.json")));
-        execution.setVariable("bpmnRequest", bpmnRequest);
-        execution.setVariable("aLaCarte", true);
-        execution.setVariable("apiVersion", "7");
+        String bpmnRequest = readBpmnRequestFromFile(VF_MODULE_CREATE_WITH_FABRIC_JSON);
+        initExecution(gAction, bpmnRequest, true);
         execution.setVariable("requestUri",
                 "v7/serviceInstances/f647e3ef-6d2e-4cd3-bff4-8df4634208de/vnfs/b80b16a5-f80d-4ffa-91c8-bd47c7438a3d/vfModules/1234");
         execution.setVariable("vnfId", "b80b16a5-f80d-4ffa-91c8-bd47c7438a3d");
@@ -1368,13 +1202,8 @@
     public void selectExecutionListALaCarteVfModuleWithFabricKeepVolumeGroupReplaceTest() throws Exception {
         String gAction = "replaceInstance";
         String resource = "VfModule";
-        execution.setVariable("mso-request-id", "00f704ca-c5e5-4f95-a72c-6889db7b0688");
-        execution.setVariable("requestAction", gAction);
-        String bpmnRequest =
-                new String(Files.readAllBytes(Paths.get("src/test/resources/__files/VfModuleCreateWithFabric.json")));
-        execution.setVariable("bpmnRequest", bpmnRequest);
-        execution.setVariable("aLaCarte", true);
-        execution.setVariable("apiVersion", "7");
+        String bpmnRequest = readBpmnRequestFromFile(VF_MODULE_CREATE_WITH_FABRIC_JSON);
+        initExecution(gAction, bpmnRequest, true);
         execution.setVariable("requestUri",
                 "v7/serviceInstances/f647e3ef-6d2e-4cd3-bff4-8df4634208de/vnfs/b80b16a5-f80d-4ffa-91c8-bd47c7438a3d/vfModules/1234");
         execution.setVariable("vnfId", "b80b16a5-f80d-4ffa-91c8-bd47c7438a3d");
@@ -1409,16 +1238,11 @@
         vnfcs.add(vnfc);
         doReturn(vnfcs).when(SPY_workflowAction).getRelatedResourcesInVfModule(any(), any(), any(), any());
 
-        List<org.onap.aai.domain.yang.Configuration> configurations =
-                new ArrayList<org.onap.aai.domain.yang.Configuration>();
         org.onap.aai.domain.yang.Configuration configuration = new org.onap.aai.domain.yang.Configuration();
         configuration.setConfigurationId("configurationId");
         configuration.setModelCustomizationId("modelCustimizationId");
         configuration.setConfigurationName("testConfigurationName");
-        configurations.add(configuration);
-        doReturn(configurations).when(SPY_workflowAction).getRelatedResourcesInVnfc(any(), any(), any());
-
-        doReturn("testVnfcName").when(SPY_workflowAction).getVnfcNameForConfiguration(any());
+        doReturn(configuration).when(SPY_workflowAction).getRelatedResourcesInVnfc(any(), any(), any());
 
         NorthBoundRequest northBoundRequest = new NorthBoundRequest();
         northBoundRequest.setOrchestrationFlowList(replaceVfModuleWithFabricOrchFlows);
@@ -1436,13 +1260,8 @@
     public void selectExecutionListALaCarteVfModuleKeepVolumeGroupReplaceRetainAssignmentsTest() throws Exception {
         String gAction = "replaceInstanceRetainAssignments";
         String resource = "VfModule";
-        execution.setVariable("mso-request-id", "00f704ca-c5e5-4f95-a72c-6889db7b0688");
-        execution.setVariable("requestAction", gAction);
-        String bpmnRequest =
-                new String(Files.readAllBytes(Paths.get("src/test/resources/__files/VfModuleCreateWithFabric.json")));
-        execution.setVariable("bpmnRequest", bpmnRequest);
-        execution.setVariable("aLaCarte", true);
-        execution.setVariable("apiVersion", "7");
+        String bpmnRequest = readBpmnRequestFromFile(VF_MODULE_CREATE_WITH_FABRIC_JSON);
+        initExecution(gAction, bpmnRequest, true);
         execution.setVariable("requestUri",
                 "v7/serviceInstances/f647e3ef-6d2e-4cd3-bff4-8df4634208de/vnfs/b80b16a5-f80d-4ffa-91c8-bd47c7438a3d/vfModules/1234");
         execution.setVariable("vnfId", "b80b16a5-f80d-4ffa-91c8-bd47c7438a3d");
@@ -1476,13 +1295,8 @@
     public void selectExecutionListALaCarteVfModuleNoVolumeGroupToVolumeGroupReplaceTest() throws Exception {
         String gAction = "replaceInstance";
         String resource = "VfModule";
-        execution.setVariable("mso-request-id", "00f704ca-c5e5-4f95-a72c-6889db7b0688");
-        execution.setVariable("requestAction", gAction);
-        String bpmnRequest =
-                new String(Files.readAllBytes(Paths.get("src/test/resources/__files/VfModuleCreateWithFabric.json")));
-        execution.setVariable("bpmnRequest", bpmnRequest);
-        execution.setVariable("aLaCarte", true);
-        execution.setVariable("apiVersion", "7");
+        String bpmnRequest = readBpmnRequestFromFile(VF_MODULE_CREATE_WITH_FABRIC_JSON);
+        initExecution(gAction, bpmnRequest, true);
         execution.setVariable("requestUri",
                 "v7/serviceInstances/f647e3ef-6d2e-4cd3-bff4-8df4634208de/vnfs/b80b16a5-f80d-4ffa-91c8-bd47c7438a3d/vfModules/1234");
         execution.setVariable("vnfId", "b80b16a5-f80d-4ffa-91c8-bd47c7438a3d");
@@ -1513,13 +1327,8 @@
             throws Exception {
         String gAction = "replaceInstanceRetainAssignments";
         String resource = "VfModule";
-        execution.setVariable("mso-request-id", "00f704ca-c5e5-4f95-a72c-6889db7b0688");
-        execution.setVariable("requestAction", gAction);
-        String bpmnRequest =
-                new String(Files.readAllBytes(Paths.get("src/test/resources/__files/VfModuleCreateWithFabric.json")));
-        execution.setVariable("bpmnRequest", bpmnRequest);
-        execution.setVariable("aLaCarte", true);
-        execution.setVariable("apiVersion", "7");
+        String bpmnRequest = readBpmnRequestFromFile(VF_MODULE_CREATE_WITH_FABRIC_JSON);
+        initExecution(gAction, bpmnRequest, true);
         execution.setVariable("requestUri",
                 "v7/serviceInstances/f647e3ef-6d2e-4cd3-bff4-8df4634208de/vnfs/b80b16a5-f80d-4ffa-91c8-bd47c7438a3d/vfModules/1234");
         execution.setVariable("vnfId", "b80b16a5-f80d-4ffa-91c8-bd47c7438a3d");
@@ -1549,13 +1358,8 @@
     public void selectExecutionListALaCarteVfModuleRebuildVolumeGroupReplaceTest() throws Exception {
         String gAction = "replaceInstance";
         String resource = "VfModule";
-        execution.setVariable("mso-request-id", "00f704ca-c5e5-4f95-a72c-6889db7b0688");
-        execution.setVariable("requestAction", gAction);
-        String bpmnRequest = new String(
-                Files.readAllBytes(Paths.get("src/test/resources/__files/VfModuleReplaceRebuildVolumeGroups.json")));
-        execution.setVariable("bpmnRequest", bpmnRequest);
-        execution.setVariable("aLaCarte", true);
-        execution.setVariable("apiVersion", "7");
+        String bpmnRequest = readBpmnRequestFromFile(VF_MODULE_REPLACE_REBUILD_VOLUME_GROUPS_JSON);
+        initExecution(gAction, bpmnRequest, true);
         execution.setVariable("requestUri",
                 "v7/serviceInstances/f647e3ef-6d2e-4cd3-bff4-8df4634208de/vnfs/b80b16a5-f80d-4ffa-91c8-bd47c7438a3d/vfModules/1234");
         execution.setVariable("vnfId", "b80b16a5-f80d-4ffa-91c8-bd47c7438a3d");
@@ -1591,13 +1395,8 @@
     public void selectExecutionListALaCarteVfModuleRebuildVolumeGroupReplaceRetainAssignmentsTest() throws Exception {
         String gAction = "replaceInstanceRetainAssignments";
         String resource = "VfModule";
-        execution.setVariable("mso-request-id", "00f704ca-c5e5-4f95-a72c-6889db7b0688");
-        execution.setVariable("requestAction", gAction);
-        String bpmnRequest = new String(
-                Files.readAllBytes(Paths.get("src/test/resources/__files/VfModuleReplaceRebuildVolumeGroups.json")));
-        execution.setVariable("bpmnRequest", bpmnRequest);
-        execution.setVariable("aLaCarte", true);
-        execution.setVariable("apiVersion", "7");
+        String bpmnRequest = readBpmnRequestFromFile(VF_MODULE_REPLACE_REBUILD_VOLUME_GROUPS_JSON);
+        initExecution(gAction, bpmnRequest, true);
         execution.setVariable("requestUri",
                 "v7/serviceInstances/f647e3ef-6d2e-4cd3-bff4-8df4634208de/vnfs/b80b16a5-f80d-4ffa-91c8-bd47c7438a3d/vfModules/1234");
         execution.setVariable("vnfId", "b80b16a5-f80d-4ffa-91c8-bd47c7438a3d");
@@ -1634,13 +1433,8 @@
     public void selectExecutionListALaCarteVfModuleFabricDeleteTest() throws Exception {
         String gAction = "deleteInstance";
         String resource = "VfModule";
-        execution.setVariable("mso-request-id", "00f704ca-c5e5-4f95-a72c-6889db7b0688");
-        execution.setVariable("requestAction", gAction);
-        String bpmnRequest =
-                new String(Files.readAllBytes(Paths.get("src/test/resources/__files/VfModuleCreateWithFabric.json")));
-        execution.setVariable("bpmnRequest", bpmnRequest);
-        execution.setVariable("aLaCarte", true);
-        execution.setVariable("apiVersion", "7");
+        String bpmnRequest = readBpmnRequestFromFile(VF_MODULE_CREATE_WITH_FABRIC_JSON);
+        initExecution(gAction, bpmnRequest, true);
         execution.setVariable("requestUri",
                 "v7/serviceInstances/f647e3ef-6d2e-4cd3-bff4-8df4634208de/vnfs/b80b16a5-f80d-4ffa-91c8-bd47c7438a3d/vfModules");
 
@@ -1669,18 +1463,13 @@
         doReturn(vnfcs).when(SPY_workflowAction).getRelatedResourcesInVfModule(anyObject(), anyObject(), anyObject(),
                 anyObject());
 
-        List<org.onap.aai.domain.yang.Configuration> configurations =
-                new ArrayList<org.onap.aai.domain.yang.Configuration>();
         org.onap.aai.domain.yang.Configuration configuration = new org.onap.aai.domain.yang.Configuration();
         configuration.setConfigurationId("configurationId");
         configuration.setModelCustomizationId("modelCustimizationId");
         configuration.setConfigurationName("testConfigurationName");
-        configurations.add(configuration);
-        doReturn(configurations).when(SPY_workflowAction).getRelatedResourcesInVnfc(anyObject(), anyObject(),
+        doReturn(configuration).when(SPY_workflowAction).getRelatedResourcesInVnfc(anyObject(), anyObject(),
                 anyObject());
 
-        doReturn("testName").when(SPY_workflowAction).getVnfcNameForConfiguration(anyObject());
-
         SPY_workflowAction.selectExecutionList(execution);
         List<ExecuteBuildingBlock> ebbs = (List<ExecuteBuildingBlock>) execution.getVariable("flowsToExecute");
         assertEqualsBulkFlowName(ebbs, "DeactivateFabricConfigurationBB", "UnassignFabricConfigurationBB",
@@ -1692,10 +1481,9 @@
         String gAction = "deleteInstance";
         ObjectMapper mapper = new ObjectMapper();
         WorkflowType resourceType = WorkflowType.VFMODULE;
+        String bpmnRequest = readBpmnRequestFromFile(VF_MODULE_CREATE_WITH_FABRIC_JSON);
         execution.setVariable("mso-request-id", "00f704ca-c5e5-4f95-a72c-6889db7b0688");
         execution.setVariable("requestAction", gAction);
-        String bpmnRequest =
-                new String(Files.readAllBytes(Paths.get("src/test/resources/__files/VfModuleCreateWithFabric.json")));
         execution.setVariable("bpmnRequest", bpmnRequest);
         execution.setVariable("vnfId", "1234");
         execution.setVariable("vfModuleId", "vfModuleId1234");
@@ -1738,22 +1526,92 @@
     }
 
     @Test
-    public void selectExecutionListALaCarteVfModuleNoFabricDeleteTest() throws Exception {
+    public void getConfigBuildingBlocksTest() throws Exception {
         String gAction = "deleteInstance";
-        String resource = "VfModule";
+        ObjectMapper mapper = new ObjectMapper();
+        mapper.disable(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES);
+
+        WorkflowType resourceType = WorkflowType.VFMODULE;
         execution.setVariable("mso-request-id", "00f704ca-c5e5-4f95-a72c-6889db7b0688");
         execution.setVariable("requestAction", gAction);
         String bpmnRequest =
                 new String(Files.readAllBytes(Paths.get("src/test/resources/__files/VfModuleCreateWithFabric.json")));
         execution.setVariable("bpmnRequest", bpmnRequest);
-        execution.setVariable("aLaCarte", true);
-        execution.setVariable("apiVersion", "7");
+        execution.setVariable("vnfId", "1234");
+        execution.setVariable("vfModuleId", "vfModuleId1234");
+        execution.setVariable("requestUri",
+                "v7/serviceInstances/f647e3ef-6d2e-4cd3-bff4-8df4634208de/vnfs/b80b16a5-f80d-4ffa-91c8-bd47c7438a3d/vfModules");
+        ServiceInstancesRequest sIRequest = mapper.readValue(bpmnRequest, ServiceInstancesRequest.class);
+        RequestDetails requestDetails = sIRequest.getRequestDetails();
+        String requestAction = "deleteInstance";
+        String requestId = "9c944122-d161-4280-8594-48c06a9d96d5";
+        boolean aLaCarte = true;
+        String apiVersion = "7";
+        String vnfType = "vnfType";
+        String key = "00d15ebb-c80e-43c1-80f0-90c40dde70b0";
+        String resourceId = "d1d35800-783d-42d3-82f6-d654c5054a6e";
+        Resource resourceKey = new Resource(resourceType, key, aLaCarte);
+        WorkflowResourceIds workflowResourceIds = SPY_workflowAction.populateResourceIdsFromApiHandler(execution);
+
+        List<OrchestrationFlow> orchFlows = createFlowList("DeactivateVfModuleBB", "DeleteVfModuleBB",
+                "UnassignVfModuleBB", "DeleteFabricConfigurationBB");
+
+        ConfigBuildingBlocksDataObject dataObj = new ConfigBuildingBlocksDataObject().setsIRequest(sIRequest)
+                .setOrchFlows(orchFlows).setRequestId(requestId).setResourceKey(resourceKey).setApiVersion(apiVersion)
+                .setResourceId(resourceId).setRequestAction(requestAction).setaLaCarte(aLaCarte).setVnfType(vnfType)
+                .setWorkflowResourceIds(workflowResourceIds).setRequestDetails(requestDetails).setExecution(execution);
+
+        org.onap.aai.domain.yang.GenericVnf vnf = new org.onap.aai.domain.yang.GenericVnf();
+        vnf.setVnfId("vnf0");
+        vnf.setModelCustomizationId("modelCustomizationId");
+        when(bbSetupUtils.getAAIGenericVnf(any())).thenReturn(vnf);
+
+        org.onap.aai.domain.yang.VfModule vfModule = new org.onap.aai.domain.yang.VfModule();
+        vfModule.setModelCustomizationId("modelCustomizationId");
+
+        org.onap.aai.domain.yang.Configuration config1 = new org.onap.aai.domain.yang.Configuration();
+        config1.setConfigurationId("config1");
+        org.onap.aai.domain.yang.Configuration config2 = new org.onap.aai.domain.yang.Configuration();
+        config2.setConfigurationId("config2");
+
+        List<org.onap.aai.domain.yang.Vnfc> vnfcs = new ArrayList<org.onap.aai.domain.yang.Vnfc>();
+        org.onap.aai.domain.yang.Vnfc vnfc1 = new org.onap.aai.domain.yang.Vnfc();
+        vnfc1.setVnfcName("zauk53avetd02svm001");
+        org.onap.aai.domain.yang.Vnfc vnfc2 = new org.onap.aai.domain.yang.Vnfc();
+        vnfc2.setVnfcName("zauk53avetd02tvm001");
+        vnfcs.add(vnfc1);
+        vnfcs.add(vnfc2);
+
+        when(bbSetupUtils.getAAIVfModule(any(), any())).thenReturn(vfModule);
+        doReturn(vnfcs).when(SPY_workflowAction).getRelatedResourcesInVfModule(any(), any(),
+                eq(org.onap.aai.domain.yang.Vnfc.class), eq(AAIObjectType.VNFC));
+        doReturn(config1).when(SPY_workflowAction).getRelatedResourcesInVnfc(eq(vnfc1),
+                eq(org.onap.aai.domain.yang.Configuration.class), eq(AAIObjectType.CONFIGURATION));
+        doReturn(config2).when(SPY_workflowAction).getRelatedResourcesInVnfc(eq(vnfc2),
+                eq(org.onap.aai.domain.yang.Configuration.class), eq(AAIObjectType.CONFIGURATION));
+
+        List<ExecuteBuildingBlock> results = SPY_workflowAction.getConfigBuildingBlocks(dataObj);
+
+        assertFalse(results.isEmpty());
+        assertEquals(2, results.size());
+        assertEquals("config1", results.get(0).getWorkflowResourceIds().getConfigurationId());
+        assertEquals("config2", results.get(1).getWorkflowResourceIds().getConfigurationId());
+        assertEquals("zauk53avetd02svm001", results.get(0).getConfigurationResourceKeys().getVnfcName());
+        assertEquals("zauk53avetd02tvm001", results.get(1).getConfigurationResourceKeys().getVnfcName());
+    }
+
+    @Test
+    public void selectExecutionListALaCarteVfModuleNoFabricDeleteTest() throws Exception {
+        String gAction = "deleteInstance";
+        String resource = "VfModule";
+        String bpmnRequest = readBpmnRequestFromFile(VF_MODULE_CREATE_WITH_FABRIC_JSON);
+        initExecution(gAction, bpmnRequest, true);
         execution.setVariable("requestUri",
                 "v7/serviceInstances/f647e3ef-6d2e-4cd3-bff4-8df4634208de/vnfs/b80b16a5-f80d-4ffa-91c8-bd47c7438a3d/vfModules");
 
         NorthBoundRequest northBoundRequest = new NorthBoundRequest();
         List<OrchestrationFlow> orchFlows = createFlowList("DeactivateVfModuleBB", "DeleteVfModuleBB",
-                "UnassignVfModuleBB", "DeactivateFabricConfigurationBB", "UnassignFabricConfigurationBB");
+                "UnassignVfModuleBB", "DeleteFabricConfigurationBB");
         northBoundRequest.setOrchestrationFlowList(orchFlows);
 
         when(catalogDbClient.getNorthBoundRequestByActionAndIsALaCarteAndRequestScopeAndCloudOwner(gAction, resource,
@@ -1769,21 +1627,10 @@
         when(bbSetupUtils.getAAIVfModule(anyObject(), anyObject())).thenReturn(vfModule);
 
         List<org.onap.aai.domain.yang.Vnfc> vnfcs = new ArrayList<org.onap.aai.domain.yang.Vnfc>();
-        org.onap.aai.domain.yang.Vnfc vnfc = new org.onap.aai.domain.yang.Vnfc();
-        vnfc.setModelInvariantId("modelInvariantId");
-        vnfc.setVnfcName("testVnfcName");
-        vnfcs.add(vnfc);
+
         doReturn(vnfcs).when(SPY_workflowAction).getRelatedResourcesInVfModule(anyObject(), anyObject(), anyObject(),
                 anyObject());
 
-        List<org.onap.aai.domain.yang.Configuration> configurations =
-                new ArrayList<org.onap.aai.domain.yang.Configuration>();
-        org.onap.aai.domain.yang.Configuration configuration = new org.onap.aai.domain.yang.Configuration();
-        doReturn(configurations).when(SPY_workflowAction).getRelatedResourcesInVnfc(anyObject(), anyObject(),
-                anyObject());
-
-        doReturn("testName").when(SPY_workflowAction).getVnfcNameForConfiguration(anyObject());
-
         SPY_workflowAction.selectExecutionList(execution);
         List<ExecuteBuildingBlock> ebbs = (List<ExecuteBuildingBlock>) execution.getVariable("flowsToExecute");
         assertEqualsBulkFlowName(ebbs, "DeactivateVfModuleBB", "DeleteVfModuleBB", "UnassignVfModuleBB");
@@ -1793,13 +1640,8 @@
     public void selectExecutionListMacroResumeTest() throws Exception {
         String gAction = "createInstance";
         String resource = "Service";
-        execution.setVariable("mso-request-id", "00f704ca-c5e5-4f95-a72c-6889db7b0688");
-        execution.setVariable("requestAction", gAction);
-        String bpmnRequest =
-                new String(Files.readAllBytes(Paths.get("src/test/resources/__files/Macro/ServiceMacroAssign.json")));
-        execution.setVariable("bpmnRequest", bpmnRequest);
-        execution.setVariable("aLaCarte", false);
-        execution.setVariable("apiVersion", "7");
+        String bpmnRequest = readBpmnRequestFromFile(MACRO_ASSIGN_JSON);
+        initExecution(gAction, bpmnRequest, false);
         execution.setVariable("requestUri", "v6/serviceInstances/123");
 
         NorthBoundRequest northBoundRequest = new NorthBoundRequest();
@@ -1853,10 +1695,9 @@
 
         doReturn(configurationResultWrappers).when(SPY_workflowAction).getResultWrappersFromRelationships(anyObject(),
                 anyObject());
-        List<org.onap.aai.domain.yang.Configuration> configurationsList = SPY_workflowAction.getRelatedResourcesInVnfc(
-                vnfc, org.onap.aai.domain.yang.Configuration.class, AAIObjectType.CONFIGURATION);
-        assertEquals(1, configurationsList.size());
-        assertEquals("testConfigurationId", configurationsList.get(0).getConfigurationId());
+        org.onap.aai.domain.yang.Configuration configuration = SPY_workflowAction.getRelatedResourcesInVnfc(vnfc,
+                org.onap.aai.domain.yang.Configuration.class, AAIObjectType.CONFIGURATION);
+        assertEquals("testConfigurationId", configuration.getConfigurationId());
     }
 
     /**
@@ -3034,8 +2875,7 @@
         doReturn(service).when(catalogDbClient).getServiceByID("3c40d244-808e-42ca-b09a-256d83d19d0a");
         doReturn(collectionResourceCustomization).when(catalogDbClient)
                 .getNetworkCollectionResourceCustomizationByID("123");
-        String bpmnRequest = new String(Files
-                .readAllBytes(Paths.get("src/test/resources/__files/Macro/ServiceMacroActivateDeleteUnassign.json")));
+        String bpmnRequest = readBpmnRequestFromFile(MACRO_ACTIVATE_DELETE_UNASSIGN_JSON);
         ObjectMapper mapper = new ObjectMapper();
         ServiceInstancesRequest sIRequest = mapper.readValue(bpmnRequest, ServiceInstancesRequest.class);
         List<Resource> resourceCounter = new ArrayList<>();
@@ -3211,4 +3051,16 @@
             assertEquals(ebbs.get(i).getBuildingBlock().getBpmnFlowName(), flowNames[i]);
         }
     }
+
+    private void initExecution(String gAction, String bpmnRequest, boolean isAlaCarte) {
+        execution.setVariable("mso-request-id", "00f704ca-c5e5-4f95-a72c-6889db7b0688");
+        execution.setVariable("requestAction", gAction);
+        execution.setVariable("bpmnRequest", bpmnRequest);
+        execution.setVariable("aLaCarte", isAlaCarte);
+        execution.setVariable("apiVersion", "7");
+    }
+
+    private String readBpmnRequestFromFile(String fileName) throws IOException {
+        return new String(Files.readAllBytes(Paths.get("src/test/resources/__files/" + fileName)));
+    }
 }
diff --git a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/listeners/HomingListenerTest.java b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/listeners/HomingListenerTest.java
new file mode 100644
index 0000000..d238318
--- /dev/null
+++ b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/listeners/HomingListenerTest.java
@@ -0,0 +1,59 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2020 Nokia
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.bpmn.infrastructure.workflow.tasks.listeners;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import org.camunda.bpm.engine.delegate.DelegateExecution;
+import org.camunda.bpm.extension.mockito.delegate.DelegateExecutionFake;
+import org.junit.Test;
+import org.onap.so.bpmn.common.BuildingBlockExecution;
+import org.onap.so.bpmn.common.DelegateExecutionImpl;
+import org.onap.so.bpmn.servicedecomposition.entities.ExecuteBuildingBlock;
+
+public class HomingListenerTest {
+
+    private static final String CALLED_HOMING = "calledHoming";
+
+    @Test
+    public void shouldRunForAssignVnfBB() {
+        assertThat(new HomingListener().shouldRunFor("AssignVnfBB", false, null)).isTrue();
+    }
+
+    @Test
+    public void shouldNotRunForDifferentThanAssignVnfBB() {
+        assertThat(new HomingListener().shouldRunFor("someDifferentBB", false, null)).isFalse();
+    }
+
+    @Test
+    public void runWithHoming() {
+        // given
+        DelegateExecution execution = new DelegateExecutionFake();
+        execution.setVariable("homing", true);
+        execution.setVariable(CALLED_HOMING, false);
+        BuildingBlockExecution buildingBlockExecution = new DelegateExecutionImpl(execution);
+        ExecuteBuildingBlock executeBuildingBlock = new ExecuteBuildingBlock();
+        // when
+        new HomingListener().run(null, executeBuildingBlock, buildingBlockExecution);
+        // then
+        assertThat(executeBuildingBlock.isHoming()).isTrue();
+        assertThat((boolean) buildingBlockExecution.getVariable(CALLED_HOMING)).isTrue();
+    }
+}
diff --git a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/client/orchestration/AAIPnfResourcesTest.java b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/client/orchestration/AAIPnfResourcesTest.java
index 59cd53e..b8be045 100644
--- a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/client/orchestration/AAIPnfResourcesTest.java
+++ b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/client/orchestration/AAIPnfResourcesTest.java
@@ -48,13 +48,18 @@
 import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance;
 import org.onap.aaiclient.client.aai.AAIResourcesClient;
 import org.onap.aaiclient.client.aai.entities.uri.AAIResourceUri;
+import org.onap.so.bpmn.servicedecomposition.modelinfo.ModelInfoPnf;
 import org.onap.so.client.aai.mapper.AAIObjectMapper;
 import org.onap.so.db.catalog.beans.OrchestrationStatus;
 
 @RunWith(MockitoJUnitRunner.Silent.class)
 public class AAIPnfResourcesTest extends TestDataSetup {
 
+    public static final String TEST_VERSION = "testVersion";
     private static final String PNF_NAME = "pnfTest";
+    public static final String TEST_CUSTOMIZATION_UUID = "testCustomizationUuid";
+    public static final String TEST_INVARIANT_UUID = "testInvariantUuid";
+    public static final String TEST_ROLE = "testRole";
 
     private Pnf pnf;
     private ServiceInstance serviceInstance;
@@ -110,42 +115,87 @@
     @Test
     public void existingPnfInAaiWithInventoriedStatusCanBeUsed() throws Exception {
         // given
+        Pnf pnfTest = createPnfWithDefaultName();
         org.onap.aai.domain.yang.Pnf pnfFromAai = createPnf(OrchestrationStatus.INVENTORIED.toString());
         when(injectionHelperMock.getAaiClient().get(org.onap.aai.domain.yang.Pnf.class,
                 AAIUriFactory.createResourceUri(AAIObjectType.PNF, PNF_NAME))).thenReturn(Optional.of(pnfFromAai));
         // when
-        testedObject.checkIfPnfExistsInAaiAndCanBeUsed(PNF_NAME);
+        testedObject.checkIfPnfExistsInAaiAndCanBeUsed(pnfTest);
+        verify(aaiResourcesClientMock, times(1)).update(any(), any());
     }
 
     @Test
     public void existingPnfInAaiWithNullStatusCanBeUsed() throws Exception {
         // given
+        Pnf pnfTest = createPnfWithDefaultName();
         org.onap.aai.domain.yang.Pnf pnfFromAai = createPnf(null);
+        pnfTest.setRole("test");
         when(injectionHelperMock.getAaiClient().get(org.onap.aai.domain.yang.Pnf.class,
                 AAIUriFactory.createResourceUri(AAIObjectType.PNF, PNF_NAME))).thenReturn(Optional.of(pnfFromAai));
         // when
-        testedObject.checkIfPnfExistsInAaiAndCanBeUsed(PNF_NAME);
+        testedObject.checkIfPnfExistsInAaiAndCanBeUsed(pnfTest);
+        verify(aaiResourcesClientMock, times(1)).update(any(), eq(pnfFromAai));
+    }
+
+    @Test
+    public void existingPnfInAaiIsUpdated() throws Exception {
+        // given
+        org.onap.aai.domain.yang.Pnf pnfFromAai = createPnf(null);
+        Pnf pnfTest = getPnfWithTestValues();
+        when(injectionHelperMock.getAaiClient().get(org.onap.aai.domain.yang.Pnf.class,
+                AAIUriFactory.createResourceUri(AAIObjectType.PNF, PNF_NAME))).thenReturn(Optional.of(pnfFromAai));
+        // when
+        testedObject.checkIfPnfExistsInAaiAndCanBeUsed(pnfTest);
+        verify(aaiResourcesClientMock, times(1)).update(any(), eq(pnfFromAai));
+        verifyPnfFromAai(pnfFromAai);
+    }
+
+    private void verifyPnfFromAai(org.onap.aai.domain.yang.Pnf pnf) {
+        assertEquals(OrchestrationStatus.INVENTORIED.toString(), pnf.getOrchestrationStatus());
+        assertEquals(TEST_ROLE, pnf.getNfRole());
+        assertEquals(TEST_CUSTOMIZATION_UUID, pnf.getModelCustomizationId());
+        assertEquals(TEST_INVARIANT_UUID, pnf.getModelInvariantId());
+        assertEquals(TEST_VERSION, pnf.getModelVersionId());
+    }
+
+    private Pnf getPnfWithTestValues() {
+        Pnf pnfTest = createPnfWithDefaultName();
+        ModelInfoPnf modelInfoPnf = getModelInfoPnf();
+        pnfTest.setModelInfoPnf(modelInfoPnf);
+        pnfTest.setOrchestrationStatus(OrchestrationStatus.INVENTORIED);
+        pnfTest.setRole(TEST_ROLE);
+        return pnfTest;
+    }
+
+    private ModelInfoPnf getModelInfoPnf() {
+        ModelInfoPnf modelInfoPnf = new ModelInfoPnf();
+        modelInfoPnf.setModelCustomizationUuid(TEST_CUSTOMIZATION_UUID);
+        modelInfoPnf.setModelInvariantUuid(TEST_INVARIANT_UUID);
+        modelInfoPnf.setModelUuid(TEST_VERSION);
+        return modelInfoPnf;
     }
 
     @Test
     public void existingPnfInAaiWithEmptyStatusCanBeUsed() throws Exception {
         // given
+        Pnf pnfTest = createPnfWithDefaultName();
         org.onap.aai.domain.yang.Pnf pnfFromAai = createPnf(Strings.EMPTY);
         when(injectionHelperMock.getAaiClient().get(org.onap.aai.domain.yang.Pnf.class,
                 AAIUriFactory.createResourceUri(AAIObjectType.PNF, PNF_NAME))).thenReturn(Optional.of(pnfFromAai));
         // when
-        testedObject.checkIfPnfExistsInAaiAndCanBeUsed(PNF_NAME);
+        testedObject.checkIfPnfExistsInAaiAndCanBeUsed(pnfTest);
     }
 
     @Test
     public void existingPnfInAaiCanNotBeUsed() {
         // given
+        Pnf pnfTest = createPnfWithDefaultName();
         org.onap.aai.domain.yang.Pnf pnfFromAai = createPnf(OrchestrationStatus.ACTIVE.toString());
         when(injectionHelperMock.getAaiClient().get(org.onap.aai.domain.yang.Pnf.class,
                 AAIUriFactory.createResourceUri(AAIObjectType.PNF, PNF_NAME))).thenReturn(Optional.of(pnfFromAai));
         // when
         try {
-            testedObject.checkIfPnfExistsInAaiAndCanBeUsed(PNF_NAME);
+            testedObject.checkIfPnfExistsInAaiAndCanBeUsed(pnfTest);
         } catch (Exception e) {
             // then
             assertThat(e.getMessage()).isEqualTo(String.format(
@@ -153,6 +203,7 @@
                             + "if status is not set or set as Inventoried",
                     PNF_NAME));
         }
+        verify(aaiResourcesClientMock, times(0)).update(any(), any());
     }
 
     @Test
@@ -161,19 +212,21 @@
         final String relatedTo = "service-instance";
         final String serviceInstanceId = "service-instance-id";
         final String path = "src/test/resources/__files/BuildingBlocks/aaiPnf.json";
+        Pnf pnfTest = createPnfWithDefaultName();
         org.onap.aai.domain.yang.Pnf pnfFromAai =
                 new ObjectMapper().readValue(new File(path), org.onap.aai.domain.yang.Pnf.class);
         when(injectionHelperMock.getAaiClient().get(org.onap.aai.domain.yang.Pnf.class,
                 AAIUriFactory.createResourceUri(AAIObjectType.PNF, PNF_NAME))).thenReturn(Optional.of(pnfFromAai));
         // when
         try {
-            testedObject.checkIfPnfExistsInAaiAndCanBeUsed(PNF_NAME);
+            testedObject.checkIfPnfExistsInAaiAndCanBeUsed(pnfTest);
         } catch (Exception e) {
             // then
             assertThat(e.getMessage()).isEqualTo(String.format(
                     "Pnf with name %s exist with orchestration status %s and is related to %s service with certain service-instance-id: %s",
                     PNF_NAME, OrchestrationStatus.ACTIVE, relatedTo, serviceInstanceId));
         }
+        verify(aaiResourcesClientMock, times(0)).update(any(), any());
     }
 
     private org.onap.aai.domain.yang.Pnf createPnf(String orchestrationStatus) {
@@ -182,4 +235,10 @@
         pnfFromAai.setOrchestrationStatus(orchestrationStatus);
         return pnfFromAai;
     }
+
+    private Pnf createPnfWithDefaultName() {
+        Pnf pnfTest = new Pnf();
+        pnfTest.setPnfName(PNF_NAME);
+        return pnfTest;
+    }
 }
diff --git a/bpmn/so-bpmn-tasks/src/test/resources/__files/aaiVfModule.json b/bpmn/so-bpmn-tasks/src/test/resources/__files/aaiVfModule.json
new file mode 100644
index 0000000..ac047a9
--- /dev/null
+++ b/bpmn/so-bpmn-tasks/src/test/resources/__files/aaiVfModule.json
@@ -0,0 +1,40 @@
+{
+    "automated-assignment": false,
+    "heat-stack-id": "zauk53avetd02_base/5c7a8a55-edb8-458e-a7dc-2dbbc696682e",
+    "is-base-vf-module": true,
+    "model-customization-id": "521d5f9b-0b76-49d3-879e-fce8767f34eb",
+    "model-invariant-id": "f0ac6f78-543f-41ac-81c3-672a4d47001c",
+    "model-version-id": "215ea5bd-f0e0-4560-9f64-9a9716ff6178",
+    "module-index": 0,
+    "orchestration-status": "Active",
+    "relationship-list": {
+        "relationship": [
+            {
+                "related-link": "/aai/v20/network/vnfcs/vnfc/zauk53avetd02svm001",
+                "related-to": "vnfc",
+                "relationship-data": [
+                    {
+                        "relationship-key": "vnfc.vnfc-name",
+                        "relationship-value": "zauk53avetd02svm001"
+                    }
+                ],
+                "relationship-label": "org.onap.relationships.inventory.Uses"
+            },
+            {
+                "related-link": "/aai/v20/network/vnfcs/vnfc/zauk53avetd02tvm001",
+                "related-to": "vnfc",
+                "relationship-data": [
+                    {
+                        "relationship-key": "vnfc.vnfc-name",
+                        "relationship-value": "zauk53avetd02tvm001"
+                    }
+                ],
+                "relationship-label": "org.onap.relationships.inventory.Uses"
+            }
+        ]
+    },
+    "resource-version": "1595304004908",
+    "selflink": "restconf/config/GENERIC-RESOURCE-API:services/service/16b9c65d-70c7-47f0-aa03-7cdb8dfb76be/service-data/vnfs/vnf/9cf22c37-4f39-4fa5-a942-b72efc8f6450/vnf-data/vf-modules/vf-module/2cf0ecd4-737c-4a46-9097-adc2f0088483/vf-module-data/vf-module-topology/",
+    "vf-module-id": "2cf0ecd4-737c-4a46-9097-adc2f0088483",
+    "vf-module-name": "zauk53avetd02_base"
+}
\ No newline at end of file
diff --git a/common/pom.xml b/common/pom.xml
index 08dfc4d..24baad7 100644
--- a/common/pom.xml
+++ b/common/pom.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0"?>
+<?xml version="1.0" ?>
 <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>
@@ -143,6 +143,10 @@
           <groupId>javax.servlet</groupId>
           <artifactId>servlet-api</artifactId>
         </exclusion>
+        <exclusion>
+          <groupId>log4j</groupId>
+          <artifactId>log4j</artifactId>
+        </exclusion>
       </exclusions>
     </dependency>
     <dependency>
@@ -354,4 +358,4 @@
       </plugin>
     </plugins>
   </build>
-</project>
+</project>
\ No newline at end of file
diff --git a/common/src/main/java/org/onap/so/client/KeyStoreLoader.java b/common/src/main/java/org/onap/so/client/KeyStoreLoader.java
new file mode 100644
index 0000000..8279be8
--- /dev/null
+++ b/common/src/main/java/org/onap/so/client/KeyStoreLoader.java
@@ -0,0 +1,48 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2020 Deutsche Telekom.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.client;
+
+import java.io.FileInputStream;
+import java.nio.file.Paths;
+import java.security.KeyStore;
+
+public abstract class KeyStoreLoader {
+
+    static final String SSL_KEY_STORE_KEY = "javax.net.ssl.keyStore";
+
+    static public KeyStore getKeyStore() {
+        KeyStore ks = null;
+        final char[] password = getSSlKeyStorePassword().toCharArray();
+        try (FileInputStream fis =
+                new FileInputStream(Paths.get(System.getProperty(SSL_KEY_STORE_KEY)).normalize().toString())) {
+            ks = KeyStore.getInstance(KeyStore.getDefaultType());
+            ks.load(fis, password);
+        } catch (final Exception e) {
+            return null;
+        }
+
+        return ks;
+    }
+
+    static public String getSSlKeyStorePassword() {
+        return System.getProperty("javax.net.ssl.keyStorePassword");
+    }
+}
diff --git a/common/src/main/java/org/onap/so/client/RestClientSSL.java b/common/src/main/java/org/onap/so/client/RestClientSSL.java
index f5737b8..1e89538 100644
--- a/common/src/main/java/org/onap/so/client/RestClientSSL.java
+++ b/common/src/main/java/org/onap/so/client/RestClientSSL.java
@@ -20,9 +20,7 @@
 
 package org.onap.so.client;
 
-import java.io.FileInputStream;
 import java.net.URI;
-import java.nio.file.Paths;
 import java.security.KeyStore;
 import java.security.NoSuchAlgorithmException;
 import java.util.Optional;
@@ -33,10 +31,8 @@
 public abstract class RestClientSSL extends RestClient {
 
     private static final String TRUE = "true";
-    private static final String SSL_KEY_STORE_KEY = "javax.net.ssl.keyStore";
     private static final String MSO_LOAD_SSL_CLIENT_KEYSTORE_KEY = "mso.load.ssl.client.keystore";
 
-
     protected RestClientSSL(RestProperties props, Optional<URI> path) {
         super(props, path);
     }
@@ -52,9 +48,9 @@
         try {
             String loadSSLKeyStore = System.getProperty(RestClientSSL.MSO_LOAD_SSL_CLIENT_KEYSTORE_KEY);
             if (loadSSLKeyStore != null && loadSSLKeyStore.equalsIgnoreCase(TRUE)) {
-                KeyStore ks = getKeyStore();
+                KeyStore ks = KeyStoreLoader.getKeyStore();
                 if (ks != null) {
-                    client = ClientBuilder.newBuilder().keyStore(ks, getSSlKeyStorePassword()).build();
+                    client = ClientBuilder.newBuilder().keyStore(ks, KeyStoreLoader.getSSlKeyStorePassword()).build();
                     logger.info("RestClientSSL not using default SSL context - setting keystore here.");
                     return client;
                 }
@@ -67,23 +63,4 @@
         }
         return client;
     }
-
-    private KeyStore getKeyStore() {
-        KeyStore ks = null;
-        char[] password = getSSlKeyStorePassword().toCharArray();
-        try (FileInputStream fis = new FileInputStream(
-                Paths.get(System.getProperty(RestClientSSL.SSL_KEY_STORE_KEY)).normalize().toString())) {
-            ks = KeyStore.getInstance(KeyStore.getDefaultType());
-
-            ks.load(fis, password);
-        } catch (Exception e) {
-            return null;
-        }
-
-        return ks;
-    }
-
-    private String getSSlKeyStorePassword() {
-        return System.getProperty("javax.net.ssl.keyStorePassword");
-    }
 }
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 7ef1589..fa309b5 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
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * ONAP - SO
  * ================================================================================
- * Copyright (C) 2017 - 2019 Bell Canada.
+ * Copyright (C) 2017 - 2019 Bell Canada, Deutsche Telekom.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -23,9 +23,16 @@
 import io.grpc.ManagedChannel;
 import io.grpc.internal.DnsNameResolverProvider;
 import io.grpc.internal.PickFirstLoadBalancerProvider;
+import io.grpc.netty.GrpcSslContexts;
 import io.grpc.netty.NettyChannelBuilder;
+import java.security.KeyStore;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
 import java.util.concurrent.CountDownLatch;
+import javax.net.ssl.SSLException;
+import javax.net.ssl.TrustManagerFactory;
 import org.onap.ccsdk.cds.controllerblueprints.processing.api.ExecutionServiceInput;
+import org.onap.so.client.KeyStoreLoader;
 import org.onap.so.client.PreconditionFailedException;
 import org.onap.so.client.RestPropertiesLoader;
 import org.slf4j.Logger;
@@ -73,10 +80,36 @@
             throw new PreconditionFailedException(
                     "No RestProperty.CDSProperties implementation found on classpath, can't create client.");
         }
-        this.channel = NettyChannelBuilder.forAddress(props.getHost(), props.getPort())
+        NettyChannelBuilder builder = NettyChannelBuilder.forAddress(props.getHost(), props.getPort())
                 .nameResolverFactory(new DnsNameResolverProvider())
-                .loadBalancerFactory(new PickFirstLoadBalancerProvider())
-                .intercept(new BasicAuthClientInterceptor(props)).usePlaintext().build();
+                .loadBalancerFactory(new PickFirstLoadBalancerProvider());
+        if (props.getUseSSL()) {
+            log.info("Configure SSL connection");
+            KeyStore ks = KeyStoreLoader.getKeyStore();
+            if (ks == null) {
+                log.error("Can't load KeyStore");
+                throw new RuntimeException("Can't load KeyStore to create secure channel");
+            }
+            try {
+                TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
+                tmf.init(ks);
+                builder.sslContext(GrpcSslContexts.forClient().trustManager(tmf).build());
+            } catch (NoSuchAlgorithmException e) {
+                log.error("Can't get default TrustManager algorithm");
+                throw new RuntimeException(e);
+            } catch (KeyStoreException e) {
+                log.error("TrustManagerFactory initialization failed");
+                throw new RuntimeException(e);
+            } catch (SSLException e) {
+                log.error("SslContext build error");
+                throw new RuntimeException(e);
+            }
+        }
+        if (props.getUseBasicAuth()) {
+            log.info("Configure Basic authentication");
+            builder.intercept(new BasicAuthClientInterceptor(props)).usePlaintext();
+        }
+        this.channel = builder.build();
         this.handler = new CDSProcessingHandler(listener);
         log.info("CDSProcessingClient started");
     }
diff --git a/common/src/main/java/org/onap/so/client/cds/CDSProperties.java b/common/src/main/java/org/onap/so/client/cds/CDSProperties.java
index 37a5c0b..db566fa 100644
--- a/common/src/main/java/org/onap/so/client/cds/CDSProperties.java
+++ b/common/src/main/java/org/onap/so/client/cds/CDSProperties.java
@@ -22,7 +22,6 @@
 
 import org.onap.so.client.RestProperties;
 
-
 public interface CDSProperties extends RestProperties {
 
     String getHost();
@@ -32,4 +31,8 @@
     String getBasicAuth();
 
     int getTimeout();
+
+    boolean getUseSSL();
+
+    boolean getUseBasicAuth();
 }
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 18ec9ef..5792c28 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
@@ -20,7 +20,6 @@
 
 package org.onap.so.client.cds;
 
-
 import static org.junit.Assert.*;
 import static org.mockito.Mockito.*;
 import io.grpc.inprocess.InProcessChannelBuilder;
@@ -58,7 +57,6 @@
     private CDSProcessingHandler handler;
     private CDSProcessingClient client;
 
-
     private final MutableHandlerRegistry serviceRegistry = new MutableHandlerRegistry();
     private final List<String> messagesDelivered = new ArrayList<>();
     private final CountDownLatch allRequestsDelivered = new CountDownLatch(1);
@@ -115,7 +113,6 @@
         new CDSProcessingClient(listener);
     }
 
-
     @Test
     public void testSendMessageFail() throws Exception {
 
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 2834d37..41238e5 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
@@ -72,4 +72,14 @@
     public int getTimeout() {
         return 60;
     }
+
+    @Override
+    public boolean getUseSSL() {
+        return false;
+    }
+
+    @Override
+    public boolean getUseBasicAuth() {
+        return true;
+    }
 }
diff --git a/docs/developer_info/Working_with_so_monitoring.rst b/docs/developer_info/Working_with_so_monitoring.rst
new file mode 100644
index 0000000..18b6d94
--- /dev/null
+++ b/docs/developer_info/Working_with_so_monitoring.rst
@@ -0,0 +1,70 @@
+.. This work is licensed under a Creative Commons Attribution 4.0 International License.
+.. http://creativecommons.org/licenses/by/4.0
+.. Copyright 2017 Huawei Technologies Co., Ltd.
+
+Working with SO Monitoring
+==========================
+
+After the SO code is fully deployed, certain changes needs to be made in order to access the so-monitoring ui.
+
+1. Change the service type to NodePort
+---------------------------------------
+
+By default, the type of the so monitoring service is ClusterIP, which makes the Service only reachable from within the cluster.
+This is changed to NodePort, which is used to expose the service at a static port . Hence we will be able to contact the NodePort Service, from outside the cluster, by requesting <NodeIP>:<NodePort>.
+
+Command used to get the service configuration of so monitoring is:
+
+**sudo kubectl edit svc so-monitoring -n onap**
+
+.. image:: ../images/nodeport.png
+
+2. Add the credentials to login
+--------------------------------
+
+The override.yaml needs to be added with the login credentials, that is the username and the password in encrypted form.
+
+.. code-block:: bash
+
+ spring:
+   main:
+     allow-bean-definition-overriding: true
+   security:
+     usercredentials:
+     -                                         
+       username: gui
+       password: '$2a$10$Fh9ffgPw2vnmsghsRD3ZauBL1aKXebigbq3BB1RPWtE62UDILsjke'
+       role: GUI-Client
+
+This override.yaml can be directly edited in case of local setup using docker.
+
+When deploying in any environment  using OOM, then after deployment the configmap needs to be edited. As configmap is the one reading the override.yaml.
+
+**Note** : Before deployment , if we add these changes in override.yaml ,then it may give parsing error in configmap while deployment. And after deployment the permissions on override.yaml don't allow us to edit it. So the best option is to edit the configmap using the below command and restart the pod. 
+
+**kubectl -n onap edit configmap dev-so-monitoring-app-configmap**
+
+.. image:: ../images/configmap.png
+
+Special care needs to be given to the indentation. spring needs to be inline with the mso already present and others added accordingly.
+
+3. Login to SO Monitoring
+-------------------------
+
+We need to first identify the external port which its mapped to using the following command : 
+
+**sudo kubectl -n onap get svc | grep so-monitoring**
+
+.. image:: ../images/nodemap.png
+
+Then access the UI of so monitoring , for example by  http://<IP>:30224/ 
+
+username : gui,
+password: password1$
+
+
+.. image:: ../images/ui.png
+
+
+
+
diff --git a/docs/developer_info/developer_information.rst b/docs/developer_info/developer_information.rst
index 10ea836..63338de 100644
--- a/docs/developer_info/developer_information.rst
+++ b/docs/developer_info/developer_information.rst
@@ -11,6 +11,7 @@
 
    Building_SO.rst
    Working_with_SO_Docker.rst
+   Working_with_so_monitoring.rst
    Camunda_Cockpit_Community_Edition.rst
    Camunda_Cockpit_Enterprise_Edition.rst
    Camunda_Modeler.rst
diff --git a/docs/images/configmap.png b/docs/images/configmap.png
new file mode 100644
index 0000000..3683de3
--- /dev/null
+++ b/docs/images/configmap.png
Binary files differ
diff --git a/docs/images/nodemap.png b/docs/images/nodemap.png
new file mode 100644
index 0000000..8dfda6c
--- /dev/null
+++ b/docs/images/nodemap.png
Binary files differ
diff --git a/docs/images/nodeport.png b/docs/images/nodeport.png
new file mode 100644
index 0000000..53bc02f
--- /dev/null
+++ b/docs/images/nodeport.png
Binary files differ
diff --git a/docs/images/ui.png b/docs/images/ui.png
new file mode 100644
index 0000000..1c075ba
--- /dev/null
+++ b/docs/images/ui.png
Binary files differ
diff --git a/graph-inventory/aai-client/src/main/java/org/onap/aaiclient/client/graphinventory/entities/DSLQueryBuilder.java b/graph-inventory/aai-client/src/main/java/org/onap/aaiclient/client/graphinventory/entities/DSLQueryBuilder.java
index 59e3895..c56ce0b 100644
--- a/graph-inventory/aai-client/src/main/java/org/onap/aaiclient/client/graphinventory/entities/DSLQueryBuilder.java
+++ b/graph-inventory/aai-client/src/main/java/org/onap/aaiclient/client/graphinventory/entities/DSLQueryBuilder.java
@@ -63,7 +63,7 @@
 
         Object obj = steps.get(steps.size() - 1);
         if (obj instanceof DSLNodeBase) {
-            ((DSLNodeBase) steps.get(steps.size() - 1)).output();
+            consumer.accept((DSLNodeBase) steps.get(steps.size() - 1));
         } else if (obj.getClass().getName().contains("$$Lambda$")) {
             // process lambda expressions
             for (Field f : obj.getClass().getDeclaredFields()) {
diff --git a/graph-inventory/aai-client/src/main/java/org/onap/aaiclient/client/graphinventory/entities/GraphInventoryRelationships.java b/graph-inventory/aai-client/src/main/java/org/onap/aaiclient/client/graphinventory/entities/GraphInventoryRelationships.java
index 48feba2..881b7e9 100644
--- a/graph-inventory/aai-client/src/main/java/org/onap/aaiclient/client/graphinventory/entities/GraphInventoryRelationships.java
+++ b/graph-inventory/aai-client/src/main/java/org/onap/aaiclient/client/graphinventory/entities/GraphInventoryRelationships.java
@@ -27,6 +27,7 @@
 import java.util.Map;
 import java.util.Optional;
 import java.util.function.Predicate;
+import java.util.function.UnaryOperator;
 import org.onap.aaiclient.client.graphinventory.GraphInventoryCommonObjectMapperProvider;
 import org.onap.aaiclient.client.graphinventory.GraphInventoryObjectName;
 import org.onap.aaiclient.client.graphinventory.GraphInventoryObjectType;
@@ -56,6 +57,11 @@
         return this.getAll(Optional.of(type));
     }
 
+    public List<Wrapper> getByType(GraphInventoryObjectName type, UnaryOperator<Uri> func) {
+
+        return this.getAll(Optional.of(type), func);
+    }
+
     public List<Wrapper> getAll() {
 
         return this.getAll(Optional.empty());
@@ -99,6 +105,10 @@
 
 
     protected List<Wrapper> getAll(final Optional<GraphInventoryObjectName> type) {
+        return getAll(type, UnaryOperator.identity());
+    }
+
+    protected List<Wrapper> getAll(final Optional<GraphInventoryObjectName> type, UnaryOperator<Uri> func) {
         List<Uri> relatedLinks;
         if (type.isPresent()) {
             relatedLinks = this.getRelatedUris(type.get());
@@ -107,7 +117,7 @@
         }
         ArrayList<Wrapper> result = new ArrayList<>();
         for (Uri link : relatedLinks) {
-            result.add(this.get(link));
+            result.add(this.get(func.apply(link)));
         }
         return result;
     }
diff --git a/graph-inventory/aai-client/src/test/java/org/onap/aaiclient/client/aai/DSLQueryBuilderTest.java b/graph-inventory/aai-client/src/test/java/org/onap/aaiclient/client/aai/DSLQueryBuilderTest.java
index 9cae761..b0b0c6a 100644
--- a/graph-inventory/aai-client/src/test/java/org/onap/aaiclient/client/aai/DSLQueryBuilderTest.java
+++ b/graph-inventory/aai-client/src/test/java/org/onap/aaiclient/client/aai/DSLQueryBuilderTest.java
@@ -26,6 +26,7 @@
 import org.onap.aaiclient.client.graphinventory.entities.DSLNodeKey;
 import org.onap.aaiclient.client.graphinventory.entities.DSLQueryBuilder;
 import org.onap.aaiclient.client.graphinventory.entities.DSLStartNode;
+import org.onap.aaiclient.client.graphinventory.entities.Node;
 import org.onap.aaiclient.client.graphinventory.entities.Output;
 import org.onap.aaiclient.client.graphinventory.entities.Start;
 import org.onap.aaiclient.client.graphinventory.entities.TraversalBuilder;
@@ -149,12 +150,20 @@
 
     @Test
     public void selectOutputFilterTest() {
-        DSLQueryBuilder<Output, Output> builder =
-                TraversalBuilder.traversal(new DSLStartNode(AAIObjectType.CLOUD_REGION, __.key("cloud-owner", "att-nc"))
+        DSLQueryBuilder<Output, Output> builder = TraversalBuilder
+                .traversal(new DSLStartNode(AAIObjectType.CLOUD_REGION, __.key("cloud-owner", "CloudOwner"))
                         .output("cloud-region-id", "a", "b"));
         builder.to(__.node(AAIObjectType.PSERVER)).output("x", "y", "z");
 
-        assertEquals("cloud-region{'cloud-region-id', 'a', 'b'}('cloud-owner', 'att-nc') > pserver{'x', 'y', 'z'}",
+        assertEquals("cloud-region{'cloud-region-id', 'a', 'b'}('cloud-owner', 'CloudOwner') > pserver{'x', 'y', 'z'}",
                 builder.build().toString());
     }
+
+    @Test
+    public void selectOutputFilterOnNodeTest() {
+        DSLStartNode node = new DSLStartNode(AAIObjectType.CLOUD_REGION, __.key("cloud-owner", "CloudOwner"));
+        DSLQueryBuilder<Start, Node> builder = TraversalBuilder.fragment(node).output("cloud-region-id");
+
+        assertEquals("cloud-region{'cloud-region-id'}('cloud-owner', 'CloudOwner')", builder.build().toString());
+    }
 }
diff --git a/graph-inventory/aai-client/src/test/java/org/onap/aaiclient/client/aai/entities/RelationshipsTest.java b/graph-inventory/aai-client/src/test/java/org/onap/aaiclient/client/aai/entities/RelationshipsTest.java
index 10162f8..9e106fa 100644
--- a/graph-inventory/aai-client/src/test/java/org/onap/aaiclient/client/aai/entities/RelationshipsTest.java
+++ b/graph-inventory/aai-client/src/test/java/org/onap/aaiclient/client/aai/entities/RelationshipsTest.java
@@ -21,12 +21,15 @@
 package org.onap.aaiclient.client.aai.entities;
 
 import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.doReturn;
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Paths;
 import java.util.Arrays;
 import java.util.List;
 import org.junit.Test;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mockito;
 import org.onap.aaiclient.client.aai.AAIObjectType;
 import org.onap.aaiclient.client.aai.entities.uri.AAIResourceUri;
 import org.onap.aaiclient.client.aai.entities.uri.AAIUriFactory;
@@ -53,4 +56,27 @@
 
     }
 
+    @Test
+    public void getByTypeTest() throws IOException {
+        final String content = new String(Files.readAllBytes(Paths.get(AAI_JSON_FILE_LOCATION + "e2e-complex.json")));
+
+        AAIResultWrapper wrapper = new AAIResultWrapper(content);
+        Relationships relationships = wrapper.getRelationships().get();
+
+        Relationships spy = Mockito.spy(relationships);
+        ArgumentCaptor<AAIResourceUri> argument = ArgumentCaptor.forClass(AAIResourceUri.class);
+        doReturn(new AAIResultWrapper("{}")).when(spy).get(argument.capture());
+
+        spy.getByType(AAIObjectType.VCE, uri -> uri.nodesOnly(true));
+
+        assertTrue(argument.getAllValues().stream().allMatch(item -> item.build().toString().contains("nodes-only")));
+
+        argument = ArgumentCaptor.forClass(AAIResourceUri.class);
+
+        doReturn(new AAIResultWrapper("{}")).when(spy).get(argument.capture());
+        spy.getByType(AAIObjectType.VCE);
+
+        assertTrue(argument.getAllValues().stream().allMatch(item -> !item.build().toString().contains("?")));
+
+    }
 }
diff --git a/mso-api-handlers/mso-api-handler-infra/pom.xml b/mso-api-handlers/mso-api-handler-infra/pom.xml
index afb734d..eb7b73c 100644
--- a/mso-api-handlers/mso-api-handler-infra/pom.xml
+++ b/mso-api-handlers/mso-api-handler-infra/pom.xml
@@ -244,6 +244,10 @@
           <groupId>javax.servlet</groupId>
           <artifactId>servlet-api</artifactId>
         </exclusion>
+        <exclusion>
+          <groupId>log4j</groupId>
+          <artifactId>log4j</artifactId>
+        </exclusion>
       </exclusions>
     </dependency>
     <dependency>
diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/InstanceManagement.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/InstanceManagement.java
index f39a95e..b59f298 100644
--- a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/InstanceManagement.java
+++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/InstanceManagement.java
@@ -9,6 +9,8 @@
  * ================================================================================
  * Modifications Copyright (c) 2020 Nokia
  * ================================================================================
+ * Modifications Copyright (c) 2020 Nordix
+ * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
@@ -25,7 +27,28 @@
 
 package org.onap.so.apihandlerinfra;
 
+import io.swagger.v3.oas.annotations.OpenAPIDefinition;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.info.Info;
+import io.swagger.v3.oas.annotations.media.ArraySchema;
+import io.swagger.v3.oas.annotations.media.Content;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+import javax.transaction.Transactional;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.container.ContainerRequestContext;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
 import org.apache.http.HttpStatus;
+import org.onap.logging.filter.base.ErrorCode;
 import org.onap.so.apihandler.common.ErrorNumbers;
 import org.onap.so.apihandler.common.RequestClientParameter;
 import org.onap.so.apihandlerinfra.exceptions.ApiException;
@@ -39,35 +62,13 @@
 import org.onap.so.db.request.beans.InfraActiveRequests;
 import org.onap.so.db.request.client.RequestsDbClient;
 import org.onap.so.exceptions.ValidationException;
-import org.onap.logging.filter.base.ErrorCode;
 import org.onap.so.logger.MessageEnum;
 import org.onap.so.serviceinstancebeans.ModelType;
-import org.onap.so.serviceinstancebeans.RequestReferences;
 import org.onap.so.serviceinstancebeans.ServiceInstancesRequest;
-import org.onap.so.serviceinstancebeans.ServiceInstancesResponse;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
-import javax.transaction.Transactional;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.container.ContainerRequestContext;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.io.IOException;
-import java.util.HashMap;
-import io.swagger.v3.oas.annotations.OpenAPIDefinition;
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.info.Info;
-import io.swagger.v3.oas.annotations.media.ArraySchema;
-import io.swagger.v3.oas.annotations.media.Content;
-import io.swagger.v3.oas.annotations.media.Schema;
-import io.swagger.v3.oas.annotations.responses.ApiResponse;
 
 @Component
 @Path("/onap/so/infra/instanceManagement")
@@ -75,8 +76,8 @@
         description = "Infrastructure API Requests for Instance Management"))
 public class InstanceManagement {
 
-    private static Logger logger = LoggerFactory.getLogger(InstanceManagement.class);
-    private static String uriPrefix = "/instanceManagement/";
+    private static final Logger LOG = LoggerFactory.getLogger(InstanceManagement.class);
+    private static final String URI_PREFIX = "/instanceManagement/";
     private static final String SAVE_TO_DB = "save instance to db";
 
     @Autowired
@@ -102,13 +103,13 @@
             @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
             @PathParam("workflowUuid") String workflowUuid, @Context ContainerRequestContext requestContext)
             throws ApiException {
-        String requestId = requestHandlerUtils.getRequestId(requestContext);
-        HashMap<String, String> instanceIdMap = new HashMap<>();
+        final String requestId = requestHandlerUtils.getRequestId(requestContext);
+        final Map<String, String> instanceIdMap = new HashMap<>();
         instanceIdMap.put("serviceInstanceId", serviceInstanceId);
         instanceIdMap.put("vnfInstanceId", vnfInstanceId);
         instanceIdMap.put("workflowUuid", workflowUuid);
         return processCustomWorkflowRequest(request, Action.inPlaceSoftwareUpdate, instanceIdMap, version, requestId,
-                requestContext);
+                requestContext, true);
     }
 
     @POST
@@ -122,34 +123,61 @@
             @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("pnfName") String pnfName,
             @PathParam("workflowUuid") String workflowUuid, @Context ContainerRequestContext requestContext)
             throws ApiException {
-        String requestId = requestHandlerUtils.getRequestId(requestContext);
-        HashMap<String, String> instanceIdMap = new HashMap<>();
+        final String requestId = requestHandlerUtils.getRequestId(requestContext);
+        final Map<String, String> instanceIdMap = new HashMap<>();
         instanceIdMap.put("serviceInstanceId", serviceInstanceId);
         instanceIdMap.put("pnfName", pnfName);
         instanceIdMap.put("workflowUuid", workflowUuid);
-        return processPNFCustomWorkflowRequest(request, Action.forCustomWorkflow, instanceIdMap, version, requestId,
-                requestContext);
+        return processCustomWorkflowRequest(request, Action.forCustomWorkflow, instanceIdMap, version, requestId,
+                requestContext, false);
     }
 
-    private Response processCustomWorkflowRequest(String requestJSON, Actions action,
-            HashMap<String, String> instanceIdMap, String version, String requestId,
-            ContainerRequestContext requestContext) throws ApiException {
-        String serviceInstanceId;
-        boolean aLaCarte = true;
-        ServiceInstancesRequest sir;
-        String apiVersion = version.substring(1);
+    @POST
+    @Path("/{version:[vV][1]}/serviceInstances/{serviceInstanceId}/workflows/{workflowUuid}")
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
+    @Operation(description = "Execute custom Service Level workflow", responses = @ApiResponse(
+            content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
+    @Transactional
+    public Response executeServiceLevelCustomWorkflow(String request, @PathParam("version") String version,
+            @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("workflowUuid") String workflowUuid,
+            @Context ContainerRequestContext requestContext) throws ApiException {
+        final String requestId = requestHandlerUtils.getRequestId(requestContext);
+        final Map<String, String> instanceIdMap = new HashMap<>();
+        instanceIdMap.put("serviceInstanceId", serviceInstanceId);
+        instanceIdMap.put("workflowUuid", workflowUuid);
+        return processCustomWorkflowRequest(request, Action.forCustomWorkflow, instanceIdMap, version, requestId,
+                requestContext, false);
+    }
 
-        String requestUri = requestHandlerUtils.getRequestUri(requestContext, uriPrefix);
+    private Response processCustomWorkflowRequest(final String requestJSON, final Actions action,
+            final Map<String, String> instanceIdMap, final String version, final String requestId,
+            final ContainerRequestContext requestContext, final boolean aLaCarte) throws ApiException {
+        String pnfName = null;
+        String vnfType = null;
+        String workflowUuid = null;
+        String vnfInstanceId = null;
+        String svcInstanceId = null;
+        final String apiVersion = version.substring(1);
 
-        sir = requestHandlerUtils.convertJsonToServiceInstanceRequest(requestJSON, action, requestId, requestUri);
-        String requestScope = requestHandlerUtils.deriveRequestScope(action, sir, requestUri);
-        InfraActiveRequests currentActiveReq =
-                msoRequest.createRequestObject(sir, action, requestId, Status.IN_PROGRESS, requestJSON, requestScope);
+        if (instanceIdMap != null && !instanceIdMap.isEmpty()) {
+            pnfName = instanceIdMap.get("pnfName");
+            workflowUuid = instanceIdMap.get("workflowUuid");
+            vnfInstanceId = instanceIdMap.get("vnfInstanceId");
+            svcInstanceId = instanceIdMap.get("serviceInstanceId");
+        }
+
+        final String requestUri = requestHandlerUtils.getRequestUri(requestContext, URI_PREFIX);
+        final ServiceInstancesRequest svcInsReq =
+                requestHandlerUtils.convertJsonToServiceInstanceRequest(requestJSON, action, requestId, requestUri);
+        final String requestScope = requestHandlerUtils.deriveRequestScope(action, svcInsReq, requestUri);
+        InfraActiveRequests currentActiveReq = msoRequest.createRequestObject(svcInsReq, action, requestId,
+                Status.IN_PROGRESS, requestJSON, requestScope);
 
         try {
             requestHandlerUtils.validateHeaders(requestContext);
         } catch (ValidationException e) {
-            logger.error("Exception occurred", e);
+            LOG.error("Exception occurred", e);
             ErrorLoggerInfo errorLoggerInfo =
                     new ErrorLoggerInfo.Builder(MessageEnum.APIH_VALIDATION_ERROR, ErrorCode.SchemaError)
                             .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
@@ -160,42 +188,18 @@
             throw validateException;
         }
 
-        requestHandlerUtils.parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId,
+        requestHandlerUtils.parseRequest(svcInsReq, instanceIdMap, action, version, requestJSON, aLaCarte, requestId,
                 currentActiveReq);
         requestHandlerUtils.setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
 
-        String vnfType = msoRequest.getVnfType(sir, requestScope);
-
-        if (requestScope.equalsIgnoreCase(ModelType.vnf.name()) && vnfType != null) {
+        if (requestScope.equalsIgnoreCase(ModelType.vnf.name())) {
+            vnfType = msoRequest.getVnfType(svcInsReq, requestScope);
             currentActiveReq.setVnfType(vnfType);
         }
 
         checkDuplicateAndBuildError(action, instanceIdMap, requestScope, currentActiveReq);
-
-        ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
-
-        RequestReferences referencesResponse = new RequestReferences();
-
-        referencesResponse.setRequestId(requestId);
-
-        serviceResponse.setRequestReferences(referencesResponse);
-        boolean isBaseVfModule = false;
-
-        String workflowUuid = null;
-        if (instanceIdMap != null) {
-            workflowUuid = instanceIdMap.get("workflowUuid");
-        }
-
-        RecipeLookupResult recipeLookupResult = getInstanceManagementWorkflowRecipe(currentActiveReq, workflowUuid);
-
-        String serviceInstanceType = requestHandlerUtils.getServiceType(requestScope, sir, true);
-
-        serviceInstanceId = requestHandlerUtils.setServiceInstanceId(requestScope, sir);
-        String vnfId = "";
-
-        if (sir.getVnfInstanceId() != null) {
-            vnfId = sir.getVnfInstanceId();
-        }
+        final RecipeLookupResult recipeLookupResult =
+                getInstanceManagementWorkflowRecipe(currentActiveReq, workflowUuid);
 
         currentActiveReq = setWorkflowNameAndOperationName(currentActiveReq, workflowUuid);
         saveCurrentActiveRequest(currentActiveReq);
@@ -203,11 +207,11 @@
         RequestClientParameter requestClientParameter;
         try {
             requestClientParameter = new RequestClientParameter.Builder().setRequestId(requestId)
-                    .setBaseVfModule(isBaseVfModule).setRecipeTimeout(recipeLookupResult.getRecipeTimeout())
-                    .setRequestAction(action.toString()).setServiceInstanceId(serviceInstanceId).setVnfId(vnfId)
-                    .setServiceType(serviceInstanceType).setVnfType(vnfType)
+                    .setRecipeTimeout(recipeLookupResult.getRecipeTimeout()).setRequestAction(action.toString())
+                    .setServiceInstanceId(svcInstanceId).setVnfId(vnfInstanceId).setVnfType(vnfType)
+                    .setPnfCorrelationId(pnfName).setApiVersion(apiVersion)
                     .setRequestDetails(requestHandlerUtils.mapJSONtoMSOStyle(requestJSON, null, aLaCarte, action))
-                    .setApiVersion(apiVersion).setALaCarte(aLaCarte).setRequestUri(requestUri).build();
+                    .setALaCarte(aLaCarte).setRequestUri(requestUri).build();
         } catch (IOException e) {
             ErrorLoggerInfo errorLoggerInfo =
                     new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, ErrorCode.SchemaError)
@@ -232,7 +236,7 @@
         }
     }
 
-    private void checkDuplicateAndBuildError(Actions action, HashMap<String, String> instanceIdMap, String requestScope,
+    private void checkDuplicateAndBuildError(Actions action, Map<String, String> instanceIdMap, String requestScope,
             InfraActiveRequests currentActiveReq) throws ApiException {
 
         InfraActiveRequests dup =
@@ -248,74 +252,6 @@
         }
     }
 
-    private Response processPNFCustomWorkflowRequest(String requestJSON, Actions action,
-            HashMap<String, String> instanceIdMap, String version, String requestId,
-            ContainerRequestContext requestContext) throws ApiException {
-        boolean aLaCarte = false;
-        ServiceInstancesRequest sir;
-        String apiVersion = version.substring(1);
-
-        String serviceInstanceId = "";
-        String pnfName = "";
-        String workflowUuid = "";
-        if (instanceIdMap != null) {
-            serviceInstanceId = instanceIdMap.get("serviceInstanceId");
-            pnfName = instanceIdMap.get("pnfName");
-            workflowUuid = instanceIdMap.get("workflowUuid");
-        }
-
-        String requestUri = requestHandlerUtils.getRequestUri(requestContext, uriPrefix);
-        sir = requestHandlerUtils.convertJsonToServiceInstanceRequest(requestJSON, action, requestId, requestUri);
-        sir.setServiceInstanceId(serviceInstanceId);
-        sir.setPnfName(pnfName);
-        String requestScope = ModelType.pnf.name();
-        InfraActiveRequests currentActiveReq =
-                msoRequest.createRequestObject(sir, action, requestId, Status.IN_PROGRESS, requestJSON, requestScope);
-
-        try {
-            requestHandlerUtils.validateHeaders(requestContext);
-        } catch (ValidationException e) {
-            logger.error("Exception occurred", e);
-            ErrorLoggerInfo errorLoggerInfo =
-                    new ErrorLoggerInfo.Builder(MessageEnum.APIH_VALIDATION_ERROR, ErrorCode.SchemaError)
-                            .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
-            ValidateException validateException =
-                    new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST,
-                            ErrorNumbers.SVC_BAD_PARAMETER).cause(e).errorInfo(errorLoggerInfo).build();
-            requestHandlerUtils.updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
-            throw validateException;
-        }
-
-        requestHandlerUtils.parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId,
-                currentActiveReq);
-        requestHandlerUtils.setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
-
-        checkDuplicateAndBuildError(action, instanceIdMap, requestScope, currentActiveReq);
-
-        RecipeLookupResult recipeLookupResult = getInstanceManagementWorkflowRecipe(currentActiveReq, workflowUuid);
-
-        currentActiveReq = setWorkflowNameAndOperationName(currentActiveReq, workflowUuid);
-        saveCurrentActiveRequest(currentActiveReq);
-
-        RequestClientParameter requestClientParameter;
-        try {
-            requestClientParameter = new RequestClientParameter.Builder().setRequestId(requestId)
-                    .setRecipeTimeout(recipeLookupResult.getRecipeTimeout()).setRequestAction(action.toString())
-                    .setServiceInstanceId(serviceInstanceId).setPnfCorrelationId(pnfName)
-                    .setRequestDetails(requestHandlerUtils.mapJSONtoMSOStyle(requestJSON, null, aLaCarte, action))
-                    .setApiVersion(apiVersion).setRequestUri(requestUri).build();
-        } catch (IOException e) {
-            ErrorLoggerInfo errorLoggerInfo =
-                    new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, ErrorCode.SchemaError)
-                            .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
-            throw new ValidateException.Builder("Unable to generate RequestClientParamter object" + e.getMessage(),
-                    HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER).errorInfo(errorLoggerInfo)
-                            .build();
-        }
-        return requestHandlerUtils.postBPELRequest(currentActiveReq, requestClientParameter,
-                recipeLookupResult.getOrchestrationURI(), requestScope);
-    }
-
     private RecipeLookupResult getInstanceManagementWorkflowRecipe(InfraActiveRequests currentActiveReq,
             String workflowUuid) throws ApiException {
         RecipeLookupResult recipeLookupResult;
diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/MsoRequest.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/MsoRequest.java
index f3c3ec5..4ac8b73 100644
--- a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/MsoRequest.java
+++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/MsoRequest.java
@@ -154,9 +154,8 @@
 
 
     // Parse request JSON
-    public void parse(ServiceInstancesRequest sir, HashMap<String, String> instanceIdMap, Actions action,
-            String version, String originalRequestJSON, int reqVersion, Boolean aLaCarteFlag)
-            throws ValidationException, IOException {
+    public void parse(ServiceInstancesRequest sir, Map<String, String> instanceIdMap, Actions action, String version,
+            String originalRequestJSON, int reqVersion, Boolean aLaCarteFlag) throws ValidationException, IOException {
 
         logger.debug("Validating the Service Instance request");
         List<ValidationRule> rules = new ArrayList<>();
diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/RequestHandlerUtils.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/RequestHandlerUtils.java
index a61975f..a68309f 100644
--- a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/RequestHandlerUtils.java
+++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/RequestHandlerUtils.java
@@ -261,8 +261,8 @@
         }
     }
 
-    public InfraActiveRequests duplicateCheck(Actions action, HashMap<String, String> instanceIdMap,
-            String instanceName, String requestScope, InfraActiveRequests currentActiveReq) throws ApiException {
+    public InfraActiveRequests duplicateCheck(Actions action, Map<String, String> instanceIdMap, String instanceName,
+            String requestScope, InfraActiveRequests currentActiveReq) throws ApiException {
         InfraActiveRequests dup = null;
         try {
             if (!(instanceName == null && "service".equals(requestScope) && (action == Action.createInstance
@@ -332,7 +332,7 @@
         }
     }
 
-    public void parseRequest(ServiceInstancesRequest sir, HashMap<String, String> instanceIdMap, Actions action,
+    public void parseRequest(ServiceInstancesRequest sir, Map<String, String> instanceIdMap, Actions action,
             String version, String requestJSON, Boolean aLaCarte, String requestId,
             InfraActiveRequests currentActiveReq) throws ValidateException, RequestDbFailureException {
         int reqVersion = Integer.parseInt(version.substring(1));
@@ -354,7 +354,7 @@
     }
 
     public void buildErrorOnDuplicateRecord(InfraActiveRequests currentActiveReq, Actions action,
-            HashMap<String, String> instanceIdMap, String instanceName, String requestScope, InfraActiveRequests dup)
+            Map<String, String> instanceIdMap, String instanceName, String requestScope, InfraActiveRequests dup)
             throws ApiException {
 
         String instance = null;
diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/infra/rest/handler/AbstractRestHandler.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/infra/rest/handler/AbstractRestHandler.java
index c806e9f..fec512a 100644
--- a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/infra/rest/handler/AbstractRestHandler.java
+++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/infra/rest/handler/AbstractRestHandler.java
@@ -163,12 +163,14 @@
         try {
             URL aUrl = new URL(url);
             String aPath = aUrl.getPath();
-            if (aPath.indexOf("/v") == -1) {
-                version = aPath.substring(aPath.indexOf("/V"), aPath.indexOf("/V") + 4);
-            } else {
-                version = aPath.substring(aPath.indexOf("/v"), aPath.indexOf("/v") + 4);
-            }
-            String selfLinkPath = Constants.ORCHESTRATION_REQUESTS_PATH.concat(version).concat(requestId);
+            int indexOfVersion = Math.max(aPath.indexOf("/V"), aPath.indexOf("/v"));
+            version = aPath.substring(indexOfVersion, indexOfVersion + 4);
+
+            String pathWithSOAction = aPath.substring(0, indexOfVersion);
+            String pathWithoutSOAction = pathWithSOAction.substring(0, pathWithSOAction.lastIndexOf("/"));
+
+            String selfLinkPath =
+                    pathWithoutSOAction.concat(Constants.ORCHESTRATION_REQUESTS_PATH).concat(version).concat(requestId);
             selfLinkUrl = Optional.of(new URL(aUrl.getProtocol(), aUrl.getHost(), aUrl.getPort(), selfLinkPath));
         } catch (Exception e) {
             selfLinkUrl = Optional.empty(); // ignore
diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/validation/InstanceIdMapValidation.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/validation/InstanceIdMapValidation.java
index 2cf01f9..55a68ff 100644
--- a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/validation/InstanceIdMapValidation.java
+++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/validation/InstanceIdMapValidation.java
@@ -21,7 +21,7 @@
 
 package org.onap.so.apihandlerinfra.validation;
 
-import java.util.HashMap;
+import java.util.Map;
 import org.onap.so.apihandler.common.CommonConstants;
 import org.onap.so.exceptions.ValidationException;
 import org.onap.so.serviceinstancebeans.ServiceInstancesRequest;
@@ -31,6 +31,7 @@
 
     private static final String Service_InstanceId = "serviceInstanceId";
     private static final String Vnf_InstanceId = "vnfInstanceId";
+    private static final String PNF_NAME = "pnfName";
     private static final String vfModule_InstanceId = "vfModuleInstanceId";
 
     private static final String volume_Group_InstanceId = "volumeGroupInstanceId";
@@ -39,7 +40,7 @@
 
     @Override
     public ValidationInformation validate(ValidationInformation info) throws ValidationException {
-        HashMap<String, String> instanceIdMap = info.getInstanceIdMap();
+        Map<String, String> instanceIdMap = info.getInstanceIdMap();
         ServiceInstancesRequest sir = info.getSir();
         if (instanceIdMap != null) {
             if (instanceIdMap.get(Service_InstanceId) != null) {
@@ -90,6 +91,10 @@
                 }
                 sir.setInstanceGroupId(instanceIdMap.get(CommonConstants.INSTANCE_GROUP_INSTANCE_ID));
             }
+
+            if (instanceIdMap.get(PNF_NAME) != null) {
+                sir.setPnfName(instanceIdMap.get(PNF_NAME));
+            }
         }
         return info;
     }
diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/validation/ValidationInformation.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/validation/ValidationInformation.java
index 68b2a78..ee4fde0 100644
--- a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/validation/ValidationInformation.java
+++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/validation/ValidationInformation.java
@@ -21,7 +21,7 @@
 
 package org.onap.so.apihandlerinfra.validation;
 
-import java.util.HashMap;
+import java.util.Map;
 import org.onap.so.apihandlerinfra.Actions;
 import org.onap.so.serviceinstancebeans.LineOfBusiness;
 import org.onap.so.serviceinstancebeans.OwningEntity;
@@ -34,7 +34,7 @@
 
 public class ValidationInformation {
     ServiceInstancesRequest sir;
-    HashMap<String, String> instanceIdMap;
+    Map<String, String> instanceIdMap;
     Actions action;
     int reqVersion;
     String requestScope;
@@ -53,7 +53,7 @@
     OwningEntity owningEntity;
     Service userParams;
 
-    public ValidationInformation(ServiceInstancesRequest sir, HashMap<String, String> instanceIdMap, Actions action,
+    public ValidationInformation(ServiceInstancesRequest sir, Map<String, String> instanceIdMap, Actions action,
             int reqVersion, Boolean aLaCarteFlag, RequestParameters requestParameters) {
         this.sir = sir;
         this.instanceIdMap = instanceIdMap;
@@ -71,11 +71,11 @@
         this.sir = value;
     }
 
-    public HashMap<String, String> getInstanceIdMap() {
+    public Map<String, String> getInstanceIdMap() {
         return this.instanceIdMap;
     }
 
-    public void setInstanceIdMap(HashMap<String, String> value) {
+    public void setInstanceIdMap(Map<String, String> value) {
         this.instanceIdMap = value;
     }
 
diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/BaseTest.java b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/BaseTest.java
index 5da16f4..0ca9888 100644
--- a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/BaseTest.java
+++ b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/BaseTest.java
@@ -70,6 +70,10 @@
         return "http://localhost:" + port + uri;
     }
 
+    protected String createURLWithPort(String uri, String orchestrationPath) {
+        return "http://localhost:" + port + orchestrationPath + uri;
+    }
+
     protected String createURLWithPort(String uri, int iPort) {
         return "http://localhost:" + iPort + uri;
     }
diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/InstanceManagementTest.java b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/InstanceManagementTest.java
index 081f235..7b2e502 100644
--- a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/InstanceManagementTest.java
+++ b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/InstanceManagementTest.java
@@ -29,10 +29,12 @@
 import static com.shazam.shazamcrest.matcher.Matchers.sameBeanAs;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
-import static org.onap.logging.filter.base.Constants.HttpHeaders.ONAP_REQUEST_ID;
-import static org.onap.so.logger.HttpHeadersConstants.REQUESTOR_ID;
 import static org.onap.logging.filter.base.Constants.HttpHeaders.ONAP_PARTNER_NAME;
+import static org.onap.logging.filter.base.Constants.HttpHeaders.ONAP_REQUEST_ID;
 import static org.onap.logging.filter.base.Constants.HttpHeaders.TRANSACTION_ID;
+import static org.onap.so.logger.HttpHeadersConstants.REQUESTOR_ID;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import java.io.File;
 import java.io.IOException;
 import java.net.MalformedURLException;
@@ -46,7 +48,6 @@
 import org.junit.Test;
 import org.onap.logging.ref.slf4j.ONAPLogConstants;
 import org.onap.so.db.request.beans.InfraActiveRequests;
-import org.onap.so.logger.HttpHeadersConstants;
 import org.onap.so.serviceinstancebeans.RequestReferences;
 import org.onap.so.serviceinstancebeans.ServiceInstancesResponse;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -57,8 +58,6 @@
 import org.springframework.http.ResponseEntity;
 import org.springframework.util.ResourceUtils;
 import org.springframework.web.util.UriComponentsBuilder;
-import com.fasterxml.jackson.databind.DeserializationFeature;
-import com.fasterxml.jackson.databind.ObjectMapper;
 
 public class InstanceManagementTest extends BaseTest {
 
@@ -72,6 +71,7 @@
     private String wiremockPort;
 
     private final String instanceManagementUri = "/onap/so/infra/instanceManagement/";
+    private final String orchestration_path = "/onap/so/infra";
 
     private String uri;
     private URL selfLink;
@@ -93,7 +93,7 @@
         headers.set(ONAP_PARTNER_NAME, "VID");
         headers.set(REQUESTOR_ID, "xxxxxx");
         try { // generate one-time port number to avoid RANDOM port number later.
-            initialUrl = new URL(createURLWithPort(Constants.ORCHESTRATION_REQUESTS_PATH));
+            initialUrl = new URL(createURLWithPort(Constants.ORCHESTRATION_REQUESTS_PATH, orchestration_path));
             initialPort = initialUrl.getPort();
         } catch (MalformedURLException e) {
             e.printStackTrace();
@@ -208,6 +208,35 @@
     }
 
     @Test
+    public void executeServiceLevelCustomWorkflow() throws IOException {
+        wireMockServer.stubFor(post(urlPathEqualTo("/mso/async/services/testingServiceLevelWorkflow"))
+                .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
+                        .withBodyFile("Camunda/TestResponse.json").withStatus(org.apache.http.HttpStatus.SC_OK)));
+
+        wireMockServer.stubFor(get(urlMatching(
+                ".*/workflow/search/findByArtifactUUID[?]artifactUUID=81526781-e55c-4cb7-adb3-97e09d9c76bf"))
+                        .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
+                                .withBody(getWiremockResponseForCatalogdb("workflow_ServiceLevel_Response.json"))
+                                .withStatus(org.apache.http.HttpStatus.SC_OK)));
+
+        // expected response
+        ServiceInstancesResponse expectedResponse = new ServiceInstancesResponse();
+        RequestReferences requestReferences = new RequestReferences();
+        requestReferences.setInstanceId("1882939");
+        requestReferences.setRequestSelfLink(createExpectedSelfLink("v1", "32807a28-1a14-4b88-b7b3-2950918aa76d"));
+        expectedResponse.setRequestReferences(requestReferences);
+        uri = instanceManagementUri + "v1"
+                + "/serviceInstances/5df8b6de-2083-11e7-93ae-92361f002676/workflows/81526781-e55c-4cb7-adb3-97e09d9c76bf";
+        ResponseEntity<String> response =
+                sendRequest(inputStream("/ExecuteServiceLevelCustomWorkflow.json"), uri, HttpMethod.POST, headers);
+
+        assertEquals(Response.Status.ACCEPTED.getStatusCode(), response.getStatusCode().value());
+
+        ServiceInstancesResponse realResponse = mapper.readValue(response.getBody(), ServiceInstancesResponse.class);
+        assertThat(realResponse, sameBeanAs(expectedResponse).ignoring("requestReferences.requestId"));
+    }
+
+    @Test
     public void workflowAndOperationNameTest() {
         wireMockServer.stubFor(get(urlMatching(
                 ".*/workflow/search/findByArtifactUUID[?]artifactUUID=71526781-e55c-4cb7-adb3-97e09d9c76be"))
diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/OrchestrationRequestsTest.java b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/OrchestrationRequestsTest.java
index 9b892af..7711608 100644
--- a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/OrchestrationRequestsTest.java
+++ b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/OrchestrationRequestsTest.java
@@ -133,7 +133,6 @@
         testResponse.getRequest().setRequestProcessingData(new ArrayList<RequestProcessingData>());
         RequestProcessingData e = new RequestProcessingData();
         e.setGroupingId("7d2e8c07-4d10-456d-bddc-37abf38ca714");
-        e.setTag("pincFabricConfigRequest");
         List<HashMap<String, String>> data = new ArrayList<HashMap<String, String>>();
         HashMap<String, String> data1 = new HashMap<String, String>();
         data1.put("requestAction", "assign");
@@ -210,7 +209,6 @@
         testResponse.getRequest().setRequestProcessingData(new ArrayList<RequestProcessingData>());
         RequestProcessingData e = new RequestProcessingData();
         e.setGroupingId("7d2e8c07-4d10-456d-bddc-37abf38ca714");
-        e.setTag("pincFabricConfigRequest");
         List<HashMap<String, String>> data = new ArrayList<HashMap<String, String>>();
         HashMap<String, String> data1 = new HashMap<String, String>();
         data1.put("requestAction", "assign");
@@ -256,7 +254,6 @@
         testResponse.getRequest().setRequestProcessingData(new ArrayList<RequestProcessingData>());
         RequestProcessingData e = new RequestProcessingData();
         e.setGroupingId("7d2e8c07-4d10-456d-bddc-37abf38ca714");
-        e.setTag("pincFabricConfigRequest");
         List<HashMap<String, String>> data = new ArrayList<HashMap<String, String>>();
         HashMap<String, String> data1 = new HashMap<String, String>();
         data1.put("requestAction", "assign");
@@ -463,13 +460,11 @@
         HashMap<String, String> secondExpectedMap = new HashMap<>();
         List<RequestProcessingData> expectedDataList = new ArrayList<>();
         entry.setGroupingId("7d2e8c07-4d10-456d-bddc-37abf38ca714");
-        entry.setTag("pincFabricConfigRequest");
         expectedMap.put("requestAction", "assign");
-        expectedMap.put("pincFabricId", "testId");
+        expectedMap.put("fabricId", "testId");
         expectedList.add(expectedMap);
         entry.setDataPairs(expectedList);
         secondEntry.setGroupingId("7d2e8c07-4d10-456d-bddc-37abf38ca715");
-        secondEntry.setTag("pincFabricConfig");
         secondExpectedMap.put("requestAction", "unassign");
         secondExpectedList.add(secondExpectedMap);
         secondEntry.setDataPairs(secondExpectedList);
diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/ServiceInstancesTest.java b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/ServiceInstancesTest.java
index ef90b22..33d86a2 100644
--- a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/ServiceInstancesTest.java
+++ b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/ServiceInstancesTest.java
@@ -1,8 +1,6 @@
 /*-
  * ============LICENSE_START=======================================================
- * ONAP - SO
- * ================================================================================
- * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ *  Copyright (C) 2020 Nordix Foundation.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -15,6 +13,8 @@
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
  * ============LICENSE_END=========================================================
  */
 
@@ -97,6 +97,8 @@
 
     private final String servInstanceuri = "/onap/so/infra/serviceInstantiation/";
     private final String servInstanceUriPrev7 = "/onap/so/infra/serviceInstances/";
+    private final String orchestration_path = "/onap/so/infra";
+
     private String uri;
     private URL selfLink;
     private URL initialUrl;
@@ -115,7 +117,7 @@
         headers.set(ONAP_PARTNER_NAME, "VID");
         headers.set(REQUESTOR_ID, "xxxxxx");
         try { // generate one-time port number to avoid RANDOM port number later.
-            initialUrl = new URL(createURLWithPort(Constants.ORCHESTRATION_REQUESTS_PATH));
+            initialUrl = new URL(createURLWithPort(Constants.ORCHESTRATION_REQUESTS_PATH, orchestration_path));
             initialPort = initialUrl.getPort();
         } catch (MalformedURLException e) {
             e.printStackTrace();
diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/infra/rest/handler/AbstractRestHandlerTest.java b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/infra/rest/handler/AbstractRestHandlerTest.java
index d39192c..6c643c7 100644
--- a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/infra/rest/handler/AbstractRestHandlerTest.java
+++ b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/infra/rest/handler/AbstractRestHandlerTest.java
@@ -61,4 +61,15 @@
                 restHandler.createResponse("instanceId", "requestId", mockRequestContext);
         assertThat(actualResponse, sameBeanAs(expectedResponse));
     }
+
+    @Test
+    public void test_buildSelfLinkUrl() throws MalformedURLException {
+        String initialLink = "http://some.domain.com:30277/onap/so/infra/serviceInstantiation/v7/serviceInstances";
+        String requestId = "4d0437c3-ee48-4361-a4f7-e1613c82493a";
+        Optional<URL> expectedLink = Optional.of(new URL(
+                "http://some.domain.com:30277/onap/so/infra/orchestrationRequests/v7/4d0437c3-ee48-4361-a4f7-e1613c82493a"));
+        Optional<URL> resultURL = restHandler.buildSelfLinkUrl(initialLink, requestId);
+
+        assertThat(resultURL, sameBeanAs(expectedLink));
+    }
 }
diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/resources/OrchestrationRequest/RequestProcessingData.json b/mso-api-handlers/mso-api-handler-infra/src/test/resources/OrchestrationRequest/RequestProcessingData.json
index 79caa33..a84b2db 100644
--- a/mso-api-handlers/mso-api-handler-infra/src/test/resources/OrchestrationRequest/RequestProcessingData.json
+++ b/mso-api-handlers/mso-api-handler-infra/src/test/resources/OrchestrationRequest/RequestProcessingData.json
@@ -4,21 +4,18 @@
 		"soRequestId": "00032ab7-na18-42e5-965d-8ea592502018",
 		"groupingId": "7d2e8c07-4d10-456d-bddc-37abf38ca714",
 		"name": "requestAction",
-		"value": "assign",
-		"tag": "pincFabricConfigRequest"
+		"value": "assign"
 	},{
 		"id": 2,
 		"soRequestId": "00032ab7-na18-42e5-965d-8ea592502018",
 		"groupingId": "7d2e8c07-4d10-456d-bddc-37abf38ca714",
-		"name": "pincFabricId",
-		"value": "testId",
-		"tag": "pincFabricConfigRequest"
+		"name": "fabricId",
+		"value": "testId"
 	},{
 		"id": 3,
 		"soRequestId": "00032ab7-na18-42e5-965d-8ea592502018",
 		"groupingId": "7d2e8c07-4d10-456d-bddc-37abf38ca715",
 		"name": "requestAction",
-		"value": "unassign",
-		"tag": "pincFabricConfig"
+		"value": "unassign"
 	}
 ]
\ No newline at end of file
diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/resources/OrchestrationRequest/getRequestProcessingData.json b/mso-api-handlers/mso-api-handler-infra/src/test/resources/OrchestrationRequest/getRequestProcessingData.json
index af28007..6ebe552 100644
--- a/mso-api-handlers/mso-api-handler-infra/src/test/resources/OrchestrationRequest/getRequestProcessingData.json
+++ b/mso-api-handlers/mso-api-handler-infra/src/test/resources/OrchestrationRequest/getRequestProcessingData.json
@@ -3,6 +3,5 @@
 	"soRequestId": "00032ab7-na18-42e5-965d-8ea592502018",
 	"groupingId": "7d2e8c07-4d10-456d-bddc-37abf38ca714",
 	"name": "requestAction",
-	"value": "assign",
-	"tag": "pincFabricConfigRequest"
+	"value": "assign"
 }
diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/resources/OrchestrationRequest/getRequestProcessingDataArray.json b/mso-api-handlers/mso-api-handler-infra/src/test/resources/OrchestrationRequest/getRequestProcessingDataArray.json
index c746020..c3554c8 100644
--- a/mso-api-handlers/mso-api-handler-infra/src/test/resources/OrchestrationRequest/getRequestProcessingDataArray.json
+++ b/mso-api-handlers/mso-api-handler-infra/src/test/resources/OrchestrationRequest/getRequestProcessingDataArray.json
@@ -3,6 +3,5 @@
 	"soRequestId": "00032ab7-na18-42e5-965d-8ea592502018",
 	"groupingId": "7d2e8c07-4d10-456d-bddc-37abf38ca714",
 	"name": "requestAction",
-	"value": "assign",
-	"tag": "pincFabricConfigRequest"
+	"value": "assign"
 }]
diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/resources/ServiceInstanceTest/ExecuteServiceLevelCustomWorkflow.json b/mso-api-handlers/mso-api-handler-infra/src/test/resources/ServiceInstanceTest/ExecuteServiceLevelCustomWorkflow.json
new file mode 100644
index 0000000..e466ac0
--- /dev/null
+++ b/mso-api-handlers/mso-api-handler-infra/src/test/resources/ServiceInstanceTest/ExecuteServiceLevelCustomWorkflow.json
@@ -0,0 +1,39 @@
+{
+  "requestDetails":{
+    "subscriberInfo":{
+      "globalSubscriberId":"Test"
+    },
+    "requestInfo":{
+      "suppressRollback": false,
+      "productFamilyId": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+      "requestorId": "demo",
+      "instanceName":"testInstanceName",
+      "source":"VID"
+    },
+    "cloudConfiguration":{
+      "lcpCloudRegionId": "RegionOne",
+      "tenantId": "7320ec4a5b9d4589ba7c4412ccfd290f",
+      "cloudOwner": "CloudOwner"
+    },
+    "requestParameters":{
+      "subscriptionServiceType": "test",
+      "userParams":[],
+      "aLaCarte": false,
+      "payload": "{\"k1\": \"v1\"}"
+    },
+    "project":{
+      "projectName": "PNFSWUProject"
+    },
+    "owningEntity":{
+      "owningEntityId":"67f2e84c-734d-4e90-a1e4-d2ffa2e75849",
+      "owningEntityName":"OE-Test"
+    },
+    "modelInfo":{
+      "modelVersion": "2.0",
+      "modelVersionId": "d88da85c-d9e8-4f73-b837-3a72a431622b",
+      "modelInvariantId": "fe41489e-1563-46a3-b90a-1db629e4375b",
+      "modelName": "Demo_svc",
+      "modelType": "service"
+    }
+  }
+}
diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/resources/__files/catalogdb/workflow_ServiceLevel_Response.json b/mso-api-handlers/mso-api-handler-infra/src/test/resources/__files/catalogdb/workflow_ServiceLevel_Response.json
new file mode 100644
index 0000000..133c724
--- /dev/null
+++ b/mso-api-handlers/mso-api-handler-infra/src/test/resources/__files/catalogdb/workflow_ServiceLevel_Response.json
@@ -0,0 +1,6 @@
+{
+  "artifactUUID": "81526781-e55c-4cb7-adb3-97e09d9c76bf",
+  "artifactName": "testingServiceLevelWorkflow.bpmn",
+  "name": "testingServiceLevelWorkflow",
+  "operationName": "testServiceLevelOperation"
+}
diff --git a/packages/docker/pom.xml b/packages/docker/pom.xml
index 1862bd1..f895738 100644
--- a/packages/docker/pom.xml
+++ b/packages/docker/pom.xml
@@ -103,30 +103,6 @@
               </build>
             </image>
             <image>
-              <name>${docker.image.prefix}/ve-vnfm-adapter</name>
-              <build>
-                <cleanup>try</cleanup>
-                <dockerFile>docker-files/Dockerfile.so-app</dockerFile>
-                <tags>
-                  <tag>${project.version}</tag>
-                  <tag>${project.version}-${maven.build.timestamp}</tag>
-                  <tag>${project.docker.latesttag.version}</tag>
-                </tags>
-                <assembly>
-                  <inline>
-                    <dependencySets>
-                      <dependencySet>
-                        <includes>
-                          <include>org.onap.so.adapters:etsi-sol002-adapter</include>
-                        </includes>
-                        <outputFileNameMapping>app.jar</outputFileNameMapping>
-                      </dependencySet>
-                    </dependencySets>
-                  </inline>
-                </assembly>
-              </build>
-            </image>
-            <image>
               <name>${docker.image.prefix}/catalog-db-adapter</name>
               <build>
                 <cleanup>try</cleanup>
diff --git a/pom.xml b/pom.xml
index 0243def..68559c9 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,6 +1,5 @@
-<?xml version="1.0"?>
-<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">
+<?xml version="1.0" ?>
+<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.oparent</groupId>
@@ -870,17 +869,17 @@
       <dependency>
         <groupId>org.onap.logging-analytics</groupId>
         <artifactId>logging-slf4j</artifactId>
-        <version>1.6.7-SNAPSHOT</version>
+        <version>1.6.7</version>
       </dependency>
       <dependency>
         <groupId>org.onap.logging-analytics</groupId>
         <artifactId>logging-filter-base</artifactId>
-        <version>1.6.7-SNAPSHOT</version>
+        <version>1.6.7</version>
       </dependency>
       <dependency>
         <groupId>org.onap.logging-analytics</groupId>
         <artifactId>logging-filter-spring</artifactId>
-        <version>1.6.7-SNAPSHOT</version>
+        <version>1.6.7</version>
       </dependency>
       <dependency>
         <groupId>org.apache.httpcomponents</groupId>
@@ -916,7 +915,7 @@
       <dependency>
         <groupId>org.yaml</groupId>
         <artifactId>snakeyaml</artifactId>
-        <version>1.23</version>
+        <version>1.26</version>
       </dependency>
       <dependency>
         <groupId>javax.interceptor</groupId>
@@ -1037,4 +1036,4 @@
       </build>
     </profile>
   </profiles>
-</project>
+</project>
\ No newline at end of file
diff --git a/so-sdn-clients/pom.xml b/so-sdn-clients/pom.xml
index c9b417b..66780c7 100644
--- a/so-sdn-clients/pom.xml
+++ b/so-sdn-clients/pom.xml
@@ -53,7 +53,7 @@
           <configuration>
             <lifecycleMappingMetadata>
               <pluginExecutions>
-                  <pluginExecution>
+                <pluginExecution>
                   <pluginExecutionFilter>
                     <groupId>org.apache.maven.plugins</groupId>
                     <artifactId>maven-dependency-plugin</artifactId>
@@ -112,7 +112,7 @@
           <groupId>javax.ws.rs</groupId>
           <artifactId>jsr311-api</artifactId>
         </exclusion>
-		<exclusion>
+        <exclusion>
           <groupId>io.swagger</groupId>
           <artifactId>swagger-annotations</artifactId>
         </exclusion>
@@ -152,7 +152,7 @@
       <groupId>org.mariadb.jdbc</groupId>
       <artifactId>mariadb-java-client</artifactId>
     </dependency>
-     <dependency>
+    <dependency>
       <groupId>org.glassfish.jersey.core</groupId>
       <artifactId>jersey-common</artifactId>
     </dependency>