Merge "fix malformed tables in docs"
diff --git a/adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/beans/CreateStackRequest.java b/adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/beans/CreateStackRequest.java
new file mode 100644
index 0000000..86be9ec
--- /dev/null
+++ b/adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/beans/CreateStackRequest.java
@@ -0,0 +1,36 @@
+package org.onap.so.openstack.beans;
+
+import java.util.Map;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+public class CreateStackRequest {
+
+    @JsonProperty("parameters")
+    private Map<String, Object> parameters;
+
+    @JsonProperty("environment")
+    private String environment;
+
+    public Map<String, Object> getParameters() {
+        return parameters;
+    }
+
+    public void setParameters(Map<String, Object> parameters) {
+        this.parameters = parameters;
+    }
+
+    public String getEnvironment() {
+        return environment;
+    }
+
+    public void setEnvironment(String environment) {
+        this.environment = environment;
+    }
+
+    @Override
+    public String toString() {
+        return "CreateStackRequest [parameters=" + parameters + ", environment=" + environment + "]";
+    }
+
+
+}
diff --git a/adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/utils/MsoHeatUtils.java b/adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/utils/MsoHeatUtils.java
index 28d4f3f..1d75892 100644
--- a/adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/utils/MsoHeatUtils.java
+++ b/adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/utils/MsoHeatUtils.java
@@ -55,6 +55,7 @@
 import org.onap.so.db.request.client.RequestsDbClient;
 import org.onap.so.logger.ErrorCode;
 import org.onap.so.logger.MessageEnum;
+import org.onap.so.openstack.beans.CreateStackRequest;
 import org.onap.so.openstack.beans.HeatStatus;
 import org.onap.so.openstack.beans.StackInfo;
 import org.onap.so.openstack.exceptions.MsoCloudSiteNotFound;
@@ -354,7 +355,10 @@
         try {
             ObjectMapper mapper = new ObjectMapper();
             InfraActiveRequests foundRequest = requestDBClient.getInfraActiveRequestbyRequestId(requestId);
-            String stackRequest = mapper.writeValueAsString(request.getParameters());
+            CreateStackRequest createStackRequest = new CreateStackRequest();
+            createStackRequest.setEnvironment(request.getEnvironment());
+            createStackRequest.setParameters(request.getParameters());
+            String stackRequest = mapper.writeValueAsString(createStackRequest);
             CloudApiRequests cloudReq = new CloudApiRequests();
             cloudReq.setCloudIdentifier(stackName);
             cloudReq.setRequestBody(stackRequest);
diff --git a/adapters/mso-adapter-utils/src/test/java/org/onap/so/openstack/utils/MsoHeatUtilsTest.java b/adapters/mso-adapter-utils/src/test/java/org/onap/so/openstack/utils/MsoHeatUtilsTest.java
index 687b7d8..e840d5a 100644
--- a/adapters/mso-adapter-utils/src/test/java/org/onap/so/openstack/utils/MsoHeatUtilsTest.java
+++ b/adapters/mso-adapter-utils/src/test/java/org/onap/so/openstack/utils/MsoHeatUtilsTest.java
@@ -48,10 +48,12 @@
 import org.onap.so.db.request.beans.CloudApiRequests;
 import org.onap.so.db.request.beans.InfraActiveRequests;
 import org.onap.so.db.request.client.RequestsDbClient;
+import org.onap.so.openstack.beans.CreateStackRequest;
 import org.onap.so.openstack.exceptions.MsoException;
 import org.onap.so.openstack.exceptions.MsoOpenstackException;
 import org.onap.so.openstack.exceptions.MsoStackAlreadyExists;
 import org.springframework.core.env.Environment;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.woorea.openstack.base.client.OpenStackResponseException;
 import com.woorea.openstack.heat.Heat;
 import com.woorea.openstack.heat.StackResource;
@@ -415,11 +417,22 @@
 
     @Test
     public final void saveStack_Test() throws MsoException, IOException, NovaClientException {
+
         CreateStackParam createStackParam = new CreateStackParam();
         createStackParam.setStackName("stackName");
         Map<String, Object> parameters = new HashMap<String, Object>();
         parameters.put("test", "value");
+        String environment =
+                "parameters:\n  mmn_volume_name_1: \"data-mn-v-vdb\"\n  mmn_volume_name_2: \"arch-mn-v-vdc\"\n";
         createStackParam.setParameters(parameters);
+        createStackParam.setEnvironment(environment);
+
+        CreateStackRequest createStackRequest = new CreateStackRequest();
+        createStackRequest.setEnvironment(environment);
+        createStackRequest.setParameters(parameters);
+        ObjectMapper mapper = new ObjectMapper();
+        String stackRequest = mapper.writeValueAsString(createStackRequest);
+
         InfraActiveRequests request = new InfraActiveRequests();
         request.setRequestId("requestId");
         doReturn(request).when(requestDbClient).getInfraActiveRequestbyRequestId("requestId");
@@ -427,7 +440,8 @@
         heatUtils.saveStackRequest(createStackParam, "requestId", "stackName");
         Mockito.verify(requestDbClient, times(1)).updateInfraActiveRequests(request);
         assertNotNull(request.getCloudApiRequests().get(0));
-        assertEquals(request.getCloudApiRequests().get(0).getRequestId(), "requestId");
+        assertEquals("requestId", request.getCloudApiRequests().get(0).getRequestId());
+        assertEquals(stackRequest, request.getCloudApiRequests().get(0).getRequestBody());
     }
 
     @Test
diff --git a/adapters/mso-adapters-rest-interface/src/main/java/org/onap/so/adapters/vdu/VduArtifact.java b/adapters/mso-adapters-rest-interface/src/main/java/org/onap/so/adapters/vdu/VduArtifact.java
index 2f99fed..4a5a611 100644
--- a/adapters/mso-adapters-rest-interface/src/main/java/org/onap/so/adapters/vdu/VduArtifact.java
+++ b/adapters/mso-adapters-rest-interface/src/main/java/org/onap/so/adapters/vdu/VduArtifact.java
@@ -37,6 +37,16 @@
     private byte[] content;
     private ArtifactType type;
 
+    // Default constructor
+    public VduArtifact() {}
+
+    // Fully specified constructor
+    public VduArtifact(String name, byte[] content, ArtifactType type) {
+        this.name = name;
+        this.content = content;
+        this.type = type;
+    }
+
     @Override
     public boolean equals(final Object other) {
         if (!(other instanceof VduArtifact)) {
@@ -52,16 +62,6 @@
         return new HashCodeBuilder().append(name).append(content).append(type).toHashCode();
     }
 
-    // Default constructor
-    public VduArtifact() {}
-
-    // Fully specified constructor
-    public VduArtifact(String name, byte[] content, ArtifactType type) {
-        this.name = name;
-        this.content = content;
-        this.type = type;
-    }
-
     public String getName() {
         return name;
     }
diff --git a/adapters/mso-catalog-db-adapter/src/main/java/org/onap/so/adapters/catalogdb/catalogrest/QueryServiceVnfs.java b/adapters/mso-catalog-db-adapter/src/main/java/org/onap/so/adapters/catalogdb/catalogrest/QueryServiceVnfs.java
index a0d822d..0b8de60 100644
--- a/adapters/mso-catalog-db-adapter/src/main/java/org/onap/so/adapters/catalogdb/catalogrest/QueryServiceVnfs.java
+++ b/adapters/mso-catalog-db-adapter/src/main/java/org/onap/so/adapters/catalogdb/catalogrest/QueryServiceVnfs.java
@@ -3,6 +3,8 @@
  * ONAP - SO
  * ================================================================================
  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ===========================================================================
+ *  Modifications Copyright (C) 2019 IBM.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -25,10 +27,7 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.stream.Collectors;
 import javax.xml.bind.annotation.XmlRootElement;
-import org.onap.so.db.catalog.beans.InstanceGroup;
-import org.onap.so.db.catalog.beans.VFCInstanceGroup;
 import org.onap.so.db.catalog.beans.VnfResourceCustomization;
 import org.onap.so.db.catalog.beans.VnfcInstanceGroupCustomization;
 import org.slf4j.Logger;
diff --git a/adapters/mso-catalog-db-adapter/src/main/resources/application.yaml b/adapters/mso-catalog-db-adapter/src/main/resources/application.yaml
index bcf5429..1487cb2 100644
--- a/adapters/mso-catalog-db-adapter/src/main/resources/application.yaml
+++ b/adapters/mso-catalog-db-adapter/src/main/resources/application.yaml
@@ -41,6 +41,8 @@
   jackson:
     serialization:
       fail-on-empty-beans: false
+  main:
+    allow-bean-definition-overriding: true
 
 #Actuator
 management:
diff --git a/adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/valet/ValetClient.java b/adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/valet/ValetClient.java
index 34177ff..3c073af 100644
--- a/adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/valet/ValetClient.java
+++ b/adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/valet/ValetClient.java
@@ -48,10 +48,10 @@
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.HttpMethod;
 import org.springframework.http.ResponseEntity;
-import org.springframework.http.client.BufferingClientHttpRequestFactory;
-import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
 import org.springframework.stereotype.Component;
 import org.springframework.web.client.RestTemplate;
+import org.onap.so.client.RestTemplateConfig;
+import javax.inject.Provider;
 
 @Component
 public class ValetClient {
@@ -75,6 +75,9 @@
     private static final String BODY = ", body=";
     @Autowired
     private ObjectMapper mapper;
+    @Autowired
+    private Provider<RestTemplate> templateProvider;
+
 
     protected String baseUrl;
     protected String basePath;
@@ -123,10 +126,7 @@
     }
 
     private RestTemplate getRestTemplate() {
-        RestTemplate restTemplate = new RestTemplate();
-        restTemplate
-                .setRequestFactory(new BufferingClientHttpRequestFactory(new HttpComponentsClientHttpRequestFactory()));
-        return restTemplate;
+        return templateProvider.get();
     }
 
     /*
diff --git a/adapters/mso-openstack-adapters/src/main/resources/application.yaml b/adapters/mso-openstack-adapters/src/main/resources/application.yaml
index 1c4de2d..ba31daa 100644
--- a/adapters/mso-openstack-adapters/src/main/resources/application.yaml
+++ b/adapters/mso-openstack-adapters/src/main/resources/application.yaml
@@ -33,6 +33,8 @@
         ddl-auto: none
         naming-strategy: org.hibernate.cfg.ImprovedNamingStrategy
         enable-lazy-load-no-trans: true
+  main:
+    allow-bean-definition-overriding: true
 org:
   onap:
     so:
diff --git a/adapters/mso-requests-db-adapter/src/main/resources/application.yaml b/adapters/mso-requests-db-adapter/src/main/resources/application.yaml
index 7234733..17b014b 100644
--- a/adapters/mso-requests-db-adapter/src/main/resources/application.yaml
+++ b/adapters/mso-requests-db-adapter/src/main/resources/application.yaml
@@ -47,6 +47,8 @@
       username: mso_admin
       password: '$2a$12$tidKuu.h88E2nuL95pTVY.ZOYMN/1dp29A9b1o.0GFDsVVSYlMkHa'
       role: ACTUATOR
+  main:
+    allow-bean-definition-overriding: true
 
 #Actuator
 management:
diff --git a/adapters/mso-sdnc-adapter/src/main/resources/application.yaml b/adapters/mso-sdnc-adapter/src/main/resources/application.yaml
index 9be0a25..2ef721f 100644
--- a/adapters/mso-sdnc-adapter/src/main/resources/application.yaml
+++ b/adapters/mso-sdnc-adapter/src/main/resources/application.yaml
@@ -11,6 +11,10 @@
     max-pool-size: 50
     queue-capacity: 500
 
+spring:
+  main:
+    allow-bean-definition-overriding: true
+
 #Actuator
 management:
   endpoints:
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/vnfm/VnfmServiceProviderConfiguration.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/vnfm/VnfmServiceProviderConfiguration.java
index 3342e0d..ab63183 100644
--- a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/vnfm/VnfmServiceProviderConfiguration.java
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/vnfm/VnfmServiceProviderConfiguration.java
@@ -63,9 +63,9 @@
 
     private static final Logger logger = LoggerFactory.getLogger(VnfmServiceProviderConfiguration.class);
 
-    @Value("${http.client.ssl.trust-store}")
+    @Value("${http.client.ssl.trust-store:#{null}}")
     private Resource keyStore;
-    @Value("${http.client.ssl.trust-store-password}")
+    @Value("${http.client.ssl.trust-store-password:#{null}}")
     private String keyStorePassword;
 
     @Bean(name = "vnfmServiceProvider")
@@ -77,7 +77,9 @@
     private HttpRestServiceProvider getHttpRestServiceProvider(final RestTemplate restTemplate,
             final HttpHeadersProvider httpHeadersProvider) {
         setGsonMessageConverter(restTemplate);
-        setTrustStore(restTemplate);
+        if (keyStore != null) {
+            setTrustStore(restTemplate);
+        }
         removeSpringClientFilter(restTemplate);
         return new HttpRestServiceProviderImpl(restTemplate, httpHeadersProvider);
     }
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/resources/application.yaml b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/resources/application.yaml
index 0bd63df..4434d2e 100644
--- a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/resources/application.yaml
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/resources/application.yaml
@@ -34,6 +34,11 @@
   port: 9092
   tomcat:
     max-threads: 50
+  ssl:
+    key-alias: so@so.onap.org
+    key--store-password: 'ywsqCy:EEo#j}HJHM7z^Rk[L'
+    key-store: classpath:so-vnfm-adapter.p12
+    key-store-type: PKCS12
 
 mso:
   key: 07a7159d3bf51a0e53be7a8f89699be7
@@ -50,7 +55,7 @@
   endpoint: http://sdc.onap/1234A
   
 vnfmadapter:
-  endpoint: http://so-vnfm-adapter.onap:9092
+  endpoint: https://so-vnfm-adapter.onap:9092
 
 #Actuator
 management:
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/resources/so-vnfm-adapter.p12 b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/resources/so-vnfm-adapter.p12
new file mode 100644
index 0000000..ae4fddc
--- /dev/null
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/resources/so-vnfm-adapter.p12
Binary files differ
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/test/resources/application-test.yaml b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/test/resources/application.yaml
similarity index 79%
rename from adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/test/resources/application-test.yaml
rename to adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/test/resources/application.yaml
index 3afc542..8cf8b51 100644
--- a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/test/resources/application-test.yaml
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/test/resources/application.yaml
@@ -38,3 +38,17 @@
 
 vnfmadapter:
   endpoint: https://so-vnfm-adapter.onap:30406
+  
+#Actuator
+management:
+  endpoints:
+    web:
+      base-path: /manage
+      exposure:
+        include: "*"
+  metrics:
+    se-global-registry: false
+    export:
+      prometheus:
+        enabled: true # Whether exporting of metrics to Prometheus is enabled.
+        step: 1m # Step size (i.e. reporting frequency) to use.
diff --git a/asdc-controller/src/main/java/org/onap/so/asdc/installer/heat/ToscaResourceInstaller.java b/asdc-controller/src/main/java/org/onap/so/asdc/installer/heat/ToscaResourceInstaller.java
index a08206b..e4c95f6 100644
--- a/asdc-controller/src/main/java/org/onap/so/asdc/installer/heat/ToscaResourceInstaller.java
+++ b/asdc-controller/src/main/java/org/onap/so/asdc/installer/heat/ToscaResourceInstaller.java
@@ -1087,9 +1087,9 @@
         tempGroupList.addAll(groupList);
 
         for (Group group : groupList) {
+            boolean isAllExists = true;
             ArrayList<NodeTemplate> members = group.getMemberNodes();
             for (NodeTemplate memberNode : members) {
-                boolean isAllExists = true;
                 RequirementAssignments requirements = iSdcCsarHelper.getRequirementsOf(memberNode);
                 if (requirements == null || requirements.getAll() == null || requirements.getAll().isEmpty()) {
                     continue;
@@ -1097,27 +1097,28 @@
                 List<RequirementAssignment> rqaList = requirements.getAll();
                 for (RequirementAssignment rqa : rqaList) {
                     String name = rqa.getNodeTemplateName();
-                    for (NodeTemplate node : nodes) {
-                        if (name.equals(node.getName())) {
-                            break;
-                        }
+                    Optional<NodeTemplate> findNode =
+                            nodes.stream().filter(node -> node.getName().equals(name)).findFirst();
+                    if (!findNode.isPresent()) {
+                        isAllExists = false;
+                        break;
                     }
-
-                    isAllExists = false;
+                }
+                if (!isAllExists) {
                     break;
                 }
-
-                if (isAllExists) {
-                    strSequence.add(group.getName());
-                    tempGroupList.remove(group);
-                    nodes.addAll(group.getMemberNodes());
-                }
             }
 
-            if (!tempGroupList.isEmpty() && tempGroupList.size() < groupList.size()) {
-                getVNFCGroupSequenceList(strSequence, tempGroupList, nodes, iSdcCsarHelper);
+            if (isAllExists) {
+                strSequence.add(group.getName());
+                tempGroupList.remove(group);
+                nodes.addAll(group.getMemberNodes());
             }
         }
+
+        if (tempGroupList.size() != 0 && tempGroupList.size() < groupList.size()) {
+            getVNFCGroupSequenceList(strSequence, tempGroupList, nodes, iSdcCsarHelper);
+        }
     }
 
     public void processWatchdog(String distributionId, String servideUUID, Optional<String> distributionNotification,
@@ -1896,7 +1897,13 @@
                 vnfcCustomization
                         .setDescription(testNull(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_DESCRIPTION)));
                 vnfcCustomization.setResourceInput(getVnfcResourceInput(vfcTemplate, inputList));
-                vfcInstanceGroupCustom.getVnfcCustomizations().add(vnfcCustomization);
+                List<VnfcCustomization> vnfcCustomizations = vfcInstanceGroupCustom.getVnfcCustomizations();
+
+                if (vnfcCustomizations == null) {
+                    vnfcCustomizations = new ArrayList<>();
+                    vfcInstanceGroupCustom.setVnfcCustomizations(vnfcCustomizations);
+                }
+                vnfcCustomizations.add(vnfcCustomization);
             }
         }
     }
diff --git a/asdc-controller/src/main/resources/application.yaml b/asdc-controller/src/main/resources/application.yaml
index beb40e5..2de5b69 100644
--- a/asdc-controller/src/main/resources/application.yaml
+++ b/asdc-controller/src/main/resources/application.yaml
@@ -18,6 +18,8 @@
         ddl-auto: validate
         naming-strategy: org.hibernate.cfg.ImprovedNamingStrategy
         enable-lazy-load-no-trans: true
+  main:
+    allow-bean-definition-overriding: true
 
 request:
   datasource:
diff --git a/asdc-controller/src/test/java/org/onap/so/asdc/installer/heat/ToscaResourceInstallerTest.java b/asdc-controller/src/test/java/org/onap/so/asdc/installer/heat/ToscaResourceInstallerTest.java
index 115af3a..7534ea6 100644
--- a/asdc-controller/src/test/java/org/onap/so/asdc/installer/heat/ToscaResourceInstallerTest.java
+++ b/asdc-controller/src/test/java/org/onap/so/asdc/installer/heat/ToscaResourceInstallerTest.java
@@ -32,6 +32,7 @@
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
+import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Optional;
@@ -51,6 +52,8 @@
 import org.onap.sdc.tosca.parser.impl.SdcPropertyNames;
 import org.onap.sdc.toscaparser.api.Group;
 import org.onap.sdc.toscaparser.api.NodeTemplate;
+import org.onap.sdc.toscaparser.api.RequirementAssignment;
+import org.onap.sdc.toscaparser.api.RequirementAssignments;
 import org.onap.sdc.toscaparser.api.elements.Metadata;
 import org.onap.sdc.toscaparser.api.elements.StatefulEntityType;
 import org.onap.sdc.utils.DistributionStatusEnum;
@@ -76,6 +79,7 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.test.util.ReflectionTestUtils;
 import java.util.Optional;
+import java.util.stream.Collectors;
 
 public class ToscaResourceInstallerTest extends BaseTest {
     @Autowired
@@ -488,6 +492,81 @@
         verify(vnrConfigCustom, times(1)).setConfigResourceCustomization(vrfConfigCustom);
     }
 
+    @Test
+    public void testProcessVNFCGroupSequence() {
+        List<Group> groupList = new ArrayList<>();
+
+        Group group1 = mock(Group.class);
+        NodeTemplate node1 = mock(NodeTemplate.class);
+        List<NodeTemplate> nodeList1 = new ArrayList<>();
+        nodeList1.add(node1);
+        doReturn("VfcInstanceGroup..0").when(group1).getName();
+        doReturn(nodeList1).when(group1).getMemberNodes();
+        doReturn("deviceV3").when(node1).getName();
+
+        Group group2 = mock(Group.class);
+        NodeTemplate node2 = mock(NodeTemplate.class);
+        List<NodeTemplate> nodeList2 = new ArrayList<>();
+        nodeList2.add(node2);
+        doReturn("VfcInstanceGroup..1").when(group2).getName();
+        doReturn(nodeList2).when(group2).getMemberNodes();
+        RequirementAssignments requirements2 = mock(RequirementAssignments.class);
+        RequirementAssignment requirement2 = mock(RequirementAssignment.class);
+        List<RequirementAssignment> requirementCollection2 = new ArrayList<>();
+        requirementCollection2.add(requirement2);
+        doReturn(requirementCollection2).when(requirements2).getAll();
+        doReturn("deviceV3").when(requirement2).getNodeTemplateName();
+        doReturn("SiteV2").when(node2).getName();
+
+        Group group3 = mock(Group.class);
+        NodeTemplate node3 = mock(NodeTemplate.class);
+        List<NodeTemplate> nodeList3 = new ArrayList<>();
+        nodeList3.add(node3);
+        doReturn("VfcInstanceGroup..2").when(group3).getName();
+        doReturn(nodeList3).when(group3).getMemberNodes();
+        RequirementAssignments requirements3 = mock(RequirementAssignments.class);
+        RequirementAssignment requirement3 = mock(RequirementAssignment.class);
+        List<RequirementAssignment> requirementCollection3 = new ArrayList<>();
+        requirementCollection3.add(requirement3);
+        doReturn(requirementCollection3).when(requirements3).getAll();
+        doReturn("SiteV2").when(requirement3).getNodeTemplateName();
+        doReturn("siteWanV2").when(node3).getName();
+
+        groupList.add(group1);
+        groupList.add(group2);
+        groupList.add(group3);
+
+        doReturn(csarHelper).when(toscaResourceStructure).getSdcCsarHelper();
+        doReturn(null).when(csarHelper).getRequirementsOf(node1);
+        doReturn(requirements2).when(csarHelper).getRequirementsOf(node2);
+        doReturn(requirements3).when(csarHelper).getRequirementsOf(node3);
+
+        ToscaResourceInstaller installer = new ToscaResourceInstaller();
+        Method[] methods = installer.getClass().getDeclaredMethods();
+        Method testMethod = null;
+        for (Method method : methods) {
+            String name = method.getName();
+            if (name.equals("processVNFCGroupSequence")) {
+                method.setAccessible(true);
+                testMethod = method;
+            }
+        }
+
+        if (null != testMethod) {
+            try {
+                Object seqResult = testMethod.invoke(installer, toscaResourceStructure, groupList);
+                if (seqResult instanceof List) {
+                    String resultStr = ((List<String>) seqResult).stream().collect(Collectors.joining(","));
+                    assertEquals(((List<String>) seqResult).size(), 3);
+                }
+            } catch (Exception ex) {
+                ex.printStackTrace();
+            }
+        }
+
+    }
+
+
     class MockConstants {
         public final static String MODEL_NAME = "VLAN Network Receptor Configuration";
         public final static String MODEL_INVARIANT_UUID = "1608eef4-de53-4334-a8d2-ba79cab4bde0";
diff --git a/asdc-controller/src/test/resources/resource-examples/vcpe-infra/service-Demovcpeinfra-csar.csar b/asdc-controller/src/test/resources/resource-examples/vcpe-infra/service-Demovcpeinfra-csar.csar
index 841c681..40b8b7b 100644
--- a/asdc-controller/src/test/resources/resource-examples/vcpe-infra/service-Demovcpeinfra-csar.csar
+++ b/asdc-controller/src/test/resources/resource-examples/vcpe-infra/service-Demovcpeinfra-csar.csar
Binary files differ
diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/resource/ResourceRequestBuilder.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/resource/ResourceRequestBuilder.java
index b814d6c..8d02fa3 100644
--- a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/resource/ResourceRequestBuilder.java
+++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/resource/ResourceRequestBuilder.java
@@ -113,7 +113,17 @@
         if (resource.getResourceType() == ResourceType.VNF) {
             for (String eachResource : resourceList) {
                 String resCusUuid = JsonUtils.getJsonValue(eachResource, "resourceCustomizationUuid");
-                if ((null != resCusUuid) && resCusUuid.equals(resource.getModelInfo().getModelCustomizationUuid())) {
+                // in case of external api invocation customizatoin id is coming null
+                if (resCusUuid == null || resCusUuid.contains("null") || resCusUuid.isEmpty()) {
+                    logger.info("resource resolved using model uuid");
+                    String uuid = (String) JsonUtils.getJsonValue(eachResource, "resourceUuid");
+                    if ((null != uuid) && uuid.equals(resource.getModelInfo().getModelUuid())) {
+                        logger.info("found resource uuid" + uuid);
+                        String resourceParameters = JsonUtils.getJsonValue(eachResource, "parameters");
+                        locationConstraints = JsonUtils.getJsonValue(resourceParameters, "locationConstraints");
+                    }
+                } else if (resCusUuid.equals(resource.getModelInfo().getModelCustomizationUuid())) {
+                    logger.info("resource resolved using customization-id");
                     String resourceParameters = JsonUtils.getJsonValue(eachResource, "parameters");
                     locationConstraints = JsonUtils.getJsonValue(resourceParameters, "locationConstraints");
                 }
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 c7665ac..9a39334 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
@@ -150,6 +150,17 @@
         this.mapperLayer = mapperLayer;
     }
 
+    /**
+     * This method is used for executing the building block.
+     *
+     * It will get the BB from the execution object by checking if the aLaCarte and homing is true.
+     *
+     * Then it will get the GBB and execute it.
+     *
+     * @param execution
+     * @throws Exception
+     * @return
+     */
     @Override
     public void execute(DelegateExecution execution) throws Exception {
         try {
@@ -1538,6 +1549,14 @@
         return serviceInstance;
     }
 
+    /**
+     * This method is used for getting the existing service instance.
+     *
+     * This will map the serviceInstanceAAI to serviceInstance and return the serviceInstance.
+     *
+     * @throws Exception
+     * @return serviceInstance
+     */
     public ServiceInstance getExistingServiceInstance(org.onap.aai.domain.yang.ServiceInstance serviceInstanceAAI)
             throws Exception {
         ServiceInstance serviceInstance = mapperLayer.mapAAIServiceInstanceIntoServiceInstance(serviceInstanceAAI);
diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetupUtils.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetupUtils.java
index f8d5402..dcb9e08 100644
--- a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetupUtils.java
+++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetupUtils.java
@@ -31,6 +31,7 @@
 import java.util.Optional;
 import org.onap.aai.domain.yang.CloudRegion;
 import org.onap.aai.domain.yang.Configuration;
+import org.onap.aai.domain.yang.Configurations;
 import org.onap.aai.domain.yang.GenericVnf;
 import org.onap.aai.domain.yang.GenericVnfs;
 import org.onap.aai.domain.yang.InstanceGroup;
@@ -50,6 +51,7 @@
 import org.onap.so.bpmn.servicedecomposition.tasks.exceptions.NoServiceInstanceFoundException;
 import org.onap.so.client.aai.AAIObjectPlurals;
 import org.onap.so.client.aai.AAIObjectType;
+import org.onap.so.client.aai.AAIResourcesClient;
 import org.onap.so.client.aai.entities.AAIResultWrapper;
 import org.onap.so.client.aai.entities.uri.AAIResourceUri;
 import org.onap.so.client.aai.entities.uri.AAIUriFactory;
@@ -575,4 +577,53 @@
         }
         return Optional.empty();
     }
+
+    public ServiceInstances getAAIServiceInstancesGloballyByName(String serviceInstanceName) {
+
+        return injectionHelper.getAaiClient()
+                .get(ServiceInstances.class, AAIUriFactory.createNodesUri(AAIObjectPlurals.SERVICE_INSTANCE)
+                        .queryParam("service-instance-name", serviceInstanceName))
+                .orElseGet(() -> {
+                    logger.debug("No Service Instance matched by name");
+                    return null;
+                });
+    }
+
+    public boolean existsAAINetworksGloballyByName(String networkName) {
+
+        AAIResourceUri l3networkUri =
+                AAIUriFactory.createResourceUri(AAIObjectPlurals.L3_NETWORK).queryParam("network-name", networkName);
+        AAIResourcesClient aaiRC = injectionHelper.getAaiClient();
+        return aaiRC.exists(l3networkUri);
+    }
+
+    public GenericVnfs getAAIVnfsGloballyByName(String vnfName) {
+
+        return injectionHelper.getAaiClient()
+                .get(GenericVnfs.class,
+                        AAIUriFactory.createNodesUri(AAIObjectPlurals.GENERIC_VNF).queryParam("vnf-name", vnfName))
+                .orElseGet(() -> {
+                    logger.debug("No GenericVnfs matched by name");
+                    return null;
+                });
+    }
+
+    public Optional<Configuration> getRelatedConfigurationByNameFromServiceInstance(String serviceInstanceId,
+            String configurationName) throws Exception {
+        AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, serviceInstanceId);
+        uri.relatedTo(AAIObjectPlurals.CONFIGURATION).queryParam("configuration-name", configurationName);
+        Optional<Configurations> configurations = injectionHelper.getAaiClient().get(Configurations.class, uri);
+        Configuration configuration = null;
+        if (!configurations.isPresent()) {
+            logger.debug("No Configurations matched by name");
+            return Optional.empty();
+        } else {
+            if (configurations.get().getConfiguration().size() > 1) {
+                throw new Exception("Multiple Configurations Returned");
+            } else {
+                configuration = configurations.get().getConfiguration().get(0);
+            }
+            return Optional.of(configuration);
+        }
+    }
 }
