Merge "Update AAI Client pom and Add Service Profile"
diff --git a/adapters/mso-catalog-db-adapter/src/main/java/org/onap/so/adapters/catalogdb/catalogrest/QueryServiceInfo.java b/adapters/mso-catalog-db-adapter/src/main/java/org/onap/so/adapters/catalogdb/catalogrest/QueryServiceInfo.java
index b191165..6c1c81c 100644
--- a/adapters/mso-catalog-db-adapter/src/main/java/org/onap/so/adapters/catalogdb/catalogrest/QueryServiceInfo.java
+++ b/adapters/mso-catalog-db-adapter/src/main/java/org/onap/so/adapters/catalogdb/catalogrest/QueryServiceInfo.java
@@ -65,6 +65,9 @@
 
     @Override
     public String JSON2(boolean isArray, boolean isEmbed) {
+        if (serviceInfo == null) {
+            return "\"serviceInfo\": null";
+        }
         StringBuilder sb = new StringBuilder();
         sb.append("\"serviceInfo\": ");
         sb.append("\n");
@@ -73,8 +76,8 @@
         put(valueMap, "ID", null == serviceInfo ? null : serviceInfo.getId());
         put(valueMap, "SERVICE_INPUT", null == serviceInfo ? null : serviceInfo.getServiceInput());
         put(valueMap, "SERVICE_PROPERTIES", null == serviceInfo ? null : serviceInfo.getServiceProperties());
-        // String subitem = new QueryServiceArtifact(service.getServiceArtifactList()).JSON2(true, true);
-        // valueMap.put("_SERVICEARTIFACT_", subitem.replaceAll("(?m)^", "\t\t"));m
+        String subitem = new QueryServiceArtifact(service.getServiceArtifactList()).JSON2(true, true);
+        valueMap.put("_SERVICEARTIFACT_", subitem.replaceAll("(?m)^", "\t\t"));
         sb.append(this.setTemplate(TEMPLATE, valueMap));
         sb.append("}");
         return sb.toString();
diff --git a/adapters/mso-catalog-db-adapter/src/main/java/org/onap/so/adapters/catalogdb/catalogrest/QueryServiceMacroHolder.java b/adapters/mso-catalog-db-adapter/src/main/java/org/onap/so/adapters/catalogdb/catalogrest/QueryServiceMacroHolder.java
index 0eb7d04..d5aa472 100644
--- a/adapters/mso-catalog-db-adapter/src/main/java/org/onap/so/adapters/catalogdb/catalogrest/QueryServiceMacroHolder.java
+++ b/adapters/mso-catalog-db-adapter/src/main/java/org/onap/so/adapters/catalogdb/catalogrest/QueryServiceMacroHolder.java
@@ -40,7 +40,7 @@
             + "\t\"serviceType\"        : <SERVICE_TYPE>,\n" + "\t\"serviceRole\"        : <SERVICE_ROLE>,\n"
             + "\t\"environmentContext\" : <ENVIRONMENT_CONTEXT>,\n" + "\t\"resourceOrder\"      : <RESOURCE_ORDER>,\n"
             + "\t\"workloadContext\"    : <WORKLOAD_CONTEXT>,\n" + "<_SERVICEVNFS_>,\n" + "<_SERVICENETWORKS_>,\n"
-            + "<_SERVICEALLOTTEDRESOURCES_>\n" + "\t}}";
+            + "<_SERVICEINFO_>,\n" + "<_SERVICEPROXY_>,\n" + "<_SERVICEALLOTTEDRESOURCES_>\n" + "\t}}";
 
     public QueryServiceMacroHolder() {
         super();
@@ -94,6 +94,12 @@
         subitem = new QueryAllottedResourceCustomization(service.getAllottedCustomizations()).JSON2(true, true);
         valueMap.put("_SERVICEALLOTTEDRESOURCES_", subitem.replaceAll(LINE_BEGINNING, "\t"));
 
+        subitem = new QueryServiceInfo(serviceMacroHolder.getServiceInfo()).JSON2(true, true);
+        valueMap.put("_SERVICEINFO_", subitem.replaceAll(LINE_BEGINNING, "\t"));
+
+        subitem = new QueryServiceProxyCustomization(service.getServiceProxyCustomizations()).JSON2(true, true);
+        valueMap.put("_SERVICEPROXY_", subitem.replaceAll(LINE_BEGINNING, "\t"));
+
         buf.append(this.setTemplate(TEMPLATE, valueMap));
         return buf.toString();
     }
diff --git a/adapters/mso-catalog-db-adapter/src/main/java/org/onap/so/adapters/catalogdb/catalogrest/QueryServiceProxyCustomization.java b/adapters/mso-catalog-db-adapter/src/main/java/org/onap/so/adapters/catalogdb/catalogrest/QueryServiceProxyCustomization.java
new file mode 100644
index 0000000..94cf304
--- /dev/null
+++ b/adapters/mso-catalog-db-adapter/src/main/java/org/onap/so/adapters/catalogdb/catalogrest/QueryServiceProxyCustomization.java
@@ -0,0 +1,124 @@
+/*-
+ * ============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.adapters.catalogdb.catalogrest;
+
+import org.onap.so.db.catalog.beans.ServiceProxyResourceCustomization;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import javax.xml.bind.annotation.XmlRootElement;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@XmlRootElement(name = "serviceProxyCustomizations")
+public class QueryServiceProxyCustomization extends CatalogQuery {
+
+    protected static Logger logger = LoggerFactory.getLogger(QueryServiceProxyCustomization.class);
+
+    private List<ServiceProxyResourceCustomization> serviceProxyResourceCustomizationList;
+
+    private static final String TEMPLATE =
+            "\t{\n" + "\t\t\"modelInfo\"                : {\n" + "\t\t\t\"modelName\"              : <MODEL_NAME>,\n"
+                    + "\t\t\t\"modelUuid\"              : <MODEL_UUID>,\n"
+                    + "\t\t\t\"modelInvariantUuid\"     : <MODEL_INVARIANT_UUID>,\n"
+                    + "\t\t\t\"modelVersion\"           : <MODEL_VERSION>,\n"
+                    + "\t\t\t\"modelCustomizationUuid\" : <MODEL_CUSTOMIZATION_UUID>,\n"
+                    + "\t\t\t\"modelInstanceName\"      : <MODEL_INSTANCE_NAME>\n" + "\t},\n"
+                    + "\t\t\"toscaNodeType\"            : <TOSCA_NODE_TYPE>,\n"
+                    + "\t\t\"description\"            : <DESCRIPTION>,\n"
+                    + "\t\t\"sourceModelUuid\"            : <SOURCE_SERVICE_MODEL_UUID>\n" + "\t}";
+
+    public QueryServiceProxyCustomization() {
+        super();
+        this.serviceProxyResourceCustomizationList = new ArrayList<>();
+    }
+
+    public QueryServiceProxyCustomization(
+            List<ServiceProxyResourceCustomization> serviceProxyResourceCustomizationList) {
+        this.serviceProxyResourceCustomizationList = serviceProxyResourceCustomizationList;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+
+        boolean first = true;
+        int i = 1;
+        for (ServiceProxyResourceCustomization o : serviceProxyResourceCustomizationList) {
+            sb.append(i).append("\t");
+            if (!first)
+                sb.append("\n");
+
+            first = false;
+            sb.append(o);
+        }
+        return sb.toString();
+    }
+
+    @Override
+    public String JSON2(boolean isArray, boolean isEmbed) {
+        StringBuilder sb = new StringBuilder();
+        if (!isEmbed && isArray)
+            sb.append("{ ");
+        if (isArray)
+            sb.append("\"serviceProxy\": [");
+        Map<String, String> valueMap = new HashMap<>();
+        String sep = "";
+        boolean first = true;
+
+        if (this.serviceProxyResourceCustomizationList != null) {
+            for (ServiceProxyResourceCustomization o : serviceProxyResourceCustomizationList) {
+                if (first)
+                    sb.append("\n");
+
+                first = false;
+
+                boolean arNull = o == null;
+
+                put(valueMap, "MODEL_CUSTOMIZATION_UUID", arNull ? null : o.getModelCustomizationUUID());
+                put(valueMap, "MODEL_INSTANCE_NAME", arNull ? null : o.getModelInstanceName());
+                put(valueMap, "MODEL_UUID", arNull ? null : o.getModelUUID());
+                put(valueMap, "MODEL_INVARIANT_UUID", arNull ? null : o.getModelInvariantUUID());
+                put(valueMap, "MODEL_VERSION", arNull ? null : o.getModelVersion());
+                put(valueMap, "MODEL_NAME", arNull ? null : o.getModelName());
+                put(valueMap, "TOSCA_NODE_TYPE", arNull ? null : o.getToscaNodeType());
+                put(valueMap, "DESCRIPTION", arNull ? null : o.getDescription());
+                put(valueMap, "SOURCE_SERVICE_MODEL_UUID", (String) (arNull ? null
+                        : o.getSourceService() == null ? null : o.getSourceService().getModelUUID()));
+
+                sb.append(sep).append(this.setTemplate(TEMPLATE, valueMap));
+                sep = ",\n";
+            }
+        }
+        if (!first)
+            sb.append("\n");
+
+        if (isArray)
+            sb.append("]");
+
+        if (!isEmbed && isArray)
+            sb.append("}");
+
+        return sb.toString();
+    }
+
+}
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 c9d4f4d..e084cfe 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
@@ -39,6 +39,9 @@
 import java.nio.file.Paths;
 import java.util.List;
 import java.util.Optional;
+import org.onap.sdc.tosca.parser.impl.SdcPropertyNames;
+import org.onap.sdc.toscaparser.api.elements.Metadata;
+import org.onap.so.asdc.util.ZipParser;
 import org.onap.so.logger.LoggingAnchor;
 import org.onap.logging.ref.slf4j.ONAPLogConstants;
 import org.onap.sdc.api.IDistributionClient;
@@ -737,6 +740,7 @@
 
     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;
@@ -748,8 +752,8 @@
             if (isCsarAlreadyDeployed(iNotif, toscaResourceStructure)) {
                 return;
             }
-
-            ResourceStructure resourceStructure = null;
+            // process NsstResource
+            this.processNsstNotification(iNotif, toscaResourceStructure);
             for (IResourceInstance resource : iNotif.getResources()) {
 
                 String resourceType = resource.getResourceType();
@@ -914,6 +918,23 @@
                             "processCsarServiceArtifacts", ErrorCode.BusinessProcessError.getValue(),
                             "Exception in processCsarServiceArtifacts", e);
                 }
+            } else if (artifact.getArtifactType().equals(ASDCConfiguration.OTHER)) {
+                try {
+                    IDistributionClientDownloadResult resultArtifact =
+                            this.downloadTheArtifact(artifact, iNotif.getDistributionID());
+
+                    writeArtifactToFile(artifact, resultArtifact);
+
+                    toscaResourceStructure.setToscaArtifact(artifact);
+
+                    toscaResourceStructure.setServiceVersion(iNotif.getServiceVersion());
+
+                } catch (ASDCDownloadException e) {
+                    logger.error(LoggingAnchor.SIX, MessageEnum.ASDC_GENERAL_EXCEPTION_ARG.toString(),
+                            "Exception caught during processCsarServiceArtifacts", "ASDC",
+                            "processCsarServiceArtifacts", ErrorCode.BusinessProcessError.getValue(),
+                            "Exception in processCsarServiceArtifacts", e);
+                }
             }
 
 
@@ -940,4 +961,38 @@
         }
         return UNKNOWN;
     }
+
+    private void processNsstNotification(INotificationData iNotif, ToscaResourceStructure toscaResourceStructure) {
+        Metadata serviceMetadata = toscaResourceStructure.getServiceMetadata();
+        try {
+            if (serviceMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_CATEGORY).equalsIgnoreCase("NSST")) {
+
+                String artifactContent = null;
+                List<IArtifactInfo> serviceArtifacts = iNotif.getServiceArtifacts();
+                Optional<IArtifactInfo> artifactOpt = serviceArtifacts.stream()
+                        .filter(e -> e.getArtifactType().equalsIgnoreCase("OTHER")).findFirst();
+                if (artifactOpt.isPresent()) {
+                    IArtifactInfo artifactInfo = artifactOpt.get();
+                    logger.debug("Ready to parse this serviceArtifactUUID:  " + artifactInfo.getArtifactUUID());
+                    String filePath = Paths.get(getMsoConfigPath(), "ASDC", artifactInfo.getArtifactVersion(),
+                            artifactInfo.getArtifactName()).normalize().toString();
+                    ZipParser zipParserInstance = ZipParser.getInstance();
+                    artifactContent = zipParserInstance.parseJsonForZip(filePath);
+                    logger.debug(
+                            "serviceArtifact parsing success! serviceArtifactUUID: " + artifactInfo.getArtifactUUID());
+                } else {
+                    logger.debug("serviceArtifact is null");
+                }
+                ResourceStructure resourceStructure = new VfResourceStructure(iNotif, new ResourceInstance());
+                resourceStructure.setResourceType(ResourceType.OTHER);
+                toscaInstaller.installTheNsstService(toscaResourceStructure, (VfResourceStructure) resourceStructure,
+                        artifactContent);
+            }
+        } catch (IOException e) {
+            logger.error("serviceArtifact parse failure for service uuid:  "
+                    + serviceMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_CATEGORY));
+        } catch (Exception e) {
+            logger.error("error NSST process resource failure ", e);
+        }
+    }
 }
diff --git a/asdc-controller/src/main/java/org/onap/so/asdc/installer/heat/ToscaResourceInstaller.java b/asdc-controller/src/main/java/org/onap/so/asdc/installer/heat/ToscaResourceInstaller.java
index 263118d..3175839 100644
--- a/asdc-controller/src/main/java/org/onap/so/asdc/installer/heat/ToscaResourceInstaller.java
+++ b/asdc-controller/src/main/java/org/onap/so/asdc/installer/heat/ToscaResourceInstaller.java
@@ -54,6 +54,7 @@
 import org.onap.sdc.tosca.parser.enums.SdcTypes;
 import org.onap.sdc.tosca.parser.impl.SdcPropertyNames;
 import org.onap.sdc.toscaparser.api.CapabilityAssignment;
+import org.onap.sdc.toscaparser.api.NodeTemplate;
 import org.onap.sdc.toscaparser.api.Property;
 import org.onap.sdc.toscaparser.api.RequirementAssignment;
 import org.onap.sdc.toscaparser.api.elements.Metadata;
@@ -74,64 +75,8 @@
 import org.onap.so.asdc.installer.VfResourceStructure;
 import org.onap.so.asdc.installer.bpmn.WorkflowResource;
 import org.onap.so.asdc.util.YamlEditor;
-import org.onap.so.db.catalog.beans.AllottedResource;
-import org.onap.so.db.catalog.beans.AllottedResourceCustomization;
-import org.onap.so.db.catalog.beans.CollectionNetworkResourceCustomization;
-import org.onap.so.db.catalog.beans.CollectionResource;
-import org.onap.so.db.catalog.beans.CollectionResourceInstanceGroupCustomization;
-import org.onap.so.db.catalog.beans.ConfigurationResource;
-import org.onap.so.db.catalog.beans.ConfigurationResourceCustomization;
-import org.onap.so.db.catalog.beans.CvnfcConfigurationCustomization;
-import org.onap.so.db.catalog.beans.CvnfcCustomization;
-import org.onap.so.db.catalog.beans.HeatEnvironment;
-import org.onap.so.db.catalog.beans.HeatFiles;
-import org.onap.so.db.catalog.beans.HeatTemplate;
-import org.onap.so.db.catalog.beans.HeatTemplateParam;
-import org.onap.so.db.catalog.beans.InstanceGroup;
-import org.onap.so.db.catalog.beans.InstanceGroupType;
-import org.onap.so.db.catalog.beans.NetworkCollectionResourceCustomization;
-import org.onap.so.db.catalog.beans.NetworkInstanceGroup;
-import org.onap.so.db.catalog.beans.NetworkResource;
-import org.onap.so.db.catalog.beans.NetworkResourceCustomization;
-import org.onap.so.db.catalog.beans.PnfResource;
-import org.onap.so.db.catalog.beans.PnfResourceCustomization;
-import org.onap.so.db.catalog.beans.Service;
-import org.onap.so.db.catalog.beans.ServiceProxyResourceCustomization;
-import org.onap.so.db.catalog.beans.SubType;
-import org.onap.so.db.catalog.beans.TempNetworkHeatTemplateLookup;
-import org.onap.so.db.catalog.beans.ToscaCsar;
-import org.onap.so.db.catalog.beans.VFCInstanceGroup;
-import org.onap.so.db.catalog.beans.VfModule;
-import org.onap.so.db.catalog.beans.VfModuleCustomization;
-import org.onap.so.db.catalog.beans.VnfResource;
-import org.onap.so.db.catalog.beans.VnfResourceCustomization;
-import org.onap.so.db.catalog.beans.VnfcCustomization;
-import org.onap.so.db.catalog.beans.VnfcInstanceGroupCustomization;
-import org.onap.so.db.catalog.data.repository.AllottedResourceCustomizationRepository;
-import org.onap.so.db.catalog.data.repository.AllottedResourceRepository;
-import org.onap.so.db.catalog.data.repository.CollectionResourceCustomizationRepository;
-import org.onap.so.db.catalog.data.repository.CollectionResourceRepository;
-import org.onap.so.db.catalog.data.repository.ConfigurationResourceCustomizationRepository;
-import org.onap.so.db.catalog.data.repository.ConfigurationResourceRepository;
-import org.onap.so.db.catalog.data.repository.CvnfcCustomizationRepository;
-import org.onap.so.db.catalog.data.repository.ExternalServiceToInternalServiceRepository;
-import org.onap.so.db.catalog.data.repository.HeatEnvironmentRepository;
-import org.onap.so.db.catalog.data.repository.HeatFilesRepository;
-import org.onap.so.db.catalog.data.repository.HeatTemplateRepository;
-import org.onap.so.db.catalog.data.repository.InstanceGroupRepository;
-import org.onap.so.db.catalog.data.repository.NetworkResourceCustomizationRepository;
-import org.onap.so.db.catalog.data.repository.NetworkResourceRepository;
-import org.onap.so.db.catalog.data.repository.PnfCustomizationRepository;
-import org.onap.so.db.catalog.data.repository.PnfResourceRepository;
-import org.onap.so.db.catalog.data.repository.ServiceProxyResourceCustomizationRepository;
-import org.onap.so.db.catalog.data.repository.ServiceRepository;
-import org.onap.so.db.catalog.data.repository.TempNetworkHeatTemplateRepository;
-import org.onap.so.db.catalog.data.repository.ToscaCsarRepository;
-import org.onap.so.db.catalog.data.repository.VFModuleCustomizationRepository;
-import org.onap.so.db.catalog.data.repository.VFModuleRepository;
-import org.onap.so.db.catalog.data.repository.VnfResourceRepository;
-import org.onap.so.db.catalog.data.repository.VnfcCustomizationRepository;
-import org.onap.so.db.catalog.data.repository.VnfcInstanceGroupCustomizationRepository;
+import org.onap.so.db.catalog.beans.*;
+import org.onap.so.db.catalog.data.repository.*;
 import org.onap.so.db.request.beans.WatchdogComponentDistributionStatus;
 import org.onap.so.db.request.beans.WatchdogDistributionStatus;
 import org.onap.so.db.request.beans.WatchdogServiceModVerIdLookup;
@@ -271,6 +216,9 @@
     protected PnfCustomizationRepository pnfCustomizationRepository;
 
     @Autowired
+    protected ServiceInfoRepository serviceInfoRepository;
+
+    @Autowired
     protected WorkflowResource workflowResource;
 
     @Autowired
@@ -445,6 +393,7 @@
             createToscaCsar(toscaResourceStruct);
             createService(toscaResourceStruct, vfResourceStruct);
             Service service = toscaResourceStruct.getCatalogService();
+            ServiceInfo serviceInfo = createServiceInfo(toscaResourceStruct, service);
 
             List<IEntityDetails> vfEntityList = getEntityDetails(toscaResourceStruct,
                     EntityQuery.newBuilder(SdcTypes.VF), TopologyTemplateQuery.newBuilder(SdcTypes.SERVICE), false);
@@ -474,8 +423,9 @@
             processServiceProxyAndConfiguration(toscaResourceStruct, service);
 
             logger.info("Saving Service: {} ", service.getModelName());
-            service = serviceRepo.save(service);
-            correlateConfigCustomResources(service);
+            ServiceInfo serviceResult = serviceInfoRepository.save(serviceInfo);
+            Service resultService = serviceResult.getService();
+            correlateConfigCustomResources(resultService);
 
             workflowResource.processWorkflows(vfResourceStructure);
 
@@ -2912,5 +2862,122 @@
         return new Timestamp(new Date().getTime());
     }
 
+    private String getServiceInput(ToscaResourceStructure toscaResourceStructure) {
+        String serviceInput = null;
+
+        List<Object> serviceInputList;
+        ISdcCsarHelper sdcCsarHelper = toscaResourceStructure.getSdcCsarHelper();
+        List<Input> serviceInputs = sdcCsarHelper.getServiceInputs();
+        if (!serviceInputs.isEmpty()) {
+            serviceInputList = new ArrayList<>();
+            serviceInputs.forEach(input -> {
+                Map<String, Object> serviceInputMap = new HashMap<>();
+                serviceInputMap.put("name", input.getName());
+                serviceInputMap.put("type", input.getType());
+                serviceInputMap.put("default", input.getDefault() == null ? "" : input.getDefault());
+                serviceInputMap.put("required", input.isRequired());
+                serviceInputList.add(serviceInputMap);
+
+            });
+            ObjectMapper objectMapper = new ObjectMapper();
+            try {
+                serviceInput = objectMapper.writeValueAsString(serviceInputList);
+                serviceInput = serviceInput.replace("\"", "\\\"");
+            } catch (JsonProcessingException e) {
+                logger.error("service input could not be deserialized for service uuid:  "
+                        + sdcCsarHelper.getServiceMetadata().getValue(SdcPropertyNames.PROPERTY_NAME_UUID));
+            }
+        } else {
+            logger.debug("serviceInput is null");
+        }
+        return serviceInput;
+    }
+
+    @Transactional(rollbackFor = {ArtifactInstallerException.class})
+    public void installTheNsstService(ToscaResourceStructure toscaResourceStruct, VfResourceStructure vfResourceStruct,
+            String artifactContent) {
+        createToscaCsar(toscaResourceStruct);
+        createService(toscaResourceStruct, vfResourceStruct);
+        Service service = toscaResourceStruct.getCatalogService();
+        ServiceInfo serviceInfo = createServiceInfo(toscaResourceStruct, service);
+        createServiceArtifact(service, vfResourceStruct, artifactContent);
+        serviceInfoRepository.save(serviceInfo);
+    }
+
+    private void createServiceArtifact(Service service, VfResourceStructure vfResourceStruct, String artifactContent) {
+        List<ServiceArtifact> serviceArtifactList = new ArrayList<>();
+        ServiceArtifact serviceArtifact;
+        List<IArtifactInfo> artifactInfoList = vfResourceStruct.getNotification().getServiceArtifacts().stream()
+                .filter(artifact -> artifact.getArtifactType().equalsIgnoreCase("OTHER")).collect(Collectors.toList());
+        for (IArtifactInfo artifactInfo : artifactInfoList) {
+            serviceArtifact = new ServiceArtifact();
+            serviceArtifact.setArtifactUUID(artifactInfo.getArtifactUUID());
+            serviceArtifact.setName(artifactInfo.getArtifactName());
+            serviceArtifact.setType(artifactInfo.getArtifactType());
+            serviceArtifact.setVersion(artifactInfo.getArtifactVersion());
+            serviceArtifact.setDescription(artifactInfo.getArtifactDescription());
+            serviceArtifact.setChecksum(artifactInfo.getArtifactChecksum());
+            serviceArtifact.setContent(artifactContent);
+            serviceArtifact.setService(service);
+            serviceArtifactList.add(serviceArtifact);
+        }
+        service.setServiceArtifactList(serviceArtifactList);
+    }
+
+    private ServiceInfo createServiceInfo(ToscaResourceStructure toscaResourceStruct, Service service) {
+        ServiceInfo serviceInfo = new ServiceInfo();
+        String serviceInput = getServiceInput(toscaResourceStruct);
+        serviceInfo.setServiceInput(serviceInput);
+
+        String serviceProperties = getServiceProperties(toscaResourceStruct);
+        serviceInfo.setServiceProperties(serviceProperties);
+
+        serviceInfo.setService(service);
+        return serviceInfo;
+    }
+
+    private String getServiceProperties(ToscaResourceStructure toscaResourceStruct) {
+        String propertiesJson = null;
+        ObjectMapper objectMapper = new ObjectMapper();
+        ISdcCsarHelper helper = toscaResourceStruct.getSdcCsarHelper();
+        String typeName = helper.getServiceSubstitutionMappingsTypeName();
+        Optional<NodeTemplate> nodeTemplate = helper.getServiceNodeTemplates().stream().findAny();
+        List<Object> serviceProperties = new ArrayList<>();
+        Map<String, Object> servicePropertiesMap;
+        if (nodeTemplate.isPresent()) {
+            LinkedHashMap<String, Object> customDef = nodeTemplate.get().getCustomDef();
+            Optional<String> machKey =
+                    customDef.keySet().stream().filter(key -> key.equalsIgnoreCase(typeName)).findFirst();
+            if (machKey.isPresent()) {
+                Object obj = customDef.get(machKey.get());
+                try {
+                    if (obj instanceof Map) {
+                        Object properties = ((HashMap) obj).get("properties");
+                        if (null != properties) {
+                            for (Object propertyName : ((Map) properties).keySet()) {
+                                servicePropertiesMap = new HashMap<>();
+                                servicePropertiesMap.put("name", propertyName);
+                                Object object = ((Map) properties).get(propertyName);
+                                for (Object entry : ((Map) object).entrySet()) {
+                                    servicePropertiesMap.put((String) ((Map.Entry) entry).getKey(),
+                                            ((Map.Entry) entry).getValue());
+                                }
+                                servicePropertiesMap.remove("description");
+                                serviceProperties.add(servicePropertiesMap);
+                            }
+                            propertiesJson = objectMapper.writeValueAsString(serviceProperties);
+                            propertiesJson = propertiesJson.replace("\"", "\\\"");
+                        }
+                    }
+                } catch (JsonProcessingException e) {
+                    logger.error("serviceProperties could not be deserialized for service uuid:  "
+                            + nodeTemplate.get().getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_UUID));
+                }
+            }
+        } else {
+            logger.debug("ServiceNodeTemplates is null");
+        }
+        return propertiesJson;
+    }
 }
 
diff --git a/asdc-controller/src/test/java/org/onap/so/asdc/installer/heat/ToscaResourceInstallerTest.java b/asdc-controller/src/test/java/org/onap/so/asdc/installer/heat/ToscaResourceInstallerTest.java
index c25c4c2..b8a2d01 100644
--- a/asdc-controller/src/test/java/org/onap/so/asdc/installer/heat/ToscaResourceInstallerTest.java
+++ b/asdc-controller/src/test/java/org/onap/so/asdc/installer/heat/ToscaResourceInstallerTest.java
@@ -75,19 +75,8 @@
 import org.onap.so.asdc.installer.VfModuleStructure;
 import org.onap.so.asdc.installer.VfResourceStructure;
 import org.onap.so.asdc.installer.bpmn.WorkflowResource;
-import org.onap.so.db.catalog.beans.ConfigurationResource;
-import org.onap.so.db.catalog.beans.ConfigurationResourceCustomization;
-import org.onap.so.db.catalog.beans.Service;
-import org.onap.so.db.catalog.beans.ServiceProxyResourceCustomization;
-import org.onap.so.db.catalog.beans.ToscaCsar;
-import org.onap.so.db.catalog.beans.VnfcInstanceGroupCustomization;
-import org.onap.so.db.catalog.data.repository.ConfigurationResourceCustomizationRepository;
-import org.onap.so.db.catalog.data.repository.InstanceGroupRepository;
-import org.onap.so.db.catalog.data.repository.ServiceRepository;
-import org.onap.so.db.catalog.data.repository.ToscaCsarRepository;
-import org.onap.so.db.catalog.data.repository.VFModuleRepository;
-import org.onap.so.db.catalog.data.repository.VnfResourceRepository;
-import org.onap.so.db.catalog.data.repository.VnfcInstanceGroupCustomizationRepository;
+import org.onap.so.db.catalog.beans.*;
+import org.onap.so.db.catalog.data.repository.*;
 import org.onap.so.db.request.beans.WatchdogComponentDistributionStatus;
 import org.onap.so.db.request.data.repository.WatchdogComponentDistributionStatusRepository;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -325,8 +314,6 @@
         notificationData.setServiceUUID("serviceUUID1");
         notificationData.setWorkloadContext("workloadContext1");
 
-
-
         String serviceType = "test-type1";
         String serviceRole = "test-role1";
         String category = "Network L3+";
@@ -356,6 +343,7 @@
         doReturn(resourceCustomizationUUID).when(metadata).getValue("vfModuleModelCustomizationUUID");
 
         ServiceRepository serviceRepo = spy(ServiceRepository.class);
+        ServiceInfoRepository serviceInfoRepo = spy(ServiceInfoRepository.class);
 
         VnfResourceRepository vnfRepo = spy(VnfResourceRepository.class);
         doReturn(null).when(vnfRepo).findResourceByModelUUID(uuid);
@@ -366,6 +354,7 @@
         WorkflowResource workflowResource = spy(WorkflowResource.class);
 
         ReflectionTestUtils.setField(toscaInstaller, "serviceRepo", serviceRepo);
+        ReflectionTestUtils.setField(toscaInstaller, "serviceInfoRepository", serviceInfoRepo);
         ReflectionTestUtils.setField(toscaInstaller, "vnfRepo", vnfRepo);
         ReflectionTestUtils.setField(toscaInstaller, "vfModuleRepo", vfModuleRepo);
         ReflectionTestUtils.setField(toscaInstaller, "instanceGroupRepo", instanceGroupRepo);
@@ -436,7 +425,10 @@
         assertNotNull(service);
         service.setModelVersion("1.0");
 
+        ServiceInfo serviceInfo = new ServiceInfo();
+        serviceInfo.setService(service);
         doReturn(service).when(serviceRepo).save(service);
+        doReturn(serviceInfo).when(serviceInfoRepo).save(any(ServiceInfo.class));
 
         WatchdogComponentDistributionStatusRepository watchdogCDStatusRepository =
                 spy(WatchdogComponentDistributionStatusRepository.class);
diff --git a/asdc-controller/src/test/java/org/onap/so/asdc/utils/ASDCLoggingVisitorImpl.java b/asdc-controller/src/test/java/org/onap/so/asdc/utils/ASDCLoggingVisitorImpl.java
index 53d163a..02c0f2d 100644
--- a/asdc-controller/src/test/java/org/onap/so/asdc/utils/ASDCLoggingVisitorImpl.java
+++ b/asdc-controller/src/test/java/org/onap/so/asdc/utils/ASDCLoggingVisitorImpl.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/asdc-controller/src/test/resources/schema.sql b/asdc-controller/src/test/resources/schema.sql
index 0821ebc..d051d1a 100644
--- a/asdc-controller/src/test/resources/schema.sql
+++ b/asdc-controller/src/test/resources/schema.sql
@@ -1378,6 +1378,34 @@
 ENGINE = InnoDB
 DEFAULT CHARACTER SET = latin1;
 
+CREATE TABLE IF NOT EXISTS `service_info` (
+  `ID` int (11) AUTO_INCREMENT,
+  `SERVICE_INPUT` varchar (5000),
+  `SERVICE_PROPERTIES` varchar (5000),
+  PRIMARY KEY (`ID`)
+)ENGINE=InnoDB DEFAULT CHARSET=latin1;
+
+CREATE TABLE IF NOT EXISTS `service_artifact`(
+  `ARTIFACT_UUID` varchar (200) NOT NULL,
+  `TYPE` varchar (200) NOT NULL,
+  `NAME` varchar (200) NOT NULL,
+  `VERSION` varchar (200) NOT NULL,
+  `DESCRIPTION` varchar (200) DEFAULT NULL,
+  `CONTENT` LONGTEXT DEFAULT NULL,
+  `CHECKSUM` varchar (200) DEFAULT NULL,
+  `CREATION_TIMESTAMP` DATETIME DEFAULT CURRENT_TIMESTAMP,
+  `SERVICE_MODEL_UUID` varchar (200) NOT NULL,
+  PRIMARY KEY (`ARTIFACT_UUID`),
+  CONSTRAINT `fk_service_artifact_service_info1` FOREIGN KEY (`SERVICE_MODEL_UUID`) REFERENCES `service` (`MODEL_UUID`) ON DELETE CASCADE ON UPDATE CASCADE
+)ENGINE=InnoDB DEFAULT CHARSET=latin1;
+
+CREATE TABLE IF NOT EXISTS `service_to_service_info` (
+  `SERVICE_MODEL_UUID` varchar (200) NOT NULL,
+  `SERVICE_INFO_ID` INT (11) NOT NULL,
+  PRIMARY KEY (`SERVICE_MODEL_UUID`,`SERVICE_INFO_ID`),
+  CONSTRAINT `fk_service_to_service_info__service1` FOREIGN KEY (`SERVICE_MODEL_UUID`) REFERENCES `service` (`MODEL_UUID`) ON DELETE CASCADE ON UPDATE CASCADE,
+  CONSTRAINT `fk_service_to_service_info__service_info1` FOREIGN KEY (`SERVICE_INFO_ID`) REFERENCES `service_info` (`ID`) ON DELETE CASCADE ON UPDATE CASCADE
+)ENGINE=InnoDB DEFAULT CHARSET=latin1;
 
 --------START Request DB SCHEMA --------
 CREATE DATABASE requestdb;
diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/restproperties/SDNCLcmPropertiesImpl.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/restproperties/SDNCLcmPropertiesImpl.java
new file mode 100644
index 0000000..eb2567d
--- /dev/null
+++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/restproperties/SDNCLcmPropertiesImpl.java
@@ -0,0 +1,117 @@
+/*-
+ * ============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.client.restproperties;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import org.onap.so.bpmn.core.UrnPropertiesReader;
+import org.onap.so.client.sdnc.common.SDNCConstants;
+import org.onap.so.client.sdnc.lcm.SDNCLcmProperties;
+
+public class SDNCLcmPropertiesImpl implements SDNCLcmProperties {
+
+    public static final String SDNC_HOST = "sdnc.host";
+    public static final String SDNC_AUTH = "sdnc.auth";
+    public static final String LCM_PATH = "sdnc.lcm.path";
+
+    public static final String DMAAP_HOST = "sdnc.dmaap.host";
+    public static final String DMAAP_AUTH = "sdnc.dmaap.auth";
+    public static final String DMAAP_PARTITION = "sdnc.dmaap.partition";
+    public static final String DMAAP_TIMEOUT = "sdnc.dmaap.timeout";
+    public static final String DMAAP_ENVIRONMENT = "sdnc.dmaap.environment";
+    public static final String LCM_DMAAP_READ_TOPIC = "sdnc.lcm.dmapp.readTopic";
+    public static final String LCM_DMAAP_WRITE_TOPIC = "sdnc.lcm.dmaap.writeTopic";
+
+    public static final String MSO_KEY = "mso.msoKey";
+
+    public SDNCLcmPropertiesImpl() {}
+
+    @Override
+    public String getHost() {
+        return UrnPropertiesReader.getVariable(SDNC_HOST);
+    }
+
+    @Override
+    public String getPath() {
+        String path = UrnPropertiesReader.getVariable(LCM_PATH);
+        return (path != null) ? path : SDNCConstants.LCM_API_BASE_PATH;
+    }
+
+    @Override
+    public String getBasicAuth() {
+        return UrnPropertiesReader.getVariable(SDNC_AUTH);
+    }
+
+    @Override
+    public String getDmaapHost() {
+        return UrnPropertiesReader.getVariable(DMAAP_HOST);
+    }
+
+    @Override
+    public String getDmaapAuth() {
+        return UrnPropertiesReader.getVariable(DMAAP_AUTH);
+    }
+
+    @Override
+    public String getDmaapPartition() {
+        String partition = UrnPropertiesReader.getVariable(DMAAP_PARTITION);
+        return (partition != null) ? partition : SDNCConstants.LCM_DMAAP_PARTITION;
+    }
+
+    @Override
+    public String getDmaapTimeout() {
+        String timeout = UrnPropertiesReader.getVariable(DMAAP_TIMEOUT);
+        return (timeout != null) ? timeout : SDNCConstants.LCM_DMAAP_TIMEOUT;
+    }
+
+    @Override
+    public String getDmaapEnvironment() {
+        String environment = UrnPropertiesReader.getVariable(DMAAP_ENVIRONMENT);
+        return (environment != null) ? environment : SDNCConstants.LCM_DMAAP_ENVIRONMENT;
+    }
+
+    @Override
+    public String getDmaaPLcmReadTopic() {
+        String readTopic = UrnPropertiesReader.getVariable(LCM_DMAAP_READ_TOPIC);
+        return (readTopic != null) ? readTopic : SDNCConstants.LCM_DMAAP_READ_TOPIC;
+    }
+
+    @Override
+    public String getDmaaPLcmWriteTopic() {
+        String writeTopic = UrnPropertiesReader.getVariable(LCM_DMAAP_WRITE_TOPIC);
+        return (writeTopic != null) ? writeTopic : SDNCConstants.LCM_DMAAP_WRITE_TOPIC;
+    }
+
+    @Override
+    public String getKey() {
+        return UrnPropertiesReader.getVariable(MSO_KEY);
+    }
+
+    @Override
+    public URL getEndpoint() throws MalformedURLException {
+        return new URL(getHost());
+    }
+
+    @Override
+    public String getSystemName() {
+        return SDNCConstants.SYSTEM_NAME;
+    }
+}
diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/common/SDNCConstants.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/common/SDNCConstants.java
new file mode 100644
index 0000000..fd9412e
--- /dev/null
+++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/common/SDNCConstants.java
@@ -0,0 +1,49 @@
+/*-
+ * ============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.client.sdnc.common;
+
+public interface SDNCConstants {
+    String SYSTEM_NAME = "MSO";
+
+    String LCM_API_VER = "2.00";
+
+    String LCM_FLAGS_MODE_NORMAL = "NORMAL";
+    String LCM_FLAGS_MODE_EXCLUSIVE = "EXCLUSIVE";
+
+    String LCM_FLAGS_FORCE_TRUE = "TRUE";
+    String LCM_FLAGS_FORCE_FALSE = "FALSE";
+
+    int LCM_FLAGS_TTL = 65000;
+
+    String LCM_API_BASE_PATH = "/restconf/operations/LCM:";
+
+    String LCM_DMAAP_MSG_VER = "1.0";
+    String LCM_DMAAP_MSG_TYPE_REQUEST = "request";
+    String LCM_DMAAP_MSG_TYPE_RESPONSE = "response";
+
+    String LCM_DMAAP_PARTITION = "MSOLCM";
+    String LCM_DMAAP_TIMEOUT = "20000";
+    String LCM_DMAAP_ENVIRONMENT = "TEST";
+    String LCM_DMAAP_READ_TOPIC = "SDNC-LCM-WRITE";
+    String LCM_DMAAP_WRITE_TOPIC = "SDNC-LCM-READ";
+
+    int LCM_TIMEOUT = 300;
+}
diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/SDNCLcmClientBuilder.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/SDNCLcmClientBuilder.java
new file mode 100644
index 0000000..5616db3
--- /dev/null
+++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/SDNCLcmClientBuilder.java
@@ -0,0 +1,77 @@
+/*-
+ * ============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.client.sdnc.lcm;
+
+import java.net.URI;
+import org.onap.so.client.RestPropertiesLoader;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class SDNCLcmClientBuilder {
+
+    private static Logger logger = LoggerFactory.getLogger(SDNCLcmClientBuilder.class);
+
+    private final SDNCLcmProperties sdncLcmProperties;
+
+    public SDNCLcmClientBuilder() {
+        sdncLcmProperties = RestPropertiesLoader.getInstance().getNewImpl(SDNCLcmProperties.class);
+    }
+
+    public SDNCLcmClientBuilder(SDNCLcmProperties pros) {
+        sdncLcmProperties = pros;
+    }
+
+    public SDNCLcmRestClient newSDNCLcmRestClient(String operation) throws SDNCLcmClientBuilderException {
+        URI pathUri;
+        try {
+            String path = sdncLcmProperties.getPath() + operation;
+            pathUri = new URI(path);
+            logger.debug("SDNC host: " + sdncLcmProperties.getHost());
+            logger.debug("SDNC API path: " + pathUri.getPath());
+        } catch (Exception e) {
+            String msg = "Error API path syntax: ";
+            logger.error(msg, e);
+            throw new SDNCLcmClientBuilderException(msg + e.toString());
+        }
+
+        try {
+            SDNCLcmRestClient sdncLcmRestClient = new SDNCLcmRestClient(sdncLcmProperties, pathUri);
+            logger.debug("Create SDNCLcmRestClient success");
+            return sdncLcmRestClient;
+        } catch (Exception e) {
+            String msg = "Create SDNCLcmRestClient failure: ";
+            logger.error(msg, e);
+            throw new SDNCLcmClientBuilderException(msg + e.toString());
+        }
+    }
+
+    public SDNCLcmDmaapClient newSDNCLcmDmaapClient() throws SDNCLcmClientBuilderException {
+        try {
+            SDNCLcmDmaapClient sdncLcmDmaapClient = new SDNCLcmDmaapClient(sdncLcmProperties);
+            logger.debug("Create SDNCLcmDmaapClient success");
+            return sdncLcmDmaapClient;
+        } catch (Exception e) {
+            String msg = "Create SDNCLcmDmaapClient failure: ";
+            logger.error(msg, e);
+            throw new SDNCLcmClientBuilderException(msg + e.toString());
+        }
+    }
+}
diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/SDNCLcmClientBuilderException.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/SDNCLcmClientBuilderException.java
new file mode 100644
index 0000000..9160d4e
--- /dev/null
+++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/SDNCLcmClientBuilderException.java
@@ -0,0 +1,30 @@
+/*-
+ * ============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.client.sdnc.lcm;
+
+public class SDNCLcmClientBuilderException extends Exception {
+
+    private static final long serialVersionUID = -1525705272349747712L;
+
+    public SDNCLcmClientBuilderException(String message) {
+        super(message);
+    }
+}
diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/SDNCLcmDmaapClient.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/SDNCLcmDmaapClient.java
new file mode 100644
index 0000000..f6e4ffc
--- /dev/null
+++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/SDNCLcmDmaapClient.java
@@ -0,0 +1,90 @@
+/*-
+ * ============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.client.sdnc.lcm;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.onap.so.client.sdnc.lcm.beans.LcmDmaapRequest;
+import org.onap.so.client.sdnc.lcm.beans.LcmDmaapResponse;
+import org.onap.so.client.dmaap.rest.RestPublisher;
+import org.onap.so.client.dmaap.rest.RestConsumer;
+
+public class SDNCLcmDmaapClient {
+
+    private static Logger logger = LoggerFactory.getLogger(SDNCLcmDmaapClient.class);
+
+    private RestPublisher dmaapPublisher;
+    private RestConsumer dmaapConsumer;
+
+    public SDNCLcmDmaapClient(SDNCLcmProperties sdncLcmProperties) {
+        Properties properties = new Properties();
+
+        properties.put("host", sdncLcmProperties.getDmaapHost());
+        if (sdncLcmProperties.getDmaapAuth() != null && sdncLcmProperties.getKey() != null) {
+            properties.put("auth", sdncLcmProperties.getDmaapAuth());
+            properties.put("key", sdncLcmProperties.getKey());
+        }
+        properties.put("partition", sdncLcmProperties.getDmaapPartition());
+        properties.put("timeout", sdncLcmProperties.getDmaapTimeout());
+        properties.put("environment", sdncLcmProperties.getDmaapEnvironment());
+
+        properties.put("topic", sdncLcmProperties.getDmaaPLcmWriteTopic());
+        dmaapPublisher = new RestPublisher(properties);
+
+        properties.put("topic", sdncLcmProperties.getDmaaPLcmReadTopic());
+        dmaapConsumer = new RestConsumer(properties);
+    }
+
+    public void sendRequest(LcmDmaapRequest lcmDmaapRequest) throws Exception {
+        ObjectMapper mapper = new ObjectMapper();
+        String lcmRestRequestString = mapper.writeValueAsString(lcmDmaapRequest);
+
+        dmaapPublisher.send(lcmRestRequestString);
+    }
+
+    public Iterable<String> fetch() {
+        return dmaapConsumer.fetch();
+    }
+
+    public List<LcmDmaapResponse> getResponse() {
+        List<LcmDmaapResponse> responseList = new ArrayList<>();
+
+        ObjectMapper mapper = new ObjectMapper();
+        Iterable<String> itrString = dmaapConsumer.fetch();
+        for (String message : itrString) {
+            LcmDmaapResponse lcmDmaapResponse;
+            try {
+                lcmDmaapResponse = mapper.readValue(message, LcmDmaapResponse.class);
+            } catch (Exception e) {
+                logger.warn("Invalid SDNC LCM DMaaP response: " + message);
+                continue;
+            }
+
+            responseList.add(lcmDmaapResponse);
+        }
+
+        return responseList;
+    }
+}
diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/SDNCLcmMessageBuilder.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/SDNCLcmMessageBuilder.java
new file mode 100644
index 0000000..bf1229a
--- /dev/null
+++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/SDNCLcmMessageBuilder.java
@@ -0,0 +1,87 @@
+/*-
+ * ============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.client.sdnc.lcm;
+
+import java.time.Instant;
+import org.onap.so.client.sdnc.common.SDNCConstants;
+import org.onap.so.client.sdnc.lcm.beans.*;
+
+public class SDNCLcmMessageBuilder {
+
+    public static LcmFlags getSDNCFlags() {
+        LcmFlags lcmFlags = new LcmFlags();
+
+        lcmFlags.setMode(SDNCConstants.LCM_FLAGS_MODE_NORMAL);
+        lcmFlags.setForce(SDNCConstants.LCM_FLAGS_FORCE_FALSE);
+        lcmFlags.setTtl(SDNCConstants.LCM_FLAGS_TTL);
+
+        return lcmFlags;
+    }
+
+    public static LcmCommonHeader buildLcmCommonHeader(String requestId, String subRequestId) {
+        LcmCommonHeader lcmCommonHeader = new LcmCommonHeader();
+
+        lcmCommonHeader.setApiVer(SDNCConstants.LCM_API_VER);
+        lcmCommonHeader.setOriginatorId(SDNCConstants.SYSTEM_NAME);
+        lcmCommonHeader.setRequestId(requestId);
+        lcmCommonHeader.setSubRequestId(subRequestId);
+        lcmCommonHeader.setFlags(getSDNCFlags());
+        lcmCommonHeader.setTimestamp(Instant.now().toString());
+
+        return lcmCommonHeader;
+    }
+
+    public static LcmInput buildLcmInputForPnf(String requestId, String subRequestId, String pnfName, String action,
+            String payload) {
+        LcmInput lcmInput = new LcmInput();
+
+        LcmCommonHeader lcmCommonHeader = buildLcmCommonHeader(requestId, subRequestId);
+
+        LcmActionIdentifiers sdncActionIdentifiers = new LcmActionIdentifiers();
+        sdncActionIdentifiers.setPnfName(pnfName);
+
+        lcmInput.setCommonHeader(lcmCommonHeader);
+        lcmInput.setAction(action);
+        lcmInput.setActionIdentifiers(sdncActionIdentifiers);
+        lcmInput.setPayload(payload);
+
+        return lcmInput;
+    }
+
+    public static LcmDmaapRequest buildLcmDmaapRequest(String operation, LcmInput lcmInput) {
+        LcmDmaapRequest lcmDmaapRequest = new LcmDmaapRequest();
+
+        LcmRestRequest lcmRestRequest = new LcmRestRequest();
+        lcmRestRequest.setInput(lcmInput);
+
+        String correlationId =
+                lcmInput.getCommonHeader().getRequestId() + "-" + lcmInput.getCommonHeader().getSubRequestId();
+
+        lcmDmaapRequest.setVersion(SDNCConstants.LCM_DMAAP_MSG_VER);
+        lcmDmaapRequest.setType(SDNCConstants.LCM_DMAAP_MSG_TYPE_REQUEST);
+        lcmDmaapRequest.setCambriaPartition(SDNCConstants.SYSTEM_NAME);
+        lcmDmaapRequest.setCorrelationId(correlationId);
+        lcmDmaapRequest.setRpcName(operation);
+        lcmDmaapRequest.setBody(lcmRestRequest);
+
+        return lcmDmaapRequest;
+    }
+}
diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/SDNCLcmProperties.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/SDNCLcmProperties.java
new file mode 100644
index 0000000..df5fb3b
--- /dev/null
+++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/SDNCLcmProperties.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.client.sdnc.lcm;
+
+import org.onap.so.client.RestProperties;
+
+public interface SDNCLcmProperties extends RestProperties {
+    String getHost();
+
+    String getPath();
+
+    String getBasicAuth();
+
+    String getDmaapHost();
+
+    String getDmaapAuth();
+
+    String getDmaapPartition();
+
+    String getDmaapTimeout();
+
+    String getDmaapEnvironment();
+
+    String getDmaaPLcmReadTopic();
+
+    String getDmaaPLcmWriteTopic();
+
+    String getKey();
+}
diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/SDNCLcmRestClient.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/SDNCLcmRestClient.java
new file mode 100644
index 0000000..3faf58e
--- /dev/null
+++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/SDNCLcmRestClient.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.client.sdnc.lcm;
+
+import java.net.URI;
+import java.util.Map;
+import java.util.Optional;
+import org.onap.so.client.RestClient;
+import org.onap.logging.filter.base.ONAPComponents;
+import org.onap.so.client.sdnc.lcm.beans.LcmInput;
+import org.onap.so.client.sdnc.lcm.beans.LcmOutput;
+import org.onap.so.client.sdnc.lcm.beans.LcmRestRequest;
+import org.onap.so.client.sdnc.lcm.beans.LcmRestResponse;
+
+public class SDNCLcmRestClient extends RestClient {
+
+    private final SDNCLcmProperties sdncLcmProperties;
+
+    public SDNCLcmRestClient(SDNCLcmProperties props, URI path) {
+        this(props, path, "application/json", "application/json");
+    }
+
+    public SDNCLcmRestClient(SDNCLcmProperties props, URI path, String accept, String contentType) {
+        super(props, Optional.of(path), accept, contentType);
+        this.sdncLcmProperties = props;
+    }
+
+    @Override
+    protected void initializeHeaderMap(Map<String, String> headerMap) {
+        headerMap.put("Authorization", sdncLcmProperties.getBasicAuth());
+    }
+
+    @Override
+    public ONAPComponents getTargetEntity() {
+        return ONAPComponents.SDNC;
+    }
+
+    public LcmRestResponse sendRequest(LcmRestRequest lcmRestRequest) {
+        return post(lcmRestRequest, LcmRestResponse.class);
+    }
+
+    public LcmOutput sendRequest(LcmInput lcmInput) {
+        LcmRestRequest lcmRestRequest = new LcmRestRequest();
+        lcmRestRequest.setInput(lcmInput);
+
+        LcmRestResponse lcmRestResponse = sendRequest(lcmRestRequest);
+        return lcmRestResponse.getOutput();
+    }
+}
diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/beans/LcmActionIdentifiers.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/beans/LcmActionIdentifiers.java
new file mode 100644
index 0000000..883fd02
--- /dev/null
+++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/beans/LcmActionIdentifiers.java
@@ -0,0 +1,97 @@
+/*-
+ * ============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.client.sdnc.lcm.beans;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonPropertyOrder({"serviceInstanceId", "vnfId", "vfModuleId", "vnfcName", "vserverId", "pnfName"})
+public class LcmActionIdentifiers {
+
+    @JsonProperty("service-instance-id")
+    private String serviceInstanceId;
+
+    @JsonProperty("vnf-id")
+    private String vnfId;
+
+    @JsonProperty("vf-module-id")
+    private String vfModuleId;
+
+    @JsonProperty("vnfc-name")
+    private String vnfcName;
+
+    @JsonProperty("vserver-id")
+    private String vserverId;
+
+    @JsonProperty("pnf-name")
+    private String pnfName;
+
+    public String getServiceInstanceId() {
+        return serviceInstanceId;
+    }
+
+    public void setServiceInstanceId(String value) {
+        this.serviceInstanceId = value;
+    }
+
+    public String getVnfId() {
+        return vnfId;
+    }
+
+    public void setVnfId(String value) {
+        this.vnfId = value;
+    }
+
+    public String getVfModuleId() {
+        return vfModuleId;
+    }
+
+    public void setVfModuleId(String value) {
+        this.vfModuleId = value;
+    }
+
+    public String getVnfcName() {
+        return vnfcName;
+    }
+
+    public void setVnfcName(String value) {
+        this.vnfcName = value;
+    }
+
+    public String getVserverId() {
+        return vserverId;
+    }
+
+    public void setVserverId(String value) {
+        this.vserverId = value;
+    }
+
+    public String getPnfName() {
+        return pnfName;
+    }
+
+    public void setPnfName(String value) {
+        this.pnfName = value;
+    }
+
+}
diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/beans/LcmCommonHeader.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/beans/LcmCommonHeader.java
new file mode 100644
index 0000000..f3fd2ca
--- /dev/null
+++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/beans/LcmCommonHeader.java
@@ -0,0 +1,97 @@
+/*-
+ * ============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.client.sdnc.lcm.beans;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonPropertyOrder({"apiVer", "flags", "originatorId", "requestId", "subRequestId", "timestamp"})
+public class LcmCommonHeader {
+
+    @JsonProperty(value = "api-ver", required = true)
+    private String apiVer;
+
+    @JsonProperty(value = "flags")
+    private LcmFlags flags;
+
+    @JsonProperty(value = "originator-id", required = true)
+    private String originatorId;
+
+    @JsonProperty(value = "request-id", required = true)
+    private String requestId;
+
+    @JsonProperty(value = "sub-request-id")
+    private String subRequestId;
+
+    @JsonProperty(value = "timestamp", required = true)
+    private String timestamp;
+
+    public String getApiVer() {
+        return apiVer;
+    }
+
+    public void setApiVer(String value) {
+        this.apiVer = value;
+    }
+
+    public String getOriginatorId() {
+        return originatorId;
+    }
+
+    public void setOriginatorId(String value) {
+        this.originatorId = value;
+    }
+
+    public String getRequestId() {
+        return requestId;
+    }
+
+    public void setRequestId(String value) {
+        this.requestId = value;
+    }
+
+    public String getSubRequestId() {
+        return subRequestId;
+    }
+
+    public void setSubRequestId(String value) {
+        this.subRequestId = value;
+    }
+
+    public LcmFlags getFlags() {
+        return flags;
+    }
+
+    public void setFlags(LcmFlags value) {
+        this.flags = value;
+    }
+
+    public String getTimestamp() {
+        return timestamp;
+    }
+
+    public void setTimestamp(String value) {
+        this.timestamp = value;
+    }
+
+}
diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/beans/LcmDmaapRequest.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/beans/LcmDmaapRequest.java
new file mode 100644
index 0000000..db62e8b
--- /dev/null
+++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/beans/LcmDmaapRequest.java
@@ -0,0 +1,97 @@
+/*-
+ * ============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.client.sdnc.lcm.beans;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonPropertyOrder({"version", "type", "cambriaPartition", "correlationId", "rpcName", "body"})
+public class LcmDmaapRequest {
+
+    @JsonProperty(value = "version", required = true)
+    private String version;
+
+    @JsonProperty(value = "type", required = true)
+    private String type;
+
+    @JsonProperty(value = "cambria.partition", required = true)
+    private String cambriaPartition;
+
+    @JsonProperty(value = "correlation-id", required = true)
+    private String correlationId;
+
+    @JsonProperty(value = "rpc-name", required = true)
+    private String rpcName;
+
+    @JsonProperty(value = "body")
+    private LcmRestRequest body;
+
+    public String getVersion() {
+        return version;
+    }
+
+    public void setVersion(String value) {
+        this.version = value;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String value) {
+        this.type = value;
+    }
+
+    public String getCambriaPartition() {
+        return cambriaPartition;
+    }
+
+    public void setCambriaPartition(String value) {
+        this.cambriaPartition = value;
+    }
+
+    public String getCorrelationId() {
+        return correlationId;
+    }
+
+    public void setCorrelationId(String value) {
+        this.correlationId = value;
+    }
+
+    public String getRpcName() {
+        return rpcName;
+    }
+
+    public void setRpcName(String value) {
+        this.rpcName = value;
+    }
+
+    public LcmRestRequest getBody() {
+        return body;
+    }
+
+    public void setBody(LcmRestRequest value) {
+        this.body = value;
+    }
+
+}
diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/beans/LcmDmaapResponse.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/beans/LcmDmaapResponse.java
new file mode 100644
index 0000000..35f4a26
--- /dev/null
+++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/beans/LcmDmaapResponse.java
@@ -0,0 +1,97 @@
+/*-
+ * ============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.client.sdnc.lcm.beans;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonPropertyOrder({"version", "type", "cambriaPartition", "correlationId", "rpcName", "body"})
+public class LcmDmaapResponse {
+
+    @JsonProperty(value = "version", required = true)
+    private String version;
+
+    @JsonProperty(value = "type", required = true)
+    private String type;
+
+    @JsonProperty(value = "cambria.partition", required = true)
+    private String cambriaPartition;
+
+    @JsonProperty(value = "correlation-id", required = true)
+    private String correlationId;
+
+    @JsonProperty(value = "rpc-name", required = true)
+    private String rpcName;
+
+    @JsonProperty(value = "body")
+    private LcmRestResponse body;
+
+    public String getVersion() {
+        return version;
+    }
+
+    public void setVersion(String value) {
+        this.version = value;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String value) {
+        this.type = value;
+    }
+
+    public String getCambriaPartition() {
+        return cambriaPartition;
+    }
+
+    public void setCambriaPartition(String value) {
+        this.cambriaPartition = value;
+    }
+
+    public String getCorrelationId() {
+        return correlationId;
+    }
+
+    public void setCorrelationId(String value) {
+        this.correlationId = value;
+    }
+
+    public String getRpcName() {
+        return rpcName;
+    }
+
+    public void setRpcName(String value) {
+        this.rpcName = value;
+    }
+
+    public LcmRestResponse getBody() {
+        return body;
+    }
+
+    public void setBody(LcmRestResponse value) {
+        this.body = value;
+    }
+
+}
diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/beans/LcmFlags.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/beans/LcmFlags.java
new file mode 100644
index 0000000..36527ec
--- /dev/null
+++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/beans/LcmFlags.java
@@ -0,0 +1,64 @@
+/*-
+ * ============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.client.sdnc.lcm.beans;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonPropertyOrder({"mode", "force", "ttl"})
+public class LcmFlags {
+
+    @JsonProperty("mode")
+    private String mode;
+
+    @JsonProperty("force")
+    private String force;
+
+    @JsonProperty("ttl")
+    private int ttl;
+
+    public String getMode() {
+        return mode;
+    }
+
+    public void setMode(String value) {
+        this.mode = value;
+    }
+
+    public String getForce() {
+        return force;
+    }
+
+    public void setForce(String value) {
+        this.force = value;
+    }
+
+    public Integer getTtl() {
+        return ttl;
+    }
+
+    public void setTtl(Integer value) {
+        this.ttl = value;
+    }
+
+}
diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/beans/LcmInput.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/beans/LcmInput.java
new file mode 100644
index 0000000..6634430
--- /dev/null
+++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/beans/LcmInput.java
@@ -0,0 +1,75 @@
+/*-
+ * ============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.client.sdnc.lcm.beans;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonPropertyOrder({"commonHeader", "action", "actionIdentifiers", "payload"})
+public class LcmInput {
+
+    @JsonProperty(value = "common-header", required = true)
+    private LcmCommonHeader commonHeader;
+
+    @JsonProperty(value = "action", required = true)
+    private String action;
+
+    @JsonProperty(value = "action-identifiers", required = true)
+    private LcmActionIdentifiers actionIdentifiers;
+
+    @JsonProperty(value = "payload")
+    private String payload;
+
+    public LcmCommonHeader getCommonHeader() {
+        return commonHeader;
+    }
+
+    public void setCommonHeader(LcmCommonHeader value) {
+        this.commonHeader = value;
+    }
+
+    public String getAction() {
+        return action;
+    }
+
+    public void setAction(String value) {
+        this.action = value;
+    }
+
+    public LcmActionIdentifiers getActionIdentifiers() {
+        return actionIdentifiers;
+    }
+
+    public void setActionIdentifiers(LcmActionIdentifiers value) {
+        this.actionIdentifiers = value;
+    }
+
+    public String getPayload() {
+        return payload;
+    }
+
+    public void setPayload(String value) {
+        this.payload = value;
+    }
+
+}
diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/beans/LcmOutput.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/beans/LcmOutput.java
new file mode 100644
index 0000000..3741786
--- /dev/null
+++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/beans/LcmOutput.java
@@ -0,0 +1,64 @@
+/*-
+ * ============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.client.sdnc.lcm.beans;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonPropertyOrder({"commonHeader", "status", "payload"})
+public class LcmOutput {
+
+    @JsonProperty(value = "common-header", required = true)
+    private LcmCommonHeader commonHeader;
+
+    @JsonProperty(value = "status", required = true)
+    private LcmStatus status;
+
+    @JsonProperty(value = "payload")
+    private String payload;
+
+    public LcmCommonHeader getCommonHeader() {
+        return commonHeader;
+    }
+
+    public void setCommonHeader(LcmCommonHeader value) {
+        this.commonHeader = value;
+    }
+
+    public LcmStatus getStatus() {
+        return status;
+    }
+
+    public void setStatus(LcmStatus value) {
+        this.status = value;
+    }
+
+    public String getPayload() {
+        return payload;
+    }
+
+    public void setPayload(String value) {
+        this.payload = value;
+    }
+
+}
diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/beans/LcmRestRequest.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/beans/LcmRestRequest.java
new file mode 100644
index 0000000..146eb8a
--- /dev/null
+++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/beans/LcmRestRequest.java
@@ -0,0 +1,42 @@
+/*-
+ * ============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.client.sdnc.lcm.beans;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonPropertyOrder({"input"})
+public class LcmRestRequest {
+
+    @JsonProperty(value = "input", required = true)
+    private LcmInput input;
+
+    public LcmInput getInput() {
+        return input;
+    }
+
+    public void setInput(LcmInput value) {
+        this.input = value;
+    }
+
+}
diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/beans/LcmRestResponse.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/beans/LcmRestResponse.java
new file mode 100644
index 0000000..6920f95
--- /dev/null
+++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/beans/LcmRestResponse.java
@@ -0,0 +1,42 @@
+/*-
+ * ============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.client.sdnc.lcm.beans;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonPropertyOrder({"output"})
+public class LcmRestResponse {
+
+    @JsonProperty(value = "output", required = true)
+    private LcmOutput output;
+
+    public LcmOutput getOutput() {
+        return output;
+    }
+
+    public void setOutput(LcmOutput value) {
+        this.output = value;
+    }
+
+}
diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/beans/LcmStatus.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/beans/LcmStatus.java
new file mode 100644
index 0000000..8a2a142
--- /dev/null
+++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/sdnc/lcm/beans/LcmStatus.java
@@ -0,0 +1,53 @@
+/*-
+ * ============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.client.sdnc.lcm.beans;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonPropertyOrder({"code", "message"})
+public class LcmStatus {
+
+    @JsonProperty(value = "code", required = true)
+    private int code;
+
+    @JsonProperty(value = "message", required = true)
+    private String message;
+
+    public int getCode() {
+        return code;
+    }
+
+    public void setCode(int value) {
+        this.code = value;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String value) {
+        this.message = value;
+    }
+
+}
diff --git a/bpmn/MSOCommonBPMN/src/main/resources/META-INF/services/org.onap.so.client.RestProperties b/bpmn/MSOCommonBPMN/src/main/resources/META-INF/services/org.onap.so.client.RestProperties
index 27da189..147bc2e 100644
--- a/bpmn/MSOCommonBPMN/src/main/resources/META-INF/services/org.onap.so.client.RestProperties
+++ b/bpmn/MSOCommonBPMN/src/main/resources/META-INF/services/org.onap.so.client.RestProperties
@@ -1,3 +1,4 @@
 org.onap.so.client.restproperties.AAIPropertiesImpl
 org.onap.so.client.restproperties.CDSPropertiesImpl
-org.onap.so.client.restproperties.PolicyRestPropertiesImpl
\ No newline at end of file
+org.onap.so.client.restproperties.PolicyRestPropertiesImpl
+org.onap.so.client.restproperties.SDNCLcmPropertiesImpl
diff --git a/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/sdnc/lcm/SDNCLcmDmaapClientTest.java b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/sdnc/lcm/SDNCLcmDmaapClientTest.java
new file mode 100644
index 0000000..5483792
--- /dev/null
+++ b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/sdnc/lcm/SDNCLcmDmaapClientTest.java
@@ -0,0 +1,139 @@
+/*-
+ * ============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.client.sdnc.lcm;
+
+import java.util.List;
+import org.apache.http.HttpStatus;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import org.junit.Test;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.fail;
+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.get;
+import static com.github.tomakehurst.wiremock.client.WireMock.urlPathEqualTo;
+import org.onap.so.BaseTest;
+import org.onap.so.client.restproperties.SDNCLcmPropertiesImpl;
+import org.onap.so.client.sdnc.lcm.beans.*;
+
+public class SDNCLcmDmaapClientTest extends BaseTest {
+
+    protected SDNCLcmMessageBuilderTest sdncLcmMessageBuilderTest = new SDNCLcmMessageBuilderTest();
+
+    protected static final String DMAAP_HOST_PROP = SDNCLcmPropertiesImpl.DMAAP_HOST;
+    protected static final String DMAAP_WRITE_TOPIC_PROP = SDNCLcmPropertiesImpl.LCM_DMAAP_WRITE_TOPIC;
+    protected static final String DMAAP_READ_TOPIC_PROP = SDNCLcmPropertiesImpl.LCM_DMAAP_READ_TOPIC;
+    protected static final String DMAAP_PARTITION_PROP = SDNCLcmPropertiesImpl.DMAAP_PARTITION;
+
+    protected String testWriteTopic = "TEST-WRITE-TOPIC";
+    protected String testReadTopic = "TEST-READ-TOPIC";
+    protected String testPartition = "TESTMSO";
+    protected final String defaultConsumerName = "consumer1";
+
+    private void clearSystemProperty() {
+        System.clearProperty(DMAAP_HOST_PROP);
+        System.clearProperty(DMAAP_WRITE_TOPIC_PROP);
+        System.clearProperty(DMAAP_READ_TOPIC_PROP);
+        System.clearProperty(DMAAP_PARTITION_PROP);
+    }
+
+    public SDNCLcmDmaapClient buildSDNCLcmDmaapClient() {
+        String testHost = "http://localhost:" + wireMockPort;
+
+        System.setProperty(DMAAP_HOST_PROP, testHost);
+        System.setProperty(DMAAP_WRITE_TOPIC_PROP, testWriteTopic);
+        System.setProperty(DMAAP_READ_TOPIC_PROP, testReadTopic);
+        System.setProperty(DMAAP_PARTITION_PROP, testPartition);
+
+        SDNCLcmProperties sdncLcmProperties = new SDNCLcmPropertiesImpl();
+        SDNCLcmClientBuilder sdncLcmClientBuilder = new SDNCLcmClientBuilder(sdncLcmProperties);
+
+        try {
+            return sdncLcmClientBuilder.newSDNCLcmDmaapClient();
+        } catch (Exception e) {
+            clearSystemProperty();
+            fail("Create SDNCLcmDmaapClient error: " + e.toString());
+            return null;
+        }
+    }
+
+    @Test
+    public final void testSDNCLcmDmaapClientSendRequest() {
+        SDNCLcmDmaapClient sdncLcmDmaapClient = buildSDNCLcmDmaapClient();
+
+        assertNotEquals(null, sdncLcmDmaapClient);
+
+        String testDmaapWritePath = "/events/" + testWriteTopic;
+        String expectedWriteResponse = "{\"serverTimeMs\":2,\"count\":1}";
+        wireMockServer.stubFor(post(urlPathEqualTo(testDmaapWritePath))
+                .willReturn(aResponse().withHeader("Content-Type", "application/json").withBody(expectedWriteResponse)
+                        .withStatus(HttpStatus.SC_OK)));
+
+        LcmInput lcmInput = sdncLcmMessageBuilderTest.buildLcmInputForPnf();
+        LcmDmaapRequest lcmDmaapRequest =
+                SDNCLcmMessageBuilder.buildLcmDmaapRequest(sdncLcmMessageBuilderTest.getOperation(), lcmInput);
+
+        try {
+            sdncLcmDmaapClient.sendRequest(lcmDmaapRequest);
+        } catch (Exception e) {
+            clearSystemProperty();
+            fail("SDNCLcmDmaapClient sends request error: " + e.toString());
+            return;
+        }
+
+        String testDmaapReadPath = "/events/" + testReadTopic + "/" + testPartition + "/" + defaultConsumerName;
+
+        String expectedLcmDmaapResponse = LcmDmaapResponseTest.getExpectedLcmDmaapResponse();
+        String expectedResponseListItem;
+        try {
+            expectedResponseListItem = sdncLcmMessageBuilderTest.convertToSting(expectedLcmDmaapResponse);
+        } catch (JsonProcessingException e) {
+            clearSystemProperty();
+            fail("Convert LcmDmaapResponse String to List item error: " + e.toString());
+            return;
+        }
+        String expectedReadResponse = "[" + expectedResponseListItem + "]";
+        wireMockServer.stubFor(get(urlPathEqualTo(testDmaapReadPath))
+                .willReturn(aResponse().withHeader("Content-Type", "application/json").withBody(expectedReadResponse)
+                        .withStatus(HttpStatus.SC_OK)));
+
+        List<LcmDmaapResponse> LcmDmaapResponseList = sdncLcmDmaapClient.getResponse();
+
+        clearSystemProperty();
+
+        if (LcmDmaapResponseList.size() < 1) {
+            clearSystemProperty();
+            fail("Can not get LcmDmaapResponse list");
+            return;
+        }
+
+        LcmOutput lcmOutput = LcmDmaapResponseList.get(0).getBody().getOutput();
+
+        String expectedLcmOutput = LcmOutputTest.getExpectedLcmOutput();
+        try {
+            String lcmOutputString = sdncLcmMessageBuilderTest.convertToSting(lcmOutput);
+            assertEquals(expectedLcmOutput, lcmOutputString);
+        } catch (Exception e) {
+            fail("Convert LcmOutput to String error: " + e.toString());
+        }
+    }
+}
diff --git a/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/sdnc/lcm/SDNCLcmMessageBuilderTest.java b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/sdnc/lcm/SDNCLcmMessageBuilderTest.java
new file mode 100644
index 0000000..d930c67
--- /dev/null
+++ b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/sdnc/lcm/SDNCLcmMessageBuilderTest.java
@@ -0,0 +1,53 @@
+/*-
+ * ============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.client.sdnc.lcm;
+
+import org.junit.Test;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+import org.onap.so.client.sdnc.lcm.beans.LcmBeanTest;
+import org.onap.so.client.sdnc.lcm.beans.LcmInput;
+import org.onap.so.client.sdnc.lcm.beans.LcmInputTest;
+
+public class SDNCLcmMessageBuilderTest extends LcmBeanTest {
+
+    public LcmInput buildLcmInputForPnf() {
+        LcmInput lcmInput =
+                SDNCLcmMessageBuilder.buildLcmInputForPnf(requestId, subRequestId, pnfName, action, inputPayload);
+
+        lcmInput.getCommonHeader().setTimestamp(timestamp);
+
+        return lcmInput;
+    }
+
+    @Test
+    public final void testBuildLcmRestRequestForPnf() {
+        LcmInput lcmInput = buildLcmInputForPnf();
+
+        String expectedLcmInput = LcmInputTest.getExpectedLcmInput();
+        try {
+            String lcmInputString = convertToSting(lcmInput);
+            assertEquals(expectedLcmInput, lcmInputString);
+        } catch (Exception e) {
+            fail("Convert LcmInput to String error: " + e.toString());
+        }
+    }
+}
diff --git a/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/sdnc/lcm/SDNCLcmRestClientTest.java b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/sdnc/lcm/SDNCLcmRestClientTest.java
new file mode 100644
index 0000000..04cfc6e
--- /dev/null
+++ b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/sdnc/lcm/SDNCLcmRestClientTest.java
@@ -0,0 +1,93 @@
+/*-
+ * ============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.client.sdnc.lcm;
+
+import org.apache.http.HttpStatus;
+import org.junit.Test;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.fail;
+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.urlPathEqualTo;
+import org.onap.logging.filter.base.ONAPComponents;
+import org.onap.so.BaseTest;
+import org.onap.so.client.restproperties.SDNCLcmPropertiesImpl;
+import org.onap.so.client.sdnc.common.SDNCConstants;
+import org.onap.so.client.sdnc.lcm.beans.*;
+
+public class SDNCLcmRestClientTest extends BaseTest {
+
+    protected SDNCLcmMessageBuilderTest sdncLcmMessageBuilderTest = new SDNCLcmMessageBuilderTest();
+
+    protected static final String SDNC_HOST_PROP = SDNCLcmPropertiesImpl.SDNC_HOST;
+    protected static final String SDNC_PATH_PROP = SDNCLcmPropertiesImpl.LCM_PATH;
+
+    private void clearSystemProperty() {
+        System.clearProperty(SDNC_HOST_PROP);
+        System.clearProperty(SDNC_PATH_PROP);
+    }
+
+    public SDNCLcmRestClient buildSDNCLcmRestClient() {
+        String testHost = "http://localhost:" + wireMockPort;
+
+        System.setProperty(SDNC_HOST_PROP, testHost);
+        System.setProperty(SDNC_PATH_PROP, SDNCConstants.LCM_API_BASE_PATH);
+
+        SDNCLcmProperties sdncLcmProperties = new SDNCLcmPropertiesImpl();
+        SDNCLcmClientBuilder sdncLcmClientBuilder = new SDNCLcmClientBuilder(sdncLcmProperties);
+
+        try {
+            return sdncLcmClientBuilder.newSDNCLcmRestClient(sdncLcmMessageBuilderTest.getOperation());
+        } catch (Exception e) {
+            clearSystemProperty();
+            fail("Create SDNCLcmRestClient error: " + e.toString());
+            return null;
+        }
+    }
+
+    @Test
+    public final void testSDNCLcmRestClientSendRequest() {
+        SDNCLcmRestClient sdncLcmRestClient = buildSDNCLcmRestClient();
+
+        assertNotEquals(null, sdncLcmRestClient);
+        assertEquals(ONAPComponents.SDNC, sdncLcmRestClient.getTargetEntity());
+
+        String testLcmApiPath = SDNCConstants.LCM_API_BASE_PATH + sdncLcmMessageBuilderTest.getOperation();
+        String expectedLcmRestResponse = LcmRestResponseTest.getExpectedLcmRestResponse();
+        wireMockServer.stubFor(post(urlPathEqualTo(testLcmApiPath))
+                .willReturn(aResponse().withHeader("Content-Type", "application/json").withBody(expectedLcmRestResponse)
+                        .withStatus(HttpStatus.SC_OK)));
+
+        LcmInput lcmInput = sdncLcmMessageBuilderTest.buildLcmInputForPnf();
+        LcmOutput lcmOutput = sdncLcmRestClient.sendRequest(lcmInput);
+
+        clearSystemProperty();
+
+        String expectedLcmOutput = LcmOutputTest.getExpectedLcmOutput();
+        try {
+            String lcmOutputString = sdncLcmMessageBuilderTest.convertToSting(lcmOutput);
+            assertEquals(expectedLcmOutput, lcmOutputString);
+        } catch (Exception e) {
+            fail("Convert LcmOutput to String error: " + e.toString());
+        }
+    }
+}
diff --git a/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/sdnc/lcm/beans/LcmBeanTest.java b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/sdnc/lcm/beans/LcmBeanTest.java
new file mode 100644
index 0000000..5562444
--- /dev/null
+++ b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/sdnc/lcm/beans/LcmBeanTest.java
@@ -0,0 +1,78 @@
+/*-
+ * ============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.client.sdnc.lcm.beans;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.onap.so.client.sdnc.common.SDNCConstants;
+
+public class LcmBeanTest {
+    private static Logger logger = LoggerFactory.getLogger(LcmBeanTest.class);
+
+    protected String requestId = "9f77f437-1515-44bd-a420-0aaf8a3c31a0";
+    protected String subRequestId = "c197a4b5-18d9-48a2-ad2d-a3b56858501c";
+    protected String timestamp = "2020-02-25T10:20:28.116Z";
+
+    protected String pnfName = "testpnf";
+    protected String action = "TestAction";
+    protected String operation = "test-operation";
+
+    protected String inputPayload = "{\"testPayload\": \"input test\"}";
+    protected String outputPayload = "{\"testPayload\": \"output test\"}";
+
+    public String getOperation() {
+        return operation;
+    }
+
+    public LcmFlags buildSDNCFlags() {
+        LcmFlags lcmFlags = new LcmFlags();
+
+        lcmFlags.setMode(SDNCConstants.LCM_FLAGS_MODE_NORMAL);
+        lcmFlags.setForce(SDNCConstants.LCM_FLAGS_FORCE_FALSE);
+        lcmFlags.setTtl(SDNCConstants.LCM_FLAGS_TTL);
+
+        return lcmFlags;
+    }
+
+    public LcmCommonHeader buildLcmCommonHeader() {
+        LcmCommonHeader lcmCommonHeader = new LcmCommonHeader();
+
+        lcmCommonHeader.setApiVer(SDNCConstants.LCM_API_VER);
+        lcmCommonHeader.setFlags(buildSDNCFlags());
+        lcmCommonHeader.setOriginatorId(SDNCConstants.SYSTEM_NAME);
+        lcmCommonHeader.setRequestId(requestId);
+        lcmCommonHeader.setSubRequestId(subRequestId);
+        lcmCommonHeader.setTimestamp(timestamp);
+
+        return lcmCommonHeader;
+    }
+
+    public String convertToSting(Object msgObject) throws JsonProcessingException {
+        ObjectMapper mapper = new ObjectMapper();
+
+        String msgString = mapper.writeValueAsString(msgObject);
+        logger.debug(msgObject.getClass().getSimpleName() + "\n" + msgString);
+
+        return msgString;
+    }
+}
diff --git a/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/sdnc/lcm/beans/LcmDmaapRequestTest.java b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/sdnc/lcm/beans/LcmDmaapRequestTest.java
new file mode 100644
index 0000000..709a557
--- /dev/null
+++ b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/sdnc/lcm/beans/LcmDmaapRequestTest.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.client.sdnc.lcm.beans;
+
+import org.junit.Test;
+import org.onap.so.client.sdnc.common.SDNCConstants;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+public class LcmDmaapRequestTest extends LcmBeanTest {
+    private static String expectedLcmDmaapRequest = "{" + "\"version\":\"1.0\"," + "\"type\":\"request\","
+            + "\"cambria.partition\":\"MSO\","
+            + "\"correlation-id\":\"9f77f437-1515-44bd-a420-0aaf8a3c31a0-c197a4b5-18d9-48a2-ad2d-a3b56858501c\","
+            + "\"rpc-name\":\"test-operation\"," + "\"body\":" + LcmRestRequestTest.getExpectedLcmRestRequest() + "}";
+
+    public LcmDmaapRequest buildLcmDmaapRequest() {
+        LcmDmaapRequest lcmDmaapRequest = new LcmDmaapRequest();
+
+        LcmRestRequestTest lcmRestRequestTest = new LcmRestRequestTest();
+        LcmRestRequest lcmRestRequest = lcmRestRequestTest.buildLcmRestRequest();
+        LcmCommonHeader lcmCommonHeader = lcmRestRequest.getInput().getCommonHeader();
+        String correlationId = lcmCommonHeader.getRequestId() + "-" + lcmCommonHeader.getSubRequestId();
+
+        lcmDmaapRequest.setVersion(SDNCConstants.LCM_DMAAP_MSG_VER);
+        lcmDmaapRequest.setType(SDNCConstants.LCM_DMAAP_MSG_TYPE_REQUEST);
+        lcmDmaapRequest.setCambriaPartition(SDNCConstants.SYSTEM_NAME);
+        lcmDmaapRequest.setCorrelationId(correlationId);
+        lcmDmaapRequest.setRpcName(operation);
+        lcmDmaapRequest.setBody(lcmRestRequest);
+
+        return lcmDmaapRequest;
+    }
+
+    public static String getExpectedLcmDmaapRequest() {
+        return expectedLcmDmaapRequest;
+    }
+
+    @Test
+    public final void testLcmDmaapRequest() {
+        LcmDmaapRequest lcmDmaapRequest = buildLcmDmaapRequest();
+
+        try {
+            String lcmDmaapRequestString = convertToSting(lcmDmaapRequest);
+            assertEquals(expectedLcmDmaapRequest, lcmDmaapRequestString);
+        } catch (Exception e) {
+            fail("Convert LcmDmaapRequest to String error: " + e.toString());
+        }
+    }
+}
diff --git a/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/sdnc/lcm/beans/LcmDmaapResponseTest.java b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/sdnc/lcm/beans/LcmDmaapResponseTest.java
new file mode 100644
index 0000000..0cdbeeb
--- /dev/null
+++ b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/sdnc/lcm/beans/LcmDmaapResponseTest.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.client.sdnc.lcm.beans;
+
+import org.junit.Test;
+import org.onap.so.client.sdnc.common.SDNCConstants;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+public class LcmDmaapResponseTest extends LcmBeanTest {
+    private static String expectedLcmDmaapResponse = "{" + "\"version\":\"1.0\"," + "\"type\":\"response\","
+            + "\"cambria.partition\":\"MSO\","
+            + "\"correlation-id\":\"9f77f437-1515-44bd-a420-0aaf8a3c31a0-c197a4b5-18d9-48a2-ad2d-a3b56858501c\","
+            + "\"rpc-name\":\"test-operation\"," + "\"body\":" + LcmRestResponseTest.getExpectedLcmRestResponse() + "}";
+
+    public LcmDmaapResponse buildLcmDmaapResponse() {
+        LcmDmaapResponse lcmDmaapResponse = new LcmDmaapResponse();
+
+        LcmRestResponseTest lcmRestResponseTest = new LcmRestResponseTest();
+        LcmRestResponse lcmRestResponse = lcmRestResponseTest.buildLcmRestResponse();
+        LcmCommonHeader lcmCommonHeader = lcmRestResponse.getOutput().getCommonHeader();
+        String correlationId = lcmCommonHeader.getRequestId() + "-" + lcmCommonHeader.getSubRequestId();
+
+        lcmDmaapResponse.setVersion(SDNCConstants.LCM_DMAAP_MSG_VER);
+        lcmDmaapResponse.setType(SDNCConstants.LCM_DMAAP_MSG_TYPE_RESPONSE);
+        lcmDmaapResponse.setCambriaPartition(SDNCConstants.SYSTEM_NAME);
+        lcmDmaapResponse.setCorrelationId(correlationId);
+        lcmDmaapResponse.setRpcName(operation);
+        lcmDmaapResponse.setBody(lcmRestResponse);
+
+        return lcmDmaapResponse;
+    }
+
+    public static String getExpectedLcmDmaapResponse() {
+        return expectedLcmDmaapResponse;
+    }
+
+    @Test
+    public final void testLcmDmaapResponse() {
+        LcmDmaapResponse lcmDmaapResponse = buildLcmDmaapResponse();
+
+        try {
+            String lcmDmaapResponseString = convertToSting(lcmDmaapResponse);
+            assertEquals(expectedLcmDmaapResponse, lcmDmaapResponseString);
+        } catch (Exception e) {
+            fail("Convert LcmDmaapResponse to String error: " + e.toString());
+        }
+    }
+}
diff --git a/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/sdnc/lcm/beans/LcmInputTest.java b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/sdnc/lcm/beans/LcmInputTest.java
new file mode 100644
index 0000000..b8c34fc
--- /dev/null
+++ b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/sdnc/lcm/beans/LcmInputTest.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.client.sdnc.lcm.beans;
+
+import org.junit.Test;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+public class LcmInputTest extends LcmBeanTest {
+    private static String expectedLcmInput = "{" + "\"common-header\":{" + "\"api-ver\":\"2.00\","
+            + "\"flags\":{\"mode\":\"NORMAL\",\"force\":\"FALSE\",\"ttl\":65000}," + "\"originator-id\":\"MSO\","
+            + "\"request-id\":\"9f77f437-1515-44bd-a420-0aaf8a3c31a0\","
+            + "\"sub-request-id\":\"c197a4b5-18d9-48a2-ad2d-a3b56858501c\","
+            + "\"timestamp\":\"2020-02-25T10:20:28.116Z\"" + "}," + "\"action\":\"TestAction\","
+            + "\"action-identifiers\":{\"pnf-name\":\"testpnf\"},"
+            + "\"payload\":\"{\\\"testPayload\\\": \\\"input test\\\"}\"}";
+
+    public LcmInput buildLcmInput() {
+        LcmInput lcmInput = new LcmInput();
+
+        LcmCommonHeader lcmCommonHeader = buildLcmCommonHeader();
+
+        LcmActionIdentifiers lcmActionIdentifiers = new LcmActionIdentifiers();
+        lcmActionIdentifiers.setPnfName(pnfName);
+
+        lcmInput.setCommonHeader(lcmCommonHeader);
+        lcmInput.setAction(action);
+        lcmInput.setActionIdentifiers(lcmActionIdentifiers);
+        lcmInput.setPayload(inputPayload);
+
+        return lcmInput;
+    }
+
+    public static String getExpectedLcmInput() {
+        return expectedLcmInput;
+    }
+
+    @Test
+    public final void testLcmInput() {
+        LcmInput lcmInput = buildLcmInput();
+
+        try {
+            String lcmInputString = convertToSting(lcmInput);
+            assertEquals(expectedLcmInput, lcmInputString);
+        } catch (Exception e) {
+            fail("Convert LcmInput to String error: " + e.toString());
+        }
+    }
+}
diff --git a/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/sdnc/lcm/beans/LcmOutputTest.java b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/sdnc/lcm/beans/LcmOutputTest.java
new file mode 100644
index 0000000..1530be3
--- /dev/null
+++ b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/sdnc/lcm/beans/LcmOutputTest.java
@@ -0,0 +1,84 @@
+/*-
+ * ============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.client.sdnc.lcm.beans;
+
+import org.junit.Test;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+import org.onap.so.client.sdnc.common.SDNCConstants;
+
+public class LcmOutputTest extends LcmBeanTest {
+    private static String expectedLcmOutput = "{" + "\"common-header\":{" + "\"api-ver\":\"2.00\","
+            + "\"originator-id\":\"MSO\"," + "\"request-id\":\"9f77f437-1515-44bd-a420-0aaf8a3c31a0\","
+            + "\"sub-request-id\":\"c197a4b5-18d9-48a2-ad2d-a3b56858501c\"" + "},"
+            + "\"status\":{\"code\":400,\"message\":\"Test output message\"},"
+            + "\"payload\":\"{\\\"testPayload\\\": \\\"output test\\\"}\"}";
+
+    @Override
+    public LcmCommonHeader buildLcmCommonHeader() {
+        LcmCommonHeader lcmCommonHeader = new LcmCommonHeader();
+
+        lcmCommonHeader.setApiVer(SDNCConstants.LCM_API_VER);
+        lcmCommonHeader.setOriginatorId(SDNCConstants.SYSTEM_NAME);
+        lcmCommonHeader.setRequestId(requestId);
+        lcmCommonHeader.setSubRequestId(subRequestId);
+
+        return lcmCommonHeader;
+    }
+
+    public LcmStatus buildLcmStatus() {
+        LcmStatus lcmStatus = new LcmStatus();
+
+        lcmStatus.setCode(400);
+        lcmStatus.setMessage("Test output message");
+
+        return lcmStatus;
+    }
+
+    public LcmOutput buildLcmOutput() {
+        LcmOutput lcmOutput = new LcmOutput();
+
+        LcmCommonHeader lcmCommonHeader = buildLcmCommonHeader();
+        LcmStatus lcmStatus = buildLcmStatus();
+
+        lcmOutput.setCommonHeader(lcmCommonHeader);
+        lcmOutput.setStatus(lcmStatus);
+        lcmOutput.setPayload(outputPayload);
+
+        return lcmOutput;
+    }
+
+    public static String getExpectedLcmOutput() {
+        return expectedLcmOutput;
+    }
+
+    @Test
+    public final void testLcmOutput() {
+        LcmOutput lcmOutput = buildLcmOutput();
+
+        try {
+            String lcmOutputString = convertToSting(lcmOutput);
+            assertEquals(expectedLcmOutput, lcmOutputString);
+        } catch (Exception e) {
+            fail("Convert LcmOutput to String error: " + e.toString());
+        }
+    }
+}
diff --git a/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/sdnc/lcm/beans/LcmRestRequestTest.java b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/sdnc/lcm/beans/LcmRestRequestTest.java
new file mode 100644
index 0000000..c078326
--- /dev/null
+++ b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/sdnc/lcm/beans/LcmRestRequestTest.java
@@ -0,0 +1,54 @@
+/*-
+ * ============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.client.sdnc.lcm.beans;
+
+import org.junit.Test;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+public class LcmRestRequestTest extends LcmBeanTest {
+    private static String expectedLcmRestRequest = "{" + "\"input\":" + LcmInputTest.getExpectedLcmInput() + "}";
+
+    public LcmRestRequest buildLcmRestRequest() {
+        LcmRestRequest lcmRestRequest = new LcmRestRequest();
+
+        LcmInputTest lcmInputTest = new LcmInputTest();
+        lcmRestRequest.setInput(lcmInputTest.buildLcmInput());
+
+        return lcmRestRequest;
+    }
+
+    public static String getExpectedLcmRestRequest() {
+        return expectedLcmRestRequest;
+    }
+
+    @Test
+    public final void testLcmRestRequest() {
+        LcmRestRequest lcmRestRequest = buildLcmRestRequest();
+
+        try {
+            String lcmRestRequestString = convertToSting(lcmRestRequest);
+            assertEquals(expectedLcmRestRequest, lcmRestRequestString);
+        } catch (Exception e) {
+            fail("Convert LcmRestRequest to String error: " + e.toString());
+        }
+    }
+}
diff --git a/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/sdnc/lcm/beans/LcmRestResponseTest.java b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/sdnc/lcm/beans/LcmRestResponseTest.java
new file mode 100644
index 0000000..5867acb
--- /dev/null
+++ b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/sdnc/lcm/beans/LcmRestResponseTest.java
@@ -0,0 +1,54 @@
+/*-
+ * ============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.client.sdnc.lcm.beans;
+
+import org.junit.Test;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+public class LcmRestResponseTest extends LcmBeanTest {
+    private static String expectedLcmRestResponse = "{" + "\"output\":" + LcmOutputTest.getExpectedLcmOutput() + "}";
+
+    public LcmRestResponse buildLcmRestResponse() {
+        LcmRestResponse lcmRestResponse = new LcmRestResponse();
+
+        LcmOutputTest lcmOutputTest = new LcmOutputTest();
+        lcmRestResponse.setOutput(lcmOutputTest.buildLcmOutput());
+
+        return lcmRestResponse;
+    }
+
+    public static String getExpectedLcmRestResponse() {
+        return expectedLcmRestResponse;
+    }
+
+    @Test
+    public final void testLcmRestResponse() {
+        LcmRestResponse lcmRestResponse = buildLcmRestResponse();
+
+        try {
+            String lcmRestResponseString = convertToSting(lcmRestResponse);
+            assertEquals(expectedLcmRestResponse, lcmRestResponseString);
+        } catch (Exception e) {
+            fail("Convert LcmRestResponse to String error: " + e.toString());
+        }
+    }
+}
diff --git a/bpmn/so-bpmn-infrastructure-flows/src/main/resources/process/CreateSliceService.bpmn b/bpmn/so-bpmn-infrastructure-flows/src/main/resources/process/CreateSliceService.bpmn
new file mode 100644
index 0000000..3e1c117
--- /dev/null
+++ b/bpmn/so-bpmn-infrastructure-flows/src/main/resources/process/CreateSliceService.bpmn
@@ -0,0 +1,808 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="Definitions_1wio50w" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="3.1.2">
+  <bpmn:process id="Process_0r5eb97" isExecutable="true">
+    <bpmn:startEvent id="StartEvent_1nbljfd" name="Create Slice Service Creation Flow">
+      <bpmn:outgoing>SequenceFlow_03s744c</bpmn:outgoing>
+    </bpmn:startEvent>
+    <bpmn:intermediateCatchEvent id="IntermediateCatchEvent_0vilb24" name="Waiting for confirmation">
+      <bpmn:outgoing>SequenceFlow_1fk37v7</bpmn:outgoing>
+      <bpmn:linkEventDefinition id="LinkEventDefinition_197u5pe" name="WaitingForConfirmation" />
+    </bpmn:intermediateCatchEvent>
+    <bpmn:scriptTask id="ScriptTask_1tc44ge" name="PreProcess Incoming Request" scriptFormat="groovy">
+      <bpmn:incoming>SequenceFlow_03s744c</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_07e12rt</bpmn:outgoing>
+      <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.*
+def css= new CreateSliceService()
+css.preProcessRequest(execution)</bpmn:script>
+    </bpmn:scriptTask>
+    <bpmn:scriptTask id="ScriptTask_1jgtb0y" name="Process User Options" scriptFormat="groovy">
+      <bpmn:incoming>SequenceFlow_1cv0wop</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_197cm2e</bpmn:outgoing>
+      <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.*
+def css = new CreateSliceService()
+css.processUserOptions(execution)</bpmn:script>
+    </bpmn:scriptTask>
+    <bpmn:exclusiveGateway id="ExclusiveGateway_0elbczl" name="Continue Slice?" default="SequenceFlow_038lb9m">
+      <bpmn:incoming>SequenceFlow_197cm2e</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_12t5exy</bpmn:outgoing>
+      <bpmn:outgoing>SequenceFlow_038lb9m</bpmn:outgoing>
+    </bpmn:exclusiveGateway>
+    <bpmn:scriptTask id="ScriptTask_0l3d1ai" name="Process Decomposition" scriptFormat="groovy">
+      <bpmn:incoming>SequenceFlow_1t19ips</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_0jrclmc</bpmn:outgoing>
+      <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.*
+def css = new CreateSliceService()
+css.processDecomposition(execution)</bpmn:script>
+    </bpmn:scriptTask>
+    <bpmn:scriptTask id="ScriptTask_1eo3m4q" name="Get NST Selection" scriptFormat="groovy">
+      <bpmn:incoming>SequenceFlow_046irye</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_1o23s0i</bpmn:outgoing>
+      <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.*
+def css = new CreateSliceService()
+css.getNSTSelection(execution)</bpmn:script>
+    </bpmn:scriptTask>
+    <bpmn:callActivity id="CallActivity_139l55g" name="Call DoCreateSliceServiceInstance&#10;" calledElement="DoCreateSliceServiceInstance">
+      <bpmn:extensionElements>
+        <camunda:in source="msoRequestId" target="msoRequestId" />
+        <camunda:in source="serviceInstanceId" target="serviceInstanceId" />
+        <camunda:in source="serviceInstanceName" target="serviceInstanceName" />
+        <camunda:in source="serviceModelInfo" target="serviceModelInfo" />
+        <camunda:in source="productFamilyId" target="productFamilyId" />
+        <camunda:in source="serviceInputParams" target="serviceInputParams" />
+        <camunda:in source="globalSubscriberId" target="globalSubscriberId" />
+        <camunda:in source="subscriptionServiceType" target="subscriptionServiceType" />
+        <camunda:in source="serviceType" target="serviceType" />
+        <camunda:in source="uuiRequest" target="uuiRequest" />
+        <camunda:in source="requestAction" target="operationType" />
+        <camunda:in source="operationId" target="operationId" />
+        <camunda:in source="serviceProfile" target="serviceProfile" />
+        <camunda:in source="sliceProfileTn" target="sliceProfileTn" />
+        <camunda:in source="sliceProfileCn" target="sliceProfileCn" />
+        <camunda:in source="sliceProfileAn" target="sliceProfileAn" />
+        <camunda:in source="sliceServiceDecomposition" target="sliceServiceDecomposition" />
+        <camunda:out source="WorkflowException" target="WorkflowException" />
+        <camunda:out source="rollbackData" target="rollbackData" />
+        <camunda:out source="rolledBack" target="rolledBack" />
+        <camunda:out source="allottedResourceId" target="allottedResourceId" />
+        <camunda:out source="serviceInstanceData" target="serviceInstanceData" />
+      </bpmn:extensionElements>
+      <bpmn:incoming>SequenceFlow_1p8vxo5</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_1g8m7tq</bpmn:outgoing>
+    </bpmn:callActivity>
+    <bpmn:intermediateThrowEvent id="IntermediateThrowEvent_1v96asi" name="Goto Waiting for Confirmation">
+      <bpmn:incoming>SequenceFlow_0it2g9j</bpmn:incoming>
+      <bpmn:linkEventDefinition id="LinkEventDefinition_0uj34dx" name="WaitingForConfirmation" />
+    </bpmn:intermediateThrowEvent>
+    <bpmn:scriptTask id="ScriptTask_0gb975b" name="Prepare Update Orchestration Task" scriptFormat="groovy">
+      <bpmn:incoming>SequenceFlow_1aaozcg</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_18kur12</bpmn:outgoing>
+      <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.*
+execution.setVariable("taskStatus", "WaitingToConfirm")
+def css = new CreateSliceService()
+css.prepareUpdateOrchestrationTask(execution)</bpmn:script>
+    </bpmn:scriptTask>
+    <bpmn:exclusiveGateway id="ExclusiveGateway_18eld2o" name="Is Slice Successful?" default="SequenceFlow_1c6ka9h">
+      <bpmn:incoming>SequenceFlow_0mlrlbv</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_1c6ka9h</bpmn:outgoing>
+      <bpmn:outgoing>SequenceFlow_0n4xku8</bpmn:outgoing>
+    </bpmn:exclusiveGateway>
+    <bpmn:endEvent id="EndEvent_0x406rw">
+      <bpmn:incoming>SequenceFlow_1c6ka9h</bpmn:incoming>
+      <bpmn:errorEventDefinition id="ErrorEventDefinition_0mlneuw" errorRef="Error_03akl5v" />
+    </bpmn:endEvent>
+    <bpmn:subProcess id="SubProcess_1yv9i68" name="Sub-process for FalloutHandler and Rollback" triggeredByEvent="true">
+      <bpmn:startEvent id="StartEvent_1omdx56">
+        <bpmn:outgoing>SequenceFlow_1w67v6s</bpmn:outgoing>
+        <bpmn:errorEventDefinition id="ErrorEventDefinition_06xcioh" />
+      </bpmn:startEvent>
+      <bpmn:endEvent id="EndEvent_1jx3026">
+        <bpmn:incoming>SequenceFlow_08mlzwz</bpmn:incoming>
+      </bpmn:endEvent>
+      <bpmn:scriptTask id="ScriptTask_1swzdpw" name="Handle Unexpected Error" scriptFormat="groovy">
+        <bpmn:incoming>SequenceFlow_1w67v6s</bpmn:incoming>
+        <bpmn:outgoing>SequenceFlow_08mlzwz</bpmn:outgoing>
+        <bpmn:script>import org.onap.so.bpmn.common.scripts.*
+ExceptionUtil ex = new ExceptionUtil()
+ex.processJavaException(execution)</bpmn:script>
+      </bpmn:scriptTask>
+      <bpmn:sequenceFlow id="SequenceFlow_1w67v6s" sourceRef="StartEvent_1omdx56" targetRef="ScriptTask_1swzdpw" />
+      <bpmn:sequenceFlow id="SequenceFlow_08mlzwz" sourceRef="ScriptTask_1swzdpw" targetRef="EndEvent_1jx3026" />
+    </bpmn:subProcess>
+    <bpmn:scriptTask id="ScriptTask_1ef3voz" name="Prepare Update Orchestration Task" scriptFormat="groovy">
+      <bpmn:incoming>SequenceFlow_0kixzdj</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_0klb3ey</bpmn:outgoing>
+      <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.*
+execution.setVariable("taskStatus", "Completed")
+def css = new CreateSliceService()
+css.prepareUpdateOrchestrationTask(execution)</bpmn:script>
+    </bpmn:scriptTask>
+    <bpmn:endEvent id="EndEvent_05h01gx" name="End">
+      <bpmn:incoming>SequenceFlow_11rbv41</bpmn:incoming>
+    </bpmn:endEvent>
+    <bpmn:scriptTask id="ScriptTask_1xxag1o" name="Init Service Operation Status" scriptFormat="groovy">
+      <bpmn:incoming>SequenceFlow_07e12rt</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_0t094g7</bpmn:outgoing>
+      <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.*
+def css = new CreateSliceService()
+css.prepareInitServiceOperationStatus(execution)</bpmn:script>
+    </bpmn:scriptTask>
+    <bpmn:intermediateThrowEvent id="IntermediateThrowEvent_1ex8ke9" name="Goto Create Slice Service">
+      <bpmn:incoming>SequenceFlow_0jrclmc</bpmn:incoming>
+      <bpmn:linkEventDefinition id="LinkEventDefinition_0de65en" name="CreateSliceService" />
+    </bpmn:intermediateThrowEvent>
+    <bpmn:intermediateCatchEvent id="IntermediateCatchEvent_1wii8im" name="Create Slice Service">
+      <bpmn:outgoing>SequenceFlow_1o1tu0f</bpmn:outgoing>
+      <bpmn:linkEventDefinition id="LinkEventDefinition_1krpcdk" name="CreateSliceService" />
+    </bpmn:intermediateCatchEvent>
+    <bpmn:scriptTask id="ScriptTask_1ssh2l9" name="Prepare Update Service Oper Status((finish)" scriptFormat="groovy">
+      <bpmn:incoming>SequenceFlow_0lbdfmt</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_1qv8qw1</bpmn:outgoing>
+      <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.*
+execution.setVariable("operationProgress", "100")
+execution.setVariable("operationResult", "finished")
+execution.setVariable("operationReason", "Slice completed")
+def css = new CreateSliceService()
+css.prepareUpdateServiceOperationStatus(execution)</bpmn:script>
+    </bpmn:scriptTask>
+    <bpmn:serviceTask id="ServiceTask_0kd6p6p" name="Update Service Operation Status">
+      <bpmn:extensionElements>
+        <camunda:connector>
+          <camunda:inputOutput>
+            <camunda:inputParameter name="url">${CSSOS_dbAdapterEndpoint}</camunda:inputParameter>
+            <camunda:inputParameter name="headers">
+              <camunda:script scriptFormat="groovy">execution.getVariable("CSSOS_headerMap")</camunda:script>
+            </camunda:inputParameter>
+            <camunda:inputParameter name="payload">${CSSOS_updateServiceOperStatusRequest}</camunda:inputParameter>
+            <camunda:inputParameter name="method">POST</camunda:inputParameter>
+            <camunda:outputParameter name="CSSOS_dbResponseCode">${statusCode}</camunda:outputParameter>
+            <camunda:outputParameter name="CSSOS_dbResponse">${response}</camunda:outputParameter>
+          </camunda:inputOutput>
+          <camunda:connectorId>http-connector</camunda:connectorId>
+        </camunda:connector>
+      </bpmn:extensionElements>
+      <bpmn:incoming>SequenceFlow_0t094g7</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_046irye</bpmn:outgoing>
+    </bpmn:serviceTask>
+    <bpmn:callActivity id="CallActivity_1bnkmaz" name="Call Decompose Service" calledElement="DecomposeService">
+      <bpmn:extensionElements>
+        <camunda:in source="msoRequestId" target="msoRequestId" />
+        <camunda:in source="serviceInstanceId" target="serviceInstanceId" />
+        <camunda:in source="serviceModelInfo" target="serviceModelInfo" />
+        <camunda:in source="isDebugLogEnabled" target="isDebugLogEnabled" />
+        <camunda:out source="serviceDecomposition" target="sliceServiceDecomposition" />
+        <camunda:out source="WorkflowException" target="WorkflowException" />
+      </bpmn:extensionElements>
+      <bpmn:incoming>SequenceFlow_0q7yc2c</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_1t19ips</bpmn:outgoing>
+    </bpmn:callActivity>
+    <bpmn:scriptTask id="ScriptTask_0o2r07o" name="Prepare&#10;Decompose&#10;Service&#10;" scriptFormat="groovy">
+      <bpmn:incoming>SequenceFlow_1o23s0i</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_0q7yc2c</bpmn:outgoing>
+      <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.*
+def dcsi= new CreateSliceService()
+dcsi.prepareDecomposeService(execution)</bpmn:script>
+    </bpmn:scriptTask>
+    <bpmn:scriptTask id="ScriptTask_0b7senu" name="Prepare Create OrchestrationTask" scriptFormat="groovy">
+      <bpmn:incoming>SequenceFlow_1o1tu0f</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_1sq6kp6</bpmn:outgoing>
+      <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.*
+def css= new CreateSliceService()
+css.prepareCreateOrchestrationTask(execution)</bpmn:script>
+    </bpmn:scriptTask>
+    <bpmn:callActivity id="CallActivity_0h88mep" name="Call HandleOrchestrationTask" calledElement="HandleOrchestrationTask">
+      <bpmn:extensionElements>
+        <camunda:out source="statusCode" target="CSSOT_dbResponseCode" />
+        <camunda:out source="response" target="CSSOT_dbResponse" />
+        <camunda:in source="CSSOT_taskId" target="taskId" />
+        <camunda:in source="msoRequestId" target="requestId" />
+        <camunda:in source="CSSOT_name" target="taskName" />
+        <camunda:in source="CSSOT_status" target="taskStatus" />
+        <camunda:in source="CSSOT_isManual" target="isManual" />
+        <camunda:in source="CSSOT_paramJson" target="paramJson" />
+        <camunda:in source="CSSOT_requestMethod" target="method" />
+      </bpmn:extensionElements>
+      <bpmn:incoming>SequenceFlow_1sq6kp6</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_1p8vxo5</bpmn:outgoing>
+    </bpmn:callActivity>
+    <bpmn:callActivity id="CallActivity_0n47zoh" name="Call HandleOrchestrationTask" calledElement="HandleOrchestrationTask">
+      <bpmn:extensionElements>
+        <camunda:out source="statusCode" target="CSSOT_dbResponseCode" />
+        <camunda:out source="response" target="CSSOT_dbResponse" />
+        <camunda:in source="CSSOT_taskId" target="taskId" />
+        <camunda:in source="msoRequestId" target="requestId" />
+        <camunda:in source="CSSOT_name" target="taskName" />
+        <camunda:in source="CSSOT_status" target="taskStatus" />
+        <camunda:in source="CSSOT_isManual" target="isManual" />
+        <camunda:in source="CSSOT_paramJson" target="paramJson" />
+        <camunda:in source="CSSOT_requestMethod" target="method" />
+      </bpmn:extensionElements>
+      <bpmn:incoming>SequenceFlow_18kur12</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_0it2g9j</bpmn:outgoing>
+    </bpmn:callActivity>
+    <bpmn:scriptTask id="ScriptTask_12h8542" name="Prepare Update Orchestration Task" scriptFormat="groovy">
+      <bpmn:incoming>SequenceFlow_12t5exy</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_0thd6ny</bpmn:outgoing>
+      <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.*
+execution.setVariable("taskStatus", "Creating")
+def css = new CreateSliceService()
+css.prepareUpdateOrchestrationTask(execution)</bpmn:script>
+    </bpmn:scriptTask>
+    <bpmn:callActivity id="CallActivity_0o89wmf" name="Call HandleOrchestrationTask" calledElement="HandleOrchestrationTask">
+      <bpmn:extensionElements>
+        <camunda:out source="statusCode" target="CSSOT_dbResponseCode" />
+        <camunda:out source="response" target="CSSOT_dbResponse" />
+        <camunda:in source="CSSOT_taskId" target="taskId" />
+        <camunda:in source="msoRequestId" target="requestId" />
+        <camunda:in source="CSSOT_name" target="taskName" />
+        <camunda:in source="CSSOT_status" target="taskStatus" />
+        <camunda:in source="CSSOT_isManual" target="isManual" />
+        <camunda:in source="CSSOT_paramJson" target="paramJson" />
+        <camunda:in source="CSSOT_requestMethod" target="method" />
+      </bpmn:extensionElements>
+      <bpmn:incoming>SequenceFlow_0thd6ny</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_0477975</bpmn:outgoing>
+    </bpmn:callActivity>
+    <bpmn:callActivity id="CallActivity_0g98b71" name="Call HandleOrchestrationTask" calledElement="HandleOrchestrationTask">
+      <bpmn:extensionElements>
+        <camunda:out source="statusCode" target="CSSOT_dbResponseCode" />
+        <camunda:out source="response" target="CSSOT_dbResponse" />
+        <camunda:in source="CSSOT_taskId" target="taskId" />
+        <camunda:in source="msoRequestId" target="requestId" />
+        <camunda:in source="CSSOT_name" target="taskName" />
+        <camunda:in source="CSSOT_status" target="taskStatus" />
+        <camunda:in source="CSSOT_isManual" target="isManual" />
+        <camunda:in source="CSSOT_paramJson" target="paramJson" />
+        <camunda:in source="CSSOT_requestMethod" target="method" />
+      </bpmn:extensionElements>
+      <bpmn:incoming>SequenceFlow_0h2oree</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_1cv0wop</bpmn:outgoing>
+    </bpmn:callActivity>
+    <bpmn:scriptTask id="ScriptTask_08wim95" name="Prepare Get User Options" scriptFormat="groovy">
+      <bpmn:incoming>SequenceFlow_16uz2t9</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_0h2oree</bpmn:outgoing>
+      <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.*
+def css = new CreateSliceService()
+css.prepareGetUserOptions(execution)</bpmn:script>
+    </bpmn:scriptTask>
+    <bpmn:callActivity id="CallActivity_0jdzpem" name="Call HandleOrchestrationTask" calledElement="HandleOrchestrationTask">
+      <bpmn:extensionElements>
+        <camunda:out source="statusCode" target="CSSOT_dbResponseCode" />
+        <camunda:out source="response" target="CSSOT_dbResponse" />
+        <camunda:in source="CSSOT_taskId" target="taskId" />
+        <camunda:in source="msoRequestId" target="requestId" />
+        <camunda:in source="CSSOT_name" target="taskName" />
+        <camunda:in source="CSSOT_status" target="taskStatus" />
+        <camunda:in source="CSSOT_isManual" target="isManual" />
+        <camunda:in source="CSSOT_paramJson" target="paramJson" />
+        <camunda:in source="CSSOT_requestMethod" target="method" />
+      </bpmn:extensionElements>
+      <bpmn:incoming>SequenceFlow_19lsayh</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_10ng1vx</bpmn:outgoing>
+    </bpmn:callActivity>
+    <bpmn:scriptTask id="ScriptTask_1mscu5w" name="Prepare Update Orchestration Task" scriptFormat="groovy">
+      <bpmn:incoming>SequenceFlow_038lb9m</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_19lsayh</bpmn:outgoing>
+      <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.*
+execution.setVariable("taskStatus", "Aborted")
+def css = new CreateSliceService()
+css.prepareUpdateOrchestrationTask(execution)</bpmn:script>
+    </bpmn:scriptTask>
+    <bpmn:intermediateCatchEvent id="IntermediateCatchEvent_0pkvfun" name="Allocate Slice">
+      <bpmn:outgoing>SequenceFlow_1bevt3a</bpmn:outgoing>
+      <bpmn:linkEventDefinition id="LinkEventDefinition_1vlfclx" name="AllocateSlice" />
+    </bpmn:intermediateCatchEvent>
+    <bpmn:intermediateThrowEvent id="IntermediateThrowEvent_0ktwpki" name="Goto Allocate Slice">
+      <bpmn:incoming>SequenceFlow_0477975</bpmn:incoming>
+      <bpmn:linkEventDefinition id="LinkEventDefinition_16f2ri9" name="AllocateSlice" />
+    </bpmn:intermediateThrowEvent>
+    <bpmn:callActivity id="CallActivity_15pl4ld" name="Call HandleOrchestrationTask" calledElement="HandleOrchestrationTask">
+      <bpmn:extensionElements>
+        <camunda:out source="statusCode" target="CSSOT_dbResponseCode" />
+        <camunda:out source="response" target="CSSOT_dbResponse" />
+        <camunda:in source="CSSOT_taskId" target="taskId" />
+        <camunda:in source="msoRequestId" target="requestId" />
+        <camunda:in source="CSSOT_name" target="taskName" />
+        <camunda:in source="CSSOT_status" target="taskStatus" />
+        <camunda:in source="CSSOT_isManual" target="isManual" />
+        <camunda:in source="CSSOT_paramJson" target="paramJson" />
+        <camunda:in source="CSSOT_requestMethod" target="method" />
+      </bpmn:extensionElements>
+      <bpmn:incoming>SequenceFlow_0klb3ey</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_0lbdfmt</bpmn:outgoing>
+    </bpmn:callActivity>
+    <bpmn:endEvent id="EndEvent_1oouvuh" name="End">
+      <bpmn:incoming>SequenceFlow_10ng1vx</bpmn:incoming>
+    </bpmn:endEvent>
+    <bpmn:serviceTask id="ServiceTask_0esr949" name="Update Service Operation Status">
+      <bpmn:extensionElements>
+        <camunda:connector>
+          <camunda:inputOutput>
+            <camunda:inputParameter name="url">${CSSOS_dbAdapterEndpoint}</camunda:inputParameter>
+            <camunda:inputParameter name="headers">
+              <camunda:script scriptFormat="groovy">execution.getVariable("CSSOS_headerMap")</camunda:script>
+            </camunda:inputParameter>
+            <camunda:inputParameter name="payload">${CSSOS_updateServiceOperStatusRequest}</camunda:inputParameter>
+            <camunda:inputParameter name="method">POST</camunda:inputParameter>
+            <camunda:outputParameter name="CSSOS_dbResponseCode">${statusCode}</camunda:outputParameter>
+            <camunda:outputParameter name="CSSOS_dbResponse">${response}</camunda:outputParameter>
+          </camunda:inputOutput>
+          <camunda:connectorId>http-connector</camunda:connectorId>
+        </camunda:connector>
+      </bpmn:extensionElements>
+      <bpmn:incoming>SequenceFlow_1qv8qw1</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_11rbv41</bpmn:outgoing>
+    </bpmn:serviceTask>
+    <bpmn:scriptTask id="ScriptTask_1jj846g" name="Send Sync Ack Response" scriptFormat="groovy">
+      <bpmn:incoming>SequenceFlow_1g8m7tq</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_1ey6m1e</bpmn:outgoing>
+      <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.*
+def css = new CreateSliceService()
+css.sendSyncResponse(execution)</bpmn:script>
+    </bpmn:scriptTask>
+    <bpmn:callActivity id="CallActivity_0cxst1i" name="Call DoAllocateNSIandNSSI&#10;" calledElement="DoAllocateNSIandNSSI">
+      <bpmn:extensionElements>
+        <camunda:in source="msoRequestId" target="msoRequestId" />
+        <camunda:in source="serviceInstanceId" target="sliceServiceInstanceId" />
+        <camunda:in source="serviceInstanceName" target="sliceServiceInstanceName" />
+        <camunda:in source="serviceModelInfo" target="serviceModelInfo" />
+        <camunda:in source="productFamilyId" target="productFamilyId" />
+        <camunda:in source="disableRollback" target="disableRollback" />
+        <camunda:in source="serviceInputParams" target="serviceInputParams" />
+        <camunda:in source="globalSubscriberId" target="globalSubscriberId" />
+        <camunda:in source="subscriptionServiceType" target="subscriptionServiceType" />
+        <camunda:in source="serviceType" target="serviceType" />
+        <camunda:in source="uuiRequest" target="uuiRequest" />
+        <camunda:in source="requestAction" target="operationType" />
+        <camunda:in source="operationId" target="operationId" />
+        <camunda:in source="serviceProfile" target="serviceProfile" />
+        <camunda:in source="sliceProfileTn" target="sliceProfileTn" />
+        <camunda:in source="sliceProfileCn" target="sliceProfileCn" />
+        <camunda:in source="sliceProfileAn" target="sliceProfileAn" />
+        <camunda:in source="sliceTaskParams" target="sliceTaskParams" />
+        <camunda:in source="CSSOT_taskId" target="taskId" />
+        <camunda:in source="CSSOT_name" target="taskName" />
+        <camunda:in source="CSSOT_status" target="taskStatus" />
+        <camunda:in source="CSSOT_isManual" target="isManual" />
+        <camunda:in source="resourceSharingLevel" target="resourceSharingLevel" />
+        <camunda:in source="globalSubscriberId" target="globalSubscriberId" />
+        <camunda:out source="WorkflowException" target="WorkflowException" />
+        <camunda:out source="rollbackData" target="rollbackData" />
+        <camunda:out source="rolledBack" target="rolledBack" />
+        <camunda:in source="allottedResourceId" target="allottedResourceId" />
+      </bpmn:extensionElements>
+      <bpmn:incoming>SequenceFlow_1bevt3a</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_0mlrlbv</bpmn:outgoing>
+    </bpmn:callActivity>
+    <bpmn:endEvent id="EndEvent_0bh0kwx">
+      <bpmn:incoming>SequenceFlow_12qt5ci</bpmn:incoming>
+      <bpmn:errorEventDefinition id="ErrorEventDefinition_1xa66sx" errorRef="Error_0p2naox" />
+    </bpmn:endEvent>
+    <bpmn:sequenceFlow id="SequenceFlow_03s744c" sourceRef="StartEvent_1nbljfd" targetRef="ScriptTask_1tc44ge" />
+    <bpmn:sequenceFlow id="SequenceFlow_07e12rt" sourceRef="ScriptTask_1tc44ge" targetRef="ScriptTask_1xxag1o" />
+    <bpmn:sequenceFlow id="SequenceFlow_1cv0wop" sourceRef="CallActivity_0g98b71" targetRef="ScriptTask_1jgtb0y" />
+    <bpmn:sequenceFlow id="SequenceFlow_197cm2e" sourceRef="ScriptTask_1jgtb0y" targetRef="ExclusiveGateway_0elbczl" />
+    <bpmn:sequenceFlow id="SequenceFlow_12t5exy" name="continue" sourceRef="ExclusiveGateway_0elbczl" targetRef="ScriptTask_12h8542">
+      <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">#{execution.getVariable("taskAction") == "commit"}</bpmn:conditionExpression>
+    </bpmn:sequenceFlow>
+    <bpmn:sequenceFlow id="SequenceFlow_038lb9m" name="abort" sourceRef="ExclusiveGateway_0elbczl" targetRef="ScriptTask_1mscu5w" />
+    <bpmn:sequenceFlow id="SequenceFlow_1t19ips" sourceRef="CallActivity_1bnkmaz" targetRef="ScriptTask_0l3d1ai" />
+    <bpmn:sequenceFlow id="SequenceFlow_1p8vxo5" sourceRef="CallActivity_0h88mep" targetRef="CallActivity_139l55g" />
+    <bpmn:sequenceFlow id="SequenceFlow_1g8m7tq" sourceRef="CallActivity_139l55g" targetRef="ScriptTask_1jj846g" />
+    <bpmn:sequenceFlow id="SequenceFlow_0it2g9j" sourceRef="CallActivity_0n47zoh" targetRef="IntermediateThrowEvent_1v96asi" />
+    <bpmn:sequenceFlow id="SequenceFlow_18kur12" sourceRef="ScriptTask_0gb975b" targetRef="CallActivity_0n47zoh" />
+    <bpmn:sequenceFlow id="SequenceFlow_0mlrlbv" sourceRef="CallActivity_0cxst1i" targetRef="ExclusiveGateway_18eld2o" />
+    <bpmn:sequenceFlow id="SequenceFlow_1c6ka9h" name="No" sourceRef="ExclusiveGateway_18eld2o" targetRef="EndEvent_0x406rw" />
+    <bpmn:sequenceFlow id="SequenceFlow_0n4xku8" name="Yes" sourceRef="ExclusiveGateway_18eld2o" targetRef="ScriptTask_19uxoi8">
+      <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">#{execution.getVariable("WorkflowException") == null}</bpmn:conditionExpression>
+    </bpmn:sequenceFlow>
+    <bpmn:sequenceFlow id="SequenceFlow_0klb3ey" sourceRef="ScriptTask_1ef3voz" targetRef="CallActivity_15pl4ld" />
+    <bpmn:sequenceFlow id="SequenceFlow_11rbv41" sourceRef="ServiceTask_0esr949" targetRef="EndEvent_05h01gx" />
+    <bpmn:sequenceFlow id="SequenceFlow_0t094g7" sourceRef="ScriptTask_1xxag1o" targetRef="ServiceTask_0kd6p6p" />
+    <bpmn:sequenceFlow id="SequenceFlow_1o1tu0f" sourceRef="IntermediateCatchEvent_1wii8im" targetRef="ScriptTask_0b7senu" />
+    <bpmn:sequenceFlow id="SequenceFlow_0lbdfmt" sourceRef="CallActivity_15pl4ld" targetRef="ScriptTask_1ssh2l9" />
+    <bpmn:sequenceFlow id="SequenceFlow_1qv8qw1" sourceRef="ScriptTask_1ssh2l9" targetRef="ServiceTask_0esr949" />
+    <bpmn:sequenceFlow id="SequenceFlow_0q7yc2c" sourceRef="ScriptTask_0o2r07o" targetRef="CallActivity_1bnkmaz" />
+    <bpmn:sequenceFlow id="SequenceFlow_1sq6kp6" sourceRef="ScriptTask_0b7senu" targetRef="CallActivity_0h88mep" />
+    <bpmn:sequenceFlow id="SequenceFlow_0thd6ny" sourceRef="ScriptTask_12h8542" targetRef="CallActivity_0o89wmf" />
+    <bpmn:sequenceFlow id="SequenceFlow_0477975" sourceRef="CallActivity_0o89wmf" targetRef="IntermediateThrowEvent_0ktwpki" />
+    <bpmn:sequenceFlow id="SequenceFlow_0h2oree" sourceRef="ScriptTask_08wim95" targetRef="CallActivity_0g98b71" />
+    <bpmn:sequenceFlow id="SequenceFlow_19lsayh" sourceRef="ScriptTask_1mscu5w" targetRef="CallActivity_0jdzpem" />
+    <bpmn:sequenceFlow id="SequenceFlow_10ng1vx" sourceRef="CallActivity_0jdzpem" targetRef="EndEvent_1oouvuh" />
+    <bpmn:sequenceFlow id="SequenceFlow_1bevt3a" sourceRef="IntermediateCatchEvent_0pkvfun" targetRef="CallActivity_0cxst1i" />
+    <bpmn:sequenceFlow id="SequenceFlow_1ey6m1e" sourceRef="ScriptTask_1jj846g" targetRef="CallActivity_0v4mw2x" />
+    <bpmn:receiveTask id="Task_1b5t88h" name="Waiting for confirmation" messageRef="Message_0c4b2r5">
+      <bpmn:incoming>SequenceFlow_1fk37v7</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_16uz2t9</bpmn:outgoing>
+    </bpmn:receiveTask>
+    <bpmn:sequenceFlow id="SequenceFlow_1fk37v7" sourceRef="IntermediateCatchEvent_0vilb24" targetRef="Task_1b5t88h" />
+    <bpmn:sequenceFlow id="SequenceFlow_16uz2t9" sourceRef="Task_1b5t88h" targetRef="ScriptTask_08wim95" />
+    <bpmn:boundaryEvent id="BoundaryEvent_0clo9pv" attachedToRef="Task_1b5t88h">
+      <bpmn:outgoing>SequenceFlow_12qt5ci</bpmn:outgoing>
+      <bpmn:timerEventDefinition>
+        <bpmn:timeDuration xsi:type="bpmn:tFormalExpression">PT2H</bpmn:timeDuration>
+      </bpmn:timerEventDefinition>
+    </bpmn:boundaryEvent>
+    <bpmn:sequenceFlow id="SequenceFlow_12qt5ci" sourceRef="BoundaryEvent_0clo9pv" targetRef="EndEvent_0bh0kwx" />
+    <bpmn:callActivity id="CallActivity_0v4mw2x" name="Call DoCreateSliceServiceOption&#10;" calledElement="DoCreateSliceServiceOption">
+      <bpmn:extensionElements>
+        <camunda:in source="nstModelUuid" target="nstModelUuid" />
+        <camunda:in source="nstModelInvariantUuid" target="nstModelInvariantUuid" />
+        <camunda:in source="serviceProfile" target="serviceProfile" />
+        <camunda:in source="sliceProfileTn" target="sliceProfileTn" />
+        <camunda:in source="msoRequestId" target="msoRequestId" />
+        <camunda:in source="sliceProfileCn" target="sliceProfileCn" />
+        <camunda:in source="sliceProfileAn" target="sliceProfileAn" />
+        <camunda:in source="sliceTaskParams" target="sliceTaskParams" />
+        <camunda:in source="resourceSharingLevel" target="resourceSharingLevel" />
+        <camunda:out source="sliceTaskParams" target="sliceTaskParams" />
+        <camunda:in source="globalSubscriberId" target="globalSubscriberId" />
+        <camunda:in source="subscriptionServiceType" target="subscriptionServiceType" />
+        <camunda:in source="serviceType" target="serviceType" />
+      </bpmn:extensionElements>
+      <bpmn:incoming>SequenceFlow_1ey6m1e</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_1aaozcg</bpmn:outgoing>
+    </bpmn:callActivity>
+    <bpmn:sequenceFlow id="SequenceFlow_1aaozcg" sourceRef="CallActivity_0v4mw2x" targetRef="ScriptTask_0gb975b" />
+    <bpmn:sequenceFlow id="SequenceFlow_046irye" sourceRef="ServiceTask_0kd6p6p" targetRef="ScriptTask_1eo3m4q" />
+    <bpmn:sequenceFlow id="SequenceFlow_1o23s0i" sourceRef="ScriptTask_1eo3m4q" targetRef="ScriptTask_0o2r07o" />
+    <bpmn:sequenceFlow id="SequenceFlow_0jrclmc" sourceRef="ScriptTask_0l3d1ai" targetRef="IntermediateThrowEvent_1ex8ke9" />
+    <bpmn:scriptTask id="ScriptTask_19uxoi8" name="Update AAI Status" scriptFormat="groovy">
+      <bpmn:incoming>SequenceFlow_0n4xku8</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_0kixzdj</bpmn:outgoing>
+      <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.*
+execution.setVariable("orchestrationStatus", "deactivated")
+def css = new CreateSliceService()
+css.updateAAIOrchStatus(execution)</bpmn:script>
+    </bpmn:scriptTask>
+    <bpmn:sequenceFlow id="SequenceFlow_0kixzdj" sourceRef="ScriptTask_19uxoi8" targetRef="ScriptTask_1ef3voz" />
+  </bpmn:process>
+  <bpmn:message id="Message_0c4b2r5" name="SliceServiceTask" />
+  <bpmn:error id="Error_03akl5v" name="MSOWorkflowException" errorCode="MSOWorkflowException" />
+  <bpmn:error id="Error_0p2naox" name="MSOWorkflowException" errorCode="MSOWorkflowException" />
+  <bpmndi:BPMNDiagram id="BPMNDiagram_1">
+    <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_0r5eb97">
+      <bpmndi:BPMNShape id="StartEvent_1nbljfd_di" bpmnElement="StartEvent_1nbljfd">
+        <dc:Bounds x="178" y="103" width="36" height="36" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="156" y="146" width="82" height="40" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="IntermediateCatchEvent_0vilb24_di" bpmnElement="IntermediateCatchEvent_0vilb24">
+        <dc:Bounds x="178" y="438" width="36" height="36" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="168" y="481" width="60" height="27" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ScriptTask_1tc44ge_di" bpmnElement="ScriptTask_1tc44ge">
+        <dc:Bounds x="285" y="81" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ScriptTask_1jgtb0y_di" bpmnElement="ScriptTask_1jgtb0y">
+        <dc:Bounds x="830" y="416" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ExclusiveGateway_0elbczl_di" bpmnElement="ExclusiveGateway_0elbczl" isMarkerVisible="true">
+        <dc:Bounds x="1040" y="431" width="50" height="50" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="1027" y="413" width="78" height="14" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ScriptTask_0l3d1ai_di" bpmnElement="ScriptTask_0l3d1ai">
+        <dc:Bounds x="1370" y="81" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ScriptTask_1eo3m4q_di" bpmnElement="ScriptTask_1eo3m4q">
+        <dc:Bounds x="830" y="81" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="CallActivity_139l55g_di" bpmnElement="CallActivity_139l55g">
+        <dc:Bounds x="645" y="249" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="IntermediateThrowEvent_1v96asi_di" bpmnElement="IntermediateThrowEvent_1v96asi">
+        <dc:Bounds x="1584" y="271" width="36" height="36" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="1567" y="312" width="81" height="27" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ScriptTask_0gb975b_di" bpmnElement="ScriptTask_0gb975b">
+        <dc:Bounds x="1193" y="249" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ExclusiveGateway_18eld2o_di" bpmnElement="ExclusiveGateway_18eld2o" isMarkerVisible="true">
+        <dc:Bounds x="488" y="776" width="50" height="50" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="483" y="746" width="60" height="27" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="EndEvent_0x406rw_di" bpmnElement="EndEvent_0x406rw">
+        <dc:Bounds x="495" y="926" width="36" height="36" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="SubProcess_1yv9i68_di" bpmnElement="SubProcess_1yv9i68" isExpanded="true">
+        <dc:Bounds x="685" y="1080" width="781" height="196" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ScriptTask_1ef3voz_di" bpmnElement="ScriptTask_1ef3voz">
+        <dc:Bounds x="823" y="761" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="EndEvent_05h01gx_di" bpmnElement="EndEvent_05h01gx">
+        <dc:Bounds x="1585" y="783" width="36" height="36" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="1593" y="826" width="20" height="14" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ScriptTask_1xxag1o_di" bpmnElement="ScriptTask_1xxag1o">
+        <dc:Bounds x="468" y="81" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="IntermediateThrowEvent_1ex8ke9_di" bpmnElement="IntermediateThrowEvent_1ex8ke9">
+        <dc:Bounds x="1584" y="103" width="36" height="36" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="1564" y="144" width="87" height="27" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="IntermediateCatchEvent_1wii8im_di" bpmnElement="IntermediateCatchEvent_1wii8im">
+        <dc:Bounds x="178" y="271" width="36" height="36" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="171" y="314" width="60" height="27" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ScriptTask_1ssh2l9_di" bpmnElement="ScriptTask_1ssh2l9">
+        <dc:Bounds x="1197" y="761" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ServiceTask_0kd6p6p_di" bpmnElement="ServiceTask_0kd6p6p">
+        <dc:Bounds x="645" y="81" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="CallActivity_1bnkmaz_di" bpmnElement="CallActivity_1bnkmaz">
+        <dc:Bounds x="1193" y="81" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ScriptTask_0o2r07o_di" bpmnElement="ScriptTask_0o2r07o">
+        <dc:Bounds x="1015" y="81" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ScriptTask_0b7senu_di" bpmnElement="ScriptTask_0b7senu">
+        <dc:Bounds x="285" y="249" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="CallActivity_0h88mep_di" bpmnElement="CallActivity_0h88mep">
+        <dc:Bounds x="467" y="249" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="CallActivity_0n47zoh_di" bpmnElement="CallActivity_0n47zoh">
+        <dc:Bounds x="1371" y="249" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ScriptTask_12h8542_di" bpmnElement="ScriptTask_12h8542">
+        <dc:Bounds x="1193" y="416" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="CallActivity_0o89wmf_di" bpmnElement="CallActivity_0o89wmf">
+        <dc:Bounds x="1371" y="416" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="CallActivity_0g98b71_di" bpmnElement="CallActivity_0g98b71">
+        <dc:Bounds x="645" y="416" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ScriptTask_08wim95_di" bpmnElement="ScriptTask_08wim95">
+        <dc:Bounds x="467" y="416" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="CallActivity_0jdzpem_di" bpmnElement="CallActivity_0jdzpem">
+        <dc:Bounds x="1371" y="605" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ScriptTask_1mscu5w_di" bpmnElement="ScriptTask_1mscu5w">
+        <dc:Bounds x="1193" y="605" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="IntermediateCatchEvent_0pkvfun_di" bpmnElement="IntermediateCatchEvent_0pkvfun">
+        <dc:Bounds x="178" y="783" width="36" height="36" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="168" y="826" width="66" height="14" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="IntermediateThrowEvent_0ktwpki_di" bpmnElement="IntermediateThrowEvent_0ktwpki">
+        <dc:Bounds x="1584" y="438" width="36" height="36" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="1577" y="479" width="67" height="27" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="CallActivity_15pl4ld_di" bpmnElement="CallActivity_15pl4ld">
+        <dc:Bounds x="1005" y="761" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="EndEvent_1oouvuh_di" bpmnElement="EndEvent_1oouvuh">
+        <dc:Bounds x="1584" y="627" width="36" height="36" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="1592" y="670" width="20" height="14" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ServiceTask_0esr949_di" bpmnElement="ServiceTask_0esr949">
+        <dc:Bounds x="1375" y="761" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ScriptTask_1jj846g_di" bpmnElement="ScriptTask_1jj846g">
+        <dc:Bounds x="830" y="249" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="CallActivity_0cxst1i_di" bpmnElement="CallActivity_0cxst1i">
+        <dc:Bounds x="285" y="761" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="EndEvent_0bh0kwx_di" bpmnElement="EndEvent_0bh0kwx">
+        <dc:Bounds x="317" y="593" width="36" height="36" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_03s744c_di" bpmnElement="SequenceFlow_03s744c">
+        <di:waypoint x="214" y="121" />
+        <di:waypoint x="285" y="121" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_07e12rt_di" bpmnElement="SequenceFlow_07e12rt">
+        <di:waypoint x="385" y="121" />
+        <di:waypoint x="468" y="121" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_1cv0wop_di" bpmnElement="SequenceFlow_1cv0wop">
+        <di:waypoint x="745" y="456" />
+        <di:waypoint x="830" y="456" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_197cm2e_di" bpmnElement="SequenceFlow_197cm2e">
+        <di:waypoint x="930" y="456" />
+        <di:waypoint x="1040" y="456" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_12t5exy_di" bpmnElement="SequenceFlow_12t5exy">
+        <di:waypoint x="1090" y="456" />
+        <di:waypoint x="1193" y="456" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="1121.5" y="438" width="42" height="14" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_038lb9m_di" bpmnElement="SequenceFlow_038lb9m">
+        <di:waypoint x="1065" y="481" />
+        <di:waypoint x="1065" y="645" />
+        <di:waypoint x="1193" y="645" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="1067" y="560" width="27" height="14" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_1t19ips_di" bpmnElement="SequenceFlow_1t19ips">
+        <di:waypoint x="1293" y="121" />
+        <di:waypoint x="1370" y="121" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_1p8vxo5_di" bpmnElement="SequenceFlow_1p8vxo5">
+        <di:waypoint x="567" y="289" />
+        <di:waypoint x="645" y="289" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_1g8m7tq_di" bpmnElement="SequenceFlow_1g8m7tq">
+        <di:waypoint x="745" y="289" />
+        <di:waypoint x="830" y="289" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_0it2g9j_di" bpmnElement="SequenceFlow_0it2g9j">
+        <di:waypoint x="1471" y="289" />
+        <di:waypoint x="1584" y="289" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_18kur12_di" bpmnElement="SequenceFlow_18kur12">
+        <di:waypoint x="1293" y="289" />
+        <di:waypoint x="1371" y="289" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_0mlrlbv_di" bpmnElement="SequenceFlow_0mlrlbv">
+        <di:waypoint x="385" y="801" />
+        <di:waypoint x="488" y="801" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_1c6ka9h_di" bpmnElement="SequenceFlow_1c6ka9h">
+        <di:waypoint x="513" y="826" />
+        <di:waypoint x="513" y="926" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="521" y="832" width="15" height="14" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_0n4xku8_di" bpmnElement="SequenceFlow_0n4xku8">
+        <di:waypoint x="538" y="801" />
+        <di:waypoint x="645" y="801" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="584" y="783" width="18" height="14" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_0klb3ey_di" bpmnElement="SequenceFlow_0klb3ey">
+        <di:waypoint x="923" y="801" />
+        <di:waypoint x="1005" y="801" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_11rbv41_di" bpmnElement="SequenceFlow_11rbv41">
+        <di:waypoint x="1475" y="801" />
+        <di:waypoint x="1585" y="801" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_0t094g7_di" bpmnElement="SequenceFlow_0t094g7">
+        <di:waypoint x="568" y="121" />
+        <di:waypoint x="645" y="121" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_1o1tu0f_di" bpmnElement="SequenceFlow_1o1tu0f">
+        <di:waypoint x="214" y="289" />
+        <di:waypoint x="285" y="289" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_0lbdfmt_di" bpmnElement="SequenceFlow_0lbdfmt">
+        <di:waypoint x="1105" y="801" />
+        <di:waypoint x="1197" y="801" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_1qv8qw1_di" bpmnElement="SequenceFlow_1qv8qw1">
+        <di:waypoint x="1297" y="801" />
+        <di:waypoint x="1375" y="801" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_0q7yc2c_di" bpmnElement="SequenceFlow_0q7yc2c">
+        <di:waypoint x="1115" y="121" />
+        <di:waypoint x="1193" y="121" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_1sq6kp6_di" bpmnElement="SequenceFlow_1sq6kp6">
+        <di:waypoint x="385" y="289" />
+        <di:waypoint x="467" y="289" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_0thd6ny_di" bpmnElement="SequenceFlow_0thd6ny">
+        <di:waypoint x="1293" y="456" />
+        <di:waypoint x="1371" y="456" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_0477975_di" bpmnElement="SequenceFlow_0477975">
+        <di:waypoint x="1471" y="456" />
+        <di:waypoint x="1584" y="456" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_0h2oree_di" bpmnElement="SequenceFlow_0h2oree">
+        <di:waypoint x="567" y="456" />
+        <di:waypoint x="645" y="456" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_19lsayh_di" bpmnElement="SequenceFlow_19lsayh">
+        <di:waypoint x="1293" y="645" />
+        <di:waypoint x="1371" y="645" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_10ng1vx_di" bpmnElement="SequenceFlow_10ng1vx">
+        <di:waypoint x="1471" y="645" />
+        <di:waypoint x="1584" y="645" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_1bevt3a_di" bpmnElement="SequenceFlow_1bevt3a">
+        <di:waypoint x="214" y="801" />
+        <di:waypoint x="285" y="801" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_1ey6m1e_di" bpmnElement="SequenceFlow_1ey6m1e">
+        <di:waypoint x="930" y="289" />
+        <di:waypoint x="1015" y="289" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="StartEvent_1omdx56_di" bpmnElement="StartEvent_1omdx56">
+        <dc:Bounds x="715" y="1166" width="36" height="36" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="EndEvent_1jx3026_di" bpmnElement="EndEvent_1jx3026">
+        <dc:Bounds x="1353" y="1166" width="36" height="36" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ScriptTask_1swzdpw_di" bpmnElement="ScriptTask_1swzdpw">
+        <dc:Bounds x="979" y="1144" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_1w67v6s_di" bpmnElement="SequenceFlow_1w67v6s">
+        <di:waypoint x="751" y="1184" />
+        <di:waypoint x="979" y="1184" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_08mlzwz_di" bpmnElement="SequenceFlow_08mlzwz">
+        <di:waypoint x="1079" y="1184" />
+        <di:waypoint x="1353" y="1184" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="ReceiveTask_0zkpdpa_di" bpmnElement="Task_1b5t88h">
+        <dc:Bounds x="285" y="416" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_1fk37v7_di" bpmnElement="SequenceFlow_1fk37v7">
+        <di:waypoint x="214" y="456" />
+        <di:waypoint x="285" y="456" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_16uz2t9_di" bpmnElement="SequenceFlow_16uz2t9">
+        <di:waypoint x="385" y="456" />
+        <di:waypoint x="467" y="456" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="BoundaryEvent_15igwk2_di" bpmnElement="BoundaryEvent_0clo9pv">
+        <dc:Bounds x="317" y="478" width="36" height="36" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_12qt5ci_di" bpmnElement="SequenceFlow_12qt5ci">
+        <di:waypoint x="335" y="514" />
+        <di:waypoint x="335" y="611" />
+        <di:waypoint x="335" y="593" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="CallActivity_0v4mw2x_di" bpmnElement="CallActivity_0v4mw2x">
+        <dc:Bounds x="1015" y="249" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_1aaozcg_di" bpmnElement="SequenceFlow_1aaozcg">
+        <di:waypoint x="1115" y="289" />
+        <di:waypoint x="1193" y="289" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_046irye_di" bpmnElement="SequenceFlow_046irye">
+        <di:waypoint x="745" y="121" />
+        <di:waypoint x="830" y="121" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_1o23s0i_di" bpmnElement="SequenceFlow_1o23s0i">
+        <di:waypoint x="930" y="121" />
+        <di:waypoint x="1015" y="121" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_0jrclmc_di" bpmnElement="SequenceFlow_0jrclmc">
+        <di:waypoint x="1470" y="121" />
+        <di:waypoint x="1584" y="121" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="ScriptTask_19uxoi8_di" bpmnElement="ScriptTask_19uxoi8">
+        <dc:Bounds x="645" y="761" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_0kixzdj_di" bpmnElement="SequenceFlow_0kixzdj">
+        <di:waypoint x="745" y="801" />
+        <di:waypoint x="823" y="801" />
+      </bpmndi:BPMNEdge>
+    </bpmndi:BPMNPlane>
+  </bpmndi:BPMNDiagram>
+</bpmn:definitions>
+
diff --git a/mso-catalog-db/src/main/java/org/onap/so/db/catalog/beans/Service.java b/mso-catalog-db/src/main/java/org/onap/so/db/catalog/beans/Service.java
index ab40cef..0d7a6db 100644
--- a/mso-catalog-db/src/main/java/org/onap/so/db/catalog/beans/Service.java
+++ b/mso-catalog-db/src/main/java/org/onap/so/db/catalog/beans/Service.java
@@ -136,6 +136,9 @@
     @JoinColumn(name = "TOSCA_CSAR_ARTIFACT_UUID")
     private ToscaCsar csar;
 
+    @OneToMany(cascade = CascadeType.ALL, mappedBy = "service")
+    private List<ServiceArtifact> serviceArtifactList;
+
     @Column(name = "NAMING_POLICY")
     private String namingPolicy;
 
@@ -371,6 +374,17 @@
         this.csar = csar;
     }
 
+    public List<ServiceArtifact> getServiceArtifactList() {
+        if (serviceArtifactList == null) {
+            serviceArtifactList = new ArrayList<>();
+        }
+        return serviceArtifactList;
+    }
+
+    public void setServiceArtifactList(List<ServiceArtifact> serviceArtifactList) {
+        this.serviceArtifactList = serviceArtifactList;
+    }
+
     public String getWorkloadContext() {
         return this.workloadContext;
     }
diff --git a/mso-catalog-db/src/main/java/org/onap/so/db/catalog/rest/beans/ServiceMacroHolder.java b/mso-catalog-db/src/main/java/org/onap/so/db/catalog/rest/beans/ServiceMacroHolder.java
index f9cbb0d..ec4e922 100644
--- a/mso-catalog-db/src/main/java/org/onap/so/db/catalog/rest/beans/ServiceMacroHolder.java
+++ b/mso-catalog-db/src/main/java/org/onap/so/db/catalog/rest/beans/ServiceMacroHolder.java
@@ -20,14 +20,10 @@
 
 package org.onap.so.db.catalog.rest.beans;
 
+import com.openpojo.business.annotation.BusinessKey;
+import org.onap.so.db.catalog.beans.*;
 import java.io.Serializable;
 import java.util.ArrayList;
-import org.onap.so.db.catalog.beans.AllottedResourceCustomization;
-import org.onap.so.db.catalog.beans.NetworkResourceCustomization;
-import org.onap.so.db.catalog.beans.Service;
-import org.onap.so.db.catalog.beans.VnfResource;
-import org.onap.so.db.catalog.beans.VnfResourceCustomization;
-import com.openpojo.business.annotation.BusinessKey;
 
 /*
  * A simple holder for Service and its associated elements: VnfResource, 1-n VfModule, Network TBD
@@ -42,6 +38,8 @@
     private ArrayList<NetworkResourceCustomization> networkResourceCustomizations;
     private ArrayList<AllottedResourceCustomization> allottedResourceCustomizations;
     private ArrayList<VnfResourceCustomization> vnfResourceCustomizations;
+    private ArrayList<ServiceProxyResourceCustomization> serviceProxyResourceCustomizations;
+    private ServiceInfo serviceInfo;
 
 
     public ServiceMacroHolder() {
@@ -51,6 +49,8 @@
         this.networkResourceCustomizations = new ArrayList<>();
         this.allottedResourceCustomizations = new ArrayList<>();
         this.vnfResourceCustomizations = new ArrayList<>();
+        this.serviceProxyResourceCustomizations = new ArrayList<>();
+        this.serviceInfo = null;
     }
 
     public ServiceMacroHolder(Service service) {
@@ -66,6 +66,14 @@
         this.service = service;
     }
 
+    public ServiceInfo getServiceInfo() {
+        return serviceInfo;
+    }
+
+    public void setServiceInfo(ServiceInfo serviceInfo) {
+        this.serviceInfo = serviceInfo;
+    }
+
     public void setVnfResources(ArrayList<VnfResource> vnfResources) {
         this.vnfResources = vnfResources;
     }
@@ -139,6 +147,15 @@
         }
     }
 
+    public void addServiceProxyResourceCustomization(ServiceProxyResourceCustomization sprc) {
+        if (this.serviceProxyResourceCustomizations != null) {
+            this.serviceProxyResourceCustomizations.add(sprc);
+        } else {
+            this.serviceProxyResourceCustomizations = new ArrayList<>();
+            this.serviceProxyResourceCustomizations.add(sprc);
+        }
+    }
+
     @Override
     public String toString() {
         StringBuilder sb = new StringBuilder();
@@ -148,6 +165,11 @@
         } else {
             sb.append("service: null");
         }
+        if (this.serviceInfo != null) {
+            sb.append("serviceInfo: " + this.serviceInfo.toString());
+        } else {
+            sb.append("serviceInfo: null");
+        }
         if (this.vnfResourceCustomizations != null && this.vnfResourceCustomizations.size() > 0) {
             int i = 0;
             sb.append("VnfResources: ");
@@ -180,6 +202,13 @@
                 sb.append("ARC[" + i++ + "]: " + arc.toString());
             }
         }
+        if (this.serviceProxyResourceCustomizations != null && this.serviceProxyResourceCustomizations.size() > 0) {
+            int i = 0;
+            sb.append("ServiceProxyResourceCustomizations:");
+            for (ServiceProxyResourceCustomization sprc : this.serviceProxyResourceCustomizations) {
+                sb.append("SPRC[" + i++ + "]: " + sprc.toString());
+            }
+        }
 
         return sb.toString();
     }
@@ -202,6 +231,12 @@
         this.allottedResourceCustomizations = allottedResourceCustomizations;
     }
 
+    public ArrayList<ServiceProxyResourceCustomization> getServiceProxyResourceCustomizations() {
+        return serviceProxyResourceCustomizations;
+    }
 
-
+    public void setServiceProxyResourceCustomizations(
+            ArrayList<ServiceProxyResourceCustomization> serviceProxyResourceCustomizations) {
+        this.serviceProxyResourceCustomizations = serviceProxyResourceCustomizations;
+    }
 }