Merge "Lower code duplication of AaiClient calls in BBInputSetupUtils"
diff --git a/adapters/mso-catalog-db-adapter/src/main/resources/db/migration/V8.4__AddBBNameSelectionReference.sql b/adapters/mso-catalog-db-adapter/src/main/resources/db/migration/V8.4__AddBBNameSelectionReference.sql
new file mode 100644
index 0000000..2b8d4ea
--- /dev/null
+++ b/adapters/mso-catalog-db-adapter/src/main/resources/db/migration/V8.4__AddBBNameSelectionReference.sql
@@ -0,0 +1,16 @@
+use catalogdb;
+
+CREATE TABLE IF NOT EXISTS `bbname_selection_reference` (
+  `ID` INT(11) NOT NULL AUTO_INCREMENT,
+  `CONTROLLER_ACTOR` varchar(200) NOT NULL ,
+  `SCOPE` varchar(200) NOT NULL,
+  `ACTION` varchar(200) NOT NULL,
+  `BB_NAME` varchar(200) NOT NULL,
+  PRIMARY KEY (`ID`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+
+INSERT INTO bbname_selection_reference (CONTROLLER_ACTOR,SCOPE,ACTION,BB_NAME)
+VALUES
+('APPC', 'vfModule', 'healthCheck','GenericVnfHealthCheckBB'),
+('APPC', 'vfModule', 'configScaleOut','ConfigurationScaleOutBB'),
+('APPC', 'vnf', 'healthCheck','GenericVnfHealthCheckBB');
\ No newline at end of file
diff --git a/adapters/mso-catalog-db-adapter/src/test/java/org/onap/so/db/catalog/client/CatalogDbClientTest.java b/adapters/mso-catalog-db-adapter/src/test/java/org/onap/so/db/catalog/client/CatalogDbClientTest.java
index 739b4b6..03ef24d 100644
--- a/adapters/mso-catalog-db-adapter/src/test/java/org/onap/so/db/catalog/client/CatalogDbClientTest.java
+++ b/adapters/mso-catalog-db-adapter/src/test/java/org/onap/so/db/catalog/client/CatalogDbClientTest.java
@@ -33,6 +33,7 @@
 import org.junit.Test;
 import org.onap.so.adapters.catalogdb.CatalogDbAdapterBaseTest;
 import org.onap.so.db.catalog.beans.AuthenticationType;
+import org.onap.so.db.catalog.beans.BBNameSelectionReference;
 import org.onap.so.db.catalog.beans.CloudIdentity;
 import org.onap.so.db.catalog.beans.CloudSite;
 import org.onap.so.db.catalog.beans.CloudifyManager;
@@ -718,8 +719,8 @@
     }
 
     @Test
-    public void getWorkflowByModelUUID_validUuid_expectedOutput() {
-        List<Workflow> workflows = client.findWorkflowByModelUUID("ff2ae348-214a-11e7-93ae-92361f002671");
+    public void getWorkflowByVnfModelUUID_validUuid_expectedOutput() {
+        List<Workflow> workflows = client.findWorkflowByVnfModelUUID("ff2ae348-214a-11e7-93ae-92361f002671");
         assertTrue(workflows != null);
         assertTrue(workflows.size() != 0);
 
@@ -754,5 +755,21 @@
         assertNotEquals(0, cloudSites.size());
     }
 
+    @Test
+    public void getBBNameSelectionReference_validData_expectedOutput() {
+        BBNameSelectionReference bbNameSelectionReference =
+                client.getBBNameSelectionReference("APPC", "vfModule", "healthCheck");
+        assertNotNull(bbNameSelectionReference);
+        assertEquals("GenericVnfHealthCheckBB", bbNameSelectionReference.getBbName());
+    }
+
+    @Test
+    public void getBBNameSelectionReference_invalidData_nullOutput() {
+        BBNameSelectionReference bbNameSelectionReference =
+                client.getBBNameSelectionReference("ABC", "vfModule", "healthCheck");
+        assertNull(bbNameSelectionReference);
+
+    }
+
 
 }
diff --git a/adapters/mso-requests-db-adapter/src/main/java/org/onap/so/adapters/requestsdb/ArchiveInfraRequestsScheduler.java b/adapters/mso-requests-db-adapter/src/main/java/org/onap/so/adapters/requestsdb/ArchiveInfraRequestsScheduler.java
index 3deabb3..24dab2f 100644
--- a/adapters/mso-requests-db-adapter/src/main/java/org/onap/so/adapters/requestsdb/ArchiveInfraRequestsScheduler.java
+++ b/adapters/mso-requests-db-adapter/src/main/java/org/onap/so/adapters/requestsdb/ArchiveInfraRequestsScheduler.java
@@ -145,6 +145,8 @@
                 archivedInfra.setVnfType(iar.getVnfType());
                 archivedInfra.setVolumeGroupId(iar.getVolumeGroupId());
                 archivedInfra.setVolumeGroupName(iar.getVolumeGroupName());
+                archivedInfra.setProductFamilyName(iar.getProductFamilyName());
+                archivedInfra.setTenantName(iar.getTenantName());
 
                 newArchivedReqs.add(archivedInfra);
                 oldInfraReqs.add(iar);
diff --git a/adapters/mso-requests-db-adapter/src/main/java/org/onap/so/adapters/requestsdb/OrchestrationTaskRepositoryCustomController.java b/adapters/mso-requests-db-adapter/src/main/java/org/onap/so/adapters/requestsdb/OrchestrationTaskRepositoryCustomController.java
new file mode 100644
index 0000000..e32d90b
--- /dev/null
+++ b/adapters/mso-requests-db-adapter/src/main/java/org/onap/so/adapters/requestsdb/OrchestrationTaskRepositoryCustomController.java
@@ -0,0 +1,62 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2019 Huawei Technologies Co., Ltd. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License")
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.adapters.requestsdb;
+
+import org.onap.so.adapters.requestsdb.exceptions.MsoRequestsDbException;
+import org.onap.so.db.request.beans.OrchestrationTask;
+import org.onap.so.db.request.data.repository.OrchestrationTaskRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import java.util.List;
+
+@RestController
+public class OrchestrationTaskRepositoryCustomController {
+
+    @Autowired
+    private OrchestrationTaskRepository orchestrationTaskRepository;
+
+    @RequestMapping(method = RequestMethod.GET, value = "/orchestrationTask")
+    public List<OrchestrationTask> getAllOrchestrationTask() {
+        return orchestrationTaskRepository.findAll();
+    }
+
+    @RequestMapping(method = RequestMethod.GET, value = "/orchestrationTask/{taskId}")
+    public OrchestrationTask getOrchestrationTask(@PathVariable("taskId") String taskId) throws MsoRequestsDbException {
+        return orchestrationTaskRepository.findById(taskId)
+                .orElseThrow(() -> new MsoRequestsDbException("orchestration task not found: " + taskId));
+    }
+
+    @RequestMapping(method = RequestMethod.POST, value = "/orchestrationTask/")
+    public OrchestrationTask createOrchestrationTask(@RequestBody OrchestrationTask orchestrationTask) {
+        return orchestrationTaskRepository.save(orchestrationTask);
+    }
+
+    @RequestMapping(method = RequestMethod.PUT, value = "/orchestrationTask/{taskId}")
+    public OrchestrationTask updateOrchestrationTask(@PathVariable("taskId") String taskId,
+            @RequestBody OrchestrationTask orchestrationTask) throws MsoRequestsDbException {
+        return orchestrationTaskRepository.save(orchestrationTask);
+    }
+
+    @RequestMapping(method = RequestMethod.DELETE, value = "/orchestrationTask/{taskId}")
+    public void deleteOrchestrationTask(@PathVariable("taskId") String taskId) {
+        orchestrationTaskRepository.deleteById(taskId);
+    }
+}
diff --git a/adapters/mso-requests-db-adapter/src/main/resources/db/migration/V7.2.1__Add_PNF_Column_Infra_Requests_archive_tables.sql b/adapters/mso-requests-db-adapter/src/main/resources/db/migration/V7.2.1__Add_PNF_Column_Infra_Requests_archive_tables.sql
new file mode 100644
index 0000000..8c042dc
--- /dev/null
+++ b/adapters/mso-requests-db-adapter/src/main/resources/db/migration/V7.2.1__Add_PNF_Column_Infra_Requests_archive_tables.sql
@@ -0,0 +1,4 @@
+use requestdb;
+
+ALTER TABLE infra_active_requests ADD COLUMN IF NOT EXISTS PNF_NAME varchar(45);
+ALTER TABLE archived_infra_requests ADD COLUMN IF NOT EXISTS PNF_NAME varchar(45);
diff --git a/adapters/mso-requests-db-adapter/src/main/resources/db/migration/V7.2__Add_PNF_Column_Infra_Requests_archive_tables.sql b/adapters/mso-requests-db-adapter/src/main/resources/db/migration/V7.2__Add_PNF_Column_Infra_Requests_archive_tables.sql
index dbdc925..d82e666 100644
--- a/adapters/mso-requests-db-adapter/src/main/resources/db/migration/V7.2__Add_PNF_Column_Infra_Requests_archive_tables.sql
+++ b/adapters/mso-requests-db-adapter/src/main/resources/db/migration/V7.2__Add_PNF_Column_Infra_Requests_archive_tables.sql
@@ -1,4 +1,4 @@
 use requestdb;
 
 ALTER TABLE infra_active_requests ADD COLUMN IF NOT EXISTS PNF_ID varchar(45);
-ALTER TABLE archived_infra_requests ADD COLUMN IF NOT EXISTS PNF_ID varchar(45);
\ No newline at end of file
+ALTER TABLE archived_infra_requests ADD COLUMN IF NOT EXISTS PNF_ID varchar(45);
diff --git a/adapters/mso-requests-db-adapter/src/main/resources/db/migration/V7.3__Add_Columns_Tenant_Name_Product_Family_Name.sql b/adapters/mso-requests-db-adapter/src/main/resources/db/migration/V7.3__Add_Columns_Tenant_Name_Product_Family_Name.sql
new file mode 100644
index 0000000..a79b1a8
--- /dev/null
+++ b/adapters/mso-requests-db-adapter/src/main/resources/db/migration/V7.3__Add_Columns_Tenant_Name_Product_Family_Name.sql
@@ -0,0 +1,7 @@
+use requestdb;
+
+ALTER TABLE infra_active_requests ADD COLUMN IF NOT EXISTS TENANT_NAME varchar(200);
+ALTER TABLE archived_infra_requests ADD COLUMN IF NOT EXISTS TENANT_NAME varchar(200);
+
+ALTER TABLE infra_active_requests ADD COLUMN IF NOT EXISTS PRODUCT_FAMILY_NAME varchar(200);
+ALTER TABLE archived_infra_requests ADD COLUMN IF NOT EXISTS PRODUCT_FAMILY_NAME varchar(200);
\ No newline at end of file
diff --git a/adapters/mso-requests-db-adapter/src/main/resources/db/migration/V8.1__Add_Orchestration_Task_Table.sql b/adapters/mso-requests-db-adapter/src/main/resources/db/migration/V8.1__Add_Orchestration_Task_Table.sql
new file mode 100644
index 0000000..0d7cb7a
--- /dev/null
+++ b/adapters/mso-requests-db-adapter/src/main/resources/db/migration/V8.1__Add_Orchestration_Task_Table.sql
@@ -0,0 +1,12 @@
+USE `requestdb`;
+
+CREATE TABLE `orchestration_task` (
+  `TASK_ID` varchar(200) NOT NULL,
+  `REQUEST_ID` varchar(200) NOT NULL,
+  `NAME` varchar(200) NOT NULL,
+  `CREATED_TIME` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
+  `STATUS` varchar(200) NOT NULL,
+  `IS_MANUAL` varchar(20) NOT NULL,
+  `PARAMS` varchar(20000) DEFAULT NULL,
+  PRIMARY KEY (`TASK_ID`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
diff --git a/adapters/mso-ve-vnfm-adapter/pom.xml b/adapters/mso-ve-vnfm-adapter/pom.xml
index 3518445..d58f183 100644
--- a/adapters/mso-ve-vnfm-adapter/pom.xml
+++ b/adapters/mso-ve-vnfm-adapter/pom.xml
@@ -30,6 +30,10 @@
       <artifactId>spring-boot-starter-web</artifactId>
     </dependency>
     <dependency>
+      <groupId>org.springframework.retry</groupId>
+      <artifactId>spring-retry</artifactId>
+    </dependency>
+    <dependency>
       <groupId>org.onap.so.adapters</groupId>
       <artifactId>mso-vnfm-adapter-ext-clients</artifactId>
       <version>${project.version}</version>
@@ -52,6 +56,10 @@
       <artifactId>jersey-hk2</artifactId>
     </dependency>
     <dependency>
+      <groupId>org.projectlombok</groupId>
+      <artifactId>lombok</artifactId>
+    </dependency>
+    <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-test</artifactId>
       <scope>test</scope>
@@ -59,10 +67,21 @@
   </dependencies>
 
   <build>
+    <finalName>${project.artifactId}-${project.version}</finalName>
     <plugins>
       <plugin>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-maven-plugin</artifactId>
+        <configuration>
+          <mainClass>org.onap.so.adapters.vevnfm.Application</mainClass>
+        </configuration>
+        <executions>
+          <execution>
+            <goals>
+              <goal>repackage</goal>
+            </goals>
+          </execution>
+        </executions>
       </plugin>
     </plugins>
   </build>
diff --git a/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/aai/AaiConnection.java b/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/aai/AaiConnection.java
index 188b671..a2bd603 100644
--- a/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/aai/AaiConnection.java
+++ b/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/aai/AaiConnection.java
@@ -22,11 +22,14 @@
 
 import java.util.List;
 import java.util.Optional;
+import org.apache.logging.log4j.util.Strings;
 import org.onap.aai.domain.yang.EsrSystemInfo;
 import org.onap.aai.domain.yang.EsrVnfm;
 import org.onap.aai.domain.yang.EsrVnfmList;
+import org.onap.so.adapters.vevnfm.exception.VeVnfmException;
 import org.onap.so.client.aai.AAIObjectType;
 import org.onap.so.client.aai.AAIResourcesClient;
+import org.onap.so.client.aai.entities.uri.AAIResourceUri;
 import org.onap.so.client.aai.entities.uri.AAIUriFactory;
 import org.onap.so.client.graphinventory.entities.uri.Depth;
 import org.slf4j.Logger;
@@ -40,10 +43,30 @@
 
     private static final int FIRST_INDEX = 0;
 
-    public EsrSystemInfo receiveVnfm() {
+    private static void isValid(final EsrSystemInfo info) throws VeVnfmException {
+        if (info == null || Strings.isBlank(info.getServiceUrl())) {
+            throw new VeVnfmException("No 'url' field in VNFM info");
+        }
+    }
+
+    public EsrSystemInfo receiveVnfm() throws VeVnfmException {
+        EsrSystemInfo info;
+
+        try {
+            info = receiveVnfmInternal();
+        } catch (Exception e) {
+            throw new VeVnfmException(e);
+        }
+
+        isValid(info);
+
+        return info;
+    }
+
+    private EsrSystemInfo receiveVnfmInternal() {
         final AAIResourcesClient resourcesClient = new AAIResourcesClient();
-        final Optional<EsrVnfmList> response =
-                resourcesClient.get(EsrVnfmList.class, AAIUriFactory.createResourceUri(AAIObjectType.VNFM_LIST));
+        final AAIResourceUri resourceUri = AAIUriFactory.createResourceUri(AAIObjectType.VNFM_LIST);
+        final Optional<EsrVnfmList> response = resourcesClient.get(EsrVnfmList.class, resourceUri);
 
         if (response.isPresent()) {
             final EsrVnfmList esrVnfmList = response.get();
diff --git a/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/configuration/StartupConfiguration.java b/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/configuration/StartupConfiguration.java
index f7b7283..ae330f7 100644
--- a/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/configuration/StartupConfiguration.java
+++ b/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/configuration/StartupConfiguration.java
@@ -20,7 +20,9 @@
 
 package org.onap.so.adapters.vevnfm.configuration;
 
+import org.onap.aai.domain.yang.EsrSystemInfo;
 import org.onap.so.adapters.vevnfm.service.StartupService;
+import org.onap.so.adapters.vevnfm.service.SubscriptionScheduler;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.context.event.ApplicationReadyEvent;
 import org.springframework.context.annotation.Configuration;
@@ -39,10 +41,14 @@
     @Autowired
     private StartupService startupService;
 
+    @Autowired
+    private SubscriptionScheduler subscriptionScheduler;
+
     @EventListener(ApplicationReadyEvent.class)
     public void onApplicationReadyEvent() throws Exception {
         if (!environment.acceptsProfiles(Profiles.of(TEST_PROFILE))) {
-            startupService.run();
+            final EsrSystemInfo info = startupService.receiveVnfm();
+            subscriptionScheduler.setInfo(info);
         }
     }
 }
diff --git a/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/controller/NotificationController.java b/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/controller/NotificationController.java
index 1882b4e..cb324c3 100644
--- a/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/controller/NotificationController.java
+++ b/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/controller/NotificationController.java
@@ -38,7 +38,7 @@
     @Autowired
     private DmaapService dmaapService;
 
-    @PostMapping("${notification.url}")
+    @PostMapping("${vnfm.notification}")
     public ResponseEntity receiveNotification(@RequestBody final VnfLcmOperationOccurrenceNotification notification) {
         logger.info("Notification received {}", notification);
         dmaapService.send(notification);
diff --git a/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/exception/VeVnfmException.java b/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/exception/VeVnfmException.java
index abd9ff9..a0c1c1e 100644
--- a/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/exception/VeVnfmException.java
+++ b/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/exception/VeVnfmException.java
@@ -25,4 +25,8 @@
     public VeVnfmException(final String message) {
         super(message);
     }
+
+    public VeVnfmException(final Throwable cause) {
+        super(cause);
+    }
 }
diff --git a/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/provider/AuthorizationHeadersProvider.java b/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/provider/AuthorizationHeadersProvider.java
index eca5240..838a67d 100644
--- a/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/provider/AuthorizationHeadersProvider.java
+++ b/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/provider/AuthorizationHeadersProvider.java
@@ -20,29 +20,20 @@
 
 package org.onap.so.adapters.vevnfm.provider;
 
-import java.util.List;
 import org.apache.logging.log4j.util.Strings;
 import org.onap.so.configuration.rest.BasicHttpHeadersProvider;
-import org.springframework.http.HttpHeaders;
 
 public class AuthorizationHeadersProvider extends BasicHttpHeadersProvider {
 
-    private List<String> previousAuthorization;
-
     public void addAuthorization(final String authorization) {
-        final HttpHeaders headers = getHttpHeaders();
-        previousAuthorization = headers.get(AUTHORIZATION_HEADER);
-        headers.set(AUTHORIZATION_HEADER, authorization);
-    }
-
-    public void resetPrevious() {
-        if (!isPreviousAuthorizationBlank()) {
-            getHttpHeaders().addAll(AUTHORIZATION_HEADER, previousAuthorization);
+        if (Strings.isBlank(authorization)) {
+            return;
         }
+
+        getHttpHeaders().set(AUTHORIZATION_HEADER, authorization);
     }
 
-    private boolean isPreviousAuthorizationBlank() {
-        return previousAuthorization == null || previousAuthorization.isEmpty()
-                || Strings.isBlank(previousAuthorization.get(0));
+    public void removeAuthorization() {
+        getHttpHeaders().remove(AUTHORIZATION_HEADER);
     }
 }
diff --git a/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/service/StartupService.java b/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/service/StartupService.java
index dfbafa2..3d21514 100644
--- a/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/service/StartupService.java
+++ b/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/service/StartupService.java
@@ -20,35 +20,43 @@
 
 package org.onap.so.adapters.vevnfm.service;
 
-import org.apache.logging.log4j.util.Strings;
 import org.onap.aai.domain.yang.EsrSystemInfo;
 import org.onap.so.adapters.vevnfm.aai.AaiConnection;
 import org.onap.so.adapters.vevnfm.exception.VeVnfmException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.retry.annotation.Backoff;
+import org.springframework.retry.annotation.EnableRetry;
+import org.springframework.retry.annotation.Recover;
+import org.springframework.retry.annotation.Retryable;
 import org.springframework.stereotype.Service;
 
 @Service
+@EnableRetry
 public class StartupService {
 
+    private static final Logger logger = LoggerFactory.getLogger(StartupService.class);
+
+    @Value("${vnfm.default-endpoint}")
+    private String vnfmDefaultEndpoint;
+
     @Autowired
     private AaiConnection aaiConnection;
 
-    @Autowired
-    private SubscriberService subscriberService;
-
-    private static void isValid(final EsrSystemInfo info) throws VeVnfmException {
-        if (Strings.isBlank(info.getServiceUrl())) {
-            throw new VeVnfmException("No 'url' field in VNFM info");
-        }
+    @Retryable(value = {VeVnfmException.class}, maxAttempts = 5, backoff = @Backoff(delay = 5000, multiplier = 10))
+    public EsrSystemInfo receiveVnfm() throws VeVnfmException {
+        return aaiConnection.receiveVnfm();
     }
 
-    public void run() throws Exception {
-        final EsrSystemInfo info = aaiConnection.receiveVnfm();
-        isValid(info);
-        final boolean done = subscriberService.subscribe(info);
+    @Recover
+    public EsrSystemInfo recoverReceiveVnfm(final Throwable e) {
+        logger.warn("Connection to AAI failed");
+        final EsrSystemInfo info = new EsrSystemInfo();
+        info.setServiceUrl(vnfmDefaultEndpoint);
+        logger.warn("This EsrSystemInfo is used by default: {}", info);
 
-        if (!done) {
-            throw new VeVnfmException("Could not subscribe to VNFM");
-        }
+        return info;
     }
 }
diff --git a/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/subscription/SubscribeSender.java b/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/service/SubscribeSender.java
similarity index 60%
rename from adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/subscription/SubscribeSender.java
rename to adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/service/SubscribeSender.java
index 8fdfb41..d01c3c8 100644
--- a/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/subscription/SubscribeSender.java
+++ b/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/service/SubscribeSender.java
@@ -18,9 +18,11 @@
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.so.adapters.vevnfm.subscription;
+package org.onap.so.adapters.vevnfm.service;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
 import org.onap.aai.domain.yang.EsrSystemInfo;
+import org.onap.so.adapters.vevnfm.exception.VeVnfmException;
 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.model.LccnSubscriptionRequest;
 import org.onap.so.rest.service.HttpRestServiceProvider;
 import org.slf4j.Logger;
@@ -29,11 +31,14 @@
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
-import org.springframework.stereotype.Component;
+import org.springframework.stereotype.Service;
+import lombok.ToString;
 
-@Component
+@Service
 public class SubscribeSender {
 
+    public static final String SLASH = "/";
+
     private static final Logger logger = LoggerFactory.getLogger(SubscribeSender.class);
 
     @Value("${vnfm.subscription}")
@@ -42,18 +47,37 @@
     @Autowired
     private HttpRestServiceProvider restProvider;
 
-    public boolean send(final EsrSystemInfo info, final LccnSubscriptionRequest request) {
-        final ResponseEntity<String> response = restProvider.postHttpRequest(request, getUrl(info), String.class);
+    public String send(final EsrSystemInfo info, final LccnSubscriptionRequest request) throws VeVnfmException {
+        final ResponseEntity<SubscribeToManoResponse> response =
+                restProvider.postHttpRequest(request, getUrl(info), SubscribeToManoResponse.class);
 
         final HttpStatus statusCode = response.getStatusCode();
-        final String body = response.getBody();
+        final SubscribeToManoResponse body = response.getBody();
 
         logger.info("The VNFM replied with the code {} and the body {}", statusCode, body);
 
-        return HttpStatus.CREATED == statusCode;
+        if (HttpStatus.CREATED != statusCode) {
+            throw new VeVnfmException("The status code was different than " + HttpStatus.CREATED);
+        }
+
+        return body.id;
+    }
+
+    public boolean check(final EsrSystemInfo info, final String id) {
+        final ResponseEntity<SubscribeToManoResponse> response =
+                restProvider.getHttpResponse(getUrl(info) + SLASH + id, SubscribeToManoResponse.class);
+        return response.getBody() != null && response.getBody().id.equals(id);
     }
 
     private String getUrl(final EsrSystemInfo info) {
         return info.getServiceUrl() + vnfmSubscription;
     }
+
+    @ToString
+    static class SubscribeToManoResponse {
+        @JsonProperty("id")
+        String id;
+        @JsonProperty("callbackUri")
+        String callbackUri;
+    }
 }
diff --git a/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/service/SubscriberService.java b/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/service/SubscriberService.java
index 0e77ce4..9760584 100644
--- a/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/service/SubscriberService.java
+++ b/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/service/SubscriberService.java
@@ -22,9 +22,10 @@
 
 import com.squareup.okhttp.Credentials;
 import java.util.Collections;
+import org.apache.logging.log4j.util.Strings;
 import org.onap.aai.domain.yang.EsrSystemInfo;
+import org.onap.so.adapters.vevnfm.exception.VeVnfmException;
 import org.onap.so.adapters.vevnfm.provider.AuthorizationHeadersProvider;
-import org.onap.so.adapters.vevnfm.subscription.SubscribeSender;
 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.model.LccnSubscriptionRequest;
 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.model.SubscriptionsAuthentication;
 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.model.SubscriptionsAuthenticationParamsBasic;
@@ -35,16 +36,11 @@
 @Service
 public class SubscriberService {
 
-    private static final char COLON = ':';
+    @Value("${vevnfmadapter.endpoint}")
+    private String endpoint;
 
-    @Value("${system.url}")
-    private String systemUrl;
-
-    @Value("${server.port}")
-    private String serverPort;
-
-    @Value("${notification.url}")
-    private String notificationUrl;
+    @Value("${vnfm.notification}")
+    private String notification;
 
     @Value("${spring.security.usercredentials[0].username}")
     private String username;
@@ -59,16 +55,37 @@
     private SubscribeSender sender;
 
     private static String getAuthorization(final EsrSystemInfo info) {
-        return Credentials.basic(info.getUserName(), info.getPassword());
+        if (info == null) {
+            return null;
+        }
+
+        final String userName = info.getUserName();
+
+        if (Strings.isBlank(userName)) {
+            return null;
+        }
+
+        final String password = info.getPassword();
+        return Credentials.basic(userName, password);
     }
 
-    public boolean subscribe(final EsrSystemInfo info) {
+    public String subscribe(final EsrSystemInfo info) throws VeVnfmException {
         try {
             headersProvider.addAuthorization(getAuthorization(info));
             final LccnSubscriptionRequest request = createRequest();
             return sender.send(info, request);
+        } catch (Exception e) {
+            throw new VeVnfmException(e);
         } finally {
-            headersProvider.resetPrevious();
+            headersProvider.removeAuthorization();
+        }
+    }
+
+    public boolean checkSubscription(final EsrSystemInfo info, final String id) throws VeVnfmException {
+        try {
+            return sender.check(info, id);
+        } catch (Exception e) {
+            throw new VeVnfmException(e);
         }
     }
 
@@ -87,6 +104,6 @@
     }
 
     private String getCallbackUri() {
-        return systemUrl + COLON + serverPort + notificationUrl;
+        return endpoint + notification;
     }
 }
diff --git a/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/service/SubscriptionScheduler.java b/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/service/SubscriptionScheduler.java
new file mode 100644
index 0000000..1642743
--- /dev/null
+++ b/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/service/SubscriptionScheduler.java
@@ -0,0 +1,71 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SO
+ * ================================================================================
+ * Copyright (C) 2020 Samsung. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.adapters.vevnfm.service;
+
+import org.onap.aai.domain.yang.EsrSystemInfo;
+import org.onap.so.adapters.vevnfm.exception.VeVnfmException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Service;
+
+@Service
+@EnableScheduling
+public class SubscriptionScheduler {
+
+    private static final Logger logger = LoggerFactory.getLogger(SubscriptionScheduler.class);
+
+    @Autowired
+    private SubscriberService subscriberService;
+
+    private String subscribedId;
+
+    private EsrSystemInfo info;
+
+    public void setInfo(final EsrSystemInfo info) {
+        this.info = info;
+    }
+
+    @Scheduled(fixedRate = 5000, initialDelay = 2000)
+    void subscribeTask() throws VeVnfmException {
+        if (info != null) {
+            if (subscribedId == null) {
+                logger.info("Starting subscribe task");
+                subscribedId = subscriberService.subscribe(info);
+            }
+        }
+    }
+
+    @Scheduled(fixedRate = 20000)
+    void checkSubscribeTask() throws VeVnfmException {
+        if (info != null) {
+            if (subscribedId != null) {
+                logger.info("Checking subscription: {}", subscribedId);
+                if (!subscriberService.checkSubscription(info, subscribedId)) {
+                    logger.info("Subscription {} not available", subscribedId);
+                    subscribedId = null;
+                }
+            }
+        }
+    }
+}
diff --git a/adapters/mso-ve-vnfm-adapter/src/main/resources/application.yaml b/adapters/mso-ve-vnfm-adapter/src/main/resources/application.yaml
index 35871c5..72198b8 100644
--- a/adapters/mso-ve-vnfm-adapter/src/main/resources/application.yaml
+++ b/adapters/mso-ve-vnfm-adapter/src/main/resources/application.yaml
@@ -15,13 +15,10 @@
 # limitations under the License.
 
 server:
-  port: 8080
+  port: 9098
 
-system:
-  url: http://localhost
-
-notification:
-  url: /lcm/v1/vnf/instances/notifications
+vevnfmadapter:
+  endpoint: http://so-ve-vnfm-adapter.onap:9098
 
 mso:
   key: 07a7159d3bf51a0e53be7a8f89699be7
@@ -31,10 +28,12 @@
   auth: 75C4483F9C05E2C33A8602635FA532397EC44AB667A2B64DED4FEE08DD932F2E3C1FEE
 
 vnfm:
+  default-endpoint: https://so-vnfm-simulator.onap:9093
   subscription: /vnflcm/v1/subscriptions
+  notification: /lcm/v1/vnf/instances/notifications
 
 dmaap:
-  endpoint: http://message-router:30227
+  endpoint: http://message-router.onap:30227
   topic: /events/unauthenticated.DCAE_CL_OUTPUT
 
 spring:
diff --git a/adapters/mso-ve-vnfm-adapter/src/test/java/org/onap/so/adapters/vevnfm/controller/NotificationControllerTest.java b/adapters/mso-ve-vnfm-adapter/src/test/java/org/onap/so/adapters/vevnfm/controller/NotificationControllerTest.java
index 57638a1..974e6ec 100644
--- a/adapters/mso-ve-vnfm-adapter/src/test/java/org/onap/so/adapters/vevnfm/controller/NotificationControllerTest.java
+++ b/adapters/mso-ve-vnfm-adapter/src/test/java/org/onap/so/adapters/vevnfm/controller/NotificationControllerTest.java
@@ -53,8 +53,8 @@
     private static final String MINIMAL_JSON_CONTENT = "{}";
     private static final int ZERO = 0;
 
-    @Value("${notification.url}")
-    private String notificationUrl;
+    @Value("${vnfm.notification}")
+    private String notification;
 
     @Autowired
     private WebApplicationContext webApplicationContext;
@@ -74,7 +74,7 @@
     @Test
     public void testReceiveNotification() throws Exception {
         // given
-        final MockHttpServletRequestBuilder request = MockMvcRequestBuilders.post(notificationUrl)
+        final MockHttpServletRequestBuilder request = MockMvcRequestBuilders.post(notification)
                 .contentType(MediaType.APPLICATION_JSON).content(MINIMAL_JSON_CONTENT);
 
         mockRestServer.expect(once(), anything()).andRespond(withSuccess());
diff --git a/adapters/mso-ve-vnfm-adapter/src/test/java/org/onap/so/adapters/vevnfm/provider/AuthorizationHeadersProviderTest.java b/adapters/mso-ve-vnfm-adapter/src/test/java/org/onap/so/adapters/vevnfm/provider/AuthorizationHeadersProviderTest.java
new file mode 100644
index 0000000..f9ae427
--- /dev/null
+++ b/adapters/mso-ve-vnfm-adapter/src/test/java/org/onap/so/adapters/vevnfm/provider/AuthorizationHeadersProviderTest.java
@@ -0,0 +1,86 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SO
+ * ================================================================================
+ * Copyright (C) 2020 Samsung. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.adapters.vevnfm.provider;
+
+import static org.junit.Assert.*;
+import static org.onap.so.configuration.rest.BasicHttpHeadersProvider.AUTHORIZATION_HEADER;
+import org.junit.Test;
+import org.springframework.http.HttpHeaders;
+
+public class AuthorizationHeadersProviderTest {
+
+    private static final String AUTHORIZATION_EXAMPLE = "authorization";
+    private static final String BLANK_EXAMPLE = "\t\n";
+    private static final String EMPTY = "";
+
+    private final AuthorizationHeadersProvider provider = new AuthorizationHeadersProvider();
+
+    @Test
+    public void testSuccessValidAuthorizationAndRemoval() {
+        final HttpHeaders headers = provider.getHttpHeaders();
+        final int size = headers.size();
+
+        provider.addAuthorization(AUTHORIZATION_EXAMPLE);
+        assertEquals(size + 1, headers.size());
+        assertTrue(headers.containsKey(AUTHORIZATION_HEADER));
+
+        provider.removeAuthorization();
+        assertEquals(size, headers.size());
+        assertFalse(headers.containsKey(AUTHORIZATION_HEADER));
+    }
+
+    @Test
+    public void testBlankAuthorization() {
+        final HttpHeaders headers = provider.getHttpHeaders();
+        final int size = headers.size();
+
+        provider.addAuthorization(BLANK_EXAMPLE);
+        assertEquals(size, headers.size());
+    }
+
+    @Test
+    public void testEmptyAuthorization() {
+        final HttpHeaders headers = provider.getHttpHeaders();
+        final int size = headers.size();
+
+        provider.addAuthorization(EMPTY);
+        assertEquals(size, headers.size());
+    }
+
+    @Test
+    public void testNullAuthorization() {
+        final HttpHeaders headers = provider.getHttpHeaders();
+        final int size = headers.size();
+
+        provider.addAuthorization(null);
+        assertEquals(size, headers.size());
+    }
+
+    @Test
+    public void testRemoveAuthorization() {
+        final HttpHeaders headers = provider.getHttpHeaders();
+        final int size = headers.size();
+
+        provider.removeAuthorization();
+        provider.removeAuthorization();
+        assertEquals(size, headers.size());
+    }
+}
diff --git a/adapters/mso-ve-vnfm-adapter/src/test/java/org/onap/so/adapters/vevnfm/service/StartupServiceTest.java b/adapters/mso-ve-vnfm-adapter/src/test/java/org/onap/so/adapters/vevnfm/service/StartupServiceTest.java
index 0f9c23e..d1d34a7 100644
--- a/adapters/mso-ve-vnfm-adapter/src/test/java/org/onap/so/adapters/vevnfm/service/StartupServiceTest.java
+++ b/adapters/mso-ve-vnfm-adapter/src/test/java/org/onap/so/adapters/vevnfm/service/StartupServiceTest.java
@@ -20,7 +20,9 @@
 
 package org.onap.so.adapters.vevnfm.service;
 
-import static org.mockito.Mockito.*;
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
@@ -30,62 +32,34 @@
 import org.mockito.junit.MockitoJUnitRunner;
 import org.onap.aai.domain.yang.EsrSystemInfo;
 import org.onap.so.adapters.vevnfm.aai.AaiConnection;
-import org.onap.so.adapters.vevnfm.exception.VeVnfmException;
 
 @RunWith(MockitoJUnitRunner.class)
 public class StartupServiceTest {
 
-    @Mock
-    private AaiConnection aaiConnection;
-
-    @Mock
-    private SubscriberService subscriberService;
-
-    @InjectMocks
-    private StartupService startupService;
+    private static final String URL = "rt";
 
     @Rule
     public ExpectedException thrown = ExpectedException.none();
 
+    @Mock
+    private AaiConnection aaiConnection;
+
+    @InjectMocks
+    private StartupService startupService;
+
     @Test
     public void testSuccess() throws Exception {
         // given
         final EsrSystemInfo info = new EsrSystemInfo();
-        info.setServiceUrl("lh");
+        info.setServiceUrl(URL);
+
         when(aaiConnection.receiveVnfm()).thenReturn(info);
-        when(subscriberService.subscribe(info)).thenReturn(true);
 
         // when
-        startupService.run();
+        final EsrSystemInfo systemInfo = startupService.receiveVnfm();
 
         // then
-        verify(aaiConnection, times(1)).receiveVnfm();
-        verify(subscriberService, times(1)).subscribe(info);
-    }
-
-    @Test
-    public void testFailureAai() throws Exception {
-        // given
-        final EsrSystemInfo info = new EsrSystemInfo();
-        when(aaiConnection.receiveVnfm()).thenReturn(info);
-
-        thrown.expect(VeVnfmException.class);
-
-        // when
-        startupService.run();
-    }
-
-    @Test
-    public void testFailureSubscriber() throws Exception {
-        // given
-        final EsrSystemInfo info = new EsrSystemInfo();
-        info.setServiceUrl("lh");
-        when(aaiConnection.receiveVnfm()).thenReturn(info);
-        when(subscriberService.subscribe(info)).thenReturn(false);
-
-        thrown.expect(VeVnfmException.class);
-
-        // when
-        startupService.run();
+        verify(aaiConnection).receiveVnfm();
+        assertEquals(info, systemInfo);
     }
 }
diff --git a/adapters/mso-ve-vnfm-adapter/src/test/java/org/onap/so/adapters/vevnfm/subscription/SubscribeSenderTest.java b/adapters/mso-ve-vnfm-adapter/src/test/java/org/onap/so/adapters/vevnfm/service/SubscribeSenderTest.java
similarity index 85%
rename from adapters/mso-ve-vnfm-adapter/src/test/java/org/onap/so/adapters/vevnfm/subscription/SubscribeSenderTest.java
rename to adapters/mso-ve-vnfm-adapter/src/test/java/org/onap/so/adapters/vevnfm/service/SubscribeSenderTest.java
index d1fda0e..b7f1f98 100644
--- a/adapters/mso-ve-vnfm-adapter/src/test/java/org/onap/so/adapters/vevnfm/subscription/SubscribeSenderTest.java
+++ b/adapters/mso-ve-vnfm-adapter/src/test/java/org/onap/so/adapters/vevnfm/service/SubscribeSenderTest.java
@@ -18,9 +18,10 @@
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.so.adapters.vevnfm.subscription;
+package org.onap.so.adapters.vevnfm.service;
 
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertEquals;
+import static org.onap.so.adapters.vevnfm.service.SubscribeSender.SLASH;
 import static org.springframework.http.HttpHeaders.CONTENT_TYPE;
 import static org.springframework.test.web.client.ExpectedCount.once;
 import static org.springframework.test.web.client.match.MockRestRequestMatchers.*;
@@ -33,6 +34,7 @@
 import org.junit.runner.RunWith;
 import org.onap.aai.domain.yang.EsrSystemInfo;
 import org.onap.so.adapters.vevnfm.configuration.StartupConfiguration;
+import org.onap.so.adapters.vevnfm.exception.VeVnfmException;
 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.model.LccnSubscriptionRequest;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
@@ -50,8 +52,9 @@
 @ActiveProfiles(StartupConfiguration.TEST_PROFILE)
 public class SubscribeSenderTest {
 
-    private static final String SLASH = "/";
-    private static final String MINIMAL_JSON_CONTENT = "{}";
+    private static final String URL = "lh";
+    private static final String ID = "1a2s3d4f";
+    private static final String JSON = "{\"id\":\"" + ID + "\"}";
 
     private static final Gson GSON;
 
@@ -78,22 +81,22 @@
     }
 
     @Test
-    public void testSuccess() {
+    public void testSuccess() throws VeVnfmException {
         // given
         final EsrSystemInfo info = new EsrSystemInfo();
-        info.setServiceUrl("lh");
+        info.setServiceUrl(URL);
         final LccnSubscriptionRequest request = new LccnSubscriptionRequest();
 
         mockRestServer.expect(once(), requestTo(SLASH + info.getServiceUrl() + vnfmSubscription))
                 .andExpect(header(CONTENT_TYPE, CoreMatchers.containsString(MediaType.APPLICATION_JSON_VALUE)))
                 .andExpect(method(HttpMethod.POST)).andExpect(content().json(GSON.toJson(request)))
-                .andRespond(withStatus(HttpStatus.CREATED).body(MINIMAL_JSON_CONTENT));
+                .andRespond(withStatus(HttpStatus.CREATED).body(JSON).contentType(MediaType.APPLICATION_JSON));
 
         // when
-        final boolean done = sender.send(info, request);
+        final String id = sender.send(info, request);
 
         // then
-        assertTrue(done);
         mockRestServer.verify();
+        assertEquals(ID, id);
     }
 }
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-adapter-api/src/main/resources/ETSI-Catalog-Notification-API.json b/adapters/mso-vnfm-adapter/mso-vnfm-adapter-api/src/main/resources/ETSI-Catalog-Notification-API.json
index 6f9b2c3..6db5443 100644
--- a/adapters/mso-vnfm-adapter/mso-vnfm-adapter-api/src/main/resources/ETSI-Catalog-Notification-API.json
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-adapter-api/src/main/resources/ETSI-Catalog-Notification-API.json
@@ -6,18 +6,26 @@
     "version": "v1"
   },
   "host": "127.0.0.1:8000",
-  "schemes": ["http"],
+  "schemes": [
+    "http"
+  ],
   "basePath": "/",
-  "consumes": ["application/json"],
-  "produces": ["application/json"],
+  "consumes": [
+    "application/json"
+  ],
+  "produces": [
+    "application/json"
+  ],
   "securityDefinitions": {
     "Basic": {
       "type": "basic"
     }
   },
-  "security": [{
-    "Basic": []
-  }],
+  "security": [
+    {
+      "Basic": []
+    }
+  ],
   "paths": {
     "/URI-is-provided-by-the-client-when-creating-the-subscription-VnfPackageChangeNotification": {
       "get": {
@@ -35,25 +43,31 @@
             }
           }
         },
-        "tags": ["VNF Package Management interface"]
+        "tags": [
+          "VNF Package Management interface"
+        ]
       },
       "post": {
         "operationId": "URI-is-provided-by-the-client-when-creating-the-subscription-VnfPackageChangeNotification_create",
         "description": "",
-        "parameters": [{
-          "name": "data",
-          "in": "body",
-          "required": true,
-          "schema": {
-            "$ref": "#/definitions/PkgChangeNotification"
+        "parameters": [
+          {
+            "name": "data",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/PkgChangeNotification"
+            }
           }
-        }],
+        ],
         "responses": {
           "204": {
             "description": ""
           }
         },
-        "tags": ["VNF Package Management interface"]
+        "tags": [
+          "VNF Package Management interface"
+        ]
       },
       "parameters": []
     },
@@ -73,25 +87,31 @@
             }
           }
         },
-        "tags": ["VNF Package Management interface"]
+        "tags": [
+          "VNF Package Management interface"
+        ]
       },
       "post": {
         "operationId": "URI-is-provided-by-the-client-when-creating-the-subscription-VnfPackageOnboardingNotification_create",
         "description": "",
-        "parameters": [{
-          "name": "data",
-          "in": "body",
-          "required": true,
-          "schema": {
-            "$ref": "#/definitions/PkgOnboardingNotification"
+        "parameters": [
+          {
+            "name": "data",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/PkgOnboardingNotification"
+            }
           }
-        }],
+        ],
         "responses": {
           "204": {
             "description": ""
           }
         },
-        "tags": ["VNF Package Management interface"]
+        "tags": [
+          "VNF Package Management interface"
+        ]
       },
       "parameters": []
     }
@@ -100,7 +120,9 @@
     "NOTIFICATION_LINKSERIALIZER": {
       "title": "Vnfpackage",
       "description": "Link to the resource representing the VNF package to which the notified change applies.",
-      "required": ["href"],
+      "required": [
+        "href"
+      ],
       "type": "object",
       "properties": {
         "href": {
@@ -125,7 +147,16 @@
       }
     },
     "PkgChangeNotification": {
-      "required": ["id", "notificationType", "timeStamp", "subscriptionId", "vnfPkgId", "changeType", "vnfdId", "_links"],
+      "required": [
+        "id",
+        "notificationType",
+        "timeStamp",
+        "subscriptionId",
+        "vnfPkgId",
+        "changeType",
+        "vnfdId",
+        "_links"
+      ],
       "type": "object",
       "properties": {
         "id": {
@@ -138,7 +169,9 @@
           "title": "Notificationtype",
           "description": "Discriminator for the different notification types.",
           "type": "string",
-          "enum": ["VnfPackageChangeNotification"]
+          "enum": [
+            "VnfPackageChangeNotification"
+          ]
         },
         "timeStamp": {
           "title": "Timestamp",
@@ -156,19 +189,25 @@
           "title": "Vnfpkgid",
           "description": "Identifier of the VNF package.",
           "type": "string",
-          "format": "uuid"
+          "minLength": 1
         },
         "changeType": {
           "title": "Changetype",
           "description": "The type of change of the VNF package.",
           "type": "string",
-          "enum": ["OP_STATE_CHANGE", "PKG_DELETE"]
+          "enum": [
+            "OP_STATE_CHANGE",
+            "PKG_DELETE"
+          ]
         },
         "operationalState": {
           "title": "Operationalstate",
           "description": "New operational state of the VNF package.",
           "type": "string",
-          "enum": ["ENABLED", "DISABLED"]
+          "enum": [
+            "ENABLED",
+            "DISABLED"
+          ]
         },
         "vnfdId": {
           "title": "Vnfdid",
@@ -182,7 +221,15 @@
       }
     },
     "PkgOnboardingNotification": {
-      "required": ["id", "notificationType", "subscriptionId", "timeStamp", "vnfPkgId", "vnfdId", "_links"],
+      "required": [
+        "id",
+        "notificationType",
+        "subscriptionId",
+        "timeStamp",
+        "vnfPkgId",
+        "vnfdId",
+        "_links"
+      ],
       "type": "object",
       "properties": {
         "id": {
@@ -195,7 +242,9 @@
           "title": "Notificationtype",
           "description": "Discriminator for the different notification types.",
           "type": "string",
-          "enum": ["VnfPackageOnboardingNotification"]
+          "enum": [
+            "VnfPackageOnboardingNotification"
+          ]
         },
         "subscriptionId": {
           "title": "Subscriptionid",
@@ -213,13 +262,13 @@
           "title": "Vnfpkgid",
           "description": "Identifier of the VNF package.",
           "type": "string",
-          "format": "uuid"
+          "minLength": 1
         },
         "vnfdId": {
           "title": "Vnfdid",
           "description": "This identifier, which is managed by the VNF provider, identifies the VNF package and the VNFD in a globally unique way.",
           "type": "string",
-          "format": "uuid"
+          "minLength": 1
         },
         "_links": {
           "$ref": "#/definitions/PkgmLinks"
@@ -227,4 +276,4 @@
       }
     }
   }
-}
\ No newline at end of file
+}
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/Constants.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/Constants.java
index fb32fb9..d798267 100644
--- a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/Constants.java
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/Constants.java
@@ -32,8 +32,12 @@
     public static final String SERVICE_VERSION = "v1";
     public static final String BASE_URL = "/so/" + SERVICE_NAME + "/" + SERVICE_VERSION;
     public static final String PACKAGE_MANAGEMENT_BASE_URL = BASE_URL + "/vnfpkgm/v1";
-    public static final String ETSI_SUBSCRIPTION_NOTIFICATION_BASE_URL = BASE_URL + "/etsicatalogmanager/notification";
-    public static final String ETSI_SUBSCRIPTION_NOTIFICATION_CONTROLLER_BASE_URL = BASE_URL + "/etsicatalogmanager";
+    public static final String ETSI_CATALOG_MANAGER_BASE_ENDPOINT = "/etsicatalogmanager";
+    public static final String ETSI_SUBSCRIPTION_NOTIFICATION_ENDPOINT = "/notification";
+    public static final String ETSI_SUBSCRIPTION_NOTIFICATION_CONTROLLER_BASE_URL =
+            BASE_URL + ETSI_CATALOG_MANAGER_BASE_ENDPOINT;
+    public static final String ETSI_SUBSCRIPTION_NOTIFICATION_BASE_URL =
+            ETSI_SUBSCRIPTION_NOTIFICATION_CONTROLLER_BASE_URL + ETSI_SUBSCRIPTION_NOTIFICATION_ENDPOINT;
     public static final String APPLICATION_ZIP = "application/zip";
     public static final String OPERATION_NOTIFICATION_ENDPOINT = "/lcn/VnfLcmOperationOccurrenceNotification";
 
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/MessageConverterConfiguration.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/MessageConverterConfiguration.java
index 61d5adf..87e8bb4 100644
--- a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/MessageConverterConfiguration.java
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/MessageConverterConfiguration.java
@@ -23,6 +23,8 @@
 import com.google.gson.GsonBuilder;
 import java.util.ArrayList;
 import java.util.Collection;
+import org.onap.so.adapters.vnfmadapter.converters.etsicatalog.sol003.PkgChangeNotificationConverter;
+import org.onap.so.adapters.vnfmadapter.converters.etsicatalog.sol003.PkgOnboardingNotificationConverter;
 import org.onap.so.adapters.vnfmadapter.converters.etsicatalog.sol003.VnfPkgInfoConverter;
 import org.onap.so.adapters.vnfmadapter.converters.sol003.etsicatalog.PkgmSubscriptionRequestConverter;
 import org.onap.so.adapters.vnfmadapter.oauth.OAuth2AccessTokenAdapter;
@@ -46,6 +48,8 @@
         final DefaultConversionService service = new DefaultConversionService();
         service.addConverter(new VnfPkgInfoConverter());
         service.addConverter(new PkgmSubscriptionRequestConverter());
+        service.addConverter(new PkgChangeNotificationConverter());
+        service.addConverter(new PkgOnboardingNotificationConverter());
         return service;
     }
 
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/VnfmBasicHttpSecurityConfigurer.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/VnfmBasicHttpSecurityConfigurer.java
index 1e0a18a..f181505 100644
--- a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/VnfmBasicHttpSecurityConfigurer.java
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/VnfmBasicHttpSecurityConfigurer.java
@@ -9,9 +9,9 @@
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -35,7 +35,6 @@
 /**
  * @author Waqas Ikram (waqas.ikram@est.tech)
  * @author Gareth Roper (gareth.roper@est.tech)
- *
  */
 @Primary
 @Component
@@ -53,10 +52,10 @@
             http.csrf().disable().authorizeRequests().anyRequest().permitAll();
         } else {
             http.csrf().disable().authorizeRequests().antMatchers("/manage/health", "/manage/info").permitAll()
-                    .antMatchers(HttpMethod.GET, "/etsi/subscription/notification").permitAll().antMatchers("/**")
+                    .antMatchers(HttpMethod.GET, Constants.ETSI_SUBSCRIPTION_NOTIFICATION_BASE_URL).permitAll()
+                    .antMatchers("/**")
                     .hasAnyRole(StringUtils.collectionToDelimitedString(soUserCredentialConfiguration.getRoles(), ","))
                     .and().httpBasic();
-
         }
     }
 }
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/converters/etsicatalog/sol003/AbstractPkgNotificationConverter.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/converters/etsicatalog/sol003/AbstractPkgNotificationConverter.java
new file mode 100644
index 0000000..e1c4309
--- /dev/null
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/converters/etsicatalog/sol003/AbstractPkgNotificationConverter.java
@@ -0,0 +1,56 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2020 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.adapters.vnfmadapter.converters.etsicatalog.sol003;
+
+import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.notification.model.PkgmLinks;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.notification.model.URIisprovidedbytheclientwhencreatingthesubscriptionVnfPackageOnboardingNotificationLinks;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.notification.model.URIisprovidedbytheclientwhencreatingthesubscriptionVnfPackageOnboardingNotificationLinksVnfPackage;
+
+/**
+ * A base class that can be extended by classes for converting Etsi Catalog Manager Pkg Notification classes. Provides
+ * common methods that will be useful to those classes.
+ *
+ * @author andrew.a.lamb@est.tech
+ */
+abstract public class AbstractPkgNotificationConverter {
+
+    protected URIisprovidedbytheclientwhencreatingthesubscriptionVnfPackageOnboardingNotificationLinks convert(
+            final PkgmLinks pkgmLinks) {
+        final URIisprovidedbytheclientwhencreatingthesubscriptionVnfPackageOnboardingNotificationLinksVnfPackage linksVnfPackage =
+                new URIisprovidedbytheclientwhencreatingthesubscriptionVnfPackageOnboardingNotificationLinksVnfPackage();
+        if (pkgmLinks.getVnfPackage() != null) {
+            linksVnfPackage.setHref(pkgmLinks.getVnfPackage().getHref());
+        }
+
+        final URIisprovidedbytheclientwhencreatingthesubscriptionVnfPackageOnboardingNotificationLinksVnfPackage linksSubscription =
+                new URIisprovidedbytheclientwhencreatingthesubscriptionVnfPackageOnboardingNotificationLinksVnfPackage();
+        if (pkgmLinks.getSubscription() != null) {
+            linksSubscription.setHref(pkgmLinks.getSubscription().getHref());
+        }
+
+        final URIisprovidedbytheclientwhencreatingthesubscriptionVnfPackageOnboardingNotificationLinks links =
+                new URIisprovidedbytheclientwhencreatingthesubscriptionVnfPackageOnboardingNotificationLinks();
+        links.setVnfPackage(linksVnfPackage);
+        links.setSubscription(linksSubscription);
+        return links;
+    }
+
+}
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/converters/etsicatalog/sol003/PkgChangeNotificationConverter.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/converters/etsicatalog/sol003/PkgChangeNotificationConverter.java
new file mode 100644
index 0000000..8c41686
--- /dev/null
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/converters/etsicatalog/sol003/PkgChangeNotificationConverter.java
@@ -0,0 +1,79 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2020 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.adapters.vnfmadapter.converters.etsicatalog.sol003;
+
+import static org.slf4j.LoggerFactory.getLogger;
+import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.notification.model.PkgChangeNotification;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.notification.model.VnfPackageChangeNotification;
+import org.slf4j.Logger;
+import org.springframework.core.convert.converter.Converter;
+import org.springframework.stereotype.Service;
+
+/**
+ * Converter to convert from an Etsi Catalog Manager {@link PkgChangeNotification} Object to its equivalent SOL003
+ * {@link VnfPackageChangeNotification} Object
+ *
+ * @author andrew.a.lamb@est.tech
+ */
+@Service
+public class PkgChangeNotificationConverter extends AbstractPkgNotificationConverter
+        implements Converter<PkgChangeNotification, VnfPackageChangeNotification> {
+    private static final Logger logger = getLogger(PkgChangeNotificationConverter.class);
+
+    /**
+     * Convert a {@link PkgChangeNotification} Object to an {@link VnfPackageChangeNotification} Object
+     * 
+     * @param pkgChangeNotification The PkgChangeNotification Object to Convert
+     * @return The Converted VnfPackageChangeNotification Object
+     */
+    @Override
+    public VnfPackageChangeNotification convert(final PkgChangeNotification pkgChangeNotification) {
+        logger.info("Converting PkgChangeNotification\n{}", pkgChangeNotification.toString());
+        final VnfPackageChangeNotification vnfPackageChangeNotification = new VnfPackageChangeNotification();
+        vnfPackageChangeNotification.setId(pkgChangeNotification.getId());
+
+        if (pkgChangeNotification.getNotificationType() != null) {
+            vnfPackageChangeNotification.setNotificationType(VnfPackageChangeNotification.NotificationTypeEnum
+                    .fromValue(pkgChangeNotification.getNotificationType().getValue()));
+        }
+
+        vnfPackageChangeNotification.setSubscriptionId(pkgChangeNotification.getSubscriptionId());
+        vnfPackageChangeNotification.setTimeStamp(pkgChangeNotification.getTimeStamp());
+        vnfPackageChangeNotification.setVnfPkgId(pkgChangeNotification.getVnfPkgId());
+
+        vnfPackageChangeNotification.setVnfdId(pkgChangeNotification.getVnfdId());
+
+        if (pkgChangeNotification.getChangeType() != null) {
+            vnfPackageChangeNotification.setChangeType(VnfPackageChangeNotification.ChangeTypeEnum
+                    .fromValue(pkgChangeNotification.getChangeType().getValue()));
+        }
+
+        if (pkgChangeNotification.getOperationalState() != null) {
+            vnfPackageChangeNotification.setOperationalState(VnfPackageChangeNotification.OperationalStateEnum
+                    .fromValue(pkgChangeNotification.getOperationalState().getValue()));
+        }
+
+        vnfPackageChangeNotification.setLinks(convert((pkgChangeNotification.getLinks())));
+
+        return vnfPackageChangeNotification;
+    }
+
+}
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/converters/etsicatalog/sol003/PkgOnboardingNotificationConverter.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/converters/etsicatalog/sol003/PkgOnboardingNotificationConverter.java
new file mode 100644
index 0000000..836acb6
--- /dev/null
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/converters/etsicatalog/sol003/PkgOnboardingNotificationConverter.java
@@ -0,0 +1,69 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2020 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.adapters.vnfmadapter.converters.etsicatalog.sol003;
+
+import static org.slf4j.LoggerFactory.getLogger;
+import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.notification.model.PkgOnboardingNotification;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.notification.model.VnfPackageOnboardingNotification;
+import org.slf4j.Logger;
+import org.springframework.core.convert.converter.Converter;
+import org.springframework.stereotype.Service;
+
+/**
+ * Converter to convert from an Etsi Catalog Manager {@link PkgOnboardingNotification} Object to its equivalent SOL003
+ * {@link VnfPackageOnboardingNotification} Object
+ *
+ * @author andrew.a.lamb@est.tech
+ */
+@Service
+public class PkgOnboardingNotificationConverter extends AbstractPkgNotificationConverter
+        implements Converter<PkgOnboardingNotification, VnfPackageOnboardingNotification> {
+    private static final Logger logger = getLogger(PkgOnboardingNotificationConverter.class);
+
+    /**
+     * Convert a {@link PkgOnboardingNotification} Object to an {@link VnfPackageOnboardingNotification} Object
+     * 
+     * @param pkgOnboardingNotification The PkgOnboardingNotification Object to Convert
+     * @return The Converted VnfPackageOnboardingNotification Object
+     */
+    @Override
+    public VnfPackageOnboardingNotification convert(final PkgOnboardingNotification pkgOnboardingNotification) {
+        logger.info("Converting PkgChangeNotification\n{}", pkgOnboardingNotification.toString());
+        final VnfPackageOnboardingNotification vnfPackageOnboardingNotification =
+                new VnfPackageOnboardingNotification();
+        vnfPackageOnboardingNotification.setId(pkgOnboardingNotification.getId());
+
+        if (pkgOnboardingNotification.getNotificationType() != null) {
+            vnfPackageOnboardingNotification.setNotificationType(VnfPackageOnboardingNotification.NotificationTypeEnum
+                    .fromValue(pkgOnboardingNotification.getNotificationType().getValue()));
+        }
+
+        vnfPackageOnboardingNotification.setSubscriptionId(pkgOnboardingNotification.getSubscriptionId());
+        vnfPackageOnboardingNotification.setTimeStamp(pkgOnboardingNotification.getTimeStamp());
+        vnfPackageOnboardingNotification.setVnfPkgId(pkgOnboardingNotification.getVnfPkgId());
+        vnfPackageOnboardingNotification.setVnfdId(pkgOnboardingNotification.getVnfdId());
+
+        vnfPackageOnboardingNotification.setLinks(convert((pkgOnboardingNotification.getLinks())));
+
+        return vnfPackageOnboardingNotification;
+    }
+
+}
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/converters/sol003/etsicatalog/PkgmSubscriptionRequestConverter.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/converters/sol003/etsicatalog/PkgmSubscriptionRequestConverter.java
index c6d51c9..d0fd4c9 100644
--- a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/converters/sol003/etsicatalog/PkgmSubscriptionRequestConverter.java
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/converters/sol003/etsicatalog/PkgmSubscriptionRequestConverter.java
@@ -20,14 +20,10 @@
 
 package org.onap.so.adapters.vnfmadapter.converters.sol003.etsicatalog;
 
-import static org.slf4j.LoggerFactory.getLogger;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
-import java.util.Optional;
-import java.util.UUID;
-import javax.swing.text.html.Option;
 import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.Version;
 import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.VnfProducts;
 import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.VnfProductsProviders;
@@ -38,7 +34,6 @@
 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.SubscriptionsFilterVersions;
 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.SubscriptionsFilterVnfProducts;
 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.SubscriptionsFilterVnfProductsFromProviders;
-import org.slf4j.Logger;
 import org.springframework.core.convert.converter.Converter;
 import org.springframework.stereotype.Service;
 
@@ -48,14 +43,11 @@
  *
  * @author Ronan Kenny (ronan.kenny@est.tech)
  * @author Gareth Roper (gareth.roper@est.tech)
- *
  */
 @Service
 public class PkgmSubscriptionRequestConverter implements
         Converter<PkgmSubscriptionRequest, org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.PkgmSubscriptionRequest> {
 
-    private static final Logger logger = getLogger(PkgmSubscriptionRequestConverter.class);
-
     @Override
     public org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.PkgmSubscriptionRequest convert(
             PkgmSubscriptionRequest pkgmSubscriptionRequest) {
@@ -133,7 +125,8 @@
             final List<VnfProductsProviders> etsiCatalogManagerVnfProductsProviders = new ArrayList<>();
             filterProductsFromProvider.forEach(vnfProduct -> {
                 etsiCatalogManagerVnfProductsProviders
-                        .add(new VnfProductsProviders().vnfProducts(getVnfProducts(vnfProduct.getVnfProducts())));
+                        .add(new VnfProductsProviders().vnfProvider(vnfProduct.getVnfProvider())
+                                .vnfProducts(getVnfProducts(vnfProduct.getVnfProducts())));
             });
             return etsiCatalogManagerVnfProductsProviders;
         }
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/etsicatalog/EtsiCatalogServiceProvider.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/etsicatalog/EtsiCatalogServiceProvider.java
index e0eed15..0dcc49e 100644
--- a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/etsicatalog/EtsiCatalogServiceProvider.java
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/etsicatalog/EtsiCatalogServiceProvider.java
@@ -21,6 +21,7 @@
 package org.onap.so.adapters.vnfmadapter.extclients.etsicatalog;
 
 import java.util.Optional;
+import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.NsdmSubscription;
 import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.PkgmSubscription;
 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.InlineResponse2001;
 
@@ -81,10 +82,18 @@
             final org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.PkgmSubscriptionRequest etsiCatalogManagerSubscriptionRequest);
 
     /**
+     * Get the Subscription from ETSI Catalog.
+     * 
+     * @param subscriptionId Subscription ID
+     * @return The Subscription {@link NsdmSubscription} from ETSI Catalog
+     */
+    Optional<NsdmSubscription> getSubscription(final String subscriptionId);
+
+    /**
      * DELETE the SubscriptionRequest Object.
      *
      * @return A Boolean representing if the delete was successful or not.
      */
-    Boolean deleteSubscription(final String subscriptionId);
+    boolean deleteSubscription(final String subscriptionId);
 
 }
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/etsicatalog/EtsiCatalogServiceProviderImpl.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/etsicatalog/EtsiCatalogServiceProviderImpl.java
index 573a798..30d0846 100644
--- a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/etsicatalog/EtsiCatalogServiceProviderImpl.java
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/etsicatalog/EtsiCatalogServiceProviderImpl.java
@@ -21,11 +21,13 @@
 package org.onap.so.adapters.vnfmadapter.extclients.etsicatalog;
 
 import java.util.Optional;
+import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.NsdmSubscription;
 import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.PkgmSubscription;
 import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.VnfPkgInfo;
 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.InlineResponse2001;
 import org.onap.so.adapters.vnfmadapter.rest.exceptions.EtsiCatalogManagerBadRequestException;
 import org.onap.so.adapters.vnfmadapter.rest.exceptions.EtsiCatalogManagerRequestFailureException;
+import org.onap.so.adapters.vnfmadapter.rest.exceptions.SubscriptionNotFoundException;
 import org.onap.so.adapters.vnfmadapter.rest.exceptions.VnfPkgBadRequestException;
 import org.onap.so.adapters.vnfmadapter.rest.exceptions.VnfPkgConflictException;
 import org.onap.so.adapters.vnfmadapter.rest.exceptions.VnfPkgNotFoundException;
@@ -79,7 +81,7 @@
                     etsiCatalogUrlProvider.getVnfPackageArtifactUrl(vnfPkgId, artifactPath), byte[].class);
             logger.info("getVnfPackageArtifact Request to ETSI Catalog Manager Status Code: {}",
                     response.getStatusCodeValue());
-            if (response.getStatusCode() == HttpStatus.OK) {
+            if (response.getStatusCode().is2xxSuccessful()) {
                 return Optional.ofNullable(response.getBody());
             }
         } catch (final HttpResouceNotFoundException httpResouceNotFoundException) {
@@ -104,7 +106,7 @@
                     httpServiceProvider.getHttpResponse(etsiCatalogUrlProvider.getVnfPackagesUrl(), VnfPkgInfo[].class);
             logger.info("getVnfPackages Request to ETSI Catalog Manager Status Code: {}",
                     response.getStatusCodeValue());
-            if (response.getStatusCode() == HttpStatus.OK) {
+            if (response.getStatusCode().is2xxSuccessful()) {
                 if (response.hasBody()) {
                     final VnfPkgInfo[] vnfPackages = response.getBody();
                     assert (vnfPackages != null);
@@ -145,7 +147,7 @@
                     .getHttpResponse(etsiCatalogUrlProvider.getVnfPackageUrl(vnfPkgId), VnfPkgInfo.class);
             logger.info("getVnfPackage Request for vnfPkgId {} to ETSI Catalog Manager Status Code: {}", vnfPkgId,
                     response.getStatusCodeValue());
-            if (response.getStatusCode() == HttpStatus.OK) {
+            if (response.getStatusCode().is2xxSuccessful()) {
                 if (response.hasBody()) {
                     final VnfPkgInfo vnfPkgInfo = response.getBody();
                     if (conversionService.canConvert(vnfPkgInfo.getClass(), InlineResponse2001.class)) {
@@ -183,7 +185,7 @@
             final ResponseEntity<PkgmSubscription> responseEntity =
                     httpServiceProvider.postHttpRequest(etsiCatalogManagerSubscriptionRequest,
                             etsiCatalogUrlProvider.getSubscriptionUrl(), PkgmSubscription.class);
-            if (responseEntity.getStatusCode() == HttpStatus.OK) {
+            if (responseEntity.getStatusCode().is2xxSuccessful()) {
                 if (responseEntity.hasBody()) {
                     return Optional.of(responseEntity.getBody());
                 }
@@ -204,18 +206,23 @@
         }
     }
 
-    public Boolean deleteSubscription(final String subscriptionId) {
+    @Override
+    public boolean deleteSubscription(final String subscriptionId) {
         try {
             final ResponseEntity<Void> responseEntity = httpServiceProvider
                     .deleteHttpRequest(etsiCatalogUrlProvider.getSubscriptionUrl() + "/" + subscriptionId, Void.class);
 
-            if (responseEntity.getStatusCode() == HttpStatus.NO_CONTENT) {
+            if (responseEntity.getStatusCode().is2xxSuccessful()) {
                 logger.info("Subscription with ID: {} has been successfully deleted from the ETSI Catalog Manager",
                         subscriptionId);
                 return true;
             }
             logger.error("Unexpected Status Code Received on deleteSubscription: {}", responseEntity.getStatusCode());
             return false;
+        } catch (final HttpResouceNotFoundException resouceNotFoundException) {
+            final String message = "Unable to find subscription in ETSI Catalog Manager using id: " + subscriptionId;
+            logger.error(message);
+            throw new SubscriptionNotFoundException(message);
         } catch (final InvalidRestRequestException invalidRestRequestException) {
             logger.error("Caught InvalidRestRequestException on deleteSubscription call to ETSI Catalog Manager.",
                     invalidRestRequestException);
@@ -224,7 +231,27 @@
         }
     }
 
+    @Override
+    public Optional<NsdmSubscription> getSubscription(final String subscriptionId) {
+        try {
+            final ResponseEntity<NsdmSubscription> responseEntity = httpServiceProvider.getHttpResponse(
+                    etsiCatalogUrlProvider.getSubscriptionUrl() + "/" + subscriptionId, NsdmSubscription.class);
 
+            if (responseEntity.getStatusCode().is2xxSuccessful()) {
+                logger.debug("Found subscription with ID: {} in ETSI Catalog Manager", subscriptionId);
+                return Optional.ofNullable(responseEntity.getBody());
+            }
+            logger.error("Unexpected Status Code Received on getting subscription from ETSI Catalog Manager: {}",
+                    responseEntity.getStatusCode());
+        } catch (final HttpResouceNotFoundException resouceNotFoundException) {
+            logger.error("Unable to find subscription in ETSI Catalog Manager using id: {}", subscriptionId);
+            return Optional.empty();
+        } catch (final RestProcessingException | InvalidRestRequestException exception) {
+            logger.error("Unable to query ETSI Catalog Manager for subscription using id: {}", subscriptionId,
+                    exception);
+        }
+        throw new EtsiCatalogManagerRequestFailureException("Internal Server Error Occurred.");
+    }
 
     private Optional<byte[]> requestVnfElement(final String vnfPkgId, final String vnfRequestUrl,
             final String vnfRequestName) {
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/packagemanagement/subscriptionmanagement/AbstractNotificationServiceProvider.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/packagemanagement/subscriptionmanagement/AbstractNotificationServiceProvider.java
new file mode 100644
index 0000000..86ca59c
--- /dev/null
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/packagemanagement/subscriptionmanagement/AbstractNotificationServiceProvider.java
@@ -0,0 +1,64 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2020 Ericsson. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * 
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.so.adapters.vnfmadapter.packagemanagement.subscriptionmanagement;
+
+import static org.onap.so.client.RestTemplateConfig.CONFIGURABLE_REST_TEMPLATE;
+import java.nio.charset.StandardCharsets;
+import org.apache.commons.codec.binary.Base64;
+import org.onap.so.configuration.rest.BasicHttpHeadersProvider;
+import org.onap.so.configuration.rest.HttpHeadersProvider;
+import org.onap.so.rest.service.HttpRestServiceProvider;
+import org.onap.so.rest.service.HttpRestServiceProviderImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.web.client.RestTemplate;
+
+/**
+ * A base class that can be extended by classes for providing notification services. Provides common methods that will
+ * be useful to those classes.
+ *
+ * @author Waqas Ikram (waqas.ikram@est.tech)
+ * @author Andrew Lamb (andrew.a.lamb@est.tech)
+ */
+public abstract class AbstractNotificationServiceProvider {
+
+    @Autowired
+    @Qualifier(CONFIGURABLE_REST_TEMPLATE)
+    private RestTemplate restTemplate;
+
+    protected HttpRestServiceProvider getHttpRestServiceProvider(final HttpHeadersProvider httpHeadersProvider) {
+        final HttpRestServiceProvider httpRestServiceProvider =
+                new HttpRestServiceProviderImpl(restTemplate, httpHeadersProvider);
+        return httpRestServiceProvider;
+    }
+
+    protected BasicHttpHeadersProvider getBasicHttpHeadersProviderWithBasicAuth(final String username,
+            final String password) {
+        final byte[] encodedAuth = getBasicAuth(username, password);
+        final String authHeader = "Basic " + new String(encodedAuth);
+        return new BasicHttpHeadersProvider(authHeader);
+    }
+
+    protected byte[] getBasicAuth(final String username, final String password) {
+        final String auth = username + ":" + password;
+        return Base64.encodeBase64(auth.getBytes(StandardCharsets.ISO_8859_1));
+    }
+
+}
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/packagemanagement/subscriptionmanagement/BasicAuthNotificationServiceProvider.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/packagemanagement/subscriptionmanagement/BasicAuthNotificationServiceProvider.java
new file mode 100644
index 0000000..6f9d94e
--- /dev/null
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/packagemanagement/subscriptionmanagement/BasicAuthNotificationServiceProvider.java
@@ -0,0 +1,68 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2020 Ericsson. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * 
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.so.adapters.vnfmadapter.packagemanagement.subscriptionmanagement;
+
+import static org.slf4j.LoggerFactory.getLogger;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.SubscriptionsAuthentication;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.SubscriptionsAuthentication.AuthTypeEnum;
+import org.onap.so.configuration.rest.HttpHeadersProvider;
+import org.onap.so.rest.service.HttpRestServiceProvider;
+import org.slf4j.Logger;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+
+/**
+ * Implementation of a NotificationServiceProvider which supports Basic Authentication
+ *
+ * @author Waqas Ikram (waqas.ikram@est.tech)
+ * @author Andrew Lamb (andrew.a.lamb@est.tech)
+ */
+@Service
+public class BasicAuthNotificationServiceProvider extends AbstractNotificationServiceProvider
+        implements NotificationServiceProvider {
+
+    private static final Logger logger = getLogger(BasicAuthNotificationServiceProvider.class);
+
+    @Override
+    public boolean send(final Object notification, final SubscriptionsAuthentication subscriptionsAuthentication,
+            final String callbackUri) {
+        logger.info("Sending notification to uri: {}", callbackUri);
+        final HttpHeadersProvider httpHeadersProvider =
+                getBasicHttpHeadersProviderWithBasicAuth(subscriptionsAuthentication.getParamsBasic().getUserName(),
+                        subscriptionsAuthentication.getParamsBasic().getPassword());
+        final HttpRestServiceProvider httpRestServiceProvider = getHttpRestServiceProvider(httpHeadersProvider);
+
+        final ResponseEntity<Void> responseEntity =
+                httpRestServiceProvider.postHttpRequest(notification, callbackUri, Void.class);
+        if (responseEntity.getStatusCode().is2xxSuccessful()) {
+            logger.info("Notification sent successfully.");
+            return true;
+        }
+
+        logger.error("Failed to send notification.");
+        return false;
+    }
+
+    @Override
+    public AuthTypeEnum getAuthType() {
+        return AuthTypeEnum.BASIC;
+    }
+
+}
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/packagemanagement/subscriptionmanagement/NotificationManager.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/packagemanagement/subscriptionmanagement/NotificationManager.java
new file mode 100644
index 0000000..c1051d1
--- /dev/null
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/packagemanagement/subscriptionmanagement/NotificationManager.java
@@ -0,0 +1,137 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2020 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.adapters.vnfmadapter.packagemanagement.subscriptionmanagement;
+
+import static org.slf4j.LoggerFactory.getLogger;
+import java.util.List;
+import java.util.Optional;
+import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.notification.model.PkgChangeNotification;
+import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.notification.model.PkgOnboardingNotification;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.PkgmSubscriptionRequest;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.SubscriptionsAuthentication;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.SubscriptionsAuthentication.AuthTypeEnum;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.notification.model.VnfPackageChangeNotification;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.notification.model.VnfPackageOnboardingNotification;
+import org.onap.so.adapters.vnfmadapter.rest.exceptions.AuthenticationTypeNotSupportedException;
+import org.onap.so.adapters.vnfmadapter.rest.exceptions.ConversionFailedException;
+import org.onap.so.adapters.vnfmadapter.rest.exceptions.NotificationTypeNotSupportedException;
+import org.onap.so.adapters.vnfmadapter.rest.exceptions.SubscriptionNotFoundException;
+import org.slf4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.convert.ConversionService;
+import org.springframework.stereotype.Service;
+
+/**
+ * Manages package management subscription notifications to the VNFMs
+ *
+ * @author Andrew Lamb (andrew.a.lamb@est.tech)
+ *
+ */
+@Service
+public class NotificationManager {
+
+    private static final Logger logger = getLogger(NotificationManager.class);
+    private final ConversionService conversionService;
+    private final SubscriptionManager subscriptionManager;
+    private final NotificationServiceProviderFactory notificationServiceProviderFactory;
+
+    @Autowired
+    public NotificationManager(final SubscriptionManager subscriptionManager, final ConversionService conversionService,
+            final NotificationServiceProviderFactory notificationServiceProviderFactory) {
+        this.subscriptionManager = subscriptionManager;
+        this.conversionService = conversionService;
+        this.notificationServiceProviderFactory = notificationServiceProviderFactory;
+    }
+
+    /**
+     * Process a subscription notification. Checks for a subscription request stored in the adapter and if there is, it
+     * sends the notification to the subscribed vnfm.
+     * 
+     * @param notification the notification to send to the vnfm
+     * @param subscriptionId the id of the subscription request
+     * @return true if the notification is successfully sent
+     */
+    public boolean processSubscriptionNotification(final Object notification, final String subscriptionId) {
+        final Optional<PkgmSubscriptionRequest> optionalSubscription =
+                subscriptionManager.getSubscriptionRequest(subscriptionId);
+        if (optionalSubscription.isPresent()) {
+            final PkgmSubscriptionRequest subscriptionRequest = optionalSubscription.get();
+            return notifyVnfm(subscriptionRequest, notification);
+        }
+        final String errorMessage = "No subscription found with subscriptionId " + subscriptionId
+                + ". Unable to forward notification to subscriber.";
+        logger.error(errorMessage);
+        throw new SubscriptionNotFoundException(errorMessage);
+    }
+
+    private boolean notifyVnfm(final PkgmSubscriptionRequest subscriptionRequest, final Object notification) {
+        if (!(notification instanceof PkgOnboardingNotification) && !(notification instanceof PkgChangeNotification)) {
+            final String errorMessage =
+                    "An error occurred.  Notification type not supported for: " + notification.getClass();
+            logger.error(errorMessage);
+            throw new NotificationTypeNotSupportedException(errorMessage);
+        }
+
+        final SubscriptionsAuthentication subscriptionsAuthentication = subscriptionRequest.getAuthentication();
+        final AuthTypeEnum authType = getAuthType(subscriptionsAuthentication.getAuthType());
+        final NotificationServiceProvider sender = notificationServiceProviderFactory.getNotificationSender(authType);
+
+        final Object vnfmNotificationObject = convertEtsiCatalogNotification(notification);
+
+        if (sender.send(vnfmNotificationObject, subscriptionsAuthentication, subscriptionRequest.getCallbackUri())) {
+            logger.info("Notification delivered successfully {}", notification);
+            return true;
+        }
+
+        logger.error("Failed to deliver notification.");
+        return false;
+    }
+
+    private SubscriptionsAuthentication.AuthTypeEnum getAuthType(final List<AuthTypeEnum> authTypes) {
+        if (authTypes.contains(SubscriptionsAuthentication.AuthTypeEnum.TLS_CERT)) {
+            return SubscriptionsAuthentication.AuthTypeEnum.TLS_CERT;
+        }
+        if (authTypes.contains(SubscriptionsAuthentication.AuthTypeEnum.OAUTH2_CLIENT_CREDENTIALS)) {
+            return SubscriptionsAuthentication.AuthTypeEnum.OAUTH2_CLIENT_CREDENTIALS;
+        }
+        if (authTypes.contains(SubscriptionsAuthentication.AuthTypeEnum.BASIC)) {
+            return SubscriptionsAuthentication.AuthTypeEnum.BASIC;
+        }
+        final String errorMessage =
+                "An error occurred. No supported authentication type provided in subscription request.";
+        logger.error(errorMessage);
+        throw new AuthenticationTypeNotSupportedException(errorMessage);
+    }
+
+    private Object convertEtsiCatalogNotification(final Object etsiCatalogNotification) {
+        logger.info("Converting notification:\n {}", etsiCatalogNotification);
+        if (conversionService.canConvert(etsiCatalogNotification.getClass(), VnfPackageOnboardingNotification.class)) {
+            return conversionService.convert(etsiCatalogNotification, VnfPackageOnboardingNotification.class);
+        } else if (conversionService.canConvert(etsiCatalogNotification.getClass(),
+                VnfPackageChangeNotification.class)) {
+            return conversionService.convert(etsiCatalogNotification, VnfPackageChangeNotification.class);
+        }
+        final String errorMessage = "An error occurred. Unable to convert provided notification object.";
+        logger.error(errorMessage + "\n" + etsiCatalogNotification);
+        throw new ConversionFailedException(errorMessage);
+    }
+
+}
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/packagemanagement/subscriptionmanagement/NotificationServiceProvider.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/packagemanagement/subscriptionmanagement/NotificationServiceProvider.java
new file mode 100644
index 0000000..2be80ee
--- /dev/null
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/packagemanagement/subscriptionmanagement/NotificationServiceProvider.java
@@ -0,0 +1,51 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2020 Ericsson. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * 
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.so.adapters.vnfmadapter.packagemanagement.subscriptionmanagement;
+
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.SubscriptionsAuthentication;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.SubscriptionsAuthentication.AuthTypeEnum;
+
+/**
+ * Interface which lays out requirements for a Notification Service Provider
+ *
+ * @author Waqas Ikram (waqas.ikram@est.tech)
+ * @author Andrew Lamb (andrew.a.lamb@est.tech)
+ */
+public interface NotificationServiceProvider {
+
+    /**
+     * Method to send a notification to a uri, given the subscription authentication
+     * 
+     * @param notification The notification to send
+     * @param subscriptionsAuthentication Object containing the authentication details
+     * @param callbackUri The uri to send the notification to
+     * @return true if notification is delivered successfully, otherwise false
+     */
+    boolean send(final Object notification, final SubscriptionsAuthentication subscriptionsAuthentication,
+            final String callbackUri);
+
+    /**
+     * Method to get the supported authorization type of the service provider
+     * 
+     * @return the supported AuthTypeEnum
+     */
+    AuthTypeEnum getAuthType();
+
+}
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/packagemanagement/subscriptionmanagement/NotificationServiceProviderFactory.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/packagemanagement/subscriptionmanagement/NotificationServiceProviderFactory.java
new file mode 100644
index 0000000..ab67afe
--- /dev/null
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/packagemanagement/subscriptionmanagement/NotificationServiceProviderFactory.java
@@ -0,0 +1,67 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2020 Ericsson. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * 
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.so.adapters.vnfmadapter.packagemanagement.subscriptionmanagement;
+
+import static org.slf4j.LoggerFactory.getLogger;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.SubscriptionsAuthentication.AuthTypeEnum;
+import org.onap.so.adapters.vnfmadapter.rest.exceptions.AuthenticationTypeNotSupportedException;
+import org.slf4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * Factory to provide a notification services
+ *
+ * @author Waqas Ikram (waqas.ikram@est.tech)
+ * @author Andrew Lamb (andrew.a.lamb@est.tech)
+ */
+@Component
+public class NotificationServiceProviderFactory {
+
+    private static final Logger logger = getLogger(NotificationServiceProviderFactory.class);
+    private static final Map<AuthTypeEnum, NotificationServiceProvider> CACHE = new HashMap<>();
+
+    @Autowired
+    public NotificationServiceProviderFactory(final List<NotificationServiceProvider> services) {
+        for (final NotificationServiceProvider notificationServiceProvider : services) {
+            logger.debug("Adding {} of type {} to cache", notificationServiceProvider.getClass().getCanonicalName(),
+                    notificationServiceProvider.getAuthType());
+            CACHE.put(notificationServiceProvider.getAuthType(), notificationServiceProvider);
+        }
+    }
+
+    /**
+     * Get a notification service for a given authorization type
+     * 
+     * @param type the type of authentication required
+     * @return the notification service
+     */
+    public NotificationServiceProvider getNotificationSender(final AuthTypeEnum type) {
+        final NotificationServiceProvider service = CACHE.get(type);
+        if (service == null) {
+            throw new AuthenticationTypeNotSupportedException("Unknown type: " + type);
+        }
+        return service;
+    }
+
+}
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/packagemanagement/subscriptionmanagement/OAuthNotificationServiceProvider.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/packagemanagement/subscriptionmanagement/OAuthNotificationServiceProvider.java
new file mode 100644
index 0000000..496fb08
--- /dev/null
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/packagemanagement/subscriptionmanagement/OAuthNotificationServiceProvider.java
@@ -0,0 +1,102 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2020 Ericsson. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * 
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.so.adapters.vnfmadapter.packagemanagement.subscriptionmanagement;
+
+import static org.slf4j.LoggerFactory.getLogger;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.SubscriptionsAuthentication;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.SubscriptionsAuthentication.AuthTypeEnum;
+import org.onap.so.adapters.vnfmadapter.rest.exceptions.InternalServerErrorException;
+import org.onap.so.configuration.rest.BasicHttpHeadersProvider;
+import org.onap.so.configuration.rest.HttpHeadersProvider;
+import org.onap.so.rest.service.HttpRestServiceProvider;
+import org.slf4j.Logger;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author Waqas Ikram (waqas.ikram@est.tech)
+ * @author Andrew Lamb (andrew.a.lamb@est.tech)
+ *
+ */
+@Service
+public class OAuthNotificationServiceProvider extends AbstractNotificationServiceProvider
+        implements NotificationServiceProvider {
+
+    private static final Logger logger = getLogger(OAuthNotificationServiceProvider.class);
+
+    @Override
+    public boolean send(final Object notification, final SubscriptionsAuthentication subscriptionsAuthentication,
+            final String callbackUri) {
+        logger.info("Sending notification to uri: {}", callbackUri);
+        final String token = getAccessToken(subscriptionsAuthentication);
+
+        if (token == null) {
+            return false;
+        }
+
+        final HttpHeadersProvider httpHeadersProvider = getHttpHeadersProvider(token);
+        final HttpRestServiceProvider httpRestServiceProvider = getHttpRestServiceProvider(httpHeadersProvider);
+        final ResponseEntity<Void> responseEntity =
+                httpRestServiceProvider.postHttpRequest(notification, callbackUri, Void.class);
+        if (responseEntity.getStatusCode().is2xxSuccessful()) {
+            logger.info("Notification sent successfully.");
+            return true;
+        }
+
+        logger.error("Failed to send notification.");
+        return false;
+    }
+
+    @Override
+    public AuthTypeEnum getAuthType() {
+        return AuthTypeEnum.OAUTH2_CLIENT_CREDENTIALS;
+    }
+
+    private BasicHttpHeadersProvider getHttpHeadersProvider(final String token) {
+        final String authHeader = "Bearer " + token;
+        return new BasicHttpHeadersProvider(authHeader);
+    }
+
+    private String getAccessToken(final SubscriptionsAuthentication subscriptionsAuthentication) {
+        logger.info("Requesting Access Token.");
+
+        final String tokenEndpoint = subscriptionsAuthentication.getParamsOauth2ClientCredentials().getTokenEndpoint();
+
+        final HttpHeadersProvider httpHeadersProvider = getBasicHttpHeadersProviderWithBasicAuth(
+                subscriptionsAuthentication.getParamsOauth2ClientCredentials().getClientId(),
+                subscriptionsAuthentication.getParamsOauth2ClientCredentials().getClientPassword());
+
+        final HttpRestServiceProvider httpRestServiceProvider = getHttpRestServiceProvider(httpHeadersProvider);
+        final ResponseEntity<OAuthTokenResponse> responseEntity =
+                httpRestServiceProvider.postHttpRequest(null, tokenEndpoint, OAuthTokenResponse.class);
+        if (responseEntity.getStatusCode().is2xxSuccessful()) {
+            if (responseEntity.getBody() != null) {
+                logger.info("Returning Access Token.");
+                return responseEntity.getBody().getAccessToken();
+            }
+        }
+
+        final String errorMessage = "An error occurred.  Unable to retrieve OAuth Token from VNFM for notification.";
+        logger.error(errorMessage);
+        throw new InternalServerErrorException(errorMessage);
+    }
+
+
+}
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/packagemanagement/subscriptionmanagement/OAuthTokenResponse.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/packagemanagement/subscriptionmanagement/OAuthTokenResponse.java
new file mode 100644
index 0000000..146641c
--- /dev/null
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/packagemanagement/subscriptionmanagement/OAuthTokenResponse.java
@@ -0,0 +1,56 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2020 Ericsson. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.so.adapters.vnfmadapter.packagemanagement.subscriptionmanagement;
+
+import java.io.Serializable;
+import javax.xml.bind.annotation.XmlElement;
+import com.google.gson.annotations.SerializedName;
+
+/**
+ * @author Waqas Ikram (waqas.ikram@est.tech)
+ * @author Andrew Lamb (andrew.a.lamb@est.tech)
+ */
+public class OAuthTokenResponse implements Serializable {
+
+    private static final long serialVersionUID = -6455742984985959926L;
+
+    @XmlElement(name = "access_token")
+    @SerializedName("access_token")
+    private String accessToken;
+
+    /**
+     * Get the Accees Token
+     *
+     * @return the Access Token
+     */
+    public String getAccessToken() {
+        return accessToken;
+    }
+
+    /**
+     * Set the Access Token
+     *
+     * @param accessToken
+     */
+    public void setAccessToken(final String accessToken) {
+        this.accessToken = accessToken;
+    }
+
+}
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/packagemanagement/subscriptionmanagement/SubscriptionManager.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/packagemanagement/subscriptionmanagement/SubscriptionManager.java
index bbf8b74..a4c52fd 100644
--- a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/packagemanagement/subscriptionmanagement/SubscriptionManager.java
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/packagemanagement/subscriptionmanagement/SubscriptionManager.java
@@ -31,8 +31,8 @@
 import java.util.Optional;
 import org.onap.so.adapters.vnfmadapter.Constants;
 import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.EtsiCatalogServiceProvider;
-import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.EtsiCatalogUrlProvider;
 import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.BasicAuth;
+import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.NsdmSubscription;
 import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.PkgmSubscription;
 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.InlineResponse2002;
 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.PkgmSubscriptionRequest;
@@ -40,13 +40,12 @@
 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.VnfPackagesLinksSelf;
 import org.onap.so.adapters.vnfmadapter.packagemanagement.subscriptionmanagement.cache.PackageManagementCacheServiceProvider;
 import org.onap.so.adapters.vnfmadapter.rest.exceptions.InternalServerErrorException;
-import org.onap.so.adapters.vnfmadapter.rest.exceptions.SubscriptionRequestConversionException;
-import org.onap.so.rest.service.HttpRestServiceProvider;
+import org.onap.so.adapters.vnfmadapter.rest.exceptions.SubscriptionNotFoundException;
+import org.onap.so.adapters.vnfmadapter.rest.exceptions.ConversionFailedException;
 import org.onap.so.utils.CryptoUtils;
 import org.slf4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
-import org.springframework.core.convert.ConversionException;
 import org.springframework.core.convert.ConversionService;
 import org.springframework.stereotype.Service;
 
@@ -55,34 +54,26 @@
  *
  * @author Ronan Kenny (ronan.kenny@est.tech)
  * @author Gareth Roper (gareth.roper@est.tech)
- *
  */
 @Service
 public class SubscriptionManager {
 
     private static final Logger logger = getLogger(SubscriptionManager.class);
     private final PackageManagementCacheServiceProvider packageManagementCacheServiceProvider;
-    private final EtsiCatalogUrlProvider etsiCatalogUrlProvider;
-    private final HttpRestServiceProvider httpServiceProvider;
     private final ConversionService conversionService;
     private final EtsiCatalogServiceProvider etsiCatalogServiceProvider;
     private final String vnfmAdapterEndpoint;
     private final String msoKeyString;
     private final String vnfmAdapterAuth;
 
-
     @Autowired
     public SubscriptionManager(final PackageManagementCacheServiceProvider packageManagementCacheServiceProvider,
-            final ConversionService conversionService, final HttpRestServiceProvider httpServiceProvider,
-            final EtsiCatalogUrlProvider etsiCatalogUrlProvider,
-            final EtsiCatalogServiceProvider etsiCatalogServiceProvider,
+            final ConversionService conversionService, final EtsiCatalogServiceProvider etsiCatalogServiceProvider,
             @Value("${vnfmadapter.endpoint}") final String vnfmAdapterEndpoint,
             @Value("${mso.key}") final String msoKeyString,
-            @Value("${vnfmadapter.auth:D6CFE56451508B75536C5E8A1E7AE06D0346006A693BF29293A6E1C762EFD59C671911DB6E9294E4FE15E4C1C5524B}") final String vnfmAdapterAuth) {
+            @Value("${vnfmadapter.auth:BF29BA36F0CFE1C05507781F6B97EFBCA7EFAC9F595954D465FC43F646883EF585C20A58CBB02528A6FAAC}") final String vnfmAdapterAuth) {
         this.packageManagementCacheServiceProvider = packageManagementCacheServiceProvider;
-        this.etsiCatalogUrlProvider = etsiCatalogUrlProvider;
         this.conversionService = conversionService;
-        this.httpServiceProvider = httpServiceProvider;
         this.etsiCatalogServiceProvider = etsiCatalogServiceProvider;
         this.vnfmAdapterEndpoint = vnfmAdapterEndpoint;
         this.vnfmAdapterAuth = vnfmAdapterAuth;
@@ -99,10 +90,10 @@
                 etsiCatalogServiceProvider.postSubscription(etsiCatalogManagerSubscriptionRequest);
 
         if (optionalEtsiCatalogManagerSubscription.isPresent()) {
-            PkgmSubscription etsiCatalogManagerSubscription = optionalEtsiCatalogManagerSubscription.get();
+            final PkgmSubscription etsiCatalogManagerSubscription = optionalEtsiCatalogManagerSubscription.get();
             logger.debug("postPkgmSubscriptionRequest Response SubscriptionId: {}",
-                    Objects.requireNonNull(etsiCatalogManagerSubscription.getId().toString()));
-            final String subscriptionId = etsiCatalogManagerSubscription.getId().toString();
+                    Objects.requireNonNull(etsiCatalogManagerSubscription.getId()));
+            final String subscriptionId = etsiCatalogManagerSubscription.getId();
 
             packageManagementCacheServiceProvider.addSubscription(subscriptionId, pkgmSubscriptionRequest);
 
@@ -119,13 +110,24 @@
                 "Received empty response from POST to ETSI Catalog Manager Subscription Endpoint.");
     }
 
-
-
     public Optional<String> getSubscriptionId(final PkgmSubscriptionRequest pkgmSubscriptionRequest) {
         return packageManagementCacheServiceProvider.getSubscriptionId(pkgmSubscriptionRequest);
     }
 
     public Optional<InlineResponse2002> getSubscription(final String subscriptionId) {
+
+        logger.debug("Checking if subscrition with id: {} exists in ETSI Catalog Manager", subscriptionId);
+        final Optional<NsdmSubscription> etsiCatalogSubscriptionOption =
+                etsiCatalogServiceProvider.getSubscription(subscriptionId);
+
+        if (!etsiCatalogSubscriptionOption.isPresent()) {
+            logger.debug("Unable to find subscription in ETSI Catalog Manager using id: {}", subscriptionId);
+            if (packageManagementCacheServiceProvider.getSubscription(subscriptionId).isPresent()) {
+                logger.debug("will remove subcription with id: {} from local cache", subscriptionId);
+                packageManagementCacheServiceProvider.deleteSubscription(subscriptionId);
+            }
+        }
+
         final Optional<PkgmSubscriptionRequest> optional =
                 packageManagementCacheServiceProvider.getSubscription(subscriptionId);
         if (optional.isPresent()) {
@@ -139,13 +141,25 @@
         final Map<String, PkgmSubscriptionRequest> subscriptions =
                 packageManagementCacheServiceProvider.getSubscriptions();
         final List<InlineResponse2002> response = new ArrayList<>();
-        subscriptions.forEach((key, value) -> response.add(getInlineResponse2002(key, value)));
+        subscriptions.forEach((key, value) -> {
+            final Optional<InlineResponse2002> optional = getSubscription(key);
+            if (optional.isPresent()) {
+                response.add(optional.get());
+            }
+        });
         return response;
     }
 
     public boolean deleteSubscription(final String subscriptionId) {
-        if (getSubscription(subscriptionId).isPresent()) {
-            if (etsiCatalogServiceProvider.deleteSubscription(subscriptionId)) {
+        if (packageManagementCacheServiceProvider.getSubscription(subscriptionId).isPresent()) {
+            try {
+                if (etsiCatalogServiceProvider.deleteSubscription(subscriptionId)) {
+                    return packageManagementCacheServiceProvider.deleteSubscription(subscriptionId);
+                }
+            } catch (final SubscriptionNotFoundException subscriptionNotFoundException) {
+                logger.error(
+                        "Unable to find subscription in ETSI Catalog Manager using id: {} will delete it from local cache",
+                        subscriptionId);
                 return packageManagementCacheServiceProvider.deleteSubscription(subscriptionId);
             }
         }
@@ -157,23 +171,27 @@
                 vnfmAdapterEndpoint + Constants.PACKAGE_MANAGEMENT_BASE_URL + "/subscriptions/" + subscriptionId);
     }
 
+    public Optional<PkgmSubscriptionRequest> getSubscriptionRequest(final String subscriptionId) {
+        return packageManagementCacheServiceProvider.getSubscription(subscriptionId);
+    }
+
     private InlineResponse2002 getInlineResponse2002(final String id, final PkgmSubscriptionRequest subscription) {
         return new InlineResponse2002().id(id).filter(subscription.getFilter())
                 .callbackUri(subscription.getCallbackUri());
     }
 
     private org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.PkgmSubscriptionRequest buildEtsiCatalogManagerPkgmSubscriptionRequest(
-            PkgmSubscriptionRequest pkgmSubscriptionRequest) throws GeneralSecurityException {
+            final PkgmSubscriptionRequest pkgmSubscriptionRequest) throws GeneralSecurityException {
 
         final org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.PkgmSubscriptionRequest etsiCatalogManagerSubscriptionRequest;
         try {
             etsiCatalogManagerSubscriptionRequest = conversionService.convert(pkgmSubscriptionRequest,
                     org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.PkgmSubscriptionRequest.class);
-        } catch (ConversionException conversionException) {
+        } catch (final org.springframework.core.convert.ConversionException conversionException) {
             logger.error(conversionException.getMessage());
-            throw new SubscriptionRequestConversionException(
+            throw new ConversionFailedException(
                     "Could not convert Sol003 PkgmSubscriptionRequest to ETSI-Catalog Manager PkgmSubscriptionRequest");
-        } catch (Exception exception) {
+        } catch (final Exception exception) {
             logger.error(exception.getMessage());
             throw new InternalServerErrorException(
                     "Could not convert Sol003 PkgmSubscriptionRequest to ETSI-Catalog Manager PkgmSubscriptionRequest");
@@ -192,7 +210,7 @@
                             .addAuthTypeItem(BASIC).paramsBasic(new BasicAuth().userName(username).password(password)));
             return etsiCatalogManagerSubscriptionRequest;
         }
-        throw new SubscriptionRequestConversionException(
+        throw new ConversionFailedException(
                 "Failed to convert Sol003 PkgmSubscriptionRequest to ETSI-Catalog Manager PkgmSubscriptionRequest");
     }
 
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/packagemanagement/subscriptionmanagement/TlsNotificationServiceProvider.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/packagemanagement/subscriptionmanagement/TlsNotificationServiceProvider.java
new file mode 100644
index 0000000..c9babbd
--- /dev/null
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/packagemanagement/subscriptionmanagement/TlsNotificationServiceProvider.java
@@ -0,0 +1,56 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2020 Ericsson. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * 
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.so.adapters.vnfmadapter.packagemanagement.subscriptionmanagement;
+
+import static org.slf4j.LoggerFactory.getLogger;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.SubscriptionsAuthentication;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.SubscriptionsAuthentication.AuthTypeEnum;
+import org.onap.so.adapters.vnfmadapter.rest.exceptions.AuthenticationTypeNotSupportedException;
+import org.slf4j.Logger;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author Waqas Ikram (waqas.ikram@est.tech)
+ * @author Andrew Lamb (andrew.a.lamb@est.tech)
+ */
+@Service
+public class TlsNotificationServiceProvider extends AbstractNotificationServiceProvider
+        implements NotificationServiceProvider {
+
+    private static final Logger logger = getLogger(TlsNotificationServiceProvider.class);
+
+    @Override
+    public boolean send(final Object notification, final SubscriptionsAuthentication subscriptionsAuthentication,
+            final String callbackUri) {
+        final String errorMessage = "An error occurred.  Authentication type "
+                + subscriptionsAuthentication.getAuthType().toString() + " not currently supported.";
+        logger.error(errorMessage);
+        throw new AuthenticationTypeNotSupportedException(errorMessage);
+    }
+
+
+    @Override
+    public AuthTypeEnum getAuthType() {
+        return AuthTypeEnum.TLS_CERT;
+    }
+
+
+
+}
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/EtsiSubscriptionNotificationController.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/EtsiSubscriptionNotificationController.java
index c5bd5bc..a97f04b 100644
--- a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/EtsiSubscriptionNotificationController.java
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/EtsiSubscriptionNotificationController.java
@@ -22,30 +22,110 @@
 
 import static org.onap.so.adapters.vnfmadapter.Constants.ETSI_SUBSCRIPTION_NOTIFICATION_CONTROLLER_BASE_URL;
 import static org.slf4j.LoggerFactory.getLogger;
+import java.util.AbstractMap;
+import java.util.Map.Entry;
 import javax.ws.rs.core.MediaType;
+import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.notification.model.PkgChangeNotification;
+import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.notification.model.PkgOnboardingNotification;
+import org.onap.so.adapters.vnfmadapter.packagemanagement.subscriptionmanagement.NotificationManager;
+import org.onap.so.adapters.vnfmadapter.rest.exceptions.InternalServerErrorException;
+import org.onap.so.adapters.vnfmadapter.rest.exceptions.NotificationTypeNotSupportedException;
 import org.slf4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
 
 /**
  * This controller handles the ETSI Subscription Notification Endpoints.
  *
  * @author Ronan Kenny (ronan.kenny@est.tech)
  * @author Gareth Roper (gareth.roper@est.tech)
+ * @author Andrew Lamb (andrew.a.lamb@est.tech)
  */
 @Controller
-@RequestMapping(value = ETSI_SUBSCRIPTION_NOTIFICATION_CONTROLLER_BASE_URL,
-        produces = {MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML},
-        consumes = {MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
+@RequestMapping(value = ETSI_SUBSCRIPTION_NOTIFICATION_CONTROLLER_BASE_URL)
 public class EtsiSubscriptionNotificationController {
 
     private static final Logger logger = getLogger(EtsiSubscriptionNotificationController.class);
+    private final NotificationManager notificationManager;
+    private final Gson gson;
+
+    @Autowired
+    public EtsiSubscriptionNotificationController(final NotificationManager notificationManager) {
+        this.notificationManager = notificationManager;
+        this.gson = new GsonBuilder().create();
+    }
 
     @GetMapping(value = "/notification")
     public ResponseEntity<Void> testSubscriptionNotificationEndPoint() {
         logger.debug("Testing Notification Endpoint");
         return ResponseEntity.noContent().build();
     }
+
+    /**
+     * POST notification on to subscriber.
+     * 
+     * @param notification The notification to send.
+     * @return Response Code: 204 No Content if Successful, ProblemDetails Object if not.
+     */
+    @PostMapping(value = "/notification", consumes = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_JSON)
+    public ResponseEntity<?> postSubscriptionNotification(@RequestBody final String notification) {
+        logger.info("Posting subscription notification \n{}", notification);
+
+        final Entry<String, Object> notificationObject = getNotificationObject(notification);
+        if (notificationManager.processSubscriptionNotification(notificationObject.getValue(),
+                notificationObject.getKey())) {
+            logger.info("Notification Delivered Successfully");
+            return ResponseEntity.noContent().build();
+        }
+        final String errorMessage = "An error occurred.  Sending of notification to VNFM failed.";
+        logger.error(errorMessage);
+        throw new InternalServerErrorException(errorMessage);
+    }
+
+    private Entry<String, Object> getNotificationObject(final String notification) {
+        final String notificationType = getNotificationType(notification);
+        if (PkgOnboardingNotification.NotificationTypeEnum.VNFPACKAGEONBOARDINGNOTIFICATION.getValue()
+                .equals(notificationType)) {
+            final PkgOnboardingNotification pkgOnboardingNotification =
+                    gson.fromJson(notification, PkgOnboardingNotification.class);
+            logger.info("Onboarding notification received:\n{}", pkgOnboardingNotification);
+            return new AbstractMap.SimpleEntry<>(pkgOnboardingNotification.getSubscriptionId(),
+                    pkgOnboardingNotification);
+        }
+        if (PkgChangeNotification.NotificationTypeEnum.VNFPACKAGECHANGENOTIFICATION.getValue()
+                .equals(notificationType)) {
+            final PkgChangeNotification pkgChangeNotification =
+                    gson.fromJson(notification, PkgChangeNotification.class);
+            logger.info("Change notification received:\n{}", pkgChangeNotification);
+            return new AbstractMap.SimpleEntry<>(pkgChangeNotification.getSubscriptionId(), pkgChangeNotification);
+
+        }
+
+        final String errorMessage = "An error occurred.  Notification type not supported for: " + notificationType;
+        logger.error(errorMessage);
+        throw new NotificationTypeNotSupportedException(errorMessage);
+
+    }
+
+    private String getNotificationType(final String notification) {
+        try {
+            final JsonParser parser = new JsonParser();
+            final JsonObject element = (JsonObject) parser.parse(notification);
+            return element.get("notificationType").getAsString();
+        } catch (final Exception e) {
+            logger.error("An error occurred processing notificiation: {}", e.getMessage());
+        }
+        throw new NotificationTypeNotSupportedException(
+                "Unable to parse notification type in object \n" + notification);
+    }
+
 }
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/Sol003GrantController.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/Sol003GrantController.java
index 3ead98f..21b20b0 100644
--- a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/Sol003GrantController.java
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/Sol003GrantController.java
@@ -50,8 +50,6 @@
 @RequestMapping(value = BASE_URL, produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
 public class Sol003GrantController {
 
-    private static final String SEPARATOR = "_";
-    private static final String VIM_TYPE = "OPENSTACK";
     private static final Logger logger = LoggerFactory.getLogger(Sol003GrantController.class);
     public final AaiServiceProvider aaiServiceProvider;
     public final AaiHelper aaiHelper;
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/Sol003PackageManagementController.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/Sol003PackageManagementController.java
index cce7241..f1d20c6 100644
--- a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/Sol003PackageManagementController.java
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/Sol003PackageManagementController.java
@@ -109,19 +109,19 @@
      */
     @GetMapping(value = "/vnf_packages/{vnfPkgId}/vnfd",
             produces = {MediaType.TEXT_PLAIN, APPLICATION_ZIP, MediaType.APPLICATION_JSON})
-    public ResponseEntity<byte[]> getVnfPackageVnfd(@PathVariable("vnfPkgId") final String vnfPkgId) {
+    public ResponseEntity<?> getVnfPackageVnfd(@PathVariable("vnfPkgId") final String vnfPkgId) {
         logger.info(LOG_REQUEST_RECEIVED, "getVnfPackageVnfd Endpoint Invoked with VNF Package ID: ", vnfPkgId);
         final Optional<byte[]> response = etsiCatalogServiceProvider.getVnfPackageVnfd(vnfPkgId);
         if (response.isPresent()) {
             logger.info(LOG_REQUEST_RECEIVED, "getVnfPackageVnfd Response: ", HttpStatus.OK);
-            return new ResponseEntity(response.get(), HttpStatus.OK);
+            return new ResponseEntity<>(response.get(), HttpStatus.OK);
         }
         final String errorMessage = "An error occurred, a null response was received by the\n"
                 + " Sol003PackageManagementController from the EtsiCatalogManager using the GET \"vnfd\" \n"
                 + "endpoint.";
 
         logger.error(errorMessage);
-        return new ResponseEntity(new ProblemDetails().detail(errorMessage), HttpStatus.INTERNAL_SERVER_ERROR);
+        return new ResponseEntity<>(new ProblemDetails().detail(errorMessage), HttpStatus.INTERNAL_SERVER_ERROR);
     }
 
     /**
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/Sol003PackageManagementSubscriptionController.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/Sol003PackageManagementSubscriptionController.java
index 4be0838..6db3797 100644
--- a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/Sol003PackageManagementSubscriptionController.java
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/Sol003PackageManagementSubscriptionController.java
@@ -79,7 +79,7 @@
     @PostMapping(value = "/subscriptions")
     public ResponseEntity<?> postSubscriptionRequest(@RequestBody final PkgmSubscriptionRequest pkgmSubscriptionRequest)
             throws GeneralSecurityException {
-        logger.info(LOG_REQUEST_RECEIVED, " postSubscriptionRequest Endpoint Called");
+        logger.info(LOG_REQUEST_RECEIVED, " postSubscriptionRequest Endpoint Called", pkgmSubscriptionRequest);
 
         // Check if subscription exists already.
         final Optional<String> exists = subscriptionManager.getSubscriptionId(pkgmSubscriptionRequest);
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/SubscriptionRequestConversionException.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/AuthenticationTypeNotSupportedException.java
similarity index 79%
copy from adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/SubscriptionRequestConversionException.java
copy to adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/AuthenticationTypeNotSupportedException.java
index daa544f..303420f 100644
--- a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/SubscriptionRequestConversionException.java
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/AuthenticationTypeNotSupportedException.java
@@ -23,16 +23,16 @@
 import org.springframework.web.bind.annotation.ResponseStatus;
 
 /**
- * Exception for an ETSI Catalog Manager Request Failure
+ * Exception for an unsupported authentication type
  * 
- * @author gareth.roper@est.tech
+ * @author Andrew Lamb (andrew.a.lamb@est.tech)
  */
 @ResponseStatus(code = HttpStatus.INTERNAL_SERVER_ERROR)
-public class SubscriptionRequestConversionException extends RuntimeException {
+public class AuthenticationTypeNotSupportedException extends RuntimeException {
 
-    private static final long serialVersionUID = 45898561453196895L;
+    private static final long serialVersionUID = 2939423208362066902L;
 
-    public SubscriptionRequestConversionException(final String message) {
+    public AuthenticationTypeNotSupportedException(final String message) {
         super(message);
     }
 
@@ -40,4 +40,5 @@
     public synchronized Throwable fillInStackTrace() {
         return this;
     }
+
 }
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/SubscriptionRequestConversionException.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/ConversionFailedException.java
similarity index 83%
rename from adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/SubscriptionRequestConversionException.java
rename to adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/ConversionFailedException.java
index daa544f..e19a53d 100644
--- a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/SubscriptionRequestConversionException.java
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/ConversionFailedException.java
@@ -23,16 +23,17 @@
 import org.springframework.web.bind.annotation.ResponseStatus;
 
 /**
- * Exception for an ETSI Catalog Manager Request Failure
+ * Exception for Conversion Failures
  * 
- * @author gareth.roper@est.tech
+ * @author Gareth Roper (gareth.roper@est.tech)
+ * @author Andrew Lamb (andrew.a.lamb@est.tech)
  */
 @ResponseStatus(code = HttpStatus.INTERNAL_SERVER_ERROR)
-public class SubscriptionRequestConversionException extends RuntimeException {
+public class ConversionFailedException extends RuntimeException {
 
     private static final long serialVersionUID = 45898561453196895L;
 
-    public SubscriptionRequestConversionException(final String message) {
+    public ConversionFailedException(final String message) {
         super(message);
     }
 
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/EtsiSubscriptionNotificationControllerExceptionHandler.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/EtsiSubscriptionNotificationControllerExceptionHandler.java
new file mode 100644
index 0000000..e8e1ce3
--- /dev/null
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/EtsiSubscriptionNotificationControllerExceptionHandler.java
@@ -0,0 +1,112 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2020 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.adapters.vnfmadapter.rest.exceptions;
+
+import static org.slf4j.LoggerFactory.getLogger;
+import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.ProblemDetails;
+import org.onap.so.adapters.vnfmadapter.rest.EtsiSubscriptionNotificationController;
+import org.onap.so.rest.exceptions.HttpResouceNotFoundException;
+import org.onap.so.rest.exceptions.InvalidRestRequestException;
+import org.onap.so.rest.exceptions.RestProcessingException;
+import org.slf4j.Logger;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+
+/**
+ * Exception Handler for the Etsi Subscription Notification Controller {@link EtsiSubscriptionNotificationController
+ * EtsiSubscriptionNotificationController}
+ * 
+ * @author Andrew Lamb (andrew.a.lamb@est.tech)
+ */
+@ControllerAdvice(assignableTypes = EtsiSubscriptionNotificationController.class)
+public class EtsiSubscriptionNotificationControllerExceptionHandler {
+
+    private static final Logger logger = getLogger(EtsiSubscriptionNotificationControllerExceptionHandler.class);
+
+    @ExceptionHandler(InvalidRestRequestException.class)
+    public ResponseEntity<ProblemDetails> handleInvalidRestRequestException(
+            final InvalidRestRequestException invalidRestRequestException) {
+        final String errorMessage = "An error occurred.  Sending of notification to VNFM failed with response: "
+                + HttpStatus.BAD_REQUEST + ".\n" + invalidRestRequestException.getMessage();
+        logger.error(errorMessage);
+        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(new ProblemDetails().detail(errorMessage));
+    }
+
+    @ExceptionHandler(HttpResouceNotFoundException.class)
+    public ResponseEntity<ProblemDetails> handleHttpResourceNotFoundException(
+            final HttpResouceNotFoundException httpResourceNotFoundException) {
+        final String errorMessage = "An error occurred.  Sending of notification to VNFM failed with response: "
+                + HttpStatus.NOT_FOUND + ".\n" + httpResourceNotFoundException.getMessage();
+        logger.error(errorMessage);
+        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(new ProblemDetails().detail(errorMessage));
+    }
+
+    @ExceptionHandler(RestProcessingException.class)
+    public ResponseEntity<ProblemDetails> handleRestProcessingException(
+            final RestProcessingException restProcessingException) {
+        final String errorMessage = "An error occurred.  Sending of notification to VNFM failed with response: "
+                + restProcessingException.getStatusCode() + ".\n" + restProcessingException.getMessage();
+        logger.error(errorMessage);
+        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(new ProblemDetails().detail(errorMessage));
+    }
+
+    @ExceptionHandler(InternalServerErrorException.class)
+    public ResponseEntity<ProblemDetails> handleInternalServerErrorException(
+            final InternalServerErrorException internalServerErrorException) {
+        logger.error(internalServerErrorException.getMessage());
+        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
+                .body(new ProblemDetails().detail(internalServerErrorException.getMessage()));
+    }
+
+    @ExceptionHandler(AuthenticationTypeNotSupportedException.class)
+    public ResponseEntity<ProblemDetails> handleAuthenticationTypeNotSupportedException(
+            final AuthenticationTypeNotSupportedException authenticationTypeNotSupportedException) {
+        logger.error(authenticationTypeNotSupportedException.getMessage());
+        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
+                .body(new ProblemDetails().detail(authenticationTypeNotSupportedException.getMessage()));
+    }
+
+    @ExceptionHandler(ConversionFailedException.class)
+    public ResponseEntity<ProblemDetails> handleConversionFailedException(
+            final ConversionFailedException conversionFailedException) {
+        logger.error(conversionFailedException.getMessage());
+        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
+                .body(new ProblemDetails().detail(conversionFailedException.getMessage()));
+    }
+
+    @ExceptionHandler(NotificationTypeNotSupportedException.class)
+    public ResponseEntity<ProblemDetails> handleNotificationTypeNotSupportedException(
+            final NotificationTypeNotSupportedException notificationTypeNotSupportedException) {
+        logger.error(notificationTypeNotSupportedException.getMessage());
+        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
+                .body(new ProblemDetails().detail(notificationTypeNotSupportedException.getMessage()));
+    }
+
+    @ExceptionHandler(SubscriptionNotFoundException.class)
+    public ResponseEntity<ProblemDetails> handleSubscriptionNotFoundException(
+            final SubscriptionNotFoundException subscriptionNotFoundException) {
+        logger.error(subscriptionNotFoundException.getMessage());
+        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
+                .body(new ProblemDetails().detail(subscriptionNotFoundException.getMessage()));
+    }
+}
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/SubscriptionRequestConversionException.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/NotificationTypeNotSupportedException.java
similarity index 79%
copy from adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/SubscriptionRequestConversionException.java
copy to adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/NotificationTypeNotSupportedException.java
index daa544f..dcc9886 100644
--- a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/SubscriptionRequestConversionException.java
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/NotificationTypeNotSupportedException.java
@@ -23,16 +23,16 @@
 import org.springframework.web.bind.annotation.ResponseStatus;
 
 /**
- * Exception for an ETSI Catalog Manager Request Failure
+ * Exception for an unsupported notification type
  * 
- * @author gareth.roper@est.tech
+ * @author Andrew Lamb (andrew.a.lamb@est.tech)
  */
 @ResponseStatus(code = HttpStatus.INTERNAL_SERVER_ERROR)
-public class SubscriptionRequestConversionException extends RuntimeException {
+public class NotificationTypeNotSupportedException extends RuntimeException {
 
-    private static final long serialVersionUID = 45898561453196895L;
+    private static final long serialVersionUID = 2939423208362066902L;
 
-    public SubscriptionRequestConversionException(final String message) {
+    public NotificationTypeNotSupportedException(final String message) {
         super(message);
     }
 
@@ -40,4 +40,5 @@
     public synchronized Throwable fillInStackTrace() {
         return this;
     }
+
 }
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/Sol003PackageManagementControllerExceptionHandler.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/Sol003PackageManagementControllerExceptionHandler.java
index da8b0cb..8091f35 100644
--- a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/Sol003PackageManagementControllerExceptionHandler.java
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/Sol003PackageManagementControllerExceptionHandler.java
@@ -22,10 +22,6 @@
 
 import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.ProblemDetails;
 import org.onap.so.adapters.vnfmadapter.rest.Sol003PackageManagementController;
-import org.onap.so.adapters.vnfmadapter.rest.exceptions.EtsiCatalogManagerRequestFailureException;
-import org.onap.so.adapters.vnfmadapter.rest.exceptions.VnfPkgBadRequestException;
-import org.onap.so.adapters.vnfmadapter.rest.exceptions.VnfPkgConflictException;
-import org.onap.so.adapters.vnfmadapter.rest.exceptions.VnfPkgNotFoundException;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.ControllerAdvice;
@@ -64,11 +60,11 @@
         return ResponseEntity.status(HttpStatus.NOT_FOUND).body(problemDetails);
     }
 
-    @ExceptionHandler(SubscriptionRequestConversionException.class)
-    public ResponseEntity<ProblemDetails> handleSubscriptionRequestConversionException(
-            final SubscriptionRequestConversionException subscriptionRequestConversionException) {
+    @ExceptionHandler(ConversionFailedException.class)
+    public ResponseEntity<ProblemDetails> handleConversionFailedException(
+            final ConversionFailedException conversionFailedException) {
         final ProblemDetails problemDetails = new ProblemDetails();
-        problemDetails.setDetail(subscriptionRequestConversionException.getMessage());
+        problemDetails.setDetail(conversionFailedException.getMessage());
         return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(problemDetails);
     }
 
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/test/java/org/onap/so/adapters/vnfmadapter/rest/EtsiSubscriptionNotificationControllerTest.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/test/java/org/onap/so/adapters/vnfmadapter/rest/EtsiSubscriptionNotificationControllerTest.java
new file mode 100644
index 0000000..8012f7e
--- /dev/null
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/test/java/org/onap/so/adapters/vnfmadapter/rest/EtsiSubscriptionNotificationControllerTest.java
@@ -0,0 +1,592 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2020 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.adapters.vnfmadapter.rest;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.onap.so.adapters.vnfmadapter.Constants.ETSI_SUBSCRIPTION_NOTIFICATION_CONTROLLER_BASE_URL;
+import static org.onap.so.client.RestTemplateConfig.CONFIGURABLE_REST_TEMPLATE;
+import static org.springframework.test.web.client.match.MockRestRequestMatchers.*;
+import static org.springframework.test.web.client.response.MockRestResponseCreators.withStatus;
+import static org.springframework.test.web.client.response.MockRestResponseCreators.withSuccess;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.onap.so.adapters.vnfmadapter.Constants;
+import org.onap.so.adapters.vnfmadapter.VnfmAdapterApplication;
+import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.ProblemDetails;
+import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.notification.model.NOTIFICATIONLINKSERIALIZER;
+import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.notification.model.PkgChangeNotification;
+import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.notification.model.PkgOnboardingNotification;
+import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.notification.model.PkgmLinks;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.PkgmSubscriptionRequest;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.SubscriptionsAuthentication;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.SubscriptionsAuthenticationParamsBasic;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.SubscriptionsAuthenticationParamsOauth2ClientCredentials;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.notification.model.VnfPackageChangeNotification;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.notification.model.VnfPackageOnboardingNotification;
+import org.onap.so.configuration.rest.BasicHttpHeadersProvider;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.web.client.TestRestTemplate;
+import org.springframework.boot.web.server.LocalServerPort;
+import org.springframework.cache.Cache;
+import org.springframework.cache.CacheManager;
+import org.springframework.http.*;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.test.web.client.MockRestServiceServer;
+import org.springframework.web.client.RestTemplate;
+import org.threeten.bp.LocalDateTime;
+import org.threeten.bp.OffsetDateTime;
+import org.threeten.bp.ZoneOffset;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+
+/**
+ * @author Andrew Lamb (andrew.a.lamb@est.tech)
+ *
+ */
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = VnfmAdapterApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+@ActiveProfiles("test")
+public class EtsiSubscriptionNotificationControllerTest {
+
+    @LocalServerPort
+    private int port;
+
+    private static final URI CALLBACK_URI = URI.create("http://test_callback_uri/notification");
+    private static final String TOKEN_ENDPOINT = "http://test_token_endpoint_uri/";
+    private static final String TOKEN = "dXNlcm5hbWU6cGFzc3dvcmQ=......";
+    private static final String JSON_TOKEN = "{\"access_token\":\"" + TOKEN + "\"}";
+    private static final String LOCALHOST_URL = "http://localhost:";
+    private static final String NOTIFICATION_BASE_URL =
+            ETSI_SUBSCRIPTION_NOTIFICATION_CONTROLLER_BASE_URL + "/notification";
+    private static final String USERNAME = "username";
+    private static final String PASSWORD = "password";
+    private static final String EXPECTED_BASIC_AUTHORIZATION = "Basic dXNlcm5hbWU6cGFzc3dvcmQ=";
+    private static final String EXPECTED_OAUTH_AUTHORIZATION = "Bearer " + TOKEN;
+    private static final String NOTIFICATION_ID = "NOTIFICATION_ID";
+    private static final String SUBSCRIPTION_ID = "SUBSCRIPTION_ID";
+    private static final OffsetDateTime TIMESTAMP =
+            OffsetDateTime.of(LocalDateTime.of(2020, 1, 1, 1, 1, 1, 1), ZoneOffset.ofHours(1));
+    private static final String VNFPKG_ID = UUID.randomUUID().toString();
+    private static final String VNFD_ID = UUID.randomUUID().toString();
+
+    private BasicHttpHeadersProvider basicHttpHeadersProvider;
+    private final Gson gson = new GsonBuilder().create();;
+
+    @Autowired
+    @Qualifier(CONFIGURABLE_REST_TEMPLATE)
+    private RestTemplate restTemplate;
+    private MockRestServiceServer mockRestServer;
+
+    @Autowired
+    private TestRestTemplate testRestTemplate;
+
+    @Autowired
+    private CacheManager cacheServiceProvider;
+    private Cache cache;
+
+    @Before
+    public void setUp() {
+        mockRestServer = MockRestServiceServer.bindTo(restTemplate).build();
+        basicHttpHeadersProvider = new BasicHttpHeadersProvider();
+        cache = cacheServiceProvider.getCache(Constants.PACKAGE_MANAGEMENT_SUBSCRIPTION_CACHE);
+        cache.clear();
+    }
+
+    @After
+    public void tearDown() {
+        cache.clear();
+    }
+
+    @Test
+    public void testSubscriptionNotificationEndPoint_ReturnsNoContent() {
+        final ResponseEntity<?> response = sendHttpGet(NOTIFICATION_BASE_URL);
+        assertEquals(HttpStatus.NO_CONTENT, response.getStatusCode());
+    }
+
+    @Test
+    public void testOnboardingNotificationSentOnToVnfmCallbackUri_SubscriptionRequestInCache_Success() {
+        final PkgmSubscriptionRequest subscriptionRequest =
+                buildPkgmSubscriptionRequest(SubscriptionsAuthentication.AuthTypeEnum.BASIC);
+        cache.put(SUBSCRIPTION_ID, subscriptionRequest);
+        final PkgOnboardingNotification notification = buildPkgOnboardingNotification();
+        final String notificationString = gson.toJson(notification);
+
+        mockRestServer.expect(requestTo(CALLBACK_URI)).andExpect(method(HttpMethod.POST))
+                .andExpect(jsonPath("$.id").value(NOTIFICATION_ID))
+                .andExpect(jsonPath("$.notificationType")
+                        .value(VnfPackageOnboardingNotification.NotificationTypeEnum.VNFPACKAGEONBOARDINGNOTIFICATION
+                                .toString()))
+                .andExpect(jsonPath("$.subscriptionId").value(SUBSCRIPTION_ID))
+                .andExpect(jsonPath("$.timeStamp").value(TIMESTAMP.toString()))
+                .andExpect(jsonPath("$.vnfPkgId").value(VNFPKG_ID.toString()))
+                .andExpect(jsonPath("$.vnfdId").value(VNFD_ID.toString()))
+                .andExpect(jsonPath("$._links").value(buildPkgmLinks()))
+                .andExpect(header("Authorization", EXPECTED_BASIC_AUTHORIZATION)).andRespond(withSuccess());
+
+        final ResponseEntity<?> response = sendHttpPost(notificationString);
+
+        assertEquals(HttpStatus.NO_CONTENT, response.getStatusCode());
+    }
+
+    @Test
+    public void testOnboardingNotificationNotSentOnToVnfmCallbackUri_SubscriptionRequestNotInCache_Fail() {
+        final PkgOnboardingNotification notification = buildPkgOnboardingNotification();
+        final String notificationString = gson.toJson(notification);
+        final ResponseEntity<?> response = sendHttpPost(notificationString);
+
+        assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, response.getStatusCode());
+        assertTrue(response.getBody() instanceof ProblemDetails);
+
+        final ProblemDetails problemDetails = (ProblemDetails) response.getBody();
+        final String errorMessage = "No subscription found with subscriptionId " + SUBSCRIPTION_ID
+                + ". Unable to forward notification to subscriber.";
+
+        assertEquals(errorMessage, problemDetails.getDetail());
+    }
+
+    @Test
+    public void testOnboardingNotificationSentOnToVnfmCallbackUri_BadRequestResponseFromCallbackUri_Fail() {
+        final PkgmSubscriptionRequest subscriptionRequest =
+                buildPkgmSubscriptionRequest(SubscriptionsAuthentication.AuthTypeEnum.BASIC);
+        cache.put(SUBSCRIPTION_ID, subscriptionRequest);
+        final PkgOnboardingNotification notification = buildPkgOnboardingNotification();
+        final String notificationString = gson.toJson(notification);
+
+        mockRestServer.expect(requestTo(CALLBACK_URI)).andExpect(method(HttpMethod.POST))
+                .andRespond(withStatus(HttpStatus.BAD_REQUEST));
+
+        final ResponseEntity<?> response = sendHttpPost(notificationString);
+
+        assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, response.getStatusCode());
+        assertTrue(response.getBody() instanceof ProblemDetails);
+
+        final ProblemDetails problemDetails = (ProblemDetails) response.getBody();
+        final String errorMessage = "An error occurred.  Sending of notification to VNFM failed with response: "
+                + HttpStatus.BAD_REQUEST + ".\n" + "No result found for given url: " + CALLBACK_URI;
+
+        assertEquals(errorMessage, problemDetails.getDetail());
+    }
+
+    @Test
+    public void testOnboardingNotificationSentOnToVnfmCallbackUri_301MovedPermanentlyResponseFromCallbackUri_Fail() {
+        final PkgmSubscriptionRequest subscriptionRequest =
+                buildPkgmSubscriptionRequest(SubscriptionsAuthentication.AuthTypeEnum.BASIC);
+        cache.put(SUBSCRIPTION_ID, subscriptionRequest);
+        final PkgOnboardingNotification notification = buildPkgOnboardingNotification();
+        final String notificationString = gson.toJson(notification);
+
+        mockRestServer.expect(requestTo(CALLBACK_URI)).andExpect(method(HttpMethod.POST))
+                .andRespond(withStatus(HttpStatus.MOVED_PERMANENTLY));
+
+        final ResponseEntity<?> response = sendHttpPost(notificationString);
+
+        assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, response.getStatusCode());
+        assertTrue(response.getBody() instanceof ProblemDetails);
+
+        final ProblemDetails problemDetails = (ProblemDetails) response.getBody();
+        final String errorMessage = "An error occurred.  Sending of notification to VNFM failed.";
+
+        assertEquals(errorMessage, problemDetails.getDetail());
+    }
+
+    @Test
+    public void testOnboardingNotificationSentOnToVnfmCallbackUri_NotFoundResponseFromCallbackUri_Fail() {
+        final PkgmSubscriptionRequest subscriptionRequest =
+                buildPkgmSubscriptionRequest(SubscriptionsAuthentication.AuthTypeEnum.BASIC);
+        cache.put(SUBSCRIPTION_ID, subscriptionRequest);
+        final PkgOnboardingNotification notification = buildPkgOnboardingNotification();
+        final String notificationString = gson.toJson(notification);
+
+        mockRestServer.expect(requestTo(CALLBACK_URI)).andExpect(method(HttpMethod.POST))
+                .andRespond(withStatus(HttpStatus.NOT_FOUND));
+
+        final ResponseEntity<?> response = sendHttpPost(notificationString);
+
+        assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, response.getStatusCode());
+        assertTrue(response.getBody() instanceof ProblemDetails);
+
+        final ProblemDetails problemDetails = (ProblemDetails) response.getBody();
+        final String errorMessage = "An error occurred.  Sending of notification to VNFM failed with response: "
+                + HttpStatus.NOT_FOUND + ".\n" + "No result found for given url: " + CALLBACK_URI;
+
+        assertEquals(errorMessage, problemDetails.getDetail());
+    }
+
+    @Test
+    public void testOnboardingNotificationSentOnToVnfmCallbackUri_InternalServerErrorResponseFromCallbackUri_Fail() {
+        final PkgmSubscriptionRequest subscriptionRequest =
+                buildPkgmSubscriptionRequest(SubscriptionsAuthentication.AuthTypeEnum.BASIC);
+        cache.put(SUBSCRIPTION_ID, subscriptionRequest);
+        final PkgOnboardingNotification notification = buildPkgOnboardingNotification();
+        final String notificationString = gson.toJson(notification);
+
+        mockRestServer.expect(requestTo(CALLBACK_URI)).andExpect(method(HttpMethod.POST))
+                .andRespond(withStatus(HttpStatus.INTERNAL_SERVER_ERROR));
+
+        final ResponseEntity<?> response = sendHttpPost(notificationString);
+
+        assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, response.getStatusCode());
+        assertTrue(response.getBody() instanceof ProblemDetails);
+
+        final ProblemDetails problemDetails = (ProblemDetails) response.getBody();
+        final String errorMessage = "An error occurred.  Sending of notification to VNFM failed with response: "
+                + HttpStatus.INTERNAL_SERVER_ERROR.value() + ".\n" + "Unable to invoke HTTP POST using URL: "
+                + CALLBACK_URI;
+
+        assertEquals(errorMessage, problemDetails.getDetail());
+    }
+
+    @Test
+    public void testChangeNotificationSentOnToVnfmCallbackUri_SubscriptionRequestInCache_Success() {
+        final PkgmSubscriptionRequest subscriptionRequest =
+                buildPkgmSubscriptionRequest(SubscriptionsAuthentication.AuthTypeEnum.BASIC);
+        cache.put(SUBSCRIPTION_ID, subscriptionRequest);
+        final PkgChangeNotification notification = buildPkgChangeNotification();
+        final String notificationString = gson.toJson(notification);
+
+        mockRestServer.expect(requestTo(CALLBACK_URI)).andExpect(method(HttpMethod.POST))
+                .andExpect(jsonPath("$.id").value(NOTIFICATION_ID))
+                .andExpect(jsonPath("$.notificationType").value(
+                        VnfPackageChangeNotification.NotificationTypeEnum.VNFPACKAGECHANGENOTIFICATION.toString()))
+                .andExpect(jsonPath("$.subscriptionId").value(SUBSCRIPTION_ID))
+                .andExpect(jsonPath("$.timeStamp").value(TIMESTAMP.toString()))
+                .andExpect(jsonPath("$.vnfPkgId").value(VNFPKG_ID.toString()))
+                .andExpect(jsonPath("$.vnfdId").value(VNFD_ID.toString()))
+                .andExpect(
+                        jsonPath("$.changeType").value(PkgChangeNotification.ChangeTypeEnum.OP_STATE_CHANGE.toString()))
+                .andExpect(jsonPath("$.operationalState")
+                        .value(PkgChangeNotification.OperationalStateEnum.ENABLED.toString()))
+                .andExpect(jsonPath("$._links").value(buildPkgmLinks()))
+                .andExpect(header("Authorization", EXPECTED_BASIC_AUTHORIZATION)).andRespond(withSuccess());
+
+        final ResponseEntity<?> response = sendHttpPost(notificationString);
+
+        assertEquals(HttpStatus.NO_CONTENT, response.getStatusCode());
+    }
+
+    @Test
+    public void testChangeNotificationNotSentOnToVnfmCallbackUri_SubscriptionRequestNotInCache_Fail() {
+        final PkgChangeNotification notification = buildPkgChangeNotification();
+        final String notificationString = gson.toJson(notification);
+        final ResponseEntity<?> response = sendHttpPost(notificationString);
+
+        assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, response.getStatusCode());
+        assertTrue(response.getBody() instanceof ProblemDetails);
+
+        final ProblemDetails problemDetails = (ProblemDetails) response.getBody();
+        final String errorMessage = "No subscription found with subscriptionId " + SUBSCRIPTION_ID
+                + ". Unable to forward notification to subscriber.";
+
+        assertEquals(errorMessage, problemDetails.getDetail());
+    }
+
+    @Test
+    public void testChangeNotificationSentOnToVnfmCallbackUri_BadRequestResponseFromCallbackUri_Fail() {
+        final PkgmSubscriptionRequest subscriptionRequest =
+                buildPkgmSubscriptionRequest(SubscriptionsAuthentication.AuthTypeEnum.BASIC);
+        cache.put(SUBSCRIPTION_ID, subscriptionRequest);
+        final PkgChangeNotification notification = buildPkgChangeNotification();
+        final String notificationString = gson.toJson(notification);
+
+        mockRestServer.expect(requestTo(CALLBACK_URI)).andExpect(method(HttpMethod.POST))
+                .andRespond(withStatus(HttpStatus.BAD_REQUEST));
+
+        final ResponseEntity<?> response = sendHttpPost(notificationString);
+
+        assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, response.getStatusCode());
+        assertTrue(response.getBody() instanceof ProblemDetails);
+
+        final ProblemDetails problemDetails = (ProblemDetails) response.getBody();
+        final String errorMessage = "An error occurred.  Sending of notification to VNFM failed with response: "
+                + HttpStatus.BAD_REQUEST + ".\n" + "No result found for given url: " + CALLBACK_URI;
+
+        assertEquals(errorMessage, problemDetails.getDetail());
+    }
+
+    @Test
+    public void testChangeNotificationSentOnToVnfmCallbackUri_NotFoundResponseFromCallbackUri_Fail() {
+        final PkgmSubscriptionRequest subscriptionRequest =
+                buildPkgmSubscriptionRequest(SubscriptionsAuthentication.AuthTypeEnum.BASIC);
+        cache.put(SUBSCRIPTION_ID, subscriptionRequest);
+        final PkgChangeNotification notification = buildPkgChangeNotification();
+        final String notificationString = gson.toJson(notification);
+
+        mockRestServer.expect(requestTo(CALLBACK_URI)).andExpect(method(HttpMethod.POST))
+                .andRespond(withStatus(HttpStatus.NOT_FOUND));
+
+        final ResponseEntity<?> response = sendHttpPost(notificationString);
+
+        assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, response.getStatusCode());
+        assertTrue(response.getBody() instanceof ProblemDetails);
+
+        final ProblemDetails problemDetails = (ProblemDetails) response.getBody();
+        final String errorMessage = "An error occurred.  Sending of notification to VNFM failed with response: "
+                + HttpStatus.NOT_FOUND + ".\n" + "No result found for given url: " + CALLBACK_URI;
+
+        assertEquals(errorMessage, problemDetails.getDetail());
+    }
+
+    @Test
+    public void testChangeNotificationSentOnToVnfmCallbackUri_InternalServerErrorResponseFromCallbackUri_Fail() {
+        final PkgmSubscriptionRequest subscriptionRequest =
+                buildPkgmSubscriptionRequest(SubscriptionsAuthentication.AuthTypeEnum.BASIC);
+        cache.put(SUBSCRIPTION_ID, subscriptionRequest);
+        final PkgChangeNotification notification = buildPkgChangeNotification();
+        final String notificationString = gson.toJson(notification);
+
+        mockRestServer.expect(requestTo(CALLBACK_URI)).andExpect(method(HttpMethod.POST))
+                .andRespond(withStatus(HttpStatus.INTERNAL_SERVER_ERROR));
+
+        final ResponseEntity<?> response = sendHttpPost(notificationString);
+
+        assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, response.getStatusCode());
+        assertTrue(response.getBody() instanceof ProblemDetails);
+
+        final ProblemDetails problemDetails = (ProblemDetails) response.getBody();
+        final String errorMessage = "An error occurred.  Sending of notification to VNFM failed with response: "
+                + HttpStatus.INTERNAL_SERVER_ERROR.value() + ".\n" + "Unable to invoke HTTP POST using URL: "
+                + CALLBACK_URI;
+
+        assertEquals(errorMessage, problemDetails.getDetail());
+    }
+
+    @Test
+    public void testNotificationSentOnToVnfm_BasicAuthUserPasswordAuthorized_Success() {
+        final PkgmSubscriptionRequest subscriptionRequest =
+                buildPkgmSubscriptionRequest(SubscriptionsAuthentication.AuthTypeEnum.BASIC);
+        cache.put(SUBSCRIPTION_ID, subscriptionRequest);
+        final PkgOnboardingNotification notification = buildPkgOnboardingNotification();
+        final String notificationString = gson.toJson(notification);
+
+        mockRestServer.expect(requestTo(CALLBACK_URI)).andExpect(method(HttpMethod.POST))
+                .andExpect(jsonPath("$.id").value(NOTIFICATION_ID))
+                .andExpect(jsonPath("$.notificationType")
+                        .value(VnfPackageOnboardingNotification.NotificationTypeEnum.VNFPACKAGEONBOARDINGNOTIFICATION
+                                .toString()))
+                .andExpect(jsonPath("$.subscriptionId").value(SUBSCRIPTION_ID))
+                .andExpect(jsonPath("$.timeStamp").value(TIMESTAMP.toString()))
+                .andExpect(jsonPath("$.vnfPkgId").value(VNFPKG_ID.toString()))
+                .andExpect(jsonPath("$.vnfdId").value(VNFD_ID.toString()))
+                .andExpect(jsonPath("$._links").value(buildPkgmLinks()))
+                .andExpect(header("Authorization", EXPECTED_BASIC_AUTHORIZATION)).andRespond(withSuccess());
+
+        final ResponseEntity<?> response = sendHttpPost(notificationString);
+
+        assertEquals(HttpStatus.NO_CONTENT, response.getStatusCode());
+    }
+
+    @Test
+    public void testNotificationSentOnToVnfm_BasicAuthUserPasswordNotAuthorized_Fail() {
+        final PkgmSubscriptionRequest subscriptionRequest =
+                buildPkgmSubscriptionRequest(SubscriptionsAuthentication.AuthTypeEnum.BASIC);
+        cache.put(SUBSCRIPTION_ID, subscriptionRequest);
+        final PkgChangeNotification notification = buildPkgChangeNotification();
+        final String notificationString = gson.toJson(notification);
+
+        mockRestServer.expect(requestTo(CALLBACK_URI)).andExpect(method(HttpMethod.POST))
+                .andExpect(header("Authorization", EXPECTED_BASIC_AUTHORIZATION))
+                .andRespond(withStatus(HttpStatus.UNAUTHORIZED));
+
+        final ResponseEntity<?> response = sendHttpPost(notificationString);
+
+        assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, response.getStatusCode());
+        assertTrue(response.getBody() instanceof ProblemDetails);
+
+        final ProblemDetails problemDetails = (ProblemDetails) response.getBody();
+        final String errorMessage = "An error occurred.  Sending of notification to VNFM failed with response: "
+                + HttpStatus.UNAUTHORIZED.value() + ".\n" + "Unable to invoke HTTP POST using URL: " + CALLBACK_URI;
+
+        assertEquals(errorMessage, problemDetails.getDetail());
+    }
+
+    @Test
+    public void testNotificationSentOnToVnfm_OAuthAuthorized_Success() {
+        final PkgmSubscriptionRequest subscriptionRequest =
+                buildPkgmSubscriptionRequest(SubscriptionsAuthentication.AuthTypeEnum.OAUTH2_CLIENT_CREDENTIALS);
+        cache.put(SUBSCRIPTION_ID, subscriptionRequest);
+        final PkgChangeNotification notification = buildPkgChangeNotification();
+        final String notificationString = gson.toJson(notification);
+
+        mockRestServer.expect(requestTo(TOKEN_ENDPOINT)).andExpect(method(HttpMethod.POST))
+                .andExpect(header("Authorization", EXPECTED_BASIC_AUTHORIZATION))
+                .andRespond(withSuccess(JSON_TOKEN, MediaType.APPLICATION_JSON));
+
+        mockRestServer.expect(requestTo(CALLBACK_URI)).andExpect(method(HttpMethod.POST))
+                .andExpect(header("Authorization", EXPECTED_OAUTH_AUTHORIZATION))
+                .andExpect(jsonPath("$.id").value(NOTIFICATION_ID))
+                .andExpect(jsonPath("$.notificationType").value(
+                        VnfPackageChangeNotification.NotificationTypeEnum.VNFPACKAGECHANGENOTIFICATION.toString()))
+                .andExpect(jsonPath("$.subscriptionId").value(SUBSCRIPTION_ID))
+                .andExpect(jsonPath("$.timeStamp").value(TIMESTAMP.toString()))
+                .andExpect(jsonPath("$.vnfPkgId").value(VNFPKG_ID.toString()))
+                .andExpect(jsonPath("$.vnfdId").value(VNFD_ID.toString()))
+                .andExpect(
+                        jsonPath("$.changeType").value(PkgChangeNotification.ChangeTypeEnum.OP_STATE_CHANGE.toString()))
+                .andExpect(jsonPath("$.operationalState")
+                        .value(PkgChangeNotification.OperationalStateEnum.ENABLED.toString()))
+                .andExpect(jsonPath("$._links").value(buildPkgmLinks())).andRespond(withSuccess());
+
+        final ResponseEntity<?> response = sendHttpPost(notificationString);
+
+        assertEquals(HttpStatus.NO_CONTENT, response.getStatusCode());
+    }
+
+    @Test
+    public void testNotificationSentOnToVnfm_OAuthTokenNotReceived_Fail() {
+        final PkgmSubscriptionRequest subscriptionRequest =
+                buildPkgmSubscriptionRequest(SubscriptionsAuthentication.AuthTypeEnum.OAUTH2_CLIENT_CREDENTIALS);
+        cache.put(SUBSCRIPTION_ID, subscriptionRequest);
+        final PkgChangeNotification notification = buildPkgChangeNotification();
+        final String notificationString = gson.toJson(notification);
+
+        mockRestServer.expect(requestTo(TOKEN_ENDPOINT)).andExpect(method(HttpMethod.POST))
+                .andExpect(header("Authorization", EXPECTED_BASIC_AUTHORIZATION)).andRespond(withSuccess());
+
+        final ResponseEntity<?> response = sendHttpPost(notificationString);
+
+        assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, response.getStatusCode());
+        assertTrue(response.getBody() instanceof ProblemDetails);
+
+        final ProblemDetails problemDetails = (ProblemDetails) response.getBody();
+        final String errorMessage = "An error occurred.  Unable to retrieve OAuth Token from VNFM for notification.";
+
+        assertEquals(errorMessage, problemDetails.getDetail());
+    }
+
+    @Test
+    public void testNotificationSentOnToVnfm_TLSCertNotYetSupported_Fail() {
+        final PkgmSubscriptionRequest subscriptionRequest =
+                buildPkgmSubscriptionRequest(SubscriptionsAuthentication.AuthTypeEnum.TLS_CERT);
+        cache.put(SUBSCRIPTION_ID, subscriptionRequest);
+        final PkgChangeNotification notification = buildPkgChangeNotification();
+        final String notificationString = gson.toJson(notification);
+
+        final ResponseEntity<?> response = sendHttpPost(notificationString);
+
+        assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, response.getStatusCode());
+        assertTrue(response.getBody() instanceof ProblemDetails);
+
+        final ProblemDetails problemDetails = (ProblemDetails) response.getBody();
+        final String errorMessage = "An error occurred.  Authentication type "
+                + subscriptionRequest.getAuthentication().getAuthType().toString() + " not currently supported.";
+
+        assertEquals(errorMessage, problemDetails.getDetail());
+    }
+
+    private PkgOnboardingNotification buildPkgOnboardingNotification() {
+        final PkgOnboardingNotification notification = new PkgOnboardingNotification();
+        notification.setId(NOTIFICATION_ID);
+        notification
+                .setNotificationType(PkgOnboardingNotification.NotificationTypeEnum.VNFPACKAGEONBOARDINGNOTIFICATION);
+        notification.setSubscriptionId(SUBSCRIPTION_ID);
+        notification.setTimeStamp(TIMESTAMP);
+        notification.setVnfPkgId(VNFPKG_ID);
+        notification.setVnfdId(VNFD_ID);
+        notification.setLinks(buildPkgmLinks());
+        return notification;
+    }
+
+    private PkgChangeNotification buildPkgChangeNotification() {
+        final PkgChangeNotification notification = new PkgChangeNotification();
+        notification.setId(NOTIFICATION_ID);
+        notification.setNotificationType(PkgChangeNotification.NotificationTypeEnum.VNFPACKAGECHANGENOTIFICATION);
+        notification.setSubscriptionId(SUBSCRIPTION_ID);
+        notification.setTimeStamp(TIMESTAMP);
+        notification.setVnfPkgId(VNFPKG_ID);
+        notification.setVnfdId(VNFD_ID);
+        notification.setChangeType(PkgChangeNotification.ChangeTypeEnum.OP_STATE_CHANGE);
+        notification.setOperationalState(PkgChangeNotification.OperationalStateEnum.ENABLED);
+        notification.setLinks(buildPkgmLinks());
+        return notification;
+    }
+
+    private PkgmLinks buildPkgmLinks() {
+        final PkgmLinks pkgmLinks = new PkgmLinks();
+
+        final NOTIFICATIONLINKSERIALIZER subscriptionLinkSerializer = new NOTIFICATIONLINKSERIALIZER();
+        subscriptionLinkSerializer.setHref("subscription_href");
+        pkgmLinks.setSubscription(subscriptionLinkSerializer);
+
+        final NOTIFICATIONLINKSERIALIZER vnfPackageLinkSerializer = new NOTIFICATIONLINKSERIALIZER();
+        vnfPackageLinkSerializer.setHref("vnf_package_href");
+        pkgmLinks.setVnfPackage(vnfPackageLinkSerializer);
+
+        return pkgmLinks;
+    }
+
+    private PkgmSubscriptionRequest buildPkgmSubscriptionRequest(
+            final SubscriptionsAuthentication.AuthTypeEnum authTypeEnum) {
+        final PkgmSubscriptionRequest subscriptionRequest = new PkgmSubscriptionRequest();
+        subscriptionRequest.setCallbackUri(CALLBACK_URI.toString());
+        subscriptionRequest.setAuthentication(buildSubscriptionsAuthentication(authTypeEnum));
+        return subscriptionRequest;
+    }
+
+    // TODO update for auth types other than basicAuth
+    private SubscriptionsAuthentication buildSubscriptionsAuthentication(
+            final SubscriptionsAuthentication.AuthTypeEnum authTypeEnum) {
+        final SubscriptionsAuthentication subscriptionsAuthentication = new SubscriptionsAuthentication();
+        final List<SubscriptionsAuthentication.AuthTypeEnum> authTypes = new ArrayList<>();
+        authTypes.add(authTypeEnum);
+        subscriptionsAuthentication.setAuthType(authTypes);
+        if (authTypeEnum == SubscriptionsAuthentication.AuthTypeEnum.TLS_CERT) {
+            // TODO: remove basic params and code for TLS
+            final SubscriptionsAuthenticationParamsBasic basicParams =
+                    new SubscriptionsAuthenticationParamsBasic().userName(USERNAME).password(PASSWORD);
+            subscriptionsAuthentication.setParamsBasic(basicParams);
+        } else if (authTypeEnum == SubscriptionsAuthentication.AuthTypeEnum.OAUTH2_CLIENT_CREDENTIALS) {
+            final SubscriptionsAuthenticationParamsOauth2ClientCredentials oathParams =
+                    new SubscriptionsAuthenticationParamsOauth2ClientCredentials().clientId(USERNAME)
+                            .clientPassword(PASSWORD).tokenEndpoint(TOKEN_ENDPOINT);
+            subscriptionsAuthentication.setParamsOauth2ClientCredentials(oathParams);
+        } else {
+            final SubscriptionsAuthenticationParamsBasic basicParams =
+                    new SubscriptionsAuthenticationParamsBasic().userName(USERNAME).password(PASSWORD);
+            subscriptionsAuthentication.setParamsBasic(basicParams);
+        }
+
+        return subscriptionsAuthentication;
+    }
+
+    private <T> ResponseEntity<ProblemDetails> sendHttpPost(final T notification) {
+        final String testURL = LOCALHOST_URL + port + NOTIFICATION_BASE_URL;
+        final HttpEntity<?> request = new HttpEntity<>(notification, basicHttpHeadersProvider.getHttpHeaders());
+        return testRestTemplate.withBasicAuth("test", "test").exchange(testURL, HttpMethod.POST, request,
+                ProblemDetails.class);
+    }
+
+    private ResponseEntity<Void> sendHttpGet(final String url) {
+        final String testURL = LOCALHOST_URL + port + url;
+        final HttpEntity<?> request = new HttpEntity<>(basicHttpHeadersProvider.getHttpHeaders());
+        return testRestTemplate.withBasicAuth("test", "test").exchange(testURL, HttpMethod.GET, request, Void.class);
+    }
+
+}
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/test/java/org/onap/so/adapters/vnfmadapter/rest/Sol003PackageManagementSubscriptionControllerTest.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/test/java/org/onap/so/adapters/vnfmadapter/rest/Sol003PackageManagementSubscriptionControllerTest.java
index 3d26c33..ba1bf71 100644
--- a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/test/java/org/onap/so/adapters/vnfmadapter/rest/Sol003PackageManagementSubscriptionControllerTest.java
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/test/java/org/onap/so/adapters/vnfmadapter/rest/Sol003PackageManagementSubscriptionControllerTest.java
@@ -20,27 +20,32 @@
 
 package org.onap.so.adapters.vnfmadapter.rest;
 
+import static org.hamcrest.Matchers.is;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertThat;
 import static org.onap.so.adapters.vnfmadapter.Constants.PACKAGE_MANAGEMENT_BASE_URL;
 import static org.onap.so.client.RestTemplateConfig.CONFIGURABLE_REST_TEMPLATE;
+import static org.springframework.test.web.client.match.MockRestRequestMatchers.method;
 import static org.springframework.test.web.client.match.MockRestRequestMatchers.requestTo;
-import java.security.GeneralSecurityException;
+import static org.springframework.test.web.client.response.MockRestResponseCreators.withStatus;
+import static org.springframework.test.web.client.response.MockRestResponseCreators.withSuccess;
 import java.net.URI;
 import java.net.URISyntaxException;
+import java.security.GeneralSecurityException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
 import java.util.UUID;
-import com.google.gson.Gson;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.onap.so.adapters.vnfmadapter.Constants;
 import org.onap.so.adapters.vnfmadapter.VnfmAdapterApplication;
 import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.LinkSelf;
+import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.NsdmSubscription;
 import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.PkgmNotificationsFilter;
 import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.PkgmSubscription;
 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.InlineResponse2002;
@@ -51,13 +56,13 @@
 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.SubscriptionsFilterVnfProductsFromProviders;
 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.SubscriptionsLinks;
 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.VnfPackagesLinksSelf;
-import org.onap.so.utils.CryptoUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.cache.Cache;
 import org.springframework.cache.CacheManager;
 import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.MediaType;
 import org.springframework.http.ResponseEntity;
@@ -65,42 +70,33 @@
 import org.springframework.test.context.junit4.SpringRunner;
 import org.springframework.test.web.client.MockRestServiceServer;
 import org.springframework.web.client.RestTemplate;
-import org.springframework.http.HttpMethod;
-import static org.springframework.test.web.client.match.MockRestRequestMatchers.method;
-import static org.hamcrest.Matchers.is;
-import static org.springframework.test.web.client.response.MockRestResponseCreators.withStatus;
-import static org.springframework.test.web.client.response.MockRestResponseCreators.withSuccess;
+import com.google.gson.Gson;
 
 /**
  * @author Ronan Kenny (ronan.kenny@est.tech)
  * @author Gareth Roper (gareth.roper@est.tech)
- *
  */
 @RunWith(SpringRunner.class)
 @SpringBootTest(classes = VnfmAdapterApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
 @ActiveProfiles("test")
-@SuppressWarnings("unchecked")
 public class Sol003PackageManagementSubscriptionControllerTest {
 
-    private static String subscriptionId;
     private final Gson gson = new Gson();
-
+    private final URI msbEndpoint = URI.create("http://msb-iag.onap:80/api/vnfpkgm/v1/subscriptions");
     @Autowired
     @Qualifier(CONFIGURABLE_REST_TEMPLATE)
-    private RestTemplate testRestTemplate;
-
-    private MockRestServiceServer mockRestServer;
-
+    private RestTemplate restTemplate;
+    private MockRestServiceServer mockRestServiceServer;
     @Autowired
     private CacheManager cacheServiceProvider;
-    private final URI msbEndpoint = URI.create("http://msb-iag.onap:80/api/vnfpkgm/v1/subscriptions");
-
     @Autowired
     private Sol003PackageManagementSubscriptionController sol003PackageManagementSubscriptionController;
 
+    private static final String ID = UUID.randomUUID().toString();
+
     @Before
     public void setUp() {
-        mockRestServer = MockRestServiceServer.bindTo(testRestTemplate).build();
+        mockRestServiceServer = MockRestServiceServer.bindTo(restTemplate).build();
         final Cache cache = cacheServiceProvider.getCache(Constants.PACKAGE_MANAGEMENT_SUBSCRIPTION_CACHE);
         cache.clear();
     }
@@ -114,8 +110,8 @@
 
         final HttpHeaders headers = buildHttpHeaders(Objects.requireNonNull(response.getBody()).getCallbackUri());
 
-        SubscriptionsLinks subscriptionsLinks = new SubscriptionsLinks();
-        VnfPackagesLinksSelf vnfPackagesLinksSelf = new VnfPackagesLinksSelf();
+        final SubscriptionsLinks subscriptionsLinks = new SubscriptionsLinks();
+        final VnfPackagesLinksSelf vnfPackagesLinksSelf = new VnfPackagesLinksSelf();
         vnfPackagesLinksSelf.setHref("https://so-vnfm-adapter.onap:30406" + PACKAGE_MANAGEMENT_BASE_URL
                 + "/subscriptions/" + response.getBody().getId());
         subscriptionsLinks.setSelf(vnfPackagesLinksSelf);
@@ -135,7 +131,6 @@
         final ResponseEntity<InlineResponse2002> response =
                 (ResponseEntity<InlineResponse2002>) sol003PackageManagementSubscriptionController
                         .postSubscriptionRequest(pkgmSubscriptionRequest);
-        subscriptionId = Objects.requireNonNull(response.getBody()).getId();
 
         // Create duplicate entry
         final PkgmSubscriptionRequest pkgmSubscriptionRequest2 = buildPkgmSubscriptionRequest();
@@ -149,12 +144,18 @@
 
     @Test
     public void testSuccessGetSubscriptionWithSubscriptionId() throws GeneralSecurityException, URISyntaxException {
+
         final PkgmSubscriptionRequest pkgmSubscriptionRequest = postSubscriptionForTest();
 
+        mockRestServiceServer.expect(requestTo(msbEndpoint + "/" + ID)).andExpect(method(HttpMethod.GET))
+                .andRespond(withSuccess(gson.toJson(new NsdmSubscription().id(ID)), MediaType.APPLICATION_JSON));
+
         final ResponseEntity<InlineResponse2002> response =
                 (ResponseEntity<InlineResponse2002>) sol003PackageManagementSubscriptionController
                         .postSubscriptionRequest(pkgmSubscriptionRequest);
-        subscriptionId = Objects.requireNonNull(response.getBody()).getId();
+        final String subscriptionId = response.getBody().getId();
+
+
 
         final ResponseEntity<InlineResponse2002> response2002 =
                 (ResponseEntity<InlineResponse2002>) sol003PackageManagementSubscriptionController
@@ -162,9 +163,8 @@
 
         final HttpHeaders headers = buildHttpHeaders(response.getBody().getCallbackUri());
 
-
         assertEquals(response.getBody().getFilter(), pkgmSubscriptionRequest.getFilter());
-        assert (response.getHeaders().equals(headers));
+        assertEquals(response.getHeaders(), headers);
         assertEquals(HttpStatus.OK, response2002.getStatusCode());
         assertEquals(pkgmSubscriptionRequest.getFilter(), response.getBody().getFilter());
         // Ensure CallBackUri is set to new URI
@@ -173,9 +173,12 @@
 
     @Test
     public void testFailGetSubscriptionWithInvalidSubscriptionId() {
+        final String invalidId = "invalidSubscriptionId";
+        mockRestServiceServer.expect(requestTo(msbEndpoint + "/" + invalidId)).andExpect(method(HttpMethod.GET))
+                .andRespond(withStatus(HttpStatus.NOT_FOUND));
         final ResponseEntity<InlineResponse2002> response =
                 (ResponseEntity<InlineResponse2002>) sol003PackageManagementSubscriptionController
-                        .getSubscription("invalidSubscriptionId");
+                        .getSubscription(invalidId);
         assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode());
     }
 
@@ -184,14 +187,16 @@
         final PkgmSubscription pkgmSubscription = buildPkgmSubscription();
         final PkgmSubscriptionRequest pkgmSubscriptionRequest = buildPkgmSubscriptionRequest();
 
-        mockRestServer.expect(requestTo(msbEndpoint)).andExpect(method(HttpMethod.POST))
+        mockRestServiceServer.expect(requestTo(msbEndpoint)).andExpect(method(HttpMethod.POST))
                 .andRespond(withSuccess(gson.toJson(pkgmSubscription), MediaType.APPLICATION_JSON));
+        mockRestServiceServer.expect(requestTo(msbEndpoint + "/" + ID)).andExpect(method(HttpMethod.GET))
+                .andRespond(withSuccess(gson.toJson(new NsdmSubscription().id(ID)), MediaType.APPLICATION_JSON));
 
         sol003PackageManagementSubscriptionController.postSubscriptionRequest(pkgmSubscriptionRequest);
-        ResponseEntity<List<InlineResponse2002>> response =
+        final ResponseEntity<List<InlineResponse2002>> response =
                 sol003PackageManagementSubscriptionController.getSubscriptions();
 
-        List<InlineResponse2002> subscriptionsList = response.getBody();
+        final List<InlineResponse2002> subscriptionsList = response.getBody();
 
         assertEquals(Objects.requireNonNull(response.getBody()).get(0).getFilter(),
                 pkgmSubscriptionRequest.getFilter());
@@ -206,16 +211,19 @@
         final PkgmSubscription pkgmSubscription = buildPkgmSubscription();
         final String subscriptionId = pkgmSubscription.getId();
 
-        mockRestServer.expect(requestTo(msbEndpoint)).andExpect(method(HttpMethod.POST))
+        mockRestServiceServer.expect(requestTo(msbEndpoint)).andExpect(method(HttpMethod.POST))
                 .andRespond(withSuccess(gson.toJson(pkgmSubscription), MediaType.APPLICATION_JSON));
-        mockRestServer.expect(requestTo(msbEndpoint + "/" + subscriptionId)).andExpect(method(HttpMethod.DELETE))
+
+        mockRestServiceServer.expect(requestTo(msbEndpoint + "/" + subscriptionId)).andExpect(method(HttpMethod.DELETE))
                 .andRespond(withStatus(HttpStatus.NO_CONTENT));
+        mockRestServiceServer.expect(requestTo(msbEndpoint + "/" + subscriptionId)).andExpect(method(HttpMethod.GET))
+                .andRespond(withSuccess(gson.toJson(new NsdmSubscription().id(subscriptionId)),
+                        MediaType.APPLICATION_JSON));
 
         final ResponseEntity<InlineResponse2002> responsePost =
                 (ResponseEntity<InlineResponse2002>) sol003PackageManagementSubscriptionController
                         .postSubscriptionRequest(pkgmSubscriptionRequest);
 
-
         final ResponseEntity responseDelete =
                 sol003PackageManagementSubscriptionController.deleteSubscription(subscriptionId);
 
@@ -229,6 +237,32 @@
     }
 
     @Test
+    public void testDeleteSubscription_SubscripitonNotFoundInEtsiCatalogManager_SubscriptionDeletedFromLocalCache()
+            throws GeneralSecurityException {
+        final PkgmSubscriptionRequest pkgmSubscriptionRequest = buildPkgmSubscriptionRequest();
+        final PkgmSubscription pkgmSubscription = buildPkgmSubscription();
+
+        mockRestServiceServer.expect(requestTo(msbEndpoint)).andExpect(method(HttpMethod.POST))
+                .andRespond(withSuccess(gson.toJson(pkgmSubscription), MediaType.APPLICATION_JSON));
+
+        mockRestServiceServer.expect(requestTo(msbEndpoint + "/" + ID)).andExpect(method(HttpMethod.DELETE))
+                .andRespond(withStatus(HttpStatus.NOT_FOUND));
+
+        final ResponseEntity<InlineResponse2002> responsePost =
+                (ResponseEntity<InlineResponse2002>) sol003PackageManagementSubscriptionController
+                        .postSubscriptionRequest(pkgmSubscriptionRequest);
+
+        final Cache cache = cacheServiceProvider.getCache(Constants.PACKAGE_MANAGEMENT_SUBSCRIPTION_CACHE);
+        assertNotNull(cache.get(ID));
+
+        final ResponseEntity responseDelete = sol003PackageManagementSubscriptionController.deleteSubscription(ID);
+
+        assertEquals(HttpStatus.NO_CONTENT, responseDelete.getStatusCode());
+        assertNull(cache.get(ID));
+
+    }
+
+    @Test
     public void testFailDeleteSubscriptionWithInvalidSubscriptionId() throws URISyntaxException, InterruptedException {
         final ResponseEntity<Void> responseDelete = (ResponseEntity<Void>) sol003PackageManagementSubscriptionController
                 .deleteSubscription("invalidSubscriptionId");
@@ -263,11 +297,11 @@
     }
 
     private PkgmSubscription buildPkgmSubscription() {
-        PkgmSubscription pkgmSubscription = new PkgmSubscription();
-        PkgmNotificationsFilter pkgmNotificationsFilter = new PkgmNotificationsFilter();
-        LinkSelf linkSelf = new LinkSelf();
-        String id = UUID.randomUUID().toString();
-        pkgmSubscription.setId(id);
+        final PkgmSubscription pkgmSubscription = new PkgmSubscription();
+        final PkgmNotificationsFilter pkgmNotificationsFilter = new PkgmNotificationsFilter();
+        final LinkSelf linkSelf = new LinkSelf();
+
+        pkgmSubscription.setId(ID);
         pkgmSubscription.setCallbackUri(msbEndpoint + "/" + pkgmSubscription.getId().toString());
         pkgmSubscription.setFilter(pkgmNotificationsFilter);
         pkgmSubscription.setLinks(linkSelf);
@@ -278,14 +312,14 @@
         final PkgmSubscriptionRequest pkgmSubscriptionRequest = buildPkgmSubscriptionRequest();
         final PkgmSubscription pkgmSubscription = buildPkgmSubscription();
 
-        mockRestServer.expect(requestTo(msbEndpoint)).andExpect(method(HttpMethod.POST))
+        mockRestServiceServer.expect(requestTo(msbEndpoint)).andExpect(method(HttpMethod.POST))
                 .andRespond(withSuccess(gson.toJson(pkgmSubscription), MediaType.APPLICATION_JSON));
         return pkgmSubscriptionRequest;
     }
 
-    private HttpHeaders buildHttpHeaders(String uri) throws URISyntaxException {
+    private HttpHeaders buildHttpHeaders(final String uri) throws URISyntaxException {
         final HttpHeaders headers = new HttpHeaders();
-        URI myUri = new URI(uri);
+        final URI myUri = new URI(uri);
         headers.setLocation(myUri);
         return headers;
     }
diff --git a/asdc-controller/src/main/java/org/onap/so/asdc/activity/ActivitySpecsActions.java b/asdc-controller/src/main/java/org/onap/so/asdc/activity/ActivitySpecsActions.java
index 06887f1..a48e177 100644
--- a/asdc-controller/src/main/java/org/onap/so/asdc/activity/ActivitySpecsActions.java
+++ b/asdc-controller/src/main/java/org/onap/so/asdc/activity/ActivitySpecsActions.java
@@ -4,12 +4,15 @@
  * ================================================================================
  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
+ * Modifications Copyright (c) 2020 Nokia
+ * ================================================================================
+ *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -29,7 +32,6 @@
 import org.onap.so.asdc.activity.beans.ActivitySpecCreateResponse;
 import org.onap.so.client.HttpClient;
 import org.onap.so.client.HttpClientFactory;
-import org.onap.so.logger.LoggingAnchor;
 import org.onap.logging.filter.base.ONAPComponents;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -53,8 +55,6 @@
             return null;
         }
 
-        String activitySpecId = null;
-
         try {
             ObjectMapper mapper = new ObjectMapper();
             mapper.setSerializationInclusion(Include.NON_NULL);
@@ -71,30 +71,34 @@
             int statusCode = response.getStatus();
             if (statusCode == HttpStatus.SC_UNPROCESSABLE_ENTITY) {
                 logger.warn(LoggingAnchor.THREE, "ActivitySpec", activitySpec.getName(), "already exists in SDC");
-            } else if (statusCode != HttpStatus.SC_OK && statusCode != HttpStatus.SC_CREATED) {
-                logger.warn(LoggingAnchor.THREE, "Error creating activity spec", activitySpec.getName(), statusCode);
-            } else {
-                if (response.getEntity() != null) {
-                    ActivitySpecCreateResponse activitySpecCreateResponse =
-                            response.readEntity(ActivitySpecCreateResponse.class);
-                    if (activitySpecCreateResponse != null) {
-                        activitySpecId = activitySpecCreateResponse.getId();
-                    } else {
-                        logger.warn(LoggingAnchor.TWO, "Unable to read activity spec", activitySpec.getName());
-                    }
-                } else {
-                    logger.warn(LoggingAnchor.TWO, "No activity spec response returned", activitySpec.getName());
-                }
+                return null;
             }
+            if (statusCode != HttpStatus.SC_OK && statusCode != HttpStatus.SC_CREATED) {
+                logger.warn(LoggingAnchor.THREE, "Error creating activity spec", activitySpec.getName(), statusCode);
+                return null;
+            }
+
+            if (response.getEntity() == null) {
+                logger.warn(LoggingAnchor.TWO, "No activity spec response returned", activitySpec.getName());
+                return null;
+            }
+            ActivitySpecCreateResponse activitySpecCreateResponse =
+                    response.readEntity(ActivitySpecCreateResponse.class);
+            if (activitySpecCreateResponse == null) {
+                logger.warn(LoggingAnchor.TWO, "Unable to read activity spec", activitySpec.getName());
+                return null;
+            }
+            return activitySpecCreateResponse.getId();
+
+
         } catch (Exception e) {
             logger.warn(LoggingAnchor.TWO, "Exception creating activitySpec", e);
         }
 
-        return activitySpecId;
+        return null;
     }
 
     public boolean certifyActivitySpec(String hostname, String activitySpecId) {
-        boolean certificationResult = false;
         if (activitySpecId == null) {
             return false;
         }
@@ -114,16 +118,19 @@
 
             if (statusCode == HttpStatus.SC_UNPROCESSABLE_ENTITY) {
                 logger.warn(LoggingAnchor.THREE, "ActivitySpec with id", activitySpecId, "is already certified in SDC");
-            } else if (statusCode != HttpStatus.SC_OK) {
-                logger.warn(LoggingAnchor.THREE, "Error certifying activity", activitySpecId, statusCode);
-            } else {
-                certificationResult = true;
+                return false;
             }
+            if (statusCode != HttpStatus.SC_OK) {
+                logger.warn(LoggingAnchor.THREE, "Error certifying activity", activitySpecId, statusCode);
+                return false;
+            }
+
+            return true;
 
         } catch (Exception e) {
             logger.warn(LoggingAnchor.TWO, "Exception certifying activitySpec", e);
+            return false;
         }
 
-        return certificationResult;
     }
 }
diff --git a/asdc-controller/src/main/java/org/onap/so/asdc/activity/DeployActivitySpecs.java b/asdc-controller/src/main/java/org/onap/so/asdc/activity/DeployActivitySpecs.java
index e53b792..df8e828 100644
--- a/asdc-controller/src/main/java/org/onap/so/asdc/activity/DeployActivitySpecs.java
+++ b/asdc-controller/src/main/java/org/onap/so/asdc/activity/DeployActivitySpecs.java
@@ -4,12 +4,14 @@
  * ================================================================================
  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
+ *  Modifications Copyright (c) 2020 Nokia
+ * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -74,17 +76,19 @@
             logger.debug("{} {}", "Attempting to create activity ", activitySpecFromCatalog.getName());
             ActivitySpec activitySpec = mapActivitySpecFromCatalogToSdc(activitySpecFromCatalog);
             String activitySpecId = activitySpecsActions.createActivitySpec(hostname, activitySpec);
-            if (activitySpecId != null) {
-                logger.info(LoggingAnchor.TWO, "Successfully created activitySpec", activitySpec.getName());
-                boolean certificationResult = activitySpecsActions.certifyActivitySpec(hostname, activitySpecId);
-                if (certificationResult) {
-                    logger.info(LoggingAnchor.TWO, "Successfully certified activitySpec", activitySpec.getName());
-                } else {
-                    logger.info(LoggingAnchor.TWO, "Failed to certify activitySpec", activitySpec.getName());
-                }
-            } else {
+            if (activitySpecId == null) {
                 logger.info(LoggingAnchor.TWO, "Failed to create activitySpec", activitySpec.getName());
+                continue;
             }
+
+            logger.info(LoggingAnchor.TWO, "Successfully created activitySpec", activitySpec.getName());
+            boolean certificationResult = activitySpecsActions.certifyActivitySpec(hostname, activitySpecId);
+            if (!certificationResult) {
+                logger.info(LoggingAnchor.TWO, "Failed to certify activitySpec", activitySpec.getName());
+                continue;
+            }
+
+            logger.info(LoggingAnchor.TWO, "Successfully certified activitySpec", activitySpec.getName());
         }
     }
 
@@ -120,46 +124,41 @@
         List<Input> inputs = new ArrayList<>();
         List<Output> outputs = new ArrayList<>();
         for (ActivitySpecActivitySpecParameters activitySpecParam : activitySpecActivitySpecParameters) {
-            if (activitySpecParam != null) {
-                if (activitySpecParam.getActivitySpecParameters() != null) {
-                    ActivitySpecParameters activitySpecParameters = activitySpecParam.getActivitySpecParameters();
-                    if (activitySpecParameters != null) {
-                        if (activitySpecParameters.getDirection().equals(DIRECTION_INPUT)) {
-                            Input input = new Input();
-                            input.setName(activitySpecParameters.getName());
-                            input.setType(activitySpecParameters.getType());
-                            inputs.add(input);
-                        } else if (activitySpecParameters.getDirection().equals(DIRECTION_OUTPUT)) {
-                            Output output = new Output();
-                            output.setName(activitySpecParameters.getName());
-                            output.setType(activitySpecParameters.getType());
-                            outputs.add(output);
-                        }
-                    }
-                }
+            if (activitySpecParam == null || activitySpecParam.getActivitySpecParameters() == null) {
+                continue;
+            }
+            ActivitySpecParameters activitySpecParameters = activitySpecParam.getActivitySpecParameters();
+
+            if (activitySpecParameters.getDirection().equals(DIRECTION_INPUT)) {
+                Input input = new Input();
+                input.setName(activitySpecParameters.getName());
+                input.setType(activitySpecParameters.getType());
+                inputs.add(input);
+                continue;
+            }
+            if (activitySpecParameters.getDirection().equals(DIRECTION_OUTPUT)) {
+                Output output = new Output();
+                output.setName(activitySpecParameters.getName());
+                output.setType(activitySpecParameters.getType());
+                outputs.add(output);
             }
         }
         activitySpec.setInputs(inputs);
         activitySpec.setOutputs(outputs);
-        return;
     }
 
     public boolean checkHttpServerUp(String host) {
-        URL url = null;
-        boolean isUp = false;
-
-        int responseCode = 0;
         try {
-            url = new URL(host);
+            URL url = new URL(host);
             HttpURLConnection connection = (HttpURLConnection) url.openConnection();
             connection.setConnectTimeout(5000);
-            responseCode = connection.getResponseCode();
+            int responseCode = connection.getResponseCode();
+            if (responseCode == HttpStatus.SC_OK || responseCode == HttpStatus.SC_NOT_FOUND) {
+                return true;
+            }
         } catch (Exception e) {
             logger.warn("Exception on connecting to SDC WFD endpoint: ", e);
         }
-        if (responseCode == HttpStatus.SC_OK || responseCode == HttpStatus.SC_NOT_FOUND) {
-            isUp = true;
-        }
-        return isUp;
+        return false;
     }
 }
diff --git a/asdc-controller/src/main/java/org/onap/so/asdc/client/ASDCController.java b/asdc-controller/src/main/java/org/onap/so/asdc/client/ASDCController.java
index f64adfd..c9d4f4d 100644
--- a/asdc-controller/src/main/java/org/onap/so/asdc/client/ASDCController.java
+++ b/asdc-controller/src/main/java/org/onap/so/asdc/client/ASDCController.java
@@ -7,6 +7,8 @@
  * ================================================================================
  * Modifications Copyright (c) 2019 Samsung
  * ================================================================================
+ * Modifications Copyright (c) 2020 Nokia
+ * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
@@ -33,6 +35,7 @@
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.UnsupportedEncodingException;
+import java.nio.charset.StandardCharsets;
 import java.nio.file.Paths;
 import java.util.List;
 import java.util.Optional;
@@ -162,12 +165,7 @@
                 break;
 
             case IDLE:
-                if (this.nbOfNotificationsOngoing > 1) {
-                    --this.nbOfNotificationsOngoing;
-                } else {
-                    this.nbOfNotificationsOngoing = 0;
-                    this.controllerStatus = newControllerStatus;
-                }
+                changeOnStatusIDLE(newControllerStatus);
 
                 break;
             default:
@@ -177,6 +175,15 @@
         }
     }
 
+    private void changeOnStatusIDLE(ASDCControllerStatus newControllerStatus) {
+        if (this.nbOfNotificationsOngoing > 1) {
+            --this.nbOfNotificationsOngoing;
+        } else {
+            this.nbOfNotificationsOngoing = 0;
+            this.controllerStatus = newControllerStatus;
+        }
+    }
+
     public ASDCControllerStatus getControllerStatus() {
         return this.controllerStatus;
     }
@@ -296,13 +303,12 @@
     protected void notifyErrorToAsdc(INotificationData iNotif, ToscaResourceStructure toscaResourceStructure,
             DistributionStatusEnum deployStatus, VfResourceStructure resourceStructure, String errorMessage) {
         // do csar lever first
-        this.sendCsarDeployNotification(iNotif, resourceStructure, toscaResourceStructure, deployStatus, errorMessage);
+        this.sendCsarDeployNotification(resourceStructure, toscaResourceStructure, deployStatus, errorMessage);
         // at resource level
         for (IResourceInstance resource : iNotif.getResources()) {
             resourceStructure = new VfResourceStructure(iNotif, resource);
             errorMessage = String.format("Resource with UUID: %s already exists", resource.getResourceUUID());
-            this.sendCsarDeployNotification(iNotif, resourceStructure, toscaResourceStructure, deployStatus,
-                    errorMessage);
+            this.sendCsarDeployNotification(resourceStructure, toscaResourceStructure, deployStatus, errorMessage);
         }
     }
 
@@ -363,8 +369,7 @@
 
         if (DistributionActionResultEnum.SUCCESS.equals(downloadResult.getDistributionActionResult())) {
             logger.info(LoggingAnchor.FOUR, MessageEnum.ASDC_ARTIFACT_DOWNLOAD_SUC.toString(),
-                    artifact.getArtifactURL(), artifact.getArtifactUUID(),
-                    String.valueOf(downloadResult.getArtifactPayload().length));
+                    artifact.getArtifactURL(), artifact.getArtifactUUID(), downloadResult.getArtifactPayload().length);
 
         } else {
             logger.error(LoggingAnchor.SEVEN, MessageEnum.ASDC_ARTIFACT_DOWNLOAD_FAIL.toString(),
@@ -447,7 +452,7 @@
         }
     }
 
-    protected void sendCsarDeployNotification(INotificationData iNotif, ResourceStructure resourceStructure,
+    protected void sendCsarDeployNotification(ResourceStructure resourceStructure,
             ToscaResourceStructure toscaResourceStructure, DistributionStatusEnum statusEnum, String errorReason) {
 
         IArtifactInfo csarArtifact = toscaResourceStructure.getToscaArtifact();
@@ -471,8 +476,8 @@
         } catch (ArtifactInstallerException e) {
             logger.info(LoggingAnchor.SIX, MessageEnum.ASDC_ARTIFACT_DOWNLOAD_FAIL.toString(),
                     resourceStructure.getResourceInstance().getResourceName(),
-                    resourceStructure.getResourceInstance().getResourceUUID(),
-                    String.valueOf(resourceStructure.getNumberOfResources()), "ASDC", "deployResourceStructure");
+                    resourceStructure.getResourceInstance().getResourceUUID(), resourceStructure.getNumberOfResources(),
+                    "ASDC", "deployResourceStructure");
             sendDeployNotificationsForResource(resourceStructure, DistributionStatusEnum.DEPLOY_ERROR, e.getMessage());
             throw e;
         }
@@ -480,8 +485,8 @@
         if (resourceStructure.isDeployedSuccessfully() || toscaResourceStructure.isDeployedSuccessfully()) {
             logger.info(LoggingAnchor.SIX, MessageEnum.ASDC_ARTIFACT_DEPLOY_SUC.toString(),
                     resourceStructure.getResourceInstance().getResourceName(),
-                    resourceStructure.getResourceInstance().getResourceUUID(),
-                    String.valueOf(resourceStructure.getNumberOfResources()), "ASDC", "deployResourceStructure");
+                    resourceStructure.getResourceInstance().getResourceUUID(), resourceStructure.getNumberOfResources(),
+                    "ASDC", "deployResourceStructure");
             sendDeployNotificationsForResource(resourceStructure, DistributionStatusEnum.DEPLOY_OK, null);
         }
 
@@ -509,26 +514,10 @@
         try {
             IDistributionStatusMessage message =
                     new DistributionStatusMessage(artifactURL, consumerID, distributionID, status, timestamp);
-
-            switch (notificationType) {
-                case DOWNLOAD:
-                    if (errorReason != null) {
-                        this.distributionClient.sendDownloadStatus(message, errorReason);
-                    } else {
-                        this.distributionClient.sendDownloadStatus(message);
-                    }
-
-                    break;
-                case DEPLOY:
-                    if (errorReason != null) {
-                        this.distributionClient.sendDeploymentStatus(message, errorReason);
-                    } else {
-                        this.distributionClient.sendDeploymentStatus(message);
-                    }
-
-                    break;
-                default:
-                    break;
+            if (errorReason != null) {
+                sendNotificationWithMessageAndErrorReason(notificationType, errorReason, message);
+            } else {
+                sendNotificationWithMessage(notificationType, message);
             }
         } catch (RuntimeException e) {
             logger.warn(LoggingAnchor.FIVE, MessageEnum.ASDC_SEND_NOTIF_ASDC_EXEC.toString(), "ASDC",
@@ -537,6 +526,33 @@
         }
     }
 
+    private void sendNotificationWithMessage(NotificationType notificationType, IDistributionStatusMessage message) {
+        switch (notificationType) {
+            case DOWNLOAD:
+                this.distributionClient.sendDownloadStatus(message);
+                break;
+            case DEPLOY:
+                this.distributionClient.sendDeploymentStatus(message);
+                break;
+            default:
+                break;
+        }
+    }
+
+    private void sendNotificationWithMessageAndErrorReason(NotificationType notificationType, String errorReason,
+            IDistributionStatusMessage message) {
+        switch (notificationType) {
+            case DOWNLOAD:
+                this.distributionClient.sendDownloadStatus(message, errorReason);
+                break;
+            case DEPLOY:
+                this.distributionClient.sendDeploymentStatus(message, errorReason);
+                break;
+            default:
+                break;
+        }
+    }
+
     protected void sendFinalDistributionStatus(String distributionID, DistributionStatusEnum status,
             String errorReason) {
 
@@ -587,8 +603,8 @@
         for (IResourceInstance resource : iNotif.getResources()) {
             noOfArtifacts += resource.getArtifacts().size();
         }
-        logger.info(LoggingAnchor.FOUR, MessageEnum.ASDC_RECEIVE_CALLBACK_NOTIF.toString(),
-                String.valueOf(noOfArtifacts), iNotif.getServiceUUID(), "ASDC");
+        logger.info(LoggingAnchor.FOUR, MessageEnum.ASDC_RECEIVE_CALLBACK_NOTIF.toString(), noOfArtifacts,
+                iNotif.getServiceUUID(), "ASDC");
         try {
 
             if (iNotif.getDistributionID() != null && !iNotif.getDistributionID().isEmpty()) {
@@ -721,7 +737,6 @@
 
     protected void processResourceNotification(INotificationData iNotif) {
         // For each artifact, create a structure describing the VFModule in a ordered flat level
-        ResourceStructure resourceStructure = null;
         String msoConfigPath = getMsoConfigPath();
         ToscaResourceStructure toscaResourceStructure = new ToscaResourceStructure(msoConfigPath);
         DistributionStatusEnum deployStatus = DistributionStatusEnum.DEPLOY_OK;
@@ -734,6 +749,7 @@
                 return;
             }
 
+            ResourceStructure resourceStructure = null;
             for (IResourceInstance resource : iNotif.getResources()) {
 
                 String resourceType = resource.getResourceType();
@@ -741,21 +757,11 @@
 
                 logger.info("Processing Resource Type: {}, Model UUID: {}", resourceType, resource.getResourceUUID());
 
-                if ("VF".equals(resourceType)) {
-                    resourceStructure = new VfResourceStructure(iNotif, resource);
-                } else if ("PNF".equals(resourceType)) {
-                    resourceStructure = new PnfResourceStructure(iNotif, resource);
-                } else {
-                    // There are cases where the Service has no VF resources, those are handled here
-                    logger.info("No resources found for Service: {}", iNotif.getServiceUUID());
-                    resourceStructure = new VfResourceStructure(iNotif, new ResourceInstance());
-                    resourceStructure.setResourceType(ResourceType.OTHER);
-                }
+                resourceStructure = getResourceStructure(iNotif, resource, resourceType);
 
                 try {
 
                     if (!this.checkResourceAlreadyDeployed(resourceStructure, serviceDeployed)) {
-
                         logger.debug("Processing Resource Type: " + resourceType + " and Model UUID: "
                                 + resourceStructure.getResourceInstance().getResourceUUID());
 
@@ -765,25 +771,27 @@
                             for (IArtifactInfo artifact : resource.getArtifacts()) {
                                 IDistributionClientDownloadResult resultArtifact =
                                         this.downloadTheArtifact(artifact, iNotif.getDistributionID());
-                                if (resultArtifact != null) {
-
-                                    if (ASDCConfiguration.VF_MODULES_METADATA.equals(artifact.getArtifactType())) {
-                                        logger.debug("VF_MODULE_ARTIFACT: "
-                                                + new String(resultArtifact.getArtifactPayload(), "UTF-8"));
-                                        logger.debug(ASDCNotificationLogging
-                                                .dumpVfModuleMetaDataList(((VfResourceStructure) resourceStructure)
-                                                        .decodeVfModuleArtifact(resultArtifact.getArtifactPayload())));
-                                    }
-                                    if (!ASDCConfiguration.WORKFLOW.equals(artifact.getArtifactType())) {
-                                        resourceStructure.addArtifactToStructure(distributionClient, artifact,
-                                                resultArtifact);
-                                    } else {
-                                        writeArtifactToFile(artifact, resultArtifact);
-                                        logger.debug(
-                                                "Adding workflow artifact to structure: " + artifact.getArtifactName());
-                                        resourceStructure.addWorkflowArtifactToStructure(artifact, resultArtifact);
-                                    }
+                                if (resultArtifact == null) {
+                                    continue;
                                 }
+
+                                if (ASDCConfiguration.VF_MODULES_METADATA.equals(artifact.getArtifactType())) {
+                                    logger.debug("VF_MODULE_ARTIFACT: "
+                                            + new String(resultArtifact.getArtifactPayload(), StandardCharsets.UTF_8));
+                                    logger.debug(ASDCNotificationLogging
+                                            .dumpVfModuleMetaDataList(((VfResourceStructure) resourceStructure)
+                                                    .decodeVfModuleArtifact(resultArtifact.getArtifactPayload())));
+                                }
+                                if (!ASDCConfiguration.WORKFLOW.equals(artifact.getArtifactType())) {
+                                    resourceStructure.addArtifactToStructure(distributionClient, artifact,
+                                            resultArtifact);
+                                } else {
+                                    writeArtifactToFile(artifact, resultArtifact);
+                                    logger.debug(
+                                            "Adding workflow artifact to structure: " + artifact.getArtifactName());
+                                    resourceStructure.addWorkflowArtifactToStructure(artifact, resultArtifact);
+                                }
+
                             }
 
                             // Deploy VF resource and artifacts
@@ -817,8 +825,7 @@
                 }
             }
 
-            this.sendCsarDeployNotification(iNotif, resourceStructure, toscaResourceStructure, deployStatus,
-                    errorMessage);
+            this.sendCsarDeployNotification(resourceStructure, toscaResourceStructure, deployStatus, errorMessage);
 
         } catch (ASDCDownloadException | UnsupportedEncodingException e) {
             logger.error(LoggingAnchor.SIX, MessageEnum.ASDC_GENERAL_EXCEPTION_ARG.toString(),
@@ -827,6 +834,20 @@
         }
     }
 
+    private ResourceStructure getResourceStructure(INotificationData iNotif, IResourceInstance resource,
+            String resourceType) {
+        if ("VF".equals(resourceType)) {
+            return new VfResourceStructure(iNotif, resource);
+        }
+        if ("PNF".equals(resourceType)) {
+            return new PnfResourceStructure(iNotif, resource);
+        }
+        logger.info("No resources found for Service: {}", iNotif.getServiceUUID());
+        ResourceStructure resourceStructure = new VfResourceStructure(iNotif, new ResourceInstance());
+        resourceStructure.setResourceType(ResourceType.OTHER);
+        return resourceStructure;
+    }
+
     private String getMsoConfigPath() {
         String msoConfigPath = System.getProperty("mso.config.path");
         if (msoConfigPath == null) {
@@ -900,7 +921,6 @@
     }
 
 
-
     /**
      * @return the address of the ASDC we are connected to.
      */
diff --git a/asdc-controller/src/main/resources/resource-examples/resource_Extvl.csar b/asdc-controller/src/main/resources/resource-examples/resource_Extvl.csar
index bd35b0a..20ce62b 100644
--- a/asdc-controller/src/main/resources/resource-examples/resource_Extvl.csar
+++ b/asdc-controller/src/main/resources/resource-examples/resource_Extvl.csar
Binary files differ
diff --git a/asdc-controller/src/main/resources/resource-examples/service-ServiceFdnt-csar-0904-2.csar b/asdc-controller/src/main/resources/resource-examples/service-ServiceFdnt-csar-0904-2.csar
index 29d30f8..dd0115b 100644
--- a/asdc-controller/src/main/resources/resource-examples/service-ServiceFdnt-csar-0904-2.csar
+++ b/asdc-controller/src/main/resources/resource-examples/service-ServiceFdnt-csar-0904-2.csar
Binary files differ
diff --git a/asdc-controller/src/test/resources/resource-examples/WorkflowBpmn/service-VfZrdm5bpxmc02092017Service-csar.csar b/asdc-controller/src/test/resources/resource-examples/WorkflowBpmn/service-VfZrdm5bpxmc02092017Service-csar.csar
index 4c906ab..817b831 100644
--- a/asdc-controller/src/test/resources/resource-examples/WorkflowBpmn/service-VfZrdm5bpxmc02092017Service-csar.csar
+++ b/asdc-controller/src/test/resources/resource-examples/WorkflowBpmn/service-VfZrdm5bpxmc02092017Service-csar.csar
Binary files differ
diff --git a/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/RequestDBUtil.groovy b/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/RequestDBUtil.groovy
new file mode 100644
index 0000000..ce474fa
--- /dev/null
+++ b/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/RequestDBUtil.groovy
@@ -0,0 +1,119 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ # Copyright (c) 2019, CMCC Technologies Co., Ltd.
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License")
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ #       http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.so.bpmn.common.scripts
+
+import org.camunda.bpm.engine.delegate.DelegateExecution
+import org.onap.so.bpmn.core.UrnPropertiesReader
+import org.onap.so.db.request.beans.OperationStatus
+import org.slf4j.Logger
+import org.slf4j.LoggerFactory
+import org.springframework.web.util.UriUtils
+
+class RequestDBUtil {
+    private static final Logger logger = LoggerFactory.getLogger( RequestDBUtil.class);
+    private ExceptionUtil exceptionUtil = new ExceptionUtil()
+
+    /**
+     * update operation status in requestDB
+     * @param execution
+     * @param operationStatus
+     */
+    void prepareUpdateOperationStatus(DelegateExecution execution, final OperationStatus operationStatus){
+        logger.debug("start prepareUpdateOperationStatus")
+        try{
+            def dbAdapterEndpoint = UrnPropertiesReader.getVariable("mso.adapters.openecomp.db.endpoint", execution)
+            execution.setVariable("dbAdapterEndpoint", dbAdapterEndpoint)
+            logger.debug("DB Adapter Endpoint is: " + dbAdapterEndpoint)
+
+            String serviceId = operationStatus.getServiceId()
+            serviceId = UriUtils.encode(serviceId,"UTF-8")
+            String operationId = operationStatus.getOperationId()
+            String userId = operationStatus.getUserId()
+            String operationType = operationStatus.getOperation()
+            String result = operationStatus.getResult()
+            String progress = operationStatus.getProgress()
+            String operationContent = operationStatus.getOperationContent()
+            String reason = operationStatus.getReason()
+
+            String payload =
+                    """<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
+                        xmlns:ns="http://org.onap.so/requestsdb">
+                            <soapenv:Header/>
+                            <soapenv:Body>
+                                <ns:updateServiceOperationStatus xmlns:ns="http://org.onap.so/requestsdb">
+                                    <serviceId>${MsoUtils.xmlEscape(serviceId)}</serviceId>
+                                    <operationId>${MsoUtils.xmlEscape(operationId)}</operationId>
+                                    <operationType>${MsoUtils.xmlEscape(operationType)}</operationType>
+                                    <userId>${MsoUtils.xmlEscape(userId)}</userId>
+                                    <result>${MsoUtils.xmlEscape(result)}</result>
+                                    <operationContent>${MsoUtils.xmlEscape(operationContent)}</operationContent>
+                                    <progress>${MsoUtils.xmlEscape(progress)}</progress>
+                                    <reason>${MsoUtils.xmlEscape(reason)}</reason>
+                                </ns:updateServiceOperationStatus>
+                            </soapenv:Body>
+                        </soapenv:Envelope>
+                    """
+            execution.setVariable("updateOperationStatus", payload)
+
+        }catch(any){
+            String exceptionMessage = "Prepare update ServiceOperationStatus failed. cause - " + any.getMessage()
+            logger.debug(exceptionMessage)
+            exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
+        }
+        logger.trace("finished update OperationStatus")
+    }
+
+
+    /**
+     * get operation status from requestDB by serviceId and operationId
+     * @param execution
+     * @param serviceId
+     * @param operationId
+     */
+    void getOperationStatus(DelegateExecution execution, String serviceId, String operationId) {
+        logger.trace("start getOperationStatus")
+        try {
+            def dbAdapterEndpoint = UrnPropertiesReader.getVariable("mso.adapters.openecomp.db.endpoint", execution)
+            execution.setVariable("dbAdapterEndpoint", dbAdapterEndpoint)
+            logger.trace("DB Adapter Endpoint is: " + dbAdapterEndpoint)
+
+            serviceId = UriUtils.encode(serviceId,"UTF-8")
+            operationId = UriUtils.encode(operationId,"UTF-8")
+            String payload =
+                    """<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
+                        xmlns:ns="http://org.onap.so/requestsdb">
+                            <soapenv:Header/>
+                            <soapenv:Body>
+                                <ns:getServiceOperationStatus xmlns:ns="http://org.onap.so/requestsdb">
+                                    <serviceId>${MsoUtils.xmlEscape(serviceId)}</serviceId>
+                                    <operationId>${MsoUtils.xmlEscape(operationId)}</operationId>                       
+                                </ns:getServiceOperationStatus>
+                            </soapenv:Body>
+                        </soapenv:Envelope>
+                    """
+            execution.setVariable("getOperationStatus", payload)
+
+        } catch(any){
+            String exceptionMessage = "Get ServiceOperationStatus failed. cause - " + any.getMessage()
+            logger.error(exceptionMessage)
+            exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
+        }
+    }
+}
diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/cds/AbstractCDSProcessingBBUtils.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/cds/AbstractCDSProcessingBBUtils.java
index 424a4f3..ebced8e 100644
--- a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/cds/AbstractCDSProcessingBBUtils.java
+++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/cds/AbstractCDSProcessingBBUtils.java
@@ -22,14 +22,18 @@
 
 package org.onap.so.client.cds;
 
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
+import com.google.protobuf.InvalidProtocolBufferException;
+import com.google.protobuf.Struct;
+import com.google.protobuf.Struct.Builder;
+import com.google.protobuf.util.JsonFormat;
+import io.grpc.Status;
 import org.camunda.bpm.engine.delegate.DelegateExecution;
 import org.onap.ccsdk.cds.controllerblueprints.common.api.ActionIdentifiers;
 import org.onap.ccsdk.cds.controllerblueprints.common.api.CommonHeader;
 import org.onap.ccsdk.cds.controllerblueprints.common.api.EventType;
 import org.onap.ccsdk.cds.controllerblueprints.processing.api.ExecutionServiceInput;
 import org.onap.ccsdk.cds.controllerblueprints.processing.api.ExecutionServiceOutput;
+import org.onap.so.bpmn.common.BuildingBlockExecution;
 import org.onap.so.client.PreconditionFailedException;
 import org.onap.so.client.RestPropertiesLoader;
 import org.onap.so.client.cds.beans.AbstractCDSPropertiesBean;
@@ -39,15 +43,11 @@
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
-import com.google.protobuf.InvalidProtocolBufferException;
-import com.google.protobuf.Struct;
-import com.google.protobuf.Struct.Builder;
-import com.google.protobuf.util.JsonFormat;
-import io.grpc.Status;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
 
 /**
  * Util class to support Call to CDS client
- *
  */
 @Component
 public class AbstractCDSProcessingBBUtils {
@@ -60,11 +60,7 @@
     private static final String RESPONSE_PAYLOAD = "CDSResponsePayload";
     private static final String CDS_STATUS = "CDSStatus";
     private static final String EXEC_INPUT = "executionServiceInput";
-
-
-    /**
-     * indicate exception thrown.
-     */
+    private static final String EXECUTION_OBJECT = "executionObject";
     private static final String EXCEPTION = "Exception";
 
     @Autowired
@@ -76,34 +72,33 @@
      * @param execution DelegateExecution object
      */
     public void constructExecutionServiceInputObject(DelegateExecution execution) {
-        logger.trace("Start AbstractCDSProcessingBBUtils.preProcessRequest ");
+        logger.trace("Start AbstractCDSProcessingBBUtils.preProcessRequest for DelegateExecution object.");
 
         try {
             AbstractCDSPropertiesBean executionObject =
-                    (AbstractCDSPropertiesBean) execution.getVariable("executionObject");
+                    (AbstractCDSPropertiesBean) execution.getVariable(EXECUTION_OBJECT);
 
-            String payload = executionObject.getRequestObject();
+            ExecutionServiceInput executionServiceInput = prepareExecutionServiceInput(executionObject);
 
-            CommonHeader commonHeader = CommonHeader.newBuilder().setOriginatorId(executionObject.getOriginatorId())
-                    .setRequestId(executionObject.getRequestId()).setSubRequestId(executionObject.getSubRequestId())
-                    .build();
-            ActionIdentifiers actionIdentifiers =
-                    ActionIdentifiers.newBuilder().setBlueprintName(executionObject.getBlueprintName())
-                            .setBlueprintVersion(executionObject.getBlueprintVersion())
-                            .setActionName(executionObject.getActionName()).setMode(executionObject.getMode()).build();
+            execution.setVariable(EXEC_INPUT, executionServiceInput);
 
-            Builder struct = Struct.newBuilder();
-            try {
-                JsonFormat.parser().merge(payload, struct);
-            } catch (InvalidProtocolBufferException e) {
-                logger.error("Failed to parse received message. blueprint({}:{}) for action({}). {}",
-                        executionObject.getBlueprintVersion(), executionObject.getBlueprintName(),
-                        executionObject.getActionName(), e);
-            }
+        } catch (Exception ex) {
+            exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex);
+        }
+    }
 
-            ExecutionServiceInput executionServiceInput =
-                    ExecutionServiceInput.newBuilder().setCommonHeader(commonHeader)
-                            .setActionIdentifiers(actionIdentifiers).setPayload(struct.build()).build();
+    /**
+     * Extracting data from execution object and building the ExecutionServiceInput Object
+     *
+     * @param execution BuildingBlockExecution object
+     */
+    public void constructExecutionServiceInputObject(BuildingBlockExecution execution) {
+        logger.trace("Start AbstractCDSProcessingBBUtils.preProcessRequest for BuildingBlockExecution object.");
+
+        try {
+            AbstractCDSPropertiesBean executionObject = execution.getVariable(EXECUTION_OBJECT);
+
+            ExecutionServiceInput executionServiceInput = prepareExecutionServiceInput(executionObject);
 
             execution.setVariable(EXEC_INPUT, executionServiceInput);
 
@@ -119,50 +114,98 @@
      */
     public void sendRequestToCDSClient(DelegateExecution execution) {
 
-        logger.trace("Start AbstractCDSProcessingBBUtils.sendRequestToCDSClient ");
+        logger.trace("Start AbstractCDSProcessingBBUtils.sendRequestToCDSClient for DelegateExecution object.");
         try {
-            CDSProperties props = RestPropertiesLoader.getInstance().getNewImpl(CDSProperties.class);
-            if (props == null) {
-                throw new PreconditionFailedException(
-                        "No RestProperty.CDSProperties implementation found on classpath, can't create client.");
-            }
-
             ExecutionServiceInput executionServiceInput = (ExecutionServiceInput) execution.getVariable(EXEC_INPUT);
-
-            CDSResponse cdsResponse = new CDSResponse();
-
-            try (CDSProcessingClient cdsClient = new CDSProcessingClient(new ResponseHandler(cdsResponse))) {
-                CountDownLatch countDownLatch = cdsClient.sendRequest(executionServiceInput);
-                countDownLatch.await(props.getTimeout(), TimeUnit.SECONDS);
-            } catch (InterruptedException ex) {
-                logger.error("Caught exception in sendRequestToCDSClient in AbstractCDSProcessingBBUtils : ", ex);
-                Thread.currentThread().interrupt();
-            }
-
-            String cdsResponseStatus = cdsResponse.status;
-
-            /**
-             * throw CDS failed exception.
-             */
-            if (!cdsResponseStatus.equals(SUCCESS)) {
-                throw new BadResponseException("CDS call failed with status: " + cdsResponse.status
-                        + " and errorMessage: " + cdsResponse.errorMessage);
-            }
-
-            execution.setVariable(CDS_STATUS, cdsResponseStatus);
+            CDSResponse cdsResponse = getCdsResponse(executionServiceInput);
+            execution.setVariable(CDS_STATUS, cdsResponse.status);
 
             if (cdsResponse.payload != null) {
                 String payload = JsonFormat.printer().print(cdsResponse.payload);
                 execution.setVariable(RESPONSE_PAYLOAD, payload);
             }
 
+        } catch (Exception ex) {
+            exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex);
+        }
+    }
 
+    /**
+     * get the executionServiceInput object from execution and send a request to CDS Client and wait for TIMEOUT period
+     *
+     * @param execution BuildingBlockExecution object
+     */
+    public void sendRequestToCDSClient(BuildingBlockExecution execution) {
+
+        logger.trace("Start AbstractCDSProcessingBBUtils.sendRequestToCDSClient for BuildingBlockExecution object.");
+        try {
+            ExecutionServiceInput executionServiceInput = execution.getVariable(EXEC_INPUT);
+            CDSResponse cdsResponse = getCdsResponse(executionServiceInput);
+            execution.setVariable(CDS_STATUS, cdsResponse.status);
+
+            if (cdsResponse.payload != null) {
+                String payload = JsonFormat.printer().print(cdsResponse.payload);
+                execution.setVariable(RESPONSE_PAYLOAD, payload);
+            }
 
         } catch (Exception ex) {
             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex);
         }
     }
 
+    private CDSResponse getCdsResponse(ExecutionServiceInput executionServiceInput) throws BadResponseException {
+        CDSProperties props = RestPropertiesLoader.getInstance().getNewImpl(CDSProperties.class);
+        if (props == null) {
+            throw new PreconditionFailedException(
+                    "No RestProperty.CDSProperties implementation found on classpath, can't create client.");
+        }
+
+        CDSResponse cdsResponse = new CDSResponse();
+
+        try (CDSProcessingClient cdsClient = new CDSProcessingClient(new ResponseHandler(cdsResponse))) {
+            CountDownLatch countDownLatch = cdsClient.sendRequest(executionServiceInput);
+            countDownLatch.await(props.getTimeout(), TimeUnit.SECONDS);
+        } catch (InterruptedException ex) {
+            logger.error("Caught exception in sendRequestToCDSClient in AbstractCDSProcessingBBUtils : ", ex);
+            Thread.currentThread().interrupt();
+        }
+
+        String cdsResponseStatus = cdsResponse.status;
+
+        /**
+         * throw CDS failed exception.
+         */
+        if (!cdsResponseStatus.equals(SUCCESS)) {
+            throw new BadResponseException("CDS call failed with status: " + cdsResponse.status + " and errorMessage: "
+                    + cdsResponse.errorMessage);
+        }
+        return cdsResponse;
+    }
+
+    private ExecutionServiceInput prepareExecutionServiceInput(AbstractCDSPropertiesBean executionObject) {
+        String payload = executionObject.getRequestObject();
+
+        CommonHeader commonHeader = CommonHeader.newBuilder().setOriginatorId(executionObject.getOriginatorId())
+                .setRequestId(executionObject.getRequestId()).setSubRequestId(executionObject.getSubRequestId())
+                .build();
+        ActionIdentifiers actionIdentifiers =
+                ActionIdentifiers.newBuilder().setBlueprintName(executionObject.getBlueprintName())
+                        .setBlueprintVersion(executionObject.getBlueprintVersion())
+                        .setActionName(executionObject.getActionName()).setMode(executionObject.getMode()).build();
+
+        Builder struct = Struct.newBuilder();
+        try {
+            JsonFormat.parser().merge(payload, struct);
+        } catch (InvalidProtocolBufferException e) {
+            logger.error("Failed to parse received message. blueprint({}:{}) for action({}). {}",
+                    executionObject.getBlueprintVersion(), executionObject.getBlueprintName(),
+                    executionObject.getActionName(), e);
+        }
+
+        return ExecutionServiceInput.newBuilder().setCommonHeader(commonHeader).setActionIdentifiers(actionIdentifiers)
+                .setPayload(struct.build()).build();
+    }
+
     private class ResponseHandler implements CDSProcessingListener {
 
         private CDSResponse cdsResponse;
diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/cds/CDSRequestProvider.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/cds/CDSRequestProvider.java
new file mode 100644
index 0000000..e01de69
--- /dev/null
+++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/cds/CDSRequestProvider.java
@@ -0,0 +1,76 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2019 Bell Canada
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.client.cds;
+
+import com.google.gson.JsonObject;
+import org.onap.so.client.exception.PayloadGenerationException;
+import java.util.Optional;
+import static org.onap.so.client.cds.PayloadConstants.REQUEST;
+import static org.onap.so.client.cds.PayloadConstants.SEPARATOR;
+
+public interface CDSRequestProvider {
+
+    /**
+     * Build entire payload for CDS.
+     *
+     * @param action - action could be assign/deploy/undeploy etc.
+     * @return "payload":{ "config-<action>-<scope>":{ // information about resolution key, property configuration and
+     *         template prefix based on the scope and action}
+     * @throws PayloadGenerationException If fail to build the payload.
+     */
+    Optional<String> buildRequestPayload(String action) throws PayloadGenerationException;
+
+    /**
+     * Get the blueprint name for CDS payload
+     *
+     * @return blueprint name
+     */
+    String getBlueprintName();
+
+    /**
+     * Get the blueprint version for CDS payload
+     *
+     * @return blueprint version
+     */
+    String getBlueprintVersion();
+
+    /**
+     * Set the executionObject(BuildingBlockExecution or DelegateExecution for PNF)
+     *
+     * @param executionObject object could be BuildingBlockExecution or DelegateExecution.
+     */
+    <T> void setExecutionObject(T executionObject);
+
+
+    /**
+     * Build Request payload for CDS
+     *
+     * @param cdsPropertyObject - Json Object
+     * @param action - action could be assign/deploy/undeploy etc.
+     * @return Request Payload
+     */
+    default String buildRequestJsonObject(JsonObject cdsPropertyObject, String action) {
+        String requestBasedOnAction = action.concat(SEPARATOR).concat(REQUEST);
+        JsonObject requestObject = new JsonObject();
+        requestObject.add(requestBasedOnAction, cdsPropertyObject);
+        return requestObject.toString();
+    }
+}
diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/cds/ConfigureInstanceParamsForVfModule.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/cds/ConfigureInstanceParamsForVfModule.java
new file mode 100644
index 0000000..6f850fa
--- /dev/null
+++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/cds/ConfigureInstanceParamsForVfModule.java
@@ -0,0 +1,79 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2019 Bell Canada
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.client.cds;
+
+import com.google.gson.JsonObject;
+import org.onap.so.client.cds.ExtractServiceFromUserParameters;
+import org.onap.so.client.exception.PayloadGenerationException;
+import org.onap.so.serviceinstancebeans.Service;
+import org.onap.so.serviceinstancebeans.VfModules;
+import org.onap.so.serviceinstancebeans.Vnfs;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import java.util.List;
+import java.util.Map;
+
+@Component
+public class ConfigureInstanceParamsForVfModule {
+
+    @Autowired
+    private ExtractServiceFromUserParameters extractServiceFromUserParameters;
+
+    /**
+     * Read instance parameters for VF-Module and put into JsonObject.
+     *
+     * @param jsonObject- JsonObject which will hold the payload to send to CDS.
+     * @param userParamsFromRequest - User parameters for a vf-module
+     * @param vnfCustomizationUuid - Unique ID for vnf.
+     * @param vfModuleCustomizationUuid - Unique ID for vf-module.
+     * @throws PayloadGenerationException- If it doesn't able to populate instance parameters from SO payload.
+     */
+    public void populateInstanceParams(JsonObject jsonObject, List<Map<String, Object>> userParamsFromRequest,
+            String vnfCustomizationUuid, String vfModuleCustomizationUuid) throws PayloadGenerationException {
+        try {
+            Service service = extractServiceFromUserParameters.getServiceFromRequestUserParams(userParamsFromRequest);
+
+            List<Map<String, String>> instanceParamsList =
+                    getInstanceParams(service, vnfCustomizationUuid, vfModuleCustomizationUuid);
+
+            instanceParamsList.stream().flatMap(instanceParamsMap -> instanceParamsMap.entrySet().stream())
+                    .forEachOrdered(entry -> jsonObject.addProperty(entry.getKey(), entry.getValue()));
+        } catch (Exception e) {
+            throw new PayloadGenerationException("Couldn't able to resolve instance parameters", e);
+        }
+    }
+
+    private List<Map<String, String>> getInstanceParams(Service service, String vnfCustomizationUuid,
+            String vfModuleCustomizationUuid) throws PayloadGenerationException {
+
+        Vnfs foundedVnf = service.getResources().getVnfs().stream()
+                .filter(vnfs -> vnfs.getModelInfo().getModelCustomizationId().equals(vnfCustomizationUuid)).findFirst()
+                .orElseThrow(() -> new PayloadGenerationException(String
+                        .format("Can not find vnf for genericVnfModelCustomizationUuid: %s", vnfCustomizationUuid)));
+
+        VfModules vfModule = foundedVnf.getVfModules().stream().filter(
+                vfModules -> vfModules.getModelInfo().getModelCustomizationId().equals(vfModuleCustomizationUuid))
+                .findFirst().orElseThrow(() -> new PayloadGenerationException(String
+                        .format("Can not find vnf for vfModuleCustomizationUuid: %s", vfModuleCustomizationUuid)));
+
+        return vfModule.getInstanceParams();
+    }
+}
diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/cds/ConfigureInstanceParamsForVnf.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/cds/ConfigureInstanceParamsForVnf.java
new file mode 100644
index 0000000..22c9a7b
--- /dev/null
+++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/cds/ConfigureInstanceParamsForVnf.java
@@ -0,0 +1,73 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2019 Bell Canada
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.client.cds;
+
+import com.google.gson.JsonObject;
+import org.onap.so.client.exception.PayloadGenerationException;
+import org.onap.so.serviceinstancebeans.Service;
+import org.onap.so.serviceinstancebeans.Vnfs;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+
+@Component
+public class ConfigureInstanceParamsForVnf {
+
+    @Autowired
+    private ExtractServiceFromUserParameters extractServiceFromUserParameters;
+
+    /**
+     * Read instance parameters for VNF and put into JsonObject.
+     *
+     * @param jsonObject - JsonObject which will hold the payload to send to CDS.
+     * @param userParamsFromRequest - User parameters.
+     * @param modelCustomizationUuid - Unique ID for Vnf.
+     * @throws PayloadGenerationException if it doesn't able to populate instance parameters from SO payload.
+     */
+    public void populateInstanceParams(JsonObject jsonObject, List<Map<String, Object>> userParamsFromRequest,
+            String modelCustomizationUuid) throws PayloadGenerationException {
+        try {
+            Service service = extractServiceFromUserParameters.getServiceFromRequestUserParams(userParamsFromRequest);
+            List<Map<String, String>> instanceParamsList = getInstanceParamForVnf(service, modelCustomizationUuid);
+
+            instanceParamsList.stream().flatMap(instanceParamsMap -> instanceParamsMap.entrySet().stream())
+                    .forEachOrdered(entry -> jsonObject.addProperty(entry.getKey(), entry.getValue()));
+        } catch (Exception e) {
+            throw new PayloadGenerationException("Couldn't able to resolve instance parameters", e);
+        }
+    }
+
+    private List<Map<String, String>> getInstanceParamForVnf(Service service, String genericVnfModelCustomizationUuid)
+            throws PayloadGenerationException {
+        Optional<Vnfs> foundedVnf = service.getResources().getVnfs().stream()
+                .filter(vnfs -> vnfs.getModelInfo().getModelCustomizationId().equals(genericVnfModelCustomizationUuid))
+                .findFirst();
+
+        if (foundedVnf.isPresent()) {
+            return foundedVnf.get().getInstanceParams();
+        } else {
+            throw new PayloadGenerationException(String.format(
+                    "Can not find vnf for genericVnfModelCustomizationUuid: %s", genericVnfModelCustomizationUuid));
+        }
+    }
+}
diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/cds/ExtractServiceFromUserParameters.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/cds/ExtractServiceFromUserParameters.java
new file mode 100644
index 0000000..43fabd3
--- /dev/null
+++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/cds/ExtractServiceFromUserParameters.java
@@ -0,0 +1,53 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2019 Bell Canada
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.so.client.cds;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.onap.so.client.exception.PayloadGenerationException;
+import org.onap.so.serviceinstancebeans.Service;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import java.util.List;
+import java.util.Map;
+
+@Component
+public class ExtractServiceFromUserParameters {
+
+    private static final String SERVICE_KEY = "service";
+
+    @Autowired
+    private ObjectMapper objectMapper;
+
+    public Service getServiceFromRequestUserParams(List<Map<String, Object>> userParams) throws Exception {
+        Map<String, Object> serviceMap = userParams.stream().filter(key -> key.containsKey(SERVICE_KEY)).findFirst()
+                .orElseThrow(() -> new Exception("Can not find service in userParams section in generalBuildingBlock"));
+        return getServiceObjectFromServiceMap(serviceMap);
+    }
+
+    private Service getServiceObjectFromServiceMap(Map<String, Object> serviceMap) throws PayloadGenerationException {
+        try {
+            String serviceFromJson = objectMapper.writeValueAsString(serviceMap.get(SERVICE_KEY));
+            return objectMapper.readValue(serviceFromJson, Service.class);
+        } catch (Exception e) {
+            throw new PayloadGenerationException("An exception occurred while converting json object to Service object",
+                    e);
+        }
+    }
+}
diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/cds/GeneratePayloadForCds.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/cds/GeneratePayloadForCds.java
new file mode 100644
index 0000000..fb79880
--- /dev/null
+++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/cds/GeneratePayloadForCds.java
@@ -0,0 +1,153 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2019 Bell Canada
+ * ================================================================================
+ * Modifications Copyright (c) 2020 Nordix
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.client.cds;
+
+import org.camunda.bpm.engine.delegate.DelegateExecution;
+import org.onap.so.bpmn.common.BuildingBlockExecution;
+import org.onap.so.bpmn.servicedecomposition.entities.BuildingBlock;
+import org.onap.so.bpmn.servicedecomposition.entities.ExecuteBuildingBlock;
+import org.onap.so.bpmn.servicedecomposition.tasks.ExtractPojosForBB;
+import org.onap.so.client.cds.beans.AbstractCDSPropertiesBean;
+import org.onap.so.client.exception.PayloadGenerationException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import java.util.UUID;
+
+@Component
+public class GeneratePayloadForCds {
+
+    private static final String ORIGINATOR_ID = "SO";
+    private static final String BUILDING_BLOCK = "buildingBlock";
+    private static final String DEFAULT_SYNC_MODE = "sync";
+    private static final String MSO_REQUEST_ID = "msoRequestId";
+
+    @Autowired
+    private VnfCDSRequestProvider vnfCDSRequestProvider;
+
+    @Autowired
+    private VfModuleCDSRequestProvider vfModuleCDSRequestProvider;
+
+    @Autowired
+    private ServiceCDSRequestProvider serviceCDSRequestProvider;
+
+    @Autowired
+    private ExtractPojosForBB extractPojosForBB;
+
+    @Autowired
+    private PnfCDSRequestProvider pnfCDSRequestProvider;
+
+    /**
+     * Build properties like (blueprint name, version, action etc..) along with the request payload for vnf, vf-module
+     * and service.
+     *
+     * @param execution - A building block execution object.
+     * @return AbstractCDSPropertiesBean - A POJO which contains CDS related information.
+     * @throws PayloadGenerationException - Throw an exception if it fails to build payload for CDS.
+     */
+    public AbstractCDSPropertiesBean buildCdsPropertiesBean(BuildingBlockExecution execution)
+            throws PayloadGenerationException {
+
+        ExecuteBuildingBlock executeBuildingBlock = execution.getVariable(BUILDING_BLOCK);
+        BuildingBlock buildingBlock = executeBuildingBlock.getBuildingBlock();
+        final String requestId = execution.getGeneralBuildingBlock().getRequestContext().getMsoRequestId();
+        final String scope = buildingBlock.getBpmnScope();
+        final String action = buildingBlock.getBpmnAction();
+
+
+        CDSRequestProvider requestProvider = getRequestProviderByScope(scope);
+        requestProvider.setExecutionObject(execution);
+
+        final String requestPayload = requestProvider.buildRequestPayload(action)
+                .orElseThrow(() -> new PayloadGenerationException("Failed to build payload for CDS"));
+
+        return prepareAndSetCdsPropertyBean(requestProvider, requestPayload, requestId, action, DEFAULT_SYNC_MODE);
+    }
+
+    /**
+     * Build properties like (blueprint name, version, action etc..) along with the request payload for pnf.
+     *
+     * @param execution - A building block execution object.
+     * @return AbstractCDSPropertiesBean - A POJO which contains CDS related information.
+     * @throws PayloadGenerationException - Throw an exception if it fails to build payload for CDS.
+     */
+    public AbstractCDSPropertiesBean buildCdsPropertiesBean(DelegateExecution execution)
+            throws PayloadGenerationException {
+
+        final String scope = String.valueOf(execution.getVariable(PayloadConstants.SCOPE));
+        final String action = String.valueOf(execution.getVariable(PayloadConstants.ACTION));
+        final String requestId = String.valueOf(execution.getVariable(MSO_REQUEST_ID));
+        final String mode = extractAndSetMode(execution);
+
+        CDSRequestProvider requestProvider = getRequestProviderByScope(scope);
+        requestProvider.setExecutionObject(execution);
+
+        final String requestPayload = requestProvider.buildRequestPayload(action)
+                .orElseThrow(() -> new PayloadGenerationException("Failed to build payload for CDS"));
+
+        return prepareAndSetCdsPropertyBean(requestProvider, requestPayload, requestId, action, mode);
+    }
+
+    private AbstractCDSPropertiesBean prepareAndSetCdsPropertyBean(CDSRequestProvider requestProvider,
+            String requestPayload, String requestId, String action, String mode) {
+        final AbstractCDSPropertiesBean cdsPropertiesBean = new AbstractCDSPropertiesBean();
+        cdsPropertiesBean.setRequestObject(requestPayload);
+        cdsPropertiesBean.setBlueprintName(requestProvider.getBlueprintName());
+        cdsPropertiesBean.setBlueprintVersion(requestProvider.getBlueprintVersion());
+        cdsPropertiesBean.setRequestId(requestId);
+        cdsPropertiesBean.setOriginatorId(ORIGINATOR_ID);
+        cdsPropertiesBean.setSubRequestId(UUID.randomUUID().toString());
+        cdsPropertiesBean.setActionName(action);
+        cdsPropertiesBean.setMode(mode);
+        return cdsPropertiesBean;
+    }
+
+    private String extractAndSetMode(DelegateExecution execution) {
+        String mode = DEFAULT_SYNC_MODE;
+        Object obj = execution.getVariable(PayloadConstants.MODE);
+        if (obj != null && !String.valueOf(obj).isEmpty()) {
+            mode = String.valueOf(obj);
+        }
+        return mode;
+    }
+
+    private CDSRequestProvider getRequestProviderByScope(String scope) throws PayloadGenerationException {
+        CDSRequestProvider requestProvider;
+        switch (scope) {
+            case PayloadConstants.VNF_SCOPE:
+                requestProvider = vnfCDSRequestProvider;
+                break;
+            case PayloadConstants.VF_MODULE_SCOPE:
+                requestProvider = vfModuleCDSRequestProvider;
+                break;
+            case PayloadConstants.SERVICE_SCOPE:
+                requestProvider = serviceCDSRequestProvider;
+                break;
+            case PayloadConstants.PNF_SCOPE:
+                requestProvider = pnfCDSRequestProvider;
+                break;
+            default:
+                throw new PayloadGenerationException("No scope defined with " + scope);
+        }
+        return requestProvider;
+    }
+}
diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/cds/PayloadConstants.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/cds/PayloadConstants.java
new file mode 100644
index 0000000..808d427
--- /dev/null
+++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/cds/PayloadConstants.java
@@ -0,0 +1,53 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2019 Bell Canada
+ * ================================================================================
+ * Modifications Copyright (C) 2020 Nordix
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.client.cds;
+
+public final class PayloadConstants {
+
+    private PayloadConstants() {
+
+    }
+
+    public static final String REQUEST = "request";
+    public static final String PROPERTIES = "properties";
+    public static final String SCOPE = "scope";
+    public static final String ACTION = "action";
+    public static final String MODE = "mode";
+    public static final String SEPARATOR = "-";
+    public static final String PNF_SCOPE = "pnf";
+    public static final String VNF_SCOPE = "vnf";
+    public static final String VF_MODULE_SCOPE = "vfModule";
+    public static final String SERVICE_SCOPE = "service";
+    public static final String RESOLUTION_KEY = "resolution-key";
+    public static final String CDS_ACTOR = "cds";
+
+    public static final String PRC_BLUEPRINT_NAME = "PRC_blueprintName";
+    public static final String PRC_BLUEPRINT_VERSION = "PRC_blueprintVersion";
+    public static final String PRC_CUSTOMIZATION_UUID = "PRC_customizationUuid";
+    public static final String PRC_TARGET_SOFTWARE_VERSION = "targetSoftwareVersion";
+
+    public final static String PNF_CORRELATION_ID = "pnfCorrelationId";
+    public final static String PNF_UUID = "pnfUuid";
+    public final static String SERVICE_INSTANCE_ID = "serviceInstanceId";
+    public final static String MODEL_UUID = "modelUuid";
+}
diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/cds/PnfCDSRequestProvider.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/cds/PnfCDSRequestProvider.java
new file mode 100644
index 0000000..86bca75
--- /dev/null
+++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/cds/PnfCDSRequestProvider.java
@@ -0,0 +1,78 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2020 Nordix
+ *  ================================================================================
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ *  SPDX-License-Identifier: Apache-2.0
+ *  ============LICENSE_END=========================================================
+ */
+package org.onap.so.client.cds;
+
+import com.google.gson.JsonObject;
+import org.camunda.bpm.engine.delegate.DelegateExecution;
+import org.springframework.beans.factory.config.ConfigurableBeanFactory;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+import java.util.Optional;
+import static org.onap.so.client.cds.PayloadConstants.*;
+
+@Component
+@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
+public class PnfCDSRequestProvider implements CDSRequestProvider {
+    private String blueprintName;
+    private String blueprintVersion;
+    private DelegateExecution execution;
+
+    @Override
+    public String getBlueprintName() {
+        return blueprintName;
+    }
+
+    @Override
+    public String getBlueprintVersion() {
+        return blueprintVersion;
+    }
+
+    @Override
+    public <T> void setExecutionObject(T executionObject) {
+        execution = (DelegateExecution) executionObject;
+    }
+
+    @Override
+    public Optional<String> buildRequestPayload(String action) {
+
+        final JsonObject pnfObject = new JsonObject();
+        final String resolutionKey = String.valueOf(execution.getVariable(PNF_CORRELATION_ID));
+        blueprintName = String.valueOf(execution.getVariable(PRC_BLUEPRINT_NAME));
+        blueprintVersion = String.valueOf(execution.getVariable(PRC_BLUEPRINT_VERSION));
+
+        extractAndSetExecutionVariable("service-instance-id", SERVICE_INSTANCE_ID, pnfObject);
+        extractAndSetExecutionVariable("service-model-uuid", MODEL_UUID, pnfObject);
+        extractAndSetExecutionVariable("pnf-id", PNF_UUID, pnfObject);
+        extractAndSetExecutionVariable("pnf-name", PNF_CORRELATION_ID, pnfObject);
+        extractAndSetExecutionVariable("pnf-customization-uuid", PRC_CUSTOMIZATION_UUID, pnfObject);
+        extractAndSetExecutionVariable("target-software-version", PRC_TARGET_SOFTWARE_VERSION, pnfObject);
+
+        final JsonObject cdsPropertyObject = new JsonObject();
+        cdsPropertyObject.addProperty(RESOLUTION_KEY, resolutionKey);
+        cdsPropertyObject.add(action + SEPARATOR + PROPERTIES, pnfObject);
+
+        return Optional.of(buildRequestJsonObject(cdsPropertyObject, action));
+    }
+
+    private void extractAndSetExecutionVariable(String jsonProperty, String executionProperty, JsonObject pnfObject) {
+        if (execution.getVariable(executionProperty) != null) {
+            pnfObject.addProperty(jsonProperty, String.valueOf(execution.getVariable(executionProperty)));
+        }
+    }
+}
diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/cds/ServiceCDSRequestProvider.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/cds/ServiceCDSRequestProvider.java
new file mode 100644
index 0000000..12c841a
--- /dev/null
+++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/cds/ServiceCDSRequestProvider.java
@@ -0,0 +1,89 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2020 Bell Canada
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.client.cds;
+
+import com.google.gson.JsonObject;
+import org.onap.so.bpmn.common.BuildingBlockExecution;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance;
+import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey;
+import org.onap.so.bpmn.servicedecomposition.tasks.ExtractPojosForBB;
+import org.onap.so.client.exception.PayloadGenerationException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.config.ConfigurableBeanFactory;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+import java.util.Optional;
+import static org.onap.so.client.cds.PayloadConstants.PROPERTIES;
+import static org.onap.so.client.cds.PayloadConstants.SEPARATOR;
+
+@Component
+@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
+public class ServiceCDSRequestProvider implements CDSRequestProvider {
+
+    private static final String EMPTY_STRING = "";
+    private String resolutionKey;
+    private BuildingBlockExecution execution;
+
+    @Autowired
+    private ExtractPojosForBB extractPojosForBB;
+
+    @Override
+    public String getBlueprintName() {
+        return EMPTY_STRING;
+    }
+
+    @Override
+    public String getBlueprintVersion() {
+        return EMPTY_STRING;
+    }
+
+    @Override
+    public <T> void setExecutionObject(T executionObject) {
+        execution = (BuildingBlockExecution) executionObject;
+    }
+
+    @Override
+    public Optional<String> buildRequestPayload(String action) throws PayloadGenerationException {
+        JsonObject cdsPropertyObject = new JsonObject();
+        JsonObject serviceObject = new JsonObject();
+        try {
+            ServiceInstance serviceInstance =
+                    extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID);
+
+            resolutionKey = serviceInstance.getServiceInstanceName();
+
+            // TODO Need to figure out how to populate blueprint name and version for service.
+
+            serviceObject.addProperty("service-instance-id", serviceInstance.getServiceInstanceId());
+            serviceObject.addProperty("service-model-uuid",
+                    serviceInstance.getModelInfoServiceInstance().getModelUuid());
+
+        } catch (Exception e) {
+            throw new PayloadGenerationException("Failed to buildPropertyObjectForService", e);
+        }
+
+        cdsPropertyObject.addProperty("resolution-key", resolutionKey);
+        cdsPropertyObject.add(action + SEPARATOR + PROPERTIES, serviceObject);
+
+        return Optional.of(buildRequestJsonObject(cdsPropertyObject, action));
+    }
+
+}
diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/cds/VfModuleCDSRequestProvider.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/cds/VfModuleCDSRequestProvider.java
new file mode 100644
index 0000000..bba8925
--- /dev/null
+++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/cds/VfModuleCDSRequestProvider.java
@@ -0,0 +1,121 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2019 Bell Canada
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.client.cds;
+
+import com.google.gson.JsonObject;
+import org.onap.so.bpmn.common.BuildingBlockExecution;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.VfModule;
+import org.onap.so.bpmn.servicedecomposition.entities.GeneralBuildingBlock;
+import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey;
+import org.onap.so.bpmn.servicedecomposition.tasks.ExtractPojosForBB;
+import org.onap.so.client.exception.PayloadGenerationException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.config.ConfigurableBeanFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import static org.onap.so.client.cds.PayloadConstants.PROPERTIES;
+import static org.onap.so.client.cds.PayloadConstants.SEPARATOR;
+
+@Component
+@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
+public class VfModuleCDSRequestProvider implements CDSRequestProvider {
+    private String blueprintName;
+    private String blueprintVersion;
+    private BuildingBlockExecution execution;
+
+    @Autowired
+    private ExtractPojosForBB extractPojosForBB;
+
+    @Autowired
+    private ConfigureInstanceParamsForVfModule configureInstanceParamsForVfModule;
+
+    @Override
+    public String getBlueprintName() {
+        return blueprintName;
+    }
+
+    @Override
+    public String getBlueprintVersion() {
+        return blueprintVersion;
+    }
+
+    @Override
+    public <T> void setExecutionObject(T executionObject) {
+        execution = (BuildingBlockExecution) executionObject;
+    }
+
+    @Override
+    public Optional<String> buildRequestPayload(String action) throws PayloadGenerationException {
+        JsonObject cdsPropertyObject = new JsonObject();
+        JsonObject vfModuleObject = new JsonObject();
+        String vfModuleName;
+
+        try {
+            ServiceInstance serviceInstance =
+                    extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID);
+            GenericVnf genericVnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID);
+
+            final String modelCustomizationUuidForVnf = genericVnf.getModelInfoGenericVnf().getModelCustomizationUuid();
+
+            blueprintName = genericVnf.getBlueprintName();
+            blueprintVersion = genericVnf.getBlueprintVersion();
+
+            VfModule vfModule = extractPojosForBB.extractByKey(execution, ResourceKey.VF_MODULE_ID);
+            vfModuleName = vfModule.getVfModuleName();
+
+            final String modelCustomizationUuidForVfModule =
+                    vfModule.getModelInfoVfModule().getModelCustomizationUUID();
+
+            vfModuleObject.addProperty("service-instance-id", serviceInstance.getServiceInstanceId());
+            vfModuleObject.addProperty("service-model-uuid",
+                    serviceInstance.getModelInfoServiceInstance().getModelUuid());
+            vfModuleObject.addProperty("vnf-id", genericVnf.getVnfId());
+            vfModuleObject.addProperty("vnf-name", genericVnf.getVnfName());
+            vfModuleObject.addProperty("vf-module-id", vfModule.getVfModuleId());
+            vfModuleObject.addProperty("vf-module-name", vfModule.getVfModuleName());
+            vfModuleObject.addProperty("vf-module-customization-uuid",
+                    vfModule.getModelInfoVfModule().getModelCustomizationUUID());
+
+            final GeneralBuildingBlock buildingBlock = execution.getGeneralBuildingBlock();
+            List<Map<String, Object>> userParamsFromRequest =
+                    buildingBlock.getRequestContext().getRequestParameters().getUserParams();
+
+            configureInstanceParamsForVfModule.populateInstanceParams(vfModuleObject, userParamsFromRequest,
+                    modelCustomizationUuidForVnf, modelCustomizationUuidForVfModule);
+        } catch (Exception e) {
+            throw new PayloadGenerationException("Failed to buildPropertyObject for VF-Module", e);
+        }
+
+        // Not sure for resolutionKey should be same as vfModule name.
+        cdsPropertyObject.addProperty("resolution-key", vfModuleName);
+        cdsPropertyObject.addProperty("template-prefix", vfModuleName + action);
+        cdsPropertyObject.add(action + SEPARATOR + PROPERTIES, vfModuleObject);
+
+        return Optional.of(buildRequestJsonObject(cdsPropertyObject, action));
+    }
+
+}
diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/cds/VnfCDSRequestProvider.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/cds/VnfCDSRequestProvider.java
new file mode 100644
index 0000000..d33976d
--- /dev/null
+++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/cds/VnfCDSRequestProvider.java
@@ -0,0 +1,106 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2019 Bell Canada
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.client.cds;
+
+import com.google.gson.JsonObject;
+import org.onap.so.bpmn.common.BuildingBlockExecution;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance;
+import org.onap.so.bpmn.servicedecomposition.entities.GeneralBuildingBlock;
+import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey;
+import org.onap.so.bpmn.servicedecomposition.tasks.ExtractPojosForBB;
+import org.onap.so.client.exception.PayloadGenerationException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.config.ConfigurableBeanFactory;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import static org.onap.so.client.cds.PayloadConstants.PROPERTIES;
+import static org.onap.so.client.cds.PayloadConstants.SEPARATOR;
+
+@Component
+@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
+public class VnfCDSRequestProvider implements CDSRequestProvider {
+    private String blueprintName;
+    private String blueprintVersion;
+    private BuildingBlockExecution execution;
+
+    @Autowired
+    private ExtractPojosForBB extractPojosForBB;
+
+    @Autowired
+    private ConfigureInstanceParamsForVnf configureInstanceParamsForVnf;
+
+    @Override
+    public String getBlueprintName() {
+        return blueprintName;
+    }
+
+    @Override
+    public String getBlueprintVersion() {
+        return blueprintVersion;
+    }
+
+    @Override
+    public <T> void setExecutionObject(T executionObject) {
+        execution = (BuildingBlockExecution) executionObject;
+    }
+
+    @Override
+    public Optional<String> buildRequestPayload(String action) throws PayloadGenerationException {
+        JsonObject cdsPropertyObject = new JsonObject();
+        JsonObject vnfObject = new JsonObject();
+        String resolutionKey;
+        try {
+            ServiceInstance serviceInstance =
+                    extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID);
+            GenericVnf genericVnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID);
+
+            final String modelCustomizationUuid = genericVnf.getModelInfoGenericVnf().getModelCustomizationUuid();
+
+            resolutionKey = genericVnf.getVnfName();
+            blueprintName = genericVnf.getBlueprintName();
+            blueprintVersion = genericVnf.getBlueprintVersion();
+
+            vnfObject.addProperty("service-instance-id", serviceInstance.getServiceInstanceId());
+            vnfObject.addProperty("service-model-uuid", serviceInstance.getModelInfoServiceInstance().getModelUuid());
+            vnfObject.addProperty("vnf-id", genericVnf.getVnfId());
+            vnfObject.addProperty("vnf-name", genericVnf.getVnfName());
+            vnfObject.addProperty("vnf-customization-uuid", modelCustomizationUuid);
+
+            final GeneralBuildingBlock buildingBlock = execution.getGeneralBuildingBlock();
+            List<Map<String, Object>> userParamsFromRequest =
+                    buildingBlock.getRequestContext().getRequestParameters().getUserParams();
+
+            configureInstanceParamsForVnf.populateInstanceParams(vnfObject, userParamsFromRequest,
+                    modelCustomizationUuid);
+        } catch (Exception e) {
+            throw new PayloadGenerationException("Failed to buildPropertyObjectForVnf", e);
+        }
+
+        cdsPropertyObject.addProperty("resolution-key", resolutionKey);
+        cdsPropertyObject.add(action + SEPARATOR + PROPERTIES, vnfObject);
+
+        return Optional.of(buildRequestJsonObject(cdsPropertyObject, action));
+    }
+}
diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/exception/PayloadGenerationException.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/exception/PayloadGenerationException.java
new file mode 100644
index 0000000..3c148a1
--- /dev/null
+++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/exception/PayloadGenerationException.java
@@ -0,0 +1,39 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2019 Bell Canada
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.client.exception;
+
+public class PayloadGenerationException extends Exception {
+
+    /**
+     * @param message The message to dump
+     */
+    public PayloadGenerationException(final String message) {
+        super(message);
+    }
+
+    /**
+     * @param message The message to dump.
+     * @param cause The throwable cause object.
+     */
+    public PayloadGenerationException(final String message, final Throwable cause) {
+        super(message, cause);
+    }
+}
diff --git a/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/cds/AbstractCDSProcessingBBUtilsTest.java b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/cds/AbstractCDSProcessingBBUtilsTest.java
index f558932..10844ec 100644
--- a/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/cds/AbstractCDSProcessingBBUtilsTest.java
+++ b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/cds/AbstractCDSProcessingBBUtilsTest.java
@@ -34,6 +34,7 @@
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnitRunner;
+import org.onap.so.bpmn.common.BuildingBlockExecution;
 import org.onap.so.client.cds.beans.AbstractCDSPropertiesBean;
 import org.onap.so.client.exception.ExceptionBuilder;
 
@@ -69,7 +70,7 @@
     }
 
     @Test
-    public void preProcessRequestTest() throws Exception {
+    public void preProcessRequestDETest() throws Exception {
 
         DelegateExecution execution = mock(DelegateExecution.class);
         when(execution.getVariable("executionObject")).thenReturn(abstractCDSPropertiesBean);
@@ -80,7 +81,7 @@
     }
 
     @Test
-    public void sendRequestToCDSClientTest() {
+    public void sendRequestToCDSClientDETest() {
 
         DelegateExecution execution = mock(DelegateExecution.class);
         when(execution.getVariable("executionServiceInput")).thenReturn(abstractCDSPropertiesBean);
@@ -90,4 +91,26 @@
 
     }
 
+    @Test
+    public void preProcessRequestBBTest() throws Exception {
+
+        BuildingBlockExecution execution = mock(BuildingBlockExecution.class);
+        when(execution.getVariable("executionObject")).thenReturn(abstractCDSPropertiesBean);
+
+        abstractCDSProcessingBBUtils.constructExecutionServiceInputObject(execution);
+        verify(exceptionUtil, times(0)).buildAndThrowWorkflowException(any(BuildingBlockExecution.class), anyInt(),
+                any(Exception.class));
+    }
+
+    @Test
+    public void sendRequestToCDSClientBBTest() {
+
+        BuildingBlockExecution execution = mock(BuildingBlockExecution.class);
+        when(execution.getVariable("executionServiceInput")).thenReturn(abstractCDSPropertiesBean);
+        abstractCDSProcessingBBUtils.sendRequestToCDSClient(execution);
+        verify(exceptionUtil, times(1)).buildAndThrowWorkflowException(any(BuildingBlockExecution.class), anyInt(),
+                any(Exception.class));
+
+    }
+
 }
diff --git a/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/cds/AbstractVnfCDSRequestProviderTest.java b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/cds/AbstractVnfCDSRequestProviderTest.java
new file mode 100644
index 0000000..9c3ce60
--- /dev/null
+++ b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/cds/AbstractVnfCDSRequestProviderTest.java
@@ -0,0 +1,205 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2020 Nordix
+ *  ================================================================================
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ *  SPDX-License-Identifier: Apache-2.0
+ *  ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.client.cds;
+
+import com.google.gson.JsonParser;
+import org.camunda.bpm.engine.delegate.DelegateExecution;
+import org.camunda.bpm.extension.mockito.delegate.DelegateExecutionFake;
+import org.junit.Before;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+import org.onap.so.bpmn.common.BuildingBlockExecution;
+import org.onap.so.bpmn.common.DelegateExecutionImpl;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.VfModule;
+import org.onap.so.bpmn.servicedecomposition.entities.BuildingBlock;
+import org.onap.so.bpmn.servicedecomposition.entities.ExecuteBuildingBlock;
+import org.onap.so.bpmn.servicedecomposition.entities.GeneralBuildingBlock;
+import org.onap.so.bpmn.servicedecomposition.generalobjects.RequestContext;
+import org.onap.so.bpmn.servicedecomposition.generalobjects.RequestParameters;
+import org.onap.so.bpmn.servicedecomposition.modelinfo.ModelInfoGenericVnf;
+import org.onap.so.bpmn.servicedecomposition.modelinfo.ModelInfoServiceInstance;
+import org.onap.so.bpmn.servicedecomposition.modelinfo.ModelInfoVfModule;
+import org.onap.so.bpmn.servicedecomposition.tasks.ExtractPojosForBB;
+import org.onap.so.serviceinstancebeans.*;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@RunWith(MockitoJUnitRunner.Silent.class)
+public abstract class AbstractVnfCDSRequestProviderTest {
+
+    protected static final String GENERIC_VNF_ID = "vnfId_configVnfTest1";
+    protected static final String VF_MODULE_ID = "vf-module-id-1";
+    protected static final String VF_MODULE_NAME = "vf-module-name-1";
+    protected static final String VF_MODULE_CUSTOMIZATION_UUID = "23ce9ac4-e5dd-11e9-81b4-2a2ae2dbcce1";
+    protected static final String GENERIC_VNF_NAME = "vnf-name-1";
+    protected static final String SERVICE_INSTANCE_ID = "serviceInst_configTest";
+    protected static final String SERVICE_MODEL_UUID = "b45b5780-e5dd-11e9-81b4-2a2ae2dbcce4";
+    protected static final String SERVICE_INSTANCE_NAME = "test-service-instance";
+    protected static final String VNF_MODEL_CUSTOMIZATION_UUID = "23ce9ac4-e5dd-11e9-81b4-2a2ae2dbcce4";
+    protected static final String GENERAL_BLOCK_EXECUTION_MAP_KEY = "gBBInput";
+    protected static final String VNF_SCOPE = "vnf";
+    protected static final String SERVICE_SCOPE = "service";
+    protected static final String SERVICE_ACTION = "create";
+    protected static final String VF_SCOPE = "vfModule";
+    protected static final String ASSIGN_ACTION = "configAssign";
+    protected static final String DEPLOY_ACTION = "configDeploy";
+    protected static final String MSO_REQUEST_ID = "1234";
+    protected static final String BUILDING_BLOCK = "buildingBlock";
+    protected static final String PUBLIC_NET_ID = "public-net-id";
+    protected static final String CLOUD_REGION = "acl-cloud-region";
+
+    @Mock
+    protected ExtractPojosForBB extractPojosForBB;
+
+    protected BuildingBlockExecution buildingBlockExecution;
+
+    protected ExecuteBuildingBlock executeBuildingBlock;
+
+
+    @Before
+    public void setUp() {
+        buildingBlockExecution = createBuildingBlockExecution();
+        executeBuildingBlock = new ExecuteBuildingBlock();
+    }
+
+    protected BuildingBlockExecution createBuildingBlockExecution() {
+        DelegateExecution execution = new DelegateExecutionFake();
+        execution.setVariable(GENERAL_BLOCK_EXECUTION_MAP_KEY, createGeneralBuildingBlock());
+        return new DelegateExecutionImpl(execution);
+    }
+
+    protected GeneralBuildingBlock createGeneralBuildingBlock() {
+        GeneralBuildingBlock generalBuildingBlock = new GeneralBuildingBlock();
+        RequestContext requestContext = new RequestContext();
+        RequestParameters requestParameters = new RequestParameters();
+        requestParameters.setUserParams(createRequestUserParams());
+        requestContext.setRequestParameters(requestParameters);
+        requestContext.setMsoRequestId(MSO_REQUEST_ID);
+        generalBuildingBlock.setRequestContext(requestContext);
+        return generalBuildingBlock;
+    }
+
+    protected ServiceInstance createServiceInstance() {
+        ServiceInstance serviceInstance = new ServiceInstance();
+        serviceInstance.setServiceInstanceName(SERVICE_INSTANCE_NAME);
+        serviceInstance.setServiceInstanceId(SERVICE_INSTANCE_ID);
+        ModelInfoServiceInstance modelInfoServiceInstance = new ModelInfoServiceInstance();
+        modelInfoServiceInstance.setModelUuid(SERVICE_MODEL_UUID);
+        serviceInstance.setModelInfoServiceInstance(modelInfoServiceInstance);
+        return serviceInstance;
+    }
+
+    protected GenericVnf createGenericVnf() {
+        GenericVnf genericVnf = new GenericVnf();
+        genericVnf.setVnfId(GENERIC_VNF_ID);
+        genericVnf.setVnfName(GENERIC_VNF_NAME);
+        genericVnf.setBlueprintName("test");
+        genericVnf.setBlueprintVersion("1.0.0");
+        ModelInfoGenericVnf modelInfoGenericVnf = new ModelInfoGenericVnf();
+        modelInfoGenericVnf.setModelCustomizationUuid(VNF_MODEL_CUSTOMIZATION_UUID);
+        genericVnf.setModelInfoGenericVnf(modelInfoGenericVnf);
+        return genericVnf;
+    }
+
+    protected VfModule createVfModule() {
+        VfModule vfModule = new VfModule();
+        vfModule.setVfModuleId(VF_MODULE_ID);
+        vfModule.setVfModuleName(VF_MODULE_NAME);
+        ModelInfoVfModule modelInfoVfModule = new ModelInfoVfModule();
+        modelInfoVfModule.setModelCustomizationUUID(VF_MODULE_CUSTOMIZATION_UUID);
+        vfModule.setModelInfoVfModule(modelInfoVfModule);
+        return vfModule;
+    }
+
+    protected List<Map<String, Object>> createRequestUserParams() {
+        List<Map<String, Object>> userParams = new ArrayList<>();
+        Map<String, Object> userParamMap = new HashMap<>();
+        userParamMap.put("service", getUserParams());
+        userParams.add(userParamMap);
+        return userParams;
+    }
+
+    protected Service getUserParams() {
+        Service service = new Service();
+        Resources resources = new Resources();
+        resources.setVnfs(createVnfList());
+        service.setResources(resources);
+        return service;
+    }
+
+    protected List<Vnfs> createVnfList() {
+        List<Map<String, String>> instanceParamsListSearchedVnf = new ArrayList<>();
+        Map<String, String> instanceParam = new HashMap<>();
+        instanceParam.put("public_net_id", PUBLIC_NET_ID);
+        instanceParam.put("acl-cloud-region", CLOUD_REGION);
+        instanceParamsListSearchedVnf.add(instanceParam);
+        Vnfs searchedVnf = createVnf(instanceParamsListSearchedVnf);
+        List<Vnfs> vnfList = new ArrayList<>();
+        vnfList.add(searchedVnf);
+        return vnfList;
+    }
+
+    protected Vnfs createVnf(List<Map<String, String>> instanceParamsList) {
+        Vnfs vnf = new Vnfs();
+        ModelInfo modelInfo = new ModelInfo();
+        modelInfo.setModelCustomizationId(VNF_MODEL_CUSTOMIZATION_UUID);
+        vnf.setModelInfo(modelInfo);
+        vnf.setInstanceParams(instanceParamsList);
+
+        // Set instance parameters and modelinfo for vf-module
+        VfModules vfModule = new VfModules();
+        ModelInfo modelInfoForVfModule = new ModelInfo();
+        modelInfoForVfModule.setModelCustomizationId(VF_MODULE_CUSTOMIZATION_UUID);
+        vfModule.setModelInfo(modelInfoForVfModule);
+
+        List<Map<String, String>> instanceParamsListSearchedVfModule = new ArrayList<>();
+        Map<String, String> instanceParams = new HashMap<>();
+        instanceParams.put("public-net-vf-module-id", PUBLIC_NET_ID);
+        instanceParams.put("aci-cloud-region-vf-module", CLOUD_REGION);
+
+        instanceParamsListSearchedVfModule.add(instanceParams);
+        vfModule.setInstanceParams(instanceParamsListSearchedVfModule);
+
+        List<VfModules> vfModules = new ArrayList<>();
+        vfModules.add(vfModule);
+
+        vnf.setVfModules(vfModules);
+
+        return vnf;
+    }
+
+    protected boolean verfiyJsonFromString(String payload) {
+        JsonParser parser = new JsonParser();
+        return parser.parse(payload).isJsonObject();
+    }
+
+    protected void setScopeAndAction(String scope, String action) {
+        BuildingBlock buildingBlock = new BuildingBlock();
+        buildingBlock.setBpmnScope(scope);
+        buildingBlock.setBpmnAction(action);
+        executeBuildingBlock.setBuildingBlock(buildingBlock);
+        buildingBlockExecution.setVariable(BUILDING_BLOCK, executeBuildingBlock);
+    }
+}
diff --git a/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/cds/ConfigureInstanceParamsForVfModuleTest.java b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/cds/ConfigureInstanceParamsForVfModuleTest.java
new file mode 100644
index 0000000..9baf5dc
--- /dev/null
+++ b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/cds/ConfigureInstanceParamsForVfModuleTest.java
@@ -0,0 +1,127 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2019 Bell Canada
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.client.cds;
+
+import com.google.gson.JsonObject;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey;
+import org.onap.so.serviceinstancebeans.ModelInfo;
+import org.onap.so.serviceinstancebeans.Resources;
+import org.onap.so.serviceinstancebeans.Service;
+import org.onap.so.serviceinstancebeans.VfModules;
+import org.onap.so.serviceinstancebeans.Vnfs;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import static org.junit.Assert.assertEquals;
+import static org.mockito.ArgumentMatchers.anyList;
+import static org.mockito.Mockito.doReturn;
+
+@RunWith(MockitoJUnitRunner.Silent.class)
+public class ConfigureInstanceParamsForVfModuleTest {
+
+    @InjectMocks
+    private ConfigureInstanceParamsForVfModule configureInstanceParamsForVfModule;
+
+    @Mock
+    private ExtractServiceFromUserParameters extractServiceFromUserParameters;
+
+    private static final String TEST_VNF_MODEL_CUSTOMIZATION_UUID = "23ce9ac4-e5dd-11e9-81b4-2a2ae2dbcce4";
+    private static final String TEST_VF_MODULE_CUSTOMIZATION_UUID = "23ce9ac4-e5dd-11e9-81b4-2a2ae2dbcce2";
+    private static final String TEST_INSTANCE_PARAM_VALUE_1 = "vf-module-1-value";
+    private static final String TEST_INSTANCE_PARAM_VALUE_2 = "vf-module-2-value";
+    private static final String TEST_INSTANCE_PARAM_KEY_1 = "instance-param-1";
+    private static final String TEST_INSTANCE_PARAM_KEY_2 = "instance-param-2";
+
+    @Test
+    public void testInstanceParamsForVfModule() throws Exception {
+        // given
+        List<Map<String, Object>> userParamsFromRequest = createRequestParameters();
+        JsonObject jsonObject = new JsonObject();
+        doReturn(getUserParams()).when(extractServiceFromUserParameters).getServiceFromRequestUserParams(anyList());
+
+        // when
+        configureInstanceParamsForVfModule.populateInstanceParams(jsonObject, userParamsFromRequest,
+                TEST_VNF_MODEL_CUSTOMIZATION_UUID, TEST_VF_MODULE_CUSTOMIZATION_UUID);
+
+        // verify
+        assertEquals(TEST_INSTANCE_PARAM_VALUE_1, jsonObject.get(TEST_INSTANCE_PARAM_KEY_1).getAsString());
+        assertEquals(TEST_INSTANCE_PARAM_VALUE_2, jsonObject.get(TEST_INSTANCE_PARAM_KEY_2).getAsString());
+    }
+
+    private List<Map<String, Object>> createRequestParameters() {
+        List<Map<String, Object>> userParams = new ArrayList<>();
+        Map<String, Object> userParamMap = new HashMap<>();
+        userParamMap.put("service", getUserParams());
+        userParams.add(userParamMap);
+        return userParams;
+    }
+
+    private Service getUserParams() {
+        Service service = new Service();
+        Resources resources = new Resources();
+        resources.setVnfs(createVnfs());
+        service.setResources(resources);
+        return service;
+    }
+
+    private List<Vnfs> createVnfs() {
+        Vnfs searchedVnf = createVnf();
+        List<Vnfs> vnfList = new ArrayList<>();
+        vnfList.add(searchedVnf);
+        return vnfList;
+    }
+
+    private Vnfs createVnf() {
+        Vnfs vnf = new Vnfs();
+        ModelInfo modelInfoForVnf = new ModelInfo();
+        modelInfoForVnf.setModelCustomizationId(TEST_VNF_MODEL_CUSTOMIZATION_UUID);
+        vnf.setModelInfo(modelInfoForVnf);
+
+        VfModules vfModule = new VfModules();
+
+        ModelInfo modelInfoForVfModule = new ModelInfo();
+        modelInfoForVfModule.setModelCustomizationId(TEST_VF_MODULE_CUSTOMIZATION_UUID);
+
+        vfModule.setModelInfo(modelInfoForVfModule);
+
+        // Set instance parameters.
+        List<Map<String, String>> instanceParamsListSearchedVfModule = new ArrayList<>();
+        Map<String, String> instanceParams = new HashMap<>();
+        instanceParams.put("instance-param-1", TEST_INSTANCE_PARAM_VALUE_1);
+        instanceParams.put("instance-param-2", TEST_INSTANCE_PARAM_VALUE_2);
+
+        instanceParamsListSearchedVfModule.add(instanceParams);
+        vfModule.setInstanceParams(instanceParamsListSearchedVfModule);
+
+        List<VfModules> vfModules = new ArrayList<>();
+        vfModules.add(vfModule);
+
+        vnf.setVfModules(vfModules);
+
+        return vnf;
+    }
+}
diff --git a/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/cds/GeneratePayloadForCdsTest.java b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/cds/GeneratePayloadForCdsTest.java
new file mode 100644
index 0000000..24962a0
--- /dev/null
+++ b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/cds/GeneratePayloadForCdsTest.java
@@ -0,0 +1,342 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2019 Bell Canada.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.so.client.cds;
+
+import org.camunda.bpm.engine.delegate.DelegateExecution;
+import org.camunda.bpm.extension.mockito.delegate.DelegateExecutionFake;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+import org.onap.so.bpmn.common.BuildingBlockExecution;
+import org.onap.so.bpmn.common.DelegateExecutionImpl;
+import org.onap.so.bpmn.servicedecomposition.entities.BuildingBlock;
+import org.onap.so.bpmn.servicedecomposition.entities.ExecuteBuildingBlock;
+import org.onap.so.bpmn.servicedecomposition.entities.GeneralBuildingBlock;
+import org.onap.so.bpmn.servicedecomposition.generalobjects.RequestContext;
+import org.onap.so.bpmn.servicedecomposition.generalobjects.RequestParameters;
+import org.onap.so.client.cds.beans.AbstractCDSPropertiesBean;
+import org.onap.so.client.exception.PayloadGenerationException;
+import org.onap.so.serviceinstancebeans.*;
+import java.util.*;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.ThrowableAssert.catchThrowable;
+import static org.junit.Assert.assertNotNull;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.doThrow;
+
+@RunWith(MockitoJUnitRunner.Silent.class)
+public class GeneratePayloadForCdsTest {
+    private static final String VF_MODULE_CUSTOMIZATION_UUID = "23ce9ac4-e5dd-11e9-81b4-2a2ae2dbcce1";
+    private static final String VNF_MODEL_CUSTOMIZATION_UUID = "23ce9ac4-e5dd-11e9-81b4-2a2ae2dbcce4";
+    private static final String GENERAL_BLOCK_EXECUTION_MAP_KEY = "gBBInput";
+    private static final String VNF_SCOPE = "vnf";
+    private static final String SERVICE_SCOPE = "service";
+    private static final String SERVICE_ACTION = "create";
+    private static final String VF_SCOPE = "vfModule";
+    private static final String ASSIGN_ACTION = "configAssign";
+    private static final String DEPLOY_ACTION = "configDeploy";
+    private static final String DOWNLOAD_ACTION = "downloadNeSw";
+    private static final String MSO_REQUEST_ID = "1234";
+    private static final String BUILDING_BLOCK = "buildingBlock";
+    private static final String PUBLIC_NET_ID = "public-net-id";
+    private static final String CLOUD_REGION = "acl-cloud-region";
+    private static final String TEST_MODEL_UUID = "6bc0b04d-1873-4721-b53d-6615225b2a28";
+    private static final String TEST_SERVICE_INSTANCE_ID = "test_service_id";
+    private static final String TEST_PROCESS_KEY = "processKey1";
+    private static final String TEST_PNF_RESOURCE_INSTANCE_NAME = "PNF_demo_resource";
+    private static final String TEST_PNF_CORRELATION_ID = "PNFDemo";
+    private static final String TEST_PNF_RESOURCE_CUSTOMIZATION_UUID = "9acb3a83-8a52-412c-9a45-901764938144";
+    private static final String TEST_MSO_REQUEST_ID = "ff874603-4222-11e7-9252-005056850d2e";
+    private static final String TEST_PNF_UUID = "5df8b6de-2083-11e7-93ae-92361f002671";
+    private static final String TEST_SOFTWARE_VERSION = "demo-sw-ver2.0.0";
+    private static final String PNF_CORRELATION_ID = "pnfCorrelationId";
+    private static final String PNF_UUID = "pnfUuid";
+    private static final String SERVICE_INSTANCE_ID = "serviceInstanceId";
+    private static final String MODEL_UUID = "modelUuid";
+    private static final String PRC_CUSTOMIZATION_UUID = "PRC_customizationUuid";
+    private static final String PRC_INSTANCE_NAME = "PRC_instanceName";
+    private static final String PRC_TARGET_SOFTWARE_VERSION = "targetSoftwareVersion";
+    private static final String SCOPE = "scope";
+    private static final String ACTION = "action";
+    private static final String PROCESS_KEY = "testProcessKey";
+    private static final String PRC_BLUEPRINT_NAME = "PRC_blueprintName";
+    private static final String PRC_BLUEPRINT_VERSION = "PRC_blueprintVersion";
+    private static final String TEST_PNF_RESOURCE_BLUEPRINT_NAME = "blueprintOnap";
+    private static final String TEST_PNF_RESOURCE_BLUEPRINT_VERSION = "1.0.1";
+
+    private BuildingBlockExecution buildingBlockExecution;
+    private ExecuteBuildingBlock executeBuildingBlock;
+
+    @InjectMocks
+    private GeneratePayloadForCds configurePayloadForCds;
+
+    @Mock
+    private VnfCDSRequestProvider vnfCDSRequestProvider;
+
+    @Mock
+    private VfModuleCDSRequestProvider vfModuleCDSRequestProvider;
+
+    @Mock
+    private ServiceCDSRequestProvider serviceCDSRequestProvider;
+
+    @Mock
+    private PnfCDSRequestProvider pnfCDSRequestProvider;
+
+
+    @Before
+    public void setup() {
+        buildingBlockExecution = createBuildingBlockExecution();
+        executeBuildingBlock = new ExecuteBuildingBlock();
+    }
+
+    @Test
+    public void testBuildCdsPropertiesBeanAssignVnf() throws Exception {
+        // given
+        final String assignPayload =
+                "{\"configAssign-request\":{\"resolution-key\":\"vnf-name-1\",\"configAssign-properties\":{\"service-instance-id\":\"serviceInst_configTest\",\"service-model-uuid\":\"b45b5780-e5dd-11e9-81b4-2a2ae2dbcce4\",\"vnf-id\":\"vnfId_configVnfTest1\",\"vnf-name\":\"vnf-name-1\",\"vnf-customization-uuid\":\"23ce9ac4-e5dd-11e9-81b4-2a2ae2dbcce4\",\"acl-cloud-region\":\"acl-cloud-region\",\"public_net_id\":\"public-net-id\"}}}";
+        setScopeAndAction(VNF_SCOPE, ASSIGN_ACTION);
+        doReturn(Optional.of(assignPayload)).when(vnfCDSRequestProvider).buildRequestPayload(ASSIGN_ACTION);
+
+        // when
+        AbstractCDSPropertiesBean propertyBean = configurePayloadForCds.buildCdsPropertiesBean(buildingBlockExecution);
+
+        // verify
+        assertNotNull(propertyBean);
+        String payload = propertyBean.getRequestObject();
+        assertThat(assignPayload.equals(payload));
+        assertThat(propertyBean.getRequestId().equals(MSO_REQUEST_ID));
+        assertThat(propertyBean.getOriginatorId().equals("SO"));
+        assertNotNull(propertyBean.getSubRequestId());
+        assertThat(propertyBean.getActionName().equals(ASSIGN_ACTION));
+        assertThat(propertyBean.getMode().equalsIgnoreCase("sync"));
+    }
+
+    @Test
+    public void testBuildCdsPropertiesBeanDeployVnf() throws Exception {
+        // given
+        final String deployPayload =
+                "{\"configDeploy-request\":{\"resolution-key\":\"vnf-name-1\",\"configDeploy-properties\":{\"service-instance-id\":\"serviceInst_configTest\",\"service-model-uuid\":\"b45b5780-e5dd-11e9-81b4-2a2ae2dbcce4\",\"vnf-id\":\"vnfId_configVnfTest1\",\"vnf-name\":\"vnf-name-1\",\"vnf-customization-uuid\":\"23ce9ac4-e5dd-11e9-81b4-2a2ae2dbcce4\",\"acl-cloud-region\":\"acl-cloud-region\",\"public_net_id\":\"public-net-id\"}}}";
+        setScopeAndAction(VNF_SCOPE, DEPLOY_ACTION);
+        doReturn(Optional.of(deployPayload)).when(vnfCDSRequestProvider).buildRequestPayload(DEPLOY_ACTION);
+
+        // when
+        AbstractCDSPropertiesBean propertyBean = configurePayloadForCds.buildCdsPropertiesBean(buildingBlockExecution);
+
+        // verify
+        assertNotNull(propertyBean);
+        String payload = propertyBean.getRequestObject();
+        assertThat(deployPayload.equals(payload));
+        assertThat(propertyBean.getRequestId().equals(MSO_REQUEST_ID));
+        assertThat(propertyBean.getOriginatorId().equals("SO"));
+        assertNotNull(propertyBean.getSubRequestId());
+        assertThat(propertyBean.getActionName().equals(DEPLOY_ACTION));
+        assertThat(propertyBean.getMode().equalsIgnoreCase("sync"));
+    }
+
+    @Test
+    public void testBuildCdsPropertiesBeanCreateService() throws Exception {
+        // given
+        final String servicePayload =
+                "{\"create-request\":{\"resolution-key\":\"test-service-instance\",\"create-properties\":{\"service-instance-id\":\"serviceInst_configTest\",\"service-model-uuid\":\"b45b5780-e5dd-11e9-81b4-2a2ae2dbcce4\"}}}";
+        setScopeAndAction(SERVICE_SCOPE, SERVICE_ACTION);
+        doReturn(Optional.of(servicePayload)).when(serviceCDSRequestProvider).buildRequestPayload(SERVICE_ACTION);
+
+        // when
+        AbstractCDSPropertiesBean propertyBean = configurePayloadForCds.buildCdsPropertiesBean(buildingBlockExecution);
+
+        // verify
+        assertNotNull(propertyBean);
+        String payload = propertyBean.getRequestObject();
+        assertThat(servicePayload.equals(payload));
+        assertThat(propertyBean.getRequestId().equals(MSO_REQUEST_ID));
+        assertThat(propertyBean.getOriginatorId().equals("SO"));
+        assertNotNull(propertyBean.getSubRequestId());
+        assertThat(propertyBean.getActionName().equals(SERVICE_ACTION));
+        assertThat(propertyBean.getMode().equalsIgnoreCase("sync"));
+    }
+
+    @Test
+    public void testBuildCdsPropertiesBeanConfigDeployVfModule() throws Exception {
+        // given
+        final String deployVfModulePayload =
+                "{\"configDeploy-request\":{\"resolution-key\":\"vf-module-name-1\",\"template-prefix\":\"vf-module-name-1configDeploy\",\"configDeploy-properties\":{\"service-instance-id\":\"serviceInst_configTest\",\"service-model-uuid\":\"b45b5780-e5dd-11e9-81b4-2a2ae2dbcce4\",\"vnf-id\":\"vnfId_configVnfTest1\",\"vnf-name\":\"vnf-name-1\",\"vf-module-id\":\"vf-module-id-1\",\"vf-module-name\":\"vf-module-name-1\",\"vf-module-customization-uuid\":\"23ce9ac4-e5dd-11e9-81b4-2a2ae2dbcce1\",\"aci-cloud-region-vf-module\":\"acl-cloud-region\",\"public-net-vf-module-id\":\"public-net-id\"}}}";
+        setScopeAndAction(VF_SCOPE, DEPLOY_ACTION);
+        doReturn(Optional.of(deployVfModulePayload)).when(vfModuleCDSRequestProvider)
+                .buildRequestPayload(DEPLOY_ACTION);
+
+        // when
+        AbstractCDSPropertiesBean propertyBean = configurePayloadForCds.buildCdsPropertiesBean(buildingBlockExecution);
+
+        // verify
+        assertNotNull(propertyBean);
+        String payload = propertyBean.getRequestObject();
+        assertThat(deployVfModulePayload.equals(payload));
+        assertThat(propertyBean.getRequestId().equals(MSO_REQUEST_ID));
+        assertThat(propertyBean.getOriginatorId().equals("SO"));
+        assertNotNull(propertyBean.getSubRequestId());
+        assertThat(propertyBean.getActionName().equals(DEPLOY_ACTION));
+        assertThat(propertyBean.getMode().equalsIgnoreCase("sync"));
+    }
+
+    @Test
+    public void testBuildCdsPropertiesBeanDownloadPnf() throws Exception {
+        // given
+        final String downloadPayload =
+                "{\"downloadNeSw-request\":{\"resolution-key\":\"PNFDemo\",\"downloadNeSw-properties\":{\"service-instance-id\":\"test_service_id\",\"service-model-uuid\":\"6bc0b04d-1873-4721-b53d-6615225b2a28\",\"pnf-id\":\"5df8b6de-2083-11e7-93ae-92361f002671\",\"pnf-name\":\"PNFDemo\",\"pnf-customization-uuid\":\"9acb3a83-8a52-412c-9a45-901764938144\",\"target-software-version\":\"demo-sw-ver2.0.0\"}}}";
+        DelegateExecution execution = prepareDelegateExecutionObj(PayloadConstants.PNF_SCOPE, DOWNLOAD_ACTION);
+        doReturn(Optional.of(downloadPayload)).when(pnfCDSRequestProvider).buildRequestPayload(DOWNLOAD_ACTION);
+        doReturn(TEST_PNF_RESOURCE_BLUEPRINT_NAME).when(pnfCDSRequestProvider).getBlueprintName();
+        doReturn(TEST_PNF_RESOURCE_BLUEPRINT_VERSION).when(pnfCDSRequestProvider).getBlueprintVersion();
+
+        // when
+        AbstractCDSPropertiesBean propertyBean = configurePayloadForCds.buildCdsPropertiesBean(execution);
+
+        // verify
+        assertNotNull(propertyBean);
+        String payload = propertyBean.getRequestObject();
+        assertThat(downloadPayload.equals(payload));
+        assertThat(propertyBean.getRequestId().equals(MSO_REQUEST_ID));
+        assertThat(propertyBean.getOriginatorId().equals("SO"));
+        assertNotNull(propertyBean.getSubRequestId());
+        assertThat(propertyBean.getActionName().equals(DOWNLOAD_ACTION));
+        assertThat(propertyBean.getMode().equalsIgnoreCase("async"));
+        assertThat(propertyBean.getBlueprintName().equalsIgnoreCase(TEST_PNF_RESOURCE_BLUEPRINT_NAME));
+        assertThat(propertyBean.getBlueprintVersion().equalsIgnoreCase(TEST_PNF_RESOURCE_BLUEPRINT_VERSION));
+    }
+
+    @Test
+    public void testFailureWhenServiceInstanceIsNotPresent() throws Exception {
+        // given
+        setScopeAndAction(VNF_SCOPE, ASSIGN_ACTION);
+        doThrow(PayloadGenerationException.class).when(serviceCDSRequestProvider).buildRequestPayload(ASSIGN_ACTION);
+
+        // when
+        final Throwable throwable =
+                catchThrowable(() -> configurePayloadForCds.buildCdsPropertiesBean(buildingBlockExecution));
+
+        // verify
+        assertThat(throwable).isInstanceOf(PayloadGenerationException.class)
+                .hasMessage("Failed to build payload for CDS");
+    }
+
+    private BuildingBlockExecution createBuildingBlockExecution() {
+        DelegateExecution execution = new DelegateExecutionFake();
+        execution.setVariable(GENERAL_BLOCK_EXECUTION_MAP_KEY, createGeneralBuildingBlock());
+        return new DelegateExecutionImpl(execution);
+    }
+
+    private GeneralBuildingBlock createGeneralBuildingBlock() {
+        GeneralBuildingBlock generalBuildingBlock = new GeneralBuildingBlock();
+        RequestContext requestContext = new RequestContext();
+        RequestParameters requestParameters = new RequestParameters();
+        requestParameters.setUserParams(createRequestUserParams());
+        requestContext.setRequestParameters(requestParameters);
+        requestContext.setMsoRequestId(MSO_REQUEST_ID);
+        generalBuildingBlock.setRequestContext(requestContext);
+        return generalBuildingBlock;
+    }
+
+    private List<Map<String, Object>> createRequestUserParams() {
+        List<Map<String, Object>> userParams = new ArrayList<>();
+        Map<String, Object> userParamMap = new HashMap<>();
+        userParamMap.put("service", getUserParams());
+        userParams.add(userParamMap);
+        return userParams;
+    }
+
+    private Service getUserParams() {
+        Service service = new Service();
+        Resources resources = new Resources();
+        resources.setVnfs(createVnfList());
+        service.setResources(resources);
+        return service;
+    }
+
+    private List<Vnfs> createVnfList() {
+        List<Map<String, String>> instanceParamsListSearchedVnf = new ArrayList<>();
+        Map<String, String> instanceParam = new HashMap<>();
+        instanceParam.put("public_net_id", PUBLIC_NET_ID);
+        instanceParam.put("acl-cloud-region", CLOUD_REGION);
+        instanceParamsListSearchedVnf.add(instanceParam);
+        Vnfs searchedVnf = createVnf(instanceParamsListSearchedVnf);
+        List<Vnfs> vnfList = new ArrayList<>();
+        vnfList.add(searchedVnf);
+        return vnfList;
+    }
+
+    private Vnfs createVnf(List<Map<String, String>> instanceParamsList) {
+        Vnfs vnf = new Vnfs();
+        ModelInfo modelInfo = new ModelInfo();
+        modelInfo.setModelCustomizationId(VNF_MODEL_CUSTOMIZATION_UUID);
+        vnf.setModelInfo(modelInfo);
+        vnf.setInstanceParams(instanceParamsList);
+
+        // Set instance parameters and modelinfo for vf-module
+        VfModules vfModule = new VfModules();
+        ModelInfo modelInfoForVfModule = new ModelInfo();
+        modelInfoForVfModule.setModelCustomizationId(VF_MODULE_CUSTOMIZATION_UUID);
+        vfModule.setModelInfo(modelInfoForVfModule);
+
+        List<Map<String, String>> instanceParamsListSearchedVfModule = new ArrayList<>();
+        Map<String, String> instanceParams = new HashMap<>();
+        instanceParams.put("public-net-vf-module-id", PUBLIC_NET_ID);
+        instanceParams.put("aci-cloud-region-vf-module", CLOUD_REGION);
+
+        instanceParamsListSearchedVfModule.add(instanceParams);
+        vfModule.setInstanceParams(instanceParamsListSearchedVfModule);
+
+        List<VfModules> vfModules = new ArrayList<>();
+        vfModules.add(vfModule);
+
+        vnf.setVfModules(vfModules);
+
+        return vnf;
+    }
+
+    private void setScopeAndAction(String scope, String action) {
+        BuildingBlock buildingBlock = new BuildingBlock();
+        buildingBlock.setBpmnScope(scope);
+        buildingBlock.setBpmnAction(action);
+        executeBuildingBlock.setBuildingBlock(buildingBlock);
+        buildingBlockExecution.setVariable(BUILDING_BLOCK, executeBuildingBlock);
+    }
+
+    private DelegateExecution prepareDelegateExecutionObj(String scope, String action) {
+        DelegateExecution execution = new DelegateExecutionFake();
+        execution.setVariable(PROCESS_KEY, TEST_PROCESS_KEY);
+        execution.setVariable(PNF_CORRELATION_ID, TEST_PNF_CORRELATION_ID);
+        execution.setVariable(MODEL_UUID, TEST_MODEL_UUID);
+        execution.setVariable(SERVICE_INSTANCE_ID, TEST_SERVICE_INSTANCE_ID);
+        execution.setVariable(MSO_REQUEST_ID, TEST_MSO_REQUEST_ID);
+        execution.setVariable(PNF_UUID, TEST_PNF_UUID);
+        execution.setVariable(PRC_INSTANCE_NAME, TEST_PNF_RESOURCE_INSTANCE_NAME);
+        execution.setVariable(PRC_CUSTOMIZATION_UUID, TEST_PNF_RESOURCE_CUSTOMIZATION_UUID);
+        execution.setVariable(PRC_TARGET_SOFTWARE_VERSION, TEST_SOFTWARE_VERSION);
+        execution.setVariable(PRC_BLUEPRINT_NAME, TEST_PNF_RESOURCE_BLUEPRINT_NAME);
+        execution.setVariable(PRC_BLUEPRINT_VERSION, TEST_PNF_RESOURCE_BLUEPRINT_VERSION);
+        execution.setVariable(SCOPE, scope);
+        execution.setVariable(ACTION, action);
+        execution.setVariable("mode", "async");
+        return execution;
+    }
+}
diff --git a/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/cds/PnfCDSRequestProviderTest.java b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/cds/PnfCDSRequestProviderTest.java
new file mode 100644
index 0000000..e5cbc9a
--- /dev/null
+++ b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/cds/PnfCDSRequestProviderTest.java
@@ -0,0 +1,139 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2020 Nordix
+ *  ================================================================================
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ *  SPDX-License-Identifier: Apache-2.0
+ *  ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.client.cds;
+
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.gson.JsonParser;
+import org.camunda.bpm.engine.delegate.DelegateExecution;
+import org.camunda.bpm.extension.mockito.delegate.DelegateExecutionFake;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.junit.MockitoJUnitRunner;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+@RunWith(MockitoJUnitRunner.Silent.class)
+public class PnfCDSRequestProviderTest {
+
+    @InjectMocks
+    private PnfCDSRequestProvider pnfCDSRequestProvider;
+
+    private static final String DOWNLOAD_ACTION = "downloadNeSw";
+    private static final String ACTIVATE_ACTION = "activateNeSw";
+    private static final String TEST_MODEL_UUID = "6bc0b04d-1873-4721-b53d-6615225b2a28";
+    private static final String TEST_SERVICE_INSTANCE_ID = "test_service_id";
+    private static final String TEST_PROCESS_KEY = "processKey1";
+    private static final String TEST_PNF_RESOURCE_INSTANCE_NAME = "PNF_demo_resource";
+    private static final String TEST_PNF_CORRELATION_ID = "PNFDemo";
+    private static final String TEST_PNF_RESOURCE_CUSTOMIZATION_UUID = "9acb3a83-8a52-412c-9a45-901764938144";
+    private static final String TEST_MSO_REQUEST_ID = "ff874603-4222-11e7-9252-005056850d2e";
+    private static final String TEST_PNF_UUID = "5df8b6de-2083-11e7-93ae-92361f002671";
+    private static final String TEST_SOFTWARE_VERSION = "demo-sw-ver2.0.0";
+    private static final String PNF_CORRELATION_ID = "pnfCorrelationId";
+    private static final String PNF_UUID = "pnfUuid";
+    private static final String SERVICE_INSTANCE_ID = "serviceInstanceId";
+    private static final String MSO_REQUEST_ID = "msoRequestId";
+    private static final String MODEL_UUID = "modelUuid";
+    private static final String PRC_CUSTOMIZATION_UUID = "PRC_customizationUuid";
+    private static final String PRC_INSTANCE_NAME = "PRC_instanceName";
+    private static final String PRC_TARGET_SOFTWARE_VERSION = "targetSoftwareVersion";
+    private static final String SCOPE = "scope";
+    private static final String ACTION = "action";
+    private static final String PROCESS_KEY = "testProcessKey";
+    private static final String PRC_BLUEPRINT_NAME = "PRC_blueprintName";
+    private static final String PRC_BLUEPRINT_VERSION = "PRC_blueprintVersion";
+    private static final String TEST_PNF_RESOURCE_BLUEPRINT_NAME = "blueprintOnap";
+    private static final String TEST_PNF_RESOURCE_BLUEPRINT_VERSION = "1.0.1";
+
+    @Test
+    public void testBuildRequestPayloadDownloadActionPnf() {
+        try {
+            runTest(DOWNLOAD_ACTION);
+        } catch (Exception e) {
+            Assert.fail(e.getMessage());
+        }
+    }
+
+    @Test
+    public void testBuildRequestPayloadActivateActionPnf() {
+        try {
+            runTest(ACTIVATE_ACTION);
+        } catch (Exception e) {
+            Assert.fail(e.getMessage());
+        }
+    }
+
+    private void runTest(String action) throws Exception {
+        // given
+        DelegateExecution execution = prepareDelegateExecutionObj(PayloadConstants.PNF_SCOPE, action);
+
+        // when
+        pnfCDSRequestProvider.setExecutionObject(execution);
+        String payload = pnfCDSRequestProvider.buildRequestPayload(action).get();
+        System.out.println(payload);
+
+        // verify
+        ObjectMapper mapper = new ObjectMapper();
+        JsonNode payloadJson = mapper.readTree(payload);
+        JsonNode requestNode = payloadJson.findValue(action + "-request");
+        JsonNode propertiesNode = payloadJson.findValue(action + "-properties");
+
+        assertNotNull(payload);
+        assertTrue(verfiyJsonFromString(payload));
+        assertThat(requestNode.get("resolution-key").asText()).isEqualTo(TEST_PNF_CORRELATION_ID);
+        assertThat(propertiesNode.get("service-instance-id").asText()).isEqualTo(TEST_SERVICE_INSTANCE_ID);
+        assertThat(propertiesNode.get("service-model-uuid").asText()).isEqualTo(TEST_MODEL_UUID);
+        assertThat(propertiesNode.get("pnf-id").asText()).isEqualTo(TEST_PNF_UUID);
+        assertThat(propertiesNode.get("pnf-customization-uuid").asText())
+                .isEqualTo(TEST_PNF_RESOURCE_CUSTOMIZATION_UUID);
+        assertThat(propertiesNode.get("target-software-version").asText()).isEqualTo(TEST_SOFTWARE_VERSION);
+        assertThat(pnfCDSRequestProvider.getBlueprintName().equals(TEST_PNF_RESOURCE_BLUEPRINT_NAME));
+        assertThat(pnfCDSRequestProvider.getBlueprintVersion().equals(TEST_PNF_RESOURCE_BLUEPRINT_VERSION));
+    }
+
+    private DelegateExecution prepareDelegateExecutionObj(String scope, String action) {
+        DelegateExecution execution = new DelegateExecutionFake();
+        execution.setVariable(PROCESS_KEY, TEST_PROCESS_KEY);
+        execution.setVariable(PNF_CORRELATION_ID, TEST_PNF_CORRELATION_ID);
+        execution.setVariable(MODEL_UUID, TEST_MODEL_UUID);
+        execution.setVariable(SERVICE_INSTANCE_ID, TEST_SERVICE_INSTANCE_ID);
+        execution.setVariable(MSO_REQUEST_ID, TEST_MSO_REQUEST_ID);
+        execution.setVariable(PNF_UUID, TEST_PNF_UUID);
+        execution.setVariable(PRC_INSTANCE_NAME, TEST_PNF_RESOURCE_INSTANCE_NAME);
+        execution.setVariable(PRC_CUSTOMIZATION_UUID, TEST_PNF_RESOURCE_CUSTOMIZATION_UUID);
+        execution.setVariable(PRC_TARGET_SOFTWARE_VERSION, TEST_SOFTWARE_VERSION);
+        execution.setVariable(SCOPE, scope);
+        execution.setVariable(ACTION, action);
+        execution.setVariable(PRC_BLUEPRINT_NAME, TEST_PNF_RESOURCE_BLUEPRINT_NAME);
+        execution.setVariable(PRC_BLUEPRINT_VERSION, TEST_PNF_RESOURCE_BLUEPRINT_VERSION);
+        return execution;
+    }
+
+    private boolean verfiyJsonFromString(String payload) {
+        JsonParser parser = new JsonParser();
+        return parser.parse(payload).isJsonObject();
+    }
+
+}
diff --git a/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/cds/ServiceCDSRequestProviderTest.java b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/cds/ServiceCDSRequestProviderTest.java
new file mode 100644
index 0000000..70ce3a1
--- /dev/null
+++ b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/cds/ServiceCDSRequestProviderTest.java
@@ -0,0 +1,62 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2020 Nordix
+ *  ================================================================================
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ *  SPDX-License-Identifier: Apache-2.0
+ *  ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.client.cds;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance;
+import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.*;
+
+public class ServiceCDSRequestProviderTest extends AbstractVnfCDSRequestProviderTest {
+
+    @InjectMocks
+    private ServiceCDSRequestProvider serviceCDSRequestProvider;
+
+    @Test
+    public void testRequestPayloadForCreateService() throws Exception {
+        // given
+        setScopeAndAction(SERVICE_SCOPE, SERVICE_ACTION);
+        ServiceInstance instance = createServiceInstance();
+        doReturn(instance).when(extractPojosForBB).extractByKey(buildingBlockExecution,
+                ResourceKey.SERVICE_INSTANCE_ID);
+
+        // when
+        serviceCDSRequestProvider.setExecutionObject(buildingBlockExecution);
+        String payload = serviceCDSRequestProvider.buildRequestPayload(SERVICE_ACTION).get();
+
+        // verify
+        ObjectMapper mapper = new ObjectMapper();
+        JsonNode payloadJson = mapper.readTree(payload);
+        JsonNode requestNode = payloadJson.findValue("create-request");
+        JsonNode propertiesNode = payloadJson.findValue("create-properties");
+
+        assertNotNull(payload);
+        assertTrue(verfiyJsonFromString(payload));
+        assertThat(requestNode.get("resolution-key").asText()).isEqualTo(SERVICE_INSTANCE_NAME);
+        assertThat(propertiesNode.get("service-instance-id").asText()).isEqualTo(SERVICE_INSTANCE_ID);
+        assertThat(propertiesNode.get("service-model-uuid").asText()).isEqualTo(SERVICE_MODEL_UUID);
+    }
+}
diff --git a/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/cds/VfModuleCDSRequestProviderTest.java b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/cds/VfModuleCDSRequestProviderTest.java
new file mode 100644
index 0000000..2ca09d9
--- /dev/null
+++ b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/cds/VfModuleCDSRequestProviderTest.java
@@ -0,0 +1,80 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2020 Nordix
+ *  ================================================================================
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ *  SPDX-License-Identifier: Apache-2.0
+ *  ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.client.cds;
+
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance;
+import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.*;
+
+public class VfModuleCDSRequestProviderTest extends AbstractVnfCDSRequestProviderTest {
+
+    @InjectMocks
+    private VfModuleCDSRequestProvider vfModuleCDSRequestProvider;
+
+    @Mock
+    protected ConfigureInstanceParamsForVfModule configureInstanceParamsForVfModule;
+
+    @Test
+    public void testRequestPayloadForConfigDeployVfModule() throws Exception {
+        // given
+        setScopeAndAction(VF_SCOPE, DEPLOY_ACTION);
+        ServiceInstance serviceInstance = createServiceInstance();
+
+        doReturn(serviceInstance).when(extractPojosForBB).extractByKey(buildingBlockExecution,
+                ResourceKey.SERVICE_INSTANCE_ID);
+        doReturn(createGenericVnf()).when(extractPojosForBB).extractByKey(buildingBlockExecution,
+                ResourceKey.GENERIC_VNF_ID);
+        doReturn(createVfModule()).when(extractPojosForBB).extractByKey(buildingBlockExecution,
+                ResourceKey.VF_MODULE_ID);
+        doNothing().when(configureInstanceParamsForVfModule).populateInstanceParams(any(), any(), anyString(),
+                anyString());
+
+        // when
+        vfModuleCDSRequestProvider.setExecutionObject(buildingBlockExecution);
+        String payload = vfModuleCDSRequestProvider.buildRequestPayload(DEPLOY_ACTION).get();
+
+        // verify
+        ObjectMapper mapper = new ObjectMapper();
+        JsonNode payloadJson = mapper.readTree(payload);
+        JsonNode requestNode = payloadJson.findValue("configDeploy-request");
+        JsonNode propertiesNode = payloadJson.findValue("configDeploy-properties");
+
+        assertNotNull(payload);
+        assertTrue(verfiyJsonFromString(payload));
+        assertThat(requestNode.get("resolution-key").asText()).isEqualTo(VF_MODULE_NAME);
+        assertThat(propertiesNode.get("service-instance-id").asText()).isEqualTo(SERVICE_INSTANCE_ID);
+        assertThat(propertiesNode.get("vf-module-id").asText()).isEqualTo(VF_MODULE_ID);
+        assertThat(propertiesNode.get("vf-module-name").asText()).isEqualTo(VF_MODULE_NAME);
+        assertThat(propertiesNode.get("vf-module-customization-uuid").asText()).isEqualTo(VF_MODULE_CUSTOMIZATION_UUID);
+        assertThat(propertiesNode.get("service-model-uuid").asText()).isEqualTo(SERVICE_MODEL_UUID);
+        assertThat(propertiesNode.get("vnf-id").asText()).isEqualTo(GENERIC_VNF_ID);
+    }
+
+
+}
diff --git a/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/cds/VnfCDSRequestProviderTest.java b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/cds/VnfCDSRequestProviderTest.java
new file mode 100644
index 0000000..7aafd90
--- /dev/null
+++ b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/cds/VnfCDSRequestProviderTest.java
@@ -0,0 +1,104 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2020 Nordix
+ *  ================================================================================
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ *  SPDX-License-Identifier: Apache-2.0
+ *  ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.client.cds;
+
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance;
+import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.*;
+
+public class VnfCDSRequestProviderTest extends AbstractVnfCDSRequestProviderTest {
+
+    @InjectMocks
+    private VnfCDSRequestProvider vnfCDSRequestProvider;
+
+    @Mock
+    protected ConfigureInstanceParamsForVnf configureInstanceParamsForVnf;
+
+    @Test
+    public void testBuildRequestPayloadAssignActionVnf() throws Exception {
+        // given
+        setScopeAndAction(VNF_SCOPE, ASSIGN_ACTION);
+        ServiceInstance instance = createServiceInstance();
+
+        doReturn(instance).when(extractPojosForBB).extractByKey(buildingBlockExecution,
+                ResourceKey.SERVICE_INSTANCE_ID);
+        doReturn(createGenericVnf()).when(extractPojosForBB).extractByKey(buildingBlockExecution,
+                ResourceKey.GENERIC_VNF_ID);
+        doNothing().when(configureInstanceParamsForVnf).populateInstanceParams(any(), any(), anyString());
+
+        // when
+        vnfCDSRequestProvider.setExecutionObject(buildingBlockExecution);
+        String payload = vnfCDSRequestProvider.buildRequestPayload(ASSIGN_ACTION).get();
+
+        // verify
+        ObjectMapper mapper = new ObjectMapper();
+        JsonNode payloadJson = mapper.readTree(payload);
+        JsonNode requestNode = payloadJson.findValue("configAssign-request");
+        JsonNode propertiesNode = payloadJson.findValue("configAssign-properties");
+
+        assertNotNull(payload);
+        assertTrue(verfiyJsonFromString(payload));
+        assertThat(requestNode.get("resolution-key").asText()).isEqualTo(GENERIC_VNF_NAME);
+        assertThat(propertiesNode.get("service-instance-id").asText()).isEqualTo(SERVICE_INSTANCE_ID);
+        assertThat(propertiesNode.get("service-model-uuid").asText()).isEqualTo(SERVICE_MODEL_UUID);
+        assertThat(propertiesNode.get("vnf-id").asText()).isEqualTo(GENERIC_VNF_ID);
+        assertThat(propertiesNode.get("vnf-customization-uuid").asText()).isEqualTo(VNF_MODEL_CUSTOMIZATION_UUID);
+    }
+
+    @Test
+    public void testBuildRequestPayloadDeployActionVnf() throws Exception {
+        // given
+        setScopeAndAction(VNF_SCOPE, DEPLOY_ACTION);
+        ServiceInstance instance = createServiceInstance();
+
+        doReturn(instance).when(extractPojosForBB).extractByKey(buildingBlockExecution,
+                ResourceKey.SERVICE_INSTANCE_ID);
+        doReturn(createGenericVnf()).when(extractPojosForBB).extractByKey(buildingBlockExecution,
+                ResourceKey.GENERIC_VNF_ID);
+        doNothing().when(configureInstanceParamsForVnf).populateInstanceParams(any(), any(), any());
+
+        // when
+        vnfCDSRequestProvider.setExecutionObject(buildingBlockExecution);
+        String payload = vnfCDSRequestProvider.buildRequestPayload(DEPLOY_ACTION).get();
+
+        // verify
+        ObjectMapper mapper = new ObjectMapper();
+        JsonNode payloadJson = mapper.readTree(payload);
+        JsonNode requestNode = payloadJson.findValue("configDeploy-request");
+        JsonNode propertiesNode = payloadJson.findValue("configDeploy-properties");
+
+        assertNotNull(payload);
+        assertTrue(verfiyJsonFromString(payload));
+        assertThat(requestNode.get("resolution-key").asText()).isEqualTo(GENERIC_VNF_NAME);
+        assertThat(propertiesNode.get("service-instance-id").asText()).isEqualTo(SERVICE_INSTANCE_ID);
+        assertThat(propertiesNode.get("service-model-uuid").asText()).isEqualTo(SERVICE_MODEL_UUID);
+        assertThat(propertiesNode.get("vnf-id").asText()).isEqualTo(GENERIC_VNF_ID);
+        assertThat(propertiesNode.get("vnf-customization-uuid").asText()).isEqualTo(VNF_MODEL_CUSTOMIZATION_UUID);
+    }
+}
diff --git a/bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/ControllerExecutionBB.bpmn b/bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/ControllerExecutionBB.bpmn
new file mode 100644
index 0000000..32d3bce
--- /dev/null
+++ b/bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/ControllerExecutionBB.bpmn
@@ -0,0 +1,241 @@
+<?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:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="Definitions_1ahlzqg" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="1.14.0">
+  <bpmn:process id="ControllerExecution" name="ControllerExecutionBB" isExecutable="true">
+    <bpmn:startEvent id="StartEvent_1">
+      <bpmn:outgoing>SequenceFlow_0gmfit3</bpmn:outgoing>
+    </bpmn:startEvent>
+    <bpmn:sequenceFlow id="SequenceFlow_0gmfit3" sourceRef="StartEvent_1" targetRef="ServiceTask_0inxg9l" />
+    <bpmn:endEvent id="EndEvent_0lgvk82">
+      <bpmn:incoming>SequenceFlow_1mkhog2</bpmn:incoming>
+      <bpmn:incoming>SequenceFlow_0no1qag</bpmn:incoming>
+    </bpmn:endEvent>
+    <bpmn:sequenceFlow id="SequenceFlow_1mkhog2" sourceRef="Task_1hs1mn0" targetRef="EndEvent_0lgvk82" />
+    <bpmn:callActivity id="CallActivity_1gfzi2g" name="Abstract CDS&#10;(CDS Call)&#10;" calledElement="AbstractCDSProcessingBB">
+      <bpmn:extensionElements>
+        <camunda:out source="WorkflowException" target="WorkflowException" />
+        <camunda:out source="CDSStatus" target="CDSStatus" />
+        <camunda:in source="executionObject" target="executionObject" />
+      </bpmn:extensionElements>
+      <bpmn:incoming>SequenceFlow_05qembo</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_0cvsnuu</bpmn:outgoing>
+    </bpmn:callActivity>
+    <bpmn:serviceTask id="Task_1hs1mn0" name="Update AAI" camunda:expression="${AAIUpdateTasks.updateOrchestrationStatus(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)),InjectExecution.execute(execution, execution.getVariable(&#34;scope&#34;)),InjectExecution.execute(execution, execution.getVariable(&#34;action&#34;)))}">
+      <bpmn:incoming>SequenceFlow_07tqu82</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_1mkhog2</bpmn:outgoing>
+    </bpmn:serviceTask>
+    <bpmn:sequenceFlow id="SequenceFlow_05qembo" sourceRef="Task_0bhf6tp" targetRef="CallActivity_1gfzi2g" />
+    <bpmn:serviceTask id="Task_0bhf6tp" name="PreProcess Abstract CDS Processing" camunda:expression="${GenericCDSProcessing.buildPayloadBasedOnScopeAndAction(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
+      <bpmn:incoming>SequenceFlow_0vzx2yr</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_05qembo</bpmn:outgoing>
+    </bpmn:serviceTask>
+    <bpmn:exclusiveGateway id="ExclusiveGateway_13q340y" default="SequenceFlow_15gxql1">
+      <bpmn:incoming>SequenceFlow_0cvsnuu</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_07tqu82</bpmn:outgoing>
+      <bpmn:outgoing>SequenceFlow_15gxql1</bpmn:outgoing>
+    </bpmn:exclusiveGateway>
+    <bpmn:sequenceFlow id="SequenceFlow_0cvsnuu" sourceRef="CallActivity_1gfzi2g" targetRef="ExclusiveGateway_13q340y" />
+    <bpmn:sequenceFlow id="SequenceFlow_07tqu82" name="success" sourceRef="ExclusiveGateway_13q340y" targetRef="Task_1hs1mn0">
+      <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">#{execution.getVariable("CDSStatus").equals("Success")}</bpmn:conditionExpression>
+    </bpmn:sequenceFlow>
+    <bpmn:endEvent id="EndEvent_0mnaj50">
+      <bpmn:incoming>SequenceFlow_15gxql1</bpmn:incoming>
+      <bpmn:errorEventDefinition id="ErrorEventDefinition_1s1hqgm" errorRef="Error_0aovtfv" />
+    </bpmn:endEvent>
+    <bpmn:sequenceFlow id="SequenceFlow_15gxql1" sourceRef="ExclusiveGateway_13q340y" targetRef="EndEvent_0mnaj50" />
+    <bpmn:serviceTask id="ServiceTask_0inxg9l" name="Set Actor, Scope and Action Params" camunda:expression="${ControllerExecution.setControllerActorScopeAction(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
+      <bpmn:incoming>SequenceFlow_0gmfit3</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_05j6hg6</bpmn:outgoing>
+      <bpmn:outgoing>SequenceFlow_1lspfyy</bpmn:outgoing>
+    </bpmn:serviceTask>
+    <bpmn:sequenceFlow id="SequenceFlow_05j6hg6" sourceRef="ServiceTask_0inxg9l" targetRef="ExclusiveGateway_0plxwkg" />
+    <bpmn:exclusiveGateway id="ExclusiveGateway_0plxwkg" default="SequenceFlow_1t7hs4k">
+      <bpmn:incoming>SequenceFlow_1lspfyy</bpmn:incoming>
+      <bpmn:incoming>SequenceFlow_05j6hg6</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_1t7hs4k</bpmn:outgoing>
+      <bpmn:outgoing>SequenceFlow_0vzx2yr</bpmn:outgoing>
+    </bpmn:exclusiveGateway>
+    <bpmn:sequenceFlow id="SequenceFlow_1lspfyy" sourceRef="ServiceTask_0inxg9l" targetRef="ExclusiveGateway_0plxwkg" />
+    <bpmn:callActivity id="BBToExecute" name="BB to Execute&#10;" calledElement="${bbName}">
+      <bpmn:extensionElements>
+        <camunda:out source="WorkflowException" target="WorkflowException" />
+        <camunda:out source="WorkflowExceptionErrorMessage" target="WorkflowExceptionErrorMessage" />
+        <camunda:in source="executionObject" target="executionObject" />
+        <camunda:in source="mso-request-id" target="mso-request-id" />
+        <camunda:in source="isRollback" target="isRollback" />
+        <camunda:out source="StatusMessage" target="StatusMessage" />
+      </bpmn:extensionElements>
+      <bpmn:incoming>SequenceFlow_0fv03vt</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_0no1qag</bpmn:outgoing>
+      <bpmn:outgoing>SequenceFlow_0op5irz</bpmn:outgoing>
+    </bpmn:callActivity>
+    <bpmn:sequenceFlow id="SequenceFlow_1t7hs4k" sourceRef="ExclusiveGateway_0plxwkg" targetRef="Task_1rc2j9" />
+    <bpmn:sequenceFlow id="SequenceFlow_0no1qag" sourceRef="BBToExecute" targetRef="EndEvent_0lgvk82" />
+    <bpmn:sequenceFlow id="SequenceFlow_0fv03vt" sourceRef="Task_1rc2j9" targetRef="BBToExecute" />
+    <bpmn:serviceTask id="Task_1rc2j9" name="select BB " camunda:expression="${ControllerExecution.selectBB(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
+      <bpmn:incoming>SequenceFlow_1t7hs4k</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_0fv03vt</bpmn:outgoing>
+    </bpmn:serviceTask>
+    <bpmn:endEvent id="EndEvent_1lxwuh2">
+      <bpmn:incoming>SequenceFlow_0op5irz</bpmn:incoming>
+      <bpmn:errorEventDefinition id="ErrorEventDefinition_0z001cu" errorRef="Error_0aovtfv" />
+    </bpmn:endEvent>
+    <bpmn:sequenceFlow id="SequenceFlow_0op5irz" sourceRef="BBToExecute" targetRef="EndEvent_1lxwuh2" />
+    <bpmn:sequenceFlow id="SequenceFlow_0vzx2yr" name="Actor= CDS" sourceRef="ExclusiveGateway_0plxwkg" targetRef="Task_0bhf6tp">
+      <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">${execution.getVariable("controller_actor") == "CDS"}</bpmn:conditionExpression>
+    </bpmn:sequenceFlow>
+  </bpmn:process>
+  <bpmn:error id="Error_0aovtfv" name="MSOWorkflowException" errorCode="MSOWorkflowException" />
+  <bpmndi:BPMNDiagram id="BPMNDiagram_1">
+    <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="ControllerExecution">
+      <bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
+        <dc:Bounds x="160" y="323" width="36" height="36" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="-17" y="279" width="90" height="20" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_0gmfit3_di" bpmnElement="SequenceFlow_0gmfit3">
+        <di:waypoint x="196" y="341" />
+        <di:waypoint x="259" y="341" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="32.5" y="236" width="90" height="20" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="EndEvent_0lgvk82_di" bpmnElement="EndEvent_0lgvk82">
+        <dc:Bounds x="1129" y="323" width="36" height="36" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="1025" y="251" width="90" height="20" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_1mkhog2_di" bpmnElement="SequenceFlow_1mkhog2">
+        <di:waypoint x="1079" y="462" />
+        <di:waypoint x="1147" y="462" />
+        <di:waypoint x="1147" y="359" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="918" y="357" width="90" height="20" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="CallActivity_1gfzi2g_di" bpmnElement="CallActivity_1gfzi2g">
+        <dc:Bounds x="725" y="422" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ServiceTask_0404s6a_di" bpmnElement="Task_1hs1mn0">
+        <dc:Bounds x="979" y="422" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_05qembo_di" bpmnElement="SequenceFlow_05qembo">
+        <di:waypoint x="672" y="462" />
+        <di:waypoint x="725" y="462" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="503.5" y="357" width="90" height="20" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="ServiceTask_01mv1si_di" bpmnElement="Task_0bhf6tp">
+        <dc:Bounds x="572" y="422" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ExclusiveGateway_13q340y_di" bpmnElement="ExclusiveGateway_13q340y" isMarkerVisible="true">
+        <dc:Bounds x="868" y="437" width="50" height="50" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="698" y="327" width="90" height="20" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_0cvsnuu_di" bpmnElement="SequenceFlow_0cvsnuu">
+        <di:waypoint x="825" y="462" />
+        <di:waypoint x="868" y="462" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="651.5" y="357" width="90" height="20" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_07tqu82_di" bpmnElement="SequenceFlow_07tqu82">
+        <di:waypoint x="918" y="462" />
+        <di:waypoint x="979" y="462" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="856" y="409" width="41" height="14" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="EndEvent_0mnaj50_di" bpmnElement="EndEvent_0mnaj50">
+        <dc:Bounds x="875" y="565" width="36" height="36" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="698" y="531" width="90" height="20" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_15gxql1_di" bpmnElement="SequenceFlow_15gxql1">
+        <di:waypoint x="893" y="487" />
+        <di:waypoint x="893" y="565" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="713" y="436" width="90" height="20" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="ServiceTask_0inxg9l_di" bpmnElement="ServiceTask_0inxg9l">
+        <dc:Bounds x="259" y="301" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_05j6hg6_di" bpmnElement="SequenceFlow_05j6hg6">
+        <di:waypoint x="359" y="341" />
+        <di:waypoint x="399" y="341" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="184" y="240" width="90" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="ExclusiveGateway_0plxwkg_di" bpmnElement="ExclusiveGateway_0plxwkg" isMarkerVisible="true">
+        <dc:Bounds x="399" y="316" width="50" height="50" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="309" y="255" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_1lspfyy_di" bpmnElement="SequenceFlow_1lspfyy">
+        <di:waypoint x="359" y="341" />
+        <di:waypoint x="399" y="341" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="229" y="240" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="CallActivity_01dem38_di" bpmnElement="BBToExecute">
+        <dc:Bounds x="824" y="168" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_1t7hs4k_di" bpmnElement="SequenceFlow_1t7hs4k">
+        <di:waypoint x="424" y="316" />
+        <di:waypoint x="424" y="208" />
+        <di:waypoint x="572" y="208" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="271" y="89" width="83" height="36" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_0no1qag_di" bpmnElement="SequenceFlow_0no1qag">
+        <di:waypoint x="924" y="208" />
+        <di:waypoint x="1147" y="208" />
+        <di:waypoint x="1147" y="323" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="840.5" y="107" width="90" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_0fv03vt_di" bpmnElement="SequenceFlow_0fv03vt">
+        <di:waypoint x="672" y="208" />
+        <di:waypoint x="824" y="208" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="598" y="107" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="ServiceTask_0qd9p4w_di" bpmnElement="Task_1rc2j9">
+        <dc:Bounds x="572" y="168" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="EndEvent_1lxwuh2_di" bpmnElement="EndEvent_1lxwuh2">
+        <dc:Bounds x="856" y="84" width="36" height="36" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="679" y="50" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_0op5irz_di" bpmnElement="SequenceFlow_0op5irz">
+        <di:waypoint x="874" y="168" />
+        <di:waypoint x="874" y="120" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="739" y="58" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_0vzx2yr_di" bpmnElement="SequenceFlow_0vzx2yr">
+        <di:waypoint x="424" y="366" />
+        <di:waypoint x="424" y="462" />
+        <di:waypoint x="572" y="462" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="455" y="436" width="60" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+    </bpmndi:BPMNPlane>
+  </bpmndi:BPMNDiagram>
+</bpmn:definitions>
\ No newline at end of file
diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/java/org/onap/so/bpmn/infrastructure/aai/groovyflows/AAIDeleteServiceInstance.java b/bpmn/so-bpmn-infrastructure-common/src/main/java/org/onap/so/bpmn/infrastructure/aai/groovyflows/AAIDeleteServiceInstance.java
index fb95ae3..11707c4 100644
--- a/bpmn/so-bpmn-infrastructure-common/src/main/java/org/onap/so/bpmn/infrastructure/aai/groovyflows/AAIDeleteServiceInstance.java
+++ b/bpmn/so-bpmn-infrastructure-common/src/main/java/org/onap/so/bpmn/infrastructure/aai/groovyflows/AAIDeleteServiceInstance.java
@@ -7,9 +7,9 @@
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -27,9 +27,15 @@
 import org.onap.so.client.aai.AAIResourcesClient;
 import org.onap.so.client.aai.entities.uri.AAIResourceUri;
 import org.onap.so.client.aai.entities.uri.AAIUriFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class AAIDeleteServiceInstance implements JavaDelegate {
 
+    private static final Logger logger = LoggerFactory.getLogger(AAIDeleteServiceInstance.class);
+    private static final String ERROR_MESSAGE =
+            "Exception in Delete Serivce Instance. Service Instance could not be deleted in AAI.";
+
     ExceptionUtil exceptionUtil = new ExceptionUtil();
 
     public void execute(DelegateExecution execution) throws Exception {
@@ -41,8 +47,8 @@
             aaiRC.delete(serviceInstanceURI);
             execution.setVariable("GENDS_SuccessIndicator", true);
         } catch (Exception ex) {
-            String msg = "Exception in Delete Serivce Instance. Service Instance could not be deleted in AAI."
-                    + ex.getMessage();
+            logger.debug(ERROR_MESSAGE, ex);
+            String msg = ERROR_MESSAGE + ex.getMessage();
             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg);
         }
 
diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/java/org/onap/so/bpmn/infrastructure/aai/groovyflows/AAIServiceInstance.java b/bpmn/so-bpmn-infrastructure-common/src/main/java/org/onap/so/bpmn/infrastructure/aai/groovyflows/AAIServiceInstance.java
index 2d69351..f7b0c66 100644
--- a/bpmn/so-bpmn-infrastructure-common/src/main/java/org/onap/so/bpmn/infrastructure/aai/groovyflows/AAIServiceInstance.java
+++ b/bpmn/so-bpmn-infrastructure-common/src/main/java/org/onap/so/bpmn/infrastructure/aai/groovyflows/AAIServiceInstance.java
@@ -7,9 +7,9 @@
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -30,17 +30,70 @@
     String environmentContext;
     String workloadContext;
 
-    public AAIServiceInstance(String serviceInstanceName, String serviceType, String serviceRole,
-            String orchestrationStatus, String modelInvariantUuid, String modelVersionId, String environmentContext,
-            String workloadContext) {
-        this.serviceInstanceName = serviceInstanceName;
-        this.serviceType = serviceType;
-        this.serviceRole = serviceRole;
-        this.orchestrationStatus = orchestrationStatus;
-        this.modelInvariantUuid = modelInvariantUuid;
-        this.modelVersionId = modelVersionId;
-        this.environmentContext = environmentContext;
-        this.workloadContext = workloadContext;
+    public class AAIServiceInstanceBuilder {
+        private String serviceInstanceName;
+        private String serviceType;
+        private String serviceRole;
+        private String orchestrationStatus;
+        private String modelInvariantUuid;
+        private String modelVersionId;
+        private String environmentContext;
+        private String workloadContext;
+
+        public AAIServiceInstanceBuilder setServiceInstanceName(String serviceInstanceName) {
+            this.serviceInstanceName = serviceInstanceName;
+            return this;
+        }
+
+        public AAIServiceInstanceBuilder setServiceType(String serviceType) {
+            this.serviceType = serviceType;
+            return this;
+        }
+
+        public AAIServiceInstanceBuilder setServiceRole(String serviceRole) {
+            this.serviceRole = serviceRole;
+            return this;
+        }
+
+        public AAIServiceInstanceBuilder setOrchestrationStatus(String orchestrationStatus) {
+            this.orchestrationStatus = orchestrationStatus;
+            return this;
+        }
+
+        public AAIServiceInstanceBuilder setModelInvariantUuid(String modelInvariantUuid) {
+            this.modelInvariantUuid = modelInvariantUuid;
+            return this;
+        }
+
+        public AAIServiceInstanceBuilder setModelVersionId(String modelVersionId) {
+            this.modelVersionId = modelVersionId;
+            return this;
+        }
+
+        public AAIServiceInstanceBuilder setEnvironmentContext(String environmentContext) {
+            this.environmentContext = environmentContext;
+            return this;
+        }
+
+        public AAIServiceInstanceBuilder setWorkloadContext(String workloadContext) {
+            this.workloadContext = workloadContext;
+            return this;
+        }
+
+        public AAIServiceInstance createAAIServiceInstance() {
+            return new AAIServiceInstance(this);
+        }
+    }
+
+    public AAIServiceInstance(AAIServiceInstanceBuilder aaiServiceInstanceBuilder) {
+        this.serviceInstanceName = aaiServiceInstanceBuilder.serviceInstanceName;
+        this.serviceType = aaiServiceInstanceBuilder.serviceType;
+        this.serviceRole = aaiServiceInstanceBuilder.serviceRole;
+        this.orchestrationStatus = aaiServiceInstanceBuilder.orchestrationStatus;
+        this.modelInvariantUuid = aaiServiceInstanceBuilder.modelInvariantUuid;
+        this.modelVersionId = aaiServiceInstanceBuilder.modelVersionId;
+        this.environmentContext = aaiServiceInstanceBuilder.environmentContext;
+        this.workloadContext = aaiServiceInstanceBuilder.workloadContext;
     }
 
     public String getServiceInstanceName() {
diff --git a/bpmn/so-bpmn-infrastructure-flows/src/main/resources/process/ConfigurePnfResource.bpmn b/bpmn/so-bpmn-infrastructure-flows/src/main/resources/process/ConfigurePnfResource.bpmn
index 6d5b2a2..693dd92 100644
--- a/bpmn/so-bpmn-infrastructure-flows/src/main/resources/process/ConfigurePnfResource.bpmn
+++ b/bpmn/so-bpmn-infrastructure-flows/src/main/resources/process/ConfigurePnfResource.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_13i2vsn" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="2.2.4">
+<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_13i2vsn" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="3.3.5">
   <bpmn:process id="ConfigurePnfResource" name="ConfigurePnfResource" isExecutable="true">
     <bpmn:startEvent id="ConfigurePnfResource_StartEvent">
       <bpmn:outgoing>SequenceFlow_069mxkg</bpmn:outgoing>
@@ -57,6 +57,7 @@
         <camunda:inputOutput>
           <camunda:inputParameter name="action">config-assign</camunda:inputParameter>
           <camunda:inputParameter name="scope">pnf</camunda:inputParameter>
+          <camunda:inputParameter name="mode">sync</camunda:inputParameter>
         </camunda:inputOutput>
       </bpmn:extensionElements>
       <bpmn:incoming>SequenceFlow_0j3pm2g</bpmn:incoming>
@@ -68,6 +69,7 @@
         <camunda:inputOutput>
           <camunda:inputParameter name="action">config-deploy</camunda:inputParameter>
           <camunda:inputParameter name="scope">pnf</camunda:inputParameter>
+          <camunda:inputParameter name="mode">async</camunda:inputParameter>
         </camunda:inputOutput>
       </bpmn:extensionElements>
       <bpmn:incoming>SequenceFlow_1owbpsy</bpmn:incoming>
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 4d5494d..8a6c4c2 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
@@ -5,13 +5,14 @@
  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
  * Modifications Copyright (c) 2019 Samsung
+ *  Modifications Copyright (c) 2019 Bell Canada.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -22,39 +23,23 @@
 
 package org.onap.so.bpmn.infrastructure.aai.tasks;
 
-import java.util.List;
-import java.util.Map;
 import org.onap.so.adapters.nwrest.CreateNetworkResponse;
 import org.onap.so.adapters.nwrest.UpdateNetworkResponse;
 import org.onap.so.bpmn.common.BuildingBlockExecution;
-import org.onap.so.bpmn.servicedecomposition.bbobjects.CloudRegion;
-import org.onap.so.bpmn.servicedecomposition.bbobjects.Collection;
-import org.onap.so.bpmn.servicedecomposition.bbobjects.Configuration;
-import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf;
-import org.onap.so.bpmn.servicedecomposition.bbobjects.L3Network;
-import org.onap.so.bpmn.servicedecomposition.bbobjects.Pnf;
-import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance;
-import org.onap.so.bpmn.servicedecomposition.bbobjects.Subnet;
-import org.onap.so.bpmn.servicedecomposition.bbobjects.VfModule;
-import org.onap.so.bpmn.servicedecomposition.bbobjects.VolumeGroup;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.*;
 import org.onap.so.bpmn.servicedecomposition.entities.GeneralBuildingBlock;
 import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey;
 import org.onap.so.bpmn.servicedecomposition.tasks.ExtractPojosForBB;
 import org.onap.so.client.exception.BBObjectNotFoundException;
 import org.onap.so.client.exception.ExceptionBuilder;
-import org.onap.so.client.orchestration.AAICollectionResources;
-import org.onap.so.client.orchestration.AAIConfigurationResources;
-import org.onap.so.client.orchestration.AAINetworkResources;
-import org.onap.so.client.orchestration.AAIPnfResources;
-import org.onap.so.client.orchestration.AAIServiceInstanceResources;
-import org.onap.so.client.orchestration.AAIVfModuleResources;
-import org.onap.so.client.orchestration.AAIVnfResources;
-import org.onap.so.client.orchestration.AAIVolumeGroupResources;
+import org.onap.so.client.orchestration.*;
 import org.onap.so.db.catalog.beans.OrchestrationStatus;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
+import java.util.List;
+import java.util.Map;
 
 @Component
 public class AAIUpdateTasks {
@@ -340,7 +325,6 @@
      * BPMN access method to update status of VfModule to Created in AAI
      *
      * @param execution
-     *
      */
     public void updateOrchestrationStatusCreatedVfModule(BuildingBlockExecution execution) {
         try {
@@ -357,7 +341,6 @@
      * 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);
@@ -794,7 +777,6 @@
             logger.error("Exception occurred in AAIUpdateTasks updateOrchestrationStatusConfigDeployConfigureVnf", ex);
             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex);
         }
-
     }
 
     /**
@@ -806,11 +788,55 @@
         try {
             GenericVnf vnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID);
             aaiVnfResources.updateOrchestrationStatusVnf(vnf, OrchestrationStatus.CONFIGURED);
-
         } catch (Exception ex) {
             logger.error("Exception occurred in AAIUpdateTasks updateOrchestrationStatusConfigDeployConfiguredVnf", ex);
             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex);
         }
+    }
 
+    /**
+     * BPMN access method to update status of VNF/VF-Module based on SO scope and action.
+     *
+     * @param execution - BuildingBlockExecution
+     * @param scope - SO scope (vnf/vfModule)
+     * @param action - action (configAssign/configDeploy/configUndeploy etc..)
+     */
+    public void updateOrchestrationStatusForCds(BuildingBlockExecution execution, String scope, String action) {
+        try {
+            GenericVnf vnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID);
+            OrchestrationStatus status = getOrchestrationStatus(action);
+            switch (scope) {
+                case "vnf":
+                    aaiVnfResources.updateOrchestrationStatusVnf(vnf, status);
+                    break;
+                case "vfModule":
+                    VfModule vfModule = extractPojosForBB.extractByKey(execution, ResourceKey.VF_MODULE_ID);
+                    aaiVfModuleResources.updateOrchestrationStatusVfModule(vfModule, vnf, status);
+                    break;
+                default:
+                    throw new IllegalArgumentException(
+                            "Invalid scope to update orchestration status for CDS : " + action);
+            }
+        } catch (Exception ex) {
+            logger.error("Exception occurred in AAIUpdateTasks updateOrchestrationStatusForCds", ex);
+            exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex);
+        }
+    }
+
+    private OrchestrationStatus getOrchestrationStatus(String action) {
+        /**
+         * At this state, OrcherstationStatus enum associated with configAssign and configDeploy. I am not sure which is
+         * the correct approach. 1. Are we going to map each specific action to OrchestrationStauts ? 2. We will have
+         * only one generic status for all actions ?
+         */
+
+        switch (action) {
+            case "configAssign":
+                return OrchestrationStatus.ASSIGNED;
+            case "configDeploy":
+                return OrchestrationStatus.CONFIGURED;
+            default:
+                throw new IllegalArgumentException("Invalid action to set Orchestration status: " + action);
+        }
     }
 }
diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/vnf/tasks/VnfAdapterCreateTasks.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/vnf/tasks/VnfAdapterCreateTasks.java
index 4285e9a..663b097 100644
--- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/vnf/tasks/VnfAdapterCreateTasks.java
+++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/vnf/tasks/VnfAdapterCreateTasks.java
@@ -121,7 +121,7 @@
             try {
                 volumeGroup = extractPojosForBB.extractByKey(execution, ResourceKey.VOLUME_GROUP_ID);
             } catch (BBObjectNotFoundException bbException) {
-                logger.error("Exception occurred if bb objrct not found in VnfAdapterCreateTasks createVfModule ",
+                logger.error("Exception occurred if bb object not found in VnfAdapterCreateTasks createVfModule ",
                         bbException);
             }
             CloudRegion cloudRegion = gBBInput.getCloudRegion();
diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/appc/tasks/AppcRunTasks.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/appc/tasks/AppcRunTasks.java
index 79ccd92..00d0fdc 100644
--- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/appc/tasks/AppcRunTasks.java
+++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/appc/tasks/AppcRunTasks.java
@@ -6,12 +6,14 @@
  * ================================================================================
  * Modifications Copyright (c) 2019 Samsung
  * ================================================================================
+ * Modifications Copyright (c) 2020 Nokia
+ * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -29,7 +31,6 @@
 import org.onap.so.logger.LoggingAnchor;
 import org.json.JSONArray;
 import org.json.JSONObject;
-import org.onap.aai.domain.yang.Vserver;
 import org.onap.appc.client.lcm.model.Action;
 import org.onap.so.bpmn.common.BuildingBlockExecution;
 import org.onap.so.bpmn.core.json.JsonUtils;
@@ -143,7 +144,7 @@
 
             ControllerSelectionReference controllerSelectionReference = catalogDbClient
                     .getControllerSelectionReferenceByVnfTypeAndActionCategory(vnfType, action.toString());
-            String controllerType = null;
+            String controllerType;
             if (controllerSelectionReference != null) {
                 controllerType = controllerSelectionReference.getControllerName();
             } else {
@@ -191,13 +192,13 @@
         logger.error("Error Message: {}", appcMessage);
         logger.error("ERROR CODE: {}", appcCode);
         logger.trace("End of runAppCommand ");
-        if (appcCode != null && !appcCode.equals("0")) {
+        if (appcCode != null && !"0".equals(appcCode)) {
             exceptionUtil.buildAndThrowWorkflowException(execution, Integer.parseInt(appcCode), appcMessage);
         }
     }
 
     protected void mapRollbackVariables(BuildingBlockExecution execution, Action action, String appcCode) {
-        if (appcCode != null && appcCode.equals("0") && action != null) {
+        if ("0".equals(appcCode) && action != null) {
             if (action.equals(Action.Lock)) {
                 execution.setVariable(ROLLBACK_VNF_LOCK, true);
             } else if (action.equals(Action.Unlock)) {
@@ -216,7 +217,7 @@
 
     private HashMap<String, String> buildPayloadInfo(String vnfName, String aicIdentity, String vnfHostIpAddress,
             String vmIdList, String vserverIdList, String identityUrl, String vfModuleId) {
-        HashMap<String, String> payloadInfo = new HashMap<String, String>();
+        HashMap<String, String> payloadInfo = new HashMap<>();
         payloadInfo.put("vnfName", vnfName);
         payloadInfo.put("aicIdentity", aicIdentity);
         payloadInfo.put("vnfHostIpAddress", vnfHostIpAddress);
@@ -242,44 +243,39 @@
         return payload;
     }
 
-    protected void getVserversForAppc(BuildingBlockExecution execution, GenericVnf vnf) throws Exception {
+    protected void getVserversForAppc(BuildingBlockExecution execution, GenericVnf vnf) throws RuntimeException {
         AAIResultWrapper aaiRW = aaiVnfResources.queryVnfWrapperById(vnf);
 
-        if (aaiRW != null && aaiRW.getRelationships() != null && aaiRW.getRelationships().isPresent()) {
-            Relationships relationships = aaiRW.getRelationships().get();
-            if (relationships != null) {
-                List<AAIResourceUri> vserverUris = relationships.getRelatedAAIUris(AAIObjectType.VSERVER);
-                JSONArray vserverIds = new JSONArray();
-                JSONArray vserverSelfLinks = new JSONArray();
-                if (vserverUris != null) {
-                    for (AAIResourceUri j : vserverUris) {
-                        if (j != null) {
-                            if (j.getURIKeys() != null) {
-                                String vserverId = j.getURIKeys().get("vserver-id");
-                                vserverIds.put(vserverId);
-                            }
-                            Optional<Vserver> oVserver = aaiVnfResources.getVserver(j);
-                            if (oVserver.isPresent()) {
-                                Vserver vserver = oVserver.get();
-                                if (vserver != null) {
-                                    String vserverSelfLink = vserver.getVserverSelflink();
-                                    vserverSelfLinks.put(vserverSelfLink);
-                                }
-                            }
-                        }
+        if (aaiRW == null || aaiRW.getRelationships() == null || !aaiRW.getRelationships().isPresent()) {
+            return;
+        }
+        Relationships relationships = aaiRW.getRelationships().get();
+        List<AAIResourceUri> vserverUris = relationships.getRelatedAAIUris(AAIObjectType.VSERVER);
+        JSONArray vserverIds = new JSONArray();
+        JSONArray vserverSelfLinks = new JSONArray();
+        if (vserverUris != null) {
+            for (AAIResourceUri j : vserverUris) {
+                if (j != null) {
+                    if (j.getURIKeys() != null) {
+                        String vserverId = j.getURIKeys().get("vserver-id");
+                        vserverIds.put(vserverId);
                     }
+                    aaiVnfResources.getVserver(j).ifPresent((vserver) -> {
+                        String vserverSelfLink = vserver.getVserverSelflink();
+                        vserverSelfLinks.put(vserverSelfLink);
+                    });
                 }
-
-                JSONObject vmidsArray = new JSONObject();
-                JSONObject vserveridsArray = new JSONObject();
-                vmidsArray.put("vmIds", vserverSelfLinks.toString());
-                vserveridsArray.put("vserverIds", vserverIds.toString());
-                logger.debug("vmidsArray is: {}", vmidsArray.toString());
-                logger.debug("vserveridsArray is: {}", vserveridsArray.toString());
-
-                execution.setVariable("vmIdList", vmidsArray.toString());
-                execution.setVariable("vserverIdList", vserveridsArray.toString());
             }
         }
+
+        JSONObject vmidsArray = new JSONObject();
+        JSONObject vserveridsArray = new JSONObject();
+        vmidsArray.put("vmIds", vserverSelfLinks.toString());
+        vserveridsArray.put("vserverIds", vserverIds.toString());
+        logger.debug("vmidsArray is: {}", vmidsArray.toString());
+        logger.debug("vserveridsArray is: {}", vserveridsArray.toString());
+
+        execution.setVariable("vmIdList", vmidsArray.toString());
+        execution.setVariable("vserverIdList", vserveridsArray.toString());
     }
 }
diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/decisionpoint/impl/camunda/controller/cds/CdsControllerDE.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/decisionpoint/impl/camunda/controller/cds/PnfConfigCdsControllerDE.java
similarity index 73%
rename from bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/decisionpoint/impl/camunda/controller/cds/CdsControllerDE.java
rename to bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/decisionpoint/impl/camunda/controller/cds/PnfConfigCdsControllerDE.java
index 6b0cbc0..ffd49e6 100644
--- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/decisionpoint/impl/camunda/controller/cds/CdsControllerDE.java
+++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/decisionpoint/impl/camunda/controller/cds/PnfConfigCdsControllerDE.java
@@ -24,6 +24,7 @@
 import org.onap.so.bpmn.infrastructure.decisionpoint.api.ControllerRunnable;
 import org.onap.so.bpmn.infrastructure.decisionpoint.api.controller.ControllerPreparable;
 import org.onap.so.client.cds.AbstractCDSProcessingBBUtils;
+import org.onap.so.client.cds.PayloadConstants;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
@@ -31,14 +32,23 @@
  * This implementation of {@ref ControllerRunnable} is used for Self service, i.e, blueprint based Controller.
  */
 @Component
-public class CdsControllerDE extends AbstractCDSProcessingBBUtils implements ControllerRunnable<DelegateExecution> {
+public class PnfConfigCdsControllerDE implements ControllerRunnable<DelegateExecution> {
+
+    private static final String ASSIGN_ACTION = "config-assign";
+    private static final String DEPLOY_ACTION = "config-deploy";
 
     @Autowired(required = false)
     private List<ControllerPreparable<DelegateExecution>> prepareList;
 
+    @Autowired
+    private AbstractCDSProcessingBBUtils cdsDispatcher;
+
     @Override
     public Boolean understand(ControllerContext<DelegateExecution> context) {
-        return context.getControllerActor().equalsIgnoreCase("cds");
+        return PayloadConstants.CDS_ACTOR.equalsIgnoreCase(context.getControllerActor())
+                && PayloadConstants.PNF_SCOPE.equalsIgnoreCase(context.getControllerScope())
+                && (ASSIGN_ACTION.equalsIgnoreCase(context.getControllerAction())
+                        || DEPLOY_ACTION.equalsIgnoreCase(context.getControllerAction())); // legacy behavior
     }
 
     @Override
@@ -55,7 +65,7 @@
     @Override
     public void run(ControllerContext<DelegateExecution> context) {
         DelegateExecution execution = context.getExecution();
-        constructExecutionServiceInputObject(execution);
-        sendRequestToCDSClient(execution);
+        cdsDispatcher.constructExecutionServiceInputObject(execution);
+        cdsDispatcher.sendRequestToCDSClient(execution);
     }
 }
diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/ControllerExecution.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/ControllerExecution.java
new file mode 100644
index 0000000..86d5600
--- /dev/null
+++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/ControllerExecution.java
@@ -0,0 +1,109 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2019  Tech Mahindra
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.bpmn.infrastructure.flowspecific.tasks;
+
+import java.util.Optional;
+import org.onap.so.bpmn.common.BuildingBlockExecution;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf;
+import org.onap.so.bpmn.servicedecomposition.entities.BuildingBlock;
+import org.onap.so.bpmn.servicedecomposition.entities.ExecuteBuildingBlock;
+import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey;
+import org.onap.so.bpmn.servicedecomposition.tasks.ExtractPojosForBB;
+import org.onap.so.client.exception.ExceptionBuilder;
+import org.onap.so.db.catalog.beans.BBNameSelectionReference;
+import org.onap.so.db.catalog.beans.VnfResourceCustomization;
+import org.onap.so.db.catalog.client.CatalogDbClient;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
+public class ControllerExecution {
+    private static final Logger logger = LoggerFactory.getLogger(ControllerExecution.class);
+    private static final String CONTROLLER_ACTOR = "controllerActor";
+    private static final String BUILDING_BLOCK = "buildingBlock";
+    private static final String SCOPE = "scope";
+    private static final String ACTION = "action";
+    private static final String BBNAME = "bbName";
+    @Autowired
+    private ExceptionBuilder exceptionUtil;
+    @Autowired
+    private CatalogDbClient catalogDbClient;
+    @Autowired
+    private ExtractPojosForBB extractPojosForBB;
+
+    /**
+     * Setting Controller Actor, Scope and Action Variables in BuildingBlockExecution object
+     * 
+     * @param execution - BuildingBlockExecution object
+     */
+    public void setControllerActorScopeAction(BuildingBlockExecution execution) {
+        try {
+            GenericVnf genericVnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID);
+            String modleUuid = genericVnf.getModelInfoGenericVnf().getModelCustomizationUuid();
+            VnfResourceCustomization vnfResourceCustomization =
+                    catalogDbClient.getVnfResourceCustomizationByModelCustomizationUUID(modleUuid);
+
+            // Fetching Controller Actor at VNF level if null then Controller Actor is set as "APPC"
+            String controllerActor = Optional.ofNullable(vnfResourceCustomization.getControllerActor()).orElse("APPC");
+            ExecuteBuildingBlock executeBuildingBlock = execution.getVariable(BUILDING_BLOCK);
+            BuildingBlock buildingBlock = executeBuildingBlock.getBuildingBlock();
+            String scope = Optional.ofNullable(buildingBlock.getBpmnScope()).orElseThrow(
+                    () -> new NullPointerException("BPMN Scope is NULL in the orchestration_flow_reference table "));
+            String action = Optional.ofNullable(buildingBlock.getBpmnAction()).orElseThrow(
+                    () -> new NullPointerException("BPMN Action is NULL in the orchestration_flow_reference table "));
+            execution.setVariable(SCOPE, scope);
+            execution.setVariable(ACTION, action);
+            execution.setVariable(CONTROLLER_ACTOR, controllerActor);
+            logger.debug("Executing Controller Execution for ControllerActor: {}, Scope: {} , Action: {}",
+                    controllerActor, scope, action);
+
+        } catch (Exception ex) {
+            logger.error("An exception occurred while fetching Controller Actor,Scope and Action ", ex);
+            exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex);
+        }
+    }
+
+    /**
+     * Selecting bbName from BBNameSelectionReference and setting the value in a variable of BuildingBlockExecution
+     * 
+     * @param execution - BuildingBlockExecution object
+     */
+    public void selectBB(BuildingBlockExecution execution) {
+        try {
+
+            String controllerActor = execution.getVariable(CONTROLLER_ACTOR);
+            String action = Optional.of((String) execution.getVariable(ACTION)).get();
+            String scope = Optional.of((String) execution.getVariable(SCOPE)).get();
+            BBNameSelectionReference bbNameSelectionReference =
+                    catalogDbClient.getBBNameSelectionReference(controllerActor, scope, action);
+            String bbName = bbNameSelectionReference.getBbName();
+            execution.setVariable(BBNAME, bbName);
+            logger.debug(" Executing {} BPMN", bbName);
+        } catch (Exception ex) {
+            logger.error("An exception occurred while getting bbname from catalogdb ", ex);
+            exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex);
+
+        }
+
+    }
+}
diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/GenericCDSProcessingBB.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/GenericCDSProcessingBB.java
new file mode 100644
index 0000000..f568026
--- /dev/null
+++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/GenericCDSProcessingBB.java
@@ -0,0 +1,92 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2019 Bell Canada
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.bpmn.infrastructure.flowspecific.tasks;
+
+import org.onap.so.bpmn.common.BuildingBlockExecution;
+import org.onap.so.bpmn.infrastructure.decisionpoint.api.ControllerContext;
+import org.onap.so.bpmn.infrastructure.decisionpoint.api.ControllerRunnable;
+import org.onap.so.bpmn.servicedecomposition.tasks.ExtractPojosForBB;
+import org.onap.so.client.cds.AbstractCDSProcessingBBUtils;
+import org.onap.so.client.cds.GeneratePayloadForCds;
+import org.onap.so.client.cds.beans.AbstractCDSPropertiesBean;
+import org.onap.so.client.exception.ExceptionBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * For Vnf/Vf-Module/Service BuildingBlockExecution is being used.
+ *
+ * @param - BuildingBlockExecution
+ */
+@Component
+public class GenericCDSProcessingBB implements ControllerRunnable<BuildingBlockExecution> {
+    private static final Logger logger = LoggerFactory.getLogger(GenericCDSProcessingBB.class);
+    private static final String EXECUTION_OBJECT = "executionObject";
+    public static final String CDS_ACTOR = "cds";
+    public static final String VNF_SCOPE = "vnf";
+    public static final String VF_MODULE_SCOPE = "vf-module";
+
+    @Autowired
+    private ExceptionBuilder exceptionBuilder;
+
+    @Autowired
+    private ExtractPojosForBB extractPojosForBB;
+
+    @Autowired
+    private AbstractCDSProcessingBBUtils cdsDispather;
+
+    @Autowired
+    private GeneratePayloadForCds generatePayloadForCds;
+
+    @Override
+    public Boolean understand(ControllerContext<BuildingBlockExecution> context) {
+        String scope = context.getControllerScope();
+        return CDS_ACTOR.equalsIgnoreCase(context.getControllerActor())
+                && (VNF_SCOPE.equalsIgnoreCase(scope) || VF_MODULE_SCOPE.equalsIgnoreCase(scope));
+    }
+
+    @Override
+    public Boolean ready(ControllerContext<BuildingBlockExecution> context) {
+        return true;
+    }
+
+    @Override
+    public void prepare(ControllerContext<BuildingBlockExecution> context) {
+        BuildingBlockExecution buildingBlockExecution = context.getExecution();
+        try {
+            AbstractCDSPropertiesBean abstractCDSPropertiesBean =
+                    generatePayloadForCds.buildCdsPropertiesBean(buildingBlockExecution);
+            buildingBlockExecution.setVariable(EXECUTION_OBJECT, abstractCDSPropertiesBean);
+        } catch (Exception ex) {
+            logger.error("An exception occurred when creating payload for CDS request", ex);
+            exceptionBuilder.buildAndThrowWorkflowException(buildingBlockExecution, 7000, ex);
+        }
+    }
+
+    @Override
+    public void run(ControllerContext<BuildingBlockExecution> context) {
+        BuildingBlockExecution obj = context.getExecution();
+        cdsDispather.constructExecutionServiceInputObject(obj);
+        cdsDispather.sendRequestToCDSClient(obj);
+    }
+}
diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/GenericPnfCDSProcessingDE.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/GenericPnfCDSProcessingDE.java
new file mode 100644
index 0000000..d5423b2
--- /dev/null
+++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/GenericPnfCDSProcessingDE.java
@@ -0,0 +1,92 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2020 Nordix
+ *  ================================================================================
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ *  SPDX-License-Identifier: Apache-2.0
+ *  ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.bpmn.infrastructure.flowspecific.tasks;
+
+import org.camunda.bpm.engine.delegate.DelegateExecution;
+import org.onap.so.bpmn.infrastructure.decisionpoint.api.ControllerContext;
+import org.onap.so.bpmn.infrastructure.decisionpoint.api.ControllerRunnable;
+import org.onap.so.bpmn.servicedecomposition.tasks.ExtractPojosForBB;
+import org.onap.so.client.cds.AbstractCDSProcessingBBUtils;
+import org.onap.so.client.cds.GeneratePayloadForCds;
+import org.onap.so.client.cds.PayloadConstants;
+import org.onap.so.client.cds.beans.AbstractCDSPropertiesBean;
+import org.onap.so.client.exception.ExceptionBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * For pnf, DelegateExecution is being used.
+ *
+ * @param - DelegateExecution
+ */
+@Component
+public class GenericPnfCDSProcessingDE implements ControllerRunnable<DelegateExecution> {
+    private static final Logger logger = LoggerFactory.getLogger(GenericPnfCDSProcessingDE.class);
+    private static final String EXECUTION_OBJECT = "executionObject";
+    private static final String ASSIGN_ACTION = "config-assign";
+    private static final String DEPLOY_ACTION = "config-deploy";
+
+    @Autowired
+    private ExceptionBuilder exceptionBuilder;
+
+    @Autowired
+    private AbstractCDSProcessingBBUtils cdsDispather;
+
+    @Autowired
+    private GeneratePayloadForCds generatePayloadForCds;
+
+    @Override
+    public Boolean understand(ControllerContext<DelegateExecution> context) {
+        final String scope = context.getControllerScope();
+        return PayloadConstants.CDS_ACTOR.equalsIgnoreCase(context.getControllerActor())
+                && PayloadConstants.PNF_SCOPE.equalsIgnoreCase(scope)
+                && !(ASSIGN_ACTION.equalsIgnoreCase(context.getControllerAction())
+                        || DEPLOY_ACTION.equalsIgnoreCase(context.getControllerAction()));
+    }
+
+    @Override
+    public Boolean ready(ControllerContext<DelegateExecution> context) {
+        return true;
+    }
+
+    @Override
+    public void prepare(ControllerContext<DelegateExecution> context) {
+        DelegateExecution delegateExecution = context.getExecution();
+        try {
+            AbstractCDSPropertiesBean abstractCDSPropertiesBean =
+                    generatePayloadForCds.buildCdsPropertiesBean(delegateExecution);
+
+            delegateExecution.setVariable(EXECUTION_OBJECT, abstractCDSPropertiesBean);
+
+        } catch (Exception ex) {
+            logger.error("An exception occurred when creating payload for CDS request", ex);
+            exceptionBuilder.buildAndThrowWorkflowException(delegateExecution, 7000, ex);
+        }
+    }
+
+    @Override
+    public void run(ControllerContext<DelegateExecution> context) {
+        DelegateExecution obj = context.getExecution();
+        cdsDispather.constructExecutionServiceInputObject(obj);
+        cdsDispather.sendRequestToCDSClient(obj);
+    }
+}
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 64f0072..1cde9fb 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
@@ -6,6 +6,8 @@
  * ================================================================================
  * Modifications Copyright (c) 2019 Samsung
  * ================================================================================
+ * Modifications Copyright (c) 2020 Nokia
+ * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
@@ -29,11 +31,9 @@
 import org.onap.so.client.exception.ExceptionBuilder;
 import org.onap.so.client.exception.OrchestrationStatusValidationException;
 import org.onap.so.db.catalog.beans.BuildingBlockDetail;
-import org.onap.so.db.catalog.beans.OrchestrationAction;
 import org.onap.so.db.catalog.beans.OrchestrationStatus;
 import org.onap.so.db.catalog.beans.OrchestrationStatusStateTransitionDirective;
 import org.onap.so.db.catalog.beans.OrchestrationStatusValidationDirective;
-import org.onap.so.db.catalog.beans.ResourceType;
 import org.onap.so.db.catalog.client.CatalogDbClient;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -52,8 +52,6 @@
             "Orchestration Status Validation failed. ResourceType=(%s), TargetAction=(%s), OrchestrationStatus=(%s)";
     private static final String ORCHESTRATION_STATUS_VALIDATION_RESULT = "orchestrationStatusValidationResult";
     private static final String ALACARTE = "aLaCarte";
-    private static final String MULTI_STAGE_DESIGN_OFF = "false";
-    private static final String MULTI_STAGE_DESIGN_ON = "true";
 
     @Autowired
     private ExtractPojosForBB extractPojosForBB;
@@ -86,7 +84,7 @@
                         String.format(BUILDING_BLOCK_DETAIL_NOT_FOUND, buildingBlockFlowName));
             }
 
-            OrchestrationStatus orchestrationStatus = null;
+            OrchestrationStatus orchestrationStatus;
 
             switch (buildingBlockDetail.getResourceType()) {
                 case SERVICE:
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 80c6f0b..3362588 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
@@ -94,6 +94,7 @@
 import org.springframework.stereotype.Component;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import org.springframework.util.CollectionUtils;
 
 @Component
 public class WorkflowAction {
@@ -410,15 +411,17 @@
                 }
             }
 
-            if (flowsToExecute == null || flowsToExecute.isEmpty()) {
+            if (CollectionUtils.isEmpty(flowsToExecute)) {
                 throw new IllegalStateException("Macro did not come up with a valid execution path.");
             }
+
             List<String> flowNames = new ArrayList<>();
             logger.info("List of BuildingBlocks to execute:");
-            for (ExecuteBuildingBlock ebb : flowsToExecute) {
+
+            flowsToExecute.forEach(ebb -> {
                 logger.info(ebb.getBuildingBlock().getBpmnFlowName());
                 flowNames.add(ebb.getBuildingBlock().getBpmnFlowName());
-            }
+            });
 
             if (!isResume) {
                 bbInputSetupUtils.persistFlowExecutionPath(requestId, flowsToExecute);
@@ -431,7 +434,12 @@
             execution.setVariable("isRollbackComplete", false);
 
         } catch (Exception ex) {
-            buildAndThrowException(execution, "Exception while setting execution list. ", ex);
+            if (!(execution.hasVariable("WorkflowException")
+                    || execution.hasVariable("WorkflowExceptionExceptionMessage"))) {
+                buildAndThrowException(execution, "Exception while setting execution list. ", ex);
+            } else {
+                throw ex;
+            }
         }
     }
 
@@ -463,9 +471,7 @@
             List<AAIResultWrapper> vnfcResultWrappers = relationships.getByType(type);
             for (AAIResultWrapper vnfcResultWrapper : vnfcResultWrappers) {
                 Optional<T> vnfcOp = vnfcResultWrapper.asBean(resultClass);
-                if (vnfcOp.isPresent()) {
-                    vnfcs.add(vnfcOp.get());
-                }
+                vnfcOp.ifPresent(vnfcs::add);
             }
         }
         return vnfcs;
@@ -485,9 +491,7 @@
                     this.getResultWrappersFromRelationships(relationships, type);
             for (AAIResultWrapper configurationResultWrapper : configurationResultWrappers) {
                 Optional<T> configurationOp = configurationResultWrapper.asBean(resultClass);
-                if (configurationOp.isPresent()) {
-                    configurations.add(configurationOp.get());
-                }
+                configurationOp.ifPresent(configurations::add);
             }
         }
         return configurations;
@@ -537,7 +541,7 @@
             if (configurations.size() > 1) {
                 String multipleRelationshipsError =
                         "Multiple relationships exist from VNFC " + vnfc.getVnfcName() + " to Configurations";
-                buildAndThrowException(dataObj.getExecution(), multipleRelationshipsError,
+                buildAndThrowException(dataObj.getExecution(), "Exception in getConfigBuildingBlock: ",
                         new Exception(multipleRelationshipsError));
             }
             for (org.onap.aai.domain.yang.Configuration configuration : configurations) {
@@ -566,8 +570,6 @@
     protected List<OrchestrationFlow> getVfModuleReplaceBuildingBlocks(ConfigBuildingBlocksDataObject dataObj)
             throws Exception {
 
-        List<ExecuteBuildingBlock> flowsToExecuteConfigs = new ArrayList<>();
-
         String vnfId = dataObj.getWorkflowResourceIds().getVnfId();
         String vfModuleId = dataObj.getWorkflowResourceIds().getVfModuleId();
 
@@ -631,19 +633,15 @@
         if (!relationshipsOp.isPresent()) {
             logger.debug("No relationships were found for Configuration in AAI");
             return null;
-        } else {
-            Relationships relationships = relationshipsOp.get();
-            List<AAIResultWrapper> vnfcResultWrappers = relationships.getByType(AAIObjectType.VNFC);
-            if (vnfcResultWrappers.size() > 1 || vnfcResultWrappers.isEmpty()) {
-                logger.debug("Too many vnfcs or no vnfc found that are related to configuration");
-            }
-            Optional<Vnfc> vnfcOp = vnfcResultWrappers.get(0).asBean(Vnfc.class);
-            if (vnfcOp.isPresent()) {
-                return vnfcOp.get().getVnfcName();
-            } else {
-                return null;
-            }
         }
+        Relationships relationships = relationshipsOp.get();
+        List<AAIResultWrapper> vnfcResultWrappers = relationships.getByType(AAIObjectType.VNFC);
+        if (vnfcResultWrappers.size() > 1 || vnfcResultWrappers.isEmpty()) {
+            logger.debug("Too many vnfcs or no vnfc found that are related to configuration");
+        }
+        Optional<Vnfc> vnfcOp = vnfcResultWrappers.get(0).asBean(Vnfc.class);
+        return vnfcOp.map(Vnfc::getVnfcName).orElse(null);
+
     }
 
     protected List<Resource> sortVfModulesByBaseFirst(List<Resource> vfModuleResources) {
@@ -808,7 +806,7 @@
         vrfValidation.aaiRouteTargetValidation(aaiLocalNetwork);
         String existingAAIVrfConfiguration = getExistingAAIVrfConfiguration(relatedVpnBinding, aaiLocalNetwork);
         if (existingAAIVrfConfiguration != null) {
-            aaiResourceIds.add(new Pair<WorkflowType, String>(WorkflowType.CONFIGURATION, existingAAIVrfConfiguration));
+            aaiResourceIds.add(new Pair<>(WorkflowType.CONFIGURATION, existingAAIVrfConfiguration));
         }
         resourceCounter.add(new Resource(WorkflowType.CONFIGURATION,
                 service.getConfigurationCustomizations().get(0).getModelCustomizationUUID(), false));
@@ -956,12 +954,11 @@
             resourceCounter.add(new Resource(WorkflowType.SERVICE, serviceInstanceMSO.getServiceInstanceId(), false));
             if (serviceInstanceMSO.getVnfs() != null) {
                 for (org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf vnf : serviceInstanceMSO.getVnfs()) {
-                    aaiResourceIds.add(new Pair<WorkflowType, String>(WorkflowType.VNF, vnf.getVnfId()));
+                    aaiResourceIds.add(new Pair<>(WorkflowType.VNF, vnf.getVnfId()));
                     resourceCounter.add(new Resource(WorkflowType.VNF, vnf.getVnfId(), false));
                     if (vnf.getVfModules() != null) {
                         for (VfModule vfModule : vnf.getVfModules()) {
-                            aaiResourceIds.add(
-                                    new Pair<WorkflowType, String>(WorkflowType.VFMODULE, vfModule.getVfModuleId()));
+                            aaiResourceIds.add(new Pair<>(WorkflowType.VFMODULE, vfModule.getVfModuleId()));
                             Resource resource = new Resource(WorkflowType.VFMODULE, vfModule.getVfModuleId(), false);
                             resource.setBaseVfModule(vfModule.getModelInfoVfModule().getIsBaseBoolean());
                             resourceCounter.add(resource);
@@ -970,8 +967,7 @@
                     if (vnf.getVolumeGroups() != null) {
                         for (org.onap.so.bpmn.servicedecomposition.bbobjects.VolumeGroup volumeGroup : vnf
                                 .getVolumeGroups()) {
-                            aaiResourceIds.add(new Pair<WorkflowType, String>(WorkflowType.VOLUMEGROUP,
-                                    volumeGroup.getVolumeGroupId()));
+                            aaiResourceIds.add(new Pair<>(WorkflowType.VOLUMEGROUP, volumeGroup.getVolumeGroupId()));
                             resourceCounter
                                     .add(new Resource(WorkflowType.VOLUMEGROUP, volumeGroup.getVolumeGroupId(), false));
                         }
@@ -981,14 +977,14 @@
             if (serviceInstanceMSO.getNetworks() != null) {
                 for (org.onap.so.bpmn.servicedecomposition.bbobjects.L3Network network : serviceInstanceMSO
                         .getNetworks()) {
-                    aaiResourceIds.add(new Pair<WorkflowType, String>(WorkflowType.NETWORK, network.getNetworkId()));
+                    aaiResourceIds.add(new Pair<>(WorkflowType.NETWORK, network.getNetworkId()));
                     resourceCounter.add(new Resource(WorkflowType.NETWORK, network.getNetworkId(), false));
                 }
             }
             if (serviceInstanceMSO.getCollection() != null) {
                 logger.debug("found networkcollection");
-                aaiResourceIds.add(new Pair<WorkflowType, String>(WorkflowType.NETWORKCOLLECTION,
-                        serviceInstanceMSO.getCollection().getId()));
+                aaiResourceIds
+                        .add(new Pair<>(WorkflowType.NETWORKCOLLECTION, serviceInstanceMSO.getCollection().getId()));
                 resourceCounter.add(new Resource(WorkflowType.NETWORKCOLLECTION,
                         serviceInstanceMSO.getCollection().getId(), false));
             }
@@ -1000,8 +996,7 @@
                         for (Relationship relationship : aaiConfig.get().getRelationshipList().getRelationship()) {
                             if (relationship.getRelatedTo().contains("vnfc")
                                     || relationship.getRelatedTo().contains("vpn-binding")) {
-                                aaiResourceIds.add(new Pair<WorkflowType, String>(WorkflowType.CONFIGURATION,
-                                        config.getConfigurationId()));
+                                aaiResourceIds.add(new Pair<>(WorkflowType.CONFIGURATION, config.getConfigurationId()));
                                 resourceCounter.add(
                                         new Resource(WorkflowType.CONFIGURATION, config.getConfigurationId(), false));
                                 break;
@@ -1027,12 +1022,11 @@
             if (serviceInstanceMSO.getVnfs() != null) {
                 for (org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf vnf : serviceInstanceMSO.getVnfs()) {
                     if (vnf.getVnfId().equals(vnfId)) {
-                        aaiResourceIds.add(new Pair<WorkflowType, String>(WorkflowType.VNF, vnf.getVnfId()));
+                        aaiResourceIds.add(new Pair<>(WorkflowType.VNF, vnf.getVnfId()));
                         resourceCounter.add(new Resource(WorkflowType.VNF, vnf.getVnfId(), false));
                         if (vnf.getVfModules() != null) {
                             for (VfModule vfModule : vnf.getVfModules()) {
-                                aaiResourceIds.add(new Pair<WorkflowType, String>(WorkflowType.VFMODULE,
-                                        vfModule.getVfModuleId()));
+                                aaiResourceIds.add(new Pair<>(WorkflowType.VFMODULE, vfModule.getVfModuleId()));
                                 resourceCounter
                                         .add(new Resource(WorkflowType.VFMODULE, vfModule.getVfModuleId(), false));
                                 findConfigurationsInsideVfModule(execution, vnf.getVnfId(), vfModule.getVfModuleId(),
@@ -1042,8 +1036,8 @@
                         if (vnf.getVolumeGroups() != null) {
                             for (org.onap.so.bpmn.servicedecomposition.bbobjects.VolumeGroup volumeGroup : vnf
                                     .getVolumeGroups()) {
-                                aaiResourceIds.add(new Pair<WorkflowType, String>(WorkflowType.VOLUMEGROUP,
-                                        volumeGroup.getVolumeGroupId()));
+                                aaiResourceIds
+                                        .add(new Pair<>(WorkflowType.VOLUMEGROUP, volumeGroup.getVolumeGroupId()));
                                 resourceCounter.add(
                                         new Resource(WorkflowType.VOLUMEGROUP, volumeGroup.getVolumeGroupId(), false));
                             }
@@ -1073,8 +1067,7 @@
                     Optional<Configuration> config =
                             workflowActionUtils.extractRelationshipsConfiguration(relationshipsOp.get());
                     if (config.isPresent()) {
-                        aaiResourceIds.add(new Pair<WorkflowType, String>(WorkflowType.CONFIGURATION,
-                                config.get().getConfigurationId()));
+                        aaiResourceIds.add(new Pair<>(WorkflowType.CONFIGURATION, config.get().getConfigurationId()));
                         resourceCounter.add(
                                 new Resource(WorkflowType.CONFIGURATION, config.get().getConfigurationId(), false));
                     }
@@ -1248,7 +1241,7 @@
         Pattern patt = Pattern.compile("[vV]\\d+.*?(?:(?:/(?<type>" + SUPPORTEDTYPES
                 + ")(?:/(?<id>[^/]+))?)(?:/(?<action>[^/]+))?(?:/resume)?)?$");
         Matcher m = patt.matcher(uri);
-        Boolean generated = false;
+        boolean generated = false;
 
         if (m.find()) {
             logger.debug("found match on {} : {} ", uri, m);
@@ -1358,7 +1351,7 @@
                 } else if (ebb.getBuildingBlock().getBpmnFlowName().equals(CREATENETWORKBB)
                         || ebb.getBuildingBlock().getBpmnFlowName().equals(ACTIVATENETWORKBB)) {
                     continue;
-                } else if (!ebb.getBuildingBlock().getBpmnFlowName().equals("")) {
+                } else if (!"".equals(ebb.getBuildingBlock().getBpmnFlowName())) {
                     sortedOrchFlows.add(ebb);
                 }
             }
@@ -1549,9 +1542,7 @@
                 if (!flow.getFlowName().contains("BB") && !flow.getFlowName().contains("Activity")) {
                     List<OrchestrationFlow> macroQueryFlows =
                             catalogDbClient.getOrchestrationFlowByAction(flow.getFlowName());
-                    for (OrchestrationFlow macroFlow : macroQueryFlows) {
-                        listToExecute.add(macroFlow);
-                    }
+                    listToExecute.addAll(macroQueryFlows);
                 } else {
                     listToExecute.add(flow);
                 }
@@ -1574,7 +1565,7 @@
 
     public void handleRuntimeException(DelegateExecution execution) {
         StringBuilder wfeExpMsg = new StringBuilder("Runtime error ");
-        String runtimeErrorMessage = null;
+        String runtimeErrorMessage;
         try {
             String javaExpMsg = (String) execution.getVariable("BPMN_javaExpMsg");
             if (javaExpMsg != null && !javaExpMsg.isEmpty()) {
diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/listeners/SkipCDSBuildingBlockListener.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/listeners/SkipCDSBuildingBlockListener.java
new file mode 100644
index 0000000..682a047
--- /dev/null
+++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/listeners/SkipCDSBuildingBlockListener.java
@@ -0,0 +1,116 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2020  Tech Mahindra
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.bpmn.infrastructure.workflow.tasks.listeners;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import org.apache.logging.log4j.util.Strings;
+import org.onap.so.bpmn.common.BBConstants;
+import org.onap.so.bpmn.common.BuildingBlockExecution;
+import org.onap.so.bpmn.common.listener.flowmanipulator.FlowManipulator;
+import org.onap.so.bpmn.servicedecomposition.entities.ExecuteBuildingBlock;
+import org.onap.so.db.catalog.beans.VfModuleCustomization;
+import org.onap.so.db.catalog.beans.VnfResourceCustomization;
+import org.onap.so.db.catalog.client.CatalogDbClient;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+
+@Component
+public class SkipCDSBuildingBlockListener implements FlowManipulator {
+
+    @Autowired
+    private CatalogDbClient catalogDbClient;
+
+    private Set<String> vnfActions =
+            new HashSet<String>(Arrays.asList("config-assign", "config-deploy", "VnfConfigAssign", "VnfConfigDeploy"));
+
+    private Set<String> vFModuleAction =
+            new HashSet<String>(Arrays.asList("VfModuleConfigAssign", "VfModuleConfigDeploy"));
+
+    @Override
+    public boolean shouldRunFor(String currentBBName, boolean isFirst, BuildingBlockExecution execution) {
+
+        return "ControllerExecutionBB".equals(currentBBName);
+    }
+
+    /**
+     * Skip the CDS Building block according to the Skip Flag.
+     *
+     * @param flowsToExecute - List of ExecuteBuildingBlock object.
+     * @param execution - BuildingBlockExecution object
+     * @param currentBB - ExecuteBuildingBlock object
+     *
+     */
+    @Override
+    public void run(List<ExecuteBuildingBlock> flowsToExecute, ExecuteBuildingBlock currentBB,
+            BuildingBlockExecution execution) {
+        String customizationUUID = currentBB.getBuildingBlock().getKey();
+
+        if (Strings.isEmpty(customizationUUID)) {
+            return;
+        }
+
+        if (currentBB.getBuildingBlock().getBpmnScope().equalsIgnoreCase("VNF")
+                && containsIgnoreCaseAction(currentBB, vnfActions)) {
+            List<VnfResourceCustomization> vnfResourceCustomizations =
+                    catalogDbClient.getVnfResourceCustomizationByModelUuid(
+                            currentBB.getRequestDetails().getModelInfo().getModelUuid());
+            if (!CollectionUtils.isEmpty(vnfResourceCustomizations)) {
+                VnfResourceCustomization vrc = catalogDbClient.findVnfResourceCustomizationInList(customizationUUID,
+                        vnfResourceCustomizations);
+                if (null != vrc) {
+                    boolean skipConfigVNF = vrc.isSkipPostInstConf();
+                    currentSequenceSkipCheck(execution, skipConfigVNF);
+                }
+
+            }
+        } else if (currentBB.getBuildingBlock().getBpmnScope().equalsIgnoreCase("VFModule")
+                && containsIgnoreCaseAction(currentBB, vFModuleAction)) {
+
+            VfModuleCustomization vfc =
+                    catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID(customizationUUID);
+
+            if (null != vfc) {
+                boolean skipVfModule = vfc.isSkipPostInstConf();
+                currentSequenceSkipCheck(execution, skipVfModule);
+            }
+        }
+
+
+    }
+
+    private boolean containsIgnoreCaseAction(ExecuteBuildingBlock currentBB, Set<String> actions) {
+        return actions.stream().filter(action -> action.equalsIgnoreCase(currentBB.getBuildingBlock().getBpmnAction()))
+                .findFirst().isPresent();
+    }
+
+
+    private void currentSequenceSkipCheck(BuildingBlockExecution execution, boolean skipModule) {
+        if (skipModule) {
+            int currentSequence = execution.getVariable(BBConstants.G_CURRENT_SEQUENCE);
+            execution.setVariable(BBConstants.G_CURRENT_SEQUENCE, currentSequence + 1);
+        }
+    }
+
+}
diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/network/mapper/NetworkAdapterObjectMapper.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/network/mapper/NetworkAdapterObjectMapper.java
index d78fa69..3f81e43 100644
--- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/network/mapper/NetworkAdapterObjectMapper.java
+++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/network/mapper/NetworkAdapterObjectMapper.java
@@ -4,12 +4,14 @@
  * ================================================================================
  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
+ * Modifications Copyright (c) 2020 Nokia
+ * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -52,6 +54,7 @@
 import org.onap.so.openstack.beans.NetworkRollback;
 import org.onap.so.openstack.beans.RouteTarget;
 import org.onap.so.openstack.beans.Subnet;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.SegmentationAssignment;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
@@ -65,8 +68,7 @@
 
     public CreateNetworkRequest createNetworkRequestMapper(RequestContext requestContext, CloudRegion cloudRegion,
             OrchestrationContext orchestrationContext, ServiceInstance serviceInstance, L3Network l3Network,
-            Map<String, String> userInput, String cloudRegionPo, Customer customer)
-            throws UnsupportedEncodingException {
+            Map<String, String> userInput, String cloudRegionPo, Customer customer) {
         CreateNetworkRequest createNetworkRequest = new CreateNetworkRequest();
 
         // set cloudSiteId as determined for cloud region PO instead of cloudRegion.getLcpCloudRegionId()
@@ -119,7 +121,7 @@
     }
 
     public DeleteNetworkRequest deleteNetworkRequestMapper(RequestContext requestContext, CloudRegion cloudRegion,
-            ServiceInstance serviceInstance, L3Network l3Network) throws UnsupportedEncodingException {
+            ServiceInstance serviceInstance, L3Network l3Network) {
         DeleteNetworkRequest deleteNetworkRequest = new DeleteNetworkRequest();
 
         deleteNetworkRequest.setCloudSiteId(cloudRegion.getLcpCloudRegionId());
@@ -150,14 +152,14 @@
 
     /**
      * Access method to build Rollback Network Request
-     * 
+     *
      * @return
      * @throws UnsupportedEncodingException
      */
     public RollbackNetworkRequest createNetworkRollbackRequestMapper(RequestContext requestContext,
             CloudRegion cloudRegion, OrchestrationContext orchestrationContext, ServiceInstance serviceInstance,
             L3Network l3Network, Map<String, String> userInput, String cloudRegionPo,
-            CreateNetworkResponse createNetworkResponse) throws UnsupportedEncodingException {
+            CreateNetworkResponse createNetworkResponse) {
         RollbackNetworkRequest rollbackNetworkRequest = new RollbackNetworkRequest();
 
         rollbackNetworkRequest = setCommonRollbackRequestFields(rollbackNetworkRequest, requestContext);
@@ -171,7 +173,7 @@
 
     public UpdateNetworkRequest createNetworkUpdateRequestMapper(RequestContext requestContext, CloudRegion cloudRegion,
             OrchestrationContext orchestrationContext, ServiceInstance serviceInstance, L3Network l3Network,
-            Map<String, String> userInput, Customer customer) throws UnsupportedEncodingException {
+            Map<String, String> userInput, Customer customer) {
         UpdateNetworkRequest updateNetworkRequest = new UpdateNetworkRequest();
 
         updateNetworkRequest.setCloudSiteId(cloudRegion.getLcpCloudRegionId());
@@ -198,11 +200,10 @@
     }
 
     private RollbackNetworkRequest setCommonRollbackRequestFields(RollbackNetworkRequest request,
-            RequestContext requestContext) throws UnsupportedEncodingException {
+            RequestContext requestContext) {
         request.setSkipAAI(true);
         String messageId = requestContext.getMsoRequestId();
         request.setMessageId(messageId);
-        // request.setNotificationUrl(createCallbackUrl("NetworkAResponse", messageId));
         return request;
     }
 
@@ -240,7 +241,7 @@
         return UUID.randomUUID().toString();
     }
 
-    protected String createCallbackUrl(String messageType, String correlator) throws UnsupportedEncodingException {
+    protected String createCallbackUrl(String messageType, String correlator) {
         String endpoint = this.getEndpoint();
 
         while (endpoint.endsWith("/")) {
@@ -256,14 +257,14 @@
 
     /**
      * Use BB L3Network object to build subnets list of type org.onap.so.openstack.beans.Subnet
-     * 
+     *
      * @param L3Network
      * @return List<org.onap.so.openstack.beans.Subnet>
      */
     protected List<Subnet> buildOpenstackSubnetList(L3Network l3Network) {
 
         List<org.onap.so.bpmn.servicedecomposition.bbobjects.Subnet> subnets = l3Network.getSubnets();
-        List<org.onap.so.openstack.beans.Subnet> subnetList = new ArrayList<org.onap.so.openstack.beans.Subnet>();
+        List<org.onap.so.openstack.beans.Subnet> subnetList = new ArrayList<>();
         // create mapper from onap Subnet to openstack bean Subnet
         if (modelMapper.getTypeMap(org.onap.so.bpmn.servicedecomposition.bbobjects.Subnet.class,
                 org.onap.so.openstack.beans.Subnet.class) == null) {
@@ -292,7 +293,7 @@
                         .setCidr(subnet.getNetworkStartAddress().concat(FORWARD_SLASH).concat(subnet.getCidrMask()));
             List<org.onap.so.bpmn.servicedecomposition.bbobjects.HostRoute> hostRouteList = subnet.getHostRoutes();
             List<org.onap.so.openstack.beans.HostRoute> openstackHostRouteList = new ArrayList<>();
-            org.onap.so.openstack.beans.HostRoute openstackHostRoute = null;
+            org.onap.so.openstack.beans.HostRoute openstackHostRoute;
             // TODO only 2 fields available on openstack object. Confirm it is sufficient or add as needed
             for (org.onap.so.bpmn.servicedecomposition.bbobjects.HostRoute hostRoute : hostRouteList) {
                 openstackHostRoute = new org.onap.so.openstack.beans.HostRoute();
@@ -319,10 +320,9 @@
     private ProviderVlanNetwork buildProviderVlanNetwork(L3Network l3Network) {
         ProviderVlanNetwork providerVlanNetwork = new ProviderVlanNetwork();
         providerVlanNetwork.setPhysicalNetworkName(l3Network.getPhysicalNetworkName());
-        List<Integer> vlans = new ArrayList<Integer>();
-        List<org.onap.so.bpmn.servicedecomposition.bbobjects.SegmentationAssignment> segmentationAssignments =
-                l3Network.getSegmentationAssignments();
-        for (org.onap.so.bpmn.servicedecomposition.bbobjects.SegmentationAssignment assignment : segmentationAssignments) {
+        List<Integer> vlans = new ArrayList<>();
+        List<SegmentationAssignment> segmentationAssignments = l3Network.getSegmentationAssignments();
+        for (SegmentationAssignment assignment : segmentationAssignments) {
             vlans.add(Integer.valueOf(assignment.getSegmentationId()));
         }
         providerVlanNetwork.setVlans(vlans);
@@ -401,7 +401,7 @@
 
     private Map<String, String> addSharedAndExternal(Map<String, String> userInput, L3Network l3Network) {
         if (userInput == null)
-            userInput = new HashMap<String, String>();
+            userInput = new HashMap<>();
         if (!userInput.containsKey("shared")) {
             userInput.put("shared", Optional.ofNullable(l3Network.isIsSharedNetwork()).orElse(false).toString());
         }
diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/namingservice/NamingRequestObject.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/namingservice/NamingRequestObject.java
index 3d3058d..362f64d 100644
--- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/namingservice/NamingRequestObject.java
+++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/namingservice/NamingRequestObject.java
@@ -4,6 +4,8 @@
  * ================================================================================
  * Copyright (C) 2017 - 2019 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
+ * Modifications Copyright (c) 2020 Nokia
+ * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
@@ -24,7 +26,7 @@
 
 public class NamingRequestObject {
 
-    private HashMap<String, String> namingRequestMap = new HashMap<String, String>();
+    private HashMap<String, String> namingRequestMap = new HashMap<>();
 
     public HashMap<String, String> getNamingRequestObjectMap() {
         return this.namingRequestMap;
diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/AAIServiceInstanceResources.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/AAIServiceInstanceResources.java
index fc15285..9b104f3 100644
--- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/AAIServiceInstanceResources.java
+++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/AAIServiceInstanceResources.java
@@ -6,6 +6,8 @@
  * ================================================================================
  * Modifications Copyright (c) 2019 Samsung
  * ================================================================================
+ * Modifications Copyright (c) 2020 Nokia
+ * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
@@ -37,14 +39,11 @@
 import org.onap.so.client.aai.entities.uri.AAIUriFactory;
 import org.onap.so.client.aai.mapper.AAIObjectMapper;
 import org.onap.so.db.catalog.beans.OrchestrationStatus;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 @Component
 public class AAIServiceInstanceResources {
-    private static final Logger logger = LoggerFactory.getLogger(AAIServiceInstanceResources.class);
 
     @Autowired
     private InjectionHelper injectionHelper;
diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/NamingServiceResources.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/NamingServiceResources.java
index 5513122..dba1693 100644
--- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/NamingServiceResources.java
+++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/NamingServiceResources.java
@@ -6,6 +6,8 @@
  * ================================================================================
  * Modifications Copyright (c) 2019 Samsung
  * ================================================================================
+ * Modifications Copyright (c) 2020 Nokia
+ * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
@@ -33,14 +35,11 @@
 import org.onap.so.client.namingservice.NamingClient;
 import org.onap.so.client.namingservice.NamingRequestObject;
 import org.onap.so.client.namingservice.NamingRequestObjectBuilder;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 @Component
 public class NamingServiceResources {
-    private static final Logger logger = LoggerFactory.getLogger(NamingServiceResources.class);
     private static final String NAMING_TYPE = "instanceGroup";
 
     @Autowired
@@ -53,14 +52,14 @@
             throws BadResponseException, IOException {
         Element element = namingRequestObjectBuilder.elementMapper(instanceGroup.getId(), policyInstanceName,
                 NAMING_TYPE, nfNamingCode, instanceGroup.getInstanceGroupName());
-        List<Element> elements = new ArrayList<Element>();
+        List<Element> elements = new ArrayList<>();
         elements.add(element);
         return (namingClient.postNameGenRequest(namingRequestObjectBuilder.nameGenRequestMapper(elements)));
     }
 
     public String deleteInstanceGroupName(InstanceGroup instanceGroup) throws BadResponseException, IOException {
         Deleteelement deleteElement = namingRequestObjectBuilder.deleteElementMapper(instanceGroup.getId());
-        List<Deleteelement> deleteElements = new ArrayList<Deleteelement>();
+        List<Deleteelement> deleteElements = new ArrayList<>();
         deleteElements.add(deleteElement);
         return (namingClient
                 .deleteNameGenRequest(namingRequestObjectBuilder.nameGenDeleteRequestMapper(deleteElements)));
@@ -70,8 +69,8 @@
             throws BadResponseException, IOException {
         HashMap<String, String> nsRequestObject = namingRequestObject.getNamingRequestObjectMap();
         Element element = new Element();
-        nsRequestObject.forEach((k, v) -> element.put(k, v));
-        List<Element> elements = new ArrayList<Element>();
+        nsRequestObject.forEach(element::put);
+        List<Element> elements = new ArrayList<>();
         elements.add(element);
         return (namingClient.postNameGenRequest(namingRequestObjectBuilder.nameGenRequestMapper(elements)));
     }
@@ -81,7 +80,7 @@
         HashMap<String, String> nsRequestObject = namingRequestObject.getNamingRequestObjectMap();
         Deleteelement delElement = new Deleteelement();
         nsRequestObject.forEach((k, v) -> delElement.setExternalKey(v));
-        List<Deleteelement> delElements = new ArrayList<Deleteelement>();
+        List<Deleteelement> delElements = new ArrayList<>();
         delElements.add(delElement);
         return (namingClient.deleteNameGenRequest(namingRequestObjectBuilder.nameGenDeleteRequestMapper(delElements)));
     }
diff --git a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/decisionpoint/impl/camunda/ControllerExecutionDETestIT.java b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/decisionpoint/impl/camunda/ControllerExecutionDETestIT.java
index 860780a..275cd18 100644
--- a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/decisionpoint/impl/camunda/ControllerExecutionDETestIT.java
+++ b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/decisionpoint/impl/camunda/ControllerExecutionDETestIT.java
@@ -19,50 +19,63 @@
 
 package org.onap.so.bpmn.infrastructure.decisionpoint.impl.camunda;
 
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.AssertionsForClassTypes.fail;
-import static org.onap.so.bpmn.infrastructure.pnf.delegate.ExecutionVariableNames.MODEL_UUID;
-import static org.onap.so.bpmn.infrastructure.pnf.delegate.ExecutionVariableNames.MSO_REQUEST_ID;
-import static org.onap.so.bpmn.infrastructure.pnf.delegate.ExecutionVariableNames.PNF_CORRELATION_ID;
-import static org.onap.so.bpmn.infrastructure.pnf.delegate.ExecutionVariableNames.PNF_UUID;
-import static org.onap.so.bpmn.infrastructure.pnf.delegate.ExecutionVariableNames.PRC_BLUEPRINT_NAME;
-import static org.onap.so.bpmn.infrastructure.pnf.delegate.ExecutionVariableNames.PRC_BLUEPRINT_VERSION;
-import static org.onap.so.bpmn.infrastructure.pnf.delegate.ExecutionVariableNames.PRC_CUSTOMIZATION_UUID;
-import static org.onap.so.bpmn.infrastructure.pnf.delegate.ExecutionVariableNames.PRC_INSTANCE_NAME;
-import static org.onap.so.bpmn.infrastructure.pnf.delegate.ExecutionVariableNames.SERVICE_INSTANCE_ID;
 import com.google.protobuf.Struct;
-import java.util.List;
 import org.junit.Before;
+import org.junit.ClassRule;
+import org.junit.Rule;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
 import org.onap.ccsdk.cds.controllerblueprints.common.api.ActionIdentifiers;
 import org.onap.ccsdk.cds.controllerblueprints.common.api.CommonHeader;
 import org.onap.ccsdk.cds.controllerblueprints.processing.api.ExecutionServiceInput;
 import org.onap.so.BaseIntegrationTest;
 import org.onap.so.GrpcNettyServer;
-import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf;
+import org.onap.so.client.aai.AAIVersion;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.junit4.rules.SpringClassRule;
+import org.springframework.test.context.junit4.rules.SpringMethodRule;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import static com.github.tomakehurst.wiremock.client.WireMock.*;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.AssertionsForClassTypes.fail;
+import static org.onap.so.bpmn.infrastructure.pnf.delegate.ExecutionVariableNames.*;
 
+@RunWith(Parameterized.class)
 public class ControllerExecutionDETestIT extends BaseIntegrationTest {
 
     private Logger logger = LoggerFactory.getLogger(this.getClass());
 
+    @ClassRule
+    public static final SpringClassRule springClassRule = new SpringClassRule();
+
+    @Rule
+    public final SpringMethodRule smr = new SpringMethodRule();
+
+    private static final String DOWNLOAD_ACTION = "downloadNeSw";
+    private static final String ACTIVATE_ACTION = "activateNeSw";
+    private static final String PRECHECK_ACTION = "precheck";
+    private static final String POSTCHECK_ACTION = "postcheck";
+    private static final String ASSIGN_ACTION = "config-assign";
+    private static final String DEPLOY_ACTION = "config-deploy";
+    private static final String CDS_ACTOR = "cds";
+
     @Autowired
     private ControllerExecutionDE controllerExecutionDE;
 
     @Autowired
     private GrpcNettyServer grpcNettyServer;
 
-    private GenericVnf genericVnf;
-
     private static String TEST_MODEL_UUID = "6bc0b04d-1873-4721-b53d-6615225b2a28";
     private static String TEST_SERVICE_INSTANCE_ID = "test_service_id";
     private static String TEST_PROCESS_KEY = "processKey1";
     private static String TEST_MSO_REQUEST_ID = "ff874603-4222-11e7-9252-005056850d2e";
 
-    private static String TEST_CDS_ACTION = "config-assign";
-    private static String TEST_APPC_ACTION = "HealthCheck";
+    private static final AAIVersion VERSION = AAIVersion.LATEST;
 
     private static String TEST_PNF_RESOURCE_INSTANCE_NAME = "PNF_demo_resource";
     private static String TEST_PNF_CORRELATION_ID = "PNFDemo";
@@ -70,75 +83,112 @@
     private static String TEST_PNF_RESOURCE_BLUEPRINT_VERSION = "1.0.1";
     private static String TEST_PNF_RESOURCE_CUSTOMIZATION_UUID = "9acb3a83-8a52-412c-9a45-901764938144";
     private static String TEST_PNF_UUID = "5df8b6de-2083-11e7-93ae-92361f002671";
+    private static String TEST_SOFTWARE_VERSION = "demo-sw-ver2.0.0";
+
+    private String description;
+    private String action;
+    private String scope;
+
+    public ControllerExecutionDETestIT(String desc, String action, String scope) {
+        this.description = desc;
+        this.action = action;
+        this.scope = scope;
+
+    }
+
+    @Parameterized.Parameters(name = "index {0}")
+    public static Collection<String[]> data() {
+        return Arrays.asList(
+                new String[][] {{"Test JSON for action:" + ACTIVATE_ACTION + " scope:pnf", ACTIVATE_ACTION, "pnf"},
+                        {"Test JSON for action:" + DOWNLOAD_ACTION + " scope:pnf", DOWNLOAD_ACTION, "pnf"},
+                        {"Test JSON for action:" + ASSIGN_ACTION + " scope:pnf", ASSIGN_ACTION, "pnf"},
+                        {"Test JSON for action:" + DEPLOY_ACTION + " scope:pnf", DEPLOY_ACTION, "pnf"},
+                        {"Test JSON for action:" + PRECHECK_ACTION + " scope:pnf", PRECHECK_ACTION, "pnf"},
+                        {"Test JSON for action:" + POSTCHECK_ACTION + " scope:pnf", POSTCHECK_ACTION, "pnf"}});
+    }
 
     @Before
     public void setUp() {
+        delegateExecution.setVariable("testProcessKey", TEST_PROCESS_KEY);
+        delegateExecution.setVariable(PNF_CORRELATION_ID, TEST_PNF_CORRELATION_ID);
         delegateExecution.setVariable(MODEL_UUID, TEST_MODEL_UUID);
         delegateExecution.setVariable(SERVICE_INSTANCE_ID, TEST_SERVICE_INSTANCE_ID);
         delegateExecution.setVariable(MSO_REQUEST_ID, TEST_MSO_REQUEST_ID);
-        delegateExecution.setVariable("testProcessKey", TEST_PROCESS_KEY);
-
-        grpcNettyServer.cleanMessage();
-    }
-
-    @Test
-    public void testExecution_cdsConfigAssign_actionExecuted() {
-
-        configureCdsConfigAssign();
-
-        controllerExecutionDE.execute(delegateExecution);
-        List<ExecutionServiceInput> detailedMessages = grpcNettyServer.getDetailedMessages();
-        assertThat(detailedMessages).hasSize(1);
-        try {
-            checkConfigAssign(detailedMessages.get(0));
-        } catch (Exception e) {
-            e.printStackTrace();
-            fail("ConfigAssign request exception", e);
-        }
-    }
-
-    private void configureCdsConfigAssign() {
-        delegateExecution.setVariable("actor", "cds");
-        delegateExecution.setVariable("action", TEST_CDS_ACTION);
-        delegateExecution.setVariable("scope", "pnf");
-
-        delegateExecution.setVariable(PNF_CORRELATION_ID, TEST_PNF_CORRELATION_ID);
         delegateExecution.setVariable(PNF_UUID, TEST_PNF_UUID);
         delegateExecution.setVariable(PRC_INSTANCE_NAME, TEST_PNF_RESOURCE_INSTANCE_NAME);
         delegateExecution.setVariable(PRC_CUSTOMIZATION_UUID, TEST_PNF_RESOURCE_CUSTOMIZATION_UUID);
         delegateExecution.setVariable(PRC_BLUEPRINT_NAME, TEST_PNF_RESOURCE_BLUEPRINT_NAME);
         delegateExecution.setVariable(PRC_BLUEPRINT_VERSION, TEST_PNF_RESOURCE_BLUEPRINT_VERSION);
-    }
+        delegateExecution.setVariable("targetSoftwareVersion", TEST_SOFTWARE_VERSION);
 
-    private void checkConfigAssign(ExecutionServiceInput executionServiceInput) {
+        delegateExecution.setVariable("actor", CDS_ACTOR);
+        delegateExecution.setVariable("action", this.action);
+        delegateExecution.setVariable("scope", this.scope);
 
-        logger.info("Checking the configAssign request");
-        ActionIdentifiers actionIdentifiers = executionServiceInput.getActionIdentifiers();
 
         /**
-         * the fields of actionIdentifiers should match the one in the
-         * response/createVcpeResCustServiceSimplifiedTest_catalogdb.json.
+         * Get the PNF entry from AAI.
          */
+        if (action.equalsIgnoreCase(DEPLOY_ACTION)) {
+            final String aaiPnfEntry = "{  \n" + "   \"pnf-name\":\"PNFDemo\",\n" + "   \"pnf-id\":\"testtest\",\n"
+                    + "   \"in-maint\":true,\n" + "   \"resource-version\":\"1541720264047\",\n"
+                    + "   \"ipaddress-v4-oam\":\"1.1.1.1\",\n" + "   \"ipaddress-v6-oam\":\"::/128\"\n" + "}";
+            wireMockServer.stubFor(
+                    get(urlEqualTo("/aai/" + VERSION + "/network/pnfs/pnf/PNFDemo")).willReturn(okJson(aaiPnfEntry)));
+        }
+
+        grpcNettyServer.cleanMessage();
+    }
+
+    @Test
+    public void testExecution_cds_actions() {
+
+        controllerExecutionDE.execute(delegateExecution);
+        List<ExecutionServiceInput> detailedMessages = grpcNettyServer.getDetailedMessages();
+        assertThat(detailedMessages).hasSize(1);
+        try {
+            verifyRequestContentForAction(detailedMessages.get(0));
+        } catch (Exception e) {
+            e.printStackTrace();
+            fail(this.action + " request exception", e);
+        }
+    }
+
+    private void verifyRequestContentForAction(ExecutionServiceInput executionServiceInput) {
+
+        logger.info("Checking the " + this.action + " request");
+        ActionIdentifiers actionIdentifiers = executionServiceInput.getActionIdentifiers();
+
         assertThat(actionIdentifiers.getBlueprintName()).isEqualTo(TEST_PNF_RESOURCE_BLUEPRINT_NAME);
         assertThat(actionIdentifiers.getBlueprintVersion()).isEqualTo(TEST_PNF_RESOURCE_BLUEPRINT_VERSION);
-        assertThat(actionIdentifiers.getActionName()).isEqualTo(TEST_CDS_ACTION);
-        assertThat(actionIdentifiers.getMode()).isEqualTo("sync");
+        assertThat(actionIdentifiers.getActionName()).isEqualTo(this.action);
 
         CommonHeader commonHeader = executionServiceInput.getCommonHeader();
         assertThat(commonHeader.getOriginatorId()).isEqualTo("SO");
         assertThat(commonHeader.getRequestId()).isEqualTo(TEST_MSO_REQUEST_ID);
 
         Struct payload = executionServiceInput.getPayload();
-        Struct requeststruct = payload.getFieldsOrThrow("config-assign-request").getStructValue();
+        Struct requeststruct = payload.getFieldsOrThrow(this.action + "-request").getStructValue();
 
         assertThat(requeststruct.getFieldsOrThrow("resolution-key").getStringValue())
                 .isEqualTo(TEST_PNF_CORRELATION_ID);
-        Struct propertiesStruct = requeststruct.getFieldsOrThrow("config-assign-properties").getStructValue();
 
+        Struct propertiesStruct = requeststruct.getFieldsOrThrow(this.action + "-properties").getStructValue();
         assertThat(propertiesStruct.getFieldsOrThrow("pnf-name").getStringValue()).isEqualTo(TEST_PNF_CORRELATION_ID);
         assertThat(propertiesStruct.getFieldsOrThrow("service-model-uuid").getStringValue()).isEqualTo(TEST_MODEL_UUID);
         assertThat(propertiesStruct.getFieldsOrThrow("pnf-customization-uuid").getStringValue())
                 .isEqualTo(TEST_PNF_RESOURCE_CUSTOMIZATION_UUID);
+        if (action.equalsIgnoreCase(DEPLOY_ACTION)) {
+            assertThat(actionIdentifiers.getMode()).isEqualTo("async");
+            assertThat(propertiesStruct.getFieldsOrThrow("pnf-ipv4-address").getStringValue()).isEqualTo("1.1.1.1");
+            assertThat(propertiesStruct.getFieldsOrThrow("pnf-ipv6-address").getStringValue()).isEqualTo("::/128");
+        } else if (!action.equalsIgnoreCase(ASSIGN_ACTION)) {
+            assertThat(actionIdentifiers.getMode()).isEqualTo("sync");
+            assertThat(propertiesStruct.getFieldsOrThrow("target-software-version").getStringValue())
+                    .isEqualTo(TEST_SOFTWARE_VERSION);
+        } else {
+            assertThat(actionIdentifiers.getMode()).isEqualTo("sync");
+        }
     }
 
 }
diff --git a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/decisionpoint/impl/camunda/controller/cds/CdsControllerDETest.java b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/decisionpoint/impl/camunda/controller/cds/CdsControllerDETest.java
deleted file mode 100644
index 79bce8a..0000000
--- a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/decisionpoint/impl/camunda/controller/cds/CdsControllerDETest.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- *  Copyright (C) 2019 Nordix
- *  ================================================================================
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- *  SPDX-License-Identifier: Apache-2.0
- *  ============LICENSE_END=========================================================
- */
-
-package org.onap.so.bpmn.infrastructure.decisionpoint.impl.camunda.controller.cds;
-
-import static junit.framework.TestCase.assertTrue;
-import static org.junit.Assert.assertFalse;
-import static org.mockito.Mockito.when;
-import org.camunda.bpm.engine.delegate.DelegateExecution;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.onap.so.bpmn.infrastructure.decisionpoint.api.ControllerContext;
-import org.onap.so.bpmn.infrastructure.decisionpoint.api.controller.ControllerPreparable;
-import org.onap.so.client.exception.ExceptionBuilder;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.mock.mockito.MockBean;
-import org.springframework.test.context.ContextConfiguration;
-import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
-
-@RunWith(SpringJUnit4ClassRunner.class)
-@ContextConfiguration(classes = {CdsControllerDE.class, ExceptionBuilder.class})
-public class CdsControllerDETest {
-
-    @Autowired
-    private CdsControllerDE cdsControllerDE;
-
-    @MockBean
-    private ControllerContext controllerContext;
-
-    @MockBean
-    private ControllerPreparable<DelegateExecution> preparable;
-
-    @Before
-    public void setUp() {
-        when(controllerContext.getControllerActor()).thenReturn("cds");
-    }
-
-    @Test
-    public void testUnderstand_validContext_TrueReturned() {
-        assertTrue(cdsControllerDE.understand(controllerContext));
-    }
-
-    @Test
-    public void testUnderstand_invalidContext_FalseReturned() {
-        when(controllerContext.getControllerActor()).thenReturn("appc");
-        assertFalse(cdsControllerDE.understand(controllerContext));
-    }
-
-}
diff --git a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/decisionpoint/impl/camunda/controller/cds/PnfConfigCdsControllerDETest.java b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/decisionpoint/impl/camunda/controller/cds/PnfConfigCdsControllerDETest.java
new file mode 100644
index 0000000..d8f607f
--- /dev/null
+++ b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/decisionpoint/impl/camunda/controller/cds/PnfConfigCdsControllerDETest.java
@@ -0,0 +1,98 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2019 Nordix
+ *  ================================================================================
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ *  SPDX-License-Identifier: Apache-2.0
+ *  ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.bpmn.infrastructure.decisionpoint.impl.camunda.controller.cds;
+
+import static junit.framework.TestCase.assertTrue;
+import static org.junit.Assert.assertFalse;
+import static org.mockito.Mockito.when;
+import org.camunda.bpm.engine.delegate.DelegateExecution;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.onap.so.bpmn.infrastructure.decisionpoint.api.ControllerContext;
+import org.onap.so.bpmn.infrastructure.decisionpoint.api.controller.ControllerPreparable;
+import org.onap.so.client.cds.AbstractCDSProcessingBBUtils;
+import org.onap.so.client.exception.ExceptionBuilder;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(
+        classes = {PnfConfigCdsControllerDE.class, ExceptionBuilder.class, AbstractCDSProcessingBBUtils.class})
+public class PnfConfigCdsControllerDETest {
+
+    @Autowired
+    private PnfConfigCdsControllerDE pnfConfigCdsControllerDE;
+
+    @MockBean
+    private ControllerContext controllerContext;
+
+    @MockBean
+    private ControllerPreparable<DelegateExecution> preparable;
+
+    @Mock
+    private AbstractCDSProcessingBBUtils abstractCDSProcessingBBUtils;
+
+    @Test
+    public void testUnderstand_action_assign_TrueReturned() {
+        // when
+        when(controllerContext.getControllerActor()).thenReturn("cds");
+        when(controllerContext.getControllerScope()).thenReturn("pnf");
+        when(controllerContext.getControllerAction()).thenReturn("config-assign");
+
+        // verify
+        assertTrue(pnfConfigCdsControllerDE.understand(controllerContext));
+    }
+
+    @Test
+    public void testUnderstand_action_deploy_TrueReturned() {
+        // when
+        when(controllerContext.getControllerActor()).thenReturn("cds");
+        when(controllerContext.getControllerScope()).thenReturn("pnf");
+        when(controllerContext.getControllerAction()).thenReturn("config-deploy");
+
+        // verify
+        assertTrue(pnfConfigCdsControllerDE.understand(controllerContext));
+    }
+
+    @Test
+    public void testUnderstand_action_any_FalseReturned() {
+        // when
+        when(controllerContext.getControllerActor()).thenReturn("cds");
+        when(controllerContext.getControllerScope()).thenReturn("pnf");
+        when(controllerContext.getControllerAction()).thenReturn("any-action");
+
+        // verify
+        assertFalse(pnfConfigCdsControllerDE.understand(controllerContext));
+    }
+
+    @Test
+    public void testUnderstand_invalidContext_FalseReturned() {
+        // when
+        when(controllerContext.getControllerActor()).thenReturn("appc");
+
+        // verify
+        assertFalse(pnfConfigCdsControllerDE.understand(controllerContext));
+    }
+
+}
diff --git a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/ControllerExecutionTest.java b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/ControllerExecutionTest.java
new file mode 100644
index 0000000..72a987c
--- /dev/null
+++ b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/ControllerExecutionTest.java
@@ -0,0 +1,127 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2019  Tech Mahindra
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.bpmn.infrastructure.flowspecific.tasks;
+
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.when;
+import java.util.UUID;
+import org.camunda.bpm.engine.delegate.BpmnError;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.ArgumentMatchers;
+import org.mockito.InjectMocks;
+import org.onap.so.bpmn.BaseTaskTest;
+import org.onap.so.bpmn.common.BuildingBlockExecution;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance;
+import org.onap.so.bpmn.servicedecomposition.entities.BuildingBlock;
+import org.onap.so.bpmn.servicedecomposition.entities.ExecuteBuildingBlock;
+import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey;
+import org.onap.so.bpmn.servicedecomposition.generalobjects.RequestContext;
+import org.onap.so.client.exception.BBObjectNotFoundException;
+import org.onap.so.db.catalog.beans.BBNameSelectionReference;
+import org.onap.so.db.catalog.beans.VnfResourceCustomization;
+
+
+public class ControllerExecutionTest extends BaseTaskTest {
+
+    @InjectMocks
+    private ControllerExecution controllerExecution = new ControllerExecution();
+
+    private static final String TEST_SCOPE = "vfModule";
+    private static final String TEST_BBNAME = "ConfigurationScaleOut";
+    private static final String TEST_ACTION = "configScaleOut";
+    private static final String TEST_CONTROLLER_ACTOR = "APPC";
+
+    private BuildingBlock buildingBlock = new BuildingBlock();
+    VnfResourceCustomization vnfResourceCustomization = new VnfResourceCustomization();
+    private ExecuteBuildingBlock executeBuildingBlock = new ExecuteBuildingBlock();
+    private GenericVnf genericVnf;
+    private ServiceInstance serviceInstance;
+    private RequestContext requestContext;
+    private String msoRequestId;
+
+
+    @Before
+    public void before() throws BBObjectNotFoundException {
+
+        genericVnf = setGenericVnf();
+        serviceInstance = setServiceInstance();
+        msoRequestId = UUID.randomUUID().toString();
+        requestContext = setRequestContext();
+        requestContext.setMsoRequestId(msoRequestId);
+        gBBInput.setRequestContext(requestContext);
+        buildingBlock.setBpmnAction(TEST_ACTION);
+        buildingBlock.setBpmnScope(TEST_SCOPE);
+        executeBuildingBlock.setBuildingBlock(buildingBlock);
+        execution.setVariable("buildingBlock", executeBuildingBlock);
+
+        doThrow(new BpmnError("BPMN Error")).when(exceptionUtil)
+                .buildAndThrowWorkflowException(any(BuildingBlockExecution.class), eq(7000), any(Exception.class));
+
+        when(extractPojosForBB.extractByKey(any(), ArgumentMatchers.eq(ResourceKey.GENERIC_VNF_ID)))
+                .thenReturn(genericVnf);
+        when(extractPojosForBB.extractByKey(any(), ArgumentMatchers.eq(ResourceKey.SERVICE_INSTANCE_ID)))
+                .thenReturn(serviceInstance);
+
+
+    }
+
+    @Test
+    public void testSetControllerActorScopeAction() throws Exception {
+
+
+        doReturn(vnfResourceCustomization).when(catalogDbClient).getVnfResourceCustomizationByModelCustomizationUUID(
+                genericVnf.getModelInfoGenericVnf().getModelCustomizationUuid());
+        controllerExecution.setControllerActorScopeAction(execution);
+        assertEquals(TEST_SCOPE, execution.getVariable("scope"));
+        assertEquals(TEST_ACTION, execution.getVariable("action"));
+        assertEquals(TEST_CONTROLLER_ACTOR, execution.getVariable("controllerActor"));
+
+    }
+
+
+    @Test
+    public void testSelectBB() throws Exception {
+        // given
+        BBNameSelectionReference bbNameSelectionReference = new BBNameSelectionReference();
+        bbNameSelectionReference.setBbName(TEST_BBNAME);
+        bbNameSelectionReference.setAction(TEST_ACTION);
+        bbNameSelectionReference.setControllerActor(TEST_CONTROLLER_ACTOR);
+        bbNameSelectionReference.setScope(TEST_SCOPE);
+        doReturn(bbNameSelectionReference).when(catalogDbClient).getBBNameSelectionReference(TEST_CONTROLLER_ACTOR,
+                TEST_SCOPE, TEST_ACTION);
+        execution.setVariable("controllerActor", TEST_CONTROLLER_ACTOR);
+        execution.setVariable("scope", TEST_SCOPE);
+        execution.setVariable("action", TEST_ACTION);
+
+        // when
+        controllerExecution.selectBB(execution);
+        // verify
+        assertEquals(TEST_BBNAME, execution.getVariable("bbName"));
+    }
+
+}
diff --git a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/GenericCDSProcessingBBTest.java b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/GenericCDSProcessingBBTest.java
new file mode 100644
index 0000000..24bbc78
--- /dev/null
+++ b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/GenericCDSProcessingBBTest.java
@@ -0,0 +1,197 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2019 Bell Canada.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.so.bpmn.infrastructure.flowspecific.tasks;
+
+import org.camunda.bpm.engine.delegate.DelegateExecution;
+import org.camunda.bpm.extension.mockito.delegate.DelegateExecutionFake;
+import org.junit.Before;
+import org.junit.Test;
+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.bpmn.infrastructure.decisionpoint.api.ControllerContext;
+import org.onap.so.bpmn.infrastructure.decisionpoint.api.ControllerRunnable;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.VfModule;
+import org.onap.so.bpmn.servicedecomposition.entities.BuildingBlock;
+import org.onap.so.bpmn.servicedecomposition.entities.ExecuteBuildingBlock;
+import org.onap.so.bpmn.servicedecomposition.entities.GeneralBuildingBlock;
+import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey;
+import org.onap.so.bpmn.servicedecomposition.generalobjects.RequestContext;
+import org.onap.so.bpmn.servicedecomposition.generalobjects.RequestParameters;
+import org.onap.so.bpmn.servicedecomposition.modelinfo.ModelInfoGenericVnf;
+import org.onap.so.bpmn.servicedecomposition.modelinfo.ModelInfoServiceInstance;
+import org.onap.so.bpmn.servicedecomposition.modelinfo.ModelInfoVfModule;
+import org.onap.so.bpmn.servicedecomposition.tasks.ExtractPojosForBB;
+import org.onap.so.client.cds.*;
+import org.onap.so.client.cds.beans.AbstractCDSPropertiesBean;
+import org.onap.so.client.exception.ExceptionBuilder;
+import org.onap.so.serviceinstancebeans.ModelInfo;
+import org.onap.so.serviceinstancebeans.Resources;
+import org.onap.so.serviceinstancebeans.Service;
+import org.onap.so.serviceinstancebeans.Vnfs;
+import org.springframework.beans.factory.annotation.Autowired;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.mockito.Mockito.*;
+
+public class GenericCDSProcessingBBTest extends BaseTaskTest {
+
+    private static final String VNF_SCOPE = "vnf";
+    private static final String TEST_VNF_MODEL_CUSTOMIZATION_UUID = "23ce9ac4-e5dd-11e9-81b4-2a2ae2dbcce4";
+    private static final String DEPLOY_ACTION_FOR_CDS = "configDeploy";
+    private static final String GENERAL_BLOCK_EXECUTION_MAP_KEY = "gBBInput";
+    private static final String BUILDING_BLOCK = "buildingBlock";
+    private static final String TEST_MSO_REQUEST_ID = "ff874603-4222-11e7-9252-005056850d2e";
+    private static final String EXECUTION_OBJECT = "executionObject";
+    private static final String BLUEPRINT_NAME = "test";
+    private static final String BLUEPRINT_VERSION = "1.0.0";
+
+    @InjectMocks
+    private GenericCDSProcessingBB controllerRunnable;
+
+    @Mock
+    private AbstractCDSProcessingBBUtils cdsDispather;
+
+    @Mock
+    private GeneratePayloadForCds generatePayloadForCds;
+
+    private BuildingBlockExecution buildingBlockExecution;
+
+    private ExecuteBuildingBlock executeBuildingBlock;
+
+    @Before
+    public void setUp() {
+        buildingBlockExecution = createBuildingBlockExecution();
+        executeBuildingBlock = new ExecuteBuildingBlock();
+    }
+
+    @Test
+    public void testExecutionObjectCreationForVnf() throws Exception {
+        // given
+        ControllerContext<BuildingBlockExecution> controllerContext = new ControllerContext<>();
+        controllerContext.setExecution(buildingBlockExecution);
+        controllerContext.setControllerActor("CDS");
+        controllerContext.setControllerScope("vnf");
+        setScopeAndAction(VNF_SCOPE, DEPLOY_ACTION_FOR_CDS);
+        AbstractCDSPropertiesBean cdsBean = prepareCDSBean();
+
+        doReturn(cdsBean).when(generatePayloadForCds).buildCdsPropertiesBean(buildingBlockExecution);
+        doNothing().when(cdsDispather).constructExecutionServiceInputObject(buildingBlockExecution);
+        doNothing().when(cdsDispather).sendRequestToCDSClient(buildingBlockExecution);
+
+        // when
+        Boolean isUnderstandable = controllerRunnable.understand(controllerContext);
+        Boolean isReady = controllerRunnable.ready(controllerContext);
+        controllerRunnable.prepare(controllerContext);
+        controllerRunnable.run(controllerContext);
+
+        // verify
+        assertEquals(isUnderstandable, true);
+        assertEquals(isReady, true);
+        AbstractCDSPropertiesBean executionObject = buildingBlockExecution.getVariable(EXECUTION_OBJECT);
+        assertNotNull(executionObject);
+        assertThat(executionObject).isInstanceOf(AbstractCDSPropertiesBean.class);
+        assertEquals(BLUEPRINT_NAME, executionObject.getBlueprintName());
+        assertEquals(BLUEPRINT_VERSION, executionObject.getBlueprintVersion());
+        assertEquals(TEST_MSO_REQUEST_ID, executionObject.getRequestId());
+        assertNotNull(executionObject.getRequestObject());
+    }
+
+    private AbstractCDSPropertiesBean prepareCDSBean() {
+        AbstractCDSPropertiesBean cdsBean = new AbstractCDSPropertiesBean();
+        cdsBean.setBlueprintName(BLUEPRINT_NAME);
+        cdsBean.setBlueprintVersion(BLUEPRINT_VERSION);
+        cdsBean.setRequestId(TEST_MSO_REQUEST_ID);
+        cdsBean.setRequestObject("requestObject");
+
+        return cdsBean;
+    }
+
+    private GeneralBuildingBlock createGeneralBuildingBlock() {
+        GeneralBuildingBlock generalBuildingBlock = new GeneralBuildingBlock();
+        RequestContext requestContext = new RequestContext();
+        RequestParameters requestParameters = new RequestParameters();
+        requestParameters.setUserParams(createRequestParameters());
+        requestContext.setRequestParameters(requestParameters);
+        requestContext.setMsoRequestId(TEST_MSO_REQUEST_ID);
+        generalBuildingBlock.setRequestContext(requestContext);
+        return generalBuildingBlock;
+    }
+
+    private List<Map<String, Object>> createRequestParameters() {
+        List<Map<String, Object>> userParams = new ArrayList<>();
+        Map<String, Object> userParamMap = new HashMap<>();
+        userParamMap.put("service", getUserParams());
+        userParams.add(userParamMap);
+        return userParams;
+    }
+
+    private Service getUserParams() {
+        Service service = new Service();
+        Resources resources = new Resources();
+        resources.setVnfs(createVnfList());
+        service.setResources(resources);
+        return service;
+    }
+
+    private List<Vnfs> createVnfList() {
+        List<Map<String, String>> instanceParamsListSearchedVnf = new ArrayList<>();
+        Map<String, String> instanceParam = new HashMap<>();
+        instanceParam.put("sec_group", "sec_group");
+        instanceParam.put("net_id", "acl-cloud-region");
+        instanceParamsListSearchedVnf.add(instanceParam);
+        Vnfs searchedVnf = createVnf(instanceParamsListSearchedVnf);
+        List<Vnfs> vnfList = new ArrayList<>();
+        vnfList.add(searchedVnf);
+        return vnfList;
+    }
+
+    private Vnfs createVnf(List<Map<String, String>> instanceParamsList) {
+        Vnfs vnf = new Vnfs();
+        ModelInfo modelInfo = new ModelInfo();
+        modelInfo.setModelCustomizationId(TEST_VNF_MODEL_CUSTOMIZATION_UUID);
+        vnf.setModelInfo(modelInfo);
+        vnf.setInstanceParams(instanceParamsList);
+        return vnf;
+    }
+
+    private BuildingBlockExecution createBuildingBlockExecution() {
+        DelegateExecution execution = new DelegateExecutionFake();
+        execution.setVariable(GENERAL_BLOCK_EXECUTION_MAP_KEY, createGeneralBuildingBlock());
+        return new DelegateExecutionImpl(execution);
+    }
+
+    private void setScopeAndAction(String scope, String action) {
+        BuildingBlock buildingBlock = new BuildingBlock();
+        buildingBlock.setBpmnScope(scope);
+        buildingBlock.setBpmnAction(action);
+        executeBuildingBlock.setBuildingBlock(buildingBlock);
+        buildingBlockExecution.setVariable(BUILDING_BLOCK, executeBuildingBlock);
+    }
+}
diff --git a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/GenericPnfCDSProcessingDETest.java b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/GenericPnfCDSProcessingDETest.java
new file mode 100644
index 0000000..c69adee
--- /dev/null
+++ b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/GenericPnfCDSProcessingDETest.java
@@ -0,0 +1,143 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2020 Nordix
+ *  ================================================================================
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ *  SPDX-License-Identifier: Apache-2.0
+ *  ============LICENSE_END=========================================================
+ */
+package org.onap.so.bpmn.infrastructure.flowspecific.tasks;
+
+import org.camunda.bpm.engine.delegate.DelegateExecution;
+import org.camunda.bpm.extension.mockito.delegate.DelegateExecutionFake;
+import org.junit.Before;
+import org.junit.ClassRule;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.onap.so.bpmn.BaseTaskTest;
+import org.onap.so.bpmn.infrastructure.decisionpoint.api.ControllerContext;
+import org.onap.so.client.cds.AbstractCDSProcessingBBUtils;
+import org.onap.so.client.cds.GeneratePayloadForCds;
+import org.onap.so.client.cds.beans.AbstractCDSPropertiesBean;
+import org.onap.so.client.exception.ExceptionBuilder;
+import org.skyscreamer.jsonassert.JSONAssert;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.rules.SpringClassRule;
+import org.springframework.test.context.junit4.rules.SpringMethodRule;
+import java.util.Arrays;
+import java.util.Collection;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.fail;
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doReturn;
+import static org.onap.so.bpmn.infrastructure.pnf.delegate.ExecutionVariableNames.*;
+
+@RunWith(Parameterized.class)
+public class GenericPnfCDSProcessingDETest extends BaseTaskTest {
+
+    @ClassRule
+    public static final SpringClassRule springClassRule = new SpringClassRule();
+
+    @Rule
+    public final SpringMethodRule smr = new SpringMethodRule();
+
+    @InjectMocks
+    private GenericPnfCDSProcessingDE controllerRunnable;
+
+    @Mock
+    private GeneratePayloadForCds generatePayloadForCds;
+
+    @Mock
+    private AbstractCDSProcessingBBUtils cdsDispather;
+
+    private static final String PRECHECK_ACTION = "precheck";
+    private static final String DOWNLOAD_ACTION = "downloadNeSw";
+    private static final String ACTIVATE_ACTION = "activateNeSw";
+    private static final String POSTCHECK_ACTION = "postcheck";
+
+    private String description;
+    private String action;
+    private String scope;
+    private String expectedJson;
+
+    public GenericPnfCDSProcessingDETest(String desc, String action, String scope, String expectedJson) {
+        this.description = desc;
+        this.action = action;
+        this.scope = scope;
+        this.expectedJson = expectedJson;
+
+    }
+
+    @Parameterized.Parameters(name = "index {0}")
+    public static Collection<String[]> data() {
+        return Arrays.asList(new String[][] {
+                {"Test JSON for action:" + PRECHECK_ACTION + " scope:pnf", PRECHECK_ACTION, "pnf",
+                        buildExpectedJson(PRECHECK_ACTION, "pnf")},
+                {"Test JSON for action:" + DOWNLOAD_ACTION + " scope:pnf", DOWNLOAD_ACTION, "pnf",
+                        buildExpectedJson(DOWNLOAD_ACTION, "pnf")},
+                {"Test JSON for action:" + ACTIVATE_ACTION + " scope:pnf", ACTIVATE_ACTION, "pnf",
+                        buildExpectedJson(ACTIVATE_ACTION, "pnf")},
+                {"Test JSON for action:" + POSTCHECK_ACTION + " scope:pnf", POSTCHECK_ACTION, "pnf",
+                        buildExpectedJson(POSTCHECK_ACTION, "pnf")},});
+    }
+
+    private static String buildExpectedJson(String action, String scope) {
+        return "{\"" + action + "-request\":" + "{\"" + action + "-" + "properties\":"
+                + "{\"service-instance-id\":\"test_service_id\","
+                + "\"pnf-customization-uuid\":\"9acb3a83-8a52-412c-9a45-901764938144\","
+                + "\"pnf-id\":\"5df8b6de-2083-11e7-93ae-92361f002671\","
+                + "\"target-software-version\":\"demo-sw-ver2.0.0\"," + "\"pnf-name\":\"PNFDemo\","
+                + "\"service-model-uuid\":\"6bc0b04d-1873-4721-b53d-6615225b2a28\"}," + "\"resolution-key\":\"PNFDemo\""
+                + "}" + "}";
+    }
+
+    private DelegateExecution execution = new DelegateExecutionFake();
+
+    @Test
+    public void testExecution_validPnf_action_executionObjectCreated() {
+        try {
+
+            // given
+            ControllerContext controllerContext = new ControllerContext();
+            controllerContext.setExecution(execution);
+            controllerContext.setControllerActor("cds");
+            controllerContext.setControllerAction(this.action);
+            controllerContext.setControllerScope(this.scope);
+            AbstractCDSPropertiesBean bean = new AbstractCDSPropertiesBean();
+            doNothing().when(cdsDispather).constructExecutionServiceInputObject(execution);
+            doNothing().when(cdsDispather).sendRequestToCDSClient(execution);
+            doReturn(bean).when(generatePayloadForCds).buildCdsPropertiesBean(execution);
+
+            // when
+            Boolean isUnderstandable = controllerRunnable.understand(controllerContext);
+            Boolean isReady = controllerRunnable.ready(controllerContext);
+            controllerRunnable.prepare(controllerContext);
+            controllerRunnable.run(controllerContext);
+
+            // verify
+            assertEquals(isUnderstandable, true);
+            assertEquals(isReady, true);
+            Object executionObject = execution.getVariable(EXECUTION_OBJECT);
+            assertThat(executionObject).isNotNull();
+            assertThat(executionObject).isInstanceOf(AbstractCDSPropertiesBean.class);
+        } catch (Exception e) {
+            e.printStackTrace();
+            fail("Exception thrown" + e.getMessage());
+        }
+    }
+}
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 8e47c34..4fdd97d 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
@@ -41,6 +41,7 @@
 import static org.mockito.ArgumentMatchers.isA;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.doAnswer;
 import static org.mockito.Mockito.when;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import java.io.IOException;
@@ -228,6 +229,77 @@
     }
 
     @Test
+    public void selectExecutionListExceptionAlreadyBuiltTest() throws Exception {
+        DelegateExecution delegateExecution = new DelegateExecutionFake();
+        String gAction = "deleteInstance";
+        String resource = "VfModule";
+        delegateExecution.setVariable("mso-request-id", "00f704ca-c5e5-4f95-a72c-6889db7b0688");
+        delegateExecution.setVariable("requestAction", gAction);
+        String bpmnRequest =
+                new String(Files.readAllBytes(Paths.get("src/test/resources/__files/VfModuleCreateWithFabric.json")));
+        delegateExecution.setVariable("bpmnRequest", bpmnRequest);
+        delegateExecution.setVariable("aLaCarte", true);
+        delegateExecution.setVariable("apiVersion", "7");
+        delegateExecution.setVariable("requestUri",
+                "v7/serviceInstances/f647e3ef-6d2e-4cd3-bff4-8df4634208de/vnfs/b80b16a5-f80d-4ffa-91c8-bd47c7438a3d/vfModules");
+
+        NorthBoundRequest northBoundRequest = new NorthBoundRequest();
+        List<OrchestrationFlow> orchFlows = createFlowList("DeactivateVfModuleBB", "DeleteVfModuleBB",
+                "UnassignVfModuleBB", "DeactivateFabricConfigurationBB", "UnassignFabricConfigurationBB");
+        northBoundRequest.setOrchestrationFlowList(orchFlows);
+
+        when(catalogDbClient.getNorthBoundRequestByActionAndIsALaCarteAndRequestScopeAndCloudOwner(gAction, resource,
+                true, "my-custom-cloud-owner")).thenReturn(northBoundRequest);
+
+        doAnswer(invocation -> {
+            DelegateExecutionFake execution = invocation.getArgument(0);
+            execution.setVariable("WorkflowException", "exception");
+            execution.setVariable("WorkflowExceptionErrorMessage", "errorMessage");
+            throw new BpmnError("WorkflowException");
+        }).when(exceptionUtil).buildAndThrowWorkflowException(delegateExecution, 7000,
+                "Exception in getConfigBuildingBlock: Multiple relationships exist from VNFC testVnfcName to Configurations");
+
+
+        org.onap.aai.domain.yang.GenericVnf vnf = new org.onap.aai.domain.yang.GenericVnf();
+        vnf.setVnfId("vnf0");
+        vnf.setModelCustomizationId("modelCustomizationId");
+        when(bbSetupUtils.getAAIGenericVnf(any())).thenReturn(vnf);
+
+        org.onap.aai.domain.yang.VfModule vfModule = new org.onap.aai.domain.yang.VfModule();
+        vfModule.setModelCustomizationId("modelCustomizationId");
+        when(bbSetupUtils.getAAIVfModule(any(), any())).thenReturn(vfModule);
+
+        List<org.onap.aai.domain.yang.Vnfc> vnfcs = new ArrayList<org.onap.aai.domain.yang.Vnfc>();
+        org.onap.aai.domain.yang.Vnfc vnfc = new org.onap.aai.domain.yang.Vnfc();
+        vnfc.setModelInvariantId("modelInvariantId");
+        vnfc.setVnfcName("testVnfcName");
+        vnfcs.add(vnfc);
+        doReturn(vnfcs).when(SPY_workflowAction).getRelatedResourcesInVfModule(any(), any(), any(), any());
+
+        List<org.onap.aai.domain.yang.Configuration> configurations =
+                new ArrayList<org.onap.aai.domain.yang.Configuration>();
+        org.onap.aai.domain.yang.Configuration configuration = new org.onap.aai.domain.yang.Configuration();
+        configuration.setConfigurationId("configurationId");
+        configuration.setModelCustomizationId("modelCustimizationId");
+        configuration.setConfigurationName("testConfigurationName");
+        configurations.add(configuration);
+        org.onap.aai.domain.yang.Configuration configuration1 = new org.onap.aai.domain.yang.Configuration();
+        configuration1.setConfigurationId("configurationId");
+        configuration1.setModelCustomizationId("modelCustimizationId");
+        configuration1.setConfigurationName("testConfigurationName");
+        configurations.add(configuration1);
+        doReturn(configurations).when(SPY_workflowAction).getRelatedResourcesInVnfc(any(), any(), any());
+
+        doReturn("testName").when(SPY_workflowAction).getVnfcNameForConfiguration(any());
+
+        thrown.expect(BpmnError.class);
+        SPY_workflowAction.selectExecutionList(delegateExecution);
+        assertEquals(
+                "Exception in getConfigBuildingBlock: Multiple relationships exist from VNFC testVnfcName to Configurations",
+                delegateExecution.getVariable("WorkflowException"));
+    }
+
+    @Test
     public void selectExecutionListDuplicateNameExceptionTest() throws Exception {
         String gAction = "createInstance";
         execution.setVariable("mso-request-id", "00f704ca-c5e5-4f95-a72c-6889db7b0688");
diff --git a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/listeners/SkipCDSBuildingBlockListenerTest.java b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/listeners/SkipCDSBuildingBlockListenerTest.java
new file mode 100644
index 0000000..fb162f8
--- /dev/null
+++ b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/listeners/SkipCDSBuildingBlockListenerTest.java
@@ -0,0 +1,202 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2020  Tech Mahindra
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.bpmn.infrastructure.workflow.tasks.listeners;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.when;
+import java.util.ArrayList;
+import java.util.List;
+import org.camunda.bpm.extension.mockito.delegate.DelegateExecutionFake;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+import org.onap.so.bpmn.common.BBConstants;
+import org.onap.so.bpmn.common.BuildingBlockExecution;
+import org.onap.so.bpmn.common.DelegateExecutionImpl;
+import org.onap.so.bpmn.servicedecomposition.entities.BuildingBlock;
+import org.onap.so.bpmn.servicedecomposition.entities.ExecuteBuildingBlock;
+import org.onap.so.db.catalog.beans.VfModuleCustomization;
+import org.onap.so.db.catalog.beans.VnfResourceCustomization;
+import org.onap.so.db.catalog.client.CatalogDbClient;
+import org.onap.so.serviceinstancebeans.ModelInfo;
+import org.onap.so.serviceinstancebeans.RequestDetails;
+
+@RunWith(MockitoJUnitRunner.Silent.class)
+public class SkipCDSBuildingBlockListenerTest {
+
+    private static final String VNF_SCOPE = "VNF";
+    private static final String VF_SCOPE = "VFModule";
+    private static final String TEST_MODELUUID = "123456789";
+    private static final String VNF_TEST_ACTION = "VnfConfigAssign";
+    private static final String VFModule_TEST_ACTION = "VfModuleConfigAssign";
+    private static final String MODELCUSTOMIZATIONUUID = "123456789";
+    private static final String BBNAME = "ControllerExecutionBB";
+    private static final boolean ISFIRST = true;
+
+    private int actual;
+    private List<ExecuteBuildingBlock> flowsToExecute = new ArrayList<>();
+    private List<VnfResourceCustomization> vnfResourceCustomization;
+    private List<VfModuleCustomization> vfModuleCustomization;
+    private ExecuteBuildingBlock executeBuildingBlock = new ExecuteBuildingBlock();
+    private RequestDetails reqDetail = new RequestDetails();
+    private BuildingBlockExecution buildingBlockExecution = new DelegateExecutionImpl(new DelegateExecutionFake());
+    private VnfResourceCustomization vnfCust = new VnfResourceCustomization();
+    private VfModuleCustomization vfCust = new VfModuleCustomization();
+    private BuildingBlock buildingBlock = new BuildingBlock();
+
+    @InjectMocks
+    private SkipCDSBuildingBlockListener skipCDSBuildingBlockListener;
+    @Mock
+    private CatalogDbClient catalogDbClient;
+
+    @Before
+    public void before() {
+        ModelInfo model = new ModelInfo();
+        model.setModelUuid(TEST_MODELUUID);
+        reqDetail.setModelInfo(model);
+        executeBuildingBlock.setRequestDetails(reqDetail);
+    }
+
+    @Test
+    public void testTrigger() {
+        BuildingBlockExecution execution = new DelegateExecutionImpl(new DelegateExecutionFake());
+        skipCDSBuildingBlockListener.shouldRunFor(BBNAME, ISFIRST, execution);
+        assertEquals("ControllerExecutionBB", BBNAME);
+    }
+
+    @Test
+    public void testProcessForVNFToSkipCDSBB() {
+        // given
+        setBuildingBlockAndCurrentSequence(VNF_SCOPE, VNF_TEST_ACTION, 0);
+        vnfResourceCustomization = getVnfResourceCustomizationList(true);
+
+        when(catalogDbClient.getVnfResourceCustomizationByModelUuid(
+                executeBuildingBlock.getRequestDetails().getModelInfo().getModelUuid()))
+                        .thenReturn(vnfResourceCustomization);
+        when(catalogDbClient.findVnfResourceCustomizationInList(executeBuildingBlock.getBuildingBlock().getKey(),
+                vnfResourceCustomization)).thenReturn(vnfCust);
+
+        // when
+        skipCDSBuildingBlockListener.run(flowsToExecute, executeBuildingBlock, buildingBlockExecution);
+
+        // then
+        actual = buildingBlockExecution.getVariable(BBConstants.G_CURRENT_SEQUENCE);
+        assertEquals(1, actual);
+
+    }
+
+    @Test
+    public void testProcessForVNFNotToSkipCDSBB() {
+        // given
+        setBuildingBlockAndCurrentSequence(VNF_SCOPE, VNF_TEST_ACTION, 0);
+        vnfResourceCustomization = getVnfResourceCustomizationList(false);
+
+        when(catalogDbClient.getVnfResourceCustomizationByModelUuid(
+                executeBuildingBlock.getRequestDetails().getModelInfo().getModelUuid()))
+                        .thenReturn(vnfResourceCustomization);
+        when(catalogDbClient.findVnfResourceCustomizationInList(executeBuildingBlock.getBuildingBlock().getKey(),
+                vnfResourceCustomization)).thenReturn(vnfCust);
+
+        // when
+        skipCDSBuildingBlockListener.run(flowsToExecute, executeBuildingBlock, buildingBlockExecution);
+
+        // then
+        actual = buildingBlockExecution.getVariable(BBConstants.G_CURRENT_SEQUENCE);
+        assertEquals(0, actual);
+
+    }
+
+
+    @Test
+    public void testProcessForVFToSkipCDSBB() {
+        // given
+        setBuildingBlockAndCurrentSequence(VF_SCOPE, VFModule_TEST_ACTION, 0);
+        vfModuleCustomization = getVfModuleCustomizationList(true);
+
+        when(catalogDbClient
+                .getVfModuleCustomizationByModelCuztomizationUUID(executeBuildingBlock.getBuildingBlock().getKey()))
+                        .thenReturn(vfCust);
+
+        // when
+        skipCDSBuildingBlockListener.run(flowsToExecute, executeBuildingBlock, buildingBlockExecution);
+
+        // then
+        actual = buildingBlockExecution.getVariable(BBConstants.G_CURRENT_SEQUENCE);
+        assertEquals(1, actual);
+
+    }
+
+    @Test
+    public void testProcessForVFNotToSkipCDSBB() {
+        // given
+        setBuildingBlockAndCurrentSequence(VF_SCOPE, VFModule_TEST_ACTION, 0);
+        vfModuleCustomization = getVfModuleCustomizationList(false);
+
+        when(catalogDbClient
+                .getVfModuleCustomizationByModelCuztomizationUUID(executeBuildingBlock.getBuildingBlock().getKey()))
+                        .thenReturn(vfCust);
+
+        // when
+        skipCDSBuildingBlockListener.run(flowsToExecute, executeBuildingBlock, buildingBlockExecution);
+
+        // then
+        actual = buildingBlockExecution.getVariable(BBConstants.G_CURRENT_SEQUENCE);
+        assertEquals(0, actual);
+
+    }
+
+    /**
+     * setting scope action in buildingBlock and BB current sequence in BuildingBlockExecution
+     *
+     * @param scope
+     * @param action
+     * @param squence
+     */
+    private void setBuildingBlockAndCurrentSequence(String scope, String action, int sequence) {
+        buildingBlock.setBpmnScope(scope);
+        buildingBlock.setBpmnAction(action);
+        buildingBlock.setBpmnFlowName("ControllerExecutionBB");
+        buildingBlock.setKey(MODELCUSTOMIZATIONUUID);
+        executeBuildingBlock.setBuildingBlock(buildingBlock);
+        buildingBlockExecution.setVariable(BBConstants.G_CURRENT_SEQUENCE, sequence);
+
+    }
+
+    private List<VnfResourceCustomization> getVnfResourceCustomizationList(boolean setSkippost) {
+        List<VnfResourceCustomization> vnfResourceCustomizations = new ArrayList<>();
+        vnfCust.setModelCustomizationUUID(MODELCUSTOMIZATIONUUID);
+        vnfCust.setSkipPostInstConf(setSkippost);
+        vnfResourceCustomizations.add(vnfCust);
+        return vnfResourceCustomizations;
+    }
+
+    private List<VfModuleCustomization> getVfModuleCustomizationList(boolean setSkippost) {
+        List<VfModuleCustomization> vfModuleCustomizations = new ArrayList<>();
+        vfCust.setModelCustomizationUUID(MODELCUSTOMIZATIONUUID);
+        vfCust.setSkipPostInstConf(setSkippost);
+        vfModuleCustomizations.add(vfCust);
+        return vfModuleCustomizations;
+    }
+
+}
diff --git a/common/src/main/java/org/onap/so/beans/nsmf/ActDeActNssi.java b/common/src/main/java/org/onap/so/beans/nsmf/ActDeActNssi.java
new file mode 100644
index 0000000..8d45048
--- /dev/null
+++ b/common/src/main/java/org/onap/so/beans/nsmf/ActDeActNssi.java
@@ -0,0 +1,51 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.beans.nsmf;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class ActDeActNssi {
+
+    public final static String ACT_URL = "/api/rest/provMns/v1/NSS/%s" + "/activation";
+
+    public final static String DE_ACT_URL = "/api/rest/provMns/v1/NSS/%s" + "/deactivation";
+
+    private String nsiId;
+
+    private String nssiId;
+
+    public String getNsiId() {
+        return nsiId;
+    }
+
+    public void setNsiId(String nsiId) {
+        this.nsiId = nsiId;
+    }
+
+    public String getNssiId() {
+        return nssiId;
+    }
+
+    public void setNssiId(String nssiId) {
+        this.nssiId = nssiId;
+    }
+}
diff --git a/common/src/main/java/org/onap/so/beans/nsmf/AllocateAnNssi.java b/common/src/main/java/org/onap/so/beans/nsmf/AllocateAnNssi.java
new file mode 100644
index 0000000..484f5b4
--- /dev/null
+++ b/common/src/main/java/org/onap/so/beans/nsmf/AllocateAnNssi.java
@@ -0,0 +1,109 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.beans.nsmf;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class AllocateAnNssi {
+
+    public final static String URL = "/api/rest/provMns/v1/an/NSS" + "/SliceProfiles";
+
+    private String nsstId;
+
+    private String flavorId;
+
+    private String nssiId;
+
+    private String nssiName;
+
+    private AnSliceProfile sliceProfile;
+
+    private String scriptName;
+
+    private Object extension;
+
+    private NsiInfo nsiInfo;
+
+    public String getNsstId() {
+        return nsstId;
+    }
+
+    public void setNsstId(String nsstId) {
+        this.nsstId = nsstId;
+    }
+
+    public String getFlavorId() {
+        return flavorId;
+    }
+
+    public void setFlavorId(String flavorId) {
+        this.flavorId = flavorId;
+    }
+
+    public String getNssiId() {
+        return nssiId;
+    }
+
+    public void setNssiId(String nssiId) {
+        this.nssiId = nssiId;
+    }
+
+    public String getNssiName() {
+        return nssiName;
+    }
+
+    public void setNssiName(String nssiName) {
+        this.nssiName = nssiName;
+    }
+
+    public AnSliceProfile getSliceProfile() {
+        return sliceProfile;
+    }
+
+    public void setSliceProfile(AnSliceProfile sliceProfile) {
+        this.sliceProfile = sliceProfile;
+    }
+
+    public String getScriptName() {
+        return scriptName;
+    }
+
+    public void setScriptName(String scriptName) {
+        this.scriptName = scriptName;
+    }
+
+    public Object getExtension() {
+        return extension;
+    }
+
+    public void setExtension(Object extension) {
+        this.extension = extension;
+    }
+
+    public NsiInfo getNsiInfo() {
+        return nsiInfo;
+    }
+
+    public void setNsiInfo(NsiInfo nsiInfo) {
+        this.nsiInfo = nsiInfo;
+    }
+}
diff --git a/common/src/main/java/org/onap/so/beans/nsmf/AllocateCnNssi.java b/common/src/main/java/org/onap/so/beans/nsmf/AllocateCnNssi.java
new file mode 100644
index 0000000..d036733
--- /dev/null
+++ b/common/src/main/java/org/onap/so/beans/nsmf/AllocateCnNssi.java
@@ -0,0 +1,110 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.beans.nsmf;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import java.io.Serializable;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class AllocateCnNssi implements Serializable {
+
+    public final static String URL = "/api/rest/provMns/v1/NSS/SliceProfiles";
+
+    private String nsstId;
+
+    private String flavorId;
+
+    private String nssiId;
+
+    private String nssiName;
+
+    private CnSliceProfile sliceProfile;
+
+    private String scriptName;
+
+    private Object extension;
+
+    private NsiInfo nsiInfo;
+
+    public NsiInfo getNsiInfo() {
+        return nsiInfo;
+    }
+
+    public void setNsiInfo(NsiInfo nsiInfo) {
+        this.nsiInfo = nsiInfo;
+    }
+
+    public String getNsstId() {
+        return nsstId;
+    }
+
+    public void setNsstId(String nsstId) {
+        this.nsstId = nsstId;
+    }
+
+    public String getScriptName() {
+        return scriptName;
+    }
+
+    public void setScriptName(String scriptName) {
+        this.scriptName = scriptName;
+    }
+
+    public CnSliceProfile getSliceProfile() {
+        return sliceProfile;
+    }
+
+    public void setSliceProfile(CnSliceProfile sliceProfile) {
+        this.sliceProfile = sliceProfile;
+    }
+
+    public String getFlavorId() {
+        return flavorId;
+    }
+
+    public void setFlavorId(String flavorId) {
+        this.flavorId = flavorId;
+    }
+
+    public String getNssiId() {
+        return nssiId;
+    }
+
+    public void setNssiId(String nssiId) {
+        this.nssiId = nssiId;
+    }
+
+    public String getNssiName() {
+        return nssiName;
+    }
+
+    public void setNssiName(String nssiName) {
+        this.nssiName = nssiName;
+    }
+
+    public void setExtension(Object extension) {
+        this.extension = extension;
+    }
+
+    public Object getExtension() {
+        return extension;
+    }
+}
diff --git a/common/src/main/java/org/onap/so/beans/nsmf/AllocateTnNssi.java b/common/src/main/java/org/onap/so/beans/nsmf/AllocateTnNssi.java
new file mode 100644
index 0000000..b66fb13
--- /dev/null
+++ b/common/src/main/java/org/onap/so/beans/nsmf/AllocateTnNssi.java
@@ -0,0 +1,109 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.beans.nsmf;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class AllocateTnNssi {
+
+    public final static String URL = "/api/rest/provMns/v1/tn/NSS" + "/SliceProfiles";
+
+    private String nsstId;
+
+    private String flavorId;
+
+    private String nssiId;
+
+    private String nssiName;
+
+    private TnSliceProfile sliceProfile;
+
+    private String scriptName;
+
+    private Object extension;
+
+    private NsiInfo nsiInfo;
+
+    public String getNsstId() {
+        return nsstId;
+    }
+
+    public void setNsstId(String nsstId) {
+        this.nsstId = nsstId;
+    }
+
+    public String getFlavorId() {
+        return flavorId;
+    }
+
+    public void setFlavorId(String flavorId) {
+        this.flavorId = flavorId;
+    }
+
+    public String getNssiId() {
+        return nssiId;
+    }
+
+    public void setNssiId(String nssiId) {
+        this.nssiId = nssiId;
+    }
+
+    public String getNssiName() {
+        return nssiName;
+    }
+
+    public void setNssiName(String nssiName) {
+        this.nssiName = nssiName;
+    }
+
+    public TnSliceProfile getSliceProfile() {
+        return sliceProfile;
+    }
+
+    public void setSliceProfile(TnSliceProfile sliceProfile) {
+        this.sliceProfile = sliceProfile;
+    }
+
+    public String getScriptName() {
+        return scriptName;
+    }
+
+    public void setScriptName(String scriptName) {
+        this.scriptName = scriptName;
+    }
+
+    public Object getExtension() {
+        return extension;
+    }
+
+    public void setExtension(Object extension) {
+        this.extension = extension;
+    }
+
+    public NsiInfo getNsiInfo() {
+        return nsiInfo;
+    }
+
+    public void setNsiInfo(NsiInfo nsiInfo) {
+        this.nsiInfo = nsiInfo;
+    }
+}
diff --git a/common/src/main/java/org/onap/so/beans/nsmf/AnSliceProfile.java b/common/src/main/java/org/onap/so/beans/nsmf/AnSliceProfile.java
new file mode 100644
index 0000000..3d60949
--- /dev/null
+++ b/common/src/main/java/org/onap/so/beans/nsmf/AnSliceProfile.java
@@ -0,0 +1,61 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.beans.nsmf;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import java.util.List;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class AnSliceProfile {
+
+    @JsonProperty("5QI")
+    private String qi;
+
+    private List<String> coverageAreaTAList;
+
+    @JsonInclude(JsonInclude.Include.NON_DEFAULT)
+    private int latency;
+
+    public String getQi() {
+        return qi;
+    }
+
+    public void setQi(String qi) {
+        this.qi = qi;
+    }
+
+    public List<String> getCoverageAreaTAList() {
+        return coverageAreaTAList;
+    }
+
+    public void setCoverageAreaTAList(List<String> coverageAreaTAList) {
+        this.coverageAreaTAList = coverageAreaTAList;
+    }
+
+    public int getLatency() {
+        return latency;
+    }
+
+    public void setLatency(int latency) {
+        this.latency = latency;
+    }
+}
diff --git a/common/src/main/java/org/onap/so/beans/nsmf/CnSliceProfile.java b/common/src/main/java/org/onap/so/beans/nsmf/CnSliceProfile.java
new file mode 100644
index 0000000..3bd155d
--- /dev/null
+++ b/common/src/main/java/org/onap/so/beans/nsmf/CnSliceProfile.java
@@ -0,0 +1,120 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.beans.nsmf;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import java.util.List;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class CnSliceProfile {
+
+    private List<String> snssaiList;
+
+    private String sliceProfileId;
+
+    private List<String> plmnIdList;
+
+    private PerfReq perfReq;
+
+    @JsonInclude(JsonInclude.Include.NON_DEFAULT)
+    private int maxNumberofUEs;
+
+    private List<String> coverageAreaTAList;
+
+    @JsonInclude(JsonInclude.Include.NON_DEFAULT)
+    private int latency;
+
+    private UeMobilityLevel ueMobilityLevel;
+
+    private ResourceSharingLevel resourceSharingLevel;
+
+    public String getSliceProfileId() {
+        return sliceProfileId;
+    }
+
+    public void setSliceProfileId(String sliceProfileId) {
+        this.sliceProfileId = sliceProfileId;
+    }
+
+    public List<String> getPlmnIdList() {
+        return plmnIdList;
+    }
+
+    public void setPlmnIdList(List<String> plmnIdList) {
+        this.plmnIdList = plmnIdList;
+    }
+
+    public PerfReq getPerfReq() {
+        return perfReq;
+    }
+
+    public void setPerfReq(PerfReq perfReq) {
+        this.perfReq = perfReq;
+    }
+
+    public int getMaxNumberofUEs() {
+        return maxNumberofUEs;
+    }
+
+    public void setMaxNumberofUEs(int maxNumberofUEs) {
+        this.maxNumberofUEs = maxNumberofUEs;
+    }
+
+    public List<String> getCoverageAreaTAList() {
+        return coverageAreaTAList;
+    }
+
+    public void setCoverageAreaTAList(List<String> coverageAreaTAList) {
+        this.coverageAreaTAList = coverageAreaTAList;
+    }
+
+    public int getLatency() {
+        return latency;
+    }
+
+    public void setLatency(int latency) {
+        this.latency = latency;
+    }
+
+    public UeMobilityLevel getUeMobilityLevel() {
+        return ueMobilityLevel;
+    }
+
+    public void setUeMobilityLevel(UeMobilityLevel ueMobilityLevel) {
+        this.ueMobilityLevel = ueMobilityLevel;
+    }
+
+    public ResourceSharingLevel getResourceSharingLevel() {
+        return resourceSharingLevel;
+    }
+
+    public void setResourceSharingLevel(ResourceSharingLevel resourceSharingLevel) {
+        this.resourceSharingLevel = resourceSharingLevel;
+    }
+
+    public List<String> getSnssaiList() {
+        return snssaiList;
+    }
+
+    public void setSnssaiList(List<String> snssaiList) {
+        this.snssaiList = snssaiList;
+    }
+}
diff --git a/common/src/main/java/org/onap/so/beans/nsmf/CreateCnNssi.java b/common/src/main/java/org/onap/so/beans/nsmf/CreateCnNssi.java
new file mode 100644
index 0000000..4249669
--- /dev/null
+++ b/common/src/main/java/org/onap/so/beans/nsmf/CreateCnNssi.java
@@ -0,0 +1,89 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.beans.nsmf;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class CreateCnNssi {
+
+    public final static String URL = "/api/rest/provMns/v1/NSS/nssi";
+
+    private String nsstId;
+
+    private String flavorId;
+
+    private String nssiName;
+
+    private String scriptName;
+
+    private String extension;
+
+    private NsiInfo nsiInfo;
+
+    public String getNsstId() {
+        return nsstId;
+    }
+
+    public void setNsstId(String nsstId) {
+        this.nsstId = nsstId;
+    }
+
+    public String getFlavorId() {
+        return flavorId;
+    }
+
+    public void setFlavorId(String flavorId) {
+        this.flavorId = flavorId;
+    }
+
+    public String getNssiName() {
+        return nssiName;
+    }
+
+    public void setNssiName(String nssiName) {
+        this.nssiName = nssiName;
+    }
+
+    public String getScriptName() {
+        return scriptName;
+    }
+
+    public void setScriptName(String scriptName) {
+        this.scriptName = scriptName;
+    }
+
+    public String getExtension() {
+        return extension;
+    }
+
+    public void setExtension(String extension) {
+        this.extension = extension;
+    }
+
+    public NsiInfo getNsiInfo() {
+        return nsiInfo;
+    }
+
+    public void setNsiInfo(NsiInfo nsiInfo) {
+        this.nsiInfo = nsiInfo;
+    }
+}
diff --git a/common/src/main/java/org/onap/so/beans/nsmf/DeAllocateNssi.java b/common/src/main/java/org/onap/so/beans/nsmf/DeAllocateNssi.java
new file mode 100644
index 0000000..648fd49
--- /dev/null
+++ b/common/src/main/java/org/onap/so/beans/nsmf/DeAllocateNssi.java
@@ -0,0 +1,91 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.beans.nsmf;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import java.util.List;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class DeAllocateNssi {
+
+    public final static String URL = "/api/rest/provMns/v1/NSS" + "/SliceProfiles/%s";
+
+    private String nsiId;
+
+    private String nssiId;
+
+    private List<String> snssaiList;
+
+    @JsonInclude(JsonInclude.Include.NON_DEFAULT)
+    private int terminateNssiOption;
+
+    private String scriptName;
+
+    private String extension;
+
+    public String getNsiId() {
+        return nsiId;
+    }
+
+    public void setNsiId(String nsiId) {
+        this.nsiId = nsiId;
+    }
+
+    public String getNssiId() {
+        return nssiId;
+    }
+
+    public void setNssiId(String nssiId) {
+        this.nssiId = nssiId;
+    }
+
+    public List<String> getSnssaiList() {
+        return snssaiList;
+    }
+
+    public void setSnssaiList(List<String> snssaiList) {
+        this.snssaiList = snssaiList;
+    }
+
+    public int getTerminateNssiOption() {
+        return terminateNssiOption;
+    }
+
+    public void setTerminateNssiOption(int terminateNssiOption) {
+        this.terminateNssiOption = terminateNssiOption;
+    }
+
+    public String getScriptName() {
+        return scriptName;
+    }
+
+    public void setScriptName(String scriptName) {
+        this.scriptName = scriptName;
+    }
+
+    public String getExtension() {
+        return extension;
+    }
+
+    public void setExtension(String extension) {
+        this.extension = extension;
+    }
+}
diff --git a/common/src/main/java/org/onap/so/beans/nsmf/EsrInfo.java b/common/src/main/java/org/onap/so/beans/nsmf/EsrInfo.java
new file mode 100644
index 0000000..c124bfa
--- /dev/null
+++ b/common/src/main/java/org/onap/so/beans/nsmf/EsrInfo.java
@@ -0,0 +1,47 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.beans.nsmf;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class EsrInfo {
+
+    private String vendor;
+
+    private NetworkType networkType;
+
+    public String getVendor() {
+        return vendor;
+    }
+
+    public void setVendor(String vendor) {
+        this.vendor = vendor;
+    }
+
+    public NetworkType getNetworkType() {
+        return networkType;
+    }
+
+    public void setNetworkType(NetworkType networkType) {
+        this.networkType = networkType;
+    }
+}
diff --git a/common/src/main/java/org/onap/so/beans/nsmf/JobStatusRequest.java b/common/src/main/java/org/onap/so/beans/nsmf/JobStatusRequest.java
new file mode 100644
index 0000000..cc8503c
--- /dev/null
+++ b/common/src/main/java/org/onap/so/beans/nsmf/JobStatusRequest.java
@@ -0,0 +1,70 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.beans.nsmf;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class JobStatusRequest {
+
+    public final static String URL = "/api/rest/provMns/v1/NSS/jobs/%s";
+
+    private String nsiId;
+
+    private String nssiId;
+
+    private String responseId;
+
+    private EsrInfo esrInfo;
+
+    public String getNsiId() {
+        return nsiId;
+    }
+
+    public void setNsiId(String nsiId) {
+        this.nsiId = nsiId;
+    }
+
+    public String getNssiId() {
+        return nssiId;
+    }
+
+    public void setNssiId(String nssiId) {
+        this.nssiId = nssiId;
+    }
+
+
+    public String getResponseId() {
+        return responseId;
+    }
+
+    public void setResponseId(String responseId) {
+        this.responseId = responseId;
+    }
+
+    public EsrInfo getEsrInfo() {
+        return esrInfo;
+    }
+
+    public void setEsrInfo(EsrInfo esrInfo) {
+        this.esrInfo = esrInfo;
+    }
+}
diff --git a/common/src/main/java/org/onap/so/beans/nsmf/JobStatusResponse.java b/common/src/main/java/org/onap/so/beans/nsmf/JobStatusResponse.java
new file mode 100644
index 0000000..9259d51
--- /dev/null
+++ b/common/src/main/java/org/onap/so/beans/nsmf/JobStatusResponse.java
@@ -0,0 +1,37 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.beans.nsmf;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class JobStatusResponse {
+
+    private ResponseDescriptor responseDescriptor;
+
+    public ResponseDescriptor getResponseDescriptor() {
+        return responseDescriptor;
+    }
+
+    public void setResponseDescriptor(ResponseDescriptor responseDescriptor) {
+        this.responseDescriptor = responseDescriptor;
+    }
+}
diff --git a/common/src/main/java/org/onap/so/beans/nsmf/NetworkType.java b/common/src/main/java/org/onap/so/beans/nsmf/NetworkType.java
new file mode 100644
index 0000000..2e10fe5
--- /dev/null
+++ b/common/src/main/java/org/onap/so/beans/nsmf/NetworkType.java
@@ -0,0 +1,58 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.beans.nsmf;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonValue;
+
+public enum NetworkType {
+
+    ACCESS("an"),
+
+    CORE("cn"),
+
+    TRANSPORT("tn");
+
+    private String networkType;
+
+    NetworkType(String networkType) {
+        this.networkType = networkType;
+    }
+
+    @JsonValue
+    public String getNetworkType() {
+        return networkType;
+    }
+
+    @JsonCreator
+    public NetworkType forValue(String value) {
+        return valueOf(value);
+    }
+
+    public static NetworkType fromString(String value) {
+        for (NetworkType nType : NetworkType.values()) {
+            if (nType.networkType.equalsIgnoreCase(value)) {
+                return nType;
+            }
+        }
+        return null;
+    }
+}
diff --git a/common/src/main/java/org/onap/so/beans/nsmf/NewNsst.java b/common/src/main/java/org/onap/so/beans/nsmf/NewNsst.java
new file mode 100644
index 0000000..e13aa50
--- /dev/null
+++ b/common/src/main/java/org/onap/so/beans/nsmf/NewNsst.java
@@ -0,0 +1,47 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2019 Huawei Technologies Co., Ltd. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.beans.nsmf;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class NewNsst {
+
+    private String nsstId;
+
+    private String flavorId;
+
+    public String getNsstId() {
+        return nsstId;
+    }
+
+    public void setNsstId(String nsstId) {
+        this.nsstId = nsstId;
+    }
+
+    public String getFlavorId() {
+        return flavorId;
+    }
+
+    public void setFlavorId(String flavorId) {
+        this.flavorId = flavorId;
+    }
+}
diff --git a/common/src/main/java/org/onap/so/beans/nsmf/NsiInfo.java b/common/src/main/java/org/onap/so/beans/nsmf/NsiInfo.java
new file mode 100644
index 0000000..0ff554d
--- /dev/null
+++ b/common/src/main/java/org/onap/so/beans/nsmf/NsiInfo.java
@@ -0,0 +1,47 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.beans.nsmf;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class NsiInfo {
+
+    private String nsiName;
+
+    private String nsiId;
+
+    public String getNsiName() {
+        return nsiName;
+    }
+
+    public void setNsiName(String nsiName) {
+        this.nsiName = nsiName;
+    }
+
+    public void setNsiId(String nsiId) {
+        this.nsiId = nsiId;
+    }
+
+    public String getNsiId() {
+        return nsiId;
+    }
+}
diff --git a/common/src/main/java/org/onap/so/beans/nsmf/NssiActDeActRequest.java b/common/src/main/java/org/onap/so/beans/nsmf/NssiActDeActRequest.java
new file mode 100644
index 0000000..fbba8c7
--- /dev/null
+++ b/common/src/main/java/org/onap/so/beans/nsmf/NssiActDeActRequest.java
@@ -0,0 +1,47 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.beans.nsmf;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class NssiActDeActRequest {
+
+    private EsrInfo esrInfo;
+
+    private ActDeActNssi actDeActNssi;
+
+    public ActDeActNssi getActDeActNssi() {
+        return actDeActNssi;
+    }
+
+    public void setActDeActNssi(ActDeActNssi actDeActNssi) {
+        this.actDeActNssi = actDeActNssi;
+    }
+
+    public EsrInfo getEsrInfo() {
+        return esrInfo;
+    }
+
+    public void setEsrInfo(EsrInfo esrInfo) {
+        this.esrInfo = esrInfo;
+    }
+}
diff --git a/common/src/main/java/org/onap/so/beans/nsmf/NssiAllocateRequest.java b/common/src/main/java/org/onap/so/beans/nsmf/NssiAllocateRequest.java
new file mode 100644
index 0000000..f72a74a
--- /dev/null
+++ b/common/src/main/java/org/onap/so/beans/nsmf/NssiAllocateRequest.java
@@ -0,0 +1,67 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.beans.nsmf;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class NssiAllocateRequest {
+
+    private EsrInfo esrInfo;
+
+    private AllocateCnNssi allocateCnNssi;
+
+    private AllocateTnNssi allocateTnNssi;
+
+    private AllocateAnNssi allocateAnNssi;
+
+    public EsrInfo getEsrInfo() {
+        return esrInfo;
+    }
+
+    public void setEsrInfo(EsrInfo esrInfo) {
+        this.esrInfo = esrInfo;
+    }
+
+    public AllocateCnNssi getAllocateCnNssi() {
+        return allocateCnNssi;
+    }
+
+    public void setAllocateCnNssi(AllocateCnNssi allocateCnNssi) {
+        this.allocateCnNssi = allocateCnNssi;
+    }
+
+    public AllocateTnNssi getAllocateTnNssi() {
+        return allocateTnNssi;
+    }
+
+    public void setAllocateTnNssi(AllocateTnNssi allocateTnNssi) {
+        this.allocateTnNssi = allocateTnNssi;
+    }
+
+    public AllocateAnNssi getAllocateAnNssi() {
+        return allocateAnNssi;
+    }
+
+    public void setAllocateAnNssi(AllocateAnNssi allocateAnNssi) {
+        this.allocateAnNssi = allocateAnNssi;
+    }
+}
diff --git a/common/src/main/java/org/onap/so/beans/nsmf/NssiCreateRequest.java b/common/src/main/java/org/onap/so/beans/nsmf/NssiCreateRequest.java
new file mode 100644
index 0000000..ca26e9f
--- /dev/null
+++ b/common/src/main/java/org/onap/so/beans/nsmf/NssiCreateRequest.java
@@ -0,0 +1,47 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.beans.nsmf;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class NssiCreateRequest {
+
+    private EsrInfo esrInfo;
+
+    private CreateCnNssi createCnNssi;
+
+    public EsrInfo getEsrInfo() {
+        return esrInfo;
+    }
+
+    public void setEsrInfo(EsrInfo esrInfo) {
+        this.esrInfo = esrInfo;
+    }
+
+    public CreateCnNssi getCreateCnNssi() {
+        return createCnNssi;
+    }
+
+    public void setCreateCnNssi(CreateCnNssi createCnNssi) {
+        this.createCnNssi = createCnNssi;
+    }
+}
diff --git a/common/src/main/java/org/onap/so/beans/nsmf/NssiDeAllocateRequest.java b/common/src/main/java/org/onap/so/beans/nsmf/NssiDeAllocateRequest.java
new file mode 100644
index 0000000..bbfc30c
--- /dev/null
+++ b/common/src/main/java/org/onap/so/beans/nsmf/NssiDeAllocateRequest.java
@@ -0,0 +1,47 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.beans.nsmf;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class NssiDeAllocateRequest {
+
+    private DeAllocateNssi deAllocateNssi;
+
+    private EsrInfo esrInfo;
+
+    public DeAllocateNssi getDeAllocateNssi() {
+        return deAllocateNssi;
+    }
+
+    public void setDeAllocateNssi(DeAllocateNssi deAllocateNssi) {
+        this.deAllocateNssi = deAllocateNssi;
+    }
+
+    public EsrInfo getEsrInfo() {
+        return esrInfo;
+    }
+
+    public void setEsrInfo(EsrInfo esrInfo) {
+        this.esrInfo = esrInfo;
+    }
+}
diff --git a/common/src/main/java/org/onap/so/beans/nsmf/NssiResponse.java b/common/src/main/java/org/onap/so/beans/nsmf/NssiResponse.java
new file mode 100644
index 0000000..66368be
--- /dev/null
+++ b/common/src/main/java/org/onap/so/beans/nsmf/NssiResponse.java
@@ -0,0 +1,47 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.beans.nsmf;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class NssiResponse {
+
+    private String nssiId;
+
+    private String jobId;
+
+    public String getNssiId() {
+        return nssiId;
+    }
+
+    public void setNssiId(String nssiId) {
+        this.nssiId = nssiId;
+    }
+
+    public String getJobId() {
+        return jobId;
+    }
+
+    public void setJobId(String jobId) {
+        this.jobId = jobId;
+    }
+}
diff --git a/common/src/main/java/org/onap/so/beans/nsmf/NssiTerminateRequest.java b/common/src/main/java/org/onap/so/beans/nsmf/NssiTerminateRequest.java
new file mode 100644
index 0000000..df0a463
--- /dev/null
+++ b/common/src/main/java/org/onap/so/beans/nsmf/NssiTerminateRequest.java
@@ -0,0 +1,47 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.beans.nsmf;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class NssiTerminateRequest {
+
+    private TerminateNssi terminateNssi;
+
+    private EsrInfo esrInfo;
+
+    public TerminateNssi getTerminateNssi() {
+        return terminateNssi;
+    }
+
+    public void setTerminateNssi(TerminateNssi terminateNssi) {
+        this.terminateNssi = terminateNssi;
+    }
+
+    public EsrInfo getEsrInfo() {
+        return esrInfo;
+    }
+
+    public void setEsrInfo(EsrInfo esrInfo) {
+        this.esrInfo = esrInfo;
+    }
+}
diff --git a/common/src/main/java/org/onap/so/beans/nsmf/NssiUpdateRequest.java b/common/src/main/java/org/onap/so/beans/nsmf/NssiUpdateRequest.java
new file mode 100644
index 0000000..6642734
--- /dev/null
+++ b/common/src/main/java/org/onap/so/beans/nsmf/NssiUpdateRequest.java
@@ -0,0 +1,47 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.beans.nsmf;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class NssiUpdateRequest {
+
+    private UpdateCnNssi updateCnNssi;
+
+    private EsrInfo esrInfo;
+
+    public EsrInfo getEsrInfo() {
+        return esrInfo;
+    }
+
+    public void setEsrInfo(EsrInfo esrInfo) {
+        this.esrInfo = esrInfo;
+    }
+
+    public UpdateCnNssi getUpdateCnNssi() {
+        return updateCnNssi;
+    }
+
+    public void setUpdateCnNssi(UpdateCnNssi updateCnNssi) {
+        this.updateCnNssi = updateCnNssi;
+    }
+}
diff --git a/common/src/main/java/org/onap/so/beans/nsmf/NssiUpdateRequestById.java b/common/src/main/java/org/onap/so/beans/nsmf/NssiUpdateRequestById.java
new file mode 100644
index 0000000..0554d2f
--- /dev/null
+++ b/common/src/main/java/org/onap/so/beans/nsmf/NssiUpdateRequestById.java
@@ -0,0 +1,47 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.beans.nsmf;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class NssiUpdateRequestById {
+
+    private UpdateCnNssiById updateCnNssiById;
+
+    private EsrInfo esrInfo;
+
+    public EsrInfo getEsrInfo() {
+        return esrInfo;
+    }
+
+    public void setEsrInfo(EsrInfo esrInfo) {
+        this.esrInfo = esrInfo;
+    }
+
+    public UpdateCnNssiById getUpdateCnNssiById() {
+        return updateCnNssiById;
+    }
+
+    public void setUpdateCnNssiById(UpdateCnNssiById updateCnNssiById) {
+        this.updateCnNssiById = updateCnNssiById;
+    }
+}
diff --git a/common/src/main/java/org/onap/so/beans/nsmf/NssmiReqInfo.java b/common/src/main/java/org/onap/so/beans/nsmf/NssmiReqInfo.java
new file mode 100644
index 0000000..093825f
--- /dev/null
+++ b/common/src/main/java/org/onap/so/beans/nsmf/NssmiReqInfo.java
@@ -0,0 +1,57 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.beans.nsmf;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class NssmiReqInfo {
+
+    private String nsiId;
+
+    private String nssiId;
+
+    private EsrInfo esrInfo;
+
+    public String getNsiId() {
+        return nsiId;
+    }
+
+    public void setNsiId(String nsiId) {
+        this.nsiId = nsiId;
+    }
+
+    public String getNssiId() {
+        return nssiId;
+    }
+
+    public void setNssiId(String nssiId) {
+        this.nssiId = nssiId;
+    }
+
+    public EsrInfo getEsrInfo() {
+        return esrInfo;
+    }
+
+    public void setEsrInfo(EsrInfo esrInfo) {
+        this.esrInfo = esrInfo;
+    }
+}
diff --git a/common/src/main/java/org/onap/so/beans/nsmf/NssmiResInfo.java b/common/src/main/java/org/onap/so/beans/nsmf/NssmiResInfo.java
new file mode 100644
index 0000000..e75934a
--- /dev/null
+++ b/common/src/main/java/org/onap/so/beans/nsmf/NssmiResInfo.java
@@ -0,0 +1,47 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.beans.nsmf;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class NssmiResInfo {
+
+    private String jobId;
+
+    private String status;
+
+    public String getJobId() {
+        return jobId;
+    }
+
+    public void setJobId(String jobId) {
+        this.jobId = jobId;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+}
diff --git a/common/src/main/java/org/onap/so/beans/nsmf/PerfReq.java b/common/src/main/java/org/onap/so/beans/nsmf/PerfReq.java
new file mode 100644
index 0000000..4aabc3f
--- /dev/null
+++ b/common/src/main/java/org/onap/so/beans/nsmf/PerfReq.java
@@ -0,0 +1,48 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.beans.nsmf;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import java.util.List;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class PerfReq {
+
+    private List<PerfReqEmbbList> perfReqEmbbList;
+
+    private List<PerfReqUrllcList> perfReqUrllcList;
+
+    public List<PerfReqEmbbList> getPerfReqEmbbList() {
+        return perfReqEmbbList;
+    }
+
+    public void setPerfReqEmbbList(List<PerfReqEmbbList> perfReqEmbbList) {
+        this.perfReqEmbbList = perfReqEmbbList;
+    }
+
+    public List<PerfReqUrllcList> getPerfReqUrllcList() {
+        return perfReqUrllcList;
+    }
+
+    public void setPerfReqUrllcList(List<PerfReqUrllcList> perfReqUrllcList) {
+        this.perfReqUrllcList = perfReqUrllcList;
+    }
+}
diff --git a/common/src/main/java/org/onap/so/beans/nsmf/PerfReqEmbbList.java b/common/src/main/java/org/onap/so/beans/nsmf/PerfReqEmbbList.java
new file mode 100644
index 0000000..9e9fcaa
--- /dev/null
+++ b/common/src/main/java/org/onap/so/beans/nsmf/PerfReqEmbbList.java
@@ -0,0 +1,82 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.beans.nsmf;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class PerfReqEmbbList {
+
+    @JsonInclude(JsonInclude.Include.NON_DEFAULT)
+    private int expDataRateDL;
+
+    @JsonInclude(JsonInclude.Include.NON_DEFAULT)
+    private int expDataRateUL;
+
+    @JsonInclude(JsonInclude.Include.NON_DEFAULT)
+    private int areaTrafficCapDL;
+
+    @JsonInclude(JsonInclude.Include.NON_DEFAULT)
+    private int areaTrafficCapUL;
+
+    @JsonInclude(JsonInclude.Include.NON_DEFAULT)
+    private int activityFactor;
+
+    public int getExpDataRateDL() {
+        return expDataRateDL;
+    }
+
+    public void setExpDataRateDL(int expDataRateDL) {
+        this.expDataRateDL = expDataRateDL;
+    }
+
+    public int getExpDataRateUL() {
+        return expDataRateUL;
+    }
+
+    public void setExpDataRateUL(int expDataRateUL) {
+        this.expDataRateUL = expDataRateUL;
+    }
+
+    public int getAreaTrafficCapDL() {
+        return areaTrafficCapDL;
+    }
+
+    public void setAreaTrafficCapDL(int areaTrafficCapDL) {
+        this.areaTrafficCapDL = areaTrafficCapDL;
+    }
+
+    public int getAreaTrafficCapUL() {
+        return areaTrafficCapUL;
+    }
+
+    public void setAreaTrafficCapUL(int areaTrafficCapUL) {
+        this.areaTrafficCapUL = areaTrafficCapUL;
+    }
+
+    public int getActivityFactor() {
+        return activityFactor;
+    }
+
+    public void setActivityFactor(int activityFactor) {
+        this.activityFactor = activityFactor;
+    }
+}
diff --git a/common/src/main/java/org/onap/so/beans/nsmf/PerfReqUrllcList.java b/common/src/main/java/org/onap/so/beans/nsmf/PerfReqUrllcList.java
new file mode 100644
index 0000000..00f0a91
--- /dev/null
+++ b/common/src/main/java/org/onap/so/beans/nsmf/PerfReqUrllcList.java
@@ -0,0 +1,135 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.beans.nsmf;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class PerfReqUrllcList {
+
+    @JsonInclude(JsonInclude.Include.NON_DEFAULT)
+    private int e2eLatency;
+
+    @JsonInclude(JsonInclude.Include.NON_DEFAULT)
+    private int jitter;
+
+    @JsonInclude(JsonInclude.Include.NON_DEFAULT)
+    private int survivalTime;
+
+    @JsonInclude(JsonInclude.Include.NON_DEFAULT)
+    private float csAvailability;
+
+    @JsonInclude(JsonInclude.Include.NON_DEFAULT)
+    private float reliability;
+
+    @JsonInclude(JsonInclude.Include.NON_DEFAULT)
+    private int expDataRate;
+
+    private String payloadSize;
+
+    @JsonInclude(JsonInclude.Include.NON_DEFAULT)
+    private int trafficDensity;
+
+    @JsonInclude(JsonInclude.Include.NON_DEFAULT)
+    private int connDensity;
+
+    private String serviceAreaDimension;
+
+    public int getE2eLatency() {
+        return e2eLatency;
+    }
+
+    public void setE2eLatency(int e2eLatency) {
+        this.e2eLatency = e2eLatency;
+    }
+
+    public int getJitter() {
+        return jitter;
+    }
+
+    public void setJitter(int jitter) {
+        this.jitter = jitter;
+    }
+
+    public int getSurvivalTime() {
+        return survivalTime;
+    }
+
+    public void setSurvivalTime(int survivalTime) {
+        this.survivalTime = survivalTime;
+    }
+
+    public float getReliability() {
+        return reliability;
+    }
+
+    public void setReliability(float reliability) {
+        this.reliability = reliability;
+    }
+
+    public int getExpDataRate() {
+        return expDataRate;
+    }
+
+    public void setExpDataRate(int expDataRate) {
+        this.expDataRate = expDataRate;
+    }
+
+    public String getPayloadSize() {
+        return payloadSize;
+    }
+
+    public void setPayloadSize(String payloadSize) {
+        this.payloadSize = payloadSize;
+    }
+
+    public int getTrafficDensity() {
+        return trafficDensity;
+    }
+
+    public void setTrafficDensity(int trafficDensity) {
+        this.trafficDensity = trafficDensity;
+    }
+
+    public int getConnDensity() {
+        return connDensity;
+    }
+
+    public void setConnDensity(int connDensity) {
+        this.connDensity = connDensity;
+    }
+
+    public String getServiceAreaDimension() {
+        return serviceAreaDimension;
+    }
+
+    public void setServiceAreaDimension(String serviceAreaDimension) {
+        this.serviceAreaDimension = serviceAreaDimension;
+    }
+
+    public float getCsAvailability() {
+        return csAvailability;
+    }
+
+    public void setCsAvailability(float csAvailability) {
+        this.csAvailability = csAvailability;
+    }
+}
diff --git a/common/src/main/java/org/onap/so/beans/nsmf/PnfErrorList.java b/common/src/main/java/org/onap/so/beans/nsmf/PnfErrorList.java
new file mode 100644
index 0000000..66bfbdc
--- /dev/null
+++ b/common/src/main/java/org/onap/so/beans/nsmf/PnfErrorList.java
@@ -0,0 +1,47 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.beans.nsmf;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class PnfErrorList {
+
+    private String pnfId;
+
+    private String pnfErrorDesc;
+
+    public String getPnfId() {
+        return pnfId;
+    }
+
+    public void setPnfId(String pnfId) {
+        this.pnfId = pnfId;
+    }
+
+    public String getPnfErrorDesc() {
+        return pnfErrorDesc;
+    }
+
+    public void setPnfErrorDesc(String pnfErrorDesc) {
+        this.pnfErrorDesc = pnfErrorDesc;
+    }
+}
diff --git a/common/src/main/java/org/onap/so/beans/nsmf/ResourceSharingLevel.java b/common/src/main/java/org/onap/so/beans/nsmf/ResourceSharingLevel.java
new file mode 100644
index 0000000..405429c
--- /dev/null
+++ b/common/src/main/java/org/onap/so/beans/nsmf/ResourceSharingLevel.java
@@ -0,0 +1,56 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.beans.nsmf;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonValue;
+
+public enum ResourceSharingLevel {
+
+    SHARED("shared"),
+
+    NON_SHARED("non-shared");
+
+    private String resourceSharingLevel;
+
+    ResourceSharingLevel(String resourceSharingLevel) {
+        this.resourceSharingLevel = resourceSharingLevel;
+    }
+
+    @JsonValue
+    public String getResourceSharingLevel() {
+        return resourceSharingLevel;
+    }
+
+    @JsonCreator
+    public ResourceSharingLevel forValue(String value) {
+        return valueOf(value);
+    }
+
+    public static ResourceSharingLevel fromString(String value) {
+        for (ResourceSharingLevel rscLvl : ResourceSharingLevel.values()) {
+            if (rscLvl.resourceSharingLevel.equalsIgnoreCase(value)) {
+                return rscLvl;
+            }
+        }
+        return null;
+    }
+}
diff --git a/common/src/main/java/org/onap/so/beans/nsmf/ResponseDescriptor.java b/common/src/main/java/org/onap/so/beans/nsmf/ResponseDescriptor.java
new file mode 100644
index 0000000..469d212
--- /dev/null
+++ b/common/src/main/java/org/onap/so/beans/nsmf/ResponseDescriptor.java
@@ -0,0 +1,85 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.beans.nsmf;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import java.util.List;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class ResponseDescriptor {
+
+    @JsonInclude(JsonInclude.Include.NON_DEFAULT)
+    private int progress;
+
+    private String status;
+
+    private String statusDescription;
+
+    private String errorCode;
+
+    private List<VnfErrorList> vnfErrorList;
+
+    private List<PnfErrorList> pnfErrorList;
+
+    private String responseId;
+
+    private List<ResponseHistory> responseHistoryList;
+
+    public int getProgress() {
+        return progress;
+    }
+
+    public void setProgress(int progress) {
+        this.progress = progress;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public String getStatusDescription() {
+        return statusDescription;
+    }
+
+    public void setStatusDescription(String statusDescription) {
+        this.statusDescription = statusDescription;
+    }
+
+    public String getResponseId() {
+        return responseId;
+    }
+
+    public void setResponseId(String responseId) {
+        this.responseId = responseId;
+    }
+
+    public List<ResponseHistory> getResponseHistoryList() {
+        return responseHistoryList;
+    }
+
+    public void setResponseHistoryList(List<ResponseHistory> responseHistoryList) {
+        this.responseHistoryList = responseHistoryList;
+    }
+}
diff --git a/common/src/main/java/org/onap/so/beans/nsmf/ResponseHistory.java b/common/src/main/java/org/onap/so/beans/nsmf/ResponseHistory.java
new file mode 100644
index 0000000..c71441a
--- /dev/null
+++ b/common/src/main/java/org/onap/so/beans/nsmf/ResponseHistory.java
@@ -0,0 +1,94 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.beans.nsmf;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import java.util.List;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class ResponseHistory {
+
+    private int progress;
+
+    private String status;
+
+    private String errorCode;
+
+    private String statusDescription;
+
+    private String responseId;
+
+    private List<VnfErrorList> vnfErrorList;
+
+    private List<PnfErrorList> pnfErrorList;
+
+    public int getProgress() {
+        return progress;
+    }
+
+    public void setProgress(int progress) {
+        this.progress = progress;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public String getStatusDescription() {
+        return statusDescription;
+    }
+
+    public void setStatusDescription(String statusDescription) {
+        this.statusDescription = statusDescription;
+    }
+
+    public String getResponseId() {
+        return responseId;
+    }
+
+    public void setResponseId(String responseId) {
+        this.responseId = responseId;
+    }
+
+    public String getErrorCode() {
+        return errorCode;
+    }
+
+    public void setErrorCode(String errorCode) {
+        this.errorCode = errorCode;
+    }
+
+    public List<VnfErrorList> getVnfErrorList() {
+        return vnfErrorList;
+    }
+
+    public List<PnfErrorList> getPnfErrorList() {
+        return pnfErrorList;
+    }
+
+    public void setPnfErrorList(List<PnfErrorList> pnfErrorList) {
+        this.pnfErrorList = pnfErrorList;
+    }
+}
diff --git a/common/src/main/java/org/onap/so/beans/nsmf/TerminateNssi.java b/common/src/main/java/org/onap/so/beans/nsmf/TerminateNssi.java
new file mode 100644
index 0000000..28cc565
--- /dev/null
+++ b/common/src/main/java/org/onap/so/beans/nsmf/TerminateNssi.java
@@ -0,0 +1,59 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.beans.nsmf;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class TerminateNssi {
+
+    public final static String URL = "/api/rest/provMns/v1/NSS/nssi/%s";
+
+    private String nsiId;
+
+    private String scriptName;
+
+    private String extension;
+
+    public String getNsiId() {
+        return nsiId;
+    }
+
+    public void setNsiId(String nsiId) {
+        this.nsiId = nsiId;
+    }
+
+    public String getScriptName() {
+        return scriptName;
+    }
+
+    public void setScriptName(String scriptName) {
+        this.scriptName = scriptName;
+    }
+
+    public String getExtension() {
+        return extension;
+    }
+
+    public void setExtension(String extension) {
+        this.extension = extension;
+    }
+}
diff --git a/common/src/main/java/org/onap/so/beans/nsmf/TnSliceProfile.java b/common/src/main/java/org/onap/so/beans/nsmf/TnSliceProfile.java
new file mode 100644
index 0000000..c3548f1
--- /dev/null
+++ b/common/src/main/java/org/onap/so/beans/nsmf/TnSliceProfile.java
@@ -0,0 +1,48 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.beans.nsmf;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class TnSliceProfile {
+
+    private String bandwidth;
+
+    @JsonInclude(JsonInclude.Include.NON_DEFAULT)
+    private int latency;
+
+    public String getBandwidth() {
+        return bandwidth;
+    }
+
+    public void setBandwidth(String bandwidth) {
+        this.bandwidth = bandwidth;
+    }
+
+    public int getLatency() {
+        return latency;
+    }
+
+    public void setLatency(int latency) {
+        this.latency = latency;
+    }
+}
diff --git a/common/src/main/java/org/onap/so/beans/nsmf/UeMobilityLevel.java b/common/src/main/java/org/onap/so/beans/nsmf/UeMobilityLevel.java
new file mode 100644
index 0000000..ffb7229
--- /dev/null
+++ b/common/src/main/java/org/onap/so/beans/nsmf/UeMobilityLevel.java
@@ -0,0 +1,60 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.beans.nsmf;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonValue;
+
+public enum UeMobilityLevel {
+
+    STATIONARY("stationary"),
+
+    NOMADIC("nomadic"),
+
+    RESTRICTED_MOBILITY("restricted mobility"),
+
+    FULLY_MOBILITY("fully mobility");
+
+    private String ueMobilityLevel;
+
+    UeMobilityLevel(String ueMobilityLevel) {
+        this.ueMobilityLevel = ueMobilityLevel;
+    }
+
+    @JsonValue
+    public String getUeMobilityLevel() {
+        return ueMobilityLevel;
+    }
+
+    @JsonCreator
+    public UeMobilityLevel forValue(String value) {
+        return valueOf(value);
+    }
+
+    public static UeMobilityLevel fromString(String value) {
+        for (UeMobilityLevel ueLvl : UeMobilityLevel.values()) {
+            if (ueLvl.ueMobilityLevel.equalsIgnoreCase(value)) {
+                return ueLvl;
+            }
+        }
+        return null;
+    }
+}
diff --git a/common/src/main/java/org/onap/so/beans/nsmf/UpdateCnNssi.java b/common/src/main/java/org/onap/so/beans/nsmf/UpdateCnNssi.java
new file mode 100644
index 0000000..9fb8f26
--- /dev/null
+++ b/common/src/main/java/org/onap/so/beans/nsmf/UpdateCnNssi.java
@@ -0,0 +1,119 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.beans.nsmf;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class UpdateCnNssi {
+
+    public final static String URL = "/api/rest/provMns/v1/NSS/SliceProfiles/%s";
+
+    private String snssai;
+
+    private String nssiId;
+
+    private String nsstId;
+
+    private String flavorId;
+
+    private UpdateSliceProfile sliceProfile;
+
+    private String scriptName;
+
+    private String extension;
+
+    private NsiInfo nsiInfo;
+
+    private NewNsst newNsst;
+
+    public String getSnssai() {
+        return snssai;
+    }
+
+    public void setSnssai(String snssai) {
+        this.snssai = snssai;
+    }
+
+    public String getNssiId() {
+        return nssiId;
+    }
+
+    public void setNssiId(String nssiId) {
+        this.nssiId = nssiId;
+    }
+
+    public String getNsstId() {
+        return nsstId;
+    }
+
+    public void setNsstId(String nsstId) {
+        this.nsstId = nsstId;
+    }
+
+    public String getFlavorId() {
+        return flavorId;
+    }
+
+    public void setFlavorId(String flavorId) {
+        this.flavorId = flavorId;
+    }
+
+    public UpdateSliceProfile getSliceProfile() {
+        return sliceProfile;
+    }
+
+    public void setSliceProfile(UpdateSliceProfile sliceProfile) {
+        this.sliceProfile = sliceProfile;
+    }
+
+    public String getScriptName() {
+        return scriptName;
+    }
+
+    public void setScriptName(String scriptName) {
+        this.scriptName = scriptName;
+    }
+
+    public String getExtension() {
+        return extension;
+    }
+
+    public void setExtension(String extension) {
+        this.extension = extension;
+    }
+
+    public NsiInfo getNsiInfo() {
+        return nsiInfo;
+    }
+
+    public void setNsiInfo(NsiInfo nsiInfo) {
+        this.nsiInfo = nsiInfo;
+    }
+
+    public NewNsst getNewNsst() {
+        return newNsst;
+    }
+
+    public void setNewNsst(NewNsst newNsst) {
+        this.newNsst = newNsst;
+    }
+}
diff --git a/common/src/main/java/org/onap/so/beans/nsmf/UpdateCnNssiById.java b/common/src/main/java/org/onap/so/beans/nsmf/UpdateCnNssiById.java
new file mode 100644
index 0000000..26e6ca0
--- /dev/null
+++ b/common/src/main/java/org/onap/so/beans/nsmf/UpdateCnNssiById.java
@@ -0,0 +1,89 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.beans.nsmf;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class UpdateCnNssiById {
+
+    public final static String URL = "/api/rest/provMns/v1/NSS/nssi/%s";
+
+    private String nsstId;
+
+    private String flavorId;
+
+    private String scriptName;
+
+    private String extension;
+
+    private NsiInfo nsiInfo;
+
+    private NewNsst newNsst;
+
+    public String getNsstId() {
+        return nsstId;
+    }
+
+    public void setNsstId(String nsstId) {
+        this.nsstId = nsstId;
+    }
+
+    public String getFlavorId() {
+        return flavorId;
+    }
+
+    public void setFlavorId(String flavorId) {
+        this.flavorId = flavorId;
+    }
+
+    public String getScriptName() {
+        return scriptName;
+    }
+
+    public void setScriptName(String scriptName) {
+        this.scriptName = scriptName;
+    }
+
+    public String getExtension() {
+        return extension;
+    }
+
+    public void setExtension(String extension) {
+        this.extension = extension;
+    }
+
+    public NsiInfo getNsiInfo() {
+        return nsiInfo;
+    }
+
+    public void setNsiInfo(NsiInfo nsiInfo) {
+        this.nsiInfo = nsiInfo;
+    }
+
+    public NewNsst getNewNsst() {
+        return newNsst;
+    }
+
+    public void setNewNsst(NewNsst newNsst) {
+        this.newNsst = newNsst;
+    }
+}
diff --git a/common/src/main/java/org/onap/so/beans/nsmf/UpdateSliceProfile.java b/common/src/main/java/org/onap/so/beans/nsmf/UpdateSliceProfile.java
new file mode 100644
index 0000000..74ea7ae
--- /dev/null
+++ b/common/src/main/java/org/onap/so/beans/nsmf/UpdateSliceProfile.java
@@ -0,0 +1,101 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.beans.nsmf;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import java.util.List;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class UpdateSliceProfile {
+
+    private List<String> plmnIdList;
+
+    private PerfReq perfReq;
+
+    @JsonInclude(JsonInclude.Include.NON_DEFAULT)
+    private int maxNumberofUEs;
+
+    private List<String> coverageAreaTAList;
+
+    @JsonInclude(JsonInclude.Include.NON_DEFAULT)
+    private int latency;
+
+    @JsonInclude(JsonInclude.Include.NON_DEFAULT)
+    private int ueMobilityLevel;
+
+    private String resourceSharingLevel;
+
+    public List<String> getPlmnIdList() {
+        return plmnIdList;
+    }
+
+    public void setPlmnIdList(List<String> plmnIdList) {
+        this.plmnIdList = plmnIdList;
+    }
+
+    public PerfReq getPerfReq() {
+        return perfReq;
+    }
+
+    public void setPerfReq(PerfReq perfReq) {
+        this.perfReq = perfReq;
+    }
+
+    public int getMaxNumberofUEs() {
+        return maxNumberofUEs;
+    }
+
+    public void setMaxNumberofUEs(int maxNumberofUEs) {
+        this.maxNumberofUEs = maxNumberofUEs;
+    }
+
+    public List<String> getCoverageAreaTAList() {
+        return coverageAreaTAList;
+    }
+
+    public void setCoverageAreaTAList(List<String> coverageAreaTAList) {
+        this.coverageAreaTAList = coverageAreaTAList;
+    }
+
+    public int getLatency() {
+        return latency;
+    }
+
+    public void setLatency(int latency) {
+        this.latency = latency;
+    }
+
+    public int getUeMobilityLevel() {
+        return ueMobilityLevel;
+    }
+
+    public void setUeMobilityLevel(int ueMobilityLevel) {
+        this.ueMobilityLevel = ueMobilityLevel;
+    }
+
+    public String getResourceSharingLevel() {
+        return resourceSharingLevel;
+    }
+
+    public void setResourceSharingLevel(String resourceSharingLevel) {
+        this.resourceSharingLevel = resourceSharingLevel;
+    }
+}
diff --git a/common/src/main/java/org/onap/so/beans/nsmf/VnfErrorList.java b/common/src/main/java/org/onap/so/beans/nsmf/VnfErrorList.java
new file mode 100644
index 0000000..6388ca6
--- /dev/null
+++ b/common/src/main/java/org/onap/so/beans/nsmf/VnfErrorList.java
@@ -0,0 +1,47 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.beans.nsmf;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class VnfErrorList {
+
+    private String vnfInstanceId;
+
+    private String vnfErrorDesc;
+
+    public String getVnfInstanceId() {
+        return vnfInstanceId;
+    }
+
+    public void setVnfInstanceId(String vnfInstanceId) {
+        this.vnfInstanceId = vnfInstanceId;
+    }
+
+    public String getVnfErrorDesc() {
+        return vnfErrorDesc;
+    }
+
+    public void setVnfErrorDesc(String vnfErrorDesc) {
+        this.vnfErrorDesc = vnfErrorDesc;
+    }
+}
diff --git a/common/src/main/java/org/onap/so/client/aai/AAIObjectType.java b/common/src/main/java/org/onap/so/client/aai/AAIObjectType.java
index c2c8e93..db541f7 100644
--- a/common/src/main/java/org/onap/so/client/aai/AAIObjectType.java
+++ b/common/src/main/java/org/onap/so/client/aai/AAIObjectType.java
@@ -58,6 +58,7 @@
 import org.onap.aai.domain.yang.Project;
 import org.onap.aai.domain.yang.Pserver;
 import org.onap.aai.domain.yang.RouteTableReference;
+import org.onap.aai.domain.yang.Service;
 import org.onap.aai.domain.yang.ServiceInstance;
 import org.onap.aai.domain.yang.ServiceSubscription;
 import org.onap.aai.domain.yang.SpPartner;
@@ -122,6 +123,8 @@
     public static final AAIObjectType SERVICE_INSTANCE_METADATA = new AAIObjectType(
             AAIObjectType.SERVICE_INSTANCE + "/metadata", org.onap.aai.domain.yang.v13.Metadata.class);
 
+    public static final AAIObjectType SERVICE = new AAIObjectType(
+            AAINamespaceConstants.SERVICE_DESIGN_AND_CREATION + "/services/service/{service-id}", Service.class);
     public static final AAIObjectType SERVICE_INSTANCE =
             new AAIObjectType(AAIObjectType.SERVICE_SUBSCRIPTION.uriTemplate(), ServiceInstance.class);
     public static final AAIObjectType PROJECT = new AAIObjectType(AAINamespaceConstants.BUSINESS, Project.class);
diff --git a/common/src/main/java/org/onap/so/logging/jaxrs/filter/SOAuditLogContainerFilter.java b/common/src/main/java/org/onap/so/logging/jaxrs/filter/SOAuditLogContainerFilter.java
index 5ae1082..3e85cc5 100644
--- a/common/src/main/java/org/onap/so/logging/jaxrs/filter/SOAuditLogContainerFilter.java
+++ b/common/src/main/java/org/onap/so/logging/jaxrs/filter/SOAuditLogContainerFilter.java
@@ -3,6 +3,7 @@
 import javax.annotation.Priority;
 import javax.ws.rs.container.ContainerRequestContext;
 import javax.ws.rs.container.ContainerResponseContext;
+import javax.ws.rs.container.PreMatching;
 import org.onap.logging.ref.slf4j.ONAPLogConstants;
 import org.onap.so.logger.HttpHeadersConstants;
 import org.onap.so.logger.LogConstants;
@@ -11,6 +12,7 @@
 import org.onap.logging.filter.base.AuditLogContainerFilter;
 
 @Priority(1)
+@PreMatching
 @Component
 public class SOAuditLogContainerFilter extends AuditLogContainerFilter {
 
@@ -26,9 +28,4 @@
         }
         MDC.put(LogConstants.URI_BASE, request.getUriInfo().getBaseUri().toString());
     }
-
-    @Override
-    protected void additionalPostHandling(ContainerResponseContext response) {
-        // override to add additional post handling
-    }
 }
diff --git a/common/src/main/java/org/onap/so/rest/service/HttpRestServiceProviderImpl.java b/common/src/main/java/org/onap/so/rest/service/HttpRestServiceProviderImpl.java
index b82d73b..6211b76 100644
--- a/common/src/main/java/org/onap/so/rest/service/HttpRestServiceProviderImpl.java
+++ b/common/src/main/java/org/onap/so/rest/service/HttpRestServiceProviderImpl.java
@@ -143,6 +143,18 @@
             final HttpEntity<?> request = new HttpEntity<>(getHttpHeaders());
             return restTemplate.exchange(url, HttpMethod.DELETE, request, clazz);
 
+        } catch (final HttpStatusCodeException httpStatusCodeException) {
+            final String message = "Unable to invoke HTTP " + HttpMethod.DELETE + " using url: " + url + ", Response: "
+                    + httpStatusCodeException.getRawStatusCode();
+            LOGGER.error(message, httpStatusCodeException);
+            final int rawStatusCode = httpStatusCodeException.getRawStatusCode();
+            if (rawStatusCode == HttpStatus.BAD_REQUEST.value()) {
+                throw new InvalidRestRequestException("No result found for given url: " + url);
+            } else if (rawStatusCode == HttpStatus.NOT_FOUND.value()) {
+                throw new HttpResouceNotFoundException("No result found for given url: " + url);
+            }
+            throw new RestProcessingException("Unable to invoke HTTP " + HttpMethod.DELETE + " using URL: " + url,
+                    httpStatusCodeException, rawStatusCode);
         } catch (final RestClientException restClientException) {
             LOGGER.error("Unable to invoke HTTP DELETE using url: " + url, restClientException);
             throw new InvalidRestRequestException("Unable to invoke HTTP DELETE using URL: " + url,
diff --git a/common/src/main/java/org/onap/so/serviceinstancebeans/CloudConfiguration.java b/common/src/main/java/org/onap/so/serviceinstancebeans/CloudConfiguration.java
index 4a284b5..777dcc6 100644
--- a/common/src/main/java/org/onap/so/serviceinstancebeans/CloudConfiguration.java
+++ b/common/src/main/java/org/onap/so/serviceinstancebeans/CloudConfiguration.java
@@ -37,6 +37,8 @@
     protected String aicNodeClli;
     @JsonProperty("tenantId")
     protected String tenantId;
+    @JsonProperty("tenantName")
+    protected String tenantName;
     @JsonProperty("cloudOwner")
     protected String cloudOwner = Defaults.CLOUD_OWNER.toString();
     @JsonProperty("lcpCloudRegionId")
@@ -82,6 +84,13 @@
         this.tenantId = value;
     }
 
+    public String getTenantName() {
+        return tenantName;
+    }
+
+    public void setTenantName(String tenantName) {
+        this.tenantName = tenantName;
+    }
 
     public String getLcpCloudRegionId() {
         return lcpCloudRegionId;
@@ -102,7 +111,8 @@
     @Override
     public String toString() {
         return new ToStringBuilder(this).append("aicNodeClli", getAicNodeClli()).append("tenantId", getTenantId())
-                .append("cloudOwner", getCloudOwner()).append("lcpCloudRegionId", getLcpCloudRegionId()).toString();
+                .append("tenantName", getTenantName()).append("cloudOwner", getCloudOwner())
+                .append("lcpCloudRegionId", getLcpCloudRegionId()).toString();
     }
 
 
diff --git a/common/src/main/java/org/onap/so/serviceinstancebeans/RequestInfo.java b/common/src/main/java/org/onap/so/serviceinstancebeans/RequestInfo.java
index 250c5df..026db1e 100644
--- a/common/src/main/java/org/onap/so/serviceinstancebeans/RequestInfo.java
+++ b/common/src/main/java/org/onap/so/serviceinstancebeans/RequestInfo.java
@@ -43,6 +43,8 @@
     protected String orderNumber;
     @JsonProperty("productFamilyId")
     protected String productFamilyId;
+    @JsonProperty("productFamilyName")
+    protected String productFamilyName;
     @JsonProperty("orderVersion")
     protected Integer orderVersion;
     @JsonSerialize(include = Inclusion.ALWAYS)
@@ -180,6 +182,14 @@
 
     public void setProductFamilyId(String productFamilyId) {
         this.productFamilyId = productFamilyId;
+    };
+
+    public String getProductFamilyName() {
+        return productFamilyName;
+    }
+
+    public void setProductFamilyName(String productFamilyName) {
+        this.productFamilyName = productFamilyName;
     }
 
     /**
@@ -215,9 +225,9 @@
     public String toString() {
         return "RequestInfo [billingAccountNumber=" + billingAccountNumber + ", callbackUrl=" + callbackUrl
                 + ", correlator=" + correlator + ", orderNumber=" + orderNumber + ", productFamilyId=" + productFamilyId
-                + ", orderVersion=" + orderVersion + ", source=" + source + ", instanceName=" + instanceName
-                + ", suppressRollback=" + suppressRollback + ", requestorId=" + requestorId + ", applicationId="
-                + applicationId + "]";
+                + ", productFamilyName=" + productFamilyName + ", orderVersion=" + orderVersion + ", source=" + source
+                + ", instanceName=" + instanceName + ", suppressRollback=" + suppressRollback + ", requestorId="
+                + requestorId + ", applicationId=" + applicationId + "]";
     }
 
 
diff --git a/common/src/main/java/org/onap/so/serviceinstancebeans/ServiceInstancesRequest.java b/common/src/main/java/org/onap/so/serviceinstancebeans/ServiceInstancesRequest.java
index 5bcdcb1..05e69b7 100644
--- a/common/src/main/java/org/onap/so/serviceinstancebeans/ServiceInstancesRequest.java
+++ b/common/src/main/java/org/onap/so/serviceinstancebeans/ServiceInstancesRequest.java
@@ -32,8 +32,8 @@
     private String serviceInstanceId;
     @JsonProperty("vnfInstanceId")
     private String vnfInstanceId;
-    @JsonProperty("pnfId")
-    private String pnfId;
+    @JsonProperty("pnfName")
+    private String pnfName;
     @JsonProperty("networkInstanceId")
     private String networkInstanceId;
     @JsonProperty("volumeGroupInstanceId")
@@ -69,12 +69,12 @@
         this.vnfInstanceId = vnfInstanceId;
     }
 
-    public String getPnfId() {
-        return pnfId;
+    public String getPnfName() {
+        return pnfName;
     }
 
-    public void setPnfId(String pnfId) {
-        this.pnfId = pnfId;
+    public void setPnfName(String pnfName) {
+        this.pnfName = pnfName;
     }
 
     public String getNetworkInstanceId() {
@@ -123,7 +123,7 @@
         sb.append("requestDetails=").append(requestDetails);
         sb.append(", serviceInstanceId='").append(serviceInstanceId).append('\'');
         sb.append(", vnfInstanceId='").append(vnfInstanceId).append('\'');
-        sb.append(", pnfId='").append(pnfId).append('\'');
+        sb.append(", pnfName='").append(pnfName).append('\'');
         sb.append(", networkInstanceId='").append(networkInstanceId).append('\'');
         sb.append(", volumeGroupInstanceId='").append(volumeGroupInstanceId).append('\'');
         sb.append(", vfModuleInstanceId='").append(vfModuleInstanceId).append('\'');
diff --git a/deployment-configs/src/main/resources/logger/logback-spring.xml b/deployment-configs/src/main/resources/logger/logback-spring.xml
index 831a33a..3f022f5 100644
--- a/deployment-configs/src/main/resources/logger/logback-spring.xml
+++ b/deployment-configs/src/main/resources/logger/logback-spring.xml
@@ -27,7 +27,7 @@
 	<property name="currentTimeStamp" value="%d{&quot;yyyy-MM-dd'T'HH:mm:ss.SSSXXX&quot;,UTC}"/>
 
 	<property name="errorPattern"
-		value="%d{yyyy-MM-dd'T'HH:mm:ss.SSSXXX}|%X{RequestID}|%thread|%X{ServiceName:-Unknown}|%X{PartnerName}|%X{TargetEntity}|%X{TargetServiceName}|%.-5level|%X{ErrorCode:-900}|%X{ErrorDesc:-UnknownError}|%msg%n" />
+		value="%d{yyyy-MM-dd'T'HH:mm:ss.SSSXXX}|%X{RequestID}|%thread|%X{ServiceName:-Unknown}|%X{PartnerName}|%X{TargetEntity}|%X{TargetServiceName}|%.-5level|%X{ErrorCode:-900}|%X{ErrorDesc:-UnknownError}|%msg%nopex%n" />
 
 	<property name="debugPattern"
 		value="%d{yyyy-MM-dd'T'HH:mm:ss.SSSXXX}|%X{RequestID}|%logger{50} - %msg%n" />
diff --git a/mso-api-handlers/mso-api-handler-infra/pom.xml b/mso-api-handlers/mso-api-handler-infra/pom.xml
index 84a80e6..9944984 100644
--- a/mso-api-handlers/mso-api-handler-infra/pom.xml
+++ b/mso-api-handlers/mso-api-handler-infra/pom.xml
@@ -98,6 +98,10 @@
       <artifactId>spring-retry</artifactId>
     </dependency>
     <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-webflux</artifactId>
+    </dependency>
+    <dependency>
       <groupId>commons-lang</groupId>
       <artifactId>commons-lang</artifactId>
       <version>2.6</version>
diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/CamundaRequestHandler.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/CamundaRequestHandler.java
index 17377d8..f30b66c 100644
--- a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/CamundaRequestHandler.java
+++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/CamundaRequestHandler.java
@@ -9,9 +9,11 @@
 import javax.xml.bind.DatatypeConverter;
 import org.camunda.bpm.engine.impl.persistence.entity.HistoricActivityInstanceEntity;
 import org.camunda.bpm.engine.impl.persistence.entity.HistoricProcessInstanceEntity;
+import org.json.JSONObject;
 import org.onap.logging.filter.spring.SpringClientPayloadFilter;
 import org.onap.so.logging.jaxrs.filter.SOSpringClientFilter;
 import org.onap.so.utils.CryptoUtils;
+import org.onap.so.apihandlerinfra.exceptions.ContactCamundaException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -29,6 +31,9 @@
 import org.springframework.web.client.ResourceAccessException;
 import org.springframework.web.client.RestClientException;
 import org.springframework.web.client.RestTemplate;
+import org.springframework.web.reactive.function.BodyInserters;
+import org.springframework.web.reactive.function.client.WebClient;
+import reactor.core.publisher.Flux;
 
 @Component
 public class CamundaRequestHandler {
@@ -202,6 +207,20 @@
         return retryTemplate;
     }
 
+    protected void sendCamundaMessages(JSONObject msgJson) {
+        String url = env.getProperty("mso.camundaURL") + "/sobpmnengine/message";
+        HttpHeaders headers =
+                setCamundaHeaders(env.getRequiredProperty("mso.camundaAuth"), env.getRequiredProperty("mso.msoKey"));
+        headers.setContentType(org.springframework.http.MediaType.APPLICATION_JSON);
+        // Workflow may take a long time so use non-blocking request
+        Flux<String> flux = WebClient.create().post().uri(url).headers(httpHeaders -> {
+            httpHeaders.set(httpHeaders.AUTHORIZATION, headers.get(httpHeaders.AUTHORIZATION).get(0));
+            httpHeaders.set(httpHeaders.ACCEPT, headers.get(httpHeaders.ACCEPT).get(0));
+            httpHeaders.set(httpHeaders.CONTENT_TYPE, headers.get(httpHeaders.CONTENT_TYPE).get(0));
+        }).body(BodyInserters.fromObject(msgJson.toString())).retrieve().bodyToFlux(String.class);
+        flux.subscribe(res -> logger.debug("Send Camunda Message: " + res));
+    }
+
     protected RestTemplate getRestTemplate(boolean retry) {
         int timeout;
         if (retry) {
diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/InstanceManagement.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/InstanceManagement.java
index dbdc274..88028d3 100644
--- a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/InstanceManagement.java
+++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/InstanceManagement.java
@@ -7,12 +7,14 @@
  * ================================================================================
  * Modifications Copyright (c) 2019 Samsung
  * ================================================================================
+ * Modifications Copyright (c) 2020 Nokia
+ * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -93,7 +95,7 @@
     @Path("/{version:[vV][1]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/workflows/{workflowUuid}")
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
-    @Operation(description = "Execute custom workflow", responses = @ApiResponse(
+    @Operation(description = "Execute custom VNF workflow", responses = @ApiResponse(
             content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
     @Transactional
     public Response executeVNFCustomWorkflow(String request, @PathParam("version") String version,
@@ -110,20 +112,20 @@
     }
 
     @POST
-    @Path("/{version:[vV][1]}/serviceInstances/{serviceInstanceId}/pnfs/{pnfId}/workflows/{workflowUuid}")
+    @Path("/{version:[vV][1]}/serviceInstances/{serviceInstanceId}/pnfs/{pnfName}/workflows/{workflowUuid}")
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
-    @Operation(description = "Execute custom workflow", responses = @ApiResponse(
+    @Operation(description = "Execute custom PNF workflow", responses = @ApiResponse(
             content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
     @Transactional
     public Response executePNFCustomWorkflow(String request, @PathParam("version") String version,
-            @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("pnfId") String pnfId,
+            @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("pnfName") String pnfName,
             @PathParam("workflowUuid") String workflowUuid, @Context ContainerRequestContext requestContext)
             throws ApiException {
         String requestId = requestHandlerUtils.getRequestId(requestContext);
         HashMap<String, String> instanceIdMap = new HashMap<>();
         instanceIdMap.put("serviceInstanceId", serviceInstanceId);
-        instanceIdMap.put("pnfId", pnfId);
+        instanceIdMap.put("pnfName", pnfName);
         instanceIdMap.put("workflowUuid", workflowUuid);
         return processPNFCustomWorkflowRequest(request, Action.forCustomWorkflow, instanceIdMap, version, requestId,
                 requestContext);
@@ -133,7 +135,7 @@
             HashMap<String, String> instanceIdMap, String version, String requestId,
             ContainerRequestContext requestContext) throws ApiException {
         String serviceInstanceId;
-        Boolean aLaCarte = true;
+        boolean aLaCarte = true;
         ServiceInstancesRequest sir;
         String apiVersion = version.substring(1);
 
@@ -162,26 +164,14 @@
                 currentActiveReq);
         requestHandlerUtils.setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
 
-        int requestVersion = Integer.parseInt(version.substring(1));
-        String vnfType = msoRequest.getVnfType(sir, requestScope, action, requestVersion);
+        String vnfType = msoRequest.getVnfType(sir, requestScope);
 
         if (requestScope.equalsIgnoreCase(ModelType.vnf.name()) && vnfType != null) {
             currentActiveReq.setVnfType(vnfType);
         }
 
-        InfraActiveRequests dup = null;
-        boolean inProgress = false;
+        checkDuplicateAndBuildError(action, instanceIdMap, requestScope, currentActiveReq);
 
-        dup = requestHandlerUtils.duplicateCheck(action, instanceIdMap, null, requestScope, currentActiveReq);
-
-        if (dup != null) {
-            inProgress = requestHandlerUtils.camundaHistoryCheck(dup, currentActiveReq);
-        }
-
-        if (dup != null && inProgress) {
-            requestHandlerUtils.buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, null, requestScope,
-                    dup);
-        }
         ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
 
         RequestReferences referencesResponse = new RequestReferences();
@@ -189,7 +179,7 @@
         referencesResponse.setRequestId(requestId);
 
         serviceResponse.setRequestReferences(referencesResponse);
-        Boolean isBaseVfModule = false;
+        boolean isBaseVfModule = false;
 
         String workflowUuid = null;
         if (instanceIdMap != null) {
@@ -207,17 +197,9 @@
             vnfId = sir.getVnfInstanceId();
         }
 
-        try {
-            infraActiveRequestsClient.save(currentActiveReq);
-        } catch (Exception e) {
-            ErrorLoggerInfo errorLoggerInfo =
-                    new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, ErrorCode.DataError)
-                            .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
-            throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR,
-                    ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e).errorInfo(errorLoggerInfo).build();
-        }
+        saveCurrentActiveRequest(currentActiveReq);
 
-        RequestClientParameter requestClientParameter = null;
+        RequestClientParameter requestClientParameter;
         try {
             requestClientParameter = new RequestClientParameter.Builder().setRequestId(requestId)
                     .setBaseVfModule(isBaseVfModule).setRecipeTimeout(recipeLookupResult.getRecipeTimeout())
@@ -237,26 +219,54 @@
                 recipeLookupResult.getOrchestrationURI(), requestScope);
     }
 
+    private void saveCurrentActiveRequest(InfraActiveRequests currentActiveReq) throws RequestDbFailureException {
+        try {
+            infraActiveRequestsClient.save(currentActiveReq);
+        } catch (Exception e) {
+            ErrorLoggerInfo errorLoggerInfo =
+                    new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, ErrorCode.DataError)
+                            .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
+            throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR,
+                    ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e).errorInfo(errorLoggerInfo).build();
+        }
+    }
+
+    private void checkDuplicateAndBuildError(Actions action, HashMap<String, String> instanceIdMap, String requestScope,
+            InfraActiveRequests currentActiveReq) throws ApiException {
+
+        InfraActiveRequests dup =
+                requestHandlerUtils.duplicateCheck(action, instanceIdMap, null, requestScope, currentActiveReq);
+        if (dup == null) {
+            return;
+        }
+
+        boolean inProgress = requestHandlerUtils.camundaHistoryCheck(dup, currentActiveReq);
+        if (inProgress) {
+            requestHandlerUtils.buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, null, requestScope,
+                    dup);
+        }
+    }
+
     private Response processPNFCustomWorkflowRequest(String requestJSON, Actions action,
             HashMap<String, String> instanceIdMap, String version, String requestId,
             ContainerRequestContext requestContext) throws ApiException {
-        Boolean aLaCarte = false;
+        boolean aLaCarte = false;
         ServiceInstancesRequest sir;
         String apiVersion = version.substring(1);
 
         String serviceInstanceId = "";
-        String pnfId = "";
+        String pnfName = "";
         String workflowUuid = "";
         if (instanceIdMap != null) {
             serviceInstanceId = instanceIdMap.get("serviceInstanceId");
-            pnfId = instanceIdMap.get("pnfId");
+            pnfName = instanceIdMap.get("pnfName");
             workflowUuid = instanceIdMap.get("workflowUuid");
         }
 
         String requestUri = requestHandlerUtils.getRequestUri(requestContext, uriPrefix);
         sir = requestHandlerUtils.convertJsonToServiceInstanceRequest(requestJSON, action, requestId, requestUri);
         sir.setServiceInstanceId(serviceInstanceId);
-        sir.setPnfId(pnfId);
+        sir.setPnfName(pnfName);
         String requestScope = ModelType.pnf.name();
         InfraActiveRequests currentActiveReq =
                 msoRequest.createRequestObject(sir, action, requestId, Status.IN_PROGRESS, requestJSON, requestScope);
@@ -279,37 +289,17 @@
                 currentActiveReq);
         requestHandlerUtils.setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
 
-        InfraActiveRequests dup = null;
-        boolean inProgress = false;
-
-        dup = requestHandlerUtils.duplicateCheck(action, instanceIdMap, null, requestScope, currentActiveReq);
-
-        if (dup != null) {
-            inProgress = requestHandlerUtils.camundaHistoryCheck(dup, currentActiveReq);
-        }
-
-        if (dup != null && inProgress) {
-            requestHandlerUtils.buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, null, requestScope,
-                    dup);
-        }
+        checkDuplicateAndBuildError(action, instanceIdMap, requestScope, currentActiveReq);
 
         RecipeLookupResult recipeLookupResult = getInstanceManagementWorkflowRecipe(currentActiveReq, workflowUuid);
 
-        try {
-            infraActiveRequestsClient.save(currentActiveReq);
-        } catch (Exception e) {
-            ErrorLoggerInfo errorLoggerInfo =
-                    new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, ErrorCode.DataError)
-                            .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
-            throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR,
-                    ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e).errorInfo(errorLoggerInfo).build();
-        }
+        saveCurrentActiveRequest(currentActiveReq);
 
-        RequestClientParameter requestClientParameter = null;
+        RequestClientParameter requestClientParameter;
         try {
             requestClientParameter = new RequestClientParameter.Builder().setRequestId(requestId)
                     .setRecipeTimeout(recipeLookupResult.getRecipeTimeout()).setRequestAction(action.toString())
-                    .setServiceInstanceId(serviceInstanceId).setPnfCorrelationId(pnfId)
+                    .setServiceInstanceId(serviceInstanceId).setPnfCorrelationId(pnfName)
                     .setRequestDetails(requestHandlerUtils.mapJSONtoMSOStyle(requestJSON, null, aLaCarte, action))
                     .setApiVersion(apiVersion).setRequestUri(requestUri).build();
         } catch (IOException e) {
@@ -326,7 +316,7 @@
 
     private RecipeLookupResult getInstanceManagementWorkflowRecipe(InfraActiveRequests currentActiveReq,
             String workflowUuid) throws ApiException {
-        RecipeLookupResult recipeLookupResult = null;
+        RecipeLookupResult recipeLookupResult;
 
         try {
             recipeLookupResult = getCustomWorkflowUri(workflowUuid);
@@ -359,14 +349,12 @@
 
     private RecipeLookupResult getCustomWorkflowUri(String workflowUuid) {
 
-        String recipeUri = null;
         Workflow workflow = catalogDbClient.findWorkflowByArtifactUUID(workflowUuid);
-        if (workflow == null) {
-            return null;
-        } else {
+        if (workflow != null) {
             String workflowName = workflow.getName();
-            recipeUri = "/mso/async/services/" + workflowName;
+            String recipeUri = "/mso/async/services/" + workflowName;
+            return new RecipeLookupResult(recipeUri, 180);
         }
-        return new RecipeLookupResult(recipeUri, 180);
+        return null;
     }
 }
diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/JerseyConfiguration.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/JerseyConfiguration.java
index b7288e4..0afc272 100644
--- a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/JerseyConfiguration.java
+++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/JerseyConfiguration.java
@@ -92,6 +92,7 @@
         register(NoRecipeExceptionMapper.class);
         register(RequestConflictMapper.class);
         register(WorkflowEngineConnectionMapper.class);
+        register(OrchestrationTasks.class);
         // this registration seems to be needed to get predictable
         // execution behavior for the above JSON Exception Mappers
         register(com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider.class);
diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/MsoRequest.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/MsoRequest.java
index c077558..ce37120 100644
--- a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/MsoRequest.java
+++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/MsoRequest.java
@@ -7,12 +7,14 @@
  * ================================================================================
  * Modifications Copyright (c) 2019 Samsung
  * ================================================================================
+ * Modifications Copyright (c) 2020 Nokia
+ * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -30,7 +32,7 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.Map.Entry;
+import java.util.Optional;
 import java.util.StringTokenizer;
 import javax.ws.rs.core.MultivaluedMap;
 import javax.ws.rs.core.Response;
@@ -40,7 +42,11 @@
 import javax.xml.transform.TransformerFactory;
 import javax.xml.transform.dom.DOMSource;
 import javax.xml.transform.stream.StreamResult;
+import org.onap.aai.domain.yang.GenericVnf;
+import org.onap.aai.domain.yang.ServiceInstance;
+import org.onap.aai.domain.yang.Tenant;
 import org.onap.so.apihandler.common.ResponseBuilder;
+import org.onap.so.apihandlerinfra.infra.rest.AAIDataRetrieval;
 import org.onap.so.apihandlerinfra.tasksbeans.TasksRequest;
 import org.onap.so.apihandlerinfra.validation.ApplyUpdatedConfigValidation;
 import org.onap.so.apihandlerinfra.validation.CloudConfigurationValidation;
@@ -69,7 +75,6 @@
 import org.onap.so.exceptions.ValidationException;
 import org.onap.so.logger.LogConstants;
 import org.onap.so.serviceinstancebeans.CloudConfiguration;
-import org.onap.so.serviceinstancebeans.InstanceDirection;
 import org.onap.so.serviceinstancebeans.ModelInfo;
 import org.onap.so.serviceinstancebeans.ModelType;
 import org.onap.so.serviceinstancebeans.PolicyException;
@@ -96,7 +101,6 @@
 import com.fasterxml.jackson.databind.JsonMappingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 
-
 @Component
 public class MsoRequest {
 
@@ -106,6 +110,9 @@
     @Autowired
     private ResponseBuilder builder;
 
+    @Autowired
+    private AAIDataRetrieval aaiDataRet;
+
     @Value("${mso.enforceDLP:false}")
     private boolean enforceDLP;
 
@@ -148,7 +155,6 @@
     }
 
 
-
     // Parse request JSON
     public void parse(ServiceInstancesRequest sir, HashMap<String, String> instanceIdMap, Actions action,
             String version, String originalRequestJSON, int reqVersion, Boolean aLaCarteFlag)
@@ -222,46 +228,33 @@
         }
     }
 
-    public Map<String, List<String>> getOrchestrationFilters(MultivaluedMap<String, String> queryParams)
-            throws ValidationException {
-
-        String queryParam = null;
+    public Map<String, List<String>> getOrchestrationFilters(MultivaluedMap<String, String> queryParams) {
+        final String FILTER_KEY = "filter";
         Map<String, List<String>> orchestrationFilterParams = new HashMap<>();
 
-
-        for (Entry<String, List<String>> entry : queryParams.entrySet()) {
-            queryParam = entry.getKey();
-
-            try {
-                if ("filter".equalsIgnoreCase(queryParam)) {
-                    for (String value : entry.getValue()) {
-                        StringTokenizer st = new StringTokenizer(value, ":");
-
-                        int counter = 0;
-                        String mapKey = null;
-                        List<String> orchestrationList = new ArrayList<>();
-                        while (st.hasMoreElements()) {
-                            if (counter == 0) {
-                                mapKey = st.nextElement() + "";
-                            } else {
-                                orchestrationList.add(st.nextElement() + "");
-                            }
-                            counter++;
-                        }
-                        orchestrationFilterParams.put(mapKey, orchestrationList);
-                    }
-                }
-
-            } catch (Exception e) {
-                throw new ValidationException("QueryParam ServiceInfo", e);
-            }
-
-        }
-
+        Optional.ofNullable(queryParams.get(FILTER_KEY)).ifPresent(listValues -> listValues
+                .forEach(value -> addValueToOrchestrationFilterParamsMap(orchestrationFilterParams, value)));
 
         return orchestrationFilterParams;
     }
 
+    private void addValueToOrchestrationFilterParamsMap(Map<String, List<String>> orchestrationFilterParams,
+            String value) {
+        final String TOKEN_DELIMITER = ":";
+        StringTokenizer stringTokenizer = new StringTokenizer(value, TOKEN_DELIMITER);
+
+        if (!stringTokenizer.hasMoreTokens()) {
+            return;
+        }
+        String mapKey = stringTokenizer.nextToken();
+        List<String> orchestrationList = new ArrayList<>();
+        while (stringTokenizer.hasMoreTokens()) {
+            orchestrationList.add(stringTokenizer.nextToken());
+        }
+
+        orchestrationFilterParams.put(mapKey, orchestrationList);
+    }
+
     public InfraActiveRequests createRequestObject(ServiceInstancesRequest servInsReq, Actions action, String requestId,
             Status status, String originalRequestJSON, String requestScope) {
         InfraActiveRequests aq = new InfraActiveRequests();
@@ -324,11 +317,30 @@
                     aq.setVnfId(servInsReq.getVnfInstanceId());
                 }
 
-                if (servInsReq.getPnfId() != null) {
+                if (servInsReq.getPnfName() != null) {
                     aq.setRequestScope(requestScope);
-                    aq.setPnfId(servInsReq.getPnfId());
+                    aq.setPnfName(servInsReq.getPnfName());
                 }
 
+                if (servInsReq.getRequestDetails() != null && servInsReq.getRequestDetails().getRequestInfo() != null
+                        && servInsReq.getRequestDetails().getRequestInfo().getProductFamilyId() != null) {
+                    logger.debug("Retrieving productFamilyName to put into requests db");
+
+                    org.onap.aai.domain.yang.Service service =
+                            aaiDataRet.getService(servInsReq.getRequestDetails().getRequestInfo().getProductFamilyId());
+                    if (service != null) {
+                        logger.debug("Found service by service-id");
+                        String productFamilyName = service.getServiceDescription();
+                        if (productFamilyName != null) {
+                            aq.setProductFamilyName(productFamilyName);
+                        }
+                    }
+                }
+
+                aq.setProductFamilyName(getProductFamilyNameFromAAI(servInsReq));
+
+                aq.setTenantName(getTenantNameFromAAI(servInsReq));
+
                 if (ModelType.service.name().equalsIgnoreCase(requestScope)) {
                     if (servInsReq.getRequestDetails().getRequestInfo() != null) {
                         if (servInsReq.getRequestDetails().getRequestInfo().getInstanceName() != null) {
@@ -465,7 +477,6 @@
     }
 
 
-
     public Response buildResponse(int httpResponseCode, String errorCode, InfraActiveRequests inProgress) {
         return buildResponseWithError(httpResponseCode, errorCode, inProgress, null);
     }
@@ -474,7 +485,6 @@
             String errorString) {
 
 
-
         // Log the failed request into the MSO Requests database
 
         return Response.status(httpResponseCode).entity(null).build();
@@ -487,7 +497,6 @@
     }
 
 
-
     public String getServiceType(VnfInputs vnfInputs) {
         if (vnfInputs.getServiceType() != null)
             return vnfInputs.getServiceType();
@@ -625,156 +634,105 @@
     }
 
 
-    public String getVfModuleType(ServiceInstancesRequest sir, String requestScope, Actions action, int reqVersion) {
+    public String getVfModuleType(ServiceInstancesRequest sir, String requestScope) {
 
-        String serviceInstanceType = null;
-
-        String vnfType = null;
+        String vnfType;
         String vfModuleType = null;
-        String vfModuleModelName = null;
+        String vfModuleModelName;
         ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
         RelatedInstanceList[] instanceList = sir.getRequestDetails().getRelatedInstanceList();
         String serviceModelName = null;
         String vnfModelName = null;
-        String asdcServiceModelVersion = null;
         String volumeGroupId = null;
-        boolean isRelatedServiceInstancePresent = false;
-        boolean isRelatedVnfInstancePresent = false;
-        boolean isSourceVnfPresent = false;
-        boolean isDestinationVnfPresent = false;
-        boolean isConnectionPointPresent = false;
 
-        if (instanceList != null) {
-            for (RelatedInstanceList relatedInstanceList : instanceList) {
-                RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
-                ModelInfo relatedInstanceModelInfo = relatedInstance.getModelInfo();
+        if (instanceList == null) {
+            return null;
+        }
+        for (RelatedInstanceList relatedInstanceList : instanceList) {
+            RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
+            ModelInfo relatedInstanceModelInfo = relatedInstance.getModelInfo();
 
-                if (action != Action.deleteInstance) {
-
-                    if (ModelType.configuration.name().equalsIgnoreCase(requestScope)) {
-                        if (InstanceDirection.source.equals(relatedInstance.getInstanceDirection())
-                                && relatedInstanceModelInfo.getModelType().equals(ModelType.vnf)) {
-                            isSourceVnfPresent = true;
-                        } else if (InstanceDirection.destination.equals(relatedInstance.getInstanceDirection())
-                                && (relatedInstanceModelInfo.getModelType().equals(ModelType.vnf)
-                                        || (relatedInstanceModelInfo.getModelType().equals(ModelType.pnf)
-                                                && reqVersion == 6))) {
-                            isDestinationVnfPresent = true;
-                        }
-                    }
-
-                    if (ModelType.connectionPoint.equals(relatedInstanceModelInfo.getModelType())
-                            && ModelType.configuration.name().equalsIgnoreCase(requestScope)) {
-                        isConnectionPointPresent = true;
-                    }
-                }
-
-
-                if (relatedInstanceModelInfo.getModelType().equals(ModelType.service)) {
-                    isRelatedServiceInstancePresent = true;
-                    serviceModelName = relatedInstanceModelInfo.getModelName();
-                    asdcServiceModelVersion = relatedInstanceModelInfo.getModelVersion();
-                } else if (relatedInstanceModelInfo.getModelType().equals(ModelType.vnf)
-                        && !(ModelType.configuration.name().equalsIgnoreCase(requestScope))) {
-                    isRelatedVnfInstancePresent = true;
-                    vnfModelName = relatedInstanceModelInfo.getModelCustomizationName();
-                } else if (relatedInstanceModelInfo.getModelType().equals(ModelType.volumeGroup)) {
-                    volumeGroupId = relatedInstance.getInstanceId();
-                }
+            if (relatedInstanceModelInfo.getModelType().equals(ModelType.service)) {
+                serviceModelName = relatedInstanceModelInfo.getModelName();
+            } else if (relatedInstanceModelInfo.getModelType().equals(ModelType.vnf)
+                    && !(ModelType.configuration.name().equalsIgnoreCase(requestScope))) {
+                vnfModelName = relatedInstanceModelInfo.getModelCustomizationName();
+            } else if (relatedInstanceModelInfo.getModelType().equals(ModelType.volumeGroup)) {
+                volumeGroupId = relatedInstance.getInstanceId();
             }
-
-            if (requestScope.equalsIgnoreCase(ModelType.volumeGroup.name())) {
-                serviceInstanceType = serviceModelName;
-                vnfType = serviceModelName + "/" + vnfModelName;
-            } else if (requestScope.equalsIgnoreCase(ModelType.vfModule.name())) {
-                vfModuleModelName = modelInfo.getModelName();
-                serviceInstanceType = serviceModelName;
-                vnfType = serviceModelName + "/" + vnfModelName;
-                vfModuleType = vnfType + "::" + vfModuleModelName;
-                sir.setVolumeGroupInstanceId(volumeGroupId);
-            } else if (requestScope.equalsIgnoreCase(ModelType.vnf.name()))
-                vnfType = serviceModelName + "/" + sir.getRequestDetails().getModelInfo().getModelCustomizationName();
-
+        }
+        if (requestScope.equalsIgnoreCase(ModelType.vfModule.name())) {
+            vfModuleModelName = modelInfo.getModelName();
+            vnfType = serviceModelName + "/" + vnfModelName;
+            vfModuleType = vnfType + "::" + vfModuleModelName;
+            sir.setVolumeGroupInstanceId(volumeGroupId);
         }
 
         return vfModuleType;
 
     }
 
-    public String getVnfType(ServiceInstancesRequest sir, String requestScope, Actions action, int reqVersion) {
+    public String getVnfType(ServiceInstancesRequest sir, String requestScope) {
 
-        String serviceInstanceType = null;
-        String networkType = null;
         String vnfType = null;
-        String vfModuleType = null;
-        String vfModuleModelName = null;
-        ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
         RelatedInstanceList[] instanceList = sir.getRequestDetails().getRelatedInstanceList();
         String serviceModelName = null;
         String vnfModelName = null;
-        String asdcServiceModelVersion = null;
         String volumeGroupId = null;
-        boolean isRelatedServiceInstancePresent = false;
-        boolean isRelatedVnfInstancePresent = false;
-        boolean isSourceVnfPresent = false;
-        boolean isDestinationVnfPresent = false;
-        boolean isConnectionPointPresent = false;
 
-        if (instanceList != null) {
-            for (RelatedInstanceList relatedInstanceList : instanceList) {
-                RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
-                ModelInfo relatedInstanceModelInfo = relatedInstance.getModelInfo();
+        if (instanceList == null) {
+            return null;
+        }
+        for (RelatedInstanceList relatedInstanceList : instanceList) {
+            RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
+            ModelInfo relatedInstanceModelInfo = relatedInstance.getModelInfo();
 
-                if (action != Action.deleteInstance) {
-
-                    if (ModelType.configuration.name().equalsIgnoreCase(requestScope)) {
-                        if (InstanceDirection.source.equals(relatedInstance.getInstanceDirection())
-                                && relatedInstanceModelInfo.getModelType().equals(ModelType.vnf)) {
-                            isSourceVnfPresent = true;
-                        } else if (InstanceDirection.destination.equals(relatedInstance.getInstanceDirection())
-                                && (relatedInstanceModelInfo.getModelType().equals(ModelType.vnf)
-                                        || (relatedInstanceModelInfo.getModelType().equals(ModelType.pnf)
-                                                && reqVersion == 6))) {
-                            isDestinationVnfPresent = true;
-                        }
-                    }
-
-                    if (ModelType.connectionPoint.equals(relatedInstanceModelInfo.getModelType())
-                            && ModelType.configuration.name().equalsIgnoreCase(requestScope)) {
-                        isConnectionPointPresent = true;
-                    }
-                }
-
-
-                if (relatedInstanceModelInfo.getModelType().equals(ModelType.service)) {
-                    isRelatedServiceInstancePresent = true;
-                    serviceModelName = relatedInstanceModelInfo.getModelName();
-                    asdcServiceModelVersion = relatedInstanceModelInfo.getModelVersion();
-                } else if (relatedInstanceModelInfo.getModelType().equals(ModelType.vnf)
-                        && !(ModelType.configuration.name().equalsIgnoreCase(requestScope))) {
-                    isRelatedVnfInstancePresent = true;
-                    vnfModelName = relatedInstanceModelInfo.getModelCustomizationName();
-                } else if (relatedInstanceModelInfo.getModelType().equals(ModelType.volumeGroup)) {
-                    volumeGroupId = relatedInstance.getInstanceId();
-                }
+            if (relatedInstanceModelInfo.getModelType().equals(ModelType.service)) {
+                serviceModelName = relatedInstanceModelInfo.getModelName();
+            } else if (relatedInstanceModelInfo.getModelType().equals(ModelType.vnf)
+                    && !(ModelType.configuration.name().equalsIgnoreCase(requestScope))) {
+                vnfModelName = relatedInstanceModelInfo.getModelCustomizationName();
+            } else if (relatedInstanceModelInfo.getModelType().equals(ModelType.volumeGroup)) {
+                volumeGroupId = relatedInstance.getInstanceId();
             }
-
-            if (requestScope.equalsIgnoreCase(ModelType.volumeGroup.name())) {
-                serviceInstanceType = serviceModelName;
-                vnfType = serviceModelName + "/" + vnfModelName;
-            } else if (requestScope.equalsIgnoreCase(ModelType.vfModule.name())) {
-                vfModuleModelName = modelInfo.getModelName();
-                serviceInstanceType = serviceModelName;
-                vnfType = serviceModelName + "/" + vnfModelName;
-                vfModuleType = vnfType + "::" + vfModuleModelName;
-                sir.setVolumeGroupInstanceId(volumeGroupId);
-            } else if (requestScope.equalsIgnoreCase(ModelType.vnf.name()))
-                vnfType = serviceModelName + "/" + sir.getRequestDetails().getModelInfo().getModelCustomizationName();
-
         }
 
-        return vnfType;
+        if (requestScope.equalsIgnoreCase(ModelType.volumeGroup.name())) {
+            vnfType = serviceModelName + "/" + vnfModelName;
+        } else if (requestScope.equalsIgnoreCase(ModelType.vfModule.name())) {
+            vnfType = serviceModelName + "/" + vnfModelName;
+            sir.setVolumeGroupInstanceId(volumeGroupId);
+        } else if (requestScope.equalsIgnoreCase(ModelType.vnf.name()))
+            vnfType = serviceModelName + "/" + sir.getRequestDetails().getModelInfo().getModelCustomizationName();
 
+        return vnfType;
+    }
+
+    protected String getTenantNameFromAAI(ServiceInstancesRequest servInsReq) {
+        String tenantName = null;
+        if (servInsReq.getRequestDetails() != null && servInsReq.getRequestDetails().getCloudConfiguration() != null
+                && servInsReq.getRequestDetails().getCloudConfiguration().getTenantId() != null) {
+            Tenant tenant = aaiDataRet.getTenant(servInsReq.getRequestDetails().getCloudConfiguration().getCloudOwner(),
+                    servInsReq.getRequestDetails().getCloudConfiguration().getLcpCloudRegionId(),
+                    servInsReq.getRequestDetails().getCloudConfiguration().getTenantId());
+            if (tenant != null) {
+                tenantName = tenant.getTenantName();
+            }
+        }
+        return tenantName;
+    }
+
+    protected String getProductFamilyNameFromAAI(ServiceInstancesRequest servInsReq) {
+        String productFamilyName = null;
+        if (servInsReq.getRequestDetails() != null && servInsReq.getRequestDetails().getRequestInfo() != null
+                && servInsReq.getRequestDetails().getRequestInfo().getProductFamilyId() != null) {
+            org.onap.aai.domain.yang.Service service =
+                    aaiDataRet.getService(servInsReq.getRequestDetails().getRequestInfo().getProductFamilyId());
+            if (service != null) {
+                productFamilyName = service.getServiceDescription();
+            }
+        }
+        return productFamilyName;
     }
 
 }
diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/OrchestrationRequests.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/OrchestrationRequests.java
index ae68cc6..fec93f7 100644
--- a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/OrchestrationRequests.java
+++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/OrchestrationRequests.java
@@ -347,6 +347,13 @@
                 } else {
                     requestDetails = mapper.readValue(requestBody, RequestDetails.class);
                 }
+                if (requestDetails.getRequestInfo() != null && iar.getProductFamilyName() != null) {
+                    requestDetails.getRequestInfo().setProductFamilyName(iar.getProductFamilyName());
+                }
+                if (requestDetails.getCloudConfiguration() != null && iar.getTenantName() != null) {
+                    requestDetails.getCloudConfiguration().setTenantName(iar.getTenantName());
+                }
+
             } catch (IOException e) {
                 logger.error("Exception occurred", e);
                 ErrorLoggerInfo errorLoggerInfo =
diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/OrchestrationTasks.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/OrchestrationTasks.java
new file mode 100644
index 0000000..21129d7
--- /dev/null
+++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/OrchestrationTasks.java
@@ -0,0 +1,209 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2019 Huawei Technologies Co., Ltd. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License")
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.apihandlerinfra;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.swagger.v3.oas.annotations.OpenAPIDefinition;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.info.Info;
+import io.swagger.v3.oas.annotations.media.ArraySchema;
+import io.swagger.v3.oas.annotations.media.Content;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
+import org.apache.http.HttpStatus;
+import org.json.JSONObject;
+import org.onap.so.apihandler.common.ErrorNumbers;
+import org.onap.so.apihandler.common.ResponseBuilder;
+import org.onap.so.apihandlerinfra.exceptions.ApiException;
+import org.onap.so.db.request.beans.OrchestrationTask;
+import org.onap.so.db.request.client.RequestsDbClient;
+import org.onap.so.logger.ErrorCode;
+import org.onap.so.logger.LoggingAnchor;
+import org.onap.so.logger.MessageEnum;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import javax.transaction.Transactional;
+import javax.ws.rs.*;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import static org.onap.so.apihandlerinfra.Constants.MSO_PROP_APIHANDLER_INFRA;
+
+@Path("/onap/so/infra/orchestrationTasks")
+@OpenAPIDefinition(
+        info = @Info(title = "onap/so/infra/orchestrationTasks", description = "API Requests for Orchestration Task"))
+@Component
+public class OrchestrationTasks {
+
+    private static Logger logger = LoggerFactory.getLogger(OrchestrationTasks.class);
+
+    @Autowired
+    private MsoRequest msoRequest;
+
+    @Autowired
+    private CamundaRequestHandler camundaRequestHandler;
+
+    @Autowired
+    private RequestsDbClient requestsDbClient;
+
+    @Autowired
+    private ResponseBuilder builder;
+
+    private ObjectMapper mapper = new ObjectMapper();
+
+    @GET
+    @Path("/{version:[vV][4-7]}/")
+    @Operation(description = "Find All Orchestrated Task", responses = @ApiResponse(
+            content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
+    @Produces(MediaType.APPLICATION_JSON)
+    @Transactional
+    public Response getAllOrchestrationTasks(@QueryParam("status") String status,
+            @PathParam("version") String version) {
+        List<OrchestrationTask> orchestrationTaskList = requestsDbClient.getAllOrchestrationTasks();
+        if (status != null && !status.isEmpty()) {
+            for (Iterator<OrchestrationTask> it = orchestrationTaskList.iterator(); it.hasNext();) {
+                OrchestrationTask task = it.next();
+                if (!status.equals(task.getStatus())) {
+                    it.remove();
+                }
+            }
+        }
+        return builder.buildResponse(HttpStatus.SC_OK, null, orchestrationTaskList, version);
+    }
+
+    @GET
+    @Path("/{version:[vV][4-7]}/{taskId}")
+    @Operation(description = "Find Orchestrated Task for a given TaskId", responses = @ApiResponse(
+            content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
+    @Produces(MediaType.APPLICATION_JSON)
+    @Transactional
+    public Response getOrchestrationTask(@PathParam("taskId") String taskId, @PathParam("version") String version)
+            throws ApiException {
+        try {
+            OrchestrationTask orchestrationTask = requestsDbClient.getOrchestrationTask(taskId);
+            return builder.buildResponse(HttpStatus.SC_OK, null, orchestrationTask, version);
+        } catch (Exception e) {
+            logger.error(LoggingAnchor.FOUR, MessageEnum.APIH_DB_ACCESS_EXC.toString(), MSO_PROP_APIHANDLER_INFRA,
+                    ErrorCode.AvailabilityError.getValue(),
+                    "Exception while communciate with Request DB - Orchestration Task Lookup", e);
+            Response response =
+                    msoRequest.buildServiceErrorResponse(HttpStatus.SC_NOT_FOUND, MsoException.ServiceException,
+                            e.getMessage(), ErrorNumbers.NO_COMMUNICATION_TO_REQUESTS_DB, null, version);
+            return response;
+        }
+    }
+
+    @POST
+    @Path("/{version:[vV][4-7]}/")
+    @Operation(description = "Create an Orchestrated Task", responses = @ApiResponse(
+            content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
+    @Produces(MediaType.APPLICATION_JSON)
+    @Transactional
+    public Response CreateOrchestrationTask(String requestJson, @PathParam("version") String version) {
+        try {
+            OrchestrationTask orchestrationTask = mapper.readValue(requestJson, OrchestrationTask.class);
+            requestsDbClient.createOrchestrationTask(orchestrationTask);
+            return builder.buildResponse(HttpStatus.SC_OK, null, orchestrationTask, version);
+        } catch (Exception e) {
+            logger.error(LoggingAnchor.FOUR, MessageEnum.APIH_DB_ACCESS_EXC.toString(), MSO_PROP_APIHANDLER_INFRA,
+                    ErrorCode.AvailabilityError.getValue(),
+                    "Exception while communciate with Request DB - Orchestration Task Create", e);
+            Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_INTERNAL_SERVER_ERROR,
+                    MsoException.ServiceException, e.getMessage(), ErrorNumbers.COULD_NOT_WRITE_TO_REQUESTS_DB, null,
+                    version);
+            return response;
+        }
+    }
+
+    @PUT
+    @Path("/{version:[vV][4-7]}/{taskId}")
+    @Operation(description = "Update an Orchestrated Task", responses = @ApiResponse(
+            content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
+    @Produces(MediaType.APPLICATION_JSON)
+    @Transactional
+    public Response UpdateOrchestrationTask(@PathParam("taskId") String taskId, String requestJson,
+            @PathParam("version") String version) {
+        try {
+            OrchestrationTask orchestrationTask = requestsDbClient.getOrchestrationTask(taskId);
+        } catch (Exception e) {
+            logger.error(LoggingAnchor.FOUR, MessageEnum.APIH_DB_ACCESS_EXC.toString(), MSO_PROP_APIHANDLER_INFRA,
+                    ErrorCode.AvailabilityError.getValue(),
+                    "Exception while communciate with Request DB - Orchestration Task Update", e);
+            Response response =
+                    msoRequest.buildServiceErrorResponse(HttpStatus.SC_NOT_FOUND, MsoException.ServiceException,
+                            e.getMessage(), ErrorNumbers.NO_COMMUNICATION_TO_REQUESTS_DB, null, version);
+            return response;
+        }
+
+        try {
+            OrchestrationTask orchestrationTask = mapper.readValue(requestJson, OrchestrationTask.class);
+            requestsDbClient.updateOrchestrationTask(taskId, orchestrationTask);
+            return builder.buildResponse(HttpStatus.SC_OK, null, orchestrationTask, version);
+        } catch (Exception e) {
+            logger.error(LoggingAnchor.FOUR, MessageEnum.APIH_DB_ACCESS_EXC.toString(), MSO_PROP_APIHANDLER_INFRA,
+                    ErrorCode.AvailabilityError.getValue(),
+                    "Exception while communciate with Request DB - Orchestration Task Update", e);
+            Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_INTERNAL_SERVER_ERROR,
+                    MsoException.ServiceException, e.getMessage(), ErrorNumbers.NO_COMMUNICATION_TO_REQUESTS_DB, null,
+                    version);
+            return response;
+        }
+    }
+
+    @DELETE
+    @Path("/{version:[vV][4-7]}/{taskId}")
+    @Operation(description = "Delete an Orchestrated Task", responses = @ApiResponse(
+            content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
+    @Produces(MediaType.APPLICATION_JSON)
+    @Transactional
+    public Response DeleteOrchestrationTask(@PathParam("taskId") String taskId, @PathParam("version") String version) {
+        try {
+            OrchestrationTask orchestrationTask = requestsDbClient.getOrchestrationTask(taskId);
+        } catch (Exception e) {
+            logger.error(LoggingAnchor.FOUR, MessageEnum.APIH_DB_ACCESS_EXC.toString(), MSO_PROP_APIHANDLER_INFRA,
+                    ErrorCode.AvailabilityError.getValue(),
+                    "Exception while communciate with Request DB - Orchestration Task Delete", e);
+            Response response =
+                    msoRequest.buildServiceErrorResponse(HttpStatus.SC_NOT_FOUND, MsoException.ServiceException,
+                            e.getMessage(), ErrorNumbers.NO_COMMUNICATION_TO_REQUESTS_DB, null, version);
+            return response;
+        }
+
+        try {
+            requestsDbClient.deleteOrchestrationTask(taskId);
+            return builder.buildResponse(HttpStatus.SC_OK, null, null, version);
+        } catch (Exception e) {
+            logger.error(LoggingAnchor.FOUR, MessageEnum.APIH_DB_ACCESS_EXC.toString(), MSO_PROP_APIHANDLER_INFRA,
+                    ErrorCode.AvailabilityError.getValue(),
+                    "Exception while communciate with Request DB - Orchestration Task Delete", e);
+            Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_INTERNAL_SERVER_ERROR,
+                    MsoException.ServiceException, e.getMessage(), ErrorNumbers.COULD_NOT_WRITE_TO_REQUESTS_DB, null,
+                    version);
+            return response;
+        }
+    }
+
+}
diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/RequestHandlerUtils.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/RequestHandlerUtils.java
index 75b7e74..38fb159 100644
--- a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/RequestHandlerUtils.java
+++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/RequestHandlerUtils.java
@@ -506,8 +506,8 @@
             if (instanceIdMap.get(CommonConstants.INSTANCE_GROUP_INSTANCE_ID) != null) {
                 currentActiveReq.setInstanceGroupId(instanceIdMap.get(CommonConstants.INSTANCE_GROUP_INSTANCE_ID));
             }
-            if (instanceIdMap.get("PnfId") != null) {
-                currentActiveReq.setPnfId(instanceIdMap.get("PnfId"));
+            if (instanceIdMap.get("pnfName") != null) {
+                currentActiveReq.setPnfName(instanceIdMap.get("pnfName"));
             }
         }
     }
diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/ResumeOrchestrationRequest.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/ResumeOrchestrationRequest.java
index 65537cb..a15d9cf 100644
--- a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/ResumeOrchestrationRequest.java
+++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/ResumeOrchestrationRequest.java
@@ -251,25 +251,22 @@
         }
 
         try {
-            requestClientParameter =
-                    new RequestClientParameter.Builder().setRequestId(currentActiveRequest.getRequestId())
-                            .setBaseVfModule(isBaseVfModule).setRecipeTimeout(recipeLookupResult.getRecipeTimeout())
-                            .setRequestAction(infraActiveRequest.getRequestAction())
-                            .setServiceInstanceId(infraActiveRequest.getServiceInstanceId())
-                            .setPnfCorrelationId(pnfCorrelationId).setVnfId(infraActiveRequest.getVnfId())
-                            .setVfModuleId(infraActiveRequest.getVfModuleId())
-                            .setVolumeGroupId(infraActiveRequest.getVolumeGroupId())
-                            .setNetworkId(infraActiveRequest.getNetworkId())
-                            .setServiceType(infraActiveRequest.getServiceType())
-                            .setVnfType(infraActiveRequest.getVnfType())
-                            .setVfModuleType(msoRequest.getVfModuleType(sir, infraActiveRequest.getRequestScope(),
-                                    action, Integer.parseInt(version)))
-                            .setNetworkType(infraActiveRequest.getNetworkType())
-                            .setRequestDetails(requestHandlerUtils
-                                    .mapJSONtoMSOStyle(infraActiveRequest.getRequestBody(), sir, aLaCarte, action))
-                            .setApiVersion(version).setALaCarte(aLaCarte)
-                            .setRequestUri(currentActiveRequest.getRequestUrl())
-                            .setInstanceGroupId(infraActiveRequest.getInstanceGroupId()).build();
+            requestClientParameter = new RequestClientParameter.Builder()
+                    .setRequestId(currentActiveRequest.getRequestId()).setBaseVfModule(isBaseVfModule)
+                    .setRecipeTimeout(recipeLookupResult.getRecipeTimeout())
+                    .setRequestAction(infraActiveRequest.getRequestAction())
+                    .setServiceInstanceId(infraActiveRequest.getServiceInstanceId())
+                    .setPnfCorrelationId(pnfCorrelationId).setVnfId(infraActiveRequest.getVnfId())
+                    .setVfModuleId(infraActiveRequest.getVfModuleId())
+                    .setVolumeGroupId(infraActiveRequest.getVolumeGroupId())
+                    .setNetworkId(infraActiveRequest.getNetworkId()).setServiceType(infraActiveRequest.getServiceType())
+                    .setVnfType(infraActiveRequest.getVnfType())
+                    .setVfModuleType(msoRequest.getVfModuleType(sir, infraActiveRequest.getRequestScope()))
+                    .setNetworkType(infraActiveRequest.getNetworkType())
+                    .setRequestDetails(requestHandlerUtils.mapJSONtoMSOStyle(infraActiveRequest.getRequestBody(), sir,
+                            aLaCarte, action))
+                    .setApiVersion(version).setALaCarte(aLaCarte).setRequestUri(currentActiveRequest.getRequestUrl())
+                    .setInstanceGroupId(infraActiveRequest.getInstanceGroupId()).build();
         } catch (IOException e) {
             logger.error("IOException while generating requestClientParameter to send to BPMN", e);
             ErrorLoggerInfo errorLoggerInfo =
diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/ServiceInstances.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/ServiceInstances.java
index 175b212..33eae43 100644
--- a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/ServiceInstances.java
+++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/ServiceInstances.java
@@ -844,17 +844,15 @@
         }
         requestHandlerUtils.setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
 
-
-        int requestVersion = Integer.parseInt(version.substring(1));
         String instanceName = null;
         if (sir.getRequestDetails().getRequestInfo() != null) {
             instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
         }
         boolean alaCarteFlag = msoRequest.getAlacarteFlag(sir);
-        String vnfType = msoRequest.getVnfType(sir, requestScope, action, requestVersion);
+        String vnfType = msoRequest.getVnfType(sir, requestScope);
         String networkType = msoRequest.getNetworkType(sir, requestScope);
         String sdcServiceModelVersion = msoRequest.getSDCServiceModelVersion(sir);
-        String vfModuleType = msoRequest.getVfModuleType(sir, requestScope, action, requestVersion);
+        String vfModuleType = msoRequest.getVfModuleType(sir, requestScope);
 
         if (requestScope.equalsIgnoreCase(ModelType.vnf.name()) && vnfType != null) {
             currentActiveReq.setVnfType(vnfType);
@@ -935,7 +933,7 @@
         }
 
 
-        RequestClientParameter requestClientParameter = null;
+        RequestClientParameter requestClientParameter;
         try {
             requestClientParameter = new RequestClientParameter.Builder().setRequestId(requestId)
                     .setBaseVfModule(isBaseVfModule).setRecipeTimeout(recipeLookupResult.getRecipeTimeout())
diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/WorkflowSpecificationsHandler.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/WorkflowSpecificationsHandler.java
index 925d101..d995535 100644
--- a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/WorkflowSpecificationsHandler.java
+++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/WorkflowSpecificationsHandler.java
@@ -6,6 +6,8 @@
  * ================================================================================
  * Modifications Copyright (c) 2019 Samsung
  * ================================================================================
+ * Modifications Copyright (c) 2020 Nordix
+ * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
@@ -21,41 +23,6 @@
  */
 package org.onap.so.apihandlerinfra;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-import javax.transaction.Transactional;
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.Response;
-import org.apache.http.HttpStatus;
-import org.onap.so.apihandler.common.ErrorNumbers;
-import org.onap.so.apihandler.common.ResponseBuilder;
-import org.onap.so.apihandlerinfra.exceptions.ValidateException;
-import org.onap.so.apihandlerinfra.logging.ErrorLoggerInfo;
-import org.onap.so.apihandlerinfra.workflowspecificationbeans.ActivitySequence;
-import org.onap.so.apihandlerinfra.workflowspecificationbeans.ArtifactInfo;
-import org.onap.so.apihandlerinfra.workflowspecificationbeans.Validation;
-import org.onap.so.apihandlerinfra.workflowspecificationbeans.WorkflowInputParameter;
-import org.onap.so.apihandlerinfra.workflowspecificationbeans.WorkflowSpecification;
-import org.onap.so.apihandlerinfra.workflowspecificationbeans.WorkflowSpecificationList;
-import org.onap.so.apihandlerinfra.workflowspecificationbeans.WorkflowSpecifications;
-import org.onap.so.db.catalog.beans.ActivitySpec;
-import org.onap.so.db.catalog.beans.ActivitySpecUserParameters;
-import org.onap.so.db.catalog.beans.UserParameters;
-import org.onap.so.db.catalog.beans.Workflow;
-import org.onap.so.db.catalog.beans.WorkflowActivitySpecSequence;
-import org.onap.so.db.catalog.client.CatalogDbClient;
-import org.onap.so.logger.ErrorCode;
-import org.onap.so.logger.MessageEnum;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.DeserializationFeature;
 import com.fasterxml.jackson.databind.ObjectMapper;
@@ -66,6 +33,29 @@
 import io.swagger.v3.oas.annotations.media.Content;
 import io.swagger.v3.oas.annotations.media.Schema;
 import io.swagger.v3.oas.annotations.responses.ApiResponse;
+import org.apache.http.HttpStatus;
+import org.onap.so.apihandler.common.ErrorNumbers;
+import org.onap.so.apihandler.common.ResponseBuilder;
+import org.onap.so.apihandlerinfra.exceptions.ValidateException;
+import org.onap.so.apihandlerinfra.logging.ErrorLoggerInfo;
+import org.onap.so.apihandlerinfra.workflowspecificationbeans.*;
+import org.onap.so.db.catalog.beans.*;
+import org.onap.so.db.catalog.client.CatalogDbClient;
+import org.onap.so.logger.ErrorCode;
+import org.onap.so.logger.MessageEnum;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import javax.transaction.Transactional;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.Response;
+import java.util.*;
+import java.util.stream.Collectors;
+
 
 @Path("onap/so/infra/workflowSpecifications")
 @OpenAPIDefinition(info = @Info(title = "onap/so/infra/workflowSpecifications",
@@ -82,6 +72,7 @@
     private static Logger logger = LoggerFactory.getLogger(WorkflowSpecificationsHandler.class);
     private static final String ARTIFACT_TYPE_WORKFLOW = "workflow";
     private static final String NATIVE_WORKFLOW = "native";
+    private static final String EMPTY_BODY = "";
 
     @Path("/{version:[vV]1}/workflows")
     @GET
@@ -90,38 +81,62 @@
     @Transactional
 
     public Response queryWorkflowSpecifications(@QueryParam("vnfModelVersionId") String vnfModelVersionId,
-            @PathParam("version") String version) throws Exception {
-
+            @QueryParam("pnfModelVersionId") String pnfModelVersionId, @PathParam("version") String version)
+            throws Exception {
         String apiVersion = version.substring(1);
 
-        ObjectMapper mapper1 = new ObjectMapper();
-        mapper1.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+        List<Workflow> workflows = new ArrayList<>();
+        if (vnfModelVersionId == null && pnfModelVersionId == null) {
+            workflows.addAll(queryWorkflowSpecificationsForAll());
+        } else {
+            // 1. query workflow specifications for given vnfModelVersionId if need.
+            if (vnfModelVersionId != null) {
+                List<Workflow> vnfWorkflows = queryWorkflowSpecificationsForVnf(vnfModelVersionId);
+                logger.debug("Retrieved " + vnfWorkflows.size() + " workflows for given vnfModelVersionId.");
+                if (vnfWorkflows.size() > 0) {
+                    workflows.addAll(vnfWorkflows);
+                }
+            }
 
-        List<Workflow> workflows = catalogDbClient.findWorkflowByModelUUID(vnfModelVersionId);
-
-        List<Workflow> nativeWorkflows = catalogDbClient.findWorkflowBySource(NATIVE_WORKFLOW);
-        if (nativeWorkflows != null && !nativeWorkflows.isEmpty()) {
-            workflows.addAll(nativeWorkflows);
+            // 2. query workflow specifications for given pnfModelVersionId if need.
+            if (pnfModelVersionId != null) {
+                List<Workflow> pnfWorkflows = queryWorkflowSpecificationsForPnf(pnfModelVersionId);
+                logger.debug("Retrieved " + pnfWorkflows.size() + " workflows for given pnfModelVerionId.");
+                if (pnfWorkflows.size() > 0) {
+                    workflows.addAll(pnfWorkflows);
+                }
+            }
         }
 
-        WorkflowSpecifications workflowSpecifications = mapWorkflowsToWorkflowSpecifications(workflows);
+        // Deduplication
+        List<Workflow> retWorkflows = workflows.stream()
+                .collect(Collectors.collectingAndThen(
+                        Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(Workflow::getArtifactUUID))),
+                        ArrayList::new));
 
-        String jsonResponse;
-        try {
-            ObjectMapper mapper = new ObjectMapper();
-            jsonResponse = mapper.writeValueAsString(workflowSpecifications);
-        } catch (JsonProcessingException e) {
-            ErrorLoggerInfo errorLoggerInfo =
-                    new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, ErrorCode.SchemaError)
-                            .build();
-            ValidateException validateException =
-                    new ValidateException.Builder("Mapping of request to JSON object failed : " + e.getMessage(),
-                            HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
-                                    .errorInfo(errorLoggerInfo).build();
-            throw validateException;
-        }
+        Optional<String> optional = getResponseByWorkflowSpec(retWorkflows);
+        return builder.buildResponse(HttpStatus.SC_OK, "", optional.isPresent() ? optional.get() : EMPTY_BODY,
+                apiVersion);
+    }
 
-        return builder.buildResponse(HttpStatus.SC_OK, "", jsonResponse, apiVersion);
+    @Path("/{version:[vV]1}/pnfWorkflows")
+    @GET
+    @Operation(description = "Finds pnf workflow specifications", responses = @ApiResponse(
+            content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
+    @Transactional
+    public Response getWorkflowsSpecForPnf(@PathParam("version") String version) throws Exception {
+
+        final String pnf_resource = "pnf";
+        String apiVersion = version.substring(1);
+
+        ObjectMapper mapper = new ObjectMapper();
+        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+
+        List<Workflow> workflows = catalogDbClient.findWorkflowByResourceTarget(pnf_resource);
+
+        Optional<String> optional = getResponseByWorkflowSpec(workflows);
+        return builder.buildResponse(HttpStatus.SC_OK, "", optional.isPresent() ? optional.get() : EMPTY_BODY,
+                apiVersion);
     }
 
     protected WorkflowSpecifications mapWorkflowsToWorkflowSpecifications(List<Workflow> workflows) {
@@ -144,6 +159,28 @@
         return workflowSpecifications;
     }
 
+    private Optional<String> getResponseByWorkflowSpec(List<Workflow> workflows) throws ValidateException {
+        WorkflowSpecifications workflowSpecifications = mapWorkflowsToWorkflowSpecifications(workflows);
+
+        try {
+            ObjectMapper mapper = new ObjectMapper();
+            return Optional.of(mapper.writeValueAsString(workflowSpecifications));
+        } catch (JsonProcessingException e) {
+            catchAndThrowValidationEx(e);
+        }
+        return Optional.empty();
+    }
+
+    private Response catchAndThrowValidationEx(JsonProcessingException e) throws ValidateException {
+        ErrorLoggerInfo errorLoggerInfo =
+                new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, ErrorCode.SchemaError).build();
+        ValidateException validateException =
+                new ValidateException.Builder("Mapping of request to JSON object failed : " + e.getMessage(),
+                        HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e).errorInfo(errorLoggerInfo)
+                                .build();
+        throw validateException;
+    }
+
     private ArtifactInfo buildArtifactInfo(Workflow workflow) {
         ArtifactInfo artifactInfo = new ArtifactInfo();
         artifactInfo.setArtifactType(ARTIFACT_TYPE_WORKFLOW);
@@ -239,4 +276,24 @@
         }
         return validationList;
     }
+
+    private List<Workflow> queryWorkflowSpecificationsForAll() {
+        List<Workflow> workflows = catalogDbClient.findWorkflowBySource(NATIVE_WORKFLOW);
+        return workflows;
+    }
+
+    private List<Workflow> queryWorkflowSpecificationsForVnf(String vnfModelVersionId) {
+        List<Workflow> workflows = catalogDbClient.findWorkflowByVnfModelUUID(vnfModelVersionId);
+
+        List<Workflow> nativeWorkflows = catalogDbClient.findWorkflowBySource(NATIVE_WORKFLOW);
+        if (!nativeWorkflows.isEmpty()) {
+            workflows.addAll(nativeWorkflows);
+        }
+        return workflows;
+    }
+
+    private List<Workflow> queryWorkflowSpecificationsForPnf(String pnfModelVersionId) {
+        List<Workflow> workflows = catalogDbClient.findWorkflowByPnfModelUUID(pnfModelVersionId);
+        return workflows;
+    }
 }
diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/infra/rest/AAIDataRetrieval.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/infra/rest/AAIDataRetrieval.java
index 344e543..fee7a3a 100644
--- a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/infra/rest/AAIDataRetrieval.java
+++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/infra/rest/AAIDataRetrieval.java
@@ -3,7 +3,9 @@
 import java.util.Optional;
 import org.onap.aai.domain.yang.GenericVnf;
 import org.onap.aai.domain.yang.L3Network;
+import org.onap.aai.domain.yang.Service;
 import org.onap.aai.domain.yang.ServiceInstance;
+import org.onap.aai.domain.yang.Tenant;
 import org.onap.aai.domain.yang.VfModule;
 import org.onap.aai.domain.yang.VolumeGroup;
 import org.onap.so.apihandlerinfra.infra.rest.exception.AAIEntityNotFound;
@@ -34,7 +36,6 @@
                 });
     }
 
-
     public VfModule getAAIVfModule(String vnfId, String vfModuleId) {
         return this.getAaiResourcesClient()
                 .get(VfModule.class, AAIUriFactory.createResourceUri(AAIObjectType.VF_MODULE, vnfId, vfModuleId))
@@ -75,6 +76,24 @@
                 });
     }
 
+    public Service getService(String serviceId) {
+        return this.getAaiResourcesClient()
+                .get(Service.class, AAIUriFactory.createResourceUri(AAIObjectType.SERVICE, serviceId)).orElseGet(() -> {
+                    logger.debug("No Service found in A&AI ServiceId: {}", serviceId);
+                    return null;
+                });
+    }
+
+    public Tenant getTenant(String cloudOwner, String cloudRegion, String tenantId) {
+        return this.getAaiResourcesClient()
+                .get(Tenant.class,
+                        AAIUriFactory.createResourceUri(AAIObjectType.TENANT, cloudOwner, cloudRegion, tenantId))
+                .orElseGet(() -> {
+                    logger.debug("No Tenant found in A&AI TenantId: {}", tenantId);
+                    return null;
+                });
+    }
+
     protected AAIResourcesClient getAaiResourcesClient() {
         if (aaiResourcesClient == null) {
             aaiResourcesClient = new AAIResourcesClient();
diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/validation/CustomWorkflowValidation.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/validation/CustomWorkflowValidation.java
index c05ef98..01c7fd3 100644
--- a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/validation/CustomWorkflowValidation.java
+++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/validation/CustomWorkflowValidation.java
@@ -29,20 +29,13 @@
 
 public class CustomWorkflowValidation implements ValidationRule {
 
+    /**
+     * This function should be generic both for custom VNF workflow and PNF workflow
+     */
     @Override
     public ValidationInformation validate(ValidationInformation info) throws ValidationException {
         RequestParameters requestParameters = info.getSir().getRequestDetails().getRequestParameters();
-        CloudConfiguration cloudConfiguration = info.getSir().getRequestDetails().getCloudConfiguration();
 
-        if (cloudConfiguration == null) {
-            // throw new ValidationException("cloudConfiguration");
-        } else if (Strings.isNullOrEmpty((cloudConfiguration.getCloudOwner()))) {
-            // throw new ValidationException("cloudOwner");
-        } else if (Strings.isNullOrEmpty((cloudConfiguration.getLcpCloudRegionId()))) {
-            // throw new ValidationException("lcpCloudRegionId");
-        } else if (Strings.isNullOrEmpty((cloudConfiguration.getTenantId()))) {
-            // throw new ValidationException("tenantId");
-        }
         if (requestParameters == null) {
             throw new ValidationException("requestParameters");
         }
diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/InstanceManagementTest.java b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/InstanceManagementTest.java
index 5c78af3..ba7fe2b 100644
--- a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/InstanceManagementTest.java
+++ b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/InstanceManagementTest.java
@@ -192,11 +192,12 @@
         requestReferences.setRequestSelfLink(createExpectedSelfLink("v1", "32807a28-1a14-4b88-b7b3-2950918aa76d"));
         expectedResponse.setRequestReferences(requestReferences);
         uri = instanceManagementUri + "v1"
-                + "/serviceInstances/5df8b6de-2083-11e7-93ae-92361f002676/pnfs/testpnfcId/workflows/81526781-e55c-4cb7-adb3-97e09d9c76bf";
+                + "/serviceInstances/5df8b6de-2083-11e7-93ae-92361f002676/pnfs/testPnfName/workflows/81526781-e55c-4cb7-adb3-97e09d9c76bf";
         ResponseEntity<String> response =
                 sendRequest(inputStream("/ExecutePNFCustomWorkflow.json"), uri, HttpMethod.POST, headers);
 
         assertEquals(Response.Status.ACCEPTED.getStatusCode(), response.getStatusCode().value());
+
         ServiceInstancesResponse realResponse = mapper.readValue(response.getBody(), ServiceInstancesResponse.class);
         assertThat(realResponse, sameBeanAs(expectedResponse).ignoring("requestReferences.requestId"));
     }
diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/MsoRequestTest.java b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/MsoRequestTest.java
index f1d5a54..d1e5dc7 100644
--- a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/MsoRequestTest.java
+++ b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/MsoRequestTest.java
@@ -22,6 +22,7 @@
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
+import static org.mockito.Mockito.doReturn;
 import java.io.IOException;
 import java.io.StringReader;
 import java.nio.file.Files;
@@ -34,12 +35,19 @@
 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
 import org.apache.http.HttpStatus;
+import org.junit.Before;
 import org.junit.ClassRule;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
 import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.onap.aai.domain.yang.Service;
+import org.onap.aai.domain.yang.Tenant;
 import org.onap.so.apihandler.common.ErrorNumbers;
+import org.onap.so.apihandlerinfra.infra.rest.AAIDataRetrieval;
 import org.onap.so.exceptions.ValidationException;
 import org.onap.so.serviceinstancebeans.ServiceInstancesRequest;
 import org.springframework.test.context.junit4.rules.SpringClassRule;
@@ -75,6 +83,17 @@
     @Rule
     public ExpectedException thrown = ExpectedException.none();
 
+    @Mock
+    private AAIDataRetrieval aaiDataRet;
+
+    @InjectMocks
+    private MsoRequest msoRequestMock;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+    }
+
     public String inputStream(String JsonInput) throws IOException {
         JsonInput = "src/test/resources/MsoRequestTest" + JsonInput;
         String input = new String(Files.readAllBytes(Paths.get(JsonInput)));
@@ -1056,5 +1075,37 @@
         assertNotNull(result);
     }
 
+    @Test
+    public void getTenantNameFromAAITest() throws Exception {
+        this.sir = mapper.readValue(inputStream("/SuccessfulValidation/ServiceAssign.json"),
+                ServiceInstancesRequest.class);
+        String tenantId = "88a6ca3ee0394ade9403f075db23167e";
+        String tenantNameFromAAI = "testTenantName";
+        String cloudRegion = "mdt1";
+        String cloudOwner = "cloudOwner";
+        this.sir.getRequestDetails().getCloudConfiguration().setCloudOwner(cloudOwner);
+        Tenant tenant = new Tenant();
+        tenant.setTenantId(tenantId);
+        tenant.setTenantName(tenantNameFromAAI);
+        doReturn(tenant).when(aaiDataRet).getTenant(cloudOwner, cloudRegion, tenantId);
+        String tenantName = msoRequestMock.getTenantNameFromAAI(this.sir);
+        assertEquals(tenantNameFromAAI, tenantName);
+    }
+
+
+    @Test
+    public void getProductFamilyNameFromAAITest() throws Exception {
+        this.sir = mapper.readValue(inputStream("/SuccessfulValidation/ServiceAssign.json"),
+                ServiceInstancesRequest.class);
+        String serviceId = "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb";
+        String serviceDescription = "testServiceDescription";
+        Service service = new Service();
+        service.setServiceId(serviceId);
+        service.setServiceDescription(serviceDescription);
+        doReturn(service).when(aaiDataRet).getService(serviceId);
+        String productFamilyName = msoRequestMock.getProductFamilyNameFromAAI(this.sir);
+        assertEquals(serviceDescription, productFamilyName);
+    }
+
 
 }
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 f566628..1332ffd 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
@@ -441,6 +441,10 @@
                 .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
                         .withBody(mapper.writeValueAsString(defaultService)).withStatus(HttpStatus.SC_OK)));
 
+        wireMockServer.stubFor(get(urlMatching(".*/service-design-and-creation/services/service/.*"))
+                .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
+                        .withBodyFile("/aai/ServiceFromAAI.json").withStatus(HttpStatus.SC_OK)));
+
         wireMockServer.stubFor(get(urlMatching(".*/service/search/.*"))
                 .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
                         .withBody(mapper.writeValueAsString(defaultService)).withStatus(HttpStatus.SC_OK)));
@@ -483,6 +487,10 @@
                 .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
                         .withBody(mapper.writeValueAsString(defaultService)).withStatus(HttpStatus.SC_OK)));
 
+        wireMockServer.stubFor(get(urlMatching(".*/service-design-and-creation/services/service/.*"))
+                .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
+                        .withBodyFile("/aai/ServiceFromAAI.json").withStatus(HttpStatus.SC_OK)));
+
         wireMockServer.stubFor(get(urlMatching(".*/service/search/.*"))
                 .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
                         .withBody(mapper.writeValueAsString(defaultService)).withStatus(HttpStatus.SC_OK)));
@@ -524,6 +532,10 @@
                 .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
                         .withBody(mapper.writeValueAsString(defaultService)).withStatus(HttpStatus.SC_OK)));
 
+        wireMockServer.stubFor(get(urlMatching(".*/service-design-and-creation/services/service/.*"))
+                .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
+                        .withBodyFile("/aai/ServiceFromAAI.json").withStatus(HttpStatus.SC_OK)));
+
         wireMockServer.stubFor(get(urlMatching(".*/service/search/.*"))
                 .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
                         .withBody(mapper.writeValueAsString(defaultService)).withStatus(HttpStatus.SC_OK)));
@@ -1939,6 +1951,10 @@
                 .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
                         .withBody(mapper.writeValueAsString(defaultService)).withStatus(HttpStatus.SC_OK)));
 
+        wireMockServer.stubFor(get(urlMatching(".*/service-design-and-creation/services/service/.*"))
+                .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
+                        .withBodyFile("/aai/ServiceFromAAI.json").withStatus(HttpStatus.SC_OK)));
+
         wireMockServer.stubFor(get(urlMatching(".*/serviceRecipe/search.*"))
                 .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
                         .withBody(mapper.writeValueAsString(serviceRecipe)).withStatus(HttpStatus.SC_OK)));
@@ -2114,6 +2130,10 @@
                 .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
                         .withBody(mapper.writeValueAsString(defaultService)).withStatus(HttpStatus.SC_OK)));
 
+        wireMockServer.stubFor(get(urlMatching(".*/service-design-and-creation/services/service/.*"))
+                .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
+                        .withBodyFile("/aai/ServiceFromAAI.json").withStatus(HttpStatus.SC_OK)));
+
         wireMockServer.stubFor(get(urlMatching(".*/serviceRecipe/search.*"))
                 .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
                         .withBody(mapper.writeValueAsString(serviceRecipe)).withStatus(HttpStatus.SC_OK)));
diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/WorkflowSpecificationsHandlerTest.java b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/WorkflowSpecificationsHandlerTest.java
index 0beab1b..21e6d53 100644
--- a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/WorkflowSpecificationsHandlerTest.java
+++ b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/WorkflowSpecificationsHandlerTest.java
@@ -4,6 +4,8 @@
  * ================================================================================
  * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
+ * Modifications Copyright (c) 2020 Nordix
+ * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
@@ -20,30 +22,15 @@
 
 package org.onap.so.apihandlerinfra;
 
-import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
-import static com.github.tomakehurst.wiremock.client.WireMock.get;
-import static com.github.tomakehurst.wiremock.client.WireMock.urlMatching;
-import static com.shazam.shazamcrest.matcher.Matchers.sameBeanAs;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertThat;
-import java.io.File;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.text.ParseException;
-import java.util.ArrayList;
-import java.util.List;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.JsonMappingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import org.json.JSONException;
 import org.junit.Test;
 import org.onap.so.apihandlerinfra.workflowspecificationbeans.WorkflowInputParameter;
 import org.onap.so.apihandlerinfra.workflowspecificationbeans.WorkflowSpecifications;
-import org.onap.so.db.catalog.beans.ActivitySpec;
-import org.onap.so.db.catalog.beans.ActivitySpecUserParameters;
-import org.onap.so.db.catalog.beans.UserParameters;
-import org.onap.so.db.catalog.beans.Workflow;
-import org.onap.so.db.catalog.beans.WorkflowActivitySpecSequence;
+import org.onap.so.db.catalog.beans.*;
 import org.skyscreamer.jsonassert.JSONAssert;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
@@ -53,10 +40,19 @@
 import org.springframework.http.ResponseEntity;
 import org.springframework.util.ResourceUtils;
 import org.springframework.web.util.UriComponentsBuilder;
-import com.fasterxml.jackson.core.JsonParseException;
-import com.fasterxml.jackson.databind.DeserializationFeature;
-import com.fasterxml.jackson.databind.JsonMappingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.List;
+import static com.github.tomakehurst.wiremock.client.WireMock.*;
+import static com.shazam.shazamcrest.matcher.Matchers.sameBeanAs;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
 
 public class WorkflowSpecificationsHandlerTest extends BaseTest {
     @Autowired
@@ -65,19 +61,20 @@
     @Value("${wiremock.server.port}")
     private String wiremockPort;
 
-    private final String basePath = "onap/so/infra/workflowSpecifications/v1/workflows";
+    private final String basePath = "onap/so/infra/workflowSpecifications";
 
     @Test
-    public void queryWorkflowSpecifications_Test_Success()
+    public void queryWorkflowSpecificationsByVnfModelUUID_Test_Success()
             throws ParseException, JSONException, JsonParseException, JsonMappingException, IOException {
 
+        final String urlPath = basePath + "/v1/workflows";
         HttpHeaders headers = new HttpHeaders();
         headers.set("Accept", MediaType.APPLICATION_JSON);
         headers.set("Content-Type", MediaType.APPLICATION_JSON);
         HttpEntity<String> entity = new HttpEntity<String>(null, headers);
 
         wireMockServer.stubFor(get(urlMatching(
-                "/workflow/search/findWorkflowByModelUUID[?]vnfResourceModelUUID=b5fa707a-f55a-11e7-a796-005056856d52"))
+                "/workflow/search/findWorkflowByVnfModelUUID[?]vnfResourceModelUUID=b5fa707a-f55a-11e7-a796-005056856d52"))
                         .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
                                 .withBody(getWiremockResponseForCatalogdb("WorkflowSpecificationsQuery_Response.json"))
                                 .withStatus(org.apache.http.HttpStatus.SC_OK)));
@@ -147,7 +144,7 @@
                         .withBody(getWiremockResponseForCatalogdb("UserParameters6_Response.json"))
                         .withStatus(org.apache.http.HttpStatus.SC_OK)));
 
-        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(createURLWithPort(basePath))
+        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(createURLWithPort(urlPath))
                 .queryParam("vnfModelVersionId", "b5fa707a-f55a-11e7-a796-005056856d52");
 
         ResponseEntity<String> response =
@@ -174,7 +171,7 @@
 
     @Test
     public void mapWorkflowsToWorkflowSpecifications_Test_Success() throws Exception {
-        List<Workflow> workflows = new ArrayList<Workflow>();
+        List<Workflow> workflows = new ArrayList<>();
         Workflow workflow = new Workflow();
         workflow.setArtifactUUID("ab6478e4-ea33-3346-ac12-ab121484a333");
         workflow.setArtifactName("inPlaceSoftwareUpdate-1_0.bpmn");
@@ -267,8 +264,7 @@
         activitySpecUserParameter6.setUserParameters(userParameter6);
         activitySpecUserParameters.add(activitySpecUserParameter6);
 
-        List<WorkflowActivitySpecSequence> workflowActivitySpecSequences =
-                new ArrayList<WorkflowActivitySpecSequence>();
+        List<WorkflowActivitySpecSequence> workflowActivitySpecSequences = new ArrayList<>();
 
         ActivitySpec activitySpec1 = new ActivitySpec();
         activitySpec1.setName("VNFQuiesceTrafficActivity");
@@ -324,6 +320,100 @@
         assertThat(expectedResult, sameBeanAs(workflowSpecifications).ignoring(WorkflowInputParameter.class));
     }
 
+    @Test
+    public void queryWorkflowSpecificationsByPnfModelUUID_Test_Success() throws JSONException, IOException {
+
+        final String urlPath = basePath + "/v1/workflows";
+        HttpHeaders headers = new HttpHeaders();
+        headers.set("Accept", MediaType.APPLICATION_JSON);
+        headers.set("Content-Type", MediaType.APPLICATION_JSON);
+        HttpEntity<String> entity = new HttpEntity<String>(null, headers);
+
+        wireMockServer.stubFor(get(urlMatching(
+                "/workflow/search/findWorkflowByPnfModelUUID[?]pnfResourceModelUUID=f2d1f2b2-88bb-49da-b716-36ae420ccbff"))
+                        .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
+                                .withBody(getWiremockResponseForCatalogdb(
+                                        "WorkflowSpecificationsForPnfQuery_Response.json"))
+                                .withStatus(org.apache.http.HttpStatus.SC_OK)));
+
+        wireMockServer.stubFor(get(urlMatching("/workflow/4/workflowActivitySpecSequence"))
+                .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
+                        .withBody(getWiremockResponseForCatalogdb("Empty_workflowActivitySpecSequence_Response.json"))
+                        .withStatus(org.apache.http.HttpStatus.SC_OK)));
+
+        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(createURLWithPort(urlPath))
+                .queryParam("pnfModelVersionId", "f2d1f2b2-88bb-49da-b716-36ae420ccbff");
+
+        ResponseEntity<String> response =
+                restTemplate.exchange(builder.toUriString(), HttpMethod.GET, entity, String.class);
+
+        assertEquals(Response.Status.OK.getStatusCode(), response.getStatusCode().value());
+
+        ObjectMapper mapper = new ObjectMapper();
+        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+
+        WorkflowSpecifications expectedResponse = mapper.readValue(
+                new String(Files.readAllBytes(
+                        Paths.get("src/test/resources/__files/catalogdb/WorkflowSpecificationsForPnf.json"))),
+                WorkflowSpecifications.class);
+        WorkflowSpecifications realResponse = mapper.readValue(response.getBody(), WorkflowSpecifications.class);
+
+        assertEquals(Response.Status.OK.getStatusCode(), response.getStatusCode().value());
+        assertThat(expectedResponse, sameBeanAs(realResponse));
+        assertEquals("application/json", response.getHeaders().get(HttpHeaders.CONTENT_TYPE).get(0));
+        assertEquals("0", response.getHeaders().get("X-MinorVersion").get(0));
+        assertEquals("0", response.getHeaders().get("X-PatchVersion").get(0));
+        assertEquals("1.0.0", response.getHeaders().get("X-LatestVersion").get(0));
+    }
+
+    @Test
+    public void testWorkflowSpecificationsForPnf_Success() throws JSONException, IOException {
+
+        final String urlPath = basePath + "/v1/pnfWorkflows";
+        HttpHeaders headers = new HttpHeaders();
+        headers.set("Accept", MediaType.APPLICATION_JSON);
+        headers.set("Content-Type", MediaType.APPLICATION_JSON);
+        HttpEntity<String> entity = new HttpEntity(null, headers);
+
+        wireMockServer.stubFor(get(urlMatching("/workflow/search/findByResourceTarget[?]resource_target=pnf"))
+                .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
+                        .withBody(
+                                getWiremockResponseForCatalogdb("WorkflowSpecificationsForPnfWorkflows_Response.json"))
+                        .withStatus(org.apache.http.HttpStatus.SC_OK)));
+
+        wireMockServer.stubFor(get(urlMatching("/infraActiveRequests.*"))
+                .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
+                        .withStatus(org.apache.http.HttpStatus.SC_OK)));
+
+        wireMockServer.stubFor(get(urlMatching("/workflow/1/workflowActivitySpecSequence"))
+                .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
+                        .withBody(getWiremockResponseForCatalogdb("Empty_workflowActivitySpecSequence_Response.json"))
+                        .withStatus(org.apache.http.HttpStatus.SC_OK)));
+
+        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(createURLWithPort(urlPath));
+
+        ResponseEntity<String> response =
+                restTemplate.exchange(builder.toUriString(), HttpMethod.GET, entity, String.class);
+
+        assertEquals(Response.Status.OK.getStatusCode(), response.getStatusCode().value());
+
+        ObjectMapper mapper = new ObjectMapper();
+        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+
+        WorkflowSpecifications expectedResponse = mapper.readValue(
+                new String(Files.readAllBytes(
+                        Paths.get("src/test/resources/__files/catalogdb/WorkflowSpecificationsForPnf.json"))),
+                WorkflowSpecifications.class);
+        WorkflowSpecifications realResponse = mapper.readValue(response.getBody(), WorkflowSpecifications.class);
+
+        assertEquals(Response.Status.OK.getStatusCode(), response.getStatusCode().value());
+        assertThat(expectedResponse, sameBeanAs(realResponse));
+        assertEquals("application/json", response.getHeaders().get(HttpHeaders.CONTENT_TYPE).get(0));
+        assertEquals("0", response.getHeaders().get("X-MinorVersion").get(0));
+        assertEquals("0", response.getHeaders().get("X-PatchVersion").get(0));
+        assertEquals("1.0.0", response.getHeaders().get("X-LatestVersion").get(0));
+    }
+
     private String getWiremockResponseForCatalogdb(String file) {
         try {
             File resource = ResourceUtils.getFile("classpath:__files/catalogdb/" + file);
diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/resources/ServiceInstanceTest/ExecutePNFCustomWorkflow.json b/mso-api-handlers/mso-api-handler-infra/src/test/resources/ServiceInstanceTest/ExecutePNFCustomWorkflow.json
index 63021b6..09f94b6 100644
--- a/mso-api-handlers/mso-api-handler-infra/src/test/resources/ServiceInstanceTest/ExecutePNFCustomWorkflow.json
+++ b/mso-api-handlers/mso-api-handler-infra/src/test/resources/ServiceInstanceTest/ExecutePNFCustomWorkflow.json
@@ -1,20 +1,47 @@
 {
-  "requestDetails": {
-    "requestParameters": {
-        "userParams": [{
-          "nrmObj": {        
-            "EUtranGenericCell" : [
-                {"cellLocalId":1, "pci":5},
-                {"cellLocalId":2, "pci":6}
-             ],
-            "ExternalEUtranCell" : [
-                {"cellLocalId":3, "eNBId": "x"}, 
-                {"cellLocalId":4, "eNBId": "y"}
-            ],
-            "EUtranRelation": [{"scellLocalId":5, "tcellLocalId":6}]
-          }        
-        }],
-        "payload": "[{\"GNBDUFunction\":{\"gNBId\":1,\"gNBDUId\":5}}]"
-    }
-  }
+  "requestDetails":{
+    "subscriberInfo":{
+      "globalSubscriberId":"Test"
+    },
+    "requestInfo":{
+      "suppressRollback": false,
+      "productFamilyId": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+      "requestorId": "tester",
+      "instanceName":"testInstanceName",
+      "source":"test"
+    },
+    "cloudConfiguration":{
+      "lcpCloudRegionId": "RegionOne",
+      "tenantId": "7320ec4a5b9d4589ba7c4412ccfd290f",
+      "cloudOwner": "CloudOwner"
+    },
+    "requestParameters":{
+      "subscriptionServiceType": "test",
+      "userParams":[
+      {
+        "name": "key1",
+        "value": "val1"
+      },
+      {
+        "name": "key2",
+        "value": "val2"
+      }],
+      "aLaCarte": false,
+      "payload": "{\"k1\": \"v1\"}"
+      },
+      "project":{
+         "projectName": "Test"
+      },
+      "owningEntity":{
+        "owningEntityId":"67f2e84c-734d-4e90-a1e4-d2ffa2e75849",
+        "owningEntityName":"OE-Test"
+      },
+      "modelInfo":{
+        "modelVersion": "2.0",
+        "modelVersionId": "test-version-id",
+        "modelInvariantId": "test-invariantUUID",
+        "modelName": "test-name",
+        "modelType": "pnf"
+      }
+   }
 }
diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/resources/__files/aai/ServiceFromAAI.json b/mso-api-handlers/mso-api-handler-infra/src/test/resources/__files/aai/ServiceFromAAI.json
new file mode 100644
index 0000000..f0d5117
--- /dev/null
+++ b/mso-api-handlers/mso-api-handler-infra/src/test/resources/__files/aai/ServiceFromAAI.json
@@ -0,0 +1,4 @@
+{
+   "service-id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+   "service-description": "testServiceDescription"
+}
\ No newline at end of file
diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/resources/__files/catalogdb/Empty_workflowActivitySpecSequence_Response.json b/mso-api-handlers/mso-api-handler-infra/src/test/resources/__files/catalogdb/Empty_workflowActivitySpecSequence_Response.json
new file mode 100644
index 0000000..6779c1f
--- /dev/null
+++ b/mso-api-handlers/mso-api-handler-infra/src/test/resources/__files/catalogdb/Empty_workflowActivitySpecSequence_Response.json
@@ -0,0 +1,5 @@
+{
+  "_embedded": {
+    "workflowActivitySpecSequence": []
+  }
+}
\ No newline at end of file
diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/resources/__files/catalogdb/WorkflowSpecificationsForPnf.json b/mso-api-handlers/mso-api-handler-infra/src/test/resources/__files/catalogdb/WorkflowSpecificationsForPnf.json
new file mode 100644
index 0000000..b5b9387
--- /dev/null
+++ b/mso-api-handlers/mso-api-handler-infra/src/test/resources/__files/catalogdb/WorkflowSpecificationsForPnf.json
@@ -0,0 +1,20 @@
+{
+    "workflowSpecificationList": [
+        {
+            "workflowSpecification": {
+                "artifactInfo": {
+                    "artifactType": "workflow",
+                    "artifactUuid": "b2fd5627-55e4-4f4f-8064-9e6f443e9152",
+                    "artifactName": "DummyPnfWorkflow",
+                    "artifactVersion": "1.0",
+                    "artifactDescription": "Dummy Pnf Workflow to test custom Pnf workflow",
+                    "workflowName": "Dummy Pnf Workflow",
+                    "operationName": "DummyPnfWorkflow",
+                    "workflowSource": "native",
+                    "workflowResourceTarget": "pnf"
+                },
+                "workflowInputParameters": []
+            }
+        }
+    ]
+}
\ No newline at end of file
diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/resources/__files/catalogdb/WorkflowSpecificationsForPnfQuery_Response.json b/mso-api-handlers/mso-api-handler-infra/src/test/resources/__files/catalogdb/WorkflowSpecificationsForPnfQuery_Response.json
new file mode 100644
index 0000000..a4e1bbc
--- /dev/null
+++ b/mso-api-handlers/mso-api-handler-infra/src/test/resources/__files/catalogdb/WorkflowSpecificationsForPnfQuery_Response.json
@@ -0,0 +1,41 @@
+{
+    "_embedded": {
+        "workflow": [
+            {
+                "artifactChecksum": "MANUAL RECORD",
+                "artifactName": "DummyPnfWorkflow",
+                "artifactUUID": "b2fd5627-55e4-4f4f-8064-9e6f443e9152",
+                "body": null,
+                "created": "2020-02-18T08:28:15.000+0000",
+                "description": "Dummy Pnf Workflow to test custom Pnf workflow",
+                "id": 4,
+                "name": "Dummy Pnf Workflow",
+                "operationName": "DummyPnfWorkflow",
+                "pnfResourceWorkflow": null,
+                "resourceTarget": "pnf",
+                "source": "native",
+                "timeoutMinutes": null,
+                "version": 1.0,
+                "_links": {
+                    "self": {
+                        "href": "http://localhost:8090/workflow/search/findWorkflowByPnfModelUUID?pnfResourceModelUUID=f2d1f2b2-88bb-49da-b716-36ae420ccbff"
+                    },
+                    "workflow": {
+                        "href": "http://localhost:8090/workflow/4"
+                    },
+                    "workflowActivitySpecSequence": {
+                        "href": "http://localhost:8090/workflow/4/workflowActivitySpecSequence"
+                    }
+                }
+            }
+        ]
+    },
+    "_links": {
+        "self": {
+            "href": "http://localhost:8090/workflow/search/findWorkflowByPnfModelUUID?pnfResourceModelUUID=f2d1f2b2-88bb-49da-b716-36ae420ccbff"
+        },
+        "workflowActivitySpecSequence": {
+            "href": "http://localhost:8090/workflow/4/workflowActivitySpecSequence"
+        }
+    }
+}
diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/resources/__files/catalogdb/WorkflowSpecificationsForPnfWorkflows_Response.json b/mso-api-handlers/mso-api-handler-infra/src/test/resources/__files/catalogdb/WorkflowSpecificationsForPnfWorkflows_Response.json
new file mode 100644
index 0000000..2447617
--- /dev/null
+++ b/mso-api-handlers/mso-api-handler-infra/src/test/resources/__files/catalogdb/WorkflowSpecificationsForPnfWorkflows_Response.json
@@ -0,0 +1,41 @@
+{
+  "_embedded": {
+    "workflow": [
+      {
+        "artifactChecksum": "MANUAL RECORD",
+        "artifactName": "DummyPnfWorkflow",
+        "artifactUUID": "b2fd5627-55e4-4f4f-8064-9e6f443e9152",
+        "body": null,
+        "created": "2020-02-18T08:28:15.000+0000",
+        "description": "Dummy Pnf Workflow to test custom Pnf workflow",
+        "id": 4,
+        "name": "Dummy Pnf Workflow",
+        "operationName": "DummyPnfWorkflow",
+        "pnfResourceWorkflow": null,
+        "resourceTarget": "pnf",
+        "source": "native",
+        "timeoutMinutes": null,
+        "version": 1.0,
+        "_links": {
+          "self": {
+            "href": "http://localhost:8090/workflow/search/findByResourceTarget?resource_target=pnf"
+          },
+          "workflow": {
+            "href": "http://localhost:8090/workflow/4"
+          },
+          "workflowActivitySpecSequence": {
+            "href": "http://localhost:8090/workflow/4/workflowActivitySpecSequence"
+          }
+        }
+      }
+    ]
+  },
+  "_links": {
+    "self": {
+      "href": "http://localhost:8090/workflow/search/findByResourceTarget?resource_target=pnf"
+    },
+    "workflowActivitySpecSequence": {
+      "href": "http://localhost:8090/workflow/4/workflowActivitySpecSequence"
+    }
+  }
+}
\ No newline at end of file
diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/resources/schema.sql b/mso-api-handlers/mso-api-handler-infra/src/test/resources/schema.sql
index 050780c..85a17dd 100644
--- a/mso-api-handlers/mso-api-handler-infra/src/test/resources/schema.sql
+++ b/mso-api-handlers/mso-api-handler-infra/src/test/resources/schema.sql
@@ -1262,7 +1262,7 @@
   `END_TIME` datetime DEFAULT NULL,
   `SOURCE` varchar(45) DEFAULT NULL,
   `VNF_ID` varchar(45) DEFAULT NULL,
-  `PNF_ID` varchar(45) DEFAULT NULL,
+  `PNF_NAME` varchar(45) DEFAULT NULL,
   `VNF_NAME` varchar(80) DEFAULT NULL,
   `VNF_TYPE` varchar(200) DEFAULT NULL,
   `SERVICE_TYPE` varchar(45) DEFAULT NULL,
@@ -1297,6 +1297,8 @@
   `ORIGINAL_REQUEST_ID` varchar(45) DEFAULT NULL,
   `EXT_SYSTEM_ERROR_SOURCE` varchar(80) DEFAULT NULL,
   `ROLLBACK_EXT_SYSTEM_ERROR_SOURCE` varchar(80) DEFAULT NULL,
+  `TENANT_NAME` varchar(200) DEFAULT NULL,
+  `PRODUCT_FAMILY_NAME` varchar(200) DEFAULT NULL,
   PRIMARY KEY (`REQUEST_ID`)
 ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
 
diff --git a/mso-api-handlers/mso-requests-db-repositories/src/main/java/org/onap/so/db/request/data/repository/InfraActiveRequestsRepositoryImpl.java b/mso-api-handlers/mso-requests-db-repositories/src/main/java/org/onap/so/db/request/data/repository/InfraActiveRequestsRepositoryImpl.java
index bba0ad4..da8f30a 100644
--- a/mso-api-handlers/mso-requests-db-repositories/src/main/java/org/onap/so/db/request/data/repository/InfraActiveRequestsRepositoryImpl.java
+++ b/mso-api-handlers/mso-requests-db-repositories/src/main/java/org/onap/so/db/request/data/repository/InfraActiveRequestsRepositoryImpl.java
@@ -245,8 +245,8 @@
                 mapKey = "serviceInstanceName";
             } else if ("vnfInstanceId".equalsIgnoreCase(mapKey)) {
                 mapKey = "vnfId";
-            } else if ("pnfId".equalsIgnoreCase(mapKey)) {
-                mapKey = "pnfId";
+            } else if ("pnfName".equalsIgnoreCase(mapKey)) {
+                mapKey = "pnfName";
             } else if ("vnfInstanceName".equalsIgnoreCase(mapKey)) {
                 mapKey = "vnfName";
             } else if ("vfModuleInstanceId".equalsIgnoreCase(mapKey)) {
diff --git a/mso-api-handlers/mso-requests-db-repositories/src/main/java/org/onap/so/db/request/data/repository/OrchestrationTaskRepository.java b/mso-api-handlers/mso-requests-db-repositories/src/main/java/org/onap/so/db/request/data/repository/OrchestrationTaskRepository.java
new file mode 100644
index 0000000..1093c79
--- /dev/null
+++ b/mso-api-handlers/mso-requests-db-repositories/src/main/java/org/onap/so/db/request/data/repository/OrchestrationTaskRepository.java
@@ -0,0 +1,33 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2019 Huawei Technologies Co., Ltd. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License")
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.db.request.data.repository;
+
+import org.onap.so.db.request.beans.OrchestrationTask;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.repository.query.Param;
+import org.springframework.data.rest.core.annotation.RepositoryRestResource;
+import java.util.List;
+
+@RepositoryRestResource(collectionResourceRel = "orchestrationTask", path = "orchestrationTask")
+public interface OrchestrationTaskRepository extends JpaRepository<OrchestrationTask, String> {
+
+    public List<OrchestrationTask> findByStatus(@Param("status") String status);
+}
diff --git a/mso-api-handlers/mso-requests-db-repositories/src/test/java/org/onap/so/db/request/OrchestrationTaskTest.java b/mso-api-handlers/mso-requests-db-repositories/src/test/java/org/onap/so/db/request/OrchestrationTaskTest.java
new file mode 100644
index 0000000..0b2aae6
--- /dev/null
+++ b/mso-api-handlers/mso-requests-db-repositories/src/test/java/org/onap/so/db/request/OrchestrationTaskTest.java
@@ -0,0 +1,75 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2019 Huawei Technologies Co., Ltd. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License")
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.db.request;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.onap.so.TestApplication;
+import org.onap.so.db.request.beans.OrchestrationTask;
+import org.onap.so.db.request.data.repository.OrchestrationTaskRepository;
+import org.onap.so.db.request.exceptions.NoEntityFoundException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.junit4.SpringRunner;
+import javax.transaction.Transactional;
+import java.util.Date;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = TestApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+@ActiveProfiles("test")
+public class OrchestrationTaskTest {
+
+    @Autowired
+    private OrchestrationTaskRepository repository;
+
+    @Test
+    @Transactional
+    public void timeStampCreated() throws NoEntityFoundException {
+
+        final String testTaskId = "test-task-id";
+        final String testRequestId = "test-request-id";
+        final String testTaskName = "test-task-name";
+        final String testTaskStatus = "test-task-status";
+        final String testIsManual = "test-is-manual";
+        OrchestrationTask task = new OrchestrationTask();
+
+        task.setTaskId(testTaskId);
+        task.setRequestId(testRequestId);
+        task.setName(testTaskName);
+        task.setStatus(testTaskStatus);
+        task.setIsManual(testIsManual);
+        repository.saveAndFlush(task);
+
+        OrchestrationTask found =
+                repository.findById(testTaskId).orElseThrow(() -> new NoEntityFoundException("Cannot Find Task"));
+
+        Date createdTime = found.getCreatedTime();
+        assertNotNull(createdTime);
+        assertEquals(testTaskId, found.getTaskId());
+        assertEquals(testRequestId, found.getRequestId());
+        assertEquals(testTaskName, found.getName());
+        assertEquals(testTaskStatus, found.getStatus());
+        assertEquals(testIsManual, found.getIsManual());
+    }
+}
diff --git a/mso-api-handlers/mso-requests-db-repositories/src/test/resources/schema.sql b/mso-api-handlers/mso-requests-db-repositories/src/test/resources/schema.sql
index d2b3a71..c6d22f5 100644
--- a/mso-api-handlers/mso-requests-db-repositories/src/test/resources/schema.sql
+++ b/mso-api-handlers/mso-requests-db-repositories/src/test/resources/schema.sql
@@ -64,7 +64,7 @@
     END_TIME VARCHAR,
     SOURCE VARCHAR SELECTIVITY 2,
     VNF_ID VARCHAR SELECTIVITY 15,
-    PNF_ID VARCHAR SELECTIVITY 15,
+    PNF_NAME VARCHAR SELECTIVITY 15,
     VNF_NAME VARCHAR SELECTIVITY 11,
     VNF_TYPE VARCHAR SELECTIVITY 5,
     SERVICE_TYPE VARCHAR SELECTIVITY 1,
@@ -100,7 +100,10 @@
     REQUEST_URL VARCHAR SELECTIVITY 1,
     ORIGINAL_REQUEST_ID VARCHAR SELECTIVITY 1,
     EXT_SYSTEM_ERROR_SOURCE VARCHAR SELECTIVITY 1,
-    ROLLBACK_EXT_SYSTEM_ERROR_SOURCE VARCHAR SELECTIVITY 1
+    ROLLBACK_EXT_SYSTEM_ERROR_SOURCE VARCHAR SELECTIVITY 1,
+    TENANT_NAME VARCHAR SELECTIVITY 1,
+    PRODUCT_FAMILY_NAME VARCHAR SELECTIVITY 1
+    
 );          
 
 INSERT INTO PUBLIC.INFRA_ACTIVE_REQUESTS(REQUEST_ID, REQUEST_STATUS, STATUS_MESSAGE, PROGRESS, START_TIME, END_TIME, SOURCE, VNF_ID, VNF_NAME, VNF_TYPE, SERVICE_TYPE, TENANT_ID, VNF_PARAMS, VNF_OUTPUTS, REQUEST_BODY, RESPONSE_BODY, LAST_MODIFIED_BY, MODIFY_TIME, VOLUME_GROUP_ID, VOLUME_GROUP_NAME, VF_MODULE_ID, VF_MODULE_NAME, VF_MODULE_MODEL_NAME, CLOUD_REGION, CALLBACK_URL, CORRELATOR, NETWORK_ID, NETWORK_NAME, NETWORK_TYPE, REQUEST_SCOPE, REQUEST_ACTION, SERVICE_INSTANCE_ID, SERVICE_INSTANCE_NAME, REQUESTOR_ID, CONFIGURATION_ID, CONFIGURATION_NAME, OPERATIONAL_ENV_ID, OPERATIONAL_ENV_NAME, REQUEST_URL) VALUES
@@ -169,7 +172,9 @@
     OPERATIONAL_ENV_NAME VARCHAR SELECTIVITY 1,
     INSTANCE_GROUP_ID VARCHAR SELECTIVITY 1,
     INSTANCE_GROUP_NAME VARCHAR SELECTIVITY 1,
-    REQUEST_URL VARCHAR SELECTIVITY 1
+    REQUEST_URL VARCHAR SELECTIVITY 1,
+    TENANT_NAME VARCHAR SELECTIVITY 1,
+    PRODUCT_FAMILY_NAME VARCHAR SELECTIVITY 1
 );
 
 CREATE TABLE IF NOT EXISTS cloud_api_requests(
@@ -246,11 +251,22 @@
 INSERT INTO PUBLIC.WATCHDOG_SERVICE_MOD_VER_ID_LOOKUP(DISTRIBUTION_ID, SERVICE_MODEL_VERSION_ID, CREATE_TIME, MODIFY_TIME) VALUES
 ('1533c4bd-a3e3-493f-a16d-28c20614415e', '7e813ab5-88d3-4fcb-86c0-498c5d7eef9a', '2017-11-30 15:48:08', '2017-11-30 15:48:08'),
 ('55429711-809b-4a3b-9ee5-5120d46d9de0', 'cc031e75-4442-4d1a-b774-8a2b434e0a50', '2017-11-30 16:35:36', '2017-11-30 16:35:36'),
-('67f0b2d1-9013-4b2b-9914-bbe2288284fb', 'eade1e9d-c1ec-4ef3-bc31-60570fba1573', '2017-11-30 15:54:39', '2017-11-30 15:54:39');    
+('67f0b2d1-9013-4b2b-9914-bbe2288284fb', 'eade1e9d-c1ec-4ef3-bc31-60570fba1573', '2017-11-30 15:54:39', '2017-11-30 15:54:39');
 
-ALTER TABLE PUBLIC.INFRA_ACTIVE_REQUESTS ADD CONSTRAINT PUBLIC.CONSTRAINT_E PRIMARY KEY(REQUEST_ID);          
-ALTER TABLE PUBLIC.SITE_STATUS ADD CONSTRAINT PUBLIC.CONSTRAINT_C PRIMARY KEY(SITE_NAME); 
+ALTER TABLE PUBLIC.INFRA_ACTIVE_REQUESTS ADD CONSTRAINT PUBLIC.CONSTRAINT_E PRIMARY KEY(REQUEST_ID);
+ALTER TABLE PUBLIC.SITE_STATUS ADD CONSTRAINT PUBLIC.CONSTRAINT_C PRIMARY KEY(SITE_NAME);
 ALTER TABLE PUBLIC.WATCHDOG_DISTRIBUTIONID_STATUS ADD CONSTRAINT PUBLIC.CONSTRAINT_7 PRIMARY KEY(DISTRIBUTION_ID); 
 ALTER TABLE PUBLIC.WATCHDOG_PER_COMPONENT_DISTRIBUTION_STATUS ADD CONSTRAINT PUBLIC.CONSTRAINT_D PRIMARY KEY(DISTRIBUTION_ID, COMPONENT_NAME);
-ALTER TABLE PUBLIC.WATCHDOG_SERVICE_MOD_VER_ID_LOOKUP ADD CONSTRAINT PUBLIC.CONSTRAINT_6 PRIMARY KEY(DISTRIBUTION_ID, SERVICE_MODEL_VERSION_ID);   
-ALTER TABLE PUBLIC.WATCHDOG_PER_COMPONENT_DISTRIBUTION_STATUS ADD CONSTRAINT PUBLIC.CONSTRAINT_DE FOREIGN KEY(DISTRIBUTION_ID) REFERENCES PUBLIC.WATCHDOG_DISTRIBUTIONID_STATUS(DISTRIBUTION_ID) NOCHECK; 
\ No newline at end of file
+ALTER TABLE PUBLIC.WATCHDOG_SERVICE_MOD_VER_ID_LOOKUP ADD CONSTRAINT PUBLIC.CONSTRAINT_6 PRIMARY KEY(DISTRIBUTION_ID, SERVICE_MODEL_VERSION_ID);
+ALTER TABLE PUBLIC.WATCHDOG_PER_COMPONENT_DISTRIBUTION_STATUS ADD CONSTRAINT PUBLIC.CONSTRAINT_DE FOREIGN KEY(DISTRIBUTION_ID) REFERENCES PUBLIC.WATCHDOG_DISTRIBUTIONID_STATUS(DISTRIBUTION_ID) NOCHECK;
+
+CREATE TABLE `orchestration_task` (
+  `TASK_ID` varchar(200) NOT NULL,
+  `REQUEST_ID` varchar(200) NOT NULL,
+  `NAME` varchar(200) NOT NULL,
+  `CREATED_TIME` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
+  `STATUS` varchar(200) NOT NULL,
+  `IS_MANUAL` varchar(20) NOT NULL,
+  `PARAMS` varchar(20000) DEFAULT NULL,
+  PRIMARY KEY (`TASK_ID`)
+);
diff --git a/mso-api-handlers/mso-requests-db/src/main/java/org/onap/so/db/request/beans/InfraActiveRequests.java b/mso-api-handlers/mso-requests-db/src/main/java/org/onap/so/db/request/beans/InfraActiveRequests.java
index 5848f3b..750fa13 100644
--- a/mso-api-handlers/mso-requests-db/src/main/java/org/onap/so/db/request/beans/InfraActiveRequests.java
+++ b/mso-api-handlers/mso-requests-db/src/main/java/org/onap/so/db/request/beans/InfraActiveRequests.java
@@ -72,15 +72,15 @@
                 .append("statusMessage", getStatusMessage()).append("progress", getProgress())
                 .append("startTime", getStartTime()).append("endTime", getEndTime()).append("source", getSource())
                 .append("vnfId", getVnfId()).append("vnfName", getVnfName()).append("vnfType", getVnfType())
-                .append("pnfId", getPnfId()).append("serviceType", getServiceType()).append("tenantId", getTenantId())
-                .append("vnfParams", getVnfParams()).append("vnfOutputs", getVnfOutputs())
-                .append("requestBody", getRequestBody()).append("responseBody", getResponseBody())
-                .append("lastModifiedBy", getLastModifiedBy()).append("modifyTime", getModifyTime())
-                .append("volumeGroupId", getVolumeGroupId()).append("volumeGroupName", getVolumeGroupName())
-                .append("vfModuleId", getVfModuleId()).append("vfModuleName", getVfModuleName())
-                .append("vfModuleModelName", getVfModuleModelName()).append("CloudRegion", getCloudRegion())
-                .append("callBackUrl", getCallBackUrl()).append("correlator", getCorrelator())
-                .append("serviceInstanceId", getServiceInstanceId())
+                .append("pnfName", getPnfName()).append("serviceType", getServiceType())
+                .append("tenantId", getTenantId()).append("vnfParams", getVnfParams())
+                .append("vnfOutputs", getVnfOutputs()).append("requestBody", getRequestBody())
+                .append("responseBody", getResponseBody()).append("lastModifiedBy", getLastModifiedBy())
+                .append("modifyTime", getModifyTime()).append("volumeGroupId", getVolumeGroupId())
+                .append("volumeGroupName", getVolumeGroupName()).append("vfModuleId", getVfModuleId())
+                .append("vfModuleName", getVfModuleName()).append("vfModuleModelName", getVfModuleModelName())
+                .append("CloudRegion", getCloudRegion()).append("callBackUrl", getCallBackUrl())
+                .append("correlator", getCorrelator()).append("serviceInstanceId", getServiceInstanceId())
                 .append("serviceInstanceName", getServiceInstanceName()).append("requestScope", getRequestScope())
                 .append("requestAction", getRequestAction()).append("networkId", getNetworkId())
                 .append("networkName", getNetworkName()).append("networkType", getNetworkType())
@@ -89,6 +89,7 @@
                 .append("operationalEnvName", getOperationalEnvName()).append("requestUrl", getRequestUrl())
                 .append("originalRequestId", getOriginalRequestId())
                 .append("extSystemErrorSource", getExtSystemErrorSource())
-                .append("rollbackExtSystemErrorSource", getRollbackExtSystemErrorSource()).toString();
+                .append("rollbackExtSystemErrorSource", getRollbackExtSystemErrorSource())
+                .append("tenantName", getTenantName()).append("productFamilyName", getProductFamilyName()).toString();
     }
 }
diff --git a/mso-api-handlers/mso-requests-db/src/main/java/org/onap/so/db/request/beans/InfraRequests.java b/mso-api-handlers/mso-requests-db/src/main/java/org/onap/so/db/request/beans/InfraRequests.java
index 8f798a2..66768ea 100644
--- a/mso-api-handlers/mso-requests-db/src/main/java/org/onap/so/db/request/beans/InfraRequests.java
+++ b/mso-api-handlers/mso-requests-db/src/main/java/org/onap/so/db/request/beans/InfraRequests.java
@@ -74,8 +74,8 @@
     private String source;
     @Column(name = "VNF_ID", length = 45)
     private String vnfId;
-    @Column(name = "PNF_ID", length = 45)
-    private String pnfId;
+    @Column(name = "PNF_NAME", length = 45)
+    private String pnfName;
     @Column(name = "VNF_NAME", length = 80)
     private String vnfName;
     @Column(name = "VNF_TYPE", length = 200)
@@ -149,6 +149,10 @@
     private String extSystemErrorSource;
     @Column(name = "ROLLBACK_EXT_SYSTEM_ERROR_SOURCE", length = 80)
     private String rollbackExtSystemErrorSource;
+    @Column(name = "TENANT_NAME", length = 80)
+    private String tenantName;
+    @Column(name = "PRODUCT_FAMILY_NAME", length = 80)
+    private String productFamilyName;
 
     @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
     @JoinColumn(name = "SO_REQUEST_ID", referencedColumnName = "REQUEST_ID", updatable = false)
@@ -249,12 +253,12 @@
         this.vnfId = vnfId;
     }
 
-    public String getPnfId() {
-        return this.pnfId;
+    public String getPnfName() {
+        return this.pnfName;
     }
 
-    public void setPnfId(String pnfId) {
-        this.pnfId = pnfId;
+    public void setPnfName(String pnfName) {
+        this.pnfName = pnfName;
     }
 
     public String getVnfName() {
@@ -550,6 +554,22 @@
         this.rollbackExtSystemErrorSource = rollbackExtSystemErrorSource;
     }
 
+    public String getTenantName() {
+        return tenantName;
+    }
+
+    public void setTenantName(String tenantName) {
+        this.tenantName = tenantName;
+    }
+
+    public String getProductFamilyName() {
+        return productFamilyName;
+    }
+
+    public void setProductFamilyName(String productFamilyName) {
+        this.productFamilyName = productFamilyName;
+    }
+
     @PrePersist
     protected void onCreate() {
         if (requestScope == null)
@@ -592,7 +612,7 @@
                 .append("flowStatus", getFlowStatus()).append("retryStatusMessage", getRetryStatusMessage())
                 .append("progress", getProgress()).append("startTime", getStartTime()).append("endTime", getEndTime())
                 .append("source", getSource()).append("vnfId", getVnfId()).append("vnfName", getVnfName())
-                .append("pnfId", getPnfId()).append("vnfType", getVnfType()).append("serviceType", getServiceType())
+                .append("pnfName", getPnfName()).append("vnfType", getVnfType()).append("serviceType", getServiceType())
                 .append("tenantId", getTenantId()).append("vnfParams", getVnfParams())
                 .append("vnfOutputs", getVnfOutputs()).append("requestBody", getRequestBody())
                 .append("responseBody", getResponseBody()).append("lastModifiedBy", getLastModifiedBy())
@@ -609,6 +629,7 @@
                 .append("operationalEnvName", getOperationalEnvName()).append("instanceGroupId", getInstanceGroupId())
                 .append("instanceGroupName", getInstanceGroupName()).append("requestUrl", getRequestUrl())
                 .append("originalRequestId", originalRequestId).append("extSystemErrorSource", extSystemErrorSource)
-                .append("rollbackExtSystemErrorSource", rollbackExtSystemErrorSource).toString();
+                .append("rollbackExtSystemErrorSource", rollbackExtSystemErrorSource).append("tenantName", tenantName)
+                .append("productFamilyName", productFamilyName).toString();
     }
 }
diff --git a/mso-api-handlers/mso-requests-db/src/main/java/org/onap/so/db/request/client/RequestsDbClient.java b/mso-api-handlers/mso-requests-db/src/main/java/org/onap/so/db/request/client/RequestsDbClient.java
index 334eb73..7b642ab 100644
--- a/mso-api-handlers/mso-requests-db/src/main/java/org/onap/so/db/request/client/RequestsDbClient.java
+++ b/mso-api-handlers/mso-requests-db/src/main/java/org/onap/so/db/request/client/RequestsDbClient.java
@@ -45,6 +45,7 @@
 import org.onap.so.db.request.beans.WatchdogComponentDistributionStatus;
 import org.onap.so.db.request.beans.WatchdogDistributionStatus;
 import org.onap.so.db.request.beans.WatchdogServiceModVerIdLookup;
+import org.onap.so.db.request.beans.OrchestrationTask;
 import org.onap.so.db.request.data.controller.InstanceNameDuplicateCheckRequest;
 import org.onap.so.logging.jaxrs.filter.SOSpringClientFilter;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -119,6 +120,8 @@
 
     private String getInProgressVolumeGroupsAndVfModules = "/infraActiveRequests/getInProgressVolumeGroupsAndVfModules";
 
+    private String orchestrationTasksURI = "/orchestrationTask";
+
     private static final String findBySoRequestIdAndGroupIdAndName =
             "/requestProcessingData/search/findOneBySoRequestIdAndGroupingIdAndName";
 
@@ -156,6 +159,7 @@
         findAllByOperationalEnvIdAndRequestIdURI =
                 endpoint + OPERATIONAL_ENV_SERVICE_MODEL_STATUS_SEARCH + findAllByOperationalEnvIdAndRequestIdURI;
         findOneByRequestId = endpoint + findOneByRequestId;
+        orchestrationTasksURI = endpoint + orchestrationTasksURI;
     }
 
     protected String getEndpoint() {
@@ -520,6 +524,40 @@
                 .getBody();
     }
 
+    public List<OrchestrationTask> getAllOrchestrationTasks() {
+        String url = UriBuilder.fromUri(getUri(orchestrationTasksURI)).build().toString();
+        HttpEntity<?> entity = getHttpEntity();
+        return restTemplate
+                .exchange(url, HttpMethod.GET, entity, new ParameterizedTypeReference<List<OrchestrationTask>>() {})
+                .getBody();
+    }
+
+    public OrchestrationTask getOrchestrationTask(String taskId) {
+        String url = UriBuilder.fromUri(getUri(orchestrationTasksURI + "/" + taskId)).build().toString();
+        HttpEntity<?> entity = getHttpEntity();
+        return restTemplate.exchange(url, HttpMethod.GET, entity, OrchestrationTask.class).getBody();
+    }
+
+    public OrchestrationTask createOrchestrationTask(OrchestrationTask orchestrationTask) {
+        String url = UriBuilder.fromUri(getUri(orchestrationTasksURI + "/")).build().toString();
+        HttpHeaders headers = getHttpHeaders();
+        HttpEntity<OrchestrationTask> entity = new HttpEntity<>(orchestrationTask, headers);
+        return restTemplate.exchange(url, HttpMethod.POST, entity, OrchestrationTask.class).getBody();
+    }
+
+    public OrchestrationTask updateOrchestrationTask(String taskId, OrchestrationTask orchestrationTask) {
+        String url = getUri(orchestrationTasksURI + "/" + taskId).toString();
+        HttpHeaders headers = getHttpHeaders();
+        HttpEntity<OrchestrationTask> entity = new HttpEntity<>(orchestrationTask, headers);
+        return restTemplate.exchange(url, HttpMethod.PUT, entity, OrchestrationTask.class).getBody();
+    }
+
+    public void deleteOrchestrationTask(String taskId) {
+        String url = getUri(orchestrationTasksURI + "/" + taskId).toString();
+        HttpEntity<?> entity = getHttpEntity();
+        restTemplate.exchange(url, HttpMethod.DELETE, entity, Void.class).getBody();
+    }
+
     @Component
     static class ClassURLMapper {
         private static final Map<Class, String> classURLMap = new HashMap<>();
diff --git a/mso-catalog-db/src/main/java/org/onap/so/db/catalog/beans/BBNameSelectionReference.java b/mso-catalog-db/src/main/java/org/onap/so/db/catalog/beans/BBNameSelectionReference.java
new file mode 100644
index 0000000..9b71c97
--- /dev/null
+++ b/mso-catalog-db/src/main/java/org/onap/so/db/catalog/beans/BBNameSelectionReference.java
@@ -0,0 +1,115 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2019  Tech Mahindra
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.db.catalog.beans;
+
+import java.io.Serializable;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import com.openpojo.business.annotation.BusinessKey;
+
+@Entity
+@Table(name = "bbname_selection_reference")
+public class BBNameSelectionReference implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @Id
+    @Column(name = "ID", nullable = false, updatable = false)
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Integer ID;
+
+    @BusinessKey
+    @Column(name = "CONTROLLER_ACTOR")
+    private String controllerActor;
+
+    @Column(name = "SCOPE")
+    private String scope;
+
+    @Column(name = "ACTION")
+    private String action;
+
+    @BusinessKey
+    @Column(name = "BB_NAME")
+    private String bbName;
+
+    public String getControllerActor() {
+        return controllerActor;
+    }
+
+    public void setControllerActor(String controllerActor) {
+        this.controllerActor = controllerActor;
+    }
+
+    public String getScope() {
+        return scope;
+    }
+
+    public void setScope(String scope) {
+        this.scope = scope;
+    }
+
+    public String getAction() {
+        return action;
+    }
+
+    public void setAction(String action) {
+        this.action = action;
+    }
+
+    public Integer getID() {
+        return ID;
+    }
+
+    public String getBbName() {
+        return bbName;
+    }
+
+    public void setBbName(String bbName) {
+        this.bbName = bbName;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this).append("ID", ID).append("controllerActor", controllerActor)
+                .append("scope", scope).append("action", action).append("bbName", bbName).toString();
+    }
+
+    @Override
+    public boolean equals(final Object other) {
+        if (!(other instanceof BBNameSelectionReference)) {
+            return false;
+        }
+        BBNameSelectionReference castOther = (BBNameSelectionReference) other;
+        return new EqualsBuilder().append(controllerActor, castOther.controllerActor).isEquals();
+    }
+
+    @Override
+    public int hashCode() {
+        return new HashCodeBuilder().append(controllerActor).append(bbName).toHashCode();
+    }
+}
diff --git a/mso-catalog-db/src/main/java/org/onap/so/db/catalog/client/CatalogDbClient.java b/mso-catalog-db/src/main/java/org/onap/so/db/catalog/client/CatalogDbClient.java
index 161ca2a..26c3394 100644
--- a/mso-catalog-db/src/main/java/org/onap/so/db/catalog/client/CatalogDbClient.java
+++ b/mso-catalog-db/src/main/java/org/onap/so/db/catalog/client/CatalogDbClient.java
@@ -7,9 +7,9 @@
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -32,6 +32,7 @@
 import org.apache.http.HttpStatus;
 import org.onap.logging.filter.base.Constants;
 import org.onap.logging.filter.spring.SpringClientPayloadFilter;
+import org.onap.so.db.catalog.beans.BBNameSelectionReference;
 import org.onap.so.db.catalog.beans.BuildingBlockDetail;
 import org.onap.so.db.catalog.beans.CloudSite;
 import org.onap.so.db.catalog.beans.CloudifyManager;
@@ -119,6 +120,7 @@
     private static final String PNF_RESOURCE = "/pnfResource";
     private static final String PNF_RESOURCE_CUSTOMIZATION = "/pnfResourceCustomization";
     private static final String WORKFLOW = "/workflow";
+    private static final String BB_NAME_SELECTION_REFERENCE = "/bbNameSelectionReference";
 
 
     private static final String SEARCH = "/search";
@@ -156,6 +158,7 @@
     protected static final String HOMING_INSTANCE = "/homingInstance";
     protected static final String ARTIFACT_UUID = "artifactUUID";
     protected static final String SOURCE = "source";
+    protected static final String RESOURCE_TARGET = "resource_target";
 
     private static final String TARGET_ENTITY = "SO:CatalogDB";
     private static final String ASTERISK = "*";
@@ -201,10 +204,13 @@
     private String findServiceByServiceInstanceId = "/findServiceByServiceInstanceId";
     private String findPnfResourceCustomizationByModelUuid = "/findPnfResourceCustomizationByModelUuid";
     private String findWorkflowByArtifactUUID = "/findByArtifactUUID";
-    private String findWorkflowByModelUUID = "/findWorkflowByModelUUID";
+    private String findWorkflowByVnfModelUUID = "/findWorkflowByVnfModelUUID";
     private String findWorkflowByPnfModelUUID = "/findWorkflowByPnfModelUUID";
     private String findWorkflowBySource = "/findBySource";
     private String findVnfResourceCustomizationByModelUuid = "/findVnfResourceCustomizationByModelUuid";
+    private String findBBNameSelectionReferenceByControllerActorAndScopeAndAction =
+            "/findBBNameSelectionReferenceByControllerActorAndScopeAndAction";
+    private String findWorkflowByResourceTarget = "/findByResourceTarget";
 
     private String serviceURI;
     private String vfModuleURI;
@@ -277,6 +283,8 @@
 
     private final Client<Workflow> workflowClient;
 
+    private final Client<BBNameSelectionReference> bbNameSelectionReferenceClient;
+
     @Value("${mso.catalog.db.spring.endpoint:#{null}}")
     private String endpoint;
 
@@ -339,13 +347,17 @@
                 endpoint + PNF_RESOURCE_CUSTOMIZATION + SEARCH + findPnfResourceCustomizationByModelUuid;
 
         findWorkflowByArtifactUUID = endpoint + WORKFLOW + SEARCH + findWorkflowByArtifactUUID;
-        findWorkflowByModelUUID = endpoint + WORKFLOW + SEARCH + findWorkflowByModelUUID;
+        findWorkflowByVnfModelUUID = endpoint + WORKFLOW + SEARCH + findWorkflowByVnfModelUUID;
         findWorkflowByPnfModelUUID = endpoint + WORKFLOW + SEARCH + findWorkflowByPnfModelUUID;
         findWorkflowBySource = endpoint + WORKFLOW + SEARCH + findWorkflowBySource;
+        findWorkflowByResourceTarget = endpoint + WORKFLOW + SEARCH + findWorkflowByResourceTarget;
 
         findVnfResourceCustomizationByModelUuid =
                 endpoint + VNF_RESOURCE_CUSTOMIZATION + SEARCH + findVnfResourceCustomizationByModelUuid;
 
+        findBBNameSelectionReferenceByControllerActorAndScopeAndAction = endpoint + BB_NAME_SELECTION_REFERENCE + SEARCH
+                + findBBNameSelectionReferenceByControllerActorAndScopeAndAction;
+
         serviceURI = endpoint + SERVICE + URI_SEPARATOR;
         vfModuleURI = endpoint + VFMODULE + URI_SEPARATOR;
         vnfResourceURI = endpoint + VNF_RESOURCE + URI_SEPARATOR;
@@ -412,6 +424,8 @@
         pnfResourceClient = clientFactory.create(PnfResource.class);
         pnfResourceCustomizationClient = clientFactory.create(PnfResourceCustomization.class);
         workflowClient = clientFactory.create(Workflow.class);
+        bbNameSelectionReferenceClient = clientFactory.create(BBNameSelectionReference.class);
+
     }
 
     public CatalogDbClient(String baseUri, String auth) {
@@ -462,6 +476,7 @@
         pnfResourceClient = clientFactory.create(PnfResource.class);
         pnfResourceCustomizationClient = clientFactory.create(PnfResourceCustomization.class);
         workflowClient = clientFactory.create(Workflow.class);
+        bbNameSelectionReferenceClient = clientFactory.create(BBNameSelectionReference.class);
     }
 
     public NetworkCollectionResourceCustomization getNetworkCollectionResourceCustomizationByID(
@@ -689,6 +704,14 @@
                 UriBuilder.fromUri(findFirstByModelNameURI).queryParam(MODEL_NAME, modelName).build());
     }
 
+    public BBNameSelectionReference getBBNameSelectionReference(String controllerActor, String scope, String action) {
+
+        return this.getSingleResource(bbNameSelectionReferenceClient,
+                getUri(UriBuilder.fromUri(findBBNameSelectionReferenceByControllerActorAndScopeAndAction)
+                        .queryParam("CONTROLLER_ACTOR", controllerActor).queryParam("SCOPE", scope)
+                        .queryParam("ACTION", action).build().toString()));
+    }
+
     public ExternalServiceToInternalService findExternalToInternalServiceByServiceName(String serviceName) {
         return this.getSingleResource(externalServiceToInternalServiceClient,
                 getUri(UriBuilder.fromUri(findExternalToInternalServiceByServiceName)
@@ -1049,8 +1072,8 @@
                 .queryParam(ARTIFACT_UUID, artifactUUID).build().toString()));
     }
 
-    public List<Workflow> findWorkflowByModelUUID(String vnfResourceModelUUID) {
-        return this.getMultipleResources(workflowClient, getUri(UriBuilder.fromUri(findWorkflowByModelUUID)
+    public List<Workflow> findWorkflowByVnfModelUUID(String vnfResourceModelUUID) {
+        return this.getMultipleResources(workflowClient, getUri(UriBuilder.fromUri(findWorkflowByVnfModelUUID)
                 .queryParam(VNF_RESOURCE_MODEL_UUID, vnfResourceModelUUID).build().toString()));
     }
 
@@ -1064,6 +1087,11 @@
                 getUri(UriBuilder.fromUri(findWorkflowBySource).queryParam(SOURCE, source).build().toString()));
     }
 
+    public List<Workflow> findWorkflowByResourceTarget(String resourceTarget) {
+        return this.getMultipleResources(workflowClient, getUri(UriBuilder.fromUri(findWorkflowByResourceTarget)
+                .queryParam(RESOURCE_TARGET, resourceTarget).build().toString()));
+    }
+
     public String getEndpoint() {
         return endpoint;
     }
diff --git a/mso-catalog-db/src/main/java/org/onap/so/db/catalog/data/repository/BBNameSelectionReferenceRepository.java b/mso-catalog-db/src/main/java/org/onap/so/db/catalog/data/repository/BBNameSelectionReferenceRepository.java
new file mode 100644
index 0000000..38f1291
--- /dev/null
+++ b/mso-catalog-db/src/main/java/org/onap/so/db/catalog/data/repository/BBNameSelectionReferenceRepository.java
@@ -0,0 +1,36 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2019  Tech Mahindra
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.db.catalog.data.repository;
+
+
+import org.onap.so.db.catalog.beans.BBNameSelectionReference;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.repository.query.Param;
+import org.springframework.data.rest.core.annotation.RepositoryRestResource;
+
+
+@RepositoryRestResource(collectionResourceRel = "bbNameSelectionReference", path = "bbNameSelectionReference")
+public interface BBNameSelectionReferenceRepository extends JpaRepository<BBNameSelectionReference, Integer> {
+
+    public BBNameSelectionReference findBBNameSelectionReferenceByControllerActorAndScopeAndAction(
+            @Param("CONTROLLER_ACTOR") String controllerActor, @Param("SCOPE") String scope,
+            @Param("ACTION") String action);
+}
diff --git a/mso-catalog-db/src/main/java/org/onap/so/db/catalog/data/repository/WorkflowRepository.java b/mso-catalog-db/src/main/java/org/onap/so/db/catalog/data/repository/WorkflowRepository.java
index f1b3993..93ec54a 100644
--- a/mso-catalog-db/src/main/java/org/onap/so/db/catalog/data/repository/WorkflowRepository.java
+++ b/mso-catalog-db/src/main/java/org/onap/so/db/catalog/data/repository/WorkflowRepository.java
@@ -7,9 +7,9 @@
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -33,18 +33,20 @@
 
     List<Workflow> findBySource(String source);
 
+    List<Workflow> findByResourceTarget(String resourceTarget);
+
     /**
      * Used to fetch the @{link Workflow} by the Model UUID.
      *
      * This operation is required by {@link org.onap.so.db.catalog.client.CatalogDbClient} to provide Workflow based on
-     * model UUID without projection.
+     * vnf model UUID without projection.
      *
      * @param vnfResourceModelUUID UUID
      * @return List of Workflow
      */
     @Query(value = "select b.* from vnf_resource_to_workflow a join workflow b where a.WORKFLOW_ID = b.ID and a.VNF_RESOURCE_MODEL_UUID = ?1",
             nativeQuery = true)
-    List<Workflow> findWorkflowByModelUUID(String vnfResourceModelUUID);
+    List<Workflow> findWorkflowByVnfModelUUID(String vnfResourceModelUUID);
 
     /**
      * Used to fetch the @{link Workflow} by the Pnf Model UUID.
diff --git a/mso-catalog-db/src/test/java/org/onap/so/db/catalog/client/CatalogDbClientTest.java b/mso-catalog-db/src/test/java/org/onap/so/db/catalog/client/CatalogDbClientTest.java
index 66fc0f5..79e3cbc 100644
--- a/mso-catalog-db/src/test/java/org/onap/so/db/catalog/client/CatalogDbClientTest.java
+++ b/mso-catalog-db/src/test/java/org/onap/so/db/catalog/client/CatalogDbClientTest.java
@@ -4,6 +4,8 @@
  * ================================================================================
  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
+ * Modifications Copyright (c) 2020 Nordix
+ * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
@@ -179,7 +181,7 @@
     }
 
     @Test
-    public final void testFindWorkflowByPnfModelUUID() throws Exception {
+    public final void testFindWorkflowByPnfModelUUID() {
         String pnfResourceModelUUID = "f2d1f2b2-88bb-49da-b716-36ae420ccbff";
 
         doReturn(new ArrayList()).when(catalogDbClient).getMultipleResources(any(), any());
@@ -190,4 +192,16 @@
 
     }
 
+    @Test
+    public final void testFindWorkflowByResourceTarget() {
+        // when
+        final String pnf_resource = "pnf";
+        doReturn(new ArrayList()).when(catalogDbClient).getMultipleResources(any(), any());
+        catalogDbClient.findWorkflowByResourceTarget(pnf_resource);
+
+        // verify
+        verify(catalogDbClient).getMultipleResources(any(Client.class), eq(UriBuilder.fromUri("/findByResourceTarget")
+                .queryParam(CatalogDbClient.RESOURCE_TARGET, pnf_resource).build()));
+    }
+
 }
diff --git a/mso-catalog-db/src/test/java/org/onap/so/db/catalog/data/repository/WorkflowRepositoryTest.java b/mso-catalog-db/src/test/java/org/onap/so/db/catalog/data/repository/WorkflowRepositoryTest.java
index 7d1b8d0..e47c61d 100644
--- a/mso-catalog-db/src/test/java/org/onap/so/db/catalog/data/repository/WorkflowRepositoryTest.java
+++ b/mso-catalog-db/src/test/java/org/onap/so/db/catalog/data/repository/WorkflowRepositoryTest.java
@@ -36,7 +36,8 @@
 
     @Test
     public void findByVnfResourceModelUUIDTest() throws Exception {
-        List<Workflow> workflows = workflowRepository.findWorkflowByModelUUID("ff2ae348-214a-11e7-93ae-92361f002671");
+        List<Workflow> workflows =
+                workflowRepository.findWorkflowByVnfModelUUID("ff2ae348-214a-11e7-93ae-92361f002671");
 
         Assert.assertTrue(workflows != null);
         Assert.assertTrue(workflows.size() != 0);
@@ -54,4 +55,14 @@
         Assert.assertTrue("testingWorkflow.bpmn".equals(workflows.get(0).getArtifactName()));
     }
 
+    @Test
+    public void findByResourceTargetTest() {
+        List<Workflow> workflows = workflowRepository.findByResourceTarget("pnf");
+
+        Assert.assertTrue(workflows != null);
+        Assert.assertTrue(workflows.size() == 1);
+
+        Assert.assertTrue("DummyPnfWorkflow".equals(workflows.get(0).getArtifactName()));
+    }
+
 }
diff --git a/mso-catalog-db/src/test/resources/data.sql b/mso-catalog-db/src/test/resources/data.sql
index e5963c1..0852aa0 100644
--- a/mso-catalog-db/src/test/resources/data.sql
+++ b/mso-catalog-db/src/test/resources/data.sql
@@ -957,3 +957,9 @@
 (select ID from user_parameters where NAME='existing_software_version')),
 ((select ID from activity_spec where NAME='VNFUpgradeSoftwareActivity' and VERSION=1.0),
 (select ID from user_parameters where NAME='new_software_version'));
+
+INSERT INTO bbname_selection_reference (CONTROLLER_ACTOR,SCOPE,ACTION,BB_NAME)
+VALUES
+('APPC', 'vfModule', 'healthCheck','GenericVnfHealthCheckBB'),
+('APPC', 'vfModule', 'configScaleOut','ConfigurationScaleOutBB'),
+('APPC', 'vnf', 'healthCheck','GenericVnfHealthCheckBB');
\ No newline at end of file
diff --git a/mso-catalog-db/src/test/resources/schema.sql b/mso-catalog-db/src/test/resources/schema.sql
index 9037e43..6573def 100644
--- a/mso-catalog-db/src/test/resources/schema.sql
+++ b/mso-catalog-db/src/test/resources/schema.sql
@@ -1387,6 +1387,18 @@
 ENGINE = InnoDB
 DEFAULT CHARACTER SET = latin1;
 
+--
+-- Table structure for table `bbname_selection_reference`
+--
 
+DROP TABLE IF EXISTS `bbname_selection_reference`;
+CREATE TABLE IF NOT EXISTS `bbname_selection_reference` (
+  `ID` INT(11) NOT NULL AUTO_INCREMENT,
+  `CONTROLLER_ACTOR` varchar(200) NOT NULL ,
+  `SCOPE` varchar(200) NOT NULL,
+  `ACTION` varchar(200) NOT NULL,
+  `BB_NAME` varchar(200) NOT NULL,
+  PRIMARY KEY (`ID`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
 
 
diff --git a/packages/docker/pom.xml b/packages/docker/pom.xml
index f29a445..c78979e 100644
--- a/packages/docker/pom.xml
+++ b/packages/docker/pom.xml
@@ -1,47 +1,47 @@
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 
-	<modelVersion>4.0.0</modelVersion>
+  <modelVersion>4.0.0</modelVersion>
 
-	<parent>
-		<groupId>org.onap.so</groupId>
-		<artifactId>packages</artifactId>
-		<version>1.4.0-SNAPSHOT</version>
-	</parent>
+  <parent>
+    <groupId>org.onap.so</groupId>
+    <artifactId>packages</artifactId>
+    <version>1.4.0-SNAPSHOT</version>
+  </parent>
 
-	<packaging>pom</packaging>
-	<artifactId>docker</artifactId>
-	<name>Docker Images</name>
-	<description>Docker Images</description>
+  <packaging>pom</packaging>
+  <artifactId>docker</artifactId>
+  <name>Docker Images</name>
+  <description>Docker Images</description>
 
-	<properties>
-		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-		<so.project.version>${project.version}</so.project.version>
-		<docker.skip>false</docker.skip>
-		<docker.skip.build>false</docker.skip.build>
-		<docker.skip.push>false</docker.skip.push>
-		<docker.pull.registry>nexus3.onap.org:10001</docker.pull.registry>
-		<docker.push.registry>nexus3.onap.org:10003</docker.push.registry>
-		<docker.image.prefix>onap/so</docker.image.prefix>
-		<docker.push.phase>deploy</docker.push.phase>
-	</properties>
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+    <so.project.version>${project.version}</so.project.version>
+    <docker.skip>false</docker.skip>
+    <docker.skip.build>false</docker.skip.build>
+    <docker.skip.push>false</docker.skip.push>
+    <docker.pull.registry>nexus3.onap.org:10001</docker.pull.registry>
+    <docker.push.registry>nexus3.onap.org:10003</docker.push.registry>
+    <docker.image.prefix>onap/so</docker.image.prefix>
+    <docker.push.phase>deploy</docker.push.phase>
+  </properties>
 
-	<build>
-		<finalName>${project.artifactId}-${project.version}</finalName>
-		<plugins>
-			<plugin>
-				<groupId>org.codehaus.groovy.maven</groupId>
-				<artifactId>gmaven-plugin</artifactId>
-				<version>1.0</version>
-				<executions>
-					<execution>
-						<phase>validate</phase>
-						<goals>
-							<goal>execute</goal>
-						</goals>
-						<configuration>
-							<source>
+  <build>
+    <finalName>${project.artifactId}-${project.version}</finalName>
+    <plugins>
+      <plugin>
+        <groupId>org.codehaus.groovy.maven</groupId>
+        <artifactId>gmaven-plugin</artifactId>
+        <version>1.0</version>
+        <executions>
+          <execution>
+            <phase>validate</phase>
+            <goals>
+              <goal>execute</goal>
+            </goals>
+            <configuration>
+              <source>
 								println 'Project version: ' + project.properties['so.project.version'];
 								def versionArray;
 								if ( project.properties['so.project.version'] != null ) {
@@ -56,439 +56,469 @@
 
 								println 'New tag for docker: ' + project.properties['project.docker.latesttag.version'];
 							</source>
-						</configuration>
-					</execution>
-				</executions>
-			</plugin>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
 
-			<plugin>
-				<groupId>io.fabric8</groupId>
-				<artifactId>docker-maven-plugin</artifactId>
-				<version>0.31.0</version>
+      <plugin>
+        <groupId>io.fabric8</groupId>
+        <artifactId>docker-maven-plugin</artifactId>
+        <version>0.31.0</version>
 
-				<configuration>
-					<verbose>true</verbose>
-					<apiVersion>1.23</apiVersion>
-					<pullRegistry>${docker.pull.registry}</pullRegistry>
-					<pushRegistry>${docker.push.registry}</pushRegistry>
+        <configuration>
+          <verbose>true</verbose>
+          <apiVersion>1.23</apiVersion>
+          <pullRegistry>${docker.pull.registry}</pullRegistry>
+          <pushRegistry>${docker.push.registry}</pushRegistry>
 
-					<images>
-						<image>
-							<name>${docker.image.prefix}/base-image:1.0</name>
-							<build>
-								<cleanup>try</cleanup>
-								<dockerFileDir>docker-files</dockerFileDir>
-								<dockerFile>Dockerfile.so-base-image</dockerFile>
-							</build>
-						</image>
-						<image>
-							<name>${docker.image.prefix}/vnfm-adapter</name>
-							<build>
-								<cleanup>try</cleanup>
-								<dockerFileDir>docker-files</dockerFileDir>
-								<dockerFile>Dockerfile.so-app</dockerFile>
-								<tags>
-									<tag>${project.version}</tag>
-									<tag>${project.version}-${maven.build.timestamp}</tag>
-									<tag>${project.docker.latesttag.version}</tag>
-								</tags>
-								<assembly>
-									<inline>
-										<dependencySets>
-											<dependencySet>
-												<includes>
-													<include>org.onap.so.adapters:mso-vnfm-etsi-adapter</include>
-												</includes>
-												<outputFileNameMapping>app.jar</outputFileNameMapping>
-											</dependencySet>
-										</dependencySets>
-									</inline>
-								</assembly>
-							</build>
-						</image>
-						<image>
-							<name>${docker.image.prefix}/catalog-db-adapter</name>
-							<build>
-								<cleanup>try</cleanup>
-								<dockerFileDir>docker-files</dockerFileDir>
-								<dockerFile>Dockerfile.so-app</dockerFile>
-								<tags>
-									<tag>${project.version}</tag>
-									<tag>${project.version}-${maven.build.timestamp}</tag>
-									<tag>${project.docker.latesttag.version}</tag>
-								</tags>
-								<assembly>
-									<inline>
-										<dependencySets>
-											<dependencySet>
-												<includes>
-													<include>org.onap.so.adapters:mso-catalog-db-adapter</include>
-												</includes>
-												<outputFileNameMapping>app.jar</outputFileNameMapping>
-											</dependencySet>
-										</dependencySets>
-									</inline>
-								</assembly>
-							</build>
-						</image>
-						<image>
-							<name>${docker.image.prefix}/request-db-adapter</name>
-							<build>
-								<cleanup>try</cleanup>
-								<dockerFileDir>docker-files</dockerFileDir>
-								<dockerFile>Dockerfile.so-app</dockerFile>
-								<tags>
-									<tag>${project.version}</tag>
-									<tag>${project.version}-${maven.build.timestamp}</tag>
-									<tag>${project.docker.latesttag.version}</tag>
-								</tags>
-								<assembly>
-									<inline>
-										<dependencySets>
-											<dependencySet>
-												<includes>
-													<include>org.onap.so.adapters:mso-requests-db-adapter</include>
-												</includes>
-												<outputFileNameMapping>app.jar</outputFileNameMapping>
-											</dependencySet>
-										</dependencySets>
-									</inline>
-								</assembly>
-							</build>
-						</image>
-						<image>
-							<name>${docker.image.prefix}/sdnc-adapter</name>
-							<build>
-								<cleanup>try</cleanup>
-								<dockerFileDir>docker-files</dockerFileDir>
-								<dockerFile>Dockerfile.so-app</dockerFile>
-								<tags>
-									<tag>${project.version}</tag>
-									<tag>${project.version}-${maven.build.timestamp}</tag>
-									<tag>${project.docker.latesttag.version}</tag>
-								</tags>
-								<assembly>
-									<inline>
-										<dependencySets>
-											<dependencySet>
-												<includes>
-													<include>org.onap.so:mso-sdnc-adapter</include>
-												</includes>
-												<outputFileNameMapping>app.jar</outputFileNameMapping>
-											</dependencySet>
-										</dependencySets>
-									</inline>
-								</assembly>
-							</build>
-						</image>
-						<image>
-							<name>${docker.image.prefix}/openstack-adapter</name>
-							<build>
-								<cleanup>try</cleanup>
-								<dockerFileDir>docker-files</dockerFileDir>
-								<dockerFile>Dockerfile.so-app</dockerFile>
-								<tags>
-									<tag>${project.version}</tag>
-									<tag>${project.version}-${maven.build.timestamp}</tag>
-									<tag>${project.docker.latesttag.version}</tag>
-								</tags>
-								<assembly>
-									<inline>
-										<dependencySets>
-											<dependencySet>
-												<includes>
-													<include>org.onap.so:mso-openstack-adapters</include>
-												</includes>
-												<outputFileNameMapping>app.jar</outputFileNameMapping>
-											</dependencySet>
-										</dependencySets>
-									</inline>
-								</assembly>
-							</build>
-						</image>
-						<image>
-							<name>${docker.image.prefix}/vfc-adapter</name>
-							<build>
-								<cleanup>try</cleanup>
-								<dockerFileDir>docker-files</dockerFileDir>
-								<dockerFile>Dockerfile.so-app</dockerFile>
-								<tags>
-									<tag>${project.version}</tag>
-									<tag>${project.version}-${maven.build.timestamp}</tag>
-									<tag>${project.docker.latesttag.version}</tag>
-								</tags>
-								<assembly>
-									<inline>
-										<dependencySets>
-											<dependencySet>
-												<includes>
-													<include>org.onap.so.adapters:mso-vfc-adapter</include>
-												</includes>
-												<outputFileNameMapping>app.jar</outputFileNameMapping>
-											</dependencySet>
-										</dependencySets>
-									</inline>
-								</assembly>
-							</build>
-						</image>
-												<image>
-							<name>${docker.image.prefix}/so-appc-orchestrator</name>
-							<build>
-								<cleanup>try</cleanup>
-								<dockerFileDir>docker-files</dockerFileDir>
-								<dockerFile>Dockerfile.so-app</dockerFile>
-								<tags>
-									<tag>${project.version}</tag>
-									<tag>${project.version}-${maven.build.timestamp}</tag>
-									<tag>${project.docker.latesttag.version}</tag>
-								</tags>
-								<assembly>
-									<inline>
-										<dependencySets>
-											<dependencySet>
-												<includes>
-													<include>org.onap.so.adapters:so-appc-orchestrator</include>
-												</includes>
-												<outputFileNameMapping>app.jar</outputFileNameMapping>
-											</dependencySet>
-										</dependencySets>
-									</inline>
-								</assembly>
-							</build>
-						</image>
-						<image>
-							<name>${docker.image.prefix}/sdc-controller</name>
-							<build>
-								<cleanup>try</cleanup>
-								<dockerFileDir>docker-files</dockerFileDir>
-								<dockerFile>Dockerfile.so-app</dockerFile>
-								<tags>
-									<tag>${project.version}</tag>
-									<tag>${project.version}-${maven.build.timestamp}</tag>
-									<tag>${project.docker.latesttag.version}</tag>
-								</tags>
-								<assembly>
-									<inline>
-										<dependencySets>
-											<dependencySet>
-												<includes>
-													<include>org.onap.so:asdc-controller</include>
-												</includes>
-												<outputFileNameMapping>app.jar</outputFileNameMapping>
-											</dependencySet>
-										</dependencySets>
-									</inline>
-								</assembly>
-							</build>
-						</image>
-						<image>
-							<name>${docker.image.prefix}/bpmn-infra</name>
-							<build>
-								<cleanup>try</cleanup>
-								<dockerFileDir>docker-files</dockerFileDir>
-								<dockerFile>Dockerfile.so-app</dockerFile>
-								<tags>
-									<tag>${project.version}</tag>
-									<tag>${project.version}-${maven.build.timestamp}</tag>
-									<tag>${project.docker.latesttag.version}</tag>
-								</tags>
-								<assembly>
-									<inline>
-										<dependencySets>
-											<dependencySet>
-												<includes>
-													<include>org.onap.so:mso-infrastructure-bpmn</include>
-												</includes>
-												<outputFileNameMapping>app.jar</outputFileNameMapping>
-											</dependencySet>
-										</dependencySets>
-									</inline>
-								</assembly>
-							</build>
-						</image>
-						<image>
-							<name>${docker.image.prefix}/api-handler-infra</name>
-							<build>
-								<cleanup>try</cleanup>
-								<dockerFileDir>docker-files</dockerFileDir>
-								<dockerFile>Dockerfile.so-app</dockerFile>
-								<tags>
-									<tag>${project.version}</tag>
-									<tag>${project.version}-${maven.build.timestamp}</tag>
-									<tag>${project.docker.latesttag.version}</tag>
-								</tags>
-								<assembly>
-									<inline>
-										<dependencySets>
-											<dependencySet>
-												<includes>
-													<include>org.onap.so:mso-api-handler-infra</include>
-												</includes>
-												<outputFileNameMapping>app.jar</outputFileNameMapping>
-											</dependencySet>
-										</dependencySets>
-									</inline>
-								</assembly>
-							</build>
-						</image>
-						<image>
-							<name>${docker.image.prefix}/so-monitoring</name>
-							<build>
-								<cleanup>try</cleanup>
-								<dockerFileDir>docker-files</dockerFileDir>
-								<dockerFile>Dockerfile.so-app</dockerFile>
-								<tags>
-									<tag>${project.version}</tag>
-									<tag>${project.version}-${maven.build.timestamp}</tag>
-									<tag>${project.docker.latesttag.version}</tag>
-								</tags>
-								<assembly>
-									<inline>
-										<dependencySets>
-											<dependencySet>
-												<includes>
-													<include>org.onap.so.monitoring:so-monitoring-service</include>
-												</includes>
-												<outputFileNameMapping>app.jar</outputFileNameMapping>
-											</dependencySet>
-										</dependencySets>
-									</inline>
-								</assembly>
-							</build>
-						</image>
-						<image>
-							<name>${docker.image.prefix}/so-simulator</name>
-							<build>
-								<cleanup>try</cleanup>
-								<dockerFileDir>docker-files</dockerFileDir>
-								<dockerFile>Dockerfile.so-app</dockerFile>
-								<tags>
-									<tag>${project.version}</tag>
-									<tag>${project.version}-${maven.build.timestamp}</tag>
-									<tag>${project.docker.latesttag.version}</tag>
-								</tags>
-								<assembly>
-									<inline>
-										<dependencySets>
-											<dependencySet>
-												<includes>
-													<include>org.onap.so:so-simulator</include>
-												</includes>
-												<outputFileNameMapping>app.jar</outputFileNameMapping>
-											</dependencySet>
-										</dependencySets>
-									</inline>
-								</assembly>
-							</build>
-						</image>
-					</images>
-				</configuration>
+          <images>
+            <image>
+              <name>${docker.image.prefix}/base-image:1.0</name>
+              <build>
+                <cleanup>try</cleanup>
+                <dockerFileDir>docker-files</dockerFileDir>
+                <dockerFile>Dockerfile.so-base-image</dockerFile>
+              </build>
+            </image>
+            <image>
+              <name>${docker.image.prefix}/vnfm-adapter</name>
+              <build>
+                <cleanup>try</cleanup>
+                <dockerFileDir>docker-files</dockerFileDir>
+                <dockerFile>Dockerfile.so-app</dockerFile>
+                <tags>
+                  <tag>${project.version}</tag>
+                  <tag>${project.version}-${maven.build.timestamp}</tag>
+                  <tag>${project.docker.latesttag.version}</tag>
+                </tags>
+                <assembly>
+                  <inline>
+                    <dependencySets>
+                      <dependencySet>
+                        <includes>
+                          <include>org.onap.so.adapters:mso-vnfm-etsi-adapter</include>
+                        </includes>
+                        <outputFileNameMapping>app.jar</outputFileNameMapping>
+                      </dependencySet>
+                    </dependencySets>
+                  </inline>
+                </assembly>
+              </build>
+            </image>
+            <image>
+              <name>${docker.image.prefix}/ve-vnfm-adapter</name>
+              <build>
+                <cleanup>try</cleanup>
+                <dockerFileDir>docker-files</dockerFileDir>
+                <dockerFile>Dockerfile.so-app</dockerFile>
+                <tags>
+                  <tag>${project.version}</tag>
+                  <tag>${project.version}-${maven.build.timestamp}</tag>
+                  <tag>${project.docker.latesttag.version}</tag>
+                </tags>
+                <assembly>
+                  <inline>
+                    <dependencySets>
+                      <dependencySet>
+                        <includes>
+                          <include>org.onap.so.adapters:mso-ve-vnfm-adapter</include>
+                        </includes>
+                        <outputFileNameMapping>app.jar</outputFileNameMapping>
+                      </dependencySet>
+                    </dependencySets>
+                  </inline>
+                </assembly>
+              </build>
+            </image>
+            <image>
+              <name>${docker.image.prefix}/catalog-db-adapter</name>
+              <build>
+                <cleanup>try</cleanup>
+                <dockerFileDir>docker-files</dockerFileDir>
+                <dockerFile>Dockerfile.so-app</dockerFile>
+                <tags>
+                  <tag>${project.version}</tag>
+                  <tag>${project.version}-${maven.build.timestamp}</tag>
+                  <tag>${project.docker.latesttag.version}</tag>
+                </tags>
+                <assembly>
+                  <inline>
+                    <dependencySets>
+                      <dependencySet>
+                        <includes>
+                          <include>org.onap.so.adapters:mso-catalog-db-adapter</include>
+                        </includes>
+                        <outputFileNameMapping>app.jar</outputFileNameMapping>
+                      </dependencySet>
+                    </dependencySets>
+                  </inline>
+                </assembly>
+              </build>
+            </image>
+            <image>
+              <name>${docker.image.prefix}/request-db-adapter</name>
+              <build>
+                <cleanup>try</cleanup>
+                <dockerFileDir>docker-files</dockerFileDir>
+                <dockerFile>Dockerfile.so-app</dockerFile>
+                <tags>
+                  <tag>${project.version}</tag>
+                  <tag>${project.version}-${maven.build.timestamp}</tag>
+                  <tag>${project.docker.latesttag.version}</tag>
+                </tags>
+                <assembly>
+                  <inline>
+                    <dependencySets>
+                      <dependencySet>
+                        <includes>
+                          <include>org.onap.so.adapters:mso-requests-db-adapter</include>
+                        </includes>
+                        <outputFileNameMapping>app.jar</outputFileNameMapping>
+                      </dependencySet>
+                    </dependencySets>
+                  </inline>
+                </assembly>
+              </build>
+            </image>
+            <image>
+              <name>${docker.image.prefix}/sdnc-adapter</name>
+              <build>
+                <cleanup>try</cleanup>
+                <dockerFileDir>docker-files</dockerFileDir>
+                <dockerFile>Dockerfile.so-app</dockerFile>
+                <tags>
+                  <tag>${project.version}</tag>
+                  <tag>${project.version}-${maven.build.timestamp}</tag>
+                  <tag>${project.docker.latesttag.version}</tag>
+                </tags>
+                <assembly>
+                  <inline>
+                    <dependencySets>
+                      <dependencySet>
+                        <includes>
+                          <include>org.onap.so:mso-sdnc-adapter</include>
+                        </includes>
+                        <outputFileNameMapping>app.jar</outputFileNameMapping>
+                      </dependencySet>
+                    </dependencySets>
+                  </inline>
+                </assembly>
+              </build>
+            </image>
+            <image>
+              <name>${docker.image.prefix}/openstack-adapter</name>
+              <build>
+                <cleanup>try</cleanup>
+                <dockerFileDir>docker-files</dockerFileDir>
+                <dockerFile>Dockerfile.so-app</dockerFile>
+                <tags>
+                  <tag>${project.version}</tag>
+                  <tag>${project.version}-${maven.build.timestamp}</tag>
+                  <tag>${project.docker.latesttag.version}</tag>
+                </tags>
+                <assembly>
+                  <inline>
+                    <dependencySets>
+                      <dependencySet>
+                        <includes>
+                          <include>org.onap.so:mso-openstack-adapters</include>
+                        </includes>
+                        <outputFileNameMapping>app.jar</outputFileNameMapping>
+                      </dependencySet>
+                    </dependencySets>
+                  </inline>
+                </assembly>
+              </build>
+            </image>
+            <image>
+              <name>${docker.image.prefix}/vfc-adapter</name>
+              <build>
+                <cleanup>try</cleanup>
+                <dockerFileDir>docker-files</dockerFileDir>
+                <dockerFile>Dockerfile.so-app</dockerFile>
+                <tags>
+                  <tag>${project.version}</tag>
+                  <tag>${project.version}-${maven.build.timestamp}</tag>
+                  <tag>${project.docker.latesttag.version}</tag>
+                </tags>
+                <assembly>
+                  <inline>
+                    <dependencySets>
+                      <dependencySet>
+                        <includes>
+                          <include>org.onap.so.adapters:mso-vfc-adapter</include>
+                        </includes>
+                        <outputFileNameMapping>app.jar</outputFileNameMapping>
+                      </dependencySet>
+                    </dependencySets>
+                  </inline>
+                </assembly>
+              </build>
+            </image>
+            <image>
+              <name>${docker.image.prefix}/so-appc-orchestrator</name>
+              <build>
+                <cleanup>try</cleanup>
+                <dockerFileDir>docker-files</dockerFileDir>
+                <dockerFile>Dockerfile.so-app</dockerFile>
+                <tags>
+                  <tag>${project.version}</tag>
+                  <tag>${project.version}-${maven.build.timestamp}</tag>
+                  <tag>${project.docker.latesttag.version}</tag>
+                </tags>
+                <assembly>
+                  <inline>
+                    <dependencySets>
+                      <dependencySet>
+                        <includes>
+                          <include>org.onap.so.adapters:so-appc-orchestrator</include>
+                        </includes>
+                        <outputFileNameMapping>app.jar</outputFileNameMapping>
+                      </dependencySet>
+                    </dependencySets>
+                  </inline>
+                </assembly>
+              </build>
+            </image>
+            <image>
+              <name>${docker.image.prefix}/sdc-controller</name>
+              <build>
+                <cleanup>try</cleanup>
+                <dockerFileDir>docker-files</dockerFileDir>
+                <dockerFile>Dockerfile.so-app</dockerFile>
+                <tags>
+                  <tag>${project.version}</tag>
+                  <tag>${project.version}-${maven.build.timestamp}</tag>
+                  <tag>${project.docker.latesttag.version}</tag>
+                </tags>
+                <assembly>
+                  <inline>
+                    <dependencySets>
+                      <dependencySet>
+                        <includes>
+                          <include>org.onap.so:asdc-controller</include>
+                        </includes>
+                        <outputFileNameMapping>app.jar</outputFileNameMapping>
+                      </dependencySet>
+                    </dependencySets>
+                  </inline>
+                </assembly>
+              </build>
+            </image>
+            <image>
+              <name>${docker.image.prefix}/bpmn-infra</name>
+              <build>
+                <cleanup>try</cleanup>
+                <dockerFileDir>docker-files</dockerFileDir>
+                <dockerFile>Dockerfile.so-app</dockerFile>
+                <tags>
+                  <tag>${project.version}</tag>
+                  <tag>${project.version}-${maven.build.timestamp}</tag>
+                  <tag>${project.docker.latesttag.version}</tag>
+                </tags>
+                <assembly>
+                  <inline>
+                    <dependencySets>
+                      <dependencySet>
+                        <includes>
+                          <include>org.onap.so:mso-infrastructure-bpmn</include>
+                        </includes>
+                        <outputFileNameMapping>app.jar</outputFileNameMapping>
+                      </dependencySet>
+                    </dependencySets>
+                  </inline>
+                </assembly>
+              </build>
+            </image>
+            <image>
+              <name>${docker.image.prefix}/api-handler-infra</name>
+              <build>
+                <cleanup>try</cleanup>
+                <dockerFileDir>docker-files</dockerFileDir>
+                <dockerFile>Dockerfile.so-app</dockerFile>
+                <tags>
+                  <tag>${project.version}</tag>
+                  <tag>${project.version}-${maven.build.timestamp}</tag>
+                  <tag>${project.docker.latesttag.version}</tag>
+                </tags>
+                <assembly>
+                  <inline>
+                    <dependencySets>
+                      <dependencySet>
+                        <includes>
+                          <include>org.onap.so:mso-api-handler-infra</include>
+                        </includes>
+                        <outputFileNameMapping>app.jar</outputFileNameMapping>
+                      </dependencySet>
+                    </dependencySets>
+                  </inline>
+                </assembly>
+              </build>
+            </image>
+            <image>
+              <name>${docker.image.prefix}/so-monitoring</name>
+              <build>
+                <cleanup>try</cleanup>
+                <dockerFileDir>docker-files</dockerFileDir>
+                <dockerFile>Dockerfile.so-app</dockerFile>
+                <tags>
+                  <tag>${project.version}</tag>
+                  <tag>${project.version}-${maven.build.timestamp}</tag>
+                  <tag>${project.docker.latesttag.version}</tag>
+                </tags>
+                <assembly>
+                  <inline>
+                    <dependencySets>
+                      <dependencySet>
+                        <includes>
+                          <include>org.onap.so.monitoring:so-monitoring-service</include>
+                        </includes>
+                        <outputFileNameMapping>app.jar</outputFileNameMapping>
+                      </dependencySet>
+                    </dependencySets>
+                  </inline>
+                </assembly>
+              </build>
+            </image>
+            <image>
+              <name>${docker.image.prefix}/so-simulator</name>
+              <build>
+                <cleanup>try</cleanup>
+                <dockerFileDir>docker-files</dockerFileDir>
+                <dockerFile>Dockerfile.so-app</dockerFile>
+                <tags>
+                  <tag>${project.version}</tag>
+                  <tag>${project.version}-${maven.build.timestamp}</tag>
+                  <tag>${project.docker.latesttag.version}</tag>
+                </tags>
+                <assembly>
+                  <inline>
+                    <dependencySets>
+                      <dependencySet>
+                        <includes>
+                          <include>org.onap.so.simulator:so-simulator</include>
+                        </includes>
+                        <outputFileNameMapping>app.jar</outputFileNameMapping>
+                      </dependencySet>
+                    </dependencySets>
+                  </inline>
+                </assembly>
+              </build>
+            </image>
+          </images>
+        </configuration>
 
-				<executions>
-					<execution>
-						<id>clean-images</id>
-						<phase>pre-clean</phase>
-						<goals>
-							<goal>remove</goal>
-						</goals>
-						<configuration>
-							<removeAll>true</removeAll>
-						</configuration>
-					</execution>
+        <executions>
+          <execution>
+            <id>clean-images</id>
+            <phase>pre-clean</phase>
+            <goals>
+              <goal>remove</goal>
+            </goals>
+            <configuration>
+              <removeAll>true</removeAll>
+            </configuration>
+          </execution>
 
-					<execution>
-						<id>generate-images</id>
-						<phase>generate-sources</phase>
-						<goals>
-							<goal>build</goal>
-						</goals>
-					</execution>
+          <execution>
+            <id>generate-images</id>
+            <phase>generate-sources</phase>
+            <goals>
+              <goal>build</goal>
+            </goals>
+          </execution>
 
-					<execution>
-						<id>push-images</id>
-						<phase>${docker.push.phase}</phase>
-						<goals>
-							<goal>build</goal>
-							<goal>push</goal>
-						</goals>
-						<configuration>
- 						    <image>${docker.image.prefix}/catalog-db-adapter,${docker.image.prefix}/request-db-adapter,${docker.image.prefix}/sdnc-adapter,${docker.image.prefix}/openstack-adapter,${docker.image.prefix}/vfc-adapter,${docker.image.prefix}/sdc-controller,${docker.image.prefix}/bpmn-infra,${docker.image.prefix}/api-handler-infra,${docker.image.prefix}/so-monitoring,${docker.image.prefix}/so-simulator</image>
-						</configuration>
-					</execution>
-				</executions>
-			</plugin>
+          <execution>
+            <id>push-images</id>
+            <phase>${docker.push.phase}</phase>
+            <goals>
+              <goal>build</goal>
+              <goal>push</goal>
+            </goals>
+            <configuration>
+              <image>${docker.image.prefix}/catalog-db-adapter,${docker.image.prefix}/request-db-adapter,${docker.image.prefix}/sdnc-adapter,${docker.image.prefix}/openstack-adapter,${docker.image.prefix}/vfc-adapter,${docker.image.prefix}/sdc-controller,${docker.image.prefix}/bpmn-infra,${docker.image.prefix}/api-handler-infra,${docker.image.prefix}/so-monitoring,${docker.image.prefix}/so-simulator</image>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
 
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-deploy-plugin</artifactId>
-				<version>2.8</version>
-				<configuration>
-					<skip>true</skip>
-				</configuration>
-			</plugin>
-		</plugins>
-	</build>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-deploy-plugin</artifactId>
+        <version>2.8</version>
+        <configuration>
+          <skip>true</skip>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
 
-	<dependencies>
-		<dependency>
-			<groupId>org.onap.so.adapters</groupId>
-			<artifactId>mso-vnfm-etsi-adapter</artifactId>
-			<version>${project.version}</version>
-		</dependency>
-		<dependency>
-			<groupId>org.onap.so.adapters</groupId>
-			<artifactId>mso-catalog-db-adapter</artifactId>
-			<version>${project.version}</version>
-		</dependency>
-		<dependency>
-			<groupId>org.onap.so.adapters</groupId>
-			<artifactId>mso-requests-db-adapter</artifactId>
-			<version>${project.version}</version>
-		</dependency>
-		<dependency>
-			<groupId>org.onap.so</groupId>
-			<artifactId>mso-sdnc-adapter</artifactId>
-			<version>${project.version}</version>
-		</dependency>
-		<dependency>
-			<groupId>org.onap.so</groupId>
-			<artifactId>mso-openstack-adapters</artifactId>
-			<version>${project.version}</version>
-		</dependency>
-		<dependency>
-			<groupId>org.onap.so.adapters</groupId>
-			<artifactId>mso-vfc-adapter</artifactId>
-			<version>${project.version}</version>
-		</dependency>
-		<dependency>
-			<groupId>org.onap.so.adapters</groupId>
-			<artifactId>so-appc-orchestrator</artifactId>
-			<version>${project.version}</version>
-		</dependency>
-		<dependency>
-			<groupId>org.onap.so</groupId>
-			<artifactId>asdc-controller</artifactId>
-			<version>${project.version}</version>
-		</dependency>
-		<dependency>
-			<groupId>org.onap.so</groupId>
-			<artifactId>mso-infrastructure-bpmn</artifactId>
-			<version>${project.version}</version>
-		</dependency>
-		<dependency>
-			<groupId>org.onap.so</groupId>
-			<artifactId>mso-api-handler-infra</artifactId>
-			<version>${project.version}</version>
-		</dependency>
-		<dependency>
-			<groupId>org.onap.so.monitoring</groupId>
-			<artifactId>so-monitoring-service</artifactId>
-			<version>${project.version}</version>
-		</dependency>
-	    <dependency>
-			<groupId>org.onap.so</groupId>
-			<artifactId>so-simulator</artifactId>
-			<version>${project.version}</version>
-		</dependency>
-	</dependencies>
+  <dependencies>
+    <dependency>
+      <groupId>org.onap.so.adapters</groupId>
+      <artifactId>mso-vnfm-etsi-adapter</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.onap.so.adapters</groupId>
+      <artifactId>mso-ve-vnfm-adapter</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.onap.so.adapters</groupId>
+      <artifactId>mso-catalog-db-adapter</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.onap.so.adapters</groupId>
+      <artifactId>mso-requests-db-adapter</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.onap.so</groupId>
+      <artifactId>mso-sdnc-adapter</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.onap.so</groupId>
+      <artifactId>mso-openstack-adapters</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.onap.so.adapters</groupId>
+      <artifactId>mso-vfc-adapter</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.onap.so.adapters</groupId>
+      <artifactId>so-appc-orchestrator</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.onap.so</groupId>
+      <artifactId>asdc-controller</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.onap.so</groupId>
+      <artifactId>mso-infrastructure-bpmn</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.onap.so</groupId>
+      <artifactId>mso-api-handler-infra</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.onap.so.monitoring</groupId>
+      <artifactId>so-monitoring-service</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.onap.so.simulator</groupId>
+      <artifactId>so-simulator</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+  </dependencies>
 </project>
diff --git a/pom.xml b/pom.xml
index 9f453d4..ea3f635 100644
--- a/pom.xml
+++ b/pom.xml
@@ -32,8 +32,8 @@
     <module>cloudify-client</module>
     <module>cxf-logging</module>
     <module>so-monitoring</module>
-    <module>packages</module>
     <module>so-simulator</module>
+    <module>packages</module>
   </modules>
   <properties>
     <project.mso.base.folder>.</project.mso.base.folder>
@@ -42,12 +42,12 @@
     <sonar.language>java</sonar.language>
     <sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin>
     <sonar.surefire.reportsPath>${project.build.directory}/surefire-reports</sonar.surefire.reportsPath>
-    <sonar.jacoco.reportPath>${project.build.directory}/code-coverage/jacoco-ut.exec</sonar.jacoco.reportPath>
+    <sonar.coverage.jacoco.xmlReportPaths>${project.reporting.outputDirectory}/jacoco-ut/jacoco.xml</sonar.coverage.jacoco.xmlReportPaths>
     <!--sonar.jacoco.itReportPath>${project.mso.base.folder}/packages/arquillian-unit-tests/target/mso-automated-tests/jacoco-it.exec</sonar.jacoco.itReportPath -->
     <sonar.jacoco.reportMissing.force.zero>true</sonar.jacoco.reportMissing.force.zero>
     <sonar.projectVersion>${project.version}</sonar.projectVersion>
     <sonar.cpd.exclusions>**/*</sonar.cpd.exclusions>
-    <jacoco.version>0.7.5.201505241946</jacoco.version>
+    <jacoco.version>0.8.5</jacoco.version>
     <org.apache.maven.user-settings />
     <openstack.version>1.5.1</openstack.version>
     <maven.build.timestamp.format>yyyyMMdd'T'HHmm</maven.build.timestamp.format>
@@ -342,16 +342,20 @@
         <version>${jacoco.version}</version>
         <executions>
           <execution>
-            <id>default-prepare-agent</id>
+            <id>prepare-agent</id>
             <goals>
               <goal>prepare-agent</goal>
             </goals>
           </execution>
           <execution>
-            <id>default-report</id>
+            <id>report</id>
             <goals>
               <goal>report</goal>
             </goals>
+            <configuration>
+              <dataFile>${project.build.directory}/code-coverage/jacoco.exec</dataFile>
+              <outputDirectory>${project.reporting.outputDirectory}/jacoco-ut</outputDirectory>
+            </configuration>
           </execution>
         </executions>
       </plugin>
@@ -666,17 +670,17 @@
     <dependency>
       <groupId>org.onap.logging-analytics</groupId>
       <artifactId>logging-slf4j</artifactId>
-      <version>1.6.3-SNAPSHOT</version>
+      <version>1.6.4</version>
     </dependency>
     <dependency>
       <groupId>org.onap.logging-analytics</groupId>
       <artifactId>logging-filter-base</artifactId>
-      <version>1.6.2-SNAPSHOT</version>
+      <version>1.6.4</version>
     </dependency>
     <dependency>
       <groupId>org.onap.logging-analytics</groupId>
       <artifactId>logging-filter-spring</artifactId>
-      <version>1.6.3-SNAPSHOT</version>
+      <version>1.6.4</version>
     </dependency>
     <dependency>
       <groupId>com.fasterxml.jackson.core</groupId>
diff --git a/version.properties b/version.properties
index 9eb3b93..a0756ad 100644
--- a/version.properties
+++ b/version.properties
@@ -3,8 +3,8 @@
 # because they are used in Jenkins, whose plug-in doesn't support
 
 major=1
-minor=5
-patch=3
+minor=6
+patch=0
 
 base_version=${major}.${minor}.${patch}