diff --git a/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetupUtilsTest.java b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetupUtilsTest.java
index 1899475..7780837 100644
--- a/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetupUtilsTest.java
+++ b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetupUtilsTest.java
@@ -47,6 +47,7 @@
 import org.mockito.junit.MockitoJUnitRunner;
 import org.onap.aai.domain.yang.CloudRegion;
 import org.onap.aai.domain.yang.Configuration;
+import org.onap.aai.domain.yang.Configurations;
 import org.onap.aai.domain.yang.GenericVnf;
 import org.onap.aai.domain.yang.GenericVnfs;
 import org.onap.aai.domain.yang.L3Network;
@@ -865,4 +866,16 @@
         assertEquals(expectedFlowsToExecute.size(), flowsToExecute.size());
     }
 
+    @Test
+    public void getRelatedConfigurationByNameFromServiceInstanceTest() throws Exception {
+        Optional<Configurations> expected = Optional.of(new Configurations());
+        Configuration configuration = new Configuration();
+        configuration.setConfigurationId("id123");
+        expected.get().getConfiguration().add(configuration);
+        doReturn(expected).when(MOCK_aaiResourcesClient).get(eq(Configurations.class), any(AAIResourceUri.class));
+        Optional<Configuration> actual =
+                this.bbInputSetupUtils.getRelatedConfigurationByNameFromServiceInstance("id123", "name123");
+        assertEquals(actual.get().getConfigurationId(), expected.get().getConfiguration().get(0).getConfigurationId());
+    }
+
 }
diff --git a/bpmn/mso-infrastructure-bpmn/src/main/java/org/onap/so/bpmn/common/workflow/service/WorkflowAsyncResource.java b/bpmn/mso-infrastructure-bpmn/src/main/java/org/onap/so/bpmn/common/workflow/service/WorkflowAsyncResource.java
index e8e4b85..ace6e19 100644
--- a/bpmn/mso-infrastructure-bpmn/src/main/java/org/onap/so/bpmn/common/workflow/service/WorkflowAsyncResource.java
+++ b/bpmn/mso-infrastructure-bpmn/src/main/java/org/onap/so/bpmn/common/workflow/service/WorkflowAsyncResource.java
@@ -101,7 +101,7 @@
         try {
             MDC.put(ONAPLogConstants.MDCs.REQUEST_ID, getRequestId(inputVariables));
             processor.startProcess(processKey, variableMap);
-            WorkflowResponse response = waitForResponse(getRequestId(inputVariables));
+            WorkflowResponse response = waitForResponse(inputVariables);
             return Response.status(202).entity(response).build();
         } catch (WorkflowProcessorException e) {
             WorkflowResponse response = e.getWorkflowResponse();
@@ -112,9 +112,12 @@
         }
     }
 
-    private WorkflowResponse waitForResponse(String requestId) throws Exception {
+    private WorkflowResponse waitForResponse(Map<String, Object> inputVariables) throws Exception {
+        String requestId = getRequestId(inputVariables);
         long currentWaitTime = 0;
-        while (DEFAULT_WAIT_TIME > currentWaitTime) {
+        long waitTime = getWaitTime(inputVariables);
+        logger.debug("WorkflowAsyncResource.waitForResponse using timeout: " + waitTime);
+        while (waitTime > currentWaitTime) {
             Thread.sleep(workflowPollInterval);
             currentWaitTime = currentWaitTime + workflowPollInterval;
             WorkflowContext foundContext = contextHolder.getWorkflowContext(requestId);
@@ -123,7 +126,7 @@
                 return buildResponse(foundContext);
             }
         }
-        throw new Exception("TimeOutOccured");
+        throw new Exception("TimeOutOccured in WorkflowAsyncResource.waitForResponse for time " + waitTime + "ms");
     }
 
     private WorkflowResponse buildUnkownError(String requestId, String error) {
@@ -171,4 +174,25 @@
         return inputVariables;
     }
 
+    /**
+     * Returns the wait time, this is used by the resource on how long it should wait to send a response If none
+     * specified DEFAULT_WAIT_TIME is used
+     *
+     * @param inputVariables
+     * @return
+     */
+    private long getWaitTime(Map<String, Object> inputVariables) {
+        String timeout = inputVariables.get("mso-service-request-timeout") == null ? null
+                : inputVariables.get("mso-service-request-timeout").toString();
+
+        if (timeout != null) {
+            try {
+                return Long.parseLong(timeout) * 1000;
+            } catch (NumberFormatException nex) {
+                logger.debug("Invalid input for mso-service-request-timeout");
+            }
+        }
+        return DEFAULT_WAIT_TIME;
+    }
+
 }
diff --git a/bpmn/mso-infrastructure-bpmn/src/main/java/org/onap/so/bpmn/common/workflow/service/WorkflowResource.java b/bpmn/mso-infrastructure-bpmn/src/main/java/org/onap/so/bpmn/common/workflow/service/WorkflowResource.java
index 20f3eb4..bcc3739 100644
--- a/bpmn/mso-infrastructure-bpmn/src/main/java/org/onap/so/bpmn/common/workflow/service/WorkflowResource.java
+++ b/bpmn/mso-infrastructure-bpmn/src/main/java/org/onap/so/bpmn/common/workflow/service/WorkflowResource.java
@@ -116,7 +116,7 @@
             long timeToWaitAfterProcessEnded = uriInfo == null ? 5000 : 60000;
             AtomicLong timeProcessEnded = new AtomicLong(0);
             boolean endedWithNoResponse = false;
-
+            logger.debug(LOGMARKER + "WorkflowResource.startProcessInstanceByKey using timeout: " + waitTime);
             while (now <= endTime) {
                 Thread.sleep(pollingInterval);
 
diff --git a/bpmn/mso-infrastructure-bpmn/src/main/resources/application.yaml b/bpmn/mso-infrastructure-bpmn/src/main/resources/application.yaml
index 185db16..1ad95b3 100644
--- a/bpmn/mso-infrastructure-bpmn/src/main/resources/application.yaml
+++ b/bpmn/mso-infrastructure-bpmn/src/main/resources/application.yaml
@@ -19,6 +19,8 @@
       enabled: false
   jersey:
     application-path: /sobpmnengine
+  main:
+    allow-bean-definition-overriding: true
 camunda:
   bpm:
     application:
diff --git a/bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/Activity/PauseForManualTaskActivity.bpmn b/bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/Activity/PauseForManualTaskActivity.bpmn
index fb9704d..884ec20 100644
--- a/bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/Activity/PauseForManualTaskActivity.bpmn
+++ b/bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/Activity/PauseForManualTaskActivity.bpmn
@@ -22,11 +22,11 @@
     </bpmn2:userTask>
     <bpmn2:sequenceFlow id="SequenceFlow_0b84ki5" sourceRef="UpdateDbStatusToPendingManualTask" targetRef="CreateExternalTicket" />
     <bpmn2:sequenceFlow id="SequenceFlow_14cyk9v" sourceRef="UpdateDbStatusToInProgress" targetRef="PauseForManualTaskActivity_End" />
-    <bpmn2:serviceTask id="UpdateDbStatusToPendingManualTask" name="Update Infra DB Status to PENDING_MANUAL_TASK" camunda:expression="${ManualHandlingTasks.updateRequestDbStatus(execution,&#34;PENDING_MANUAL_TASK&#34;)}">
+    <bpmn2:serviceTask id="UpdateDbStatusToPendingManualTask" name="Update Infra DB Status to PENDING_MANUAL_TASK" camunda:expression="${ManualHandlingTasks.updateRequestDbStatus(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)),&#34;PENDING_MANUAL_TASK&#34;)}">
       <bpmn2:incoming>SequenceFlow_0jav6cu</bpmn2:incoming>
       <bpmn2:outgoing>SequenceFlow_0b84ki5</bpmn2:outgoing>
     </bpmn2:serviceTask>
-    <bpmn2:serviceTask id="UpdateDbStatusToInProgress" name="Update Infra DB Status to IN_PROGRESS" camunda:expression="${ManualHandlingTasks.updateRequestDbStatus(execution, &#34;IN_PROGRESS&#34;)}">
+    <bpmn2:serviceTask id="UpdateDbStatusToInProgress" name="Update Infra DB Status to IN_PROGRESS" camunda:expression="${ManualHandlingTasks.updateRequestDbStatus(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)), &#34;IN_PROGRESS&#34;)}">
       <bpmn2:incoming>SequenceFlow_192yimz</bpmn2:incoming>
       <bpmn2:outgoing>SequenceFlow_14cyk9v</bpmn2:outgoing>
     </bpmn2:serviceTask>
@@ -37,12 +37,12 @@
         <bpmn2:timeDuration xsi:type="bpmn2:tFormalExpression"><![CDATA[${execution.getVariable("taskTimeout")}]]></bpmn2:timeDuration>
       </bpmn2:timerEventDefinition>
     </bpmn2:boundaryEvent>
-    <bpmn2:serviceTask id="CreateExternalTicket" name="Create ExternalTicket" camunda:expression="${ManualHandlingTasks.createExternalTicket(execution)}">
+    <bpmn2:serviceTask id="CreateExternalTicket" name="Create ExternalTicket" camunda:expression="${ManualHandlingTasks.createExternalTicket(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
       <bpmn2:incoming>SequenceFlow_0b84ki5</bpmn2:incoming>
       <bpmn2:outgoing>SequenceFlow_0igra4l</bpmn2:outgoing>
     </bpmn2:serviceTask>
     <bpmn2:sequenceFlow id="SequenceFlow_01k6zgt" sourceRef="ManualTaskTimer" targetRef="UpdateDBStatusToTimeout" />
-    <bpmn2:serviceTask id="UpdateDBStatusToTimeout" name="Update Infra DB Status To TIMEOUT" camunda:expression="${ManualHandlingTasks.updateRequestDbStatus(execution, &#34;TIMEOUT&#34;)}">
+    <bpmn2:serviceTask id="UpdateDBStatusToTimeout" name="Update Infra DB Status To TIMEOUT" camunda:expression="${ManualHandlingTasks.updateRequestDbStatus(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)), &#34;TIMEOUT&#34;)}">
       <bpmn2:incoming>SequenceFlow_01k6zgt</bpmn2:incoming>
       <bpmn2:outgoing>SequenceFlow_16bjdgj</bpmn2:outgoing>
     </bpmn2:serviceTask>
@@ -147,4 +147,4 @@
       </bpmndi:BPMNEdge>
     </bpmndi:BPMNPlane>
   </bpmndi:BPMNDiagram>
-</bpmn2:definitions>
+</bpmn2:definitions>
\ No newline at end of file
diff --git a/bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/infrastructure/bpmn/subprocess/PauseForManualTaskActivityTest.java b/bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/infrastructure/bpmn/subprocess/PauseForManualTaskActivityTest.java
index 484f9b8..c0b0094 100644
--- a/bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/infrastructure/bpmn/subprocess/PauseForManualTaskActivityTest.java
+++ b/bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/infrastructure/bpmn/subprocess/PauseForManualTaskActivityTest.java
@@ -35,6 +35,7 @@
 import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.onap.so.bpmn.BaseBPMNTest;
+import org.onap.so.bpmn.common.BuildingBlockExecution;
 
 
 public class PauseForManualTaskActivityTest extends BaseBPMNTest {
@@ -85,7 +86,7 @@
     @Test
     public void rainyDayPauseForManualTask_Test() throws Exception {
         doThrow(new BpmnError("7000", "TESTING ERRORS")).when(manualHandlingTasks)
-                .createExternalTicket((any(DelegateExecution.class)));
+                .createExternalTicket((any(BuildingBlockExecution.class)));
         ProcessInstance pi = runtimeService.startProcessInstanceByKey("PauseForManualTaskActivity", variables);
         assertThat(pi).isNotNull().isStarted()
                 .hasPassedInOrder("PauseForManualTaskActivity_Start", "UpdateDbStatusToPendingManualTask",
diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/Create3rdONAPE2EServiceInstance.groovy b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/Create3rdONAPE2EServiceInstance.groovy
index 044f0b4..8bb48a2 100644
--- a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/Create3rdONAPE2EServiceInstance.groovy
+++ b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/Create3rdONAPE2EServiceInstance.groovy
@@ -22,6 +22,7 @@
 
 package org.onap.so.bpmn.infrastructure.scripts
 
+import com.google.gson.JsonObject
 import org.json.JSONArray
 import org.json.JSONObject
 import org.json.XML
@@ -93,11 +94,12 @@
 			// set local resourceInput
 			execution.setVariable(Prefix + "ResourceInput", resourceInputObj)
 
+			String spPartnerModelName = UrnPropertiesReader.getVariable("sp-partner.modelName")
 			boolean is3rdONAPExist = false
 
-			if(inputParameters.has("sppartner_url"))
+			if(inputParameters.has(spPartnerModelName + "_url"))
 			{
-				String sppartnerUrl = inputParameters.get("sppartner_url")
+				String sppartnerUrl = inputParameters.get(spPartnerModelName + "_url")
 				if(!isBlank(sppartnerUrl)) {
 					execution.setVariable(Prefix + "SppartnerUrl", sppartnerUrl)
 					is3rdONAPExist = true
@@ -108,9 +110,9 @@
 					logger.debug(msg)
 				}
 			}
-			if(inputParameters.has("sppartner_providingServiceUuid"))
+			if(inputParameters.has(spPartnerModelName + "_providingServiceUuid"))
 			{
-				String sppartnerUUID= inputParameters.get("sppartner_providingServiceUuid")
+				String sppartnerUUID= inputParameters.get(spPartnerModelName + "_providingServiceUuid")
 				execution.setVariable(Prefix + "SppartnerUUID", sppartnerUUID)
 				is3rdONAPExist = true
 			}
@@ -119,9 +121,9 @@
 				String msg = "sppartner providingServiceUuid is blank."
 				logger.debug(msg)
 			}
-			if(inputParameters.has("sppartner_providingServiceInvariantUuid"))
+			if(inputParameters.has(spPartnerModelName + "_providingServiceInvariantUuid"))
 			{
-				String sppartnerInvarianteUUID  = inputParameters.get("sppartner_providingServiceInvariantUuid")
+				String sppartnerInvarianteUUID  = inputParameters.get(spPartnerModelName + "_providingServiceInvariantUuid")
 				execution.setVariable(Prefix + "SppartnerInvarianteUUID", sppartnerInvarianteUUID)
 				is3rdONAPExist = true
 			}
@@ -131,9 +133,9 @@
 				logger.debug(msg)
 			}
 
-			if(inputParameters.has("sppartner_handoverMode"))
+			if(inputParameters.has(spPartnerModelName + "_handoverMode"))
 			{
-				String handoverMode = inputParameters.get("sppartner_handoverMode")
+				String handoverMode = inputParameters.get(spPartnerModelName + "_handoverMode")
 				execution.setVariable(Prefix + "HandoverMode", handoverMode)
 			    is3rdONAPExist = true
 			}
@@ -167,7 +169,7 @@
 			String serviceParameters = JsonUtils.getJsonValue(incomingRequest, "service.parameters")
 			String requestInputs = JsonUtils.getJsonValue(serviceParameters, "requestInputs")
 			JSONObject inputParameters = new JSONObject(requestInputs)
-			execution.setVariable(Prefix + "ServiceParameters", inputParameters)
+			execution.setVariable(Prefix + "ServiceParameters", inputParameters.toString())
 
 			// CallSource is added only when ONAP SO calling 3rdONAP(External API) SO(Remote call)
 			boolean isLocalCall = true
@@ -182,7 +184,7 @@
 				}
 			}
 			execution.setVariable(Prefix + "CallSource", callSource)
