Merge "Fixed issues found in integration testing"
diff --git a/adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/utils/MsoYamlEditorWithEnvt.java b/adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/utils/MsoYamlEditorWithEnvt.java
index 0541a8f..9ee8a09 100644
--- a/adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/utils/MsoYamlEditorWithEnvt.java
+++ b/adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/utils/MsoYamlEditorWithEnvt.java
@@ -40,6 +40,7 @@
 public class MsoYamlEditorWithEnvt {
 
     private static final Logger logger = LoggerFactory.getLogger(MsoYamlEditorWithEnvt.class);
+    public static final String EXCEPTION = "Exception:";
 
     private Map<String, Object> yml;
     private Yaml yaml = new Yaml();
@@ -68,7 +69,7 @@
         try {
             resourceMap = (Map<String, Object>) yml.get("parameters");
         } catch (Exception e) {
-            logger.debug("Exception:", e);
+            logger.debug(EXCEPTION, e);
             return paramSet;
         }
         if (resourceMap == null) {
@@ -89,7 +90,7 @@
                 try {
                     value = JSON_MAPPER.writeValueAsString(obj);
                 } catch (Exception e) {
-                    logger.debug("Exception:", e);
+                    logger.debug(EXCEPTION, e);
                     value = "_BAD_JSON_MAPPING";
                 }
             } else {
@@ -118,7 +119,7 @@
             }
             return resourceList;
         } catch (Exception e) {
-            logger.debug("Exception:", e);
+            logger.debug(EXCEPTION, e);
         }
         return null;
     }