-			logger.debug("callSource is: " + callSource )
+			logger.info("callSource is: " + callSource )
 
 			execution.setVariable("IsLocalCall", isLocalCall)
 
@@ -308,39 +310,39 @@
 		String handoverMode = execution.getVariable(Prefix + "HandoverMode")
 		if("SOTN".equalsIgnoreCase(handoverMode)) {
 			// Put TP Link info into serviceParameters
-			JSONObject inputParameters = execution.getVariable(Prefix + "ServiceParameters")
+			JSONObject inputParameters = new JSONObject(execution.getVariable(Prefix + "ServiceParameters"))
 			if(inputParameters.has("remote-access-provider-id")) {
 				Map<String, Object> crossTPs = new HashMap<String, Object>();
-				crossTPs.put("local-access-provider-id", inputParameters.get("remote-access-provider-id"));
-				crossTPs.put("local-access-client-id", inputParameters.get("remote-access-client-id"));
-				crossTPs.put("local-access-topology-id", inputParameters.get("remote-access-topology-id"));
-				crossTPs.put("local-access-node-id", inputParameters.get("remote-access-node-id"));
-				crossTPs.put("local-access-ltp-id", inputParameters.get("remote-access-ltp-id"));
-				crossTPs.put("remote-access-provider-id", inputParameters.get("local-access-provider-id"));
-				crossTPs.put("remote-access-client-id", inputParameters.get("local-access-client-id"));
-				crossTPs.put("remote-access-topology-id", inputParameters.get("local-access-topology-id"));
-				crossTPs.put("remote-access-node-id", inputParameters.get("local-access-node-id"));
-				crossTPs.put("remote-access-ltp-id", inputParameters.get("local-access-ltp-id"));
+				crossTPs.put("local-access-provider-id", inputParameters.get("remote-access-provider-id"))
+				crossTPs.put("local-access-client-id", inputParameters.get("remote-access-client-id"))
+				crossTPs.put("local-access-topology-id", inputParameters.get("remote-access-topology-id"))
+				crossTPs.put("local-access-node-id", inputParameters.get("remote-access-node-id"))
+				crossTPs.put("local-access-ltp-id", inputParameters.get("remote-access-ltp-id"))
+				crossTPs.put("remote-access-provider-id", inputParameters.get("local-access-provider-id"))
+				crossTPs.put("remote-access-client-id", inputParameters.get("local-access-client-id"))
+				crossTPs.put("remote-access-topology-id", inputParameters.get("local-access-topology-id"))
+				crossTPs.put("remote-access-node-id", inputParameters.get("local-access-node-id"))
+				crossTPs.put("remote-access-ltp-id", inputParameters.get("local-access-ltp-id"))
 
-				inputParameters.put("local-access-provider-id", crossTPs.get("local-access-provider-id"));
-				inputParameters.put("local-access-client-id", crossTPs.get("local-access-client-id"));
-				inputParameters.put("local-access-topology-id", crossTPs.get("local-access-topology-id"));
-				inputParameters.put("local-access-node-id", crossTPs.get("local-access-node-id"));
-				inputParameters.put("local-access-ltp-id", crossTPs.get("local-access-ltp-id"));
-				inputParameters.put("remote-access-provider-id", crossTPs.get("remote-access-provider-id"));
-				inputParameters.put("remote-access-client-id", crossTPs.get("remote-access-client-id"));
-				inputParameters.put("remote-access-topology-id", crossTPs.get("remote-access-topology-id"));
-				inputParameters.put("remote-access-node-id", crossTPs.get("remote-access-node-id"));
-				inputParameters.put("remote-access-ltp-id", crossTPs.get("remote-access-ltp-id"));
+				inputParameters.put("local-access-provider-id", crossTPs.get("local-access-provider-id"))
+				inputParameters.put("local-access-client-id", crossTPs.get("local-access-client-id"))
+				inputParameters.put("local-access-topology-id", crossTPs.get("local-access-topology-id"))
+				inputParameters.put("local-access-node-id", crossTPs.get("local-access-node-id"))
+				inputParameters.put("local-access-ltp-id", crossTPs.get("local-access-ltp-id"))
+				inputParameters.put("remote-access-provider-id", crossTPs.get("remote-access-provider-id"))
+				inputParameters.put("remote-access-client-id", crossTPs.get("remote-access-client-id"))
+				inputParameters.put("remote-access-topology-id", crossTPs.get("remote-access-topology-id"))
+				inputParameters.put("remote-access-node-id", crossTPs.get("remote-access-node-id"))
+				inputParameters.put("remote-access-ltp-id", crossTPs.get("remote-access-ltp-id"))
 
-				execution.setVariable(Prefix + "ServiceParameters", inputParameters)
+				execution.setVariable(Prefix + "ServiceParameters", inputParameters.toString())
 			}
 			else {
 					logger.error("No allocated CrossONAPResource found in ServiceParameters")
 			}
 		}
 
-		logger.info("Exit " + allocateCrossONAPResource)
+		logger.info("Exit  allocateCrossONAPResource")
 	}
 
 	public void prepare3rdONAPRequest(DelegateExecution execution) {
@@ -409,7 +411,7 @@
 		_requestInputs_ +=  ",\n" + externalAPIUtil.setTemplate(ExternalAPIUtil.RequestInputsTemplate, requestInputsMap)
 
 		// Transfer all uuiRequest incomeParameters to ExternalAPI format
-		JSONObject inputParameters = execution.getVariable(Prefix + "ServiceParameters")
+		JSONObject inputParameters = new JSONObject(execution.getVariable(Prefix + "ServiceParameters"))
 		for(String key : inputParameters.keySet()) {
 			String inputName = key
 			String inputValue = inputParameters.opt(key)
@@ -506,7 +508,7 @@
 			}
 
 			JSONArray items = responseObj.getJSONArray("orderItem")
-			JSONObject item = items[0]
+			JSONObject item = items.get(0)
 			JSONObject service = item.get("service")
 			String sppartnerServiceId = service.get("id")
 			if(sppartnerServiceId == null || sppartnerServiceId.equals("null")) {
@@ -572,7 +574,9 @@
 	 */
 	public void timeDelay(DelegateExecution execution) {
 		try {
+			logger.debug("going to sleep for 5 sec")
 			Thread.sleep(5000)
+			logger.debug("wakeup after 5 sec")
 		} catch(InterruptedException e) {
 			logger.error("Time Delay exception" + e)
 		}
@@ -601,6 +605,8 @@
 
 		AAIResourcesClient client = new AAIResourcesClient()
 		AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.SP_PARTNER, sppartnerId)
+		logger.info("sending request to create sp-partner: " +  uri.toString())
+		logger.info("requestbody: " + partner)
 		client.create(uri, partner)
 
 		AAIResourceUri siUri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, globalSubscriberId, serviceType, serviceInstanceId)
diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/CreateSDNCNetworkResource.groovy b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/CreateSDNCNetworkResource.groovy
index b0419be..bcd3353 100644
--- a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/CreateSDNCNetworkResource.groovy
+++ b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/CreateSDNCNetworkResource.groovy
@@ -276,9 +276,10 @@
 
             case ~/[\w\s\W]*sdwanvpnattachment[\w\s\W]*/ :
             case ~/[\w\s\W]*sotnvpnattachment[\w\s\W]*/ :
+            case ~/[\w\s\W]*SOTN-Attachment[\w\s\W]*/ :
                 // fill attachment TP in networkInputParamJson
-                def vpnName = StringUtils.containsIgnoreCase(modelName, "sotnvpnattachment") ? "sotnvpnattachmentvf_sotncondition_sotnVpnName" : "sdwanvpnattachmentvf_sdwancondition_sdwanVpnName"
-                fillAttachmentTPInfo(resourceInputObj, modelName, execution, vpnName)
+                def vpnName = StringUtils.containsIgnoreCase(modelName, "sotnvpnattachment") ? "sotnvpnattachmentvf_sotncondition_sotnVpnName" : (StringUtils.containsIgnoreCase(modelName, "SOTN-Attachment") ? "elinesotnattachmentvf0_elinesotnattachmentvfc0_sotnVpnName" : "sdwanvpnattachmentvf_sdwancondition_sdwanVpnName")
+                fillAttachmentTPInfo(resourceInputObj, execution, vpnName)
 
                 break
             default:
@@ -286,27 +287,36 @@
                 // in case name is different as expected
                 if ("ALLOTTED_RESOURCE".equals(resourceInputObj.getResourceModelInfo().getModelType())) {
                     def vpnName = modelName + "_sotnVpnName"
-                    fillAttachmentTPInfo(resourceInputObj, modelName, execution, vpnName)
+                    fillAttachmentTPInfo(resourceInputObj, execution, vpnName)
                 }
                 break
         }
         return resourceInputObj
     }
 
-    private void fillAttachmentTPInfo(ResourceInput resourceInputObj, String modelName, DelegateExecution execution, String vpnName) {
-        String customer = resourceInputObj.getGlobalSubscriberId()
-        String serviceType = resourceInputObj.getServiceType()
+    private void fillAttachmentTPInfo(ResourceInput resourceInputObj, DelegateExecution execution, String vpnName) {
 
         String parentServiceName = jsonUtil.getJsonValueForKey(resourceInputObj.getRequestsInputs(), vpnName)
 
         AAIResourcesClient client = new AAIResourcesClient()
-        AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectPlurals.SERVICE_INSTANCE, customer, serviceType).queryParam("service-instance-name", parentServiceName)
-        ServiceInstances sis = client.get(uri).asBean(ServiceInstances.class).get()
-        logger.debug("Fetched AAI ServiceInstances for the vpnName:" + vpnName + " is " + sis.getServiceInstance().toString())
-        ServiceInstance si = sis.getServiceInstance().get(0)
+        logger.info("sending request to resolve vpn-name:" + vpnName)
+        AAIResourceUri uri = AAIUriFactory.createResourceUri(new AAIObjectPlurals("/nodes", "/service-instances", "queryByName")).queryParam("service-instance-name", parentServiceName)
+        Optional<ServiceInstances> serviceInstancesOpt = client.get(ServiceInstances.class, uri)
 
-        def parentServiceInstanceId = si.getServiceInstanceId()
-        execution.setVariable("parentServiceInstanceId", parentServiceInstanceId)
+        if(serviceInstancesOpt.isPresent()) {
+            List<ServiceInstance> serviceInstanceList = serviceInstancesOpt.get().getServiceInstance()
+            logger.info("response from aai:" + serviceInstanceList.toString())
+            if (serviceInstanceList.size() > 0) {
+                ServiceInstance si = serviceInstanceList.get(0)
+                String parentServiceInstanceId = si.getServiceInstanceId()
+                execution.setVariable("parentServiceInstanceId", parentServiceInstanceId)
+                logger.info("setting parentService id:" + parentServiceInstanceId)
+            } else {
+                logger.error("No service instance found for given name.")
+            }
+        } else {
+            logger.error("No nodes found with this name" + vpnName)
+        }
     }
 
     /**
diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoCreateE2EServiceInstance.groovy b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoCreateE2EServiceInstance.groovy
index d9f9299..0191439 100644
--- a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoCreateE2EServiceInstance.groovy
+++ b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoCreateE2EServiceInstance.groovy
@@ -584,6 +584,13 @@
 		List<Resource> addResourceList = serviceDecomposition.getServiceResources()
 		execution.setVariable("addResourceList", addResourceList)
 
+		boolean isCreateResourceListValid = true
+		if (addResourceList == null || addResourceList.isEmpty()) {
+			isCreateResourceListValid = false
+		}
+
+		execution.setVariable("isCreateResourceListValid", isCreateResourceListValid)
+
 		logger.trace("COMPLETED preProcessForAddResource Process ")
 	}
 
diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/java/org/onap/so/bpmn/infrastructure/workflow/service/ServicePluginFactory.java b/bpmn/so-bpmn-infrastructure-common/src/main/java/org/onap/so/bpmn/infrastructure/workflow/service/ServicePluginFactory.java
index 9319353..1516f28 100644
--- a/bpmn/so-bpmn-infrastructure-common/src/main/java/org/onap/so/bpmn/infrastructure/workflow/service/ServicePluginFactory.java
+++ b/bpmn/so-bpmn-infrastructure-common/src/main/java/org/onap/so/bpmn/infrastructure/workflow/service/ServicePluginFactory.java
@@ -29,6 +29,7 @@
 import java.io.InputStream;
 import java.net.SocketTimeoutException;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
@@ -56,6 +57,8 @@
 import org.onap.aai.domain.yang.LogicalLink;
 import org.onap.aai.domain.yang.LogicalLinks;
 import org.onap.aai.domain.yang.PInterface;
+import org.onap.aai.domain.yang.Pnf;
+import org.onap.aai.domain.yang.Relationship;
 import org.onap.so.bpmn.core.UrnPropertiesReader;
 import org.onap.so.bpmn.core.domain.Resource;
 import org.onap.so.bpmn.core.domain.ServiceDecomposition;
@@ -86,6 +89,14 @@
 
     private static ServicePluginFactory instance;
 
+    private static final String CUSTOM_RESOURCE_TP = "custom-resource-tp";
+    private static final String VS_MONITORED = "VS_assured";
+    private static final String VS_UNMONITORED = "VS_besteffort";
+    private static final String TS_MONITORED = "TS1";
+    private static final String TS_UNMONITORED = "TS2";
+    private static final String CUSTOM_TP_LIST[] =
+            new String[] {VS_MONITORED, VS_UNMONITORED, TS_MONITORED, TS_UNMONITORED};
+
     static {
         try (InputStream is = ClassLoader.class.getResourceAsStream("/application.properties")) {
             Properties prop = new Properties();
@@ -166,8 +177,7 @@
     }
 
     private boolean isNeedProcessSite(String uuiRequest) {
-        return uuiRequest.toLowerCase().contains("site_address")
-                && uuiRequest.toLowerCase().contains("sotncondition_clientsignal");
+        return uuiRequest.toLowerCase().contains("address") && uuiRequest.toLowerCase().contains("clientsignal");
     }
 
     @SuppressWarnings("unchecked")
@@ -178,6 +188,7 @@
             return true;
         }
         String host = (String) tpInfoMap.get("host");
+        logger.info("host string from tpinfo:" + host);
         // host is empty means TP is in local, not empty means TP is in remote ONAP
         if (!host.isEmpty()) {
             return false;
@@ -191,17 +202,33 @@
         accessTPInfo.put("access-ltp-id", tpInfoMap.get("access-ltp-id"));
 
         // change resources
+        boolean flgResourceFound = false;
         String resourceName = (String) tpInfoMap.get("resourceName");
         for (Object curResource : resources) {
             Map<String, Object> resource = (Map<String, Object>) curResource;
             String curResourceName = (String) resource.get("resourceName");
             curResourceName = curResourceName.replaceAll(" ", "");
             if (resourceName.equalsIgnoreCase(curResourceName)) {
+                flgResourceFound = true;
+                logger.info("found match to add site tp info using uui template resource name");
                 putResourceRequestInputs(resource, accessTPInfo);
                 break;
             }
         }
 
+        if (!flgResourceFound) {
+            String attacmentResName = UrnPropertiesReader.getVariable("sp-partner.attachment-resource-name");
+            for (Object curResource : resources) {
+                Map<String, Object> resource = (Map<String, Object>) curResource;
+                String curResourceName = (String) resource.get("resourceName");
+
+                if (attacmentResName.equals(curResourceName)) {
+                    logger.info("found match to add site tp info using customized resource name");
+                    putResourceRequestInputs(resource, accessTPInfo);
+                }
+            }
+        }
+
         return true;
     }
 
@@ -215,10 +242,10 @@
         // logic for R2 uuiRequest params in service level
         for (Entry<String, Object> entry : serviceRequestInputs.entrySet()) {
             String key = entry.getKey();
-            if (key.toLowerCase().contains("site_address")) {
+            if (key.toLowerCase().contains("address")) {
                 location = entry.getValue();
             }
-            if (key.toLowerCase().contains("sotncondition_clientsignal")) {
+            if (key.toLowerCase().contains("clientsignal")) {
                 clientSignal = entry.getValue();
                 vpnAttachmentResourceName = key.substring(0, key.indexOf("_"));
             }
@@ -242,10 +269,12 @@
                     tpInfoMap = tpJson;
                     // add resourceName
                     tpInfoMap.put("resourceName", vpnAttachmentResourceName);
+                    logger.info("*** we will try to find resourcename(" + vpnAttachmentResourceName
+                            + ") to add resource input ***");
                     break;
                 }
             }
-            logger.debug("Get Terminal TP from InventoryOSS");
+            logger.info("Get Terminal TP from InventoryOSS: " + tpInfoMap);
             return tpInfoMap;
         }
 
@@ -330,10 +359,33 @@
         return false;
     }
 
+    private void customizeTP(Map<String, Object> crossTps, String svcName, DelegateExecution execution) {
+        Optional<String> customType = Arrays.stream(CUSTOM_TP_LIST).filter(svcName::contains).findFirst();
+        if (customType.isPresent()) {
+            logger.info("customizing TP");
+            String localTPs = UrnPropertiesReader.getVariable(CUSTOM_RESOURCE_TP + "." + customType.get() + ".local");
+            String remoteTPs = UrnPropertiesReader.getVariable(CUSTOM_RESOURCE_TP + "." + customType.get() + ".remote");
+
+            String localTP = (String) crossTps.get("local-access-ltp-id");
+            String remoteTP = (String) crossTps.get("remote-access-ltp-id");
+
+            if (localTPs.contains(localTP) && remoteTPs.contains(remoteTP)) {
+                logger.info("using same tp returned from AAI");
+                return;
+            }
+
+            crossTps.put("local-access-ltp-id", localTPs.split(",")[0]);
+            crossTps.put("remote-access-ltp-id", remoteTPs.split(",")[0]);
+        }
+        logger.info("cross TP info:" + crossTps);
+    }
+
     @SuppressWarnings("unchecked")
     private void allocateCrossTPResources(DelegateExecution execution, Map<String, Object> serviceRequestInputs) {
 
-        Map<String, Object> crossTPs = this.getTPsfromAAI();
+        String serviceName = (String) execution.getVariable("serviceInstanceName");
+        Map<String, Object> crossTPs = this.getTPsfromAAI(serviceName);
+        // customizeTP(crossTPs, serviceName, execution);
 
         if (crossTPs == null || crossTPs.isEmpty()) {
             serviceRequestInputs.put("local-access-provider-id", "");
@@ -353,17 +405,45 @@
             serviceRequestInputs.put("local-access-node-id", crossTPs.get("local-access-node-id"));
             serviceRequestInputs.put("local-access-ltp-id", crossTPs.get("local-access-ltp-id"));
             serviceRequestInputs.put("remote-access-provider-id", crossTPs.get("remote-access-provider-id"));
-            serviceRequestInputs.put("remote-access-client-id", crossTPs.get("remote-client-id"));
-            serviceRequestInputs.put("remote-access-topology-id", crossTPs.get("remote-topology-id"));
-            serviceRequestInputs.put("remote-access-node-id", crossTPs.get("remote-node-id"));
-            serviceRequestInputs.put("remote-access-ltp-id", crossTPs.get("remote-ltp-id"));
+            serviceRequestInputs.put("remote-access-client-id", crossTPs.get("remote-access-client-id"));
+            serviceRequestInputs.put("remote-access-topology-id", crossTPs.get("remote-access-topology-id"));
+            serviceRequestInputs.put("remote-access-node-id", crossTPs.get("remote-access-node-id"));
+            serviceRequestInputs.put("remote-access-ltp-id", crossTPs.get("remote-access-ltp-id"));
         }
 
         return;
     }
 
+    private LogicalLink selectLogicalLink(List<LogicalLink> logicalLinks, String svcName) {
+        Optional<String> customType = Arrays.stream(CUSTOM_TP_LIST).filter(svcName::contains).findFirst();
+        if (customType.isPresent()) {
+
+            String[] allowedList =
+                    UrnPropertiesReader.getVariable(CUSTOM_RESOURCE_TP + "." + customType.get() + ".local").split(",");
+
+            for (String localTp : allowedList) {
+                for (LogicalLink link : logicalLinks) {
+                    for (Relationship relationship : link.getRelationshipList().getRelationship()) {
+                        if (relationship.getRelatedTo().equals("p-interface")
+                                && relationship.getRelatedLink().contains("-ltpId-" + localTp)
+                                && link.getOperationalStatus().equalsIgnoreCase("up")) {
+                            logger.info("linkname:" + link.getLinkName() + " is matching with allowed list");
+                            return link;
+                        }
+                    }
+                }
+            }
+
+            logger.error("There is no matching logical link for allowed list :" + allowedList.toString());
+            return null;
+        } else {
+            logger.info("link customization is not required");
+            return logicalLinks.get(0);
+        }
+    }
+
     // This method returns Local and remote TPs information from AAI
-    public Map getTPsfromAAI() {
+    public Map getTPsfromAAI(String serviceName) {
         Map<String, Object> tpInfo = new HashMap<>();
 
         AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectPlurals.LOGICAL_LINK);
@@ -372,11 +452,11 @@
 
         if (result.isPresent()) {
             LogicalLinks links = result.get();
-            boolean isRemoteLink = false;
+            LogicalLink link = selectLogicalLink(links.getLogicalLink(), serviceName);
 
-            links.getLogicalLink();
-
-            for (LogicalLink link : links.getLogicalLink()) {
+            if (link != null) {
+                boolean isRemoteLink = false;
+                logger.info("processing link :" + link.getLinkName());
                 AAIResultWrapper wrapper = new AAIResultWrapper(link);
                 Optional<Relationships> optRelationships = wrapper.getRelationships();
                 List<AAIResourceUri> pInterfaces = new ArrayList<>();
@@ -386,57 +466,85 @@
                         isRemoteLink = true;
                     }
                     pInterfaces.addAll(relationships.getRelatedAAIUris(AAIObjectType.P_INTERFACE));
-                }
+                    if (isRemoteLink) {
+                        // find remote p interface
+                        AAIResourceUri localTP = null;
+                        AAIResourceUri remoteTP = null;
 
-                if (isRemoteLink) {
-                    // find remote p interface
-                    AAIResourceUri localTP = null;
-                    AAIResourceUri remoteTP = null;
+                        AAIResourceUri pInterface0 = pInterfaces.get(0);
 
-                    AAIResourceUri pInterface0 = pInterfaces.get(0);
-
-                    if (isRemotePInterface(client, pInterface0)) {
-                        remoteTP = pInterfaces.get(0);
-                        localTP = pInterfaces.get(1);
-                    } else {
-                        localTP = pInterfaces.get(0);
-                        remoteTP = pInterfaces.get(1);
-                    }
-
-                    if (localTP != null && remoteTP != null) {
-                        // give local tp
-                        String tpUrl = localTP.build().toString();
-                        PInterface intfLocal = client.get(PInterface.class, localTP).get();
-                        tpInfo.put("local-access-node-id", tpUrl.split("/")[6]);
-
-                        String[] networkRef = intfLocal.getNetworkRef().split("/");
-                        if (networkRef.length == 6) {
-                            tpInfo.put("local-access-provider-id", networkRef[1]);
-                            tpInfo.put("local-access-client-id", networkRef[3]);
-                            tpInfo.put("local-access-topology-id", networkRef[5]);
-                        }
-                        String ltpIdStr = tpUrl.substring(tpUrl.lastIndexOf("/") + 1);
-                        if (ltpIdStr.contains("-")) {
-                            tpInfo.put("local-access-ltp-id", ltpIdStr.substring(ltpIdStr.lastIndexOf("-") + 1));
+                        if (isRemotePInterface(client, pInterface0)) {
+                            remoteTP = pInterfaces.get(0);
+                            localTP = pInterfaces.get(1);
+                        } else {
+                            localTP = pInterfaces.get(0);
+                            remoteTP = pInterfaces.get(1);
                         }
 
-                        // give remote tp
-                        tpUrl = remoteTP.build().toString();
-                        PInterface intfRemote = client.get(PInterface.class, remoteTP).get();
-                        tpInfo.put("remote-access-node-id", tpUrl.split("/")[6]);
+                        if (localTP != null && remoteTP != null) {
+                            // give local tp
+                            String tpUrl = localTP.build().toString();
+                            String localNodeId = tpUrl.split("/")[4];
+                            tpInfo.put("local-access-node-id", localNodeId);
 
-                        String[] networkRefRemote = intfRemote.getNetworkRef().split("/");
+                            logger.info("Get info for local TP :" + localNodeId);
+                            Optional<Pnf> optLocalPnf = client.get(Pnf.class,
+                                    AAIUriFactory.createResourceUri(AAIObjectType.PNF, localNodeId));
 
-                        if (networkRefRemote.length == 6) {
-                            tpInfo.put("remote-access-provider-id", networkRefRemote[1]);
-                            tpInfo.put("remote-access-client-id", networkRefRemote[3]);
-                            tpInfo.put("remote-access-topology-id", networkRefRemote[5]);
+                            if (optLocalPnf.isPresent()) {
+                                Pnf localPnf = optLocalPnf.get();
+
+                                for (Relationship rel : localPnf.getRelationshipList().getRelationship()) {
+                                    if (rel.getRelatedTo().equalsIgnoreCase("network-resource")) {
+                                        String[] networkRef = rel.getRelatedLink()
+                                                .substring(rel.getRelatedLink().lastIndexOf("/") + 1).split("-");
+                                        if (networkRef.length == 6) {
+                                            tpInfo.put("local-access-provider-id", networkRef[1]);
+                                            tpInfo.put("local-access-client-id", networkRef[3]);
+                                            tpInfo.put("local-access-topology-id", networkRef[5]);
+                                        }
+                                    }
+                                }
+                            }
+                            String ltpIdStr = tpUrl.substring(tpUrl.lastIndexOf("/") + 1);
+                            if (ltpIdStr.contains("-")) {
+                                tpInfo.put("local-access-ltp-id", ltpIdStr.substring(ltpIdStr.lastIndexOf("-") + 1));
+                            }
+
+                            // give remote tp
+                            tpUrl = remoteTP.build().toString();
+                            PInterface intfRemote = client.get(PInterface.class, remoteTP).get();
+
+                            String remoteNodeId = tpUrl.split("/")[4];
+                            tpInfo.put("remote-access-node-id", remoteNodeId);
+
+                            logger.info("Get info for remote TP:" + remoteNodeId);
+
+                            String[] networkRefRemote = intfRemote.getNetworkRef().split("-");
+                            Optional<Pnf> optRemotePnf = client.get(Pnf.class,
+                                    AAIUriFactory.createResourceUri(AAIObjectType.PNF, remoteNodeId));
+
+                            if (optRemotePnf.isPresent()) {
+                                Pnf remotePnf = optRemotePnf.get();
+
+                                for (Relationship rel : remotePnf.getRelationshipList().getRelationship()) {
+                                    if (rel.getRelatedTo().equalsIgnoreCase("network-resource")) {
+                                        String[] networkRef = rel.getRelatedLink()
+                                                .substring(rel.getRelatedLink().lastIndexOf("/") + 1).split("-");
+                                        if (networkRef.length == 6) {
+                                            tpInfo.put("remote-access-provider-id", networkRefRemote[1]);
+                                            tpInfo.put("remote-access-client-id", networkRefRemote[3]);
+                                            tpInfo.put("remote-access-topology-id", networkRefRemote[5]);
+                                        }
+                                    }
+                                }
+                            }
+
+                            String ltpIdStrR = tpUrl.substring(tpUrl.lastIndexOf("/") + 1);
+                            if (ltpIdStrR.contains("-")) {
+                                tpInfo.put("remote-access-ltp-id", ltpIdStrR.substring(ltpIdStr.lastIndexOf("-") + 1));
+                            }
                         }
-                        String ltpIdStrR = tpUrl.substring(tpUrl.lastIndexOf("/") + 1);
-                        if (ltpIdStrR.contains("-")) {
-                            tpInfo.put("remote-access-ltp-id", ltpIdStrR.substring(ltpIdStr.lastIndexOf("-") + 1));
-                        }
-                        return tpInfo;
                     }
                 }
             }
@@ -811,5 +919,4 @@
             }
         }
     }
-
 }
diff --git a/bpmn/so-bpmn-infrastructure-common/src/test/java/org/onap/so/bpmn/infrastructure/workflow/service/ServicePluginFactoryTest.java b/bpmn/so-bpmn-infrastructure-common/src/test/java/org/onap/so/bpmn/infrastructure/workflow/service/ServicePluginFactoryTest.java
index 1a75f12..6b31077 100644
--- a/bpmn/so-bpmn-infrastructure-common/src/test/java/org/onap/so/bpmn/infrastructure/workflow/service/ServicePluginFactoryTest.java
+++ b/bpmn/so-bpmn-infrastructure-common/src/test/java/org/onap/so/bpmn/infrastructure/workflow/service/ServicePluginFactoryTest.java
@@ -110,7 +110,7 @@
 
     @Test
     public void doTPResourcesAllocation_Success() {
-        doReturn(null).when(servicePluginFactory).getTPsfromAAI();
+        doReturn(null).when(servicePluginFactory).getTPsfromAAI("test");
         String result = servicePluginFactory.doTPResourcesAllocation(null, uuiRequest);
         Assert.assertNotEquals(result, uuiRequest);
     }
diff --git a/bpmn/so-bpmn-infrastructure-flows/src/main/resources/process/DeActivateSDNCNetworkResource.bpmn b/bpmn/so-bpmn-infrastructure-flows/src/main/resources/process/DeActivateSDNCNetworkResource.bpmn
index cfcd259..082860d 100644
--- a/bpmn/so-bpmn-infrastructure-flows/src/main/resources/process/DeActivateSDNCNetworkResource.bpmn
+++ b/bpmn/so-bpmn-infrastructure-flows/src/main/resources/process/DeActivateSDNCNetworkResource.bpmn
@@ -1,5 +1,5 @@
 <?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:di="http://www.omg.org/spec/DD/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" id="Definitions_1" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="2.0.0">
+<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:di="http://www.omg.org/spec/DD/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" id="Definitions_1" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="3.1.0">
   <bpmn:process id="DeActivateSDNCNetworkResource" name="DeActivateSDNCNetworkResource" isExecutable="true">
     <bpmn:startEvent id="deleteNetworkResource_StartEvent_deactivate" name="deleteNetworkResource_StartEvent">
       <bpmn:outgoing>SequenceFlow_1qo2pln</bpmn:outgoing>
@@ -14,9 +14,9 @@
 dcsi.prepareSDNCRequest(execution)</bpmn:script>
     </bpmn:scriptTask>
     <bpmn:endEvent id="EndEvent_1x6k78c_deactivate" name="delete SDNC call end">
-      <bpmn:incoming>SequenceFlow_15wux6a</bpmn:incoming>
+      <bpmn:incoming>SequenceFlow_0ow44q0</bpmn:incoming>
     </bpmn:endEvent>
-    <bpmn:sequenceFlow id="SequenceFlow_0ow44q0" sourceRef="Task_023hred_deactivate" targetRef="ScriptTask_1emjxm2_deactivate" />
+    <bpmn:sequenceFlow id="SequenceFlow_0ow44q0" sourceRef="Task_023hred_deactivate" targetRef="EndEvent_1x6k78c_deactivate" />
     <bpmn:scriptTask id="Task_023hred_deactivate" name="post SDNC deactivate call">
       <bpmn:incoming>SequenceFlow_13gl3wv</bpmn:incoming>
       <bpmn:outgoing>SequenceFlow_0ow44q0</bpmn:outgoing>
@@ -39,14 +39,6 @@
 def dcsi = new DeActivateSDNCNetworkResource()
 dcsi.prepareUpdateAfterDeActivateSDNCResource(execution)</bpmn:script>
     </bpmn:scriptTask>
-    <bpmn:scriptTask id="ScriptTask_1emjxm2_deactivate" name="Send Sync Ack Response" scriptFormat="groovy">
-      <bpmn:incoming>SequenceFlow_0ow44q0</bpmn:incoming>
-      <bpmn:outgoing>SequenceFlow_15wux6a</bpmn:outgoing>
-      <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.*
-def csi = new  DeActivateSDNCNetworkResource()
-csi.sendSyncResponse(execution)</bpmn:script>
-    </bpmn:scriptTask>
-    <bpmn:sequenceFlow id="SequenceFlow_15wux6a" sourceRef="ScriptTask_1emjxm2_deactivate" targetRef="EndEvent_1x6k78c_deactivate" />
     <bpmn:sequenceFlow id="SequenceFlow_1fjtgq7" sourceRef="PreprocessIncomingRequest_deactivate" targetRef="Task_0n0lj30_deactivate" />
     <bpmn:callActivity id="Task_0n0lj30_deactivate" name="Call SDNC &#10; Adapter V1" calledElement="SDNCAdapterRestV1">
       <bpmn:incoming>SequenceFlow_1fjtgq7</bpmn:incoming>
@@ -98,85 +90,75 @@
   <bpmndi:BPMNDiagram id="BPMNDiagram_1">
     <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="DeActivateSDNCNetworkResource">
       <bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="deleteNetworkResource_StartEvent_deactivate">
-        <dc:Bounds x="-111" y="111" width="36" height="36" />
+        <dc:Bounds x="180" y="111" width="36" height="36" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="-135" y="147" width="88" height="40" />
+          <dc:Bounds x="156" y="147" width="88" height="40" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_1qo2pln_di" bpmnElement="SequenceFlow_1qo2pln">
-        <di:waypoint x="-75" y="129" />
-        <di:waypoint x="5" y="129" />
+        <di:waypoint x="216" y="129" />
+        <di:waypoint x="296" y="129" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="-87.5" y="108" width="90" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="ScriptTask_03j6ogo_di" bpmnElement="PreprocessIncomingRequest_deactivate">
-        <dc:Bounds x="178" y="89" width="100" height="80" />
+        <dc:Bounds x="469" y="89" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="EndEvent_15pcuuc_di" bpmnElement="EndEvent_1x6k78c_deactivate">
-        <dc:Bounds x="964" y="327" width="36" height="36" />
+        <dc:Bounds x="1255" y="327" width="36" height="36" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="928" y="369" width="84" height="27" />
+          <dc:Bounds x="1219" y="369" width="84" height="27" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_0ow44q0_di" bpmnElement="SequenceFlow_0ow44q0">
-        <di:waypoint x="735" y="345" />
-        <di:waypoint x="795" y="345" />
+        <di:waypoint x="1026" y="345" />
+        <di:waypoint x="1255" y="345" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="719" y="314" width="90" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="ScriptTask_0gyej62_di" bpmnElement="Task_023hred_deactivate">
-        <dc:Bounds x="635" y="305" width="100" height="80" />
+        <dc:Bounds x="926" y="305" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_18l3crb_di" bpmnElement="SequenceFlow_18l3crb">
-        <di:waypoint x="105" y="129" />
-        <di:waypoint x="178" y="129" />
+        <di:waypoint x="396" y="129" />
+        <di:waypoint x="469" y="129" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="235.5" y="108" width="90" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="ScriptTask_14l9mlv_di" bpmnElement="Task_13sx2bp_deactivate">
-        <dc:Bounds x="5" y="89" width="100" height="80" />
+        <dc:Bounds x="296" y="89" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="ScriptTask_1kqf4ge_di" bpmnElement="Task_0tezqd4_deactivate">
-        <dc:Bounds x="333" y="305" width="100" height="80" />
+        <dc:Bounds x="624" y="305" width="100" height="80" />
       </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape id="ScriptTask_1emjxm2_di" bpmnElement="ScriptTask_1emjxm2_deactivate">
-        <dc:Bounds x="795" y="305" width="100" height="80" />
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNEdge id="SequenceFlow_15wux6a_di" bpmnElement="SequenceFlow_15wux6a">
-        <di:waypoint x="895" y="345" />
-        <di:waypoint x="964" y="345" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="930" y="313" width="0" height="14" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_1fjtgq7_di" bpmnElement="SequenceFlow_1fjtgq7">
         <di:waypoint x="278" y="129" />
         <di:waypoint x="333" y="129" />
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_1pzm7qx_di" bpmnElement="SequenceFlow_1pzm7qx">
-        <di:waypoint x="433" y="345" />
-        <di:waypoint x="487" y="345" />
+        <di:waypoint x="724" y="345" />
+        <di:waypoint x="778" y="345" />
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="ServiceTask_0k4fp1d_di" bpmnElement="Task_1a6f0p9_deactivate">
-        <dc:Bounds x="487" y="305" width="100" height="80" />
+        <dc:Bounds x="778" y="305" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_13gl3wv_di" bpmnElement="SequenceFlow_13gl3wv">
-        <di:waypoint x="587" y="345" />
-        <di:waypoint x="635" y="345" />
+        <di:waypoint x="878" y="345" />
+        <di:waypoint x="926" y="345" />
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="CallActivity_0a0txik_di" bpmnElement="CallActivity_0a0txik_DeActivate">
-        <dc:Bounds x="333" y="89" width="100" height="80" />
+        <dc:Bounds x="624" y="89" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_0rn8vky_di" bpmnElement="SequenceFlow_0rn8vky">
-        <di:waypoint x="383" y="169" />
-        <di:waypoint x="383" y="305" />
+        <di:waypoint x="674" y="169" />
+        <di:waypoint x="674" y="305" />
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_0nmt8ph_di" bpmnElement="SequenceFlow_0nmt8ph">
-        <di:waypoint x="278" y="129" />
-        <di:waypoint x="333" y="129" />
+        <di:waypoint x="569" y="129" />
+        <di:waypoint x="624" y="129" />
       </bpmndi:BPMNEdge>
     </bpmndi:BPMNPlane>
   </bpmndi:BPMNDiagram>
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 583e3e1..68cfd48 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
@@ -104,6 +104,14 @@
     @Autowired
     private Environment env;
 
+    /**
+     * This method is used for creating the service instance in A&AI.
+     *
+     * It will check the alaCarte and create the service instance in A&AI.
+     *
+     * @param execution
+     * @throws @return
+     */
     public void createServiceInstance(BuildingBlockExecution execution) {
         try {
             ServiceInstance serviceInstance =
@@ -115,6 +123,12 @@
         }
     }
 
+    /**
+     * This method is used for creating and subscribing the service in A&AI.
+     *
+     * @param execution
+     * @throws @return
+     */
     public void createServiceSubscription(BuildingBlockExecution execution) {
         try {
             ServiceInstance serviceInstance =
@@ -136,6 +150,12 @@
         }
     }
 
+    /**
+     * This method is used for creation of the project A&AI.
+     *
+     * @param execution
+     * @throws @return
+     */
     public void createProject(BuildingBlockExecution execution) {
         try {
             ServiceInstance serviceInstance =
@@ -153,6 +173,12 @@
         }
     }
 