@@ -137,7 +138,7 @@
             try {
                 value = resourceEntry.get("default");
             } catch (ClassCastException cce) {
-                logger.debug("Exception:", cce);
+                logger.debug(EXCEPTION, cce);
                 // This exception only - the value is an integer. For what we're doing
                 // here - we don't care - so set value to something - and it will
                 // get marked as not being required - which is correct.
diff --git a/adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/utils/MulticloudCreateHeatResponse.java b/adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/utils/MulticloudCreateHeatResponse.java
index a4cdba2..16671bb 100644
--- a/adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/utils/MulticloudCreateHeatResponse.java
+++ b/adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/utils/MulticloudCreateHeatResponse.java
@@ -31,7 +31,7 @@
 @JsonInclude(JsonInclude.Include.NON_NULL)
 @JsonPropertyOrder({"id", "links"})
 public class MulticloudCreateHeatResponse implements Serializable {
-    private final static long serialVersionUID = -5215028275577848311L;
+    private static final long serialVersionUID = -5215028275577848311L;
 
     @JsonProperty("id")
     private String id;
diff --git a/adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/utils/MulticloudCreateLinkResponse.java b/adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/utils/MulticloudCreateLinkResponse.java
index e8a5b14..1f55aa9 100644
--- a/adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/utils/MulticloudCreateLinkResponse.java
+++ b/adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/utils/MulticloudCreateLinkResponse.java
@@ -31,7 +31,7 @@
 @JsonInclude(JsonInclude.Include.NON_NULL)
 @JsonPropertyOrder({"href", "rel"})
 public class MulticloudCreateLinkResponse implements Serializable {
-    private final static long serialVersionUID = -5215028275577848311L;
+    private static final long serialVersionUID = -5215028275577848311L;
 
     @JsonProperty("href")
     private String href;
diff --git a/adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/utils/MulticloudCreateResponse.java b/adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/utils/MulticloudCreateResponse.java
index bb15e58..fc08201 100644
--- a/adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/utils/MulticloudCreateResponse.java
+++ b/adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/utils/MulticloudCreateResponse.java
@@ -30,7 +30,7 @@
 @JsonInclude(JsonInclude.Include.NON_NULL)
 @JsonPropertyOrder({"template_type", "workload_id", "template_response"})
 public class MulticloudCreateResponse implements Serializable {
-    private final static long serialVersionUID = -5215028275577848311L;
+    private static final long serialVersionUID = -5215028275577848311L;
 
     @JsonProperty("template_type")
     private String templateType;
diff --git a/adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/utils/MulticloudCreateStackResponse.java b/adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/utils/MulticloudCreateStackResponse.java
index 67cb735..67d1cbf 100644
--- a/adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/utils/MulticloudCreateStackResponse.java
+++ b/adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/utils/MulticloudCreateStackResponse.java
@@ -30,7 +30,7 @@
 @JsonInclude(JsonInclude.Include.NON_NULL)
 @JsonPropertyOrder({"stack"})
 public class MulticloudCreateStackResponse implements Serializable {
-    private final static long serialVersionUID = -5215028275577848311L;
+    private static final long serialVersionUID = -5215028275577848311L;
 
     @JsonProperty("stack")
     private MulticloudCreateHeatResponse stack;
diff --git a/adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/utils/MulticloudQueryResponse.java b/adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/utils/MulticloudQueryResponse.java
index a22937a..ad37b39 100644
--- a/adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/utils/MulticloudQueryResponse.java
+++ b/adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/utils/MulticloudQueryResponse.java
@@ -31,7 +31,7 @@
 @JsonInclude(JsonInclude.Include.NON_NULL)
 @JsonPropertyOrder({"template_type", "workload_id", "workload_status", "workload_status_reason"})
 public class MulticloudQueryResponse implements Serializable {
-    private final static long serialVersionUID = -5215028275577848311L;
+    private static final long serialVersionUID = -5215028275577848311L;
 
     @JsonProperty("template_type")
     private String templateType;
diff --git a/adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/utils/MulticloudRequest.java b/adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/utils/MulticloudRequest.java
index b733552..95dd48c 100644
--- a/adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/utils/MulticloudRequest.java
+++ b/adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/utils/MulticloudRequest.java
@@ -33,7 +33,7 @@
         "vf-module-model-customization-id", "oof_directives", "sdnc_directives", "user_directives", "template_type",
         "template_data"})
 public class MulticloudRequest implements Serializable {
-    private final static long serialVersionUID = -5215028275577848311L;
+    private static final long serialVersionUID = -5215028275577848311L;
 
     @JsonProperty("generic-vnf-id")
     private String genericVnfId;
diff --git a/adapters/mso-adapters-rest-interface/src/main/java/org/onap/so/adapters/vnfrest/VfResponseCommon.java b/adapters/mso-adapters-rest-interface/src/main/java/org/onap/so/adapters/vnfrest/VfResponseCommon.java
index 23bbbb3..7a2d4ec 100644
--- a/adapters/mso-adapters-rest-interface/src/main/java/org/onap/so/adapters/vnfrest/VfResponseCommon.java
+++ b/adapters/mso-adapters-rest-interface/src/main/java/org/onap/so/adapters/vnfrest/VfResponseCommon.java
@@ -24,6 +24,8 @@
 
 
 import java.io.ByteArrayOutputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
 import javax.xml.bind.JAXBContext;
 import javax.xml.bind.Marshaller;
 import com.fasterxml.jackson.databind.ObjectMapper;
@@ -71,7 +73,7 @@
     public String toXmlString() {
         try {
             ByteArrayOutputStream bs = new ByteArrayOutputStream();
-            JAXBContext context = JAXBContext.newInstance(this.getClass());
+            JAXBContext context = JAXBContext.newInstance(this.getClass(), ArrayList.class, HashMap.class);
             Marshaller marshaller = context.createMarshaller();
             marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); // pretty print XML
             marshaller.marshal(this, bs);
diff --git a/adapters/mso-adapters-rest-interface/src/main/java/org/onap/so/openstack/mappers/MapElements.java b/adapters/mso-adapters-rest-interface/src/main/java/org/onap/so/openstack/mappers/MapElements.java
index d20d2b7..0327fd6 100644
--- a/adapters/mso-adapters-rest-interface/src/main/java/org/onap/so/openstack/mappers/MapElements.java
+++ b/adapters/mso-adapters-rest-interface/src/main/java/org/onap/so/openstack/mappers/MapElements.java
@@ -20,9 +20,16 @@
 
 package org.onap.so.openstack.mappers;
 
+import java.util.List;
+import java.util.Map;
 import javax.xml.bind.annotation.XmlElement;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
 
 public class MapElements {
+    private static final Logger logger = LoggerFactory.getLogger(MapElements.class);
     @XmlElement
     public String key;
     @XmlElement
@@ -32,6 +39,21 @@
 
     public MapElements(String key, Object value) {
         this.key = key;
-        this.value = value;
+        // this is required to handle marshalling raw json
+        // always write values as strings for XML
+        if (value != null) {
+            if (value instanceof List || value instanceof Map) {
+                try {
+                    this.value = new ObjectMapper().writeValueAsString(value);
+                } catch (JsonProcessingException e) {
+                    logger.warn("could not marshal value to json, calling toString");
+                    this.value = value.toString();
+                }
+            } else {
+                this.value = value;
+            }
+        } else {
+            this.value = value;
+        }
     }
 }
diff --git a/adapters/mso-adapters-rest-interface/src/test/java/org/onap/so/openstack/mappers/JAXBMarshallingTest.java b/adapters/mso-adapters-rest-interface/src/test/java/org/onap/so/openstack/mappers/JAXBMarshallingTest.java
index 8d27e54..189d4cc 100644
--- a/adapters/mso-adapters-rest-interface/src/test/java/org/onap/so/openstack/mappers/JAXBMarshallingTest.java
+++ b/adapters/mso-adapters-rest-interface/src/test/java/org/onap/so/openstack/mappers/JAXBMarshallingTest.java
@@ -24,17 +24,19 @@
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Paths;
+import java.util.Arrays;
 import javax.xml.bind.JAXBContext;
 import javax.xml.bind.JAXBException;
 import org.junit.Test;
 import org.onap.so.adapters.vnfrest.CreateVfModuleRequest;
+import com.fasterxml.jackson.databind.ObjectMapper;
 
 
 public class JAXBMarshallingTest {
 
 
     @Test
-    public void xmlMarshalTest() throws IOException, JAXBException {
+    public void xmlUnMarshalTest() throws IOException, JAXBException {
         JAXBContext context = JAXBContext.newInstance(CreateVfModuleRequest.class);
 
         CreateVfModuleRequest request = (CreateVfModuleRequest) context.createUnmarshaller().unmarshal(
@@ -43,6 +45,20 @@
         assertEquals("ubuntu-16-04-cloud-amd64", request.getVfModuleParams().get("vcpe_image_name"));
         assertEquals("10.2.0.0/24", request.getVfModuleParams().get("cpe_public_net_cidr"));
         assertEquals("", request.getVfModuleParams().get("workload_context"));
+        assertEquals("[\"a\",\"b\",\"c\"]", request.getVfModuleParams().get("raw-json-param"));
+    }
+
+    @Test
+    public void xmlMarshalTest() throws IOException, JAXBException {
+
+        CreateVfModuleRequest request = new CreateVfModuleRequest();
+        request.getVfModuleParams().put("test-null", null);
+        request.getVfModuleParams().put("test array", Arrays.asList("a", "b", "c"));
+
+        assertEquals("documents are equal",
+                new String(Files
+                        .readAllBytes(Paths.get("src/test/resources/VfRequest-marshalled-with-complex-object.xml"))),
+                request.toXmlString());
 
     }
 
diff --git a/adapters/mso-adapters-rest-interface/src/test/resources/VfRequest-marshalled-with-complex-object.xml b/adapters/mso-adapters-rest-interface/src/test/resources/VfRequest-marshalled-with-complex-object.xml
new file mode 100644
index 0000000..ce17512
--- /dev/null
+++ b/adapters/mso-adapters-rest-interface/src/test/resources/VfRequest-marshalled-with-complex-object.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<createVfModuleRequest>
+    <failIfExists>false</failIfExists>
+    <backout>true</backout>
+    <vfModuleParams>
+        <entry>
+            <key>test array</key>
+            <value xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xsi:type="xs:string">["a","b","c"]</value>
+        </entry>
+        <entry>
+            <key>test-null</key>
+        </entry>
+    </vfModuleParams>
+    <msoRequest/>
+</createVfModuleRequest>
diff --git a/adapters/mso-adapters-rest-interface/src/test/resources/createVfModuleRequest-with-params.xml b/adapters/mso-adapters-rest-interface/src/test/resources/createVfModuleRequest-with-params.xml
index 1ff24a5..2718f1d 100644
--- a/adapters/mso-adapters-rest-interface/src/test/resources/createVfModuleRequest-with-params.xml
+++ b/adapters/mso-adapters-rest-interface/src/test/resources/createVfModuleRequest-with-params.xml
@@ -1,4 +1,4 @@
-<createVfModuleRequest>
+  <createVfModuleRequest>
 	<cloudSiteId>RegionOne</cloudSiteId>
 	<cloudOwner>CloudOwner</cloudOwner>
 	<tenantId>09d8566ea45e43aa974cf447ed591d77</tenantId>
@@ -196,7 +196,10 @@
 			<key>vf_module_index</key>
 			<value>0</value>
 		</entry>
-
+        <entry>
+            <key>raw-json-param</key>
+            <value xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xsi:type="xs:string">["a","b","c"]</value>
+        </entry>
 	</vfModuleParams>
 	<msoRequest>
 		<requestId>11c8ec20-a1f8-4aa2-926f-e55d67a30f8b</requestId>
diff --git a/adapters/mso-catalog-db-adapter/src/main/resources/application.yaml b/adapters/mso-catalog-db-adapter/src/main/resources/application.yaml
index aa9317c..b1528a0 100644
--- a/adapters/mso-catalog-db-adapter/src/main/resources/application.yaml
+++ b/adapters/mso-catalog-db-adapter/src/main/resources/application.yaml
@@ -52,4 +52,4 @@
       prometheus:
         enabled: true # Whether exporting of metrics to Prometheus is enabled.
         step: 1m # Step size (i.e. reporting frequency) to use.
- 
\ No newline at end of file
+ 
diff --git a/adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/inventory/create/CreateInventoryTask.java b/adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/inventory/create/CreateInventoryTask.java
index 38dd908..b4cdcb4 100644
--- a/adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/inventory/create/CreateInventoryTask.java
+++ b/adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/inventory/create/CreateInventoryTask.java
@@ -20,7 +20,6 @@
 
 package org.onap.so.adapters.inventory.create;
 
-import java.io.IOException;
 import org.camunda.bpm.client.task.ExternalTask;
 import org.camunda.bpm.client.task.ExternalTaskService;
 import org.onap.logging.ref.slf4j.ONAPLogConstants;
@@ -47,17 +46,16 @@
     public Environment env;
 
     protected void executeExternalTask(ExternalTask externalTask, ExternalTaskService externalTaskService) {
+        setupMDC(externalTask);
         boolean success = true;
         String auditInventoryString = externalTask.getVariable("auditInventoryResult");
-        GraphInventoryCommonObjectMapperProvider objectMapper = new GraphInventoryCommonObjectMapperProvider();
         AAIObjectAuditList auditInventory = null;
         try {
+            GraphInventoryCommonObjectMapperProvider objectMapper = new GraphInventoryCommonObjectMapperProvider();
             auditInventory = objectMapper.getMapper().readValue(auditInventoryString, AAIObjectAuditList.class);
-        } catch (IOException e1) {
-            success = false;
+        } catch (Exception e) {
+            logger.error("Error Parsing Audit Results", e);
         }
-        setupMDC(externalTask);
-
         if (auditInventory != null) {
             try {
                 logger.info("Executing External Task Create Inventory, Retry Number: {} \n {}", auditInventory,
@@ -96,9 +94,13 @@
     }
 
     private void setupMDC(ExternalTask externalTask) {
-        String msoRequestId = (String) externalTask.getVariable("mso-request-id");
-        if (msoRequestId != null && !msoRequestId.isEmpty())
-            MDC.put(ONAPLogConstants.MDCs.REQUEST_ID, msoRequestId);
+        try {
+            String msoRequestId = (String) externalTask.getVariable("mso-request-id");
+            if (msoRequestId != null && !msoRequestId.isEmpty())
+                MDC.put(ONAPLogConstants.MDCs.REQUEST_ID, msoRequestId);
+        } catch (Exception e) {
+            logger.error("Error in setting up MDC", e);
+        }
     }
 
     protected long calculateRetryDelay(int currentRetries) {
diff --git a/adapters/mso-openstack-adapters/src/test/java/org/onap/so/adapters/inventory/create/CreateInventoryTaskTest.java b/adapters/mso-openstack-adapters/src/test/java/org/onap/so/adapters/inventory/create/CreateInventoryTaskTest.java
new file mode 100644
index 0000000..03622db
--- /dev/null
+++ b/adapters/mso-openstack-adapters/src/test/java/org/onap/so/adapters/inventory/create/CreateInventoryTaskTest.java
@@ -0,0 +1,36 @@
+package org.onap.so.adapters.inventory.create;
+
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.times;
+import org.camunda.bpm.client.task.ExternalTask;
+import org.camunda.bpm.client.task.ExternalTaskService;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+
+public class CreateInventoryTaskTest {
+
+    @Mock
+    ExternalTask externalTask;
+
+    @Mock
+    ExternalTaskService externalTaskService;
+
+    @InjectMocks
+    CreateInventoryTask inventoryTask;
+
+    @Before
+    public void setup() {
+        MockitoAnnotations.initMocks(this);
+    }
+
+    @Test
+    public void test_Runtime_Parse_Exception() {
+        doReturn(null).when(externalTask).getVariable("auditInventoryResult");
+        inventoryTask.executeExternalTask(externalTask, externalTaskService);
+        Mockito.verify(externalTaskService, times(1)).handleBpmnError(externalTask, "AAIInventoryFailure");
+    }
+}
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 87008f1..43eb277 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
@@ -91,7 +91,7 @@
         if (activitySpecActivitySpecCategories == null || activitySpecActivitySpecCategories.size() == 0) {
             return;
         }
-        List<String> categoryList = new ArrayList<String>();
+        List<String> categoryList = new ArrayList<>();
         for (ActivitySpecActivitySpecCategories activitySpecCat : activitySpecActivitySpecCategories) {
             if (activitySpecCat != null) {
                 if (activitySpecCat.getActivitySpecCategories() != null) {
@@ -107,8 +107,8 @@
         if (activitySpecActivitySpecParameters == null || activitySpecActivitySpecParameters.size() == 0) {
             return;
         }
-        List<Input> inputs = new ArrayList<Input>();
-        List<Output> outputs = new ArrayList<Output>();
+        List<Input> inputs = new ArrayList<>();
+        List<Output> outputs = new ArrayList<>();
         for (ActivitySpecActivitySpecParameters activitySpecParam : activitySpecActivitySpecParameters) {
             if (activitySpecParam != null) {
                 if (activitySpecParam.getActivitySpecParameters() != null) {
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 9b838c4..fc0197d 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
@@ -77,6 +77,8 @@
 
     protected static final Logger logger = LoggerFactory.getLogger(ASDCController.class);
 
+    private static final String UNKNOWN = "Unknown";
+
     protected boolean isAsdcClientAutoManaged = false;
 
     protected String controllerName;
@@ -110,6 +112,25 @@
     @Autowired
     DeployActivitySpecs deployActivitySpecs;
 
+    public ASDCController() {
+        this("");
+    }
+
+    public ASDCController(String controllerConfigName) {
+        isAsdcClientAutoManaged = true;
+        this.controllerName = controllerConfigName;
+    }
+
+    public ASDCController(String controllerConfigName, IDistributionClient asdcClient,
+            IVfResourceInstaller resourceinstaller) {
+        distributionClient = asdcClient;
+    }
+
+    public ASDCController(String controllerConfigName, IDistributionClient asdcClient) {
+        distributionClient = asdcClient;
+        this.controllerName = controllerConfigName;
+    }
+
     public int getNbOfNotificationsOngoing() {
         return nbOfNotificationsOngoing;
     }
@@ -150,25 +171,6 @@
         return this.controllerStatus;
     }
 
-    public ASDCController() {
-        this("");
-    }
-
-    public ASDCController(String controllerConfigName) {
-        isAsdcClientAutoManaged = true;
-        this.controllerName = controllerConfigName;
-    }
-
-    public ASDCController(String controllerConfigName, IDistributionClient asdcClient,
-            IVfResourceInstaller resourceinstaller) {
-        distributionClient = asdcClient;
-    }
-
-    public ASDCController(String controllerConfigName, IDistributionClient asdcClient) {
-        distributionClient = asdcClient;
-        this.controllerName = controllerConfigName;
-    }
-
     public String getControllerName() {
         return controllerName;
     }
@@ -356,7 +358,7 @@
         for (IArtifactInfo artifactInfo : resourceStructure.getResourceInstance().getArtifacts()) {
 
             if ((DistributionStatusEnum.DEPLOY_OK.equals(distribStatus)
-                    && !artifactInfo.getArtifactType().equalsIgnoreCase("OTHER")
+                    && !("OTHER").equalsIgnoreCase(artifactInfo.getArtifactType())
                     && !resourceStructure.isAlreadyDeployed())
                     // This could be NULL if the artifact is a VF module artifact, this won't be present in the MAP
                     && resourceStructure.getArtifactsMapByUUID().get(artifactInfo.getArtifactUUID()) != null
@@ -442,7 +444,7 @@
                 status.name(), artifactURL, "ASDC", "sendASDCNotification");
         logger.debug(event);
 
-        String action = "";
+
         try {
             IDistributionStatusMessage message =
                     new DistributionStatusMessage(artifactURL, consumerID, distributionID, status, timestamp);
@@ -454,7 +456,7 @@
                     } else {
                         this.distributionClient.sendDownloadStatus(message);
                     }
-                    action = "sendDownloadStatus";
+
                     break;
                 case DEPLOY:
                     if (errorReason != null) {
@@ -462,7 +464,7 @@
                     } else {
                         this.distributionClient.sendDeploymentStatus(message);
                     }
-                    action = "sendDeploymentdStatus";
+
                     break;
                 default:
                     break;
@@ -667,12 +669,12 @@
             String filePath =
                     msoConfigPath + "/ASDC/" + iArtifact.getArtifactVersion() + "/" + iArtifact.getArtifactName();
             File csarFile = new File(filePath);
-            String csarFilePath = csarFile.getAbsolutePath();
+
 
             for (IResourceInstance resource : iNotif.getResources()) {
 
                 String resourceType = resource.getResourceType();
-                String category = resource.getCategory();
+
 
                 logger.info("Processing Resource Type: {}, Model UUID: {}", resourceType, resource.getResourceUUID());
 
@@ -832,7 +834,7 @@
         }
     }
 
-    private static final String UNKNOWN = "Unknown";
+
 
     /**
      * @return the address of the ASDC we are connected to.
diff --git a/asdc-controller/src/main/java/org/onap/so/asdc/client/test/emulators/JsonVfModuleMetaData.java b/asdc-controller/src/main/java/org/onap/so/asdc/client/test/emulators/JsonVfModuleMetaData.java
index f4d3e5c..20cd980 100644
--- a/asdc-controller/src/main/java/org/onap/so/asdc/client/test/emulators/JsonVfModuleMetaData.java
+++ b/asdc-controller/src/main/java/org/onap/so/asdc/client/test/emulators/JsonVfModuleMetaData.java
@@ -33,16 +33,16 @@
     @JsonProperty("artifacts")
     private List<String> artifacts;
     @JsonProperty("properties")
-    // private List<Map<String, Object>> properties = new ArrayList<>();
+
     private Map<String, String> properties = new HashMap<>();
 
+    @JsonIgnore
+    private Map<String, Object> attributesMap = new HashMap<>();
+
     public Map<String, String> getProperties() {
         return properties;
     }
 
-    @JsonIgnore
-    private Map<String, Object> attributesMap = new HashMap<>();
-
     @Override
     public List<String> getArtifacts() {
         return artifacts;
diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/bbobjects/ServiceInstance.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/bbobjects/ServiceInstance.java
index 6c3a0c4..b9f5a6a 100644
--- a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/bbobjects/ServiceInstance.java
+++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/bbobjects/ServiceInstance.java
@@ -78,6 +78,8 @@
     private ModelInfoServiceInstance modelInfoServiceInstance;
     @JsonProperty("instance-groups")
     private List<InstanceGroup> instanceGroups = new ArrayList<>();
+    @JsonProperty("service-proxies")
+    private List<ServiceProxy> serviceProxies = new ArrayList<ServiceProxy>();
 
     public List<GenericVnf> getVnfs() {
         return vnfs;
@@ -211,6 +213,10 @@
         this.instanceGroups = instanceGroups;
     }
 
+    public List<ServiceProxy> getServiceProxies() {
+        return serviceProxies;
+    }
+
     @Override
     public boolean equals(final Object other) {
         if (!(other instanceof ServiceInstance)) {
diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/homingobjects/SolutionCandidates.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/homingobjects/SolutionCandidates.java
index db5c11a..4c91ad3 100644
--- a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/homingobjects/SolutionCandidates.java
+++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/homingobjects/SolutionCandidates.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.
@@ -34,7 +34,6 @@
     private List<Candidate> requiredCandidates = new ArrayList<Candidate>();
     @JsonProperty("excludedCandidates")
     private List<Candidate> excludedCandidates = new ArrayList<Candidate>();
-    // TODO figure out best way to do this
     @JsonProperty("existingCandidates")
     private List<Candidate> existingCandidates = new ArrayList<Candidate>();
 
diff --git a/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/bpmn/common/baseclient/BaseClientTest.java b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/bpmn/common/baseclient/BaseClientTest.java
index ee2c10c..05af5f7 100644
--- a/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/bpmn/common/baseclient/BaseClientTest.java
+++ b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/bpmn/common/baseclient/BaseClientTest.java
@@ -29,6 +29,7 @@
 import javax.ws.rs.core.UriBuilder;
 import org.junit.Test;
 import org.onap.so.BaseTest;
+import org.onap.so.client.BaseClient;
 import org.springframework.core.ParameterizedTypeReference;
 import wiremock.org.apache.http.entity.ContentType;
 
diff --git a/bpmn/MSOCoreBPMN/src/main/java/org/onap/so/bpmn/core/ResponseBuilder.java b/bpmn/MSOCoreBPMN/src/main/java/org/onap/so/bpmn/core/ResponseBuilder.java
index a3f5253..6f8d34e 100644
--- a/bpmn/MSOCoreBPMN/src/main/java/org/onap/so/bpmn/core/ResponseBuilder.java
+++ b/bpmn/MSOCoreBPMN/src/main/java/org/onap/so/bpmn/core/ResponseBuilder.java
@@ -40,6 +40,7 @@
  */
 public class ResponseBuilder implements java.io.Serializable {
     private static final long serialVersionUID = 1L;
+    private static final String WORKFLOWEXCEPTION = "WorkflowException";
     private static final Logger logger = LoggerFactory.getLogger(ResponseBuilder.class);
 
     /**
@@ -61,7 +62,7 @@
         logger.debug("processKey=" + processKey);
 
         // See if there"s already a WorkflowException object in the execution.
-        WorkflowException theException = (WorkflowException) execution.getVariable("WorkflowException");
+        WorkflowException theException = (WorkflowException) execution.getVariable(WORKFLOWEXCEPTION);
 
         if (theException != null) {
             logger.debug("Exited " + method + " - propagated " + theException);
@@ -138,7 +139,7 @@
             // Create a new WorkflowException object
 
             theException = new WorkflowException(processKey, intResponseCode, errorResponse);
-            execution.setVariable("WorkflowException", theException);
+            execution.setVariable(WORKFLOWEXCEPTION, theException);
             logger.debug("Exited " + method + " - created " + theException);
             return theException;
         }
@@ -163,7 +164,7 @@
 
         Object theResponse = null;
 
-        WorkflowException theException = (WorkflowException) execution.getVariable("WorkflowException");
+        WorkflowException theException = (WorkflowException) execution.getVariable(WORKFLOWEXCEPTION);
         String errorResponse = trimString(execution.getVariable(prefix + "ErrorResponse"), null);
         String responseCode = trimString(execution.getVariable(prefix + "ResponseCode"), null);
 
@@ -222,7 +223,7 @@
         }
 
         String s = String.valueOf(object).trim();
-        return s.equals("") ? emptyStringValue : s;
+        return "".equals(s) ? emptyStringValue : s;
     }
 
     /**
diff --git a/bpmn/MSOCoreBPMN/src/main/java/org/onap/so/bpmn/core/domain/AllottedResource.java b/bpmn/MSOCoreBPMN/src/main/java/org/onap/so/bpmn/core/domain/AllottedResource.java
index 841eaee..c37b77d 100644
--- a/bpmn/MSOCoreBPMN/src/main/java/org/onap/so/bpmn/core/domain/AllottedResource.java
+++ b/bpmn/MSOCoreBPMN/src/main/java/org/onap/so/bpmn/core/domain/AllottedResource.java
@@ -22,7 +22,6 @@
 
 import java.util.UUID;
 import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 import com.fasterxml.jackson.annotation.JsonRootName;
 
 /**
@@ -35,14 +34,6 @@
     private static final long serialVersionUID = 1L;
 
     /*
-     * set resourceType for this object
-     */
-    public AllottedResource() {
-        resourceType = ResourceType.ALLOTTED_RESOURCE;
-        setResourceId(UUID.randomUUID().toString());
-    }
-
-    /*
      * fields specific to Allotted Resource resource type
      */
     private String allottedResourceType;
@@ -60,6 +51,14 @@
     private String resourceInput;
 
     /*
+     * set resourceType for this object
+     */
+    public AllottedResource() {
+        resourceType = ResourceType.ALLOTTED_RESOURCE;
+        setResourceId(UUID.randomUUID().toString());
+    }
+
+    /*
      * GET and SET
      */
     public String getAllottedResourceType() {
diff --git a/bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/infrastructure/bpmn/subprocess/VNFStartActivityTest.java b/bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/infrastructure/bpmn/subprocess/VNFStartActivityTest.java
index a8e974d..2163e0b 100644
--- a/bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/infrastructure/bpmn/subprocess/VNFStartActivityTest.java
+++ b/bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/infrastructure/bpmn/subprocess/VNFStartActivityTest.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.
diff --git a/bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/infrastructure/bpmn/subprocess/VNFUnlockActivityTest.java b/bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/infrastructure/bpmn/subprocess/VNFUnlockActivityTest.java
index b6faf1b..c5ddd56 100644
--- a/bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/infrastructure/bpmn/subprocess/VNFUnlockActivityTest.java
+++ b/bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/infrastructure/bpmn/subprocess/VNFUnlockActivityTest.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.
diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/buildingblock/SniroHomingV2.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/buildingblock/SniroHomingV2.java
index 2f898b6..2b9729f 100644
--- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/buildingblock/SniroHomingV2.java
+++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/buildingblock/SniroHomingV2.java
@@ -334,6 +334,18 @@
                 }
             }
         }
+        List<ServiceProxy> serviceProxies = serviceInstance.getServiceProxies();
+        if (!serviceProxies.isEmpty()) {
+            logger.debug("Adding service proxies to placement demands list");
+            for (ServiceProxy sp : serviceProxies) {
+                if (isBlank(sp.getId())) {
+                    sp.setId(UUID.randomUUID().toString());
+                }
+                Demand demand = buildDemand(sp.getId(), sp.getModelInfoServiceProxy());
+                addCandidates(sp, demand);
+                placementDemands.add(demand);
+            }
+        }
         return placementDemands;
     }
 
@@ -400,6 +412,7 @@
     private void addCandidates(SolutionCandidates candidates, Demand demand) {
         List<Candidate> required = candidates.getRequiredCandidates();
         List<Candidate> excluded = candidates.getExcludedCandidates();
+        List<Candidate> existing = candidates.getExistingCandidates();
         if (!required.isEmpty()) {
             List<org.onap.so.client.sniro.beans.Candidate> cans =
                     new ArrayList<org.onap.so.client.sniro.beans.Candidate>();
@@ -424,7 +437,18 @@
             }
             demand.setExcludedCandidates(cans);
         }
-        // TODO support existing candidates
+        if (!existing.isEmpty()) {
+            List<org.onap.so.client.sniro.beans.Candidate> cans =
+                    new ArrayList<org.onap.so.client.sniro.beans.Candidate>();
+            for (Candidate c : existing) {
+                org.onap.so.client.sniro.beans.Candidate can = new org.onap.so.client.sniro.beans.Candidate();
+                can.setIdentifierType(c.getIdentifierType());
+                can.setIdentifiers(c.getIdentifiers());
+                can.setCloudOwner(c.getCloudOwner());
+                cans.add(can);
+            }
+            demand.setExistingCandidates(cans);
+        }
     }
 
     /**
@@ -462,6 +486,7 @@
         List<VpnBondingLink> links = serviceInstance.getVpnBondingLinks();
         List<AllottedResource> allottes = serviceInstance.getAllottedResources();
         List<GenericVnf> vnfs = serviceInstance.getVnfs();
+        List<ServiceProxy> serviceProxies = serviceInstance.getServiceProxies();
 
         logger.debug("Processing placement solution " + i + 1);
         for (int p = 0; p < placements.length(); p++) {
@@ -502,6 +527,12 @@
                         break search;
                     }
                 }
+                for (ServiceProxy proxy : serviceProxies) {
+                    if (placement.getString(SERVICE_RESOURCE_ID).equals(proxy.getId())) {
+                        proxy.setServiceInstance(setSolution(solutionInfo, placement));
+                        break search;
+                    }
+                }
             }
         }
     }
diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/oof/OofClient.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/oof/OofClient.java
index e31285f..e8a7fef 100644
--- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/oof/OofClient.java
+++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/oof/OofClient.java
@@ -22,8 +22,8 @@
 
 
 import org.camunda.bpm.engine.delegate.BpmnError;
-import org.onap.so.bpmn.common.baseclient.BaseClient;
 import org.onap.so.bpmn.core.UrnPropertiesReader;
+import org.onap.so.client.BaseClient;
 import org.onap.so.client.exception.BadResponseException;
 import org.onap.so.client.oof.beans.OofProperties;
 import org.onap.so.client.oof.beans.OofRequest;
diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sdnc/SDNCClient.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sdnc/SDNCClient.java
index b70caa1..2e7877f 100644
--- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sdnc/SDNCClient.java
+++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sdnc/SDNCClient.java
@@ -24,7 +24,7 @@
 
 import java.util.LinkedHashMap;
 import javax.ws.rs.core.UriBuilder;
-import org.onap.so.bpmn.common.baseclient.BaseClient;
+import org.onap.so.client.BaseClient;
 import org.onap.so.client.exception.BadResponseException;
 import org.onap.so.client.exception.MapperException;
 import org.onap.so.client.sdnc.beans.SDNCProperties;
diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sniro/SniroClient.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sniro/SniroClient.java
index f7aad55..21c0b97 100644
--- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sniro/SniroClient.java
+++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sniro/SniroClient.java
@@ -24,8 +24,8 @@
 
 import java.util.LinkedHashMap;
 import org.camunda.bpm.engine.delegate.BpmnError;
-import org.onap.so.bpmn.common.baseclient.BaseClient;
 import org.onap.so.bpmn.core.UrnPropertiesReader;
+import org.onap.so.client.BaseClient;
 import org.onap.so.client.exception.BadResponseException;
 import org.onap.so.client.sniro.beans.ManagerProperties;
 import org.onap.so.client.sniro.beans.SniroConductorRequest;
diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sniro/beans/Demand.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sniro/beans/Demand.java
index 19378cd..fe2b63f 100644
--- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sniro/beans/Demand.java
+++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sniro/beans/Demand.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.
@@ -38,6 +38,8 @@
     private List<Candidate> requiredCandidates;
     @JsonProperty("excludedCandidates")
     private List<Candidate> excludedCandidates;
+    @JsonProperty("existingCandidates")
+    private List<Candidate> existingCandidates;
 
 
     public List<Candidate> getRequiredCandidates() {
@@ -80,4 +82,12 @@
         this.modelInfo = modelInfo;
     }
 
+    public List<Candidate> getExistingCandidates() {
+        return existingCandidates;
+    }
+
+    public void setExistingCandidates(List<Candidate> existingCandidates) {
+        this.existingCandidates = existingCandidates;
+    }
+
 }
diff --git a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/SniroHomingV2IT.java b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/SniroHomingV2IT.java
index 8d51ceb..b5a8318 100644
--- a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/SniroHomingV2IT.java
+++ b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/SniroHomingV2IT.java
@@ -23,7 +23,7 @@
 import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
 import static com.github.tomakehurst.wiremock.client.WireMock.post;
 import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;
-import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.*;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.mockito.ArgumentMatchers.isA;
@@ -53,6 +53,7 @@
 import org.onap.so.client.sniro.beans.SniroManagerRequest;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import static com.shazam.shazamcrest.matcher.Matchers.sameBeanAs;
 
 public class SniroHomingV2IT extends BaseIntegrationTest {
 
@@ -107,6 +108,18 @@
         serviceInstance.getAllottedResources().add(setAllottedResource("3"));
     }
 
+    public void beforeServiceProxy() {
+        ServiceProxy sp = setServiceProxy("1", "infrastructure");
+        Candidate requiredCandidate = new Candidate();
+        requiredCandidate.setIdentifierType(CandidateType.CLOUD_REGION_ID);
+        List<String> c = new ArrayList<String>();
+        c.add("testCloudRegionId");
+        requiredCandidate.setCloudOwner("att");
+        requiredCandidate.setIdentifiers(c);
+        sp.addRequiredCandidates(requiredCandidate);
+        serviceInstance.getServiceProxies().add(sp);
+    }
+
     public void beforeVnf() {
         setGenericVnf();
     }
@@ -191,6 +204,23 @@
         verify(sniroClient, times(1)).postDemands(isA(SniroManagerRequest.class));
     }
 
+    @Test
+    public void testCallSniro_success_1ServiceProxy() throws JsonProcessingException, BadResponseException {
+        beforeServiceProxy();
+
+        wireMockServer.stubFor(post(urlEqualTo("/sniro/api/placement/v2")).willReturn(
+                aResponse().withStatus(200).withHeader("Content-Type", "application/json").withBody(mockResponse)));
+
+        sniroHoming.callSniro(execution);
+
+        String request = readResourceFile(RESOURCE_PATH + "SniroManagerRequest1SP.json");
+        request = request.replace("28080", wireMockPort);
+
+        ArgumentCaptor<SniroManagerRequest> argument = ArgumentCaptor.forClass(SniroManagerRequest.class);
+        verify(sniroClient, times(1)).postDemands(argument.capture());
+        assertEquals(request, argument.getValue().toJsonString());
+    }
+
     @Test(expected = Test.None.class)
     public void testProcessSolution_success_1VpnLink_1Solution() {
         beforeVpnBondingLink("1");
@@ -563,10 +593,57 @@
         assertEquals(2, vnf.getLicense().getLicenseKeyGroupUuids().size());
         assertEquals("f1d563e8-e714-4393-8f99-cc480144a05e", vnf.getLicense().getEntitlementPoolUuids().get(0));
         assertEquals("s1d563e8-e714-4393-8f99-cc480144a05e", vnf.getLicense().getLicenseKeyGroupUuids().get(0));
-
-
     }
 
+    @Test
+    public void testProcessSolution_success_1ServiceProxy_1Solutions() {
+        beforeServiceProxy();
+
+        JSONObject asyncResponse = new JSONObject();
+        asyncResponse.put("transactionId", "testRequestId").put("requestId", "testRequestId").put("requestState",
+                "completed");
+        JSONArray solution1 = new JSONArray();
+        solution1
+                .put(new JSONObject()
+                        .put("serviceResourceId", "testProxyId1").put(
+                                "solution",
+                                new JSONObject()
+                                        .put("identifierType", "serviceInstanceId")
+                                        .put("identifiers", new JSONArray().put("testServiceInstanceId1")))
+                        .put("assignmentInfo",
+                                new JSONArray().put(new JSONObject().put("key", "isRehome").put("value", "False"))
+                                        .put(new JSONObject().put("key", "cloudOwner").put("value", ""))
+                                        .put(new JSONObject().put("key", "aicClli").put("value", "testAicClli1"))
+                                        .put(new JSONObject().put("key", "aicVersion").put("value", "3"))
+                                        .put(new JSONObject().put("key", "cloudRegionId").put("value", ""))
+                                        .put(new JSONObject().put("key", "primaryPnfName").put("value",
+                                                "testPrimaryPnfName"))
+                                        .put(new JSONObject().put("key", "secondaryPnfName").put("value",
+                                                "testSecondaryPnfName"))));
+
+        asyncResponse.put("solutions", new JSONObject().put("placementSolutions", new JSONArray().put(solution1))
+                .put("licenseSolutions", new JSONArray()));
+
+        sniroHoming.processSolution(execution, asyncResponse.toString());
+
+        ServiceInstance si =
+                execution.getGeneralBuildingBlock().getCustomer().getServiceSubscription().getServiceInstances().get(0);
+
+        ServiceProxy sp = si.getServiceProxies().get(0);
+        assertNotNull(sp);
+        assertNotNull(sp.getServiceInstance());
+
+        assertEquals("testServiceInstanceId1", sp.getServiceInstance().getServiceInstanceId());
+        assertNotNull(sp.getServiceInstance().getSolutionInfo());
+
+        assertFalse(sp.getServiceInstance().getPnfs().isEmpty());
+        assertEquals("testPrimaryPnfName", sp.getServiceInstance().getPnfs().get(0).getPnfName());
+        assertEquals("primary", sp.getServiceInstance().getPnfs().get(0).getRole());
+        assertEquals("testSecondaryPnfName", sp.getServiceInstance().getPnfs().get(1).getPnfName());
+        assertEquals("secondary", sp.getServiceInstance().getPnfs().get(1).getRole());
+    }
+
+
     @Test(expected = BpmnError.class)
     public void testCallSniro_error_0Resources() throws BadResponseException, JsonProcessingException {
 
diff --git a/bpmn/so-bpmn-tasks/src/test/resources/__files/BuildingBlocks/SniroHoming/SniroManagerRequest1SP.json b/bpmn/so-bpmn-tasks/src/test/resources/__files/BuildingBlocks/SniroHoming/SniroManagerRequest1SP.json
new file mode 100644
index 0000000..2746335
--- /dev/null
+++ b/bpmn/so-bpmn-tasks/src/test/resources/__files/BuildingBlocks/SniroHoming/SniroManagerRequest1SP.json
@@ -0,0 +1,46 @@
+{
+  "requestInfo" : {
+    "transactionId" : "testRequestId",
+    "requestId" : "testRequestId",
+    "callbackUrl" : "http://localhost:28080/mso/WorkflowMesssage/SNIROResponse/testRequestId",
+    "sourceId" : "mso",
+    "requestType" : "create",
+    "timeout" : 1800
+  },
+  "serviceInfo" : {
+    "modelInfo" : {
+      "modelName" : "testModelName1",
+      "modelVersionId" : "testModelUUID1",
+      "modelVersion" : "testModelVersion1",
+      "modelInvariantId" : "testModelInvariantUUID1"
+    },
+    "serviceRole" : "testServiceRole1",
+    "serviceInstanceId" : "testServiceInstanceId1",
+    "serviceName" : "testServiceType1"
+  },
+  "placementInfo" : {
+    "subscriberInfo" : {
+      "globalSubscriberId" : "testCustomerId",
+      "subscriberName" : "testCustomerName"
+    },
+    "placementDemands" : [ {
+      "serviceResourceId" : "testProxyId1",
+      "resourceModuleName" : "testProxyInstanceName1",
+      "resourceModelInfo" : {
+        "modelName" : "testProxyModelName1",
+        "modelVersionId" : "testProxyModelUuid1",
+        "modelVersion" : "testProxyModelVersion1",
+        "modelInvariantId" : "testProxyModelInvariantUuid1"
+      },
+      "requiredCandidates" : [ {
+        "identifierType" : "cloudRegionId",
+        "identifiers" : [ "testCloudRegionId" ],
+        "cloudOwner" : "att"
+      } ]
+    } ],
+    "requestParameters" : {"subscriptionServiceType":"testSubscriptionServiceType","aLaCarte":false}
+  },
+  "licenseInfo" : {
+    "licenseDemands" : [ ]
+  }
+}
\ No newline at end of file
diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/baseclient/BaseClient.java b/common/src/main/java/org/onap/so/client/BaseClient.java
similarity index 97%
rename from bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/baseclient/BaseClient.java
rename to common/src/main/java/org/onap/so/client/BaseClient.java
index 73047cf..d939a33 100644
--- a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/baseclient/BaseClient.java
+++ b/common/src/main/java/org/onap/so/client/BaseClient.java
@@ -18,7 +18,7 @@
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.so.bpmn.common.baseclient;
+package org.onap.so.client;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -34,7 +34,6 @@
 import org.springframework.web.client.RestClientException;
 import org.springframework.web.client.RestTemplate;
 
-// TODO move to common location
 public class BaseClient<I, O> {
 
     private HttpHeaders httpHeader;
diff --git a/docs/Developer_Info.rst b/docs/Developer_Info.rst
index 59dc9d6..46c114f 100644
--- a/docs/Developer_Info.rst
+++ b/docs/Developer_Info.rst
@@ -10,5 +10,5 @@
 

    Install_Configure_SO.rst

    architecture.rst

-   FAQs.rst

+

    
\ No newline at end of file
diff --git a/docs/architecture/SO Internal Arc.pptx b/docs/architecture/SO Internal Arc.pptx
index bff3e35..ee4b112 100644
--- a/docs/architecture/SO Internal Arc.pptx
+++ b/docs/architecture/SO Internal Arc.pptx
Binary files differ
diff --git a/docs/developer_info/developer_information.rst b/docs/developer_info/developer_information.rst
index f6d66b9..bae1e2e 100644
--- a/docs/developer_info/developer_information.rst
+++ b/docs/developer_info/developer_information.rst
@@ -13,6 +13,7 @@
    Working_with_SO_Docker.rst
    Camunda_Cockpit_Community_Edition.rst
    Camunda_Cockpit_Enterprise_Edition.rst
+   FAQs.rst
 .. developer_info_Project_Structure.rst
 .. developer_info_Main_Process_Flows.rst
 .. developer_info_Subprocess_Process_Flows.rst
diff --git a/docs/images/SO_1.png b/docs/images/SO_1.png
index 7158013..5bdc146 100644
--- a/docs/images/SO_1.png
+++ b/docs/images/SO_1.png
Binary files differ
diff --git a/docs/index.rst b/docs/index.rst
index ebb8b0b..fd5f124 100644
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -12,4 +12,4 @@
    architecture/architecture.rst

    api/offered_consumed_apis.rst

    developer_info/developer_information.rst

-   release_notes/release-notes.rst
\ No newline at end of file
+   release-notes.rst
\ No newline at end of file