+    /**
+     * This method is used for creating OwningEntity A&AI.
+     *
+     * @param execution
+     * @throws @return
+     */
     public void createOwningEntity(BuildingBlockExecution execution) {
         try {
             ServiceInstance serviceInstance =
@@ -192,6 +218,16 @@
         }
     }
 
+    /**
+     * This method is used for creating Vnf in A&AI.
+     *
+     * It will check if the Vnf Name is exits in A&AI then it will throw the duplicate name exception.
+     *
+     * Otherwise it will create the vnf amd connect to the serviceinstance.
+     *
+     * @param execution
+     * @throws @return
+     */
     public void createVnf(BuildingBlockExecution execution) {
         try {
             GenericVnf vnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID);
@@ -204,6 +240,12 @@
         }
     }
 
+    /**
+     * This method is used for separating (,) from the string.
+     *
+     * @param str
+     * @throws @return
+     */
     public void createPlatform(BuildingBlockExecution execution) {
         try {
             GenericVnf vnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID);
@@ -223,10 +265,22 @@
 
     }
 
+    /**
+     * This method is used for separating (,) from the string.
+     *
+     * @param str
+     * @throws @return
+     */
     public List<String> splitCDL(String str) {
         return Stream.of(str.split(",")).map(String::trim).map(elem -> new String(elem)).collect(Collectors.toList());
     }
 
+    /**
+     * This method is used for creating the type of business in A&AI.
+     *
+     * @param execution
+     * @throws @return
+     */
     public void createLineOfBusiness(BuildingBlockExecution execution) {
         try {
             GenericVnf vnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID);
@@ -246,6 +300,12 @@
         }
     }
 
+    /**
+     * This method is used for creating the volume group in A&AI.
+     *
+     * @param execution
+     * @throws @return
+     */
     public void createVolumeGroup(BuildingBlockExecution execution) {
         try {
             GeneralBuildingBlock gBBInput = execution.getGeneralBuildingBlock();
@@ -261,6 +321,12 @@
         }
     }
 
+    /**
+     * This method is used for creating the vfModule in A&AI.
+     *
+     * @param execution
+     * @throws @return
+     */
     public void createVfModule(BuildingBlockExecution execution) {
         try {
             GenericVnf vnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID);
@@ -279,7 +345,7 @@
 
     /**
      * BPMN access method to establish relationships in AAI
-     * 
+     *
      * @param execution
      * @throws Exception
      */
@@ -304,7 +370,7 @@
 
     /**
      * BPMN access method to execute Create L3Network operation (PUT )in AAI
-     * 
+     *
      * @param execution
      * @throws Exception
      */
@@ -325,6 +391,12 @@
         }
     }
 
+    /**
+     * This method is used for creating the customer in A&AI.
+     *
+     * @param execution
+     * @throws Exception
+     */
     public void createCustomer(BuildingBlockExecution execution) throws Exception {
         try {
             Customer customer = execution.getGeneralBuildingBlock().getCustomer();
@@ -337,7 +409,7 @@
 
     /**
      * BPMN access method to execute NetworkCollection operation (PUT) in AAI
-     * 
+     *
      * @param execution
      * @throws Exception
      */
@@ -357,7 +429,7 @@
 
     /**
      * BPMN access method to execute NetworkCollectionInstanceGroup operation (PUT) in AAI
-     * 
+     *
      * @param execution
      * @throws Exception
      */
@@ -378,7 +450,7 @@
 
     /**
      * BPMN access method to establish relationships in AAI
-     * 
+     *
      * @param execution
      * @throws Exception
      */
@@ -393,7 +465,7 @@
 
     /**
      * BPMN access method to establish relationships in AAI
-     * 
+     *
      * @param execution
      * @throws Exception
      */
@@ -409,7 +481,7 @@
 
     /**
      * BPMN access method to establish relationships in AAI
-     * 
+     *
      * @param execution
      * @throws Exception
      */
@@ -432,7 +504,7 @@
 
     /**
      * BPMN access method to establish relationships in AAI
-     * 
+     *
      * @param execution
      * @throws Exception
      */
@@ -447,7 +519,7 @@
 
     /**
      * BPMN access method to establish relationships in AAI
-     * 
+     *
      * @param execution
      * @throws Exception
      */
@@ -464,7 +536,7 @@
 
     /**
      * BPMN access method to establish relationships in AAI
-     * 
+     *
      * @param execution
      * @throws Exception
      */
@@ -482,6 +554,11 @@
         }
     }
 
+    /**
+     * This method is used for configuring the service in A&AI.
+     *
+     * @param execution @throws
+     */
     public void createConfiguration(BuildingBlockExecution execution) {
         try {
             Configuration configuration = extractPojosForBB.extractByKey(execution, ResourceKey.CONFIGURATION_ID);
@@ -491,6 +568,11 @@
         }
     }
 
+    /**
+     * This method is used for creating vnf instance group in A&AI.
+     *
+     * @param execution @throws
+     */
     public void createInstanceGroupVnf(BuildingBlockExecution execution) {
         try {
             ServiceInstance serviceInstance =
@@ -502,6 +584,11 @@
         }
     }
 
+    /**
+     * This method is used to put the network policy in A&AI.
+     *
+     * @param execution @throws
+     */
     public void createNetworkPolicies(BuildingBlockExecution execution) {
         try {
             String fqdns = execution.getVariable(CONTRAIL_NETWORK_POLICY_FQDN_LIST);
@@ -536,10 +623,10 @@
 
     /**
      * Groups existing vf modules by the model uuid of our new vf module and returns the lowest unused index
-     * 
+     *
      * if we have a module type A, and there are 3 instances of those, and then module type B has 2 instances, if we are
      * adding a new module type A, the vf-module-index should be 3 assuming contiguous indices (not 5, or 2)
-     * 
+     *
      */
     protected int getLowestUnusedVfModuleIndexFromAAIVnfResponse(GenericVnf genericVnf, VfModule newVfModule) {
 
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 01bdc09..20f4443 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
@@ -79,6 +79,11 @@
     @Autowired
     private AAIConfigurationResources aaiConfigurationResources;
 
+    /**
+     * BPMN access method to update the status of Service to Assigned in AAI
+     *
+     * @param execution
+     */
     public void updateOrchestrationStatusAssignedService(BuildingBlockExecution execution) {
         try {
             ServiceInstance serviceInstance =
@@ -91,6 +96,11 @@
         }
     }
 
+    /**
+     * BPMN access method to update status of Service to Active in AAI
+     *
+     * @param execution
+     */
     public void updateOrchestrationStatusActiveService(BuildingBlockExecution execution) {
         try {
             ServiceInstance serviceInstance =
@@ -102,6 +112,11 @@
         }
     }
 
+    /**
+     * BPMN access method to update status of Vnf to Assigned in AAI
+     *
+     * @param execution
+     */
     public void updateOrchestrationStatusAssignedVnf(BuildingBlockExecution execution) {
         try {
             GenericVnf vnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID);
@@ -111,6 +126,11 @@
         }
     }
 
+    /**
+     * BPMN access method to update status of Vnf to Active in AAI
+     *
+     * @param execution
+     */
     public void updateOrchestrationStatusActiveVnf(BuildingBlockExecution execution) {
         try {
             GenericVnf vnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID);
@@ -120,6 +140,11 @@
         }
     }
 
+    /**
+     * BPMN access method to update status of VolumeGroup to Assigned in AAI
+     *
+     * @param execution
+     */
     public void updateOrchestrationStatusAssignedVolumeGroup(BuildingBlockExecution execution) {
         try {
             GeneralBuildingBlock gBBInput = execution.getGeneralBuildingBlock();
@@ -134,6 +159,11 @@
         }
     }
 
+    /**
+     * BPMN access method to update status of VolumeGroup to Active in AAI
+     *
+     * @param execution
+     */
     public void updateOrchestrationStatusActiveVolumeGroup(BuildingBlockExecution execution) {
         try {
             GeneralBuildingBlock gBBInput = execution.getGeneralBuildingBlock();
@@ -148,6 +178,11 @@
         }
     }
 
+    /**
+     * BPMN access method to update status of VolumeGroup to Created in AAI
+     *
+     * @param execution
+     */
     public void updateOrchestrationStatusCreatedVolumeGroup(BuildingBlockExecution execution) {
         try {
             GeneralBuildingBlock gBBInput = execution.getGeneralBuildingBlock();
@@ -162,6 +197,11 @@
         }
     }
 
+    /**
+     * BPMN access method to update HeatStackId and VolumeGroup in AAI
+     *
+     * @param execution
+     */
     public void updateHeatStackIdVolumeGroup(BuildingBlockExecution execution) {
         try {
             GeneralBuildingBlock gBBInput = execution.getGeneralBuildingBlock();
@@ -179,6 +219,11 @@
         }
     }
 
+    /**
+     * BPMN access method to update status of VfModule to Assigned in AAI
+     *
+     * @param execution
+     */
     public void updateOrchestrationStatusAssignedVfModule(BuildingBlockExecution execution) {
         try {
             VfModule vfModule = extractPojosForBB.extractByKey(execution, ResourceKey.VF_MODULE_ID);
@@ -190,6 +235,11 @@
         }
     }
 
+    /**
+     * BPMN access method to update status of VfModule to PendingActivation in AAI
+     *
+     * @param execution
+     */
     public void updateOrchestrationStatusPendingActivationVfModule(BuildingBlockExecution execution) {
         try {
             VfModule vfModule = extractPojosForBB.extractByKey(execution, ResourceKey.VF_MODULE_ID);
@@ -201,6 +251,11 @@
         }
     }
 
+    /**
+     * BPMN access method to update status of VfModule to AssignedOrPendingActivation in AAI
+     *
+     * @param execution
+     */
     public void updateOrchestrationStatusAssignedOrPendingActivationVfModule(BuildingBlockExecution execution) {
         try {
             VfModule vfModule = extractPojosForBB.extractByKey(execution, ResourceKey.VF_MODULE_ID);
@@ -222,6 +277,12 @@
         }
     }
 
+    /**
+     * BPMN access method to update status of VfModule to Created in AAI
+     *
+     * @param execution
+     * 
+     */
     public void updateOrchestrationStatusCreatedVfModule(BuildingBlockExecution execution) {
         try {
             VfModule vfModule = extractPojosForBB.extractByKey(execution, ResourceKey.VF_MODULE_ID);
@@ -232,6 +293,12 @@
         }
     }
 
+    /**
+     * BPMN access method to update aaiDeactivateVfModuleRollback to true for deactivating the VfModule
+     *
+     * @param execution
+     * @throws buildAndThrowWorkflowException
+     */
     public void updateOrchestrationStatusDeactivateVfModule(BuildingBlockExecution execution) {
         execution.setVariable("aaiDeactivateVfModuleRollback", false);
         try {
@@ -246,7 +313,7 @@
 
     /**
      * BPMN access method to update status of L3Network to Assigned in AAI
-     * 
+     *
      * @param execution
      * @throws BBObjectNotFoundException
      */
@@ -256,7 +323,7 @@
 
     /**
      * BPMN access method to update status of L3Network to Active in AAI
-     * 
+     *
      * @param execution
      * @throws BBObjectNotFoundException
      */
@@ -266,7 +333,7 @@
 
     /**
      * BPMN access method to update status of L3Network to Created in AAI
-     * 
+     *
      * @param execution
      * @throws BBObjectNotFoundException
      */
@@ -302,7 +369,7 @@
 
     /**
      * BPMN access method to update status of L3Network Collection to Active in AAI
-     * 
+     *
      * @param execution
      * @throws BBObjectNotFoundException
      */
@@ -323,6 +390,11 @@
         }
     }
 
+    /**
+     * BPMN access method to update status of VfModule to Active in AAI
+     *
+     * @param execution
+     */
     public void updateOrchestrationStatusActivateVfModule(BuildingBlockExecution execution) {
         execution.setVariable("aaiActivateVfModuleRollback", false);
         try {
@@ -335,6 +407,11 @@
         }
     }
 
+    /**
+     * BPMN access method to update HeatStackId of VfModule in AAI
+     *
+     * @param execution
+     */
     public void updateHeatStackIdVfModule(BuildingBlockExecution execution) {
         try {
             String heatStackId = execution.getVariable("heatStackId");
@@ -352,7 +429,7 @@
 
     /**
      * BPMN access method to update L3Network after it was created in cloud
-     * 
+     *
      * @param execution
      * @throws Exception
      */
@@ -395,7 +472,7 @@
 
     /**
      * BPMN access method to update L3Network after it was updated in cloud
-     * 
+     *
      * @param execution
      * @throws Exception
      */
@@ -422,6 +499,11 @@
         }
     }
 
+    /**
+     * BPMN access method to update L3Network Object
+     *
+     * @param execution
+     */
     public void updateObjectNetwork(BuildingBlockExecution execution) {
         try {
             L3Network l3network = extractPojosForBB.extractByKey(execution, ResourceKey.NETWORK_ID);
@@ -433,7 +515,7 @@
 
     /**
      * BPMN access method to update ServiceInstance
-     * 
+     *
      * @param execution
      */
     public void updateServiceInstance(BuildingBlockExecution execution) {
@@ -446,6 +528,11 @@
         }
     }
 
+    /**
+     * BPMN access method to update Vnf Object
+     *
+     * @param execution
+     */
     public void updateObjectVnf(BuildingBlockExecution execution) {
         try {
             GenericVnf genericVnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID);
@@ -455,6 +542,11 @@
         }
     }
 
+    /**
+     * BPMN access method to update status of VfModuleRollback as true
+     *
+     * @param execution
+     */
     public void updateOrchestrationStatusDeleteVfModule(BuildingBlockExecution execution) {
         execution.setVariable("aaiDeleteVfModuleRollback", false);
         try {
@@ -471,6 +563,11 @@
         }
     }
 
+    /**
+     * BPMN access method to update Model of VfModule
+     *
+     * @param execution
+     */
     public void updateModelVfModule(BuildingBlockExecution execution) {
         try {
             VfModule vfModule = extractPojosForBB.extractByKey(execution, ResourceKey.VF_MODULE_ID);
@@ -481,6 +578,11 @@
         }
     }
 
+    /**
+     * BPMN access method to update status of FabricConfiguration to Assigned in AAI
+     *
+     * @param execution
+     */
     public void updateOrchestrationStatusAssignFabricConfiguration(BuildingBlockExecution execution) {
         try {
             Configuration configuration = extractPojosForBB.extractByKey(execution, ResourceKey.CONFIGURATION_ID);
@@ -491,6 +593,11 @@
         }
     }
 
+    /**
+     * BPMN access method to update status of FabricConfiguration to Active in AAI
+     *
+     * @param execution
+     */
     public void updateOrchestrationStatusActivateFabricConfiguration(BuildingBlockExecution execution) {
         try {
             Configuration configuration = extractPojosForBB.extractByKey(execution, ResourceKey.CONFIGURATION_ID);
@@ -500,6 +607,11 @@
         }
     }
 
+    /**
+     * BPMN access method to update status of FabricConfiguration to deactive in AAI
+     *
+     * @param execution
+     */
     public void updateOrchestrationStatusDeactivateFabricConfiguration(BuildingBlockExecution execution) {
         try {
             Configuration configuration = extractPojosForBB.extractByKey(execution, ResourceKey.CONFIGURATION_ID);
@@ -510,6 +622,11 @@
         }
     }
 
+    /**
+     * BPMN access method to update Ipv4OamAddress of Vnf
+     *
+     * @param execution
+     */
     public void updateIpv4OamAddressVnf(BuildingBlockExecution execution) {
         try {
             String ipv4OamAddress = execution.getVariable("oamManagementV4Address");
@@ -527,6 +644,11 @@
         }
     }
 
+    /**
+     * BPMN access method to update ManagementV6Address of Vnf
+     *
+     * @param execution
+     */
     public void updateManagementV6AddressVnf(BuildingBlockExecution execution) {
         try {
             String managementV6Address = execution.getVariable("oamManagementV6Address");
@@ -544,6 +666,11 @@
         }
     }
 
+    /**
+     * BPMN access method to update ContrailServiceInstanceFqdn of VfModule
+     *
+     * @param execution
+     */
     public void updateContrailServiceInstanceFqdnVfModule(BuildingBlockExecution execution) {
         try {
             String contrailServiceInstanceFqdn = execution.getVariable("contrailServiceInstanceFqdn");
@@ -558,6 +685,11 @@
         }
     }
 
+    /**
+     * BPMN access method to update status of Vnf to ConfigAssigned in AAI
+     *
+     * @param execution
+     */
     public void updateOrchestrationStatusConfigAssignedVnf(BuildingBlockExecution execution) {
         try {
             GenericVnf vnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID);
@@ -567,6 +699,11 @@
         }
     }
 
+    /**
+     * BPMN access method to update status of Vnf to Configure in AAI
+     *
+     * @param execution
+     */
     public void updateOrchestrationStausConfigDeployConfigureVnf(BuildingBlockExecution execution) {
         try {
             GenericVnf vnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID);
@@ -578,6 +715,11 @@
 
     }
 
+    /**
+     * BPMN access method to update status of Vnf to configured in AAI
+     *
+     * @param execution
+     */
     public void updateOrchestrationStausConfigDeployConfiguredVnf(BuildingBlockExecution execution) {
         try {
             GenericVnf vnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID);
diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/activity/ExecuteActivity.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/activity/ExecuteActivity.java
index 775e321..638ecef 100644
--- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/activity/ExecuteActivity.java
+++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/activity/ExecuteActivity.java
@@ -22,6 +22,7 @@
 
 package org.onap.so.bpmn.infrastructure.activity;
 
+import java.io.Serializable;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.UUID;
@@ -99,6 +100,12 @@
             variables.put("retryCount", 1);
             variables.put("aLaCarte", true);
 
+            execution.getVariables().forEach((key, value) -> {
+                if (value instanceof Serializable) {
+                    variables.put(key, (Serializable) value);
+                }
+            });
+
             ProcessInstanceWithVariables buildingBlockResult =
                     runtimeService.createProcessInstanceByKey("ExecuteBuildingBlock").setVariables(variables)
                             .executeWithVariablesInReturn();
diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/vnfm/tasks/Constants.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/vnfm/tasks/Constants.java
index 4cf5131..c112d20 100644
--- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/vnfm/tasks/Constants.java
+++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/vnfm/tasks/Constants.java
@@ -45,7 +45,7 @@
     public static final String UNDERSCORE = "_";
     public static final String SPACE = "\\s+";
 
-    public static final String VNFM_ADAPTER_DEFAULT_URL = "http://so-vnfm-adapter.onap:9092/so/vnfm-adapter/v1/";
+    public static final String VNFM_ADAPTER_DEFAULT_URL = "https://so-vnfm-adapter.onap:9092/so/vnfm-adapter/v1/";
     public static final String VNFM_ADAPTER_DEFAULT_AUTH = "Basic dm5mbTpwYXNzd29yZDEk";
 
     public static final String FORWARD_SLASH = "/";
diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/manualhandling/tasks/ManualHandlingTasks.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/manualhandling/tasks/ManualHandlingTasks.java
index 17089be..7e45c3b 100644
--- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/manualhandling/tasks/ManualHandlingTasks.java
+++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/manualhandling/tasks/ManualHandlingTasks.java
@@ -27,6 +27,7 @@
 import org.camunda.bpm.engine.delegate.BpmnError;
 import org.camunda.bpm.engine.delegate.DelegateTask;
 import org.camunda.bpm.engine.delegate.DelegateExecution;
+import org.onap.so.bpmn.common.BuildingBlockExecution;
 import org.onap.so.client.exception.ExceptionBuilder;
 import org.onap.so.client.ticket.ExternalTicket;
 import org.onap.so.db.request.beans.InfraActiveRequests;
@@ -46,7 +47,7 @@
     private static final String TASK_TYPE_FALLOUT = "fallout";
     public static final String VNF_TYPE = "vnfType";
     public static final String SERVICE_TYPE = "serviceType";
-    public static final String MSO_REQUEST_ID = "msoRequestId";
+    public static final String MSO_REQUEST_ID = "mso-request-id";
     public static final String REQUESTOR_ID = "requestorId";
     public static final String ERROR_CODE = "errorCode";
     public static final String VALID_RESPONSES = "validResponses";
@@ -120,7 +121,7 @@
             String originalRequestId = (String) execution.getVariable(MSO_REQUEST_ID);
             String originalRequestorId = (String) execution.getVariable(REQUESTOR_ID);
             String description = (String) execution.getVariable(DESCRIPTION);
-            String timeout = (String) execution.getVariable("taskTimeout");
+            String timeout = "";
             String errorSource = "";
             String errorCode = "";
             String errorMessage = "";
@@ -188,7 +189,7 @@
 
     }
 
-    public void createExternalTicket(DelegateExecution execution) {
+    public void createExternalTicket(BuildingBlockExecution execution) {
 
         try {
             ExternalTicket ticket = new ExternalTicket();
@@ -218,7 +219,7 @@
 
     }
 
-    public void updateRequestDbStatus(DelegateExecution execution, String status) {
+    public void updateRequestDbStatus(BuildingBlockExecution execution, String status) {
         try {
             String requestId = (String) execution.getVariable(MSO_REQUEST_ID);
             InfraActiveRequests request = requestDbclient.getInfraActiveRequestbyRequestId(requestId);
diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/OrchestrationStatusValidator.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/OrchestrationStatusValidator.java
index 4fcacb3..7eaf011 100644
--- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/OrchestrationStatusValidator.java
+++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/OrchestrationStatusValidator.java
@@ -63,6 +63,11 @@
     @Autowired
     private CatalogDbClient catalogDbClient;
 
+    /**
+     * This method validate's the status of the OrchestrationStatus against the buildingBlockDetail ResourceType
+     *
+     * @param execution
+     */
     public void validateOrchestrationStatus(BuildingBlockExecution execution) {
         try {
             OrchestrationStatusValidationDirective previousOrchestrationStatusValidationResult =
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 89030d5..78cb533 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
@@ -36,9 +36,11 @@
 import org.camunda.bpm.engine.delegate.DelegateExecution;
 import org.javatuples.Pair;
 import org.onap.aai.domain.yang.GenericVnf;
+import org.onap.aai.domain.yang.GenericVnfs;
 import org.onap.aai.domain.yang.L3Network;
 import org.onap.aai.domain.yang.Relationship;
 import org.onap.aai.domain.yang.ServiceInstance;
+import org.onap.aai.domain.yang.ServiceInstances;
 import org.onap.aai.domain.yang.Vnfc;
 import org.onap.aai.domain.yang.VolumeGroup;
 import org.onap.aai.domain.yang.VpnBinding;
@@ -51,6 +53,7 @@
 import org.onap.so.bpmn.servicedecomposition.entities.WorkflowResourceIds;
 import org.onap.so.bpmn.servicedecomposition.tasks.BBInputSetup;
 import org.onap.so.bpmn.servicedecomposition.tasks.BBInputSetupUtils;
+import org.onap.so.bpmn.servicedecomposition.tasks.exceptions.DuplicateNameException;
 import org.onap.so.client.aai.AAICommonObjectMapperProvider;
 import org.onap.so.client.aai.AAIObjectType;
 import org.onap.so.client.aai.entities.AAIResultWrapper;
@@ -112,6 +115,14 @@
     private static final String SERVICE_TYPE_BONDING = "BONDING";
     private static final String CLOUD_OWNER = "DEFAULT";
     private static final Logger logger = LoggerFactory.getLogger(WorkflowAction.class);
+    private static final String NAME_EXISTS_WITH_DIFF_VERSION_ID = "(%s) and different version id (%s)";
+    private static final String NAME_EXISTS_MULTIPLE =
+            "(%s) and multiple combination of model-version-id + service-type + global-customer-id";
+    private static final String NAME_EXISTS_WITH_DIFF_COMBINATION =
+            "(%s) and global-customer-id (%s), service-type (%s), model-version-id (%s)";
+    private static final String NAME_EXISTS_WITH_DIFF_CUSTOMIZATION_ID =
+            "(%s), same parent and different customization id (%s)";
+    private static final String NAME_EXISTS_WITH_DIFF_PARENT = "(%s) id (%s) and different parent relationship";
 
     @Autowired
     protected BBInputSetup bbInputSetup;
@@ -149,6 +160,7 @@
         String uri = (String) execution.getVariable(BBConstants.G_URI);
         final String vnfType = (String) execution.getVariable(VNF_TYPE);
         String serviceInstanceId = (String) execution.getVariable("serviceInstanceId");
+        final String createInstanceAction = "createInstance";
         final String serviceType =
                 Optional.ofNullable((String) execution.getVariable(BBConstants.G_SERVICE_TYPE)).orElse("");
 
@@ -189,7 +201,8 @@
             WorkflowType resourceType = resource.getResourceType();
             execution.setVariable("resourceName", resourceType.toString());
             String resourceId = "";
-            if (resource.isGenerated()) {
+            if (resource.isGenerated() && requestAction.equalsIgnoreCase(createInstanceAction)
+                    && sIRequest.getRequestDetails().getRequestInfo().getInstanceName() != null) {
                 resourceId = validateResourceIdInAAI(resource.getResourceId(), resourceType,
                         sIRequest.getRequestDetails().getRequestInfo().getInstanceName(), sIRequest.getRequestDetails(),
                         workflowResourceIds);
@@ -1134,55 +1147,146 @@
             RequestDetails reqDetails, WorkflowResourceIds workflowResourceIds) throws Exception {
         try {
             if ("SERVICE".equalsIgnoreCase(type.toString())) {
+                // Service name verification based upon name + model-version-id
+                // + service-type + global-customer-id per requirements
                 String globalCustomerId = reqDetails.getSubscriberInfo().getGlobalSubscriberId();
                 String serviceType = reqDetails.getRequestParameters().getSubscriptionServiceType();
                 if (instanceName != null) {
                     Optional<ServiceInstance> serviceInstanceAAI =
                             bbInputSetupUtils.getAAIServiceInstanceByName(globalCustomerId, serviceType, instanceName);
                     if (serviceInstanceAAI.isPresent()) {
-                        return serviceInstanceAAI.get().getServiceInstanceId();
+                        if (serviceInstanceAAI.get().getModelVersionId()
+                                .equalsIgnoreCase(reqDetails.getModelInfo().getModelVersionId())) {
+                            return serviceInstanceAAI.get().getServiceInstanceId();
+                        } else {
+                            throw new DuplicateNameException("serviceInstance",
+                                    String.format(NAME_EXISTS_WITH_DIFF_VERSION_ID, instanceName,
+                                            reqDetails.getModelInfo().getModelVersionId()));
+                        }
+                    } else {
+                        ServiceInstances aaiServiceInstances =
+                                bbInputSetupUtils.getAAIServiceInstancesGloballyByName(instanceName);
+                        if (aaiServiceInstances != null) {
+                            if (aaiServiceInstances.getServiceInstance() != null
+                                    && !aaiServiceInstances.getServiceInstance().isEmpty()) {
+                                if (aaiServiceInstances.getServiceInstance().size() > 1) {
+                                    throw new DuplicateNameException("serviceInstance",
+                                            String.format(NAME_EXISTS_MULTIPLE, instanceName));
+                                } else {
+                                    ServiceInstance si =
+                                            aaiServiceInstances.getServiceInstance().stream().findFirst().get();
+                                    Map<String, String> keys =
+                                            bbInputSetupUtils.getURIKeysFromServiceInstance(si.getServiceInstanceId());
+
+                                    throw new DuplicateNameException("serviceInstance",
+                                            String.format(NAME_EXISTS_WITH_DIFF_COMBINATION, instanceName,
+                                                    keys.get("global-customer-id"), keys.get("service-type"),
+                                                    si.getModelVersionId()));
+                                }
+                            }
+                        }
                     }
                 }
             } else if ("NETWORK".equalsIgnoreCase(type.toString())) {
                 Optional<L3Network> network = bbInputSetupUtils.getRelatedNetworkByNameFromServiceInstance(
                         workflowResourceIds.getServiceInstanceId(), instanceName);
                 if (network.isPresent()) {
-                    return network.get().getNetworkId();
+                    if (network.get().getModelCustomizationId()
+                            .equalsIgnoreCase(reqDetails.getModelInfo().getModelCustomizationId())) {
+                        return network.get().getNetworkId();
+                    } else {
+                        throw new DuplicateNameException("l3Network",
+                                String.format(NAME_EXISTS_WITH_DIFF_CUSTOMIZATION_ID, instanceName,
+                                        network.get().getModelCustomizationId()));
+                    }
                 }
+
+                if (bbInputSetupUtils.existsAAINetworksGloballyByName(instanceName)) {
+                    throw new DuplicateNameException("l3Network", String.format(NAME_EXISTS_WITH_DIFF_PARENT,
+                            instanceName, workflowResourceIds.getServiceInstanceId()));
+                }
+
             } else if ("VNF".equalsIgnoreCase(type.toString())) {
                 Optional<GenericVnf> vnf = bbInputSetupUtils.getRelatedVnfByNameFromServiceInstance(
                         workflowResourceIds.getServiceInstanceId(), instanceName);
                 if (vnf.isPresent()) {
-                    return vnf.get().getVnfId();
+                    if (vnf.get().getModelCustomizationId()
+                            .equalsIgnoreCase(reqDetails.getModelInfo().getModelCustomizationId())) {
+                        return vnf.get().getVnfId();
+                    } else {
+                        throw new DuplicateNameException("generic-vnf",
+                                String.format(NAME_EXISTS_WITH_DIFF_CUSTOMIZATION_ID, instanceName,
+                                        vnf.get().getModelCustomizationId()));
+                    }
+                }
+                GenericVnfs vnfs = bbInputSetupUtils.getAAIVnfsGloballyByName(instanceName);
+                if (vnfs != null) {
+                    throw new DuplicateNameException("generic-vnf", String.format(NAME_EXISTS_WITH_DIFF_PARENT,
+                            instanceName, vnfs.getGenericVnf().get(0).getVnfId()));
                 }
             } else if ("VFMODULE".equalsIgnoreCase(type.toString())) {
                 GenericVnf vnf = bbInputSetupUtils.getAAIGenericVnf(workflowResourceIds.getVnfId());
                 if (vnf != null && vnf.getVfModules() != null) {
                     for (org.onap.aai.domain.yang.VfModule vfModule : vnf.getVfModules().getVfModule()) {
                         if (vfModule.getVfModuleName().equalsIgnoreCase(instanceName)) {
-                            return vfModule.getVfModuleId();
+                            if (vfModule.getModelCustomizationId()
+                                    .equalsIgnoreCase(reqDetails.getModelInfo().getModelCustomizationId())) {
+                                return vfModule.getVfModuleId();
+                            } else {
+                                throw new DuplicateNameException("vfModule",
+                                        String.format(NAME_EXISTS_WITH_DIFF_CUSTOMIZATION_ID, instanceName,
+                                                reqDetails.getModelInfo().getModelCustomizationId()));
+                            }
                         }
                     }
                 }
             } else if ("VOLUMEGROUP".equalsIgnoreCase(type.toString())) {
+                GenericVnf vnf = bbInputSetupUtils.getAAIGenericVnf(workflowResourceIds.getVnfId());
                 Optional<VolumeGroup> volumeGroup = bbInputSetupUtils
                         .getRelatedVolumeGroupByNameFromVnf(workflowResourceIds.getVnfId(), instanceName);
                 if (volumeGroup.isPresent()) {
-                    return volumeGroup.get().getVolumeGroupId();
+                    if (vnf.getModelCustomizationId()
+                            .equalsIgnoreCase(reqDetails.getModelInfo().getModelCustomizationId())) {
+                        return volumeGroup.get().getVolumeGroupId();
+                    } else {
+                        throw new DuplicateNameException("volumeGroup", volumeGroup.get().getVolumeGroupName());
+                    }
                 }
-                GenericVnf vnf = bbInputSetupUtils.getAAIGenericVnf(workflowResourceIds.getVnfId());
                 if (vnf != null && vnf.getVfModules() != null) {
                     for (org.onap.aai.domain.yang.VfModule vfModule : vnf.getVfModules().getVfModule()) {
                         Optional<VolumeGroup> volumeGroupFromVfModule =
                                 bbInputSetupUtils.getRelatedVolumeGroupByNameFromVfModule(vnf.getVnfId(),
                                         vfModule.getVfModuleId(), instanceName);
                         if (volumeGroupFromVfModule.isPresent()) {
-                            return volumeGroupFromVfModule.get().getVolumeGroupId();
+                            if (vnf.getModelCustomizationId()
+                                    .equalsIgnoreCase(reqDetails.getModelInfo().getModelCustomizationId())) {
+                                return volumeGroupFromVfModule.get().getVolumeGroupId();
+                            } else {
+                                throw new DuplicateNameException("volumeGroup",
+                                        String.format(NAME_EXISTS_WITH_DIFF_CUSTOMIZATION_ID, instanceName,
+                                                volumeGroupFromVfModule.get().getModelCustomizationId()));
+                            }
                         }
                     }
                 }
+            } else if ("CONFIGURATION".equalsIgnoreCase(type.toString())) {
+                Optional<org.onap.aai.domain.yang.Configuration> configuration =
+                        bbInputSetupUtils.getRelatedConfigurationByNameFromServiceInstance(
+                                workflowResourceIds.getServiceInstanceId(), instanceName);
+                if (configuration.isPresent()) {
+                    if (configuration.get().getModelCustomizationId()
+                            .equalsIgnoreCase(reqDetails.getModelInfo().getModelCustomizationId())) {
+                        return configuration.get().getConfigurationId();
+                    } else {
+                        throw new DuplicateNameException("configuration",
+                                String.format(NAME_EXISTS_WITH_DIFF_CUSTOMIZATION_ID, instanceName,
+                                        configuration.get().getConfigurationId()));
+                    }
+                }
             }
             return generatedResourceId;
+        } catch (DuplicateNameException dne) {
+            throw dne;
         } catch (Exception ex) {
             logger.error(WORKFLOW_ACTION_WAS_UNABLE_TO_VERIFY_IF_THE_INSTANCE_NAME_ALREADY_EXIST_IN_AAI, ex);
             throw new IllegalStateException(
diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/listeners/MultiStageSkipListener.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/listeners/MultiStageSkipListener.java
index 376a27e..4cde9c1 100644
--- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/listeners/MultiStageSkipListener.java
+++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/listeners/MultiStageSkipListener.java
@@ -22,6 +22,7 @@
 
 import java.util.Collections;
 import java.util.List;
+import java.util.Optional;
 import org.onap.so.bpmn.common.BBConstants;
 import org.onap.so.bpmn.common.BuildingBlockExecution;
 import org.onap.so.bpmn.common.listener.db.PostCompletionRequestsDbListener;
@@ -55,7 +56,7 @@
     @Override
     public boolean shouldRunFor(BuildingBlockExecution execution) {
 
-        return (boolean) execution.getVariable(G_MULTI_STAGE_DESIGN);
+        return (boolean) Optional.ofNullable(execution.getVariable(G_MULTI_STAGE_DESIGN)).orElse(false);
     }
 
     @Override
diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/VnfAdapterVfModuleResources.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/VnfAdapterVfModuleResources.java
index 0a825b8..62d6a11 100644
--- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/VnfAdapterVfModuleResources.java
+++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/VnfAdapterVfModuleResources.java
@@ -39,12 +39,33 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+/**
+ * This class is used for creating and deleting the request for VfModule.
+ *
+ */
 @Component
 public class VnfAdapterVfModuleResources {
 
     @Autowired
     private VnfAdapterVfModuleObjectMapper vnfAdapterVfModuleObjectMapper;
 
+    /**
+     * This method is used for creating the request for the VfModule.
+     *
+     * This method take these parameter and call the VnfAdapterVfModuleObjectMapper to create the request.
+     *
+     * @param requestContext
+     * @param cloudRegion
+     * @param orchestrationContext
+     * @param serviceInstance
+     * @param genericVnf
+     * @param vfModule
+     * @param volumeGroup
+     * @param sdncVnfQueryResponse
+     * @param sdncVfModuleQueryResponse
+     * @throws IOException & MissingValueTagException
+     * @return
+     */
     public CreateVfModuleRequest createVfModuleRequest(RequestContext requestContext, CloudRegion cloudRegion,
             OrchestrationContext orchestrationContext, ServiceInstance serviceInstance, GenericVnf genericVnf,
             VfModule vfModule, VolumeGroup volumeGroup, String sdncVnfQueryResponse, String sdncVfModuleQueryResponse)
@@ -54,6 +75,19 @@
                 sdncVfModuleQueryResponse);
     }
 
+    /**
+     * This method is used for delete the request for the VfModule.
+     *
+     * This method take these parameter and call the VnfAdapterVfModuleObjectMapper to delete the request.
+     *
+     * @param requestContext
+     * @param cloudRegion
+     * @param serviceInstance
+     * @param genericVnf
+     * @param vfModule
+     * @throws IOException
+     * @return
+     */
     public DeleteVfModuleRequest deleteVfModuleRequest(RequestContext requestContext, CloudRegion cloudRegion,
             ServiceInstance serviceInstance, GenericVnf genericVnf, VfModule vfModule) throws IOException {
         return vnfAdapterVfModuleObjectMapper.deleteVfModuleRequestMapper(requestContext, cloudRegion, serviceInstance,
diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sdnc/mapper/VnfTopologyOperationRequestMapper.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sdnc/mapper/VnfTopologyOperationRequestMapper.java
index bef4ec3..fd0af3a 100644
--- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sdnc/mapper/VnfTopologyOperationRequestMapper.java
+++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sdnc/mapper/VnfTopologyOperationRequestMapper.java
@@ -55,6 +55,22 @@
     @Autowired
     private GeneralTopologyObjectMapper generalTopologyObjectMapper;
 
+    /**
+     * This method is used for creating the vnf request.
+     *
+     * By these parameter it will get he detailas and prepare the request.
+     *
+     * @param svcOperation
+     * @param svcAction
+     * @param requestAction
+     * @param vnf
+     * @param serviceInstance
+     * @param customer
+     * @param cloudRegion
+     * @param requestContext
+     * @param homing
+     * @return request
+     */
     public GenericResourceApiVnfOperationInformation reqMapper(SDNCSvcOperation svcOperation, SDNCSvcAction svcAction,
             GenericResourceApiRequestActionEnumeration requestAction, GenericVnf vnf, ServiceInstance serviceInstance,
             Customer customer, CloudRegion cloudRegion, RequestContext requestContext, boolean homing,
diff --git a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/manualhandling/tasks/ManualHandlingTasksTest.java b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/manualhandling/tasks/ManualHandlingTasksTest.java
index 9677f8e..b40195c 100644
--- a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/manualhandling/tasks/ManualHandlingTasksTest.java
+++ b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/manualhandling/tasks/ManualHandlingTasksTest.java
@@ -38,6 +38,8 @@
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.onap.so.bpmn.BaseTaskTest;
+import org.onap.so.bpmn.common.BuildingBlockExecution;
+import org.onap.so.bpmn.common.DelegateExecutionImpl;
 import org.onap.so.db.request.beans.InfraActiveRequests;
 
 public class ManualHandlingTasksTest extends BaseTaskTest {
@@ -56,11 +58,13 @@
     @Mock
     private DelegateTask task;
 
-    private DelegateExecution delegateExecution;
+    @Mock
+    private BuildingBlockExecution buildingBlockExecution;
 
     @Before
     public void before() throws Exception {
         delegateExecution = new DelegateExecutionFake();
+        buildingBlockExecution = new DelegateExecutionImpl(delegateExecution);
     }
 
     @Test
@@ -99,18 +103,18 @@
     @Test
     public void updateRequestDbStatus_Test() throws Exception {
         InfraActiveRequests mockedRequest = new InfraActiveRequests();
-        delegateExecution.setVariable("msoRequestId", "testMsoRequestId");
+        buildingBlockExecution.setVariable("mso-request-id", "msoRequestId");
         when(requestsDbClient.getInfraActiveRequestbyRequestId(any(String.class))).thenReturn(mockedRequest);
         doNothing().when(requestsDbClient).updateInfraActiveRequests(any(InfraActiveRequests.class));
-        manualHandlingTasks.updateRequestDbStatus(delegateExecution, "IN_PROGRESS");
+        manualHandlingTasks.updateRequestDbStatus(buildingBlockExecution, "IN_PROGRESS");
         verify(requestsDbClient, times(1)).updateInfraActiveRequests(any(InfraActiveRequests.class));
         assertEquals(mockedRequest.getRequestStatus(), "IN_PROGRESS");
     }
 
     @Test
     public void createExternalTicket_Test() throws Exception {
-        delegateExecution.setVariable("msoRequestId", ("testMsoRequestId"));
-        delegateExecution.setVariable("vnfType", "testVnfType");
-        manualHandlingTasks.createExternalTicket(delegateExecution);
+        buildingBlockExecution.setVariable("mso-request-id", ("testMsoRequestId"));
+        buildingBlockExecution.setVariable("vnfType", "testVnfType");
+        manualHandlingTasks.createExternalTicket(buildingBlockExecution);
     }
 }
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 918a474..eea8852 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
@@ -44,8 +44,10 @@
 import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
 import java.util.UUID;
@@ -62,10 +64,13 @@
 import org.mockito.Mock;
 import org.mockito.Spy;
 import org.onap.aai.domain.yang.GenericVnf;
+import org.onap.aai.domain.yang.GenericVnfs;
 import org.onap.aai.domain.yang.L3Network;
+import org.onap.aai.domain.yang.L3Networks;
 import org.onap.aai.domain.yang.Relationship;
 import org.onap.aai.domain.yang.RelationshipList;
 import org.onap.aai.domain.yang.ServiceInstance;
+import org.onap.aai.domain.yang.ServiceInstances;
 import org.onap.aai.domain.yang.VfModule;
 import org.onap.aai.domain.yang.VfModules;
 import org.onap.aai.domain.yang.VolumeGroup;
@@ -76,6 +81,7 @@
 import org.onap.so.bpmn.servicedecomposition.entities.ExecuteBuildingBlock;
 import org.onap.so.bpmn.servicedecomposition.entities.WorkflowResourceIds;
 import org.onap.so.bpmn.servicedecomposition.modelinfo.ModelInfoVfModule;
+import org.onap.so.bpmn.servicedecomposition.tasks.exceptions.DuplicateNameException;
 import org.onap.so.client.aai.AAIObjectType;
 import org.onap.so.client.aai.entities.AAIResultWrapper;
 import org.onap.so.client.aai.entities.Relationships;
@@ -99,6 +105,7 @@
 import org.onap.so.db.catalog.beans.macro.OrchestrationFlow;
 import org.onap.so.db.request.beans.InfraActiveRequests;
 import org.onap.so.db.request.beans.RequestProcessingData;
+import org.onap.so.serviceinstancebeans.ModelInfo;
 import org.onap.so.serviceinstancebeans.RequestDetails;
 import org.onap.so.serviceinstancebeans.RequestParameters;
 import org.onap.so.serviceinstancebeans.ServiceInstancesRequest;
@@ -114,7 +121,6 @@
     protected WorkflowAction workflowAction;
     private DelegateExecution execution;
 
-
     @InjectMocks
     @Spy
     protected WorkflowAction SPY_workflowAction;
@@ -1494,104 +1500,368 @@
         assertNull(x.getVolumeGroupId());
     }
 
-    @Test
-    public void validateResourceIdInAAITest() throws Exception {
-        // SI
+    private RequestDetails setupRequestDetails(String globalSubscriberId, String subscriptionServiceType,
+            String modelCustomizationId) {
         RequestDetails reqDetails = new RequestDetails();
         SubscriberInfo subInfo = new SubscriberInfo();
-        subInfo.setGlobalSubscriberId("id123");
+        subInfo.setGlobalSubscriberId(globalSubscriberId);
         reqDetails.setSubscriberInfo(subInfo);
         RequestParameters reqParams = new RequestParameters();
-        reqParams.setSubscriptionServiceType("subServiceType123");
+        reqParams.setSubscriptionServiceType(subscriptionServiceType);
         reqDetails.setRequestParameters(reqParams);
+        ModelInfo modelInfo = new ModelInfo();
+        modelInfo.setModelCustomizationId(modelCustomizationId);
+        reqDetails.setModelInfo(modelInfo);
+        return reqDetails;
+    }
+
+    @Test
+    public void validateVnfResourceIdInAAITest() throws Exception {
+        RequestDetails reqDetails = setupRequestDetails("id123", "subServiceType123", "1234567");
         WorkflowResourceIds workflowResourceIds = new WorkflowResourceIds();
-        ServiceInstance si = new ServiceInstance();
-        si.setServiceInstanceId("siId123");
-        Optional<ServiceInstance> siOp = Optional.of(si);
-        when(bbSetupUtils.getAAIServiceInstanceByName("id123", "subServiceType123", "siName123")).thenReturn(siOp);
-        when(bbSetupUtils.getAAIServiceInstanceByName("id123", "subServiceType123", "111111"))
-                .thenReturn(Optional.empty());
-        String id = workflowAction.validateResourceIdInAAI("generatedId123", WorkflowType.SERVICE, "siName123",
-                reqDetails, workflowResourceIds);
-        assertEquals("siId123", id);
-        String id2 = workflowAction.validateResourceIdInAAI("generatedId123", WorkflowType.SERVICE, "111111",
-                reqDetails, workflowResourceIds);
+        workflowResourceIds.setServiceInstanceId("siId123");
+        // Vnf
+        GenericVnf vnf = new GenericVnf();
+        vnf.setVnfId("id123");
+        vnf.setVnfName("vnfName123");
+        vnf.setModelCustomizationId("1234567");
+        Optional<GenericVnf> opVnf = Optional.of(vnf);
+        GenericVnf vnf2 = new GenericVnf();
+        vnf2.setVnfId("id123");
+        vnf2.setVnfName("vnfName222");
+        vnf2.setModelCustomizationId("222");
+        Optional<GenericVnf> opVnf2 = Optional.of(vnf2);
+        when(bbSetupUtils.getRelatedVnfByNameFromServiceInstance("siId123", "vnfName123")).thenReturn(opVnf);
+        when(bbSetupUtils.getRelatedVnfByNameFromServiceInstance("siId123", "vnfName222")).thenReturn(opVnf2);
+        when(bbSetupUtils.getRelatedVnfByNameFromServiceInstance("siId123", "111111")).thenReturn(Optional.empty());
+        String id = workflowAction.validateResourceIdInAAI("generatedId123", WorkflowType.VNF, "vnfName123", reqDetails,
+                workflowResourceIds);
+        assertEquals("id123", id);
+        String id2 = workflowAction.validateResourceIdInAAI("generatedId123", WorkflowType.VNF, "111111", reqDetails,
+                workflowResourceIds);
         assertEquals("generatedId123", id2);
 
+        this.expectedException.expect(DuplicateNameException.class);
+        this.expectedException.expectMessage(containsString(
+                "generic-vnf with name (vnfName222), same parent and different customization id (222) already exists. The name must be unique."));
+        workflowAction.validateResourceIdInAAI("generatedId123", WorkflowType.VNF, "vnfName222", reqDetails,
+                workflowResourceIds);
+    }
+
+    @Test
+    public void validateVnfResourceNameInAAITest() throws Exception {
+        RequestDetails reqDetails = setupRequestDetails("id123", "subServiceType123", "1234567");
+        WorkflowResourceIds workflowResourceIds = new WorkflowResourceIds();
+        workflowResourceIds.setServiceInstanceId("siId123");
+
+        // Vnf
+        GenericVnfs genericVnfs = new GenericVnfs();
+        GenericVnf vnf3 = new GenericVnf();
+        vnf3.setVnfId("id123");
+        vnf3.setVnfName("vnfName333");
+        genericVnfs.getGenericVnf().add(vnf3);
+        when(bbSetupUtils.getRelatedVnfByNameFromServiceInstance("siId123", "vnfName333")).thenReturn(Optional.empty());
+        when(bbSetupUtils.getAAIVnfsGloballyByName("vnfName333")).thenReturn(genericVnfs);
+
+        this.expectedException.expect(DuplicateNameException.class);
+        this.expectedException.expectMessage(containsString(
+                "generic-vnf with name (vnfName333) id (id123) and different parent relationship already exists. The name must be unique."));
+        workflowAction.validateResourceIdInAAI("generatedId123", WorkflowType.VNF, "vnfName333", reqDetails,
+                workflowResourceIds);
+    }
+
+    @Test
+    public void validateNetworkResourceIdInAAITest() throws Exception {
+        RequestDetails reqDetails = setupRequestDetails("id123", "subServiceType123", "1234567");
+        WorkflowResourceIds workflowResourceIds = new WorkflowResourceIds();
+        workflowResourceIds.setServiceInstanceId("siId123");
+
         // Network
         L3Network network = new L3Network();
         network.setNetworkId("id123");
         network.setNetworkName("name123");
+        network.setModelCustomizationId("1234567");
         workflowResourceIds.setServiceInstanceId("siId123");
         Optional<L3Network> opNetwork = Optional.of(network);
+        L3Network network2 = new L3Network();
+        network2.setNetworkId("id123");
+        network2.setNetworkName("networkName222");
+        network2.setModelCustomizationId("222");
+        Optional<L3Network> opNetwork2 = Optional.of(network2);
         when(bbSetupUtils.getRelatedNetworkByNameFromServiceInstance("siId123", "name123")).thenReturn(opNetwork);
+        when(bbSetupUtils.getRelatedNetworkByNameFromServiceInstance("siId123", "networkName222"))
+                .thenReturn(opNetwork2);
         when(bbSetupUtils.getRelatedNetworkByNameFromServiceInstance("siId123", "111111")).thenReturn(Optional.empty());
-        id = workflowAction.validateResourceIdInAAI("generatedId123", WorkflowType.NETWORK, "name123", reqDetails,
-                workflowResourceIds);
+        String id = workflowAction.validateResourceIdInAAI("generatedId123", WorkflowType.NETWORK, "name123",
+                reqDetails, workflowResourceIds);
         assertEquals("id123", id);
-        id2 = workflowAction.validateResourceIdInAAI("generatedId123", WorkflowType.NETWORK, "111111", reqDetails,
-                workflowResourceIds);
+        String id2 = workflowAction.validateResourceIdInAAI("generatedId123", WorkflowType.NETWORK, "111111",
+                reqDetails, workflowResourceIds);
         assertEquals("generatedId123", id2);
 
-        // Vnf
+        this.expectedException.expect(DuplicateNameException.class);
+        this.expectedException.expectMessage(containsString(
+                "l3Network with name (networkName222), same parent and different customization id (222) already exists. The name must be unique."));
+        workflowAction.validateResourceIdInAAI("generatedId123", WorkflowType.NETWORK, "networkName222", reqDetails,
+                workflowResourceIds);
+    }
+
+    @Test
+    public void validateNetworkResourceNameExistsInAAITest() throws Exception {
+        RequestDetails reqDetails = setupRequestDetails("id123", "subServiceType123", "1234567");
+        WorkflowResourceIds workflowResourceIds = new WorkflowResourceIds();
+        workflowResourceIds.setServiceInstanceId("siId123");
+
+        // Network
+        L3Network network = new L3Network();
+        network.setNetworkId("id123");
+        network.setNetworkName("name123");
+        network.setModelCustomizationId("1234567");
+        workflowResourceIds.setServiceInstanceId("siId123");
+
+        when(bbSetupUtils.getRelatedNetworkByNameFromServiceInstance("networkName333", "111111"))
+                .thenReturn(Optional.empty());
+        when(bbSetupUtils.existsAAINetworksGloballyByName("networkName333")).thenReturn(true);
+
+        this.expectedException.expect(DuplicateNameException.class);
+        this.expectedException.expectMessage(containsString(
+                "l3Network with name (networkName333) id (siId123) and different parent relationship already exists. The name must be unique."));
+        workflowAction.validateResourceIdInAAI("generatedId123", WorkflowType.NETWORK, "networkName333", reqDetails,
+                workflowResourceIds);
+    }
+
+    @Test
+    public void validateVfModuleResourceIdInAAITest() throws Exception {
+        RequestDetails reqDetails = setupRequestDetails("id123", "subServiceType123", "1234567");
+        WorkflowResourceIds workflowResourceIds = new WorkflowResourceIds();
+        workflowResourceIds.setServiceInstanceId("siId123");
+
         GenericVnf vnf = new GenericVnf();
         vnf.setVnfId("id123");
         vnf.setVnfName("vnfName123");
-        Optional<GenericVnf> opVnf = Optional.of(vnf);
-        when(bbSetupUtils.getRelatedVnfByNameFromServiceInstance("siId123", "name123")).thenReturn(opVnf);
-        when(bbSetupUtils.getRelatedVnfByNameFromServiceInstance("siId123", "111111")).thenReturn(Optional.empty());
-        id = workflowAction.validateResourceIdInAAI("generatedId123", WorkflowType.VNF, "name123", reqDetails,
-                workflowResourceIds);
-        assertEquals("id123", id);
-        id2 = workflowAction.validateResourceIdInAAI("generatedId123", WorkflowType.VNF, "111111", reqDetails,
-                workflowResourceIds);
-        assertEquals("generatedId123", id2);
+        vnf.setModelCustomizationId("222");
 
         // VfModule
         VfModules vfModules = new VfModules();
         VfModule vfModule = new VfModule();
         vfModule.setVfModuleId("id123");
         vfModule.setVfModuleName("name123");
+        vfModule.setModelCustomizationId("1234567");
         vfModules.getVfModule().add(vfModule);
         vnf.setVfModules(vfModules);
         workflowResourceIds.setVnfId("id123");
         when(bbSetupUtils.getAAIGenericVnf("id123")).thenReturn(vnf);
-        id = workflowAction.validateResourceIdInAAI("generatedId123", WorkflowType.VFMODULE, "name123", reqDetails,
-                workflowResourceIds);
+        String id = workflowAction.validateResourceIdInAAI("generatedId123", WorkflowType.VFMODULE, "name123",
+                reqDetails, workflowResourceIds);
         assertEquals("id123", id);
 
-        GenericVnf vnf2 = new GenericVnf();
+        GenericVnf vnf1 = new GenericVnf();
         VfModules vfModules2 = new VfModules();
         VfModule vfModule2 = new VfModule();
         vfModule2.setVfModuleId("id123");
-        vfModule2.setVfModuleName("name123");
+        vfModule2.setVfModuleName("vFModName222");
+        vfModule2.setModelCustomizationId("222");
         vfModules2.getVfModule().add(vfModule2);
-        vnf2.setVfModules(vfModules2);
+        vnf1.setVfModules(vfModules2);
         workflowResourceIds.setVnfId("id111");
-        when(bbSetupUtils.getAAIGenericVnf("id111")).thenReturn(vnf2);
-        id2 = workflowAction.validateResourceIdInAAI("generatedId123", WorkflowType.VFMODULE, "111111", reqDetails,
-                workflowResourceIds);
+        when(bbSetupUtils.getAAIGenericVnf("id111")).thenReturn(vnf1);
+        String id2 = workflowAction.validateResourceIdInAAI("generatedId123", WorkflowType.VFMODULE, "111111",
+                reqDetails, workflowResourceIds);
         assertEquals("generatedId123", id2);
 
+        this.expectedException.expect(DuplicateNameException.class);
+        this.expectedException.expectMessage(containsString(
+                "vfModule with name (vFModName222), same parent and different customization id (1234567) already exists. The name must be unique."));
+        workflowAction.validateResourceIdInAAI("generatedId123", WorkflowType.VFMODULE, "vFModName222", reqDetails,
+                workflowResourceIds);
+
+    }
+
+    @Test
+    public void validateVolumeGroupResourceIdInAAITest() throws Exception {
+        RequestDetails reqDetails = setupRequestDetails("id123", "subServiceType123", "1234567");
+        WorkflowResourceIds workflowResourceIds = new WorkflowResourceIds();
+        workflowResourceIds.setServiceInstanceId("siId123");
+
+        GenericVnf vnf = new GenericVnf();
+        vnf.setVnfId("id123");
+        vnf.setVnfName("vnfName123");
+        vnf.setModelCustomizationId("1234567");
+
+        GenericVnf vnf2 = new GenericVnf();
+        vnf2.setVnfId("id123");
+        vnf2.setVnfName("vnfName123");
+        vnf2.setModelCustomizationId("222");
+
         // VolumeGroup
         VolumeGroup volumeGroup = new VolumeGroup();
         volumeGroup.setVolumeGroupId("id123");
         volumeGroup.setVolumeGroupName("name123");
         workflowResourceIds.setVnfId("id123");
         Optional<VolumeGroup> opVolumeGroup = Optional.of(volumeGroup);
+
+        workflowResourceIds.setVnfId("id123");
+
+        when(bbSetupUtils.getAAIGenericVnf("id123")).thenReturn(vnf);
         when(bbSetupUtils.getRelatedVolumeGroupByNameFromVnf("id123", "name123")).thenReturn(opVolumeGroup);
-        id = workflowAction.validateResourceIdInAAI("generatedId123", WorkflowType.VOLUMEGROUP, "name123", reqDetails,
-                workflowResourceIds);
+        String id = workflowAction.validateResourceIdInAAI("generatedId123", WorkflowType.VOLUMEGROUP, "name123",
+                reqDetails, workflowResourceIds);
         assertEquals("id123", id);
 
-        workflowResourceIds.setVnfId("id444");
-        when(bbSetupUtils.getAAIGenericVnf("id444")).thenReturn(vnf);
+        when(bbSetupUtils.getAAIGenericVnf("id123")).thenReturn(vnf2);
         when(bbSetupUtils.getRelatedVolumeGroupByNameFromVfModule("id123", "id123", "111111"))
                 .thenReturn(opVolumeGroup);
-        when(bbSetupUtils.getRelatedVolumeGroupByNameFromVnf("id444", "111111")).thenReturn(Optional.empty());
-        id2 = workflowAction.validateResourceIdInAAI("generatedId123", WorkflowType.VOLUMEGROUP, "111111", reqDetails,
+
+        when(bbSetupUtils.getRelatedVolumeGroupByNameFromVnf("id123", "111111")).thenReturn(Optional.empty());
+        String id2 = workflowAction.validateResourceIdInAAI("generatedId123", WorkflowType.VOLUMEGROUP, "111111",
+                reqDetails, workflowResourceIds);
+        assertEquals("generatedId123", id2);
+    }
+
+    @Test
+    public void validateConfigurationResourceIdInAAITest() throws Exception {
+        RequestDetails reqDetails = setupRequestDetails("id123", "subServiceType123", "1234567");
+        WorkflowResourceIds workflowResourceIds = new WorkflowResourceIds();
+        workflowResourceIds.setServiceInstanceId("siId123");
+
+        // Configuration
+        org.onap.aai.domain.yang.Configuration configuration = new org.onap.aai.domain.yang.Configuration();
+        configuration.setConfigurationId("id123");
+        configuration.setConfigurationName("name123");
+        configuration.setModelCustomizationId("1234567");
+        Optional<org.onap.aai.domain.yang.Configuration> opConfiguration = Optional.of(configuration);
+
+        org.onap.aai.domain.yang.Configuration configuration2 = new org.onap.aai.domain.yang.Configuration();
+        configuration2.setConfigurationId("id123");
+        configuration2.setConfigurationName("name123");
+        configuration2.setModelCustomizationId("222");
+        Optional<org.onap.aai.domain.yang.Configuration> opConfiguration2 = Optional.of(configuration2);
+
+        workflowResourceIds.setVnfId("id123");
+
+        when(bbSetupUtils.getRelatedConfigurationByNameFromServiceInstance("siId123", "name123"))
+                .thenReturn(opConfiguration);
+        String id = workflowAction.validateResourceIdInAAI("generatedId123", WorkflowType.CONFIGURATION, "name123",
+                reqDetails, workflowResourceIds);
+        assertEquals("id123", id);
+
+        when(bbSetupUtils.getRelatedConfigurationByNameFromServiceInstance("siId123", "111111"))
+                .thenReturn(Optional.empty());
+        String id2 = workflowAction.validateResourceIdInAAI("generatedId123", WorkflowType.CONFIGURATION, "111111",
+                reqDetails, workflowResourceIds);
+        assertEquals("generatedId123", id2);
+
+        when(bbSetupUtils.getRelatedConfigurationByNameFromServiceInstance("siId123", "name222"))
+                .thenReturn(opConfiguration2);
+        this.expectedException.expect(DuplicateNameException.class);
+        this.expectedException.expectMessage(containsString(
+                "configuration with name (name222), same parent and different customization id (id123) already exists. The name must be unique."));
+        workflowAction.validateResourceIdInAAI("generatedId123", WorkflowType.CONFIGURATION, "name222", reqDetails,
                 workflowResourceIds);
-        assertEquals("id123", id2);
+    }
+
+    @Test
+    public void validateServiceInstanceResourceIdInAAITest() throws Exception {
+        WorkflowResourceIds workflowResourceIds = new WorkflowResourceIds();
+        workflowResourceIds.setServiceInstanceId("siId123");
+        RequestDetails reqDetails = setupRequestDetails("id123", "subServiceType123", "1234567");
+        reqDetails.getModelInfo().setModelVersionId("1234567");
+
+        ServiceInstance si = new ServiceInstance();
+        si.setServiceInstanceId("siId123");
+        si.setModelVersionId("1234567");
+        ServiceInstances serviceInstances = new ServiceInstances();
+        serviceInstances.getServiceInstance().add(si);
+        Optional<ServiceInstance> siOp = Optional.of(si);
+        ServiceInstance si2 = new ServiceInstance();
+        si2.setServiceInstanceId("siId222");
+        si2.setModelVersionId("22222");
+        si2.setServiceInstanceName("siName222");
+        Optional<ServiceInstance> siOp2 = Optional.of(si2);
+        ServiceInstances serviceInstances2 = new ServiceInstances();
+        serviceInstances2.getServiceInstance().add(si2);
+
+        when(bbSetupUtils.getAAIServiceInstanceByName("id123", "subServiceType123", "siName123")).thenReturn(siOp);
+        when(bbSetupUtils.getAAIServiceInstanceByName("id123", "subServiceType123", "siName222")).thenReturn(siOp2);
+        when(bbSetupUtils.getAAIServiceInstanceByName("id123", "subServiceType123", "111111"))
+                .thenReturn(Optional.empty());
+
+        when(bbSetupUtils.getAAIServiceInstancesGloballyByName("siName123")).thenReturn(serviceInstances);
+        String id = workflowAction.validateResourceIdInAAI("generatedId123", WorkflowType.SERVICE, "siName123",
+                reqDetails, workflowResourceIds);
+        assertEquals("siId123", id);
+        String id2 = workflowAction.validateResourceIdInAAI("generatedId123", WorkflowType.SERVICE, "111111",
+                reqDetails, workflowResourceIds);
+        assertEquals("generatedId123", id2);
+
+        when(bbSetupUtils.getAAIServiceInstancesGloballyByName("siName222")).thenReturn(serviceInstances2);
+        this.expectedException.expect(DuplicateNameException.class);
+        this.expectedException.expectMessage(containsString(
+                "serviceInstance with name (siName222) and different version id (1234567) already exists. The name must be unique."));
+        workflowAction.validateResourceIdInAAI("generatedId123", WorkflowType.SERVICE, "siName222", reqDetails,
+                workflowResourceIds);
+    }
+
+    @Test
+    public void validateServiceInstanceResourceIdInAAIMultipleTest() throws Exception {
+        WorkflowResourceIds workflowResourceIds = new WorkflowResourceIds();
+        workflowResourceIds.setServiceInstanceId("siId123");
+        RequestDetails reqDetails = setupRequestDetails("id123", "subServiceType123", "1234567");
+        reqDetails.getModelInfo().setModelVersionId("1234567");
+
+        ServiceInstance si = new ServiceInstance();
+        si.setServiceInstanceId("siId123");
+        si.setModelVersionId("1234567");
+        ServiceInstances serviceInstances = new ServiceInstances();
+        serviceInstances.getServiceInstance().add(si);
+
+        ServiceInstance si2 = new ServiceInstance();
+        si2.setServiceInstanceId("siId222");
+        si2.setModelVersionId("22222");
+        si2.setServiceInstanceName("siName222");
+        serviceInstances.getServiceInstance().add(si2);
+
+        when(bbSetupUtils.getAAIServiceInstanceByName("id123", "subServiceType123", "siId123"))
+                .thenReturn(Optional.empty());
+
+        when(bbSetupUtils.getAAIServiceInstancesGloballyByName("siName123")).thenReturn(serviceInstances);
+
+        this.expectedException.expect(DuplicateNameException.class);
+        this.expectedException.expectMessage(containsString(
+                "serviceInstance with name (siName123) and multiple combination of model-version-id + service-type + global-customer-id already exists. The name must be unique."));
+        workflowAction.validateResourceIdInAAI("generatedId123", WorkflowType.SERVICE, "siName123", reqDetails,
+                workflowResourceIds);
+    }
+
+    @Test
+    public void validateServiceInstanceResourceIdInAAIExistsTest() throws Exception {
+        WorkflowResourceIds workflowResourceIds = new WorkflowResourceIds();
+        workflowResourceIds.setServiceInstanceId("siId123");
+        RequestDetails reqDetails = setupRequestDetails("id123", "subServiceType123", "1234567");
+        reqDetails.getModelInfo().setModelVersionId("1234567");
+
+        ServiceInstance si = new ServiceInstance();
+        si.setServiceInstanceId("siId123");
+        si.setModelVersionId("1234567");
+        ServiceInstances serviceInstances = new ServiceInstances();
+        serviceInstances.getServiceInstance().add(si);
+
+        when(bbSetupUtils.getAAIServiceInstanceByName("id123", "subServiceType123", "siId123"))
+                .thenReturn(Optional.empty());
+
+        when(bbSetupUtils.getAAIServiceInstancesGloballyByName("siName123")).thenReturn(serviceInstances);
+
+        Map<String, String> uriKeys = new HashMap<>();
+        uriKeys.put("global-customer-id", "globalCustomerId");
+        uriKeys.put("service-type", "serviceType");
+
+        when(bbSetupUtils.getURIKeysFromServiceInstance("siId123")).thenReturn(uriKeys);
+
+        this.expectedException.expect(DuplicateNameException.class);
+        this.expectedException.expectMessage(containsString(
+                "serviceInstance with name (siName123) and global-customer-id (globalCustomerId), service-type (serviceType), model-version-id (1234567) already exists. The name must be unique."));
+        workflowAction.validateResourceIdInAAI("generatedId123", WorkflowType.SERVICE, "siName123", reqDetails,
+                workflowResourceIds);
     }
 
     @Test
diff --git a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/listeners/MultiStageSkipListenerTest.java b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/listeners/MultiStageSkipListenerTest.java
index 9e2eac4..82d610f 100644
--- a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/listeners/MultiStageSkipListenerTest.java
+++ b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/listeners/MultiStageSkipListenerTest.java
@@ -77,6 +77,8 @@
         execution.setVariable("multiStageDesign", false);
         assertFalse("should not be triggered", multiStageSkipListener.shouldRunFor(execution));
 
+        execution.setVariable("multiStageDesign", null);
+        assertFalse("should not be triggered", multiStageSkipListener.shouldRunFor(execution));
 
     }
 
diff --git a/docs/Developer_Info.rst b/docs/Developer_Info.rst
deleted file mode 100644
index 46c114f..0000000
--- a/docs/Developer_Info.rst
+++ /dev/null
@@ -1,14 +0,0 @@
-.. This work is licensed under a Creative Commons Attribution 4.0 International License.

-.. http://creativecommons.org/licenses/by/4.0

-.. Copyright 2018 Huawei Technologies Co., Ltd.

-

-Developer Information

-======================

-

-.. toctree::

-   :maxdepth: 1

-

-   Install_Configure_SO.rst

-   architecture.rst

-

-   
\ No newline at end of file
diff --git a/docs/bak/Developer_Info.rst b/docs/bak/Developer_Info.rst
new file mode 100644
index 0000000..9d9c46c
--- /dev/null
+++ b/docs/bak/Developer_Info.rst
@@ -0,0 +1,14 @@
+\installconfigure.. This work is licensed under a Creative Commons Attribution 4.0 International License.

+.. http://creativecommons.org/licenses/by/4.0

+.. Copyright 2018 Huawei Technologies Co., Ltd.

+

+Developer Information

+======================

+

+.. toctree::

+   :maxdepth: 1

+

+   ../installconfigure/Install_Configure_SO.rst

+   ../architecture/architecture.rst

+

+   
\ No newline at end of file
diff --git a/docs/installation.rst b/docs/bak/installation.rst
similarity index 100%
rename from docs/installation.rst
rename to docs/bak/installation.rst
diff --git a/docs/developer_info/developer_information.rst b/docs/developer_info/developer_information.rst
index bae1e2e..ac1a15b 100644
--- a/docs/developer_info/developer_information.rst
+++ b/docs/developer_info/developer_information.rst
@@ -13,8 +13,9 @@
    Working_with_SO_Docker.rst
    Camunda_Cockpit_Community_Edition.rst
    Camunda_Cockpit_Enterprise_Edition.rst
+   Camunda_Modeler
+   BPMN_Project_Structure.rst
+   BPMN_Main_Process_Flows.rst
+   BPMN_Subprocess_Process_Flows.rst
+   BPMN_Project_Deployment_Strategy.rst
    FAQs.rst
-.. developer_info_Project_Structure.rst
-.. developer_info_Main_Process_Flows.rst
-.. developer_info_Subprocess_Process_Flows.rst
-.. developer_info_Project_Deployment_Strategy.rst
\ No newline at end of file
diff --git a/docs/installconfigure/Configure_git_and_gerrit.rst b/docs/installconfigure/Configure_git_and_gerrit.rst
index c4598fa..76a4d75 100644
--- a/docs/installconfigure/Configure_git_and_gerrit.rst
+++ b/docs/installconfigure/Configure_git_and_gerrit.rst
@@ -25,14 +25,14 @@
 - Log in
 - Open the menu next to your name (under the green search button)
 
-.. image:: images/Configure_git_1.png
+.. image:: ../images/Configure_git_1.png
 
 - Select "Settings"
 - In the "Settings" sidebar, click "SSH Public Keys"`
 - Click "Add Key..."
 - Paste the entire contents of $HOME/.ssh/id_rsa.pub into the text area and click "Add".
 
-.. image:: images/Configure_git_2.png
+.. image:: ../images/Configure_git_2.png
 
 Install the git-review package.
 
@@ -90,4 +90,4 @@
 
   ssh -p 29418 gerrit.onap.org
 
-.. image:: images/Configure_git_3.png
+.. image:: ../images/Configure_git_3.png
diff --git a/docs/installconfigure/Install_Docker.rst b/docs/installconfigure/Install_Docker.rst
index 91e40ca..d20c2b1 100644
--- a/docs/installconfigure/Install_Docker.rst
+++ b/docs/installconfigure/Install_Docker.rst
@@ -3,7 +3,7 @@
 .. Copyright 2018 Huawei Technologies Co., Ltd.
 
 Install Docker
-===============
+==============
 
 Make sure curl is installed on the Ubuntu VM:
 
@@ -58,7 +58,7 @@
     Restart docker:
 
 .. code-block:: bash
-	
+
         sudo systemctl daemon-reload
         sudo systemctl restart docker
 
@@ -82,4 +82,4 @@
 
     docker run hello-world
 	
-.. image:: images/Docker_install_1.png
\ No newline at end of file
+.. image:: ../images/Docker_install_1.png
\ No newline at end of file
diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/resources/application.yaml b/mso-api-handlers/mso-api-handler-infra/src/main/resources/application.yaml
index 93a4ae9..babefd9 100644
--- a/mso-api-handlers/mso-api-handler-infra/src/main/resources/application.yaml
+++ b/mso-api-handlers/mso-api-handler-infra/src/main/resources/application.yaml
@@ -49,6 +49,8 @@
         enable-lazy-load-no-trans: true
   jersey:
     type: filter
+  main:
+    allow-bean-definition-overriding: true
                        
 request:
   datasource:
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 4b2644b..e28e36d 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
@@ -2398,7 +2398,7 @@
         assertEquals(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), response.getStatusCode().value());
         RequestError realResponse = errorMapper.readValue(response.getBody(), RequestError.class);
         assertEquals(
-                "Unable to check for duplicate instance due to error contacting requestDb: org.springframework.web.client.HttpServerErrorException: 500 Server Error",
+                "Unable to check for duplicate instance due to error contacting requestDb: org.springframework.web.client.HttpServerErrorException$InternalServerError: 500 Server Error",
                 realResponse.getServiceException().getText());
     }
 
@@ -2443,7 +2443,7 @@
         assertEquals(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), response.getStatusCode().value());
         RequestError realResponse = errorMapper.readValue(response.getBody(), RequestError.class);
         assertEquals(
-                "Unable to get process-instance history from Camunda for requestId: f0a35706-efc4-4e27-80ea-a995d7a2a40f due to error: org.springframework.web.client.HttpServerErrorException: 500 Server Error",
+                "Unable to get process-instance history from Camunda for requestId: f0a35706-efc4-4e27-80ea-a995d7a2a40f due to error: org.springframework.web.client.HttpServerErrorException$InternalServerError: 500 Server Error",
                 realResponse.getServiceException().getText());
     }
 
@@ -2460,7 +2460,7 @@
         assertEquals(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), response.getStatusCode().value());
         RequestError realResponse = errorMapper.readValue(response.getBody(), RequestError.class);
         assertEquals(
-                "Unable to check for duplicate instance due to error contacting requestDb: org.springframework.web.client.HttpServerErrorException: 500 Server Error",
+                "Unable to check for duplicate instance due to error contacting requestDb: org.springframework.web.client.HttpServerErrorException$InternalServerError: 500 Server Error",
                 realResponse.getServiceException().getText());
     }
 
@@ -2492,7 +2492,7 @@
         assertEquals(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), response.getStatusCode().value());
         RequestError realResponse = errorMapper.readValue(response.getBody(), RequestError.class);
         assertEquals(
-                "Unable to save instance to db due to error contacting requestDb: org.springframework.web.client.HttpServerErrorException: 500 Server Error",
+                "Unable to save instance to db due to error contacting requestDb: org.springframework.web.client.HttpServerErrorException$InternalServerError: 500 Server Error",
                 realResponse.getServiceException().getText());
     }
 
@@ -2512,7 +2512,7 @@
         assertEquals(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), response.getStatusCode().value());
         RequestError realResponse = errorMapper.readValue(response.getBody(), RequestError.class);
         assertEquals(
-                "Unable to save instance to db due to error contacting requestDb: org.springframework.web.client.HttpServerErrorException: 500 Server Error",
+                "Unable to save instance to db due to error contacting requestDb: org.springframework.web.client.HttpServerErrorException$InternalServerError: 500 Server Error",
                 realResponse.getServiceException().getText());
     }
 
@@ -2529,7 +2529,7 @@
         assertEquals(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), response.getStatusCode().value());
         RequestError realResponse = errorMapper.readValue(response.getBody(), RequestError.class);
         assertEquals(
-                "Unable to save instance to db due to error contacting requestDb: org.springframework.web.client.HttpServerErrorException: 500 Server Error",
+                "Unable to save instance to db due to error contacting requestDb: org.springframework.web.client.HttpServerErrorException$InternalServerError: 500 Server Error",
                 realResponse.getServiceException().getText());
     }
 
diff --git a/pom.xml b/pom.xml
index a27c149..d5cd1f4 100644
--- a/pom.xml
+++ b/pom.xml
@@ -66,7 +66,7 @@
     <siteNexusPath>content/sites/site/org/onap/so/${project.version}/</siteNexusPath>
     <cxf.version>3.2.6</cxf.version>
     <jax.ws.rs>2.1</jax.ws.rs>
-    <springboot.version>2.0.5.RELEASE</springboot.version>
+    <springboot.version>2.1.5.RELEASE</springboot.version>
     <camunda.springboot.version>3.2.0</camunda.springboot.version>
     <format.skipValidate>false</format.skipValidate>
     <format.skipExecute>true</format.skipExecute>
@@ -847,18 +847,13 @@
       <dependency>
         <groupId>org.flywaydb</groupId>
         <artifactId>flyway-core</artifactId>
-        <version>5.1.4</version>
+        <version>5.2.4</version>
       </dependency>
       <dependency>
         <groupId>org.json</groupId>
         <artifactId>json</artifactId>
         <version>20140107</version>
       </dependency>
-      <dependency>
-        <groupId>org.yaml</groupId>
-        <artifactId>snakeyaml</artifactId>
-        <version>1.19</version>
-      </dependency>
     </dependencies>
   </dependencyManagement>
   <profiles>
diff --git a/so-monitoring/so-monitoring-service/src/main/resources/application.yaml b/so-monitoring/so-monitoring-service/src/main/resources/application.yaml
index 347845e..417febe 100644
--- a/so-monitoring/so-monitoring-service/src/main/resources/application.yaml
+++ b/so-monitoring/so-monitoring-service/src/main/resources/application.yaml
@@ -17,6 +17,8 @@
         auth: Basic YnBlbDpwYXNzd29yZDEk
 
 spring:
+  main:
+    allow-bean-definition-overriding: true
   security:
     usercredentials:
     -
diff --git a/vnfm-simulator/vnfm-service/src/main/java/org/onap/svnfm/simulator/services/OperationProgressor.java b/vnfm-simulator/vnfm-service/src/main/java/org/onap/svnfm/simulator/services/OperationProgressor.java
index 218cc2d..83f079c 100644
--- a/vnfm-simulator/vnfm-service/src/main/java/org/onap/svnfm/simulator/services/OperationProgressor.java
+++ b/vnfm-simulator/vnfm-service/src/main/java/org/onap/svnfm/simulator/services/OperationProgressor.java
@@ -1,5 +1,7 @@
 package org.onap.svnfm.simulator.services;
 
+import java.io.IOException;
+import java.io.InputStream;
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.List;
@@ -34,10 +36,13 @@
 import org.onap.svnfm.simulator.repository.VnfOperationRepository;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.core.io.ClassPathResource;
 
 public abstract class OperationProgressor implements Runnable {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(OperationProgressor.class);
+    private static final String CERTIFICATE_TO_TRUST = "so-vnfm-adapter.crt.pem";
+
     protected final VnfOperation operation;
     protected final SvnfmService svnfmService;
     private final VnfOperationRepository vnfOperationRepository;
@@ -61,14 +66,25 @@
         String callBackUrl = subscriptionService.getSubscriptions().iterator().next().getCallbackUri();
         callBackUrl = callBackUrl.substring(0, callBackUrl.indexOf("/lcn/"));
         apiClient.setBasePath(callBackUrl);
+        apiClient.setSslCaCert(getCertificateToTrust());
         notificationClient = new DefaultApi(apiClient);
 
         final org.onap.so.adapters.vnfmadapter.extclients.vnfm.grant.ApiClient grantApiClient =
                 new org.onap.so.adapters.vnfmadapter.extclients.vnfm.grant.ApiClient();
         grantApiClient.setBasePath(callBackUrl);
+        grantApiClient.setSslCaCert(getCertificateToTrust());
         grantClient = new org.onap.so.adapters.vnfmadapter.extclients.vnfm.grant.api.DefaultApi(grantApiClient);
     }
 
+    private InputStream getCertificateToTrust() {
+        try {
+            return new ClassPathResource(CERTIFICATE_TO_TRUST).getInputStream();
+        } catch (final IOException exception) {
+            LOGGER.error("Error reading certificate to trust, https calls to VNFM adapter will fail", exception);
+            return null;
+        }
+    }
+
     @Override
     public void run() {
         try {
@@ -176,6 +192,9 @@
                     MediaType.APPLICATION_JSON, authHeader);
         } catch (final ApiException exception) {
             LOGGER.error("Error sending notification: " + notification, exception);
+            LOGGER.error("Response code: {}, body: {}, basePath: {}", exception.getCode(), exception.getResponseBody(),
+                    notificationClient.getApiClient().getBasePath());
+
         }
     }
 
diff --git a/vnfm-simulator/vnfm-service/src/main/resources/so-vnfm-adapter.crt.pem b/vnfm-simulator/vnfm-service/src/main/resources/so-vnfm-adapter.crt.pem
new file mode 100644
index 0000000..3c899e3
--- /dev/null
+++ b/vnfm-simulator/vnfm-service/src/main/resources/so-vnfm-adapter.crt.pem
@@ -0,0 +1,30 @@
+Bag Attributes
+    friendlyName: so@so.onap.org
+    localKeyID: 54 69 6D 65 20 31 35 36 33 34 36 33 36 32 39 35 38 33 
+subject=/CN=so-vnfm-adapter/emailAddress=/OU=so@so.onap.org/OU=OSAAF/O=ONAP/C=US
+issuer=/C=US/O=ONAP/OU=OSAAF/CN=intermediateCA_9
+-----BEGIN CERTIFICATE-----
+MIIEITCCAwmgAwIBAgIILuAnLLineoYwDQYJKoZIhvcNAQELBQAwRzELMAkGA1UE
+BhMCVVMxDTALBgNVBAoMBE9OQVAxDjAMBgNVBAsMBU9TQUFGMRkwFwYDVQQDDBBp
+bnRlcm1lZGlhdGVDQV85MB4XDTE5MDcxODE1MjcwOVoXDTIwMDcxODE1MjcwOVow
+cDEYMBYGA1UEAwwPc28tdm5mbS1hZGFwdGVyMQ8wDQYJKoZIhvcNAQkBFgAxFzAV
+BgNVBAsMDnNvQHNvLm9uYXAub3JnMQ4wDAYDVQQLDAVPU0FBRjENMAsGA1UECgwE
+T05BUDELMAkGA1UEBhMCVVMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
+AQCu2NbWjFiZ5Tz5P7daCD6mqJqSWV3f+gkM2VC/UYM/43hd/2ILJbbtsv4uzS/P
+GXl3UIKBjb7zRiDCvLNMFsHCZ9/gIonG1z737S42LCrdVKq/KQ59yIOPrxYmLyiQ
+Xy81ChX77b2KvKPPeF+K/wnh5fLwlcJ18geeCoWGaMK0C/i6J/uUb9z+Ef0Nmtau
+NdXAuUnERCKMra+3kFxZwaRC/gSCy+/s6EQdeaGNiijg03AmrUx9XjrJjHbYMDVo
+OKSxtv0E4fxbfmTpHaKCuN4eg+0nEXw/eiIEuSHJuh3KKv7wRoP/hG/Tdog7x60M
+SD+hdNjCbFP6yAyMPfoxVnjHAgMBAAGjgecwgeQwCQYDVR0TBAIwADAOBgNVHQ8B
+Af8EBAMCBeAwIAYDVR0lAQH/BBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMFQGA1Ud
+IwRNMEuAFIH3mVsQuciM3vNSXupOaaBDPqzdoTCkLjAsMQ4wDAYDVQQLDAVPU0FB
+RjENMAsGA1UECgwET05BUDELMAkGA1UEBhMCVVOCAQcwHQYDVR0OBBYEFFLrO3T4
+QybeDQ28mHgC/xT5f03qMDAGA1UdEQQpMCeCD3NvLXZuZm0tYWRhcHRlcoIUc28t
+dm5mbS1hZGFwdGVyLm9uYXAwDQYJKoZIhvcNAQELBQADggEBACe+JaVIjTku/QNp
+XoQCNN+sllSZmEHTLmYfpSzY5BY2AeJsgTYqFtAhtp6uQf8Jr993CyEyeJ4if2Z9
+J5NWoJKmY1+a63UphB1mg4sNSCuDxvbxPjtrFkOx/DiB1XEUdoifS9IQSDIIuhaD
+YP6sih1TBOh/2ityCe51Mu1J9/wgb24rlYouVtEyQeIai4dqngFHeQHeNXOnGN0z
+osEcKSYa0C+ZOAomBMT58C2aDz9vyI8YPuzwVSDKndmXUgvrkkVnxk3qJRtghDQc
+RV+4SeZg8s4+5DxKL4AL15IAaAPMJHi+MRtfm7qNzqCEl5sAEzO7S4oVHeWLNFV8
+a9PHErg=
+-----END CERTIFICATE-----