diff --git a/adapters/mso-cnf-adapter/pom.xml b/adapters/mso-cnf-adapter/pom.xml
index fb25157..0928da0 100644
--- a/adapters/mso-cnf-adapter/pom.xml
+++ b/adapters/mso-cnf-adapter/pom.xml
@@ -110,11 +110,11 @@
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-data-jpa</artifactId>
     </dependency>
-    <!--  <dependency>
+    <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-test</artifactId>
       <scope>test</scope>
-    </dependency> -->
+    </dependency>
     <!--  <dependency>
       <groupId>org.onap.so</groupId>
       <artifactId>mso-requests-db</artifactId>
diff --git a/adapters/mso-cnf-adapter/src/main/java/org/onap/so/adapters/cnf/exceptions/ApplicationException.java b/adapters/mso-cnf-adapter/src/main/java/org/onap/so/adapters/cnf/exceptions/ApplicationException.java
new file mode 100644
index 0000000..c950cf6
--- /dev/null
+++ b/adapters/mso-cnf-adapter/src/main/java/org/onap/so/adapters/cnf/exceptions/ApplicationException.java
@@ -0,0 +1,66 @@
+/*-
+ * ============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.adapters.cnf.exceptions;
+
+import static org.onap.so.adapters.cnf.util.CNfAdapterUtil.marshal;
+import org.onap.so.adapters.cnf.model.ErrorResponse;
+import org.springframework.http.ResponseEntity;
+
+public class ApplicationException extends Exception {
+
+    private static final long serialVersionUID = 1L;
+
+    private int errorCode;
+
+    private String errorMsg;
+
+    public ApplicationException(int errorCode, String errorMsg) {
+        this.errorCode = errorCode;
+        this.errorMsg = errorMsg;
+    }
+
+    public int getErrorCode() {
+        return errorCode;
+    }
+
+    public void setErrorCode(int errorCode) {
+        this.errorCode = errorCode;
+    }
+
+    public String getErrorMsg() {
+        return errorMsg;
+    }
+
+    public void setErrorMsg(String errorMsg) {
+        this.errorMsg = errorMsg;
+    }
+
+    public ResponseEntity buildErrorResponse() {
+        String message;
+        try {
+            ErrorResponse err = new ErrorResponse(errorCode, errorMsg);
+            message = marshal(err);
+        } catch (ApplicationException e) {
+            return ResponseEntity.status(500).body("Internal Server Error");
+        }
+        return ResponseEntity.status(errorCode).body(message);
+    }
+}
diff --git a/adapters/mso-cnf-adapter/src/main/java/org/onap/so/adapters/cnf/model/BpmnInstanceRequest.java b/adapters/mso-cnf-adapter/src/main/java/org/onap/so/adapters/cnf/model/BpmnInstanceRequest.java
new file mode 100644
index 0000000..2e76d51
--- /dev/null
+++ b/adapters/mso-cnf-adapter/src/main/java/org/onap/so/adapters/cnf/model/BpmnInstanceRequest.java
@@ -0,0 +1,87 @@
+package org.onap.so.adapters.cnf.model;
+
+import java.util.Map;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+@JsonIgnoreProperties(value = "true")
+public class BpmnInstanceRequest {
+
+    @JsonProperty(value = "modelInvariantId")
+    private String modelInvariantId;
+
+    @JsonProperty(value = "modelVersionId")
+    private String modelVersionId;
+
+    @JsonProperty(value = "k8sRBProfileName")
+    private String k8sRBProfileName;
+
+    @JsonProperty(value = "cloudRegionId")
+    private String cloudRegionId;
+
+    @JsonProperty(value = "vfModuleUUID")
+    private String vfModuleUUID;
+
+    @JsonProperty(value = "labels")
+    private Map<String, String> labels;
+
+    @JsonProperty(value = "overrideValues")
+    private Map<String, String> overrideValues;
+
+    public String getModelInvariantId() {
+        return modelInvariantId;
+    }
+
+    public void setModelInvariantId(String modelInvariantId) {
+        this.modelInvariantId = modelInvariantId;
+    }
+
+    public String getModelVersionId() {
+        return modelVersionId;
+    }
+
+    public void setModelVersionId(String modelVersionId) {
+        this.modelVersionId = modelVersionId;
+    }
+
+    public String getK8sRBProfileName() {
+        return k8sRBProfileName;
+    }
+
+    public void setK8sRBProfileName(String k8sRBProfileName) {
+        this.k8sRBProfileName = k8sRBProfileName;
+    }
+
+    public String getCloudRegionId() {
+        return cloudRegionId;
+    }
+
+    public void setCloudRegionId(String cloudRegionId) {
+        this.cloudRegionId = cloudRegionId;
+    }
+
+    public String getVfModuleUUID() {
+        return vfModuleUUID;
+    }
+
+    public void setVfModuleUUID(String vfModuleUUID) {
+        this.vfModuleUUID = vfModuleUUID;
+    }
+
+    public Map<String, String> getLabels() {
+        return labels;
+    }
+
+    public void setLabels(Map<String, String> labels) {
+        this.labels = labels;
+    }
+
+    public Map<String, String> getOverrideValues() {
+        return overrideValues;
+    }
+
+    public void setOverrideValues(Map<String, String> overrideValues) {
+        this.overrideValues = overrideValues;
+    }
+
+}
diff --git a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/model/ErrorResponse.java b/adapters/mso-cnf-adapter/src/main/java/org/onap/so/adapters/cnf/model/ErrorResponse.java
similarity index 97%
rename from adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/model/ErrorResponse.java
rename to adapters/mso-cnf-adapter/src/main/java/org/onap/so/adapters/cnf/model/ErrorResponse.java
index 188349c..135adcc 100644
--- a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/model/ErrorResponse.java
+++ b/adapters/mso-cnf-adapter/src/main/java/org/onap/so/adapters/cnf/model/ErrorResponse.java
@@ -18,7 +18,7 @@
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.so.adapters.nssmf.model;
+package org.onap.so.adapters.cnf.model;
 
 public class ErrorResponse {
 
diff --git a/adapters/mso-cnf-adapter/src/main/java/org/onap/so/adapters/cnf/model/InstanceEntity.java b/adapters/mso-cnf-adapter/src/main/java/org/onap/so/adapters/cnf/model/MulticloudInstanceRequest.java
similarity index 84%
rename from adapters/mso-cnf-adapter/src/main/java/org/onap/so/adapters/cnf/model/InstanceEntity.java
rename to adapters/mso-cnf-adapter/src/main/java/org/onap/so/adapters/cnf/model/MulticloudInstanceRequest.java
index 04f2f9d..b1719cb 100644
--- a/adapters/mso-cnf-adapter/src/main/java/org/onap/so/adapters/cnf/model/InstanceEntity.java
+++ b/adapters/mso-cnf-adapter/src/main/java/org/onap/so/adapters/cnf/model/MulticloudInstanceRequest.java
@@ -5,7 +5,7 @@
 import com.fasterxml.jackson.annotation.JsonProperty;
 
 @JsonIgnoreProperties(value = "true")
-public class InstanceEntity {
+public class MulticloudInstanceRequest {
 
     @JsonProperty(value = "cloud-region")
     private String cloudRegion;
@@ -25,6 +25,9 @@
     @JsonProperty(value = "override-values")
     private Map<String, String> overrideValues;
 
+    @JsonProperty(value = "release-name")
+    private String vfModuleUuid;
+
     public String getCloudRegion() {
         return cloudRegion;
     }
@@ -73,4 +76,12 @@
         this.overrideValues = overrideValues;
     }
 
+    public String getVfModuleUuid() {
+        return vfModuleUuid;
+    }
+
+    public void setVfModuleUuid(String vfModuleUuid) {
+        this.vfModuleUuid = vfModuleUuid;
+    }
+
 }
diff --git a/adapters/mso-cnf-adapter/src/main/java/org/onap/so/adapters/cnf/rest/CnfAdapterRest.java b/adapters/mso-cnf-adapter/src/main/java/org/onap/so/adapters/cnf/rest/CnfAdapterRest.java
index 952edef..b6d50da 100644
--- a/adapters/mso-cnf-adapter/src/main/java/org/onap/so/adapters/cnf/rest/CnfAdapterRest.java
+++ b/adapters/mso-cnf-adapter/src/main/java/org/onap/so/adapters/cnf/rest/CnfAdapterRest.java
@@ -1,27 +1,39 @@
 package org.onap.so.adapters.cnf.rest;
 
+import java.io.File;
+import org.apache.http.HttpEntity;
 import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpDelete;
 import org.apache.http.client.methods.HttpGet;
 import org.apache.http.client.methods.HttpPost;
+import org.apache.http.client.methods.HttpPut;
 import org.apache.http.entity.ContentType;
 import org.apache.http.entity.StringEntity;
+import org.apache.http.entity.mime.HttpMultipartMode;
+import org.apache.http.entity.mime.MultipartEntityBuilder;
+import org.apache.http.entity.mime.content.FileBody;
 import org.apache.http.impl.client.CloseableHttpClient;
 import org.apache.http.impl.client.HttpClients;
 import org.apache.http.util.EntityUtils;
+import org.onap.so.adapters.cnf.model.BpmnInstanceRequest;
 import org.onap.so.adapters.cnf.model.ConfigTemplateEntity;
 import org.onap.so.adapters.cnf.model.ConfigurationEntity;
+import org.onap.so.adapters.cnf.model.ConfigurationRollbackEntity;
 import org.onap.so.adapters.cnf.model.ConnectivityInfo;
-import org.onap.so.adapters.cnf.model.InstanceEntity;
+import org.onap.so.adapters.cnf.model.MulticloudInstanceRequest;
 import org.onap.so.adapters.cnf.model.ProfileEntity;
 import org.onap.so.adapters.cnf.model.ResourceBundleEntity;
+import org.onap.so.adapters.cnf.model.Tag;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.SerializationFeature;
 
@@ -32,14 +44,14 @@
     private final CloseableHttpClient httpClient = HttpClients.createDefault();
 
     @ResponseBody
-    @RequestMapping(value = {"/api/multicloud-k8s/v1/healthcheck"}, method = RequestMethod.GET,
+    @RequestMapping(value = {"/api/cnf-adapter/v1/healthcheck"}, method = RequestMethod.GET,
             produces = "application/json")
     public String healthCheck() throws Exception {
 
         logger.info("health check called.");
 
         // TODO
-        HttpGet req = new HttpGet("https://localhost:32780/api/multicloud-k8s/v1/healthcheck");
+        HttpGet req = new HttpGet("http://172.17.0.2:31770/v1/healthcheck");
         try (CloseableHttpResponse response = httpClient.execute(req)) {
             logger.info("response:" + response.getEntity());
             return EntityUtils.toString(response.getEntity());
@@ -47,7 +59,7 @@
     }
 
     @ResponseBody
-    @RequestMapping(value = {"/api/multicloud-k8s/v1/v1/rb/definition"}, method = RequestMethod.POST,
+    @RequestMapping(value = {"/api/cnf-adapter/v1/v1/rb/definition"}, method = RequestMethod.POST,
             produces = "application/json")
     public String createRB(@RequestBody ResourceBundleEntity rB) throws Exception {
 
@@ -55,7 +67,7 @@
 
         // TODO
         // Below URL should be changed as appropriate multicloud URL.
-        HttpPost post = new HttpPost("https://localhost:32780/api/multicloud-k8s/v1/v1/rb/definition");
+        HttpPost post = new HttpPost("http://172.17.0.2:31770/v1/rb/definition");
         ObjectMapper objectMapper = new ObjectMapper();
         objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
         String requestBody = objectMapper.writeValueAsString(rB);
@@ -70,8 +82,8 @@
     }
 
     @ResponseBody
-    @RequestMapping(value = {"/api/multicloud-k8s/v1/v1/rb/definition/{rb-name}/{rb-version}"},
-            method = RequestMethod.GET, produces = "application/json")
+    @RequestMapping(value = {"/api/cnf-adapter/v1/v1/rb/definition/{rb-name}/{rb-version}"}, method = RequestMethod.GET,
+            produces = "application/json")
     public String getRB(@PathVariable("rb-name") String rbName, @PathVariable("rb-version") String rbVersion)
             throws Exception {
 
@@ -79,8 +91,7 @@
 
         // TODO
         // Below URL should be changed as appropriate multicloud URL.
-        HttpGet req = new HttpGet(
-                "https://localhost:32780/api/multicloud-k8s/v1/v1/rb/definition/" + rbName + "/" + rbVersion);
+        HttpGet req = new HttpGet("http://172.17.0.2:31770/v1/rb/definition/" + rbName + "/" + rbVersion);
         try (CloseableHttpResponse response = httpClient.execute(req)) {
             logger.info("response:" + response.getEntity());
             return EntityUtils.toString(response.getEntity());
@@ -88,7 +99,93 @@
     }
 
     @ResponseBody
-    @RequestMapping(value = {"/api/multicloud-k8s/v1/v1/rb/definition/{rb-name}/{rb-version}/profile"},
+    @RequestMapping(value = {"/api/cnf-adapter/v1/v1/rb/definition/{rb-name}/{rb-version}"},
+            method = RequestMethod.DELETE, produces = "application/json")
+    public String deleteRB(@PathVariable("rb-name") String rbName, @PathVariable("rb-version") String rbVersion)
+            throws Exception {
+
+        logger.info("delete RB called.");
+
+        // TODO
+        // Below URL should be changed as appropriate multicloud URL.
+        HttpDelete req = new HttpDelete("http://172.17.0.2:31770/v1/rb/definition/" + rbName + "/" + rbVersion);
+
+        try (CloseableHttpResponse response = httpClient.execute(req)) {
+            logger.info("response:" + response.getEntity());
+            return EntityUtils.toString(response.getEntity());
+        }
+
+    }
+
+    @ResponseBody
+    @RequestMapping(value = {"/api/cnf-adapter/v1/v1/rb/definition/{rb-name}"}, method = RequestMethod.GET,
+            produces = "application/json")
+    public String getListOfRB(@PathVariable("rb-name") String rbName) throws Exception {
+
+        logger.info("getListOfRB called.");
+
+        // TODO
+        // Below URL should be changed as appropriate multicloud URL.
+        HttpGet req = new HttpGet("http://172.17.0.2:31770/v1/rb/definition/" + rbName);
+
+        try (CloseableHttpResponse response = httpClient.execute(req)) {
+            logger.info("response:" + response.getEntity());
+            return EntityUtils.toString(response.getEntity());
+        }
+
+    }
+
+    @ResponseBody
+    @RequestMapping(value = {"/api/cnf-adapter/v1/v1/rb/definition"}, method = RequestMethod.GET,
+            produces = "application/json")
+    public String getListOfRBWithoutUsingRBName() throws Exception {
+
+        logger.info("getListOfRBWithoutUsingRBName called.");
+
+        // TODO
+        // Below URL should be changed as appropriate multicloud URL.
+        HttpGet req = new HttpGet("http://172.17.0.2:31770/v1/rb/definition");
+
+        try (CloseableHttpResponse response = httpClient.execute(req)) {
+            logger.info("response:" + response.getEntity());
+            return EntityUtils.toString(response.getEntity());
+        }
+
+    }
+
+    @ResponseBody
+    @RequestMapping(value = {"/api/cnf-adapter/v1/v1/rb/definition/{rb-name}/{rb-version}/content"},
+            method = RequestMethod.POST, produces = "multipart/form-data")
+    public String uploadArtifactForRB(@RequestParam("file") MultipartFile file, @PathVariable("rb-name") String rbName,
+            @PathVariable("rb-version") String rbVersion) throws Exception {
+
+        logger.info("Upload  Artifact For RB called.");
+
+        File convFile = new File(file.getOriginalFilename());
+        file.transferTo(convFile);
+        FileBody fileBody = new FileBody(convFile, ContentType.DEFAULT_BINARY);
+        MultipartEntityBuilder builder = MultipartEntityBuilder.create();
+        builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
+        builder.addPart("file", fileBody);
+        HttpEntity entity = builder.build();
+
+        // TODO
+        // Below URL should be changed as appropriate multicloud URL.
+        HttpPost post =
+                new HttpPost("http://172.17.0.2:31770/v1/rb/definition/" + rbName + "/" + rbVersion + "/content");
+        post.setHeader("Content-Type", "multipart/form-data");
+        logger.info(String.valueOf(post));
+        post.setEntity(entity);
+
+        try (CloseableHttpClient httpClient = HttpClients.createDefault();
+                CloseableHttpResponse response = httpClient.execute(post)) {
+            logger.info("response:" + response.getEntity());
+            return EntityUtils.toString(response.getEntity());
+        }
+    }
+
+    @ResponseBody
+    @RequestMapping(value = {"/api/cnf-adapter/v1/v1/rb/definition/{rb-name}/{rb-version}/profile"},
             method = RequestMethod.POST, produces = "application/json")
     public String createProfile(@RequestBody ProfileEntity fE, @PathVariable("rb-name") String rbName,
             @PathVariable("rb-version") String rbVersion) throws Exception {
@@ -97,8 +194,8 @@
 
         // TODO
         // Below URL should be changed as appropriate multicloud URL.
-        HttpPost post = new HttpPost("http://localhost:32780/api/multicloud-k8s/v1/v1/rb/definition/" + rbName + "/"
-                + rbVersion + "/profile");
+        HttpPost post =
+                new HttpPost("http://172.17.0.2:31770/v1/rb/definition/" + rbName + "/" + rbVersion + "/profile");
         ObjectMapper objectMapper = new ObjectMapper();
         String requestBody = objectMapper.writeValueAsString(fE);
         StringEntity requestEntity = new StringEntity(requestBody, ContentType.APPLICATION_JSON);
@@ -112,7 +209,7 @@
     }
 
     @ResponseBody
-    @RequestMapping(value = {"/api/multicloud-k8s/v1/v1/rb/definition/{rb-name}/{rb-version}/profile/{pr-name}"},
+    @RequestMapping(value = {"/api/cnf-adapter/v1/v1/rb/definition/{rb-name}/{rb-version}/profile/{pr-name}"},
             method = RequestMethod.GET, produces = "application/json")
     public String getProfile(@PathVariable("rb-name") String rbName, @PathVariable("rb-version") String rbVersion,
             @PathVariable("pr-name") String prName) throws Exception {
@@ -121,8 +218,8 @@
 
         // TODO
         // Below URL should be changed as appropriate multicloud URL.
-        HttpGet req = new HttpGet("https://localhost:32780/api/multicloud-k8s/v1/v1/rb/definition/" + rbName + "/"
-                + rbVersion + "/profile/" + prName);
+        HttpGet req = new HttpGet(
+                "http://172.17.0.2:31770/v1/rb/definition/" + rbName + "/" + rbVersion + "/profile/" + prName);
 
         try (CloseableHttpResponse response = httpClient.execute(req)) {
             logger.info("response:" + response.getEntity());
@@ -131,18 +228,130 @@
     }
 
     @ResponseBody
-    @RequestMapping(value = {"/api/multicloud-k8s/v1/v1/instance"}, method = RequestMethod.POST,
+    @RequestMapping(value = {"/api/cnf-adapter/v1/v1/rb/definition/{rb-name}/{rb-version}/profile"},
+            method = RequestMethod.GET, produces = "application/json")
+    public String getListOfProfile(@PathVariable("rb-name") String rbName, @PathVariable("rb-version") String rbVersion)
+            throws Exception {
+
+        logger.info("getListOfProfile called.");
+
+        // TODO
+        // Below URL should be changed as appropriate multicloud URL.
+        HttpGet req = new HttpGet("http://172.17.0.2:31770/v1/rb/definition/" + rbName + "/" + rbVersion + "/profile");
+
+        try (CloseableHttpResponse response = httpClient.execute(req)) {
+            logger.info("response:" + response.getEntity());
+            return EntityUtils.toString(response.getEntity());
+        }
+    }
+
+    @ResponseBody
+    @RequestMapping(value = {"/api/cnf-adapter/v1/v1/rb/definition/{rb-name}/{rb-version}/profile/{pr-name}"},
+            method = RequestMethod.DELETE, produces = "application/json")
+    public String deleteProfile(@PathVariable("rb-name") String rbName, @PathVariable("rb-version") String rbVersion,
+            @PathVariable("pr-name") String prName) throws Exception {
+
+        logger.info("delete Profile called.");
+
+        // TODO
+        // Below URL should be changed as appropriate multicloud URL.
+        HttpDelete req = new HttpDelete(
+                "http://172.17.0.2:31770/v1/rb/definition/" + rbName + "/" + rbVersion + "/profile/" + prName);
+
+        try (CloseableHttpResponse response = httpClient.execute(req)) {
+            logger.info("response:" + response.getEntity());
+            return EntityUtils.toString(response.getEntity());
+        }
+
+    }
+
+    @ResponseBody
+    @RequestMapping(value = {"/api/cnf-adapter/v1/v1/rb/definition/{rb-name}/{rb-version}/profile/{pr-name}/content"},
+            method = RequestMethod.POST, produces = "multipart/form-data")
+    public String uploadArtifactForProfile(@RequestParam("file") MultipartFile file,
+            @PathVariable("rb-name") String rbName, @PathVariable("rb-version") String rbVersion,
+            @PathVariable("pr-name") String prName) throws Exception {
+
+        logger.info("Upload  Artifact For Profile called.");
+
+        File convFile = new File(file.getOriginalFilename());
+        file.transferTo(convFile);
+        FileBody fileBody = new FileBody(convFile, ContentType.DEFAULT_BINARY);
+        MultipartEntityBuilder builder = MultipartEntityBuilder.create();
+        builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
+        builder.addPart("file", fileBody);
+        HttpEntity entity = builder.build();
+
+        // TODO
+        // Below URL should be changed as appropriate multicloud URL.
+        HttpPost post = new HttpPost("http://172.17.0.2:31770/v1/rb/definition/" + rbName + "/" + rbVersion
+                + "/profile/" + prName + "/content");
+        post.setHeader("Content-Type", "multipart/form-data");
+
+        logger.info(String.valueOf(post));
+        post.setEntity(entity);
+
+        try (CloseableHttpClient httpClient = HttpClients.createDefault();
+                CloseableHttpResponse response = httpClient.execute(post)) {
+            logger.info("response:" + response.getEntity());
+            return EntityUtils.toString(response.getEntity());
+        }
+    }
+
+    @ResponseBody
+    @RequestMapping(value = {"/api/cnf-adapter/v1/v1/instance"}, method = RequestMethod.POST,
             produces = "application/json")
-    public String createInstance(@RequestBody InstanceEntity iE) throws Exception {
+    public String createInstance(@RequestBody BpmnInstanceRequest bpmnInstanceRequest) throws Exception {
+
+        logger.info("create Instance called.");
+
+        MulticloudInstanceRequest multicloudInstanceRequest = new MulticloudInstanceRequest();
+
+        if (bpmnInstanceRequest.getK8sRBProfileName() != null) {
+            multicloudInstanceRequest.setCloudRegion(bpmnInstanceRequest.getCloudRegionId());
+            multicloudInstanceRequest.setLabels(bpmnInstanceRequest.getLabels());
+            multicloudInstanceRequest.setOverrideValues(bpmnInstanceRequest.getOverrideValues());
+            multicloudInstanceRequest.setProfileName(bpmnInstanceRequest.getK8sRBProfileName());
+            multicloudInstanceRequest.setRbName(bpmnInstanceRequest.getModelInvariantId());
+            multicloudInstanceRequest.setRbVersion(bpmnInstanceRequest.getModelVersionId());
+            multicloudInstanceRequest.setVfModuleUuid(bpmnInstanceRequest.getVfModuleUUID());
+        } else {
+
+            logger.info("K8sRBProfileName is required");
+            return "K8sRBProfileName is required";
+        }
+
+        // TODO
+        // Below URL should be changed as appropriate multicloud URL.
+        HttpPost post = new HttpPost("http://172.17.0.2:31770/v1/instance");
+        ObjectMapper objectMapper = new ObjectMapper();
+
+        String requestBody = objectMapper.writeValueAsString(multicloudInstanceRequest);
+        StringEntity requestEntity = new StringEntity(requestBody, ContentType.APPLICATION_JSON);
+        post.setEntity(requestEntity);
+
+        try (CloseableHttpClient httpClient = HttpClients.createDefault();
+                CloseableHttpResponse response = httpClient.execute(post)) {
+            logger.info("response:" + response.getEntity());
+            return EntityUtils.toString(response.getEntity());
+        }
+    }
+
+    // This api is not enabled in multicloud project ,but this is required in
+    // future.
+    @ResponseBody
+    @RequestMapping(value = {"/api/cnf-adapter/v1/v1/instance/{vnfInstanceId}"}, method = RequestMethod.PUT,
+            produces = "application/json")
+    public String updateInstance(@RequestBody MulticloudInstanceRequest iE,
+            @PathVariable("vnfInstanceId") String instanceId) throws Exception {
 
         logger.info("create Instance called.");
 
         // TODO
         // Below URL should be changed as appropriate multicloud URL.
-        HttpPost post = new HttpPost("https://localhost:32780/api/multicloud-k8s/v1/v1/instance");
+        HttpPut post = new HttpPut("http://172.17.0.2:31770/v1/instance/" + instanceId);
         ObjectMapper objectMapper = new ObjectMapper();
 
-        objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
         String requestBody = objectMapper.writeValueAsString(iE);
         StringEntity requestEntity = new StringEntity(requestBody, ContentType.APPLICATION_JSON);
         post.setEntity(requestEntity);
@@ -155,14 +364,15 @@
     }
 
     @ResponseBody
-    @RequestMapping(value = {"/api/multicloud-k8s/v1/v1/instance/{instID}"}, method = RequestMethod.GET,
+    @RequestMapping(value = {"/api/cnf-adapter/v1/v1/instance/{instID}"}, method = RequestMethod.GET,
             produces = "application/json")
     public String getInstance(@PathVariable("instID") String instanceId) throws Exception {
 
         logger.info("get Instance called.");
+
         // TODO
         // Below URL should be changed as appropriate multicloud URL.
-        HttpGet req = new HttpGet("https://localhost:32780/api/multicloud-k8s/v1/v1/instance/" + instanceId);
+        HttpGet req = new HttpGet("http://172.17.0.2:31770/v1/instance/" + instanceId);
 
         try (CloseableHttpResponse response = httpClient.execute(req)) {
             logger.info("response:" + response.getEntity());
@@ -171,8 +381,62 @@
     }
 
     @ResponseBody
-    @RequestMapping(
-            value = {"/api/multicloud-k8s/v1/v1/definition/{rb-name}/{rb-version}/profile/{profile-name}/config"},
+    @RequestMapping(value = {"/api/cnf-adapter/v1/v1/instance/{instID}/status"}, method = RequestMethod.GET,
+            produces = "application/json")
+    public String getInstanceStatus(@PathVariable("instID") String instanceId) throws Exception {
+
+        logger.info("getInstanceStatus called.");
+
+        // TODO
+        // Below URL should be changed as appropriate multicloud URL.
+        HttpGet req = new HttpGet("http://172.17.0.2:31770/v1/instance/" + instanceId + "/status");
+
+        try (CloseableHttpResponse response = httpClient.execute(req)) {
+            logger.info("response:" + response.getEntity());
+            return EntityUtils.toString(response.getEntity());
+        }
+    }
+
+    @RequestMapping(value = {"/api/cnf-adapter/v1/v1/instance"}, method = RequestMethod.GET,
+            produces = "application/json")
+    public String getInstanceBasedOnRBNameOrRBVersionOrProfileName(
+            @RequestParam(value = "rb-name", required = false) String rbName,
+            @RequestParam(value = "rb-version", required = false) String rbVersion,
+            @RequestParam(value = "profile-name", required = false) String profileName) throws Exception {
+
+        logger.info("getInstanceBasedOnRBNameOrRBVersionOrProfileName called.");
+
+        // TODO
+        // Below URL should be changed as appropriate multicloud URL.
+        HttpGet req = new HttpGet("http://172.17.0.2:31770/v1/instance?rb-name=" + rbName + "&rb-version=" + rbVersion
+                + "&profile-name=" + profileName);
+
+        try (CloseableHttpResponse response = httpClient.execute(req)) {
+            logger.info("response:" + response.getEntity());
+            return EntityUtils.toString(response.getEntity());
+        }
+    }
+
+    @ResponseBody
+    @RequestMapping(value = {"/api/cnf-adapter/v1/v1/instance/{instID}"}, method = RequestMethod.DELETE,
+            produces = "application/json")
+    public String deleteInstance(@PathVariable("instID") String instanceID) throws Exception {
+
+        logger.info("delete Instance called.");
+
+        // TODO
+        // Below URL should be changed as appropriate multicloud URL.
+        HttpDelete req = new HttpDelete("http://172.17.0.2:31770/v1/instance/" + instanceID);
+
+        try (CloseableHttpResponse response = httpClient.execute(req)) {
+            logger.info("response:" + response.getEntity());
+            return EntityUtils.toString(response.getEntity());
+        }
+
+    }
+
+    @ResponseBody
+    @RequestMapping(value = {"/api/cnf-adapter/v1/v1/definition/{rb-name}/{rb-version}/profile/{profile-name}/config"},
             method = RequestMethod.POST, produces = "application/json")
     public String createConfiguration(@RequestBody ConfigurationEntity cE, @PathVariable("rb-name") String rbName,
             @PathVariable("rb-version") String rbVersion, @PathVariable("profile-name") String prName)
@@ -182,8 +446,8 @@
 
         // TODO
         // Below URL should be changed as appropriate multicloud URL.
-        HttpPost post = new HttpPost("https://localhost:32780/api/multicloud-k8s/v1/v1/definition/" + rbName + "/"
-                + rbVersion + "/profile/" + prName + "/config");
+        HttpPost post = new HttpPost(
+                "http://172.17.0.2:31770/v1/definition/" + rbName + "/" + rbVersion + "/profile/" + prName + "/config");
         ObjectMapper objectMapper = new ObjectMapper();
         String requestBody = objectMapper.writeValueAsString(cE);
         StringEntity requestEntity = new StringEntity(requestBody, ContentType.APPLICATION_JSON);
@@ -198,7 +462,7 @@
 
     @ResponseBody
     @RequestMapping(value = {
-            "/api/multicloud-k8s/v1/v1/definition/{rb-name}/{rb-version}/profile/{profile-name}/config/{cfg-name}"},
+            "/api/cnf-adapter/v1/v1/definition/{rb-name}/{rb-version}/profile/{profile-name}/config/{cfg-name}"},
             method = RequestMethod.GET, produces = "application/json")
     public String getConfiguration(@PathVariable("rb-name") String rbName, @PathVariable("rb-version") String rbVersion,
             @PathVariable("profile-name") String prName, @PathVariable("cfg-name") String cfgName) throws Exception {
@@ -207,8 +471,8 @@
 
         // TODO
         // Below URL should be changed as appropriate multicloud URL.
-        HttpGet req = new HttpGet("https://localhost:32780/api/multicloud-k8s/v1/v1/definition/" + rbName + "/"
-                + rbVersion + "/profile/" + prName + "/config/" + cfgName);
+        HttpGet req = new HttpGet("http://172.17.0.2:31770/v1/definition/" + rbName + "/" + rbVersion + "/profile/"
+                + prName + "/config/" + cfgName);
 
         try (CloseableHttpResponse response = httpClient.execute(req)) {
             logger.info("response:" + response.getEntity());
@@ -217,7 +481,79 @@
     }
 
     @ResponseBody
-    @RequestMapping(value = {"/api/multicloud-k8s/v1/v1/connectivity-info"}, method = RequestMethod.POST,
+    @RequestMapping(value = {
+            "/api/cnf-adapter/v1/v1/definition/{rb-name}/{rb-version}/profile/{profile-name}/config/{cfg-name}"},
+            method = RequestMethod.DELETE, produces = "application/json")
+    public String deleteConfiguration(@PathVariable("rb-name") String rbName,
+            @PathVariable("rb-version") String rbVersion, @PathVariable("profile-name") String prName,
+            @PathVariable("cfg-name") String cfgName) throws Exception {
+
+        logger.info("delete Configuration called.");
+
+        // TODO
+        // Below URL should be changed as appropriate multicloud URL.
+        HttpDelete req = new HttpDelete("http://172.17.0.2:31770/v1/definition/" + rbName + "/" + rbVersion
+                + "/profile/" + prName + "/config/" + cfgName);
+
+        try (CloseableHttpResponse response = httpClient.execute(req)) {
+            logger.info("response:" + response.getEntity());
+            return EntityUtils.toString(response.getEntity());
+        }
+
+    }
+
+    @ResponseBody
+    @RequestMapping(value = {
+            "/api/cnf-adapter/v1/v1/definition/{rb-name}/{rb-version}/profile/{profile-name}/config/{cfg-name}"},
+            method = RequestMethod.PUT, produces = "application/json")
+    public String updateConfiguration(@RequestBody ConfigurationEntity cE, @PathVariable("rb-name") String rbName,
+            @PathVariable("rb-version") String rbVersion, @PathVariable("profile-name") String prName,
+            @PathVariable("cfg-name") String cfgName) throws Exception {
+
+        logger.info("update Configuration called.");
+
+        // TODO
+        // Below URL should be changed as appropriate multicloud URL.
+        HttpPut post = new HttpPut("http://172.17.0.2:31770/v1/definition/" + rbName + "/" + rbVersion + "/profile/"
+                + prName + "/config/" + cfgName);
+        ObjectMapper objectMapper = new ObjectMapper();
+        String requestBody = objectMapper.writeValueAsString(cE);
+        StringEntity requestEntity = new StringEntity(requestBody, ContentType.APPLICATION_JSON);
+        post.setEntity(requestEntity);
+
+        try (CloseableHttpClient httpClient = HttpClients.createDefault();
+                CloseableHttpResponse response = httpClient.execute(post)) {
+            logger.info("response:" + response.getEntity());
+            return EntityUtils.toString(response.getEntity());
+        }
+    }
+
+    @ResponseBody
+    @RequestMapping(value = {"/api/cnf-adapter/v1/v1/definition/{rb-name}/{rb-version}/profile/{profile-name}/tagit"},
+            method = RequestMethod.POST, produces = "application/json")
+    public String tagConfigurationValue(@RequestBody Tag tag, @PathVariable("rb-name") String rbName,
+            @PathVariable("rb-version") String rbVersion, @PathVariable("pr-name") String prName) throws Exception {
+        logger.info("Tag Configuration called.");
+
+        // TODO
+        // Below URL should be changed as appropriate multicloud URL.
+        HttpPost post = new HttpPost("http://172.17.0.2:31770/v1/definition/" + rbName + "/" + rbVersion + "/profile/"
+                + prName + "/config/tagit");
+
+        ObjectMapper objectMapper = new ObjectMapper();
+        String requestBody = objectMapper.writeValueAsString(tag);
+        StringEntity requestEntity = new StringEntity(requestBody, ContentType.APPLICATION_JSON);
+        post.setEntity(requestEntity);
+
+        try (CloseableHttpClient httpClient = HttpClients.createDefault();
+                CloseableHttpResponse response = httpClient.execute(post)) {
+            logger.info("response:" + response.getEntity());
+            return EntityUtils.toString(response.getEntity());
+        }
+    }
+
+    @ResponseBody
+    @RequestMapping(value = {"/api/cnf-adapter/v1/v1/connectivity-info"}, method = RequestMethod.POST,
             produces = "application/json")
     public String createConnectivityInfo(@RequestBody ConnectivityInfo cIE) throws Exception {
 
@@ -225,7 +561,7 @@
 
         // TODO
         // Below URL should be changed as appropriate multicloud URL.
-        HttpPost post = new HttpPost("https://localhost:32780/api/multicloud-k8s/v1/v1/connectivity-info");
+        HttpPost post = new HttpPost("http://172.17.0.2:31770/v1/connectivity-info");
         ObjectMapper objectMapper = new ObjectMapper();
         String requestBody = objectMapper.writeValueAsString(cIE);
         StringEntity requestEntity = new StringEntity(requestBody, ContentType.APPLICATION_JSON);
@@ -239,7 +575,7 @@
     }
 
     @ResponseBody
-    @RequestMapping(value = {"/api/multicloud-k8s/v1/v1/connectivity-info/{connname}"}, method = RequestMethod.GET,
+    @RequestMapping(value = {"/api/cnf-adapter/v1/v1/connectivity-info/{connname}"}, method = RequestMethod.GET,
             produces = "application/json")
     public String getConnectivityInfo(@PathVariable("connname") String connName) throws Exception {
 
@@ -247,7 +583,7 @@
 
         // TODO
         // Below URL should be changed as appropriate multicloud URL.
-        HttpGet req = new HttpGet("https://localhost:32780/api/multicloud-k8s/v1/v1/connectivity-info/" + connName);
+        HttpGet req = new HttpGet("http://172.17.0.2:31770/v1/connectivity-info/" + connName);
 
         try (CloseableHttpResponse response = httpClient.execute(req)) {
             logger.info("response:" + response.getEntity());
@@ -256,7 +592,25 @@
     }
 
     @ResponseBody
-    @RequestMapping(value = {"/api/multicloud-k8s/v1/v1/rb/definition/{rb-name}/{rb-version}/config-template"},
+    @RequestMapping(value = {"/api/cnf-adapter/v1/v1/connectivity-info/{connname}"}, method = RequestMethod.DELETE,
+            produces = "application/json")
+    public String deleteConnectivityInfo(@PathVariable("connname") String connName) throws Exception {
+
+        logger.info("delete Connectivity Info called.");
+
+        // TODO
+        // Below URL should be changed as appropriate multicloud URL.
+        HttpDelete req = new HttpDelete("http://172.17.0.2:31770/v1/connectivity-info/" + connName);
+
+        try (CloseableHttpResponse response = httpClient.execute(req)) {
+            logger.info("response:" + response.getEntity());
+            return EntityUtils.toString(response.getEntity());
+        }
+
+    }
+
+    @ResponseBody
+    @RequestMapping(value = {"/api/cnf-adapter/v1/v1/rb/definition/{rb-name}/{rb-version}/config-template"},
             method = RequestMethod.POST, produces = "application/json")
     public String createConfigTemplate(@RequestBody ConfigTemplateEntity tE, @PathVariable("rb-name") String rbName,
             @PathVariable("rb-version") String rbVersion) throws Exception {
@@ -265,8 +619,8 @@
 
         // TODO
         // Below URL should be changed as appropriate multicloud URL.
-        HttpPost post = new HttpPost("http://localhost:32780/api/multicloud-k8s/v1/v1/rb/definition/" + rbName + "/"
-                + rbVersion + "/config-template");
+        HttpPost post = new HttpPost(
+                "http://172.17.0.2:31770/v1/rb/definition/" + rbName + "/" + rbVersion + "/config-template");
         ObjectMapper objectMapper = new ObjectMapper();
         String requestBody = objectMapper.writeValueAsString(tE);
         StringEntity requestEntity = new StringEntity(requestBody, ContentType.APPLICATION_JSON);
@@ -280,7 +634,7 @@
     }
 
     @ResponseBody
-    @RequestMapping(value = {"/api/multicloud-k8s/v1/v1/rb/definition/{rb-name}/{rb-version}/config-template/{tname}"},
+    @RequestMapping(value = {"/api/cnf-adapter/v1/v1/rb/definition/{rb-name}/{rb-version}/config-template/{tname}"},
             method = RequestMethod.GET, produces = "application/json")
     public String getConfigTemplate(@PathVariable("rb-name") String rbName,
             @PathVariable("rb-version") String rbVersion, @PathVariable("tname") String tName) throws Exception {
@@ -289,8 +643,8 @@
 
         // TODO
         // Below URL should be changed as appropriate multicloud URL.
-        HttpGet req = new HttpGet("https://localhost:32780/api/multicloud-k8s/v1/v1/rb/definition/" + rbName + "/"
-                + rbVersion + "/config-template/" + tName);
+        HttpGet req = new HttpGet(
+                "http://172.17.0.2:31770/v1/rb/definition/" + rbName + "/" + rbVersion + "/config-template/" + tName);
 
         try (CloseableHttpResponse response = httpClient.execute(req)) {
             logger.info("response:" + response.getEntity());
@@ -298,4 +652,83 @@
         }
     }
 
+    @ResponseBody
+    @RequestMapping(value = {"/api/cnf-adapter/v1/v1/rb/definition/{rb-name}/{rb-version}/config-template/{tname}"},
+            method = RequestMethod.DELETE, produces = "application/json")
+    public String deleteTemplate(@PathVariable("rb-name") String rbName, @PathVariable("rb-version") String rbVersion,
+            @PathVariable("tname") String tName) throws Exception {
+
+        logger.info("deleteTemplate called.");
+
+        // TODO
+        // Below URL should be changed as appropriate multicloud URL.
+        HttpDelete req = new HttpDelete(
+                "http://172.17.0.2:31770/v1/rb/definition/" + rbName + "/" + rbVersion + "/config-template/" + tName);
+
+        try (CloseableHttpResponse response = httpClient.execute(req)) {
+            logger.info("response:" + response.getEntity());
+            return EntityUtils.toString(response.getEntity());
+        }
+
+    }
+
+    @ResponseBody
+    @RequestMapping(
+            value = {"/api/cnf-adapter/v1/v1/rb/definition/{rb-name}/{rb-version}/config-template/{tname}/content"},
+            method = RequestMethod.POST, produces = "multipart/form-data")
+    public String uploadTarFileForTemplate(@RequestParam("file") MultipartFile file,
+            @PathVariable("rb-name") String rbName, @PathVariable("rb-version") String rbVersion,
+            @PathVariable("tname") String tName) throws Exception {
+
+        logger.info("uploadTarFileForTemplate called.");
+
+        File convFile = new File(file.getOriginalFilename());
+        file.transferTo(convFile);
+        FileBody fileBody = new FileBody(convFile, ContentType.DEFAULT_BINARY);
+        MultipartEntityBuilder builder = MultipartEntityBuilder.create();
+        builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
+        builder.addPart("file", fileBody);
+        HttpEntity entity = builder.build();
+
+        // TODO
+        // Below URL should be changed as appropriate multicloud URL.
+        HttpPost post = new HttpPost("http://172.17.0.2:31770/v1/rb/definition/" + rbName + "/" + rbVersion
+                + "/config-template/" + tName + "/content");
+        post.setHeader("Content-Type", "multipart/form-data");
+
+        logger.info(String.valueOf(post));
+        post.setEntity(entity);
+
+        try (CloseableHttpClient httpClient = HttpClients.createDefault();
+                CloseableHttpResponse response = httpClient.execute(post)) {
+            logger.info("response:" + response.getEntity());
+            return EntityUtils.toString(response.getEntity());
+        }
+    }
+
+    @ResponseBody
+    @RequestMapping(value = {"/api/cnf-adapter/v1/v1/definition/{rbName}/{rbVersion}/profile/{prName}/config/rollback"},
+            method = RequestMethod.DELETE, produces = "application/json")
+    public String rollbackConfiguration(@RequestBody ConfigurationRollbackEntity rE,
+            @PathVariable("rbName") String rbName, @PathVariable("rbVersion") String rbVersion,
+            @PathVariable("prName") String prName) throws Exception {
+        logger.info("rollbackConfiguration called.");
+
+        // TODO
+        // Below URL should be changed as appropriate multicloud URL.
+        HttpPost post = new HttpPost("http://172.17.0.2:31770/v1/definition/" + rbName + "/" + rbVersion + "/profile/"
+                + prName + "/config/rollback");
+
+        ObjectMapper objectMapper = new ObjectMapper();
+        String requestBody = objectMapper.writeValueAsString(rE);
+        StringEntity requestEntity = new StringEntity(requestBody, ContentType.APPLICATION_JSON);
+        post.setEntity(requestEntity);
+
+        try (CloseableHttpClient httpClient = HttpClients.createDefault();
+                CloseableHttpResponse response = httpClient.execute(post)) {
+            logger.info("response:" + response.getEntity());
+            return EntityUtils.toString(response.getEntity());
+        }
+    }
+
 }
diff --git a/adapters/mso-cnf-adapter/src/main/java/org/onap/so/adapters/cnf/util/CNfAdapterUtil.java b/adapters/mso-cnf-adapter/src/main/java/org/onap/so/adapters/cnf/util/CNfAdapterUtil.java
new file mode 100644
index 0000000..25e506c
--- /dev/null
+++ b/adapters/mso-cnf-adapter/src/main/java/org/onap/so/adapters/cnf/util/CNfAdapterUtil.java
@@ -0,0 +1,94 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.adapters.cnf.util;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import java.io.IOException;
+import org.onap.so.adapters.cnf.exceptions.ApplicationException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.onap.logging.filter.base.ErrorCode;
+import static org.onap.so.logger.LoggingAnchor.THREE;
+import static org.onap.so.logger.MessageEnum.RA_NS_EXC;
+
+public class CNfAdapterUtil {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(CNfAdapterUtil.class);
+
+    public static final int BAD_REQUEST = 400;
+
+    private static final String UNMARSHAL_FAIL_MSG = "Failed to unmarshal json";
+
+    private static final String MARSHAL_FAIL_MSG = "Failed to marshal object";
+
+    private static final ObjectMapper MAPPER = new ObjectMapper();
+
+    public static class StatusDesc {
+
+        public static final String ALLOCATE_NSS_SUCCESS = "Allocating nss is " + "successful";
+
+        public static final String CREATE_NSS_SUCCESS = "Creating nss is " + "successful";
+
+        public static final String DEALLOCATE_NSS_SUCCESS = "Deallocate nss " + "is successful";
+
+        public static final String ACTIVATE_NSS_SUCCESS = "Activate nss " + "is successful";
+
+        public static final String DEACTIVATE_NSS_SUCCESS = "Deactivate nss " + "is successful";
+
+        public static final String QUERY_JOB_STATUS_FAILED = "Query job " + "status failed";
+
+        public static final String QUERY_JOB_STATUS_SUCCESS = "Query job " + "status is successful";
+
+        private StatusDesc() {
+
+        }
+    }
+
+    private CNfAdapterUtil() {
+
+    }
+
+    public static void assertObjectNotNull(Object object) throws ApplicationException {
+        if (null == object) {
+            LOGGER.error("Object is null.");
+            throw new ApplicationException(BAD_REQUEST, "An object is null.");
+        }
+    }
+
+    public static <T> T unMarshal(String jsonstr, Class<T> type) throws ApplicationException {
+        try {
+            return MAPPER.readValue(jsonstr, type);
+        } catch (IOException e) {
+            LOGGER.error(THREE, RA_NS_EXC.toString(), ErrorCode.BusinessProcessError.getValue(), UNMARSHAL_FAIL_MSG, e);
+            throw new ApplicationException(BAD_REQUEST, UNMARSHAL_FAIL_MSG);
+        }
+    }
+
+    public static String marshal(Object srcObj) throws ApplicationException {
+        try {
+            return MAPPER.writerWithDefaultPrettyPrinter().writeValueAsString(srcObj);
+        } catch (IOException e) {
+            LOGGER.error(THREE, RA_NS_EXC.toString(), ErrorCode.BusinessProcessError.getValue(), MARSHAL_FAIL_MSG, e);
+            throw new ApplicationException(BAD_REQUEST, MARSHAL_FAIL_MSG);
+        }
+    }
+
+}
diff --git a/adapters/mso-cnf-adapter/src/test/java/org/onap/so/adapters/cnf/CnfAdapterRestTest.java b/adapters/mso-cnf-adapter/src/test/java/org/onap/so/adapters/cnf/CnfAdapterRestTest.java
new file mode 100644
index 0000000..38a1091
--- /dev/null
+++ b/adapters/mso-cnf-adapter/src/test/java/org/onap/so/adapters/cnf/CnfAdapterRestTest.java
@@ -0,0 +1,62 @@
+/*-
+ * ============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.adapters.cnf;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import java.util.HashMap;
+import java.util.Map;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.onap.so.adapters.cnf.model.BpmnInstanceRequest;
+import org.onap.so.adapters.cnf.rest.CnfAdapterRest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+public class CnfAdapterRestTest {
+
+    @InjectMocks
+    CnfAdapterRest cnfAdapterRest;
+
+    @Test
+    public void createInstanceTest() throws Exception {
+
+        Map<String, String> labels = new HashMap<String, String>();
+        labels.put("custom-label-1", "label1");
+        Map<String, String> overrideValues = new HashMap<String, String>();
+        labels.put("image.tag", "latest");
+        labels.put("dcae_collector_ip", "1.2.3.4");
+        BpmnInstanceRequest bpmnInstanceRequest = new BpmnInstanceRequest();
+        bpmnInstanceRequest.setCloudRegionId("v1");
+        bpmnInstanceRequest.setLabels(labels);
+        bpmnInstanceRequest.setModelInvariantId("krd");
+        bpmnInstanceRequest.setModelVersionId("p1");
+        bpmnInstanceRequest.setOverrideValues(overrideValues);
+        bpmnInstanceRequest.setVfModuleUUID("20200824");
+
+        String mockedResponse = "K8sRBProfileName is required";
+        String actualResponse = cnfAdapterRest.createInstance(bpmnInstanceRequest);
+        assertNotNull(actualResponse);
+        assertEquals(mockedResponse, actualResponse);
+    }
+
+}
diff --git a/adapters/mso-nssmf-adapter/pom.xml b/adapters/mso-nssmf-adapter/pom.xml
index db79182..45fe77e 100644
--- a/adapters/mso-nssmf-adapter/pom.xml
+++ b/adapters/mso-nssmf-adapter/pom.xml
@@ -162,7 +162,6 @@
     <dependency>
       <groupId>org.projectlombok</groupId>
       <artifactId>lombok</artifactId>
-      <version>1.18.2</version>
     </dependency>
   </dependencies>
 </project>
diff --git a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/MSONssmfApplication.java b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/MSONssmfApplication.java
index cd011e6..83a09dc 100644
--- a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/MSONssmfApplication.java
+++ b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/MSONssmfApplication.java
@@ -20,6 +20,7 @@
 
 package org.onap.so.adapters.nssmf;
 
+
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 
diff --git a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/config/NssmfAdapterConfig.java b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/config/NssmfAdapterConfig.java
new file mode 100644
index 0000000..6a59244
--- /dev/null
+++ b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/config/NssmfAdapterConfig.java
@@ -0,0 +1,36 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ # Copyright (c) 2020, 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.nssmf.config;
+
+import lombok.Getter;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@Getter
+public class NssmfAdapterConfig {
+
+    @Value("${mso.infra.endpoint}")
+    private String infraEndpoint;
+
+    @Value("${mso.infra.auth}")
+    private String infraAuth;
+}
diff --git a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/RequestDbConfig.java b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/config/RequestDbConfig.java
similarity index 98%
rename from adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/RequestDbConfig.java
rename to adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/config/RequestDbConfig.java
index 484f762..dcb5d61 100644
--- a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/RequestDbConfig.java
+++ b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/config/RequestDbConfig.java
@@ -18,7 +18,7 @@
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.so.adapters.nssmf;
+package org.onap.so.adapters.nssmf.config;
 
 import javax.persistence.EntityManagerFactory;
 import javax.sql.DataSource;
diff --git a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/WebSecurityConfig.java b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/config/WebSecurityConfig.java
similarity index 97%
rename from adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/WebSecurityConfig.java
rename to adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/config/WebSecurityConfig.java
index 1522ca9..dfb2b61 100644
--- a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/WebSecurityConfig.java
+++ b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/config/WebSecurityConfig.java
@@ -18,7 +18,7 @@
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.so.adapters.nssmf;
+package org.onap.so.adapters.nssmf.config;
 
 import org.springframework.context.annotation.Configuration;
 import org.springframework.security.config.annotation.web.builders.HttpSecurity;
diff --git a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/consts/NssmfAdapterConsts.java b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/consts/NssmfAdapterConsts.java
new file mode 100644
index 0000000..e762bc0
--- /dev/null
+++ b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/consts/NssmfAdapterConsts.java
@@ -0,0 +1,187 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ # Copyright (c) 2020, 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.nssmf.consts;
+
+import org.onap.so.adapters.nssmf.entity.NssmfUrlInfo;
+import org.onap.so.adapters.nssmf.enums.ActionType;
+import org.onap.so.adapters.nssmf.enums.ExecutorType;
+import org.onap.so.adapters.nssmf.enums.HttpMethod;
+import org.onap.so.beans.nsmf.NetworkType;
+import java.util.HashMap;
+import java.util.Map;
+
+public class NssmfAdapterConsts {
+
+    public final static String ONAP_INTERNAL_TAG = "ONAP_internal";
+
+    public final static String CURRENT_INTERNAL_NSSMF_API_VERSION = "v1";
+
+    private static Map<String, NssmfUrlInfo> urlInfoMap = new HashMap<>();
+
+    private final static String EXTERNAL_CN_ALLOCATE_URL = "/api/rest/provMns/{apiVersion}/NSS/SliceProfiles";
+
+    private final static String EXTERNAL_TN_ALLOCATE_URL = "/api/rest/provMns/{apiVersion}/tn/NSS/SliceProfiles";
+
+    private final static String EXTERNAL_AN_ALLOCATE_URL = "/ObjectManagement/NSS/SliceProfiles";
+
+    private final static String INTERNAL_ALLOCATE_URL = "/onap/so/infra/3gppservices/{apiVersion}/allocate";
+
+    private final static String EXTERNAL_CN_DEALLOCATE_URL =
+            "/api/rest/provMns/{apiVersion}/NSS/SliceProfiles/{sliceProfileId}";
+
+    private final static String EXTERNAL_TN_DEALLOCATE_URL =
+            "/api/rest/provMns/{apiVersion}/tn/NSS/SliceProfiles/{sliceProfileId}";
+
+    private final static String EXTERNAL_AN_DEALLOCATE_URL = "/ObjectManagement/NSS/SliceProfiles/{SliceProfileId}";
+
+    private final static String INTERNAL_DEALLOCATE_URL = "/onap/so/infra/3gppservices/{apiVersion}/deAllocate";
+
+    private final static String EXTERNAL_CN_ACTIVATE_URL = "/api/rest/provMns/{apiVersion}/NSS/{snssai}/activation";
+
+    private final static String EXTERNAL_TN_ACTIVATE_URL = "/api/rest/provMns/{apiVersion}/tn/NSS/{snssai}/activation";
+
+    private final static String EXTERNAL_AN_ACTIVATE_URL = "/api/rest/provMns/{apiVersion}/an/NSS/{snssai}/activations";
+
+    private final static String INTERNAL_ACTIVATE_URL = "/onap/so/infra/3gppservices/{apiVersion}/activate";
+
+    private final static String EXTERNAL_CN_DEACTIVATE_URL = "/api/rest/provMns/{apiVersion}/NSS/{snssai}/deactivation";
+
+    private final static String EXTERNAL_TN_DEACTIVATE_URL =
+            "/api/rest/provMns/{apiVersion}/tn/NSS/{snssai}/deactivation";
+
+    private final static String EXTERNAL_AN_DEACTIVATE_URL =
+            "/api/rest/provMns/{apiVersion}/an/NSS/{snssai}/deactivation";
+
+    private final static String INTERNAL_DEACTIVATE_URL = "/onap/so/infra/3gppservices/{apiVersion}/deActivate";
+
+    //
+    private final static String EXTERNAL_CN_TERMINATE_URL =
+            "/api/rest/provMns/{apiVersion}/NSS/SliceProfiles/{SliceProfileId}";
+
+    private final static String EXTERNAL_TN_TERMINATE_URL =
+            "/api/rest/provMns/{apiVersion}/tn/NSS/SliceProfiles/{SliceProfileId}";
+
+    private final static String EXTERNAL_AN_TERMINATE_URL =
+            "/api/rest/provMns/{apiVersion}/an/NSS/SliceProfiles/{SliceProfileId}";
+
+    private final static String INTERNAL_TERMINATE_URL = "/onap/so/infra/3gppservices/{apiVersion}/terminate";
+
+    //
+    private final static String EXTERNAL_AN_MODIFY_URL =
+            "/api/rest/provMns/{apiVersion}/an/NSS/SliceProfiles/{SliceProfileId}";
+
+    private final static String INTERNAL_MODIFY_URL = "/onap/so/infra/3gppservices/{apiVersion}/modify";
+
+    //
+    private final static String EXTERNAL_QUERY_JOB_STATUS =
+            "/api/rest/provMns/{apiVersion}/NSS/jobs/{jobId}?responseId={responseId}";
+
+    private final static String INTERNAL_QUERY_SUB_NET_CAPABILITY =
+            "/onap/so/infra/3gppservices/{apiVersion}/subnetCapabilityQuery";
+
+    static {
+        urlInfoMap.put(generateKey(ExecutorType.EXTERNAL, NetworkType.ACCESS, ActionType.ALLOCATE),
+                new NssmfUrlInfo(EXTERNAL_AN_ALLOCATE_URL, HttpMethod.POST));
+        urlInfoMap.put(generateKey(ExecutorType.EXTERNAL, NetworkType.TRANSPORT, ActionType.ALLOCATE),
+                new NssmfUrlInfo(EXTERNAL_TN_ALLOCATE_URL, HttpMethod.POST));
+        urlInfoMap.put(generateKey(ExecutorType.EXTERNAL, NetworkType.CORE, ActionType.ALLOCATE),
+                new NssmfUrlInfo(EXTERNAL_CN_ALLOCATE_URL, HttpMethod.POST));
+        urlInfoMap.put(generateKey(ExecutorType.INTERNAL, null, ActionType.ALLOCATE),
+                new NssmfUrlInfo(INTERNAL_ALLOCATE_URL, HttpMethod.POST));
+
+        urlInfoMap.put(generateKey(ExecutorType.EXTERNAL, NetworkType.ACCESS, ActionType.DEALLOCATE),
+                new NssmfUrlInfo(EXTERNAL_AN_DEALLOCATE_URL, HttpMethod.DELETE));
+        urlInfoMap.put(generateKey(ExecutorType.EXTERNAL, NetworkType.TRANSPORT, ActionType.DEALLOCATE),
+                new NssmfUrlInfo(EXTERNAL_TN_DEALLOCATE_URL, HttpMethod.DELETE));
+        urlInfoMap.put(generateKey(ExecutorType.EXTERNAL, NetworkType.CORE, ActionType.DEALLOCATE),
+                new NssmfUrlInfo(EXTERNAL_CN_DEALLOCATE_URL, HttpMethod.DELETE));
+        urlInfoMap.put(generateKey(ExecutorType.INTERNAL, null, ActionType.DEALLOCATE),
+                new NssmfUrlInfo(INTERNAL_DEALLOCATE_URL, HttpMethod.DELETE));
+
+        urlInfoMap.put(generateKey(ExecutorType.EXTERNAL, NetworkType.ACCESS, ActionType.ACTIVATE),
+                new NssmfUrlInfo(EXTERNAL_AN_ACTIVATE_URL, HttpMethod.PUT));
+        urlInfoMap.put(generateKey(ExecutorType.EXTERNAL, NetworkType.TRANSPORT, ActionType.ACTIVATE),
+                new NssmfUrlInfo(EXTERNAL_TN_ACTIVATE_URL, HttpMethod.PUT));
+        urlInfoMap.put(generateKey(ExecutorType.EXTERNAL, NetworkType.CORE, ActionType.ACTIVATE),
+                new NssmfUrlInfo(EXTERNAL_CN_ACTIVATE_URL, HttpMethod.PUT));
+        urlInfoMap.put(generateKey(ExecutorType.INTERNAL, null, ActionType.ACTIVATE),
+                new NssmfUrlInfo(INTERNAL_ACTIVATE_URL, HttpMethod.PUT));
+
+        urlInfoMap.put(generateKey(ExecutorType.EXTERNAL, NetworkType.ACCESS, ActionType.DEACTIVATE),
+                new NssmfUrlInfo(EXTERNAL_AN_DEACTIVATE_URL, HttpMethod.PUT));
+        urlInfoMap.put(generateKey(ExecutorType.EXTERNAL, NetworkType.TRANSPORT, ActionType.DEACTIVATE),
+                new NssmfUrlInfo(EXTERNAL_TN_DEACTIVATE_URL, HttpMethod.PUT));
+        urlInfoMap.put(generateKey(ExecutorType.EXTERNAL, NetworkType.CORE, ActionType.DEACTIVATE),
+                new NssmfUrlInfo(EXTERNAL_CN_DEACTIVATE_URL, HttpMethod.PUT));
+        urlInfoMap.put(generateKey(ExecutorType.INTERNAL, null, ActionType.DEACTIVATE),
+                new NssmfUrlInfo(INTERNAL_DEACTIVATE_URL, HttpMethod.PUT));
+
+        urlInfoMap.put(generateKey(ExecutorType.EXTERNAL, NetworkType.ACCESS, ActionType.TERMINATE),
+                new NssmfUrlInfo(EXTERNAL_AN_TERMINATE_URL, HttpMethod.DELETE));
+        urlInfoMap.put(generateKey(ExecutorType.EXTERNAL, NetworkType.TRANSPORT, ActionType.TERMINATE),
+                new NssmfUrlInfo(EXTERNAL_TN_TERMINATE_URL, HttpMethod.DELETE));
+        urlInfoMap.put(generateKey(ExecutorType.EXTERNAL, NetworkType.CORE, ActionType.TERMINATE),
+                new NssmfUrlInfo(EXTERNAL_CN_TERMINATE_URL, HttpMethod.DELETE));
+        urlInfoMap.put(generateKey(ExecutorType.INTERNAL, null, ActionType.TERMINATE),
+                new NssmfUrlInfo(INTERNAL_TERMINATE_URL, HttpMethod.DELETE));
+
+        urlInfoMap.put(generateKey(ExecutorType.EXTERNAL, NetworkType.ACCESS, ActionType.MODIFY),
+                new NssmfUrlInfo(EXTERNAL_AN_MODIFY_URL, HttpMethod.PUT));
+        urlInfoMap.put(generateKey(ExecutorType.EXTERNAL, NetworkType.CORE, ActionType.MODIFY),
+                new NssmfUrlInfo(EXTERNAL_CN_ALLOCATE_URL, HttpMethod.PUT));
+        urlInfoMap.put(generateKey(ExecutorType.INTERNAL, null, ActionType.MODIFY),
+                new NssmfUrlInfo(INTERNAL_MODIFY_URL, HttpMethod.PUT));
+
+
+        urlInfoMap.put(generateKey(ExecutorType.EXTERNAL, NetworkType.CORE, ActionType.QUERY_JOB_STATUS),
+                new NssmfUrlInfo(EXTERNAL_QUERY_JOB_STATUS, HttpMethod.GET));
+        urlInfoMap.put(generateKey(ExecutorType.EXTERNAL, NetworkType.ACCESS, ActionType.QUERY_JOB_STATUS),
+                new NssmfUrlInfo(EXTERNAL_QUERY_JOB_STATUS, HttpMethod.GET));
+        urlInfoMap.put(generateKey(ExecutorType.EXTERNAL, NetworkType.TRANSPORT, ActionType.QUERY_JOB_STATUS),
+                new NssmfUrlInfo(EXTERNAL_QUERY_JOB_STATUS, HttpMethod.GET));
+
+        urlInfoMap.put(generateKey(ExecutorType.INTERNAL, null, ActionType.QUERY_SUB_NET_CAPABILITY),
+                new NssmfUrlInfo(INTERNAL_QUERY_SUB_NET_CAPABILITY, HttpMethod.POST));
+    }
+
+    /**
+     * get nssmf url info from consts
+     * 
+     * @param executorType {@link ExecutorType}
+     * @param networkType {@link NetworkType}
+     * @param actionType {@link ActionType}
+     * @return {@link NssmfUrlInfo}
+     */
+    public static NssmfUrlInfo getNssmfUrlInfo(ExecutorType executorType, NetworkType networkType,
+            ActionType actionType) {
+
+        return urlInfoMap.get(generateKey(executorType, networkType, actionType));
+    }
+
+    private static String generateKey(ExecutorType executorType, NetworkType networkType, ActionType actionType) {
+        if (ExecutorType.EXTERNAL.equals(executorType)) {
+            return executorType.name() + "_" + networkType.name() + "_" + actionType.name();
+        }
+        return executorType.name() + "_" + actionType.name();
+    }
+
+
+}
diff --git a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/controller/NssmfAdapterController.java b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/controller/NssmfAdapterController.java
new file mode 100644
index 0000000..5360657
--- /dev/null
+++ b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/controller/NssmfAdapterController.java
@@ -0,0 +1,61 @@
+package org.onap.so.adapters.nssmf.controller;
+
+import org.onap.so.adapters.nssmf.service.NssmfManagerService;
+import org.onap.so.beans.nsmf.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
+
+@RestController
+@RequestMapping(value = "/api/rest/provMns/v1", produces = {APPLICATION_JSON}, consumes = {APPLICATION_JSON})
+public class NssmfAdapterController {
+
+    private static final Logger logger = LoggerFactory.getLogger(NssmfAdapterController.class);
+
+    @Autowired
+    private NssmfManagerService nssmfManagerService;
+
+    @PostMapping(value = "/NSS/SliceProfiles")
+    public ResponseEntity allocateNssi(@RequestBody NssmfAdapterNBIRequest nbiRequest) {
+        return nssmfManagerService.allocateNssi(nbiRequest);
+    }
+
+    @PostMapping(value = "/NSS/SliceProfiles/{sliceProfileId}")
+    public ResponseEntity deAllocateNssi(@RequestBody NssmfAdapterNBIRequest nbiRequest,
+            @PathVariable("sliceProfileId") final String sliceProfileId) {
+        return nssmfManagerService.deAllocateNssi(nbiRequest, sliceProfileId);
+    }
+
+
+    @PostMapping(value = "/NSS/{snssai}/activation")
+    public ResponseEntity activateNssi(@RequestBody NssmfAdapterNBIRequest nbiRequest,
+            @PathVariable("snssai") String snssai) {
+        return nssmfManagerService.activateNssi(nbiRequest, snssai);
+    }
+
+    @PostMapping(value = "/NSS/{snssai}/deactivation")
+    public ResponseEntity deactivateNssi(@RequestBody NssmfAdapterNBIRequest nbiRequest,
+            @PathVariable("snssai") String snssai) {
+        return nssmfManagerService.deActivateNssi(nbiRequest, snssai);
+    }
+
+    @PostMapping(value = "/NSS/jobs/{jobId}")
+    public ResponseEntity queryJobStatus(@RequestBody NssmfAdapterNBIRequest nbiRequest,
+            @PathVariable("jobId") String jobId) {
+        return nssmfManagerService.queryJobStatus(nbiRequest, jobId);
+    }
+
+    @PostMapping(value = "/NSS/NSSISelectionCapability")
+    public ResponseEntity queryNSSISelectionCapability(@RequestBody NssmfAdapterNBIRequest nbiRequest) {
+        return nssmfManagerService.queryNSSISelectionCapability(nbiRequest);
+    }
+
+    @PostMapping(value = "/NSS/subnetCapabilityQuery")
+    public ResponseEntity querySubnetCapability(@RequestBody NssmfAdapterNBIRequest nbiRequest) {
+        return nssmfManagerService.querySubnetCapability(nbiRequest);
+    }
+
+}
diff --git a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/model/ErrorResponse.java b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/entity/ErrorResponse.java
similarity index 97%
copy from adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/model/ErrorResponse.java
copy to adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/entity/ErrorResponse.java
index 188349c..a8653f8 100644
--- a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/model/ErrorResponse.java
+++ b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/entity/ErrorResponse.java
@@ -18,7 +18,7 @@
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.so.adapters.nssmf.model;
+package org.onap.so.adapters.nssmf.entity;
 
 public class ErrorResponse {
 
diff --git a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/model/TokenResponse.java b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/entity/NssmfInfo.java
similarity index 69%
copy from adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/model/TokenResponse.java
copy to adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/entity/NssmfInfo.java
index 8007075..af26264 100644
--- a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/model/TokenResponse.java
+++ b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/entity/NssmfInfo.java
@@ -18,27 +18,24 @@
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.so.adapters.nssmf.model;
+package org.onap.so.adapters.nssmf.entity;
 
-public class TokenResponse {
+import lombok.Data;
 
-    private String accessToken;
+@Data
+public class NssmfInfo {
 
-    private int expires;
+    private String url;
 
-    public String getAccessToken() {
-        return accessToken;
-    }
+    private String ipAddress;
 
-    public void setAccessToken(String accessToken) {
-        this.accessToken = accessToken;
-    }
+    private String port;
 
-    public int getExpires() {
-        return expires;
-    }
+    private String insecure;
 
-    public void setExpires(int expires) {
-        this.expires = expires;
-    }
+    private String cacert;
+
+    private String userName;
+
+    private String password;
 }
diff --git a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/entity/NssmfUrlInfo.java b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/entity/NssmfUrlInfo.java
new file mode 100644
index 0000000..f55ff10
--- /dev/null
+++ b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/entity/NssmfUrlInfo.java
@@ -0,0 +1,17 @@
+package org.onap.so.adapters.nssmf.entity;
+
+import lombok.Data;
+import org.onap.so.adapters.nssmf.enums.HttpMethod;
+
+@Data
+public class NssmfUrlInfo {
+
+    private String url;
+
+    private HttpMethod httpMethod;
+
+    public NssmfUrlInfo(String url, HttpMethod httpMethod) {
+        this.url = url;
+        this.httpMethod = httpMethod;
+    }
+}
diff --git a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/rest/RestResponse.java b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/entity/RestResponse.java
similarity index 98%
rename from adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/rest/RestResponse.java
rename to adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/entity/RestResponse.java
index cc047e4..218867c 100644
--- a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/rest/RestResponse.java
+++ b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/entity/RestResponse.java
@@ -18,7 +18,7 @@
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.so.adapters.nssmf.rest;
+package org.onap.so.adapters.nssmf.entity;
 
 import java.util.Map;
 
diff --git a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/model/TokenRequest.java b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/entity/TokenRequest.java
similarity index 69%
rename from adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/model/TokenRequest.java
rename to adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/entity/TokenRequest.java
index 3590c68..bfcb875 100644
--- a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/model/TokenRequest.java
+++ b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/entity/TokenRequest.java
@@ -18,8 +18,11 @@
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.so.adapters.nssmf.model;
+package org.onap.so.adapters.nssmf.entity;
 
+import lombok.Data;
+
+@Data
 public class TokenRequest {
 
     private String grantType;
@@ -27,28 +30,4 @@
     private String userName;
 
     private String value;
-
-    public String getGrantType() {
-        return grantType;
-    }
-
-    public void setGrantType(String grantType) {
-        this.grantType = grantType;
-    }
-
-    public String getUserName() {
-        return userName;
-    }
-
-    public void setUserName(String userName) {
-        this.userName = userName;
-    }
-
-    public String getValue() {
-        return value;
-    }
-
-    public void setValue(String value) {
-        this.value = value;
-    }
 }
diff --git a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/model/TokenResponse.java b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/entity/TokenResponse.java
similarity index 75%
rename from adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/model/TokenResponse.java
rename to adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/entity/TokenResponse.java
index 8007075..552612a 100644
--- a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/model/TokenResponse.java
+++ b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/entity/TokenResponse.java
@@ -18,27 +18,15 @@
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.so.adapters.nssmf.model;
+package org.onap.so.adapters.nssmf.entity;
 
+
+import lombok.Data;
+
+@Data
 public class TokenResponse {
 
     private String accessToken;
 
     private int expires;
-
-    public String getAccessToken() {
-        return accessToken;
-    }
-
-    public void setAccessToken(String accessToken) {
-        this.accessToken = accessToken;
-    }
-
-    public int getExpires() {
-        return expires;
-    }
-
-    public void setExpires(int expires) {
-        this.expires = expires;
-    }
 }
diff --git a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/enums/ActionType.java b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/enums/ActionType.java
new file mode 100644
index 0000000..ed327fd
--- /dev/null
+++ b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/enums/ActionType.java
@@ -0,0 +1,45 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ # Copyright (c) 2020, 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.nssmf.enums;
+
+public enum ActionType {
+    ALLOCATE,
+
+    DEALLOCATE,
+
+    CREATE,
+
+    TERMINATE,
+
+    ACTIVATE,
+
+    DEACTIVATE,
+
+    QUERY_JOB_STATUS,
+
+    MODIFY_BY_ID,
+
+    MODIFY,
+
+    QUERY_NSSI_SELECTION_CAPABILITY,
+
+    QUERY_SUB_NET_CAPABILITY
+}
diff --git a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/enums/ExecutorType.java b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/enums/ExecutorType.java
new file mode 100644
index 0000000..a76a54c
--- /dev/null
+++ b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/enums/ExecutorType.java
@@ -0,0 +1,25 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ # Copyright (c) 2020, 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.nssmf.enums;
+
+public enum ExecutorType {
+    INTERNAL, EXTERNAL
+}
diff --git a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/rest/HttpMethod.java b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/enums/HttpMethod.java
similarity index 97%
rename from adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/rest/HttpMethod.java
rename to adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/enums/HttpMethod.java
index f6abd98..9271bb5 100644
--- a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/rest/HttpMethod.java
+++ b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/enums/HttpMethod.java
@@ -18,7 +18,7 @@
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.so.adapters.nssmf.rest;
+package org.onap.so.adapters.nssmf.enums;
 
 public enum HttpMethod {
     GET, POST, PUT, DELETE, PATCH;
diff --git a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/rest/JobStatus.java b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/enums/JobStatus.java
similarity index 97%
rename from adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/rest/JobStatus.java
rename to adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/enums/JobStatus.java
index f2e651f..d5cc1df 100644
--- a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/rest/JobStatus.java
+++ b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/enums/JobStatus.java
@@ -18,7 +18,7 @@
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.so.adapters.nssmf.rest;
+package org.onap.so.adapters.nssmf.enums;
 
 import org.onap.so.adapters.nssmf.exceptions.ApplicationException;
 
diff --git a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/enums/SelectionType.java b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/enums/SelectionType.java
new file mode 100644
index 0000000..420dfdc
--- /dev/null
+++ b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/enums/SelectionType.java
@@ -0,0 +1,27 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ # Copyright (c) 2020, 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.nssmf.enums;
+
+public enum SelectionType {
+    NSSMF,
+
+    NSMF
+}
diff --git a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/exceptions/ApplicationException.java b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/exceptions/ApplicationException.java
index f63ba35..2461f5c 100644
--- a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/exceptions/ApplicationException.java
+++ b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/exceptions/ApplicationException.java
@@ -20,7 +20,7 @@
 
 package org.onap.so.adapters.nssmf.exceptions;
 
-import org.onap.so.adapters.nssmf.model.ErrorResponse;
+import org.onap.so.adapters.nssmf.entity.ErrorResponse;
 import org.springframework.http.ResponseEntity;
 import static org.onap.so.adapters.nssmf.util.NssmfAdapterUtil.marshal;
 
diff --git a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/extclients/aai/AaiServiceProvider.java b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/extclients/aai/AaiServiceProvider.java
index c737ba6..665b111 100644
--- a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/extclients/aai/AaiServiceProvider.java
+++ b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/extclients/aai/AaiServiceProvider.java
@@ -22,6 +22,7 @@
 
 import org.onap.aai.domain.yang.EsrSystemInfoList;
 import org.onap.aai.domain.yang.EsrThirdpartySdncList;
+import org.onap.aai.domain.yang.ServiceInstance;
 
 public interface AaiServiceProvider {
 
@@ -29,4 +30,7 @@
 
     EsrSystemInfoList invokeGetThirdPartySdncEsrSystemInfo(String sdncId);
 
+    void invokeCreateServiceInstance(ServiceInstance nssiInstance, String globalSubscriberId, String serviceType,
+            String serviceInstanceId);
+
 }
diff --git a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/extclients/aai/AaiServiceProviderImpl.java b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/extclients/aai/AaiServiceProviderImpl.java
index 8cb47eb..3f2e5b2 100644
--- a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/extclients/aai/AaiServiceProviderImpl.java
+++ b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/extclients/aai/AaiServiceProviderImpl.java
@@ -23,7 +23,9 @@
 
 import org.onap.aai.domain.yang.EsrSystemInfoList;
 import org.onap.aai.domain.yang.EsrThirdpartySdncList;
+import org.onap.aai.domain.yang.ServiceInstance;
 import org.onap.aaiclient.client.aai.AAIObjectType;
+import org.onap.aaiclient.client.aai.entities.uri.AAIResourceUri;
 import org.onap.aaiclient.client.aai.entities.uri.AAIUriFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -63,4 +65,12 @@
                 });
     }
 
+
+    @Override
+    public void invokeCreateServiceInstance(ServiceInstance nssiInstance, String globalSubscriberId, String serviceType,
+            String serviceInstanceId) {
+        AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, globalSubscriberId,
+                serviceType, serviceInstanceId);
+        aaiClientProvider.getAaiClient().create(uri, nssiInstance);
+    }
 }
diff --git a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/manager/NssmfManager.java b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/manager/NssmfManager.java
new file mode 100644
index 0000000..54ef1e0
--- /dev/null
+++ b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/manager/NssmfManager.java
@@ -0,0 +1,44 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ # Copyright (c) 2020, 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.nssmf.manager;
+
+import org.onap.so.adapters.nssmf.exceptions.ApplicationException;
+import org.onap.so.adapters.nssmf.entity.RestResponse;
+import org.onap.so.beans.nsmf.*;
+
+public interface NssmfManager {
+
+    RestResponse allocateNssi(NssmfAdapterNBIRequest nssmfRequest) throws ApplicationException;
+
+    RestResponse deAllocateNssi(NssmfAdapterNBIRequest nssmfRequest, String sliceId) throws ApplicationException;
+
+    RestResponse activateNssi(NssmfAdapterNBIRequest nssmfRequest, String snssai) throws ApplicationException;
+
+    RestResponse deActivateNssi(NssmfAdapterNBIRequest nssmfRequest, String snssai) throws ApplicationException;
+
+    RestResponse queryJobStatus(NssmfAdapterNBIRequest jobReq, String jobId) throws ApplicationException;
+
+    RestResponse queryNSSISelectionCapability(NssmfAdapterNBIRequest nbiRequest) throws ApplicationException;
+
+    RestResponse querySubnetCapability(NssmfAdapterNBIRequest nbiRequest) throws ApplicationException;
+
+    RestResponse modifyNssi(NssmfAdapterNBIRequest modifyRequest) throws ApplicationException;
+}
diff --git a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/manager/NssmfManagerBuilder.java b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/manager/NssmfManagerBuilder.java
new file mode 100644
index 0000000..0b332af
--- /dev/null
+++ b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/manager/NssmfManagerBuilder.java
@@ -0,0 +1,125 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ # Copyright (c) 2020, 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.nssmf.manager;
+
+import org.onap.so.adapters.nssmf.config.NssmfAdapterConfig;
+import org.onap.so.adapters.nssmf.consts.NssmfAdapterConsts;
+import org.onap.so.adapters.nssmf.enums.ActionType;
+import org.onap.so.adapters.nssmf.enums.ExecutorType;
+import org.onap.so.adapters.nssmf.exceptions.ApplicationException;
+import org.onap.so.adapters.nssmf.manager.impl.external.ExternalAnNssmfManager;
+import org.onap.so.adapters.nssmf.manager.impl.external.ExternalCnNssmfManager;
+import org.onap.so.adapters.nssmf.manager.impl.internal.InternalAnNssmfManager;
+import org.onap.so.adapters.nssmf.manager.impl.internal.InternalCnNssmfManager;
+import org.onap.so.adapters.nssmf.manager.impl.internal.InternalTnNssmfManager;
+import org.onap.so.adapters.nssmf.manager.impl.*;
+import org.onap.so.adapters.nssmf.util.RestUtil;
+import org.onap.so.beans.nsmf.EsrInfo;
+import org.onap.so.beans.nsmf.NetworkType;
+import org.onap.so.beans.nsmf.ServiceInfo;
+import org.onap.so.db.request.data.repository.ResourceOperationStatusRepository;
+
+public class NssmfManagerBuilder {
+
+    private BaseNssmfManager nssmfManger;
+
+    private RestUtil restUtil;
+
+    private ActionType actionType;
+
+    private ResourceOperationStatusRepository repository;
+
+    private ServiceInfo serviceInfo;
+
+    private NssmfAdapterConfig adapterConfig;
+
+    public NssmfManagerBuilder(EsrInfo esrInfo) throws ApplicationException {
+
+        ExecutorType executorType = getExecutorType(esrInfo);
+        NetworkType networkType = esrInfo.getNetworkType();
+
+        if (ExecutorType.INTERNAL.equals(executorType) && NetworkType.CORE.equals(networkType)) {
+            this.nssmfManger = new InternalCnNssmfManager().setEsrInfo(esrInfo).setExecutorType(executorType);
+            return;
+        }
+
+        if (ExecutorType.INTERNAL.equals(executorType) && NetworkType.TRANSPORT.equals(networkType)) {
+            this.nssmfManger = new InternalTnNssmfManager().setEsrInfo(esrInfo).setExecutorType(executorType);
+            return;
+        }
+
+        if (ExecutorType.INTERNAL.equals(executorType) && NetworkType.ACCESS.equals(networkType)) {
+            this.nssmfManger = new InternalAnNssmfManager().setEsrInfo(esrInfo).setExecutorType(executorType);
+            return;
+        }
+
+        if (ExecutorType.EXTERNAL.equals(executorType) && NetworkType.CORE.equals(networkType)) {
+            this.nssmfManger = new ExternalCnNssmfManager().setEsrInfo(esrInfo).setExecutorType(executorType)
+                    .setInitStatus("deactivated");
+            return;
+        }
+
+        if (ExecutorType.EXTERNAL.equals(executorType) && NetworkType.ACCESS.equals(networkType)) {
+            this.nssmfManger = new ExternalAnNssmfManager().setEsrInfo(esrInfo).setExecutorType(executorType)
+                    .setInitStatus("activated");
+            return;
+        }
+
+        throw new ApplicationException(404, "invalid domain and simulator");
+    }
+
+    private ExecutorType getExecutorType(EsrInfo esrInfo) {
+        if (NssmfAdapterConsts.ONAP_INTERNAL_TAG.equals(esrInfo.getVendor())) {
+            return ExecutorType.INTERNAL;
+        }
+        return ExecutorType.EXTERNAL;
+    }
+
+    public NssmfManagerBuilder setRestUtil(RestUtil restUtil) {
+        this.restUtil = restUtil;
+        return this;
+    }
+
+    public NssmfManagerBuilder setActionType(ActionType actionType) {
+        this.actionType = actionType;
+        return this;
+    }
+
+    public NssmfManagerBuilder setRepository(ResourceOperationStatusRepository repository) {
+        this.repository = repository;
+        return this;
+    }
+
+    public NssmfManagerBuilder setServiceInfo(ServiceInfo serviceInfo) {
+        this.serviceInfo = serviceInfo;
+        return this;
+    }
+
+    public NssmfManagerBuilder setAdapterConfig(NssmfAdapterConfig adapterConfig) {
+        this.adapterConfig = adapterConfig;
+        return this;
+    }
+
+    public NssmfManager build() {
+        return this.nssmfManger.setRestUtil(restUtil).setAdapterConfig(adapterConfig).setRepository(repository)
+                .setActionType(actionType).setServiceInfo(serviceInfo);
+    }
+}
diff --git a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/manager/impl/BaseNssmfManager.java b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/manager/impl/BaseNssmfManager.java
new file mode 100644
index 0000000..185dfaf
--- /dev/null
+++ b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/manager/impl/BaseNssmfManager.java
@@ -0,0 +1,273 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ # Copyright (c) 2020, 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.nssmf.manager.impl;
+
+import org.onap.so.adapters.nssmf.config.NssmfAdapterConfig;
+import org.onap.so.adapters.nssmf.consts.NssmfAdapterConsts;
+import org.onap.so.adapters.nssmf.entity.NssmfUrlInfo;
+import org.onap.so.adapters.nssmf.enums.*;
+import org.onap.so.adapters.nssmf.exceptions.ApplicationException;
+import org.onap.so.adapters.nssmf.entity.RestResponse;
+import org.onap.so.adapters.nssmf.manager.NssmfManager;
+import org.onap.so.adapters.nssmf.util.RestUtil;
+import org.onap.so.beans.nsmf.*;
+import org.onap.so.db.request.beans.ResourceOperationStatus;
+import org.onap.so.db.request.data.repository.ResourceOperationStatusRepository;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.data.domain.Example;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+import static org.onap.so.adapters.nssmf.util.NssmfAdapterUtil.StatusDesc.ALLOCATE_NSS_SUCCESS;
+import static org.onap.so.adapters.nssmf.util.NssmfAdapterUtil.StatusDesc.MODIFY_NSS_SUCCESS;
+import static org.onap.so.adapters.nssmf.util.NssmfAdapterUtil.marshal;
+
+public abstract class BaseNssmfManager implements NssmfManager {
+
+    private static final Logger logger = LoggerFactory.getLogger(BaseNssmfManager.class);
+
+    protected RestUtil restUtil;
+
+    protected ResourceOperationStatusRepository repository;
+
+    protected NssmfAdapterConfig adapterConfig;
+
+    protected ActionType actionType;
+
+    protected EsrInfo esrInfo;
+
+    protected String nssmfUrl;
+
+    protected HttpMethod httpMethod;
+
+    protected String initStatus;
+
+    protected ServiceInfo serviceInfo;
+
+    protected RestResponse restResponse;
+
+    private ExecutorType executorType = ExecutorType.INTERNAL;
+
+    private Map<String, String> params = new HashMap<>(); // request params
+
+    @Override
+    public RestResponse allocateNssi(NssmfAdapterNBIRequest nbiRequest) throws ApplicationException {
+
+        this.params.clear();
+        this.urlHandler();
+        String requestBody = wrapAllocateReqBody(nbiRequest);
+
+        this.restResponse = sendRequest(requestBody);
+
+        this.afterRequest();
+
+        return restResponse;
+    }
+
+    protected abstract String wrapAllocateReqBody(NssmfAdapterNBIRequest nbiRequest) throws ApplicationException;
+
+    @Override
+    public RestResponse modifyNssi(NssmfAdapterNBIRequest modifyRequest) throws ApplicationException {
+        this.params.clear();
+        this.urlHandler();
+        String requestBody = wrapModifyReqBody(modifyRequest);
+
+        this.restResponse = sendRequest(requestBody);
+
+        this.afterRequest();
+
+        return restResponse;
+    }
+
+    protected abstract String wrapModifyReqBody(NssmfAdapterNBIRequest nbiRequest) throws ApplicationException;
+
+    @Override
+    public RestResponse deAllocateNssi(NssmfAdapterNBIRequest nbiRequest, String sliceId) throws ApplicationException {
+        this.params.clear();
+        this.params.put("sliceProfileId", sliceId);
+
+        this.urlHandler();
+
+        String reqBody = wrapDeAllocateReqBody(nbiRequest.getDeAllocateNssi());
+
+        this.restResponse = sendRequest(reqBody);
+
+        this.afterRequest();
+
+        return restResponse;
+    }
+
+    protected abstract String wrapDeAllocateReqBody(DeAllocateNssi deAllocateNssi) throws ApplicationException;
+
+    protected abstract String wrapReqBody(Object object) throws ApplicationException;
+
+    @Override
+    public RestResponse activateNssi(NssmfAdapterNBIRequest nbiRequest, String snssai) throws ApplicationException {
+        this.params.clear();
+        this.params.put("snssai", snssai);
+
+        this.urlHandler();
+
+        String reqBody = wrapActDeActReqBody(nbiRequest.getActDeActNssi());
+
+        this.restResponse = sendRequest(reqBody);
+
+        this.afterRequest();
+
+        return restResponse;
+    }
+
+    @Override
+    public RestResponse deActivateNssi(NssmfAdapterNBIRequest nbiRequest, String snssai) throws ApplicationException {
+        return activateNssi(nbiRequest, snssai);
+    }
+
+    protected abstract String wrapActDeActReqBody(ActDeActNssi actDeActNssi) throws ApplicationException;
+
+    @Override
+    public RestResponse queryJobStatus(NssmfAdapterNBIRequest jobReq, String jobId) throws ApplicationException {
+        this.params.clear();
+        this.params.put("jobId", jobId);
+        this.params.put("responseId", jobReq.getResponseId());
+        this.urlHandler();
+
+        /**
+         * find by jobId and nsiId jobId -> OperationId nsiId -> ServiceId serviceUuid -> resourceTemplateUUID
+         */
+        ResourceOperationStatus status =
+                getOperationStatus(serviceInfo.getNsiId(), jobId, serviceInfo.getServiceUuid());
+
+        this.restResponse = doQueryJobStatus(status);
+
+        afterQueryJobStatus(status);
+        return restResponse;
+    }
+
+    protected abstract RestResponse doQueryJobStatus(ResourceOperationStatus status) throws ApplicationException;
+
+
+    protected abstract void afterQueryJobStatus(ResourceOperationStatus status);
+
+    private ResourceOperationStatus getOperationStatus(String nsiId, String jobId, String serviceUuid) {
+
+        ResourceOperationStatus status = new ResourceOperationStatus(nsiId, jobId, serviceUuid);
+
+        Optional<ResourceOperationStatus> optional = repository.findOne(Example.of(status));
+
+        return optional.orElse(null);
+    }
+
+    @Override
+    public RestResponse queryNSSISelectionCapability(NssmfAdapterNBIRequest nbiRequest) throws ApplicationException {
+        SelectionType res = doQueryNSSISelectionCapability();
+        HashMap<String, String> hashMap = new HashMap<>();
+        hashMap.put("selection", res.name());
+        RestResponse restResponse = new RestResponse();
+        restResponse.setStatus(200);
+        restResponse.setResponseContent(marshal(hashMap));
+        return restResponse;
+    }
+
+    protected abstract SelectionType doQueryNSSISelectionCapability();
+
+    @Override
+    public RestResponse querySubnetCapability(NssmfAdapterNBIRequest nbiRequest) throws ApplicationException {
+        this.params.clear();
+        this.urlHandler();
+
+        return doQuerySubnetCapability(nbiRequest.getSubnetCapabilityQuery());
+    }
+
+    protected abstract RestResponse doQuerySubnetCapability(String req) throws ApplicationException;
+
+    /**
+     * send request to nssmf
+     * 
+     * @param content request body
+     * @return response
+     * @throws ApplicationException
+     */
+    protected abstract RestResponse sendRequest(String content) throws ApplicationException;
+
+    /**
+     * handle the url before request to nssmf, include get the nssmf request url, replace the path variable
+     */
+    private void urlHandler() {
+        NssmfUrlInfo nssmfUrlInfo =
+                NssmfAdapterConsts.getNssmfUrlInfo(this.executorType, this.esrInfo.getNetworkType(), actionType);
+        this.nssmfUrl = nssmfUrlInfo.getUrl();
+        this.httpMethod = nssmfUrlInfo.getHttpMethod();
+        this.nssmfUrl = nssmfUrl.replaceAll("\\{apiVersion}", getApiVersion());
+        this.params.forEach((k, v) -> this.nssmfUrl = this.nssmfUrl.replaceAll("\\{" + k + "}", v));
+    }
+
+    /**
+     * after request
+     */
+    protected abstract void afterRequest() throws ApplicationException;
+
+    protected abstract String getApiVersion();
+
+    public RestUtil getRestUtil() {
+        return restUtil;
+    }
+
+    public BaseNssmfManager setEsrInfo(EsrInfo esrInfo) {
+        this.esrInfo = esrInfo;
+        return this;
+    }
+
+    public BaseNssmfManager setExecutorType(ExecutorType executorType) {
+        this.executorType = executorType;
+        return this;
+    }
+
+    public BaseNssmfManager setRestUtil(RestUtil restUtil) {
+        this.restUtil = restUtil;
+        return this;
+    }
+
+    public BaseNssmfManager setActionType(ActionType actionType) {
+        this.actionType = actionType;
+        return this;
+    }
+
+    public BaseNssmfManager setRepository(ResourceOperationStatusRepository repository) {
+        this.repository = repository;
+        return this;
+    }
+
+    public BaseNssmfManager setServiceInfo(ServiceInfo serviceInfo) {
+        this.serviceInfo = serviceInfo;
+        return this;
+    }
+
+    public BaseNssmfManager setInitStatus(String initStatus) {
+        this.initStatus = initStatus;
+        return this;
+    }
+
+    public BaseNssmfManager setAdapterConfig(NssmfAdapterConfig adapterConfig) {
+        this.adapterConfig = adapterConfig;
+        return this;
+    }
+}
diff --git a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/manager/impl/ExternalNssmfManager.java b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/manager/impl/ExternalNssmfManager.java
new file mode 100644
index 0000000..f6584da
--- /dev/null
+++ b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/manager/impl/ExternalNssmfManager.java
@@ -0,0 +1,201 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ # Copyright (c) 2020, 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.nssmf.manager.impl;
+
+import org.apache.http.Header;
+import org.apache.http.message.BasicHeader;
+import org.onap.aai.domain.yang.ServiceInstance;
+import org.onap.so.adapters.nssmf.entity.NssmfInfo;
+import org.onap.so.adapters.nssmf.entity.RestResponse;
+import org.onap.so.adapters.nssmf.enums.JobStatus;
+import org.onap.so.adapters.nssmf.exceptions.ApplicationException;
+import org.onap.so.adapters.nssmf.util.NssmfAdapterUtil;
+import org.onap.so.beans.nsmf.*;
+import org.onap.so.db.request.beans.ResourceOperationStatus;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import static java.lang.String.valueOf;
+import static org.onap.so.adapters.nssmf.enums.JobStatus.*;
+import static org.onap.so.adapters.nssmf.util.NssmfAdapterUtil.StatusDesc.*;
+import static org.onap.so.adapters.nssmf.util.NssmfAdapterUtil.marshal;
+import static org.onap.so.adapters.nssmf.util.NssmfAdapterUtil.unMarshal;
+
+public abstract class ExternalNssmfManager extends BaseNssmfManager {
+
+    private static final Logger logger = LoggerFactory.getLogger(ExternalNssmfManager.class);
+
+    @Override
+    protected String wrapAllocateReqBody(NssmfAdapterNBIRequest nbiRequest) throws ApplicationException {
+        return doWrapExtAllocateReqBody(nbiRequest);
+    }
+
+    protected abstract String doWrapExtAllocateReqBody(NssmfAdapterNBIRequest nbiRequest) throws ApplicationException;
+
+    @Override
+    protected String wrapModifyReqBody(NssmfAdapterNBIRequest nbiRequest) throws ApplicationException {
+        return doWrapModifyReqBody(nbiRequest);
+    }
+
+    protected abstract String doWrapModifyReqBody(NssmfAdapterNBIRequest nbiRequest) throws ApplicationException;
+
+    @Override
+    protected String wrapDeAllocateReqBody(DeAllocateNssi deAllocateNssi) throws ApplicationException {
+        return doWrapDeAllocateReqBody(deAllocateNssi);
+    }
+
+    protected abstract String doWrapDeAllocateReqBody(DeAllocateNssi deAllocateNssi) throws ApplicationException;
+
+    @Override
+    protected void afterQueryJobStatus(ResourceOperationStatus status) {
+        if (Integer.parseInt(status.getProgress()) == 100) {
+
+            ServiceInstance nssiInstance = new ServiceInstance();
+            nssiInstance.setServiceInstanceId(serviceInfo.getNssiId());
+            nssiInstance.setServiceInstanceName(serviceInfo.getNssiName());
+            nssiInstance.setServiceType(serviceInfo.getSST());
+
+            nssiInstance.setOrchestrationStatus(initStatus);
+            nssiInstance.setModelInvariantId(serviceInfo.getServiceInvariantUuid());
+            nssiInstance.setModelVersionId(serviceInfo.getServiceUuid());
+            nssiInstance.setServiceInstanceLocationId(serviceInfo.getPLMNIdList());
+            nssiInstance.setEnvironmentContext(esrInfo.getNetworkType().getNetworkType());
+            nssiInstance.setServiceRole("nssi");
+
+            restUtil.createServiceInstance(nssiInstance, serviceInfo);
+        }
+    }
+
+
+
+    @Override
+    protected String wrapActDeActReqBody(ActDeActNssi actDeActNssi) throws ApplicationException {
+        return marshal(actDeActNssi);
+    }
+
+    protected RestResponse doQueryJobStatus(ResourceOperationStatus status) throws ApplicationException {
+        return doResponseStatus(status);
+    }
+
+    private RestResponse doResponseStatus(ResourceOperationStatus status) throws ApplicationException {
+        RestResponse restResponse = sendRequest(null);
+        ResponseDescriptor rspDesc =
+                unMarshal(restResponse.getResponseContent(), JobStatusResponse.class).getResponseDescriptor();
+        updateRequestDbJobStatus(rspDesc, status, restResponse);
+        return restResponse;
+    }
+
+    @Override
+    protected String wrapReqBody(Object object) throws ApplicationException {
+        return marshal(object);
+    }
+
+    @Override
+    protected RestResponse sendRequest(String content) throws ApplicationException {
+        return sendExternalRequest(content);
+    }
+
+    protected void createStatus(JobStatus jobStatus) throws ApplicationException {
+        if (valueOf(restResponse.getStatus()).startsWith("2")) {
+            logger.info("save segment and operaton info -> begin");
+            NssiResponse response = unMarshal(restResponse.getResponseContent(), NssiResponse.class);
+            ResourceOperationStatus status = new ResourceOperationStatus(serviceInfo.getNsiId(), response.getJobId(),
+                    serviceInfo.getServiceUuid());
+            status.setResourceInstanceID(response.getNssiId());
+
+            updateDbStatus(status, restResponse.getStatus(), jobStatus, NssmfAdapterUtil.getStatusDesc(actionType));
+            logger.info("save segment and operaton info -> end");
+        }
+    }
+
+    @Override
+    protected String getApiVersion() {
+        return "v1";
+    }
+
+
+    // external
+    protected RestResponse sendExternalRequest(String content) throws ApplicationException {
+        NssmfInfo nssmfInfo = restUtil.getNssmfHost(esrInfo);
+        Header header = new BasicHeader("X-Auth-Token", restUtil.getToken(nssmfInfo));
+        String nssmfUrl = nssmfInfo.getUrl() + this.nssmfUrl;
+        return restUtil.send(nssmfUrl, this.httpMethod, content, header);
+    }
+
+    private void updateRequestDbJobStatus(ResponseDescriptor rspDesc, ResourceOperationStatus status, RestResponse rsp)
+            throws ApplicationException {
+
+        switch (fromString(rspDesc.getStatus())) {
+            case STARTED:
+                updateDbStatus(status, rsp.getStatus(), STARTED, QUERY_JOB_STATUS_SUCCESS);
+                break;
+            case PROCESSING:
+                updateDbStatus(status, rsp.getStatus(), PROCESSING, QUERY_JOB_STATUS_SUCCESS);
+                break;
+            case FINISHED:
+                if (rspDesc.getProgress() == 100) {
+                    updateDbStatus(status, rsp.getStatus(), FINISHED, QUERY_JOB_STATUS_SUCCESS);
+                }
+                break;
+            case ERROR:
+                updateDbStatus(status, rsp.getStatus(), ERROR, QUERY_JOB_STATUS_FAILED);
+                throw new ApplicationException(500, QUERY_JOB_STATUS_FAILED);
+        }
+    }
+
+    protected void updateDbStatus(ResourceOperationStatus status, int rspStatus, JobStatus jobStatus,
+            String description) {
+        status.setErrorCode(valueOf(rspStatus));
+        status.setStatus(jobStatus.toString());
+        status.setStatusDescription(description);
+        logger.info("Updating DB status");
+        repository.save(status);
+        logger.info("Updating successful");
+    }
+
+    @Override
+    protected RestResponse doQuerySubnetCapability(String req) throws ApplicationException {
+        RestResponse response = new RestResponse();
+        response.setStatus(200);
+        response.setResponseContent(null);
+        return response;
+    }
+
+    /**
+     * after request, if response code is 2XX, continue handle, else return
+     */
+    @Override
+    protected void afterRequest() throws ApplicationException {
+        if (valueOf(restResponse.getStatus()).startsWith("2")) {
+            doAfterRequest();
+        }
+    }
+
+
+    protected void doAfterRequest() throws ApplicationException {
+        //
+        NssiResponse response = unMarshal(restResponse.getResponseContent(), NssiResponse.class);
+        ResourceOperationStatus status =
+                new ResourceOperationStatus(serviceInfo.getNsiId(), response.getJobId(), serviceInfo.getServiceUuid());
+        status.setResourceInstanceID(response.getNssiId());
+
+        updateDbStatus(status, restResponse.getStatus(), STARTED, NssmfAdapterUtil.getStatusDesc(actionType));
+    }
+}
diff --git a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/manager/impl/InternalNssmfManager.java b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/manager/impl/InternalNssmfManager.java
new file mode 100644
index 0000000..a945823
--- /dev/null
+++ b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/manager/impl/InternalNssmfManager.java
@@ -0,0 +1,133 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ # Copyright (c) 2020, 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.nssmf.manager.impl;
+
+import org.apache.http.Header;
+import org.apache.http.message.BasicHeader;
+import org.onap.so.adapters.nssmf.consts.NssmfAdapterConsts;
+import org.onap.so.adapters.nssmf.entity.RestResponse;
+import org.onap.so.adapters.nssmf.enums.JobStatus;
+import org.onap.so.adapters.nssmf.enums.SelectionType;
+import org.onap.so.adapters.nssmf.exceptions.ApplicationException;
+import org.onap.so.beans.nsmf.*;
+import org.onap.so.db.request.beans.ResourceOperationStatus;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import static org.onap.so.adapters.nssmf.enums.JobStatus.PROCESSING;
+import static org.onap.so.adapters.nssmf.util.NssmfAdapterUtil.marshal;
+
+public abstract class InternalNssmfManager extends BaseNssmfManager {
+
+    private static final Logger logger = LoggerFactory.getLogger(InternalNssmfManager.class);
+
+    @Override
+    protected String wrapAllocateReqBody(NssmfAdapterNBIRequest nbiRequest) throws ApplicationException {
+        return doWrapAllocateReqBody(nbiRequest);
+    }
+
+    protected abstract String doWrapAllocateReqBody(NssmfAdapterNBIRequest nbiRequest) throws ApplicationException;
+
+    @Override
+    protected String wrapReqBody(Object object) throws ApplicationException {
+        NssmfRequest nssmfRequest = new NssmfRequest(serviceInfo, esrInfo.getNetworkType(), object);
+        return marshal(nssmfRequest);
+    }
+
+
+    @Override
+    protected String wrapActDeActReqBody(ActDeActNssi actDeActNssi) throws ApplicationException {
+
+        return wrapReqBody(actDeActNssi);
+    }
+
+
+    @Override
+    protected String wrapDeAllocateReqBody(DeAllocateNssi deAllocateNssi) throws ApplicationException {
+        return wrapReqBody(deAllocateNssi);
+    }
+
+
+    @Override
+    protected RestResponse doQueryJobStatus(ResourceOperationStatus status) throws ApplicationException {
+        return responseDBStatus(status);
+    }
+
+    private RestResponse responseDBStatus(ResourceOperationStatus status) throws ApplicationException {
+        ResponseDescriptor descriptor = new ResponseDescriptor();
+        if (status == null) {
+            descriptor.setProgress(0);
+            descriptor.setStatus(PROCESSING.name());
+            descriptor.setStatusDescription("Initiating Nssi Instance");
+            return restUtil.createResponse(200, marshal(descriptor));
+        }
+        descriptor.setStatus(status.getStatus());
+        descriptor.setStatusDescription(status.getStatusDescription());
+        descriptor.setProgress(Integer.parseInt(status.getProgress()));
+        // descriptor.setResponseId(status.getOperationId());
+        return restUtil.createResponse(200, marshal(descriptor));
+    }
+
+    @Override
+    protected RestResponse sendRequest(String content) {
+        return sendInternalRequest(content);
+    }
+
+    @Override
+    protected void afterRequest() {
+        //
+    }
+
+    @Override
+    protected void afterQueryJobStatus(ResourceOperationStatus status) {
+        // internal
+    }
+
+    // internal
+    private RestResponse sendInternalRequest(String content) {
+        Header header = new BasicHeader("X-Auth-Token", adapterConfig.getInfraAuth());
+        this.nssmfUrl = adapterConfig.getInfraEndpoint() + this.nssmfUrl;
+        return restUtil.send(this.nssmfUrl, this.httpMethod, content, header);
+    }
+
+    @Override
+    protected String getApiVersion() {
+        return NssmfAdapterConsts.CURRENT_INTERNAL_NSSMF_API_VERSION;
+    }
+
+
+    @Override
+    protected SelectionType doQueryNSSISelectionCapability() {
+        return SelectionType.NSSMF;
+    }
+
+    @Override
+    protected String wrapModifyReqBody(NssmfAdapterNBIRequest nbiRequest) throws ApplicationException {
+        return doWrapModifyReqBody(nbiRequest);
+    }
+
+    protected abstract String doWrapModifyReqBody(NssmfAdapterNBIRequest nbiRequest) throws ApplicationException;
+
+    @Override
+    protected RestResponse doQuerySubnetCapability(String req) throws ApplicationException {
+        // handler
+        return sendRequest(req);
+    }
+}
diff --git a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/manager/impl/external/ExternalAnNssmfManager.java b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/manager/impl/external/ExternalAnNssmfManager.java
new file mode 100644
index 0000000..e244a85
--- /dev/null
+++ b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/manager/impl/external/ExternalAnNssmfManager.java
@@ -0,0 +1,109 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ # Copyright (c) 2020, 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.nssmf.manager.impl.external;
+
+import org.onap.so.adapters.nssmf.entity.RestResponse;
+import org.onap.so.adapters.nssmf.enums.ActionType;
+import org.onap.so.adapters.nssmf.enums.JobStatus;
+import org.onap.so.adapters.nssmf.enums.SelectionType;
+import org.onap.so.adapters.nssmf.exceptions.ApplicationException;
+import org.onap.so.adapters.nssmf.manager.impl.ExternalNssmfManager;
+import org.onap.so.adapters.nssmf.util.NssmfAdapterUtil;
+import org.onap.so.beans.nsmf.DeAllocateNssi;
+import org.onap.so.beans.nsmf.NssiResponse;
+import org.onap.so.beans.nsmf.NssmfAdapterNBIRequest;
+import org.onap.so.db.request.beans.ResourceOperationStatus;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import java.util.HashMap;
+import java.util.Map;
+import static org.onap.so.adapters.nssmf.util.NssmfAdapterUtil.marshal;
+import static org.onap.so.adapters.nssmf.util.NssmfAdapterUtil.unMarshal;
+
+
+public class ExternalAnNssmfManager extends ExternalNssmfManager {
+
+    private static final Logger logger = LoggerFactory.getLogger(ExternalAnNssmfManager.class);
+
+    @Override
+    protected String doWrapExtAllocateReqBody(NssmfAdapterNBIRequest nbiRequest) throws ApplicationException {
+        return marshal(nbiRequest.getAllocateAnNssi().getSliceProfile());
+    }
+
+    @Override
+    protected void doAfterRequest() throws ApplicationException {
+        if (ActionType.ALLOCATE.equals(actionType) || ActionType.DEALLOCATE.equals(actionType)) {
+            @SuppressWarnings("unchecked")
+            Map<String, String> response = unMarshal(restResponse.getResponseContent(), Map.class);
+
+            String nssiId = response.get("nSSId");
+
+            NssiResponse resp = new NssiResponse();
+            resp.setJobId(nssiId);
+            resp.setNssiId(nssiId);
+
+            RestResponse returnRsp = new RestResponse();
+
+            returnRsp.setStatus(202);
+            returnRsp.setResponseContent(marshal(resp));
+            restResponse = returnRsp;
+
+            ResourceOperationStatus status =
+                    new ResourceOperationStatus(serviceInfo.getNsiId(), nssiId, serviceInfo.getServiceUuid());
+            status.setResourceInstanceID(nssiId);
+
+            updateDbStatus(status, restResponse.getStatus(), JobStatus.FINISHED,
+                    NssmfAdapterUtil.getStatusDesc(actionType));
+        }
+        // todo
+    }
+
+    @Override
+    protected String doWrapModifyReqBody(NssmfAdapterNBIRequest nbiRequest) throws ApplicationException {
+        // TODO
+        return null;
+    }
+
+    @Override
+    protected String doWrapDeAllocateReqBody(DeAllocateNssi deAllocateNssi) throws ApplicationException {
+        Map<String, String> request = new HashMap<>();
+        request.put("nSSId", deAllocateNssi.getNssiId());
+        return marshal(request);
+    }
+
+
+    @Override
+    public RestResponse modifyNssi(NssmfAdapterNBIRequest modifyRequest) throws ApplicationException {
+        // TODO
+        return null;
+    }
+
+    @Override
+    public RestResponse activateNssi(NssmfAdapterNBIRequest nbiRequest, String snssai) throws ApplicationException {
+        // TODO
+        return null;
+    }
+
+    @Override
+    protected SelectionType doQueryNSSISelectionCapability() {
+        return SelectionType.NSSMF;
+    }
+}
diff --git a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/manager/impl/external/ExternalCnNssmfManager.java b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/manager/impl/external/ExternalCnNssmfManager.java
new file mode 100644
index 0000000..fb76adc
--- /dev/null
+++ b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/manager/impl/external/ExternalCnNssmfManager.java
@@ -0,0 +1,53 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ # Copyright (c) 2020, 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.nssmf.manager.impl.external;
+
+import org.onap.so.adapters.nssmf.enums.SelectionType;
+import org.onap.so.adapters.nssmf.exceptions.ApplicationException;
+import org.onap.so.adapters.nssmf.manager.impl.ExternalNssmfManager;
+import org.onap.so.beans.nsmf.DeAllocateNssi;
+import org.onap.so.beans.nsmf.NssmfAdapterNBIRequest;
+import static org.onap.so.adapters.nssmf.util.NssmfAdapterUtil.marshal;
+
+public class ExternalCnNssmfManager extends ExternalNssmfManager {
+
+    @Override
+    protected String doWrapExtAllocateReqBody(NssmfAdapterNBIRequest nbiRequest) throws ApplicationException {
+        return marshal(nbiRequest.getAllocateCnNssi());
+    }
+
+    @Override
+    protected String doWrapModifyReqBody(NssmfAdapterNBIRequest nbiRequest) throws ApplicationException {
+        return marshal(nbiRequest.getAllocateCnNssi());
+    }
+
+    @Override
+    protected String doWrapDeAllocateReqBody(DeAllocateNssi deAllocateNssi) throws ApplicationException {
+        return marshal(deAllocateNssi);
+    }
+
+    @Override
+    protected SelectionType doQueryNSSISelectionCapability() {
+
+        return SelectionType.NSMF;
+    }
+
+}
diff --git a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/manager/impl/internal/InternalAnNssmfManager.java b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/manager/impl/internal/InternalAnNssmfManager.java
new file mode 100644
index 0000000..dc65283
--- /dev/null
+++ b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/manager/impl/internal/InternalAnNssmfManager.java
@@ -0,0 +1,54 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ # Copyright (c) 2020, 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.nssmf.manager.impl.internal;
+
+import org.onap.so.adapters.nssmf.exceptions.ApplicationException;
+import org.onap.so.adapters.nssmf.manager.impl.InternalNssmfManager;
+import org.onap.so.beans.nsmf.*;
+import java.util.HashMap;
+import java.util.Map;
+import static org.onap.so.adapters.nssmf.util.NssmfAdapterUtil.marshal;
+
+
+public class InternalAnNssmfManager extends InternalNssmfManager {
+
+    @Override
+    protected String doWrapAllocateReqBody(NssmfAdapterNBIRequest nbiRequest) throws ApplicationException {
+        NssmfRequest request =
+                new NssmfRequest(serviceInfo, nbiRequest.getEsrInfo().getNetworkType(), nbiRequest.getAllocateAnNssi());
+        request.setName(nbiRequest.getAllocateAnNssi().getNssiName());
+        return marshal(request);
+    }
+
+    @Override
+    protected String doWrapModifyReqBody(NssmfAdapterNBIRequest nbiRequest) throws ApplicationException {
+        AllocateAnNssi allocateAnNssi = nbiRequest.getAllocateAnNssi();
+        AnSliceProfile sliceProfile = allocateAnNssi.getSliceProfile();
+        Map<String, Object> additional = new HashMap<>();
+        additional.put("modifyAction", "allocate");
+        additional.put("snssaiList", sliceProfile.getSNSSAIList());
+        additional.put("sliceProfileId", sliceProfile.getSliceProfileId());
+        additional.put("nsiInfo", allocateAnNssi.getNsiInfo());
+        additional.put("scriptName", allocateAnNssi.getScriptName());
+        NssmfRequest request = new NssmfRequest(serviceInfo, esrInfo.getNetworkType(), additional);
+        return marshal(request);
+    }
+}
diff --git a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/manager/impl/internal/InternalCnNssmfManager.java b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/manager/impl/internal/InternalCnNssmfManager.java
new file mode 100644
index 0000000..4a93b30
--- /dev/null
+++ b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/manager/impl/internal/InternalCnNssmfManager.java
@@ -0,0 +1,56 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ # Copyright (c) 2020, 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.nssmf.manager.impl.internal;
+
+import org.onap.so.adapters.nssmf.exceptions.ApplicationException;
+import org.onap.so.adapters.nssmf.manager.impl.InternalNssmfManager;
+import org.onap.so.beans.nsmf.*;
+import java.util.HashMap;
+import java.util.Map;
+import static org.onap.so.adapters.nssmf.util.NssmfAdapterUtil.marshal;
+
+public class InternalCnNssmfManager extends InternalNssmfManager {
+
+    @Override
+    protected String doWrapAllocateReqBody(NssmfAdapterNBIRequest nbiRequest) throws ApplicationException {
+
+        NssmfRequest request =
+                new NssmfRequest(serviceInfo, nbiRequest.getEsrInfo().getNetworkType(), nbiRequest.getAllocateCnNssi());
+        request.setName(nbiRequest.getAllocateCnNssi().getNssiName());
+        return marshal(request);
+    }
+
+    @Override
+    protected String doWrapModifyReqBody(NssmfAdapterNBIRequest nbiRequest) throws ApplicationException {
+        AllocateCnNssi allocateCnNssi = nbiRequest.getAllocateCnNssi();
+        CnSliceProfile cnSliceProfile = allocateCnNssi.getSliceProfile();
+        Map<String, Object> additional = new HashMap<>();
+        additional.put("modifyAction", "allocate");
+        additional.put("nsiInfo", allocateCnNssi.getNsiInfo());
+        additional.put("scriptName", allocateCnNssi.getScriptName());
+        additional.put("snssaiList", cnSliceProfile.getSnssaiList());
+        additional.put("sliceProfileId", cnSliceProfile.getSliceProfileId());
+
+        NssmfRequest request = new NssmfRequest(serviceInfo, esrInfo.getNetworkType(), additional);
+        return marshal(request);
+    }
+
+}
diff --git a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/manager/impl/internal/InternalTnNssmfManager.java b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/manager/impl/internal/InternalTnNssmfManager.java
new file mode 100644
index 0000000..8bfbd55
--- /dev/null
+++ b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/manager/impl/internal/InternalTnNssmfManager.java
@@ -0,0 +1,42 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ # Copyright (c) 2020, 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.nssmf.manager.impl.internal;
+
+import org.onap.so.adapters.nssmf.exceptions.ApplicationException;
+import org.onap.so.adapters.nssmf.manager.impl.InternalNssmfManager;
+import org.onap.so.beans.nsmf.*;
+import static org.onap.so.adapters.nssmf.util.NssmfAdapterUtil.marshal;
+
+public class InternalTnNssmfManager extends InternalNssmfManager {
+
+    @Override
+    protected String doWrapAllocateReqBody(NssmfAdapterNBIRequest nbiRequest) throws ApplicationException {
+
+        return marshal(new NssmfRequest(serviceInfo, nbiRequest.getEsrInfo().getNetworkType(),
+                nbiRequest.getAllocateTnNssi()));
+    }
+
+    @Override
+    protected String doWrapModifyReqBody(NssmfAdapterNBIRequest nbiRequest) throws ApplicationException {
+        // TODO
+        return null;
+    }
+}
diff --git a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/rest/NssmfAdapterRest.java b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/rest/NssmfAdapterRest.java
index d8e1e36..4fdcbf1 100644
--- a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/rest/NssmfAdapterRest.java
+++ b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/rest/NssmfAdapterRest.java
@@ -20,6 +20,7 @@
 
 package org.onap.so.adapters.nssmf.rest;
 
+import org.onap.so.adapters.nssmf.entity.RestResponse;
 import org.onap.so.adapters.nssmf.exceptions.ApplicationException;
 import org.onap.so.beans.nsmf.JobStatusRequest;
 import org.onap.so.beans.nsmf.NssiActDeActRequest;
@@ -43,6 +44,7 @@
 import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
 import static org.onap.so.adapters.nssmf.util.NssmfAdapterUtil.assertObjectNotNull;
 
+@Deprecated
 @Controller
 @RequestMapping(value = "/api/rest/provMns/v1", produces = {APPLICATION_JSON}, consumes = {APPLICATION_JSON})
 public class NssmfAdapterRest {
@@ -52,17 +54,6 @@
     @Autowired
     private NssmfManager nssmfMgr;
 
-    @PostMapping(value = "/NSS/SliceProfiles")
-    public ResponseEntity allocateNssi(@RequestBody NssiAllocateRequest allocate) {
-        try {
-            logger.info("Nssmi allocate request is invoked");
-            assertObjectNotNull(allocate);
-            RestResponse rsp = getNssmfMgr().allocateNssi(allocate);
-            return buildResponse(rsp);
-        } catch (ApplicationException e) {
-            return e.buildErrorResponse();
-        }
-    }
 
     @PostMapping(value = "/NSS/nssi")
     public ResponseEntity createNssi(@RequestBody NssiCreateRequest create) {
@@ -76,19 +67,6 @@
         }
     }
 
-    @PostMapping(value = "/NSS/SliceProfiles/{sliceProfileId}")
-    public ResponseEntity deAllocateNssi(@RequestBody NssiDeAllocateRequest deAllocate,
-            @PathVariable("sliceProfileId") final String sliceId) {
-        try {
-            logger.info("Nssmf deallocate request is invoked");
-            assertObjectNotNull(deAllocate);
-            RestResponse rsp = getNssmfMgr().deAllocateNssi(deAllocate, sliceId);
-            return buildResponse(rsp);
-        } catch (ApplicationException e) {
-            return e.buildErrorResponse();
-        }
-    }
-
     @PostMapping(value = "/NSS/nssi/{nssiId}")
     public ResponseEntity terminateNssi(@RequestBody NssiTerminateRequest terminate,
             @PathVariable("nssiId") String nssiId) {
@@ -128,44 +106,6 @@
         }
     }
 
-    @PostMapping(value = "/NSS/{snssai}/activation")
-    public ResponseEntity activateNssi(@RequestBody NssiActDeActRequest activate,
-            @PathVariable("snssai") String snssai) {
-        try {
-            logger.info("Nssmf activate request is invoked");
-            assertObjectNotNull(activate);
-            RestResponse rsp = getNssmfMgr().activateNssi(activate, snssai);
-            return buildResponse(rsp);
-        } catch (ApplicationException e) {
-            return e.buildErrorResponse();
-        }
-    }
-
-    @PostMapping(value = "/NSS/{snssai}/deactivation")
-    public ResponseEntity deactivateNssi(@RequestBody NssiActDeActRequest deActivate,
-            @PathVariable("snssai") String snssai) {
-        try {
-            logger.info("Nssmf activate request is invoked");
-            assertObjectNotNull(deActivate);
-            RestResponse rsp = getNssmfMgr().deActivateNssi(deActivate, snssai);
-            return buildResponse(rsp);
-        } catch (ApplicationException e) {
-            return e.buildErrorResponse();
-        }
-    }
-
-    @PostMapping(value = "/NSS/jobs/{jobId}")
-    public ResponseEntity queryJobStatus(@RequestBody JobStatusRequest jobStatusReq,
-            @PathVariable("jobId") String jobId) {
-        try {
-            logger.info("Nssmf query job status request is invoked");
-            assertObjectNotNull(jobStatusReq);
-            RestResponse rsp = getNssmfMgr().queryJobStatus(jobStatusReq, jobId);
-            return buildResponse(rsp);
-        } catch (ApplicationException e) {
-            return e.buildErrorResponse();
-        }
-    }
 
     @GetMapping(value = "/vendor/{vendorName}/type/{networkType}/NSS" + "/SliceProfiles/{sliceProfileId}")
     public ResponseEntity queryNssi(@PathVariable("vendorName") String vendorName,
diff --git a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/rest/NssmfInfo.java b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/rest/NssmfInfo.java
deleted file mode 100644
index 6306643..0000000
--- a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/rest/NssmfInfo.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*-
- * ============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.adapters.nssmf.rest;
-
-public class NssmfInfo {
-
-    private String url;
-
-    private String ipAddress;
-
-    private String port;
-
-    private String insecure;
-
-    private String cacert;
-
-    private String userName;
-
-    private String password;
-
-    public String getInsecure() {
-        return insecure;
-    }
-
-    public void setInsecure(String insecure) {
-        this.insecure = insecure;
-    }
-
-    public String getCacert() {
-        return cacert;
-    }
-
-    public void setCacert(String cacert) {
-        this.cacert = cacert;
-    }
-
-    public String getIpAddress() {
-        return ipAddress;
-    }
-
-    public void setIpAddress(String ipAddress) {
-        this.ipAddress = ipAddress;
-    }
-
-    public String getPort() {
-        return port;
-    }
-
-    public void setPort(String port) {
-        this.port = port;
-    }
-
-    public String getUrl() {
-        return url;
-    }
-
-    public void setUrl(String url) {
-        this.url = url;
-    }
-
-    public String getUserName() {
-        return userName;
-    }
-
-    public void setUserName(String userName) {
-        this.userName = userName;
-    }
-
-    public String getPassword() {
-        return password;
-    }
-
-    public void setPassword(String password) {
-        this.password = password;
-    }
-}
diff --git a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/rest/NssmfManager.java b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/rest/NssmfManager.java
index 00e5c4a..bcce69f 100644
--- a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/rest/NssmfManager.java
+++ b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/rest/NssmfManager.java
@@ -20,7 +20,10 @@
 
 package org.onap.so.adapters.nssmf.rest;
 
+import org.onap.so.adapters.nssmf.entity.RestResponse;
+import org.onap.so.adapters.nssmf.enums.JobStatus;
 import org.onap.so.adapters.nssmf.exceptions.ApplicationException;
+import org.onap.so.adapters.nssmf.util.RestUtil;
 import org.onap.so.beans.nsmf.ActDeActNssi;
 import org.onap.so.beans.nsmf.AllocateAnNssi;
 import org.onap.so.beans.nsmf.AllocateCnNssi;
@@ -52,15 +55,15 @@
 import org.springframework.data.domain.Example;
 import org.springframework.stereotype.Component;
 import static java.lang.String.valueOf;
-import static org.onap.so.adapters.nssmf.rest.HttpMethod.DELETE;
-import static org.onap.so.adapters.nssmf.rest.HttpMethod.GET;
-import static org.onap.so.adapters.nssmf.rest.HttpMethod.POST;
-import static org.onap.so.adapters.nssmf.rest.HttpMethod.PUT;
-import static org.onap.so.adapters.nssmf.rest.JobStatus.ERROR;
-import static org.onap.so.adapters.nssmf.rest.JobStatus.FINISHED;
-import static org.onap.so.adapters.nssmf.rest.JobStatus.PROCESSING;
-import static org.onap.so.adapters.nssmf.rest.JobStatus.STARTED;
-import static org.onap.so.adapters.nssmf.rest.JobStatus.fromString;
+import static org.onap.so.adapters.nssmf.enums.HttpMethod.DELETE;
+import static org.onap.so.adapters.nssmf.enums.HttpMethod.GET;
+import static org.onap.so.adapters.nssmf.enums.HttpMethod.POST;
+import static org.onap.so.adapters.nssmf.enums.HttpMethod.PUT;
+import static org.onap.so.adapters.nssmf.enums.JobStatus.ERROR;
+import static org.onap.so.adapters.nssmf.enums.JobStatus.FINISHED;
+import static org.onap.so.adapters.nssmf.enums.JobStatus.PROCESSING;
+import static org.onap.so.adapters.nssmf.enums.JobStatus.STARTED;
+import static org.onap.so.adapters.nssmf.enums.JobStatus.fromString;
 import static org.onap.so.adapters.nssmf.util.NssmfAdapterUtil.StatusDesc.ACTIVATE_NSS_SUCCESS;
 import static org.onap.so.adapters.nssmf.util.NssmfAdapterUtil.StatusDesc.ALLOCATE_NSS_SUCCESS;
 import static org.onap.so.adapters.nssmf.util.NssmfAdapterUtil.StatusDesc.CREATE_NSS_SUCCESS;
@@ -76,6 +79,7 @@
 
 @Component
 @Primary
+@Deprecated
 public class NssmfManager {
 
     private static final Logger logger = LoggerFactory.getLogger(NssmfManager.class);
@@ -127,9 +131,20 @@
                 break;
 
             case TRANSPORT:
+                AllocateTnNssi tn = nssmiAllocate.getAllocateTnNssi();
+                assertObjectNotNull(tn);
+                // assertObjectNotNull(tn.getNsiInfo());
+                // assertObjectNotNull(tn.getNsiInfo().getNsiId());
+                // nsiId = tn.getNsiInfo().getNsiId();
+                allocateReq = marshal(tn);
+                // allocateUrl = AllocateTnNssi.URL;
                 break;
 
         }
+
+        /**
+         * 内部的，调用 workflow 外部的，访问第三方api
+         */
         RestResponse rsp = restUtil.sendRequest(allocateUrl, POST, allocateReq, nssmiAllocate.getEsrInfo());
         assertObjectNotNull(rsp);
 
@@ -145,6 +160,8 @@
         return rsp;
     }
 
+
+
     public RestResponse createNssi(NssiCreateRequest nssiCreate) throws ApplicationException {
 
         assertObjectNotNull(nssiCreate.getEsrInfo());
@@ -185,6 +202,7 @@
         return rsp;
     }
 
+    @Deprecated
     public RestResponse deAllocateNssi(NssiDeAllocateRequest nssiDeallocate, String sliceId)
             throws ApplicationException {
 
diff --git a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/rest/TrustAllHostNameVerifier.java b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/rest/TrustAllHostNameVerifier.java
index 254186b..fc0f3dd 100644
--- a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/rest/TrustAllHostNameVerifier.java
+++ b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/rest/TrustAllHostNameVerifier.java
@@ -23,6 +23,7 @@
 import javax.net.ssl.HostnameVerifier;
 import javax.net.ssl.SSLSession;
 
+@Deprecated
 public class TrustAllHostNameVerifier implements HostnameVerifier {
 
     public boolean verify(String hostname, SSLSession session) {
diff --git a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/service/NssmfManagerService.java b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/service/NssmfManagerService.java
new file mode 100644
index 0000000..9ad191b
--- /dev/null
+++ b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/service/NssmfManagerService.java
@@ -0,0 +1,43 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ # Copyright (c) 2020, 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.nssmf.service;
+
+import org.onap.so.beans.nsmf.*;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+
+@Service
+public interface NssmfManagerService {
+    ResponseEntity allocateNssi(NssmfAdapterNBIRequest allocateRequest);
+
+    ResponseEntity deAllocateNssi(NssmfAdapterNBIRequest allocateRequest, String sliceProfileId);
+
+    ResponseEntity activateNssi(NssmfAdapterNBIRequest deActRequest, String snssai);
+
+    ResponseEntity deActivateNssi(NssmfAdapterNBIRequest nssiDeActivate, String snssai);
+
+    ResponseEntity queryJobStatus(NssmfAdapterNBIRequest jobReq, String jobId);
+
+    ResponseEntity queryNSSISelectionCapability(NssmfAdapterNBIRequest nbiRequest);
+
+    ResponseEntity querySubnetCapability(NssmfAdapterNBIRequest nbiRequest);
+
+}
diff --git a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/service/impl/NssmfManagerServiceImpl.java b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/service/impl/NssmfManagerServiceImpl.java
new file mode 100644
index 0000000..1408123
--- /dev/null
+++ b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/service/impl/NssmfManagerServiceImpl.java
@@ -0,0 +1,141 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ # Copyright (c) 2020, 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.nssmf.service.impl;
+
+import org.apache.commons.lang3.StringUtils;
+import org.onap.so.adapters.nssmf.config.NssmfAdapterConfig;
+import org.onap.so.adapters.nssmf.enums.ActionType;
+import org.onap.so.adapters.nssmf.exceptions.ApplicationException;
+import org.onap.so.adapters.nssmf.manager.NssmfManagerBuilder;
+import org.onap.so.adapters.nssmf.entity.RestResponse;
+import org.onap.so.adapters.nssmf.manager.NssmfManager;
+import org.onap.so.adapters.nssmf.service.NssmfManagerService;
+import org.onap.so.adapters.nssmf.util.RestUtil;
+import org.onap.so.beans.nsmf.*;
+import org.onap.so.db.request.data.repository.ResourceOperationStatusRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+
+
+@Service
+public class NssmfManagerServiceImpl implements NssmfManagerService {
+
+    @Autowired
+    private RestUtil restUtil;
+
+    @Autowired
+    private ResourceOperationStatusRepository repository;
+
+    @Autowired
+    private NssmfAdapterConfig nssmfAdapterConfig;
+
+    @Override
+    public ResponseEntity allocateNssi(NssmfAdapterNBIRequest request) {
+        try {
+
+            if (StringUtils.isNotBlank(request.getServiceInfo().getNssiId())) {
+                return buildResponse(buildNssmfManager(request, ActionType.MODIFY).modifyNssi(request));
+            }
+
+            return buildResponse(buildNssmfManager(request, ActionType.ALLOCATE).allocateNssi(request));
+
+        } catch (ApplicationException e) {
+            return e.buildErrorResponse();
+        }
+    }
+
+    @Override
+    public ResponseEntity deAllocateNssi(NssmfAdapterNBIRequest request, String sliceProfileId) {
+        try {
+            return buildResponse(
+                    buildNssmfManager(request, ActionType.DEALLOCATE).deAllocateNssi(request, sliceProfileId));
+        } catch (ApplicationException e) {
+            return e.buildErrorResponse();
+        }
+    }
+
+    @Override
+    public ResponseEntity activateNssi(NssmfAdapterNBIRequest request, String snssai) {
+        try {
+            return buildResponse(buildNssmfManager(request, ActionType.ACTIVATE).activateNssi(request, snssai));
+        } catch (ApplicationException e) {
+            return e.buildErrorResponse();
+        }
+    }
+
+    @Override
+    public ResponseEntity deActivateNssi(NssmfAdapterNBIRequest request, String snssai) {
+        try {
+            return buildResponse(buildNssmfManager(request, ActionType.DEACTIVATE).deActivateNssi(request, snssai));
+        } catch (ApplicationException e) {
+            return e.buildErrorResponse();
+        }
+    }
+
+    @Override
+    public ResponseEntity queryJobStatus(NssmfAdapterNBIRequest jobReq, String jobId) {
+        try {
+            return buildResponse(buildNssmfManager(jobReq, ActionType.QUERY_JOB_STATUS).queryJobStatus(jobReq, jobId));
+        } catch (ApplicationException e) {
+            return e.buildErrorResponse();
+        }
+    }
+
+    @Override
+    public ResponseEntity queryNSSISelectionCapability(NssmfAdapterNBIRequest nbiRequest) {
+        EsrInfo esrInfo = nbiRequest.getEsrInfo();
+        try {
+            return buildResponse(buildNssmfManager(esrInfo, ActionType.QUERY_JOB_STATUS, null)
+                    .queryNSSISelectionCapability(nbiRequest));
+        } catch (ApplicationException e) {
+            return e.buildErrorResponse();
+        }
+    }
+
+    @Override
+    public ResponseEntity querySubnetCapability(NssmfAdapterNBIRequest nbiRequest) {
+        EsrInfo esrInfo = nbiRequest.getEsrInfo();
+        try {
+            return buildResponse(
+                    buildNssmfManager(esrInfo, ActionType.QUERY_JOB_STATUS, null).querySubnetCapability(nbiRequest));
+        } catch (ApplicationException e) {
+            return e.buildErrorResponse();
+        }
+    }
+
+    private ResponseEntity buildResponse(RestResponse rsp) {
+        return ResponseEntity.status(rsp.getStatus()).body(rsp.getResponseContent());
+    }
+
+
+    private NssmfManager buildNssmfManager(NssmfAdapterNBIRequest request, ActionType actionType)
+            throws ApplicationException {
+        return buildNssmfManager(request.getEsrInfo(), actionType, request.getServiceInfo());
+    }
+
+    private NssmfManager buildNssmfManager(EsrInfo esrInfo, ActionType actionType, ServiceInfo serviceInfo)
+            throws ApplicationException {
+
+        return new NssmfManagerBuilder(esrInfo).setActionType(actionType).setRepository(repository)
+                .setRestUtil(restUtil).setAdapterConfig(nssmfAdapterConfig).setServiceInfo(serviceInfo).build();
+    }
+}
diff --git a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/util/NssmfAdapterUtil.java b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/util/NssmfAdapterUtil.java
index 3a7c2f1..090417d 100644
--- a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/util/NssmfAdapterUtil.java
+++ b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/util/NssmfAdapterUtil.java
@@ -22,10 +22,12 @@
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 import java.io.IOException;
+import org.onap.so.adapters.nssmf.enums.ActionType;
 import org.onap.so.adapters.nssmf.exceptions.ApplicationException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.onap.logging.filter.base.ErrorCode;
+import org.springframework.stereotype.Component;
 import static org.onap.so.logger.LoggingAnchor.THREE;
 import static org.onap.so.logger.MessageEnum.RA_NS_EXC;
 
@@ -45,6 +47,8 @@
 
         public static final String ALLOCATE_NSS_SUCCESS = "Allocating nss is " + "successful";
 
+        public static final String MODIFY_NSS_SUCCESS = "Modify nss is " + "successful";
+
         public static final String CREATE_NSS_SUCCESS = "Creating nss is " + "successful";
 
         public static final String DEALLOCATE_NSS_SUCCESS = "Deallocate nss " + "is successful";
@@ -91,4 +95,29 @@
         }
     }
 
+
+    public static String getStatusDesc(ActionType actionType) {
+        String desc = "";
+        switch (actionType) {
+            case ALLOCATE:
+                desc = StatusDesc.ALLOCATE_NSS_SUCCESS;
+                break;
+            case DEALLOCATE:
+                desc = StatusDesc.DEALLOCATE_NSS_SUCCESS;
+                break;
+            case ACTIVATE:
+                desc = StatusDesc.ACTIVATE_NSS_SUCCESS;
+                break;
+            case DEACTIVATE:
+                desc = StatusDesc.DEACTIVATE_NSS_SUCCESS;
+                break;
+            case MODIFY:
+                desc = StatusDesc.MODIFY_NSS_SUCCESS;
+                break;
+            default:
+                break;
+        }
+
+        return desc;
+    }
 }
diff --git a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/rest/RestUtil.java b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/util/RestUtil.java
similarity index 86%
rename from adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/rest/RestUtil.java
rename to adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/util/RestUtil.java
index dcc6f5b..0c5999b 100644
--- a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/rest/RestUtil.java
+++ b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/util/RestUtil.java
@@ -18,11 +18,9 @@
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.so.adapters.nssmf.rest;
+package org.onap.so.adapters.nssmf.util;
 
-import javax.net.ssl.SSLContext;
-import javax.net.ssl.TrustManager;
-import javax.net.ssl.X509TrustManager;
+import javax.net.ssl.*;
 import javax.ws.rs.core.UriBuilder;
 import java.net.SocketTimeoutException;
 import java.net.URI;
@@ -30,32 +28,29 @@
 import org.apache.http.HttpResponse;
 import org.apache.http.client.HttpClient;
 import org.apache.http.client.config.RequestConfig;
-import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.client.methods.HttpPut;
-import org.apache.http.client.methods.HttpRequestBase;
+import org.apache.http.client.methods.*;
 import org.apache.http.conn.ConnectTimeoutException;
 import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
 import org.apache.http.entity.StringEntity;
 import org.apache.http.impl.client.HttpClients;
 import org.apache.http.message.BasicHeader;
 import org.apache.http.util.EntityUtils;
-import org.onap.aai.domain.yang.EsrSystemInfo;
-import org.onap.aai.domain.yang.EsrSystemInfoList;
-import org.onap.aai.domain.yang.EsrThirdpartySdnc;
-import org.onap.aai.domain.yang.EsrThirdpartySdncList;
+import org.onap.aai.domain.yang.*;
 import org.onap.so.adapters.nssmf.exceptions.ApplicationException;
 import org.onap.so.adapters.nssmf.extclients.aai.AaiServiceProvider;
-import org.onap.so.adapters.nssmf.model.TokenRequest;
-import org.onap.so.adapters.nssmf.model.TokenResponse;
+import org.onap.so.adapters.nssmf.entity.TokenRequest;
+import org.onap.so.adapters.nssmf.entity.TokenResponse;
+import org.onap.so.adapters.nssmf.enums.HttpMethod;
+import org.onap.so.adapters.nssmf.entity.NssmfInfo;
+import org.onap.so.adapters.nssmf.entity.RestResponse;
 import org.onap.so.beans.nsmf.EsrInfo;
+import org.onap.so.beans.nsmf.ServiceInfo;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import static org.apache.http.entity.ContentType.APPLICATION_JSON;
-import static org.onap.so.adapters.nssmf.rest.HttpMethod.POST;
+import static org.onap.so.adapters.nssmf.enums.HttpMethod.POST;
 import static org.onap.so.adapters.nssmf.util.NssmfAdapterUtil.BAD_REQUEST;
 import static org.onap.so.adapters.nssmf.util.NssmfAdapterUtil.marshal;
 import static org.onap.so.adapters.nssmf.util.NssmfAdapterUtil.unMarshal;
@@ -77,6 +72,10 @@
     @Autowired
     private AaiServiceProvider aaiSvcProv;
 
+    public void createServiceInstance(ServiceInstance serviceInstance, ServiceInfo serviceInfo) {
+        aaiSvcProv.invokeCreateServiceInstance(serviceInstance, serviceInfo.getGlobalSubscriberId(),
+                serviceInfo.getSubscriptionServiceType(), serviceInfo.getNssiId());
+    }
 
     public NssmfInfo getNssmfHost(EsrInfo esrInfo) throws ApplicationException {
         EsrThirdpartySdncList sdncList = aaiSvcProv.invokeGetThirdPartySdncList();
@@ -112,10 +111,9 @@
         throw new ApplicationException(BAD_REQUEST, "ESR information is improper");
     }
 
-    public RestResponse sendRequest(String url, HttpMethod methodType, String content, EsrInfo esrInfo)
-            throws ApplicationException {
 
-        NssmfInfo nssmfInfo = getNssmfHost(esrInfo);
+    public String getToken(NssmfInfo nssmfInfo) throws ApplicationException {
+
 
         TokenRequest req = new TokenRequest();
         req.setGrantType("password");
@@ -128,13 +126,12 @@
         RestResponse tokenRes = send(nssmfInfo.getUrl() + TOKEN_URL, POST, tokenReq, null);
 
         TokenResponse res = unMarshal(tokenRes.getResponseContent(), TokenResponse.class);
-        String token = res.getAccessToken();
-        Header header = new BasicHeader("X-Auth-Token", token);
-        String nssmfUrl = nssmfInfo.getUrl() + url;
-        return send(nssmfUrl, methodType, content, header);
+
+        return res.getAccessToken();
     }
 
-    private RestResponse send(String url, HttpMethod methodType, String content, Header header) {
+
+    public RestResponse send(String url, HttpMethod methodType, String content, Header header) {
 
         HttpRequestBase req = null;
         HttpResponse res = null;
@@ -168,8 +165,6 @@
             }
             if (null != req) {
                 req.reset();
-            } else {
-                logger.debug("method is NULL:");
             }
             req = null;
 
@@ -201,7 +196,7 @@
         }
     }
 
-    private RestResponse createResponse(int statusCode, String errMsg) {
+    public RestResponse createResponse(int statusCode, String errMsg) {
         RestResponse restResponse = new RestResponse();
         restResponse.setStatus(statusCode);
         restResponse.setResponseContent(errMsg);
@@ -210,7 +205,7 @@
 
     private HttpRequestBase getHttpReq(String url, HttpMethod method, Header header, RequestConfig config,
             String content) throws ApplicationException {
-        HttpRequestBase base = null;
+        HttpRequestBase base;
         switch (method) {
             case POST:
                 HttpPost post = new HttpPost(url);
@@ -229,6 +224,7 @@
                 break;
 
             case PATCH:
+                base = new HttpPatch(url);
                 break;
 
             case DELETE:
@@ -238,6 +234,8 @@
                 }
                 base = delete;
                 break;
+            default:
+                throw new ApplicationException(404, "invalid method: " + method);
 
         }
         base.setConfig(config);
@@ -247,6 +245,14 @@
         return base;
     }
 
+    public RestResponse sendRequest(String allocateUrl, HttpMethod post, String allocateReq, EsrInfo esrInfo)
+            throws ApplicationException {
+        NssmfInfo nssmfInfo = getNssmfHost(esrInfo);
+        Header header = new BasicHeader("X-Auth-Token", getToken(nssmfInfo));
+        String nssmfUrl = nssmfInfo.getUrl() + allocateUrl;
+        return send(nssmfUrl, post, allocateReq, header);
+    }
+
     class HttpDeleteWithBody extends HttpEntityEnclosingRequestBase {
         public static final String METHOD_NAME = "DELETE";
 
@@ -289,7 +295,7 @@
             // HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
 
             SSLConnectionSocketFactory sslsf =
-                    new SSLConnectionSocketFactory(sc, new String[] {"TLSv1"}, null, new TrustAllHostNameVerifier());
+                    new SSLConnectionSocketFactory(sc, new String[] {"TLSv1"}, null, (s, sslSession) -> true);
             return HttpClients.custom().setSSLSocketFactory(sslsf).build();
         } catch (Exception e) {
             throw new IllegalArgumentException(e);
diff --git a/adapters/mso-nssmf-adapter/src/main/resources/application-test.yaml b/adapters/mso-nssmf-adapter/src/main/resources/application-test.yaml
new file mode 100644
index 0000000..8e10dfb
--- /dev/null
+++ b/adapters/mso-nssmf-adapter/src/main/resources/application-test.yaml
@@ -0,0 +1,60 @@
+
+aai:
+  auth: 2A11B07DB6214A839394AA1EC5844695F5114FC407FF5422625FB00175A3DCB8A1FF745F22867EFA72D5369D599BBD88DA8BED4233CF5586
+  endpoint: https://aai.onap:30233
+logging:
+  path: logs
+
+spring:
+  datasource:
+    jdbcUrl: jdbc:mariadb://49.232.146.162:8989/requestdb
+    username: root
+    password: 123456
+    driver-class-name: org.mariadb.jdbc.Driver
+    initialization-mode: always
+    jpa:
+      generate-ddl: false
+      show-sql: false
+      hibernate:
+        ddl-auto: none
+        naming-strategy: org.hibernate.cfg.ImprovedNamingStrategy
+        enable-lazy-load-no-trans: true
+      database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
+  security:
+    usercredentials:
+      - username: bpel
+        password: '$2a$10$Fh9ffgPw2vnmsghsRD3ZauBL1aKXebigbq3BB1RPWtE62UDILsjke'
+        role: BPEL-Client
+      - username: mso_admin
+        password: '$2a$10$Fh9ffgPw2vnmsghsRD3ZauBL1aKXebigbq3BB1RPWtE62UDILsjke'
+        role: ACTUATOR
+server:
+  port: 8080
+  tomcat:
+    max-threads: 50
+
+mso:
+  key: 07a7159d3bf51a0e53be7a8f89699be7
+  site-name: localSite
+  logPath: ./logs/nssmf
+  adapters:
+    requestDb:
+      endpoint: https://so-request-db-adapter.onap:8083
+      auth: Basic YnBlbDpwYXNzd29yZDEk
+  infra:
+    endpoint: https://so.onap:8080
+    auth: Basic SW5mcmFQb3J0YWxDbGllbnQ6cGFzc3dvcmQxJA==
+
+#Actuator
+management:
+  endpoints:
+    web:
+      base-path: /manage
+      exposure:
+        include: "*"
+  metrics:
+    se-global-registry: false
+    export:
+      prometheus:
+        enabled: true # Whether exporting of metrics to Prometheus is enabled.
+        step: 1m # Step size (i.e. reporting frequency) to use.
\ No newline at end of file
diff --git a/adapters/mso-nssmf-adapter/src/main/resources/application.yaml b/adapters/mso-nssmf-adapter/src/main/resources/application.yaml
index 303d63d..8da911d 100644
--- a/adapters/mso-nssmf-adapter/src/main/resources/application.yaml
+++ b/adapters/mso-nssmf-adapter/src/main/resources/application.yaml
@@ -58,6 +58,9 @@
     requestDb:
       endpoint: https://so-request-db-adapter.{{ include "common.namespace" . }}:8083
       auth: Basic YnBlbDpwYXNzd29yZDEk
+  infra:
+    endpoint: https://so.{{ include "common.namespace" . }}:8080
+    auth: Basic SW5mcmFQb3J0YWxDbGllbnQ6cGFzc3dvcmQxJA==
 
 #Actuator
 management:
diff --git a/adapters/mso-nssmf-adapter/src/test/java/org/onap/so/adapters/nssmf/NssmfAdapterRestTest.java b/adapters/mso-nssmf-adapter/src/test/java/org/onap/so/adapters/nssmf/NssmfAdapterRestTest.java
index 5bfd390..a9c732e 100644
--- a/adapters/mso-nssmf-adapter/src/test/java/org/onap/so/adapters/nssmf/NssmfAdapterRestTest.java
+++ b/adapters/mso-nssmf-adapter/src/test/java/org/onap/so/adapters/nssmf/NssmfAdapterRestTest.java
@@ -24,6 +24,7 @@
 import java.io.InputStream;
 import java.util.LinkedList;
 import java.util.List;
+import org.apache.http.Header;
 import org.apache.http.HttpEntity;
 import org.apache.http.HttpResponse;
 import org.apache.http.StatusLine;
@@ -35,12 +36,12 @@
 import org.mockito.Mock;
 import org.mockito.invocation.InvocationOnMock;
 import org.mockito.stubbing.Answer;
-import org.onap.so.adapters.nssmf.model.TokenResponse;
-import org.onap.so.adapters.nssmf.rest.HttpMethod;
+import org.onap.so.adapters.nssmf.entity.TokenResponse;
+import org.onap.so.adapters.nssmf.enums.HttpMethod;
 import org.onap.so.adapters.nssmf.rest.NssmfAdapterRest;
-import org.onap.so.adapters.nssmf.rest.NssmfInfo;
+import org.onap.so.adapters.nssmf.entity.NssmfInfo;
 import org.onap.so.adapters.nssmf.rest.NssmfManager;
-import org.onap.so.adapters.nssmf.rest.RestUtil;
+import org.onap.so.adapters.nssmf.util.RestUtil;
 import org.onap.so.beans.nsmf.ActDeActNssi;
 import org.onap.so.beans.nsmf.AllocateCnNssi;
 import org.onap.so.beans.nsmf.CnSliceProfile;
@@ -127,13 +128,16 @@
     }
 
     private void createCommonMock(int statusCode, NssmfInfo nssmf) throws Exception {
+        when(this.restUtil.send(any(String.class), any(HttpMethod.class), any(String.class), any(Header.class)))
+                .thenCallRealMethod();
+        when(this.restUtil.createResponse(any(Integer.class), any(String.class))).thenCallRealMethod();
         when(nssmfRest.getNssmfMgr()).thenReturn(nssmfMgr);
-        when(nssmfRest.allocateNssi(any(NssiAllocateRequest.class))).thenCallRealMethod();
-        when(nssmfRest.deAllocateNssi(any(NssiDeAllocateRequest.class), any(String.class))).thenCallRealMethod();
-        when(nssmfRest.activateNssi(any(NssiActDeActRequest.class), any(String.class))).thenCallRealMethod();
-        when(nssmfRest.deactivateNssi(any(NssiActDeActRequest.class), any(String.class))).thenCallRealMethod();
-
-        when(nssmfRest.queryJobStatus(any(JobStatusRequest.class), any(String.class))).thenCallRealMethod();
+        // when(nssmfRest.createAllocateNssi(any(NssiAllocateRequest.class))).thenCallRealMethod();
+        // when(nssmfRest.deAllocateNssi(any(NssiDeAllocateRequest.class), any(String.class))).thenCallRealMethod();
+        // when(nssmfRest.activateNssi(any(NssiActDeActRequest.class), any(String.class))).thenCallRealMethod();
+        // when(nssmfRest.deactivateNssi(any(NssiActDeActRequest.class), any(String.class))).thenCallRealMethod();
+        //
+        // when(nssmfRest.queryJobStatus(any(JobStatusRequest.class), any(String.class))).thenCallRealMethod();
         when(restUtil.sendRequest(any(String.class), any(HttpMethod.class), any(String.class), any(EsrInfo.class)))
                 .thenCallRealMethod();
         when(restUtil.getHttpsClient()).thenReturn(httpClient);
@@ -168,113 +172,113 @@
         doAnswer(answer).when(httpClient).execute(any(HttpRequestBase.class));
     }
 
-    @Test
-    public void testNssiAllocate() throws Exception {
-        NssmfInfo nssmf = new NssmfInfo();
-        nssmf.setUserName("nssmf-user");
-        nssmf.setPassword("nssmf-pass");
-        nssmf.setPort("8080");
-        nssmf.setIpAddress("127.0.0.1");
-
-        NssiResponse nssiRes = new NssiResponse();
-        nssiRes.setJobId("4b45d919816ccaa2b762df5120f72067");
-        nssiRes.setNssiId("NSSI-C-001-HDBNJ-NSSMF-01-A-ZX");
-
-        TokenResponse token = new TokenResponse();
-        token.setAccessToken("7512eb3feb5249eca5ddd742fedddd39");
-        token.setExpires(1800);
-
-        postStream = new ByteArrayInputStream(marshal(nssiRes).getBytes(UTF_8));
-        tokenStream = new ByteArrayInputStream(marshal(token).getBytes(UTF_8));
-
-        createCommonMock(200, nssmf);
-        // assertEquals(prettyPrint(allocateNssi()), ALLOCATE);
-        ResponseEntity res = nssmfRest.allocateNssi(allocateNssi());
-        assertNotNull(res);
-        assertNotNull(res.getBody());
-        NssiResponse allRes = unMarshal(res.getBody().toString(), NssiResponse.class);
-        assertEquals(allRes.getJobId(), "4b45d919816ccaa2b762df5120f72067");
-        assertEquals(allRes.getNssiId(), "NSSI-C-001-HDBNJ-NSSMF-01-A-ZX");
-    }
-
-    @Test
-    public void testNssiDeAllocate() throws Exception {
-        NssmfInfo nssmf = new NssmfInfo();
-        nssmf.setUserName("nssmf-user");
-        nssmf.setPassword("nssmf-pass");
-        nssmf.setPort("8080");
-        nssmf.setIpAddress("127.0.0.1");
-
-        NssiResponse nssiRes = new NssiResponse();
-        nssiRes.setJobId("4b45d919816ccaa2b762df5120f72067");
-
-        TokenResponse token = new TokenResponse();
-        token.setAccessToken("7512eb3feb5249eca5ddd742fedddd39");
-        token.setExpires(1800);
-
-        postStream = new ByteArrayInputStream(marshal(nssiRes).getBytes(UTF_8));
-        tokenStream = new ByteArrayInputStream(marshal(token).getBytes(UTF_8));
-
-        createCommonMock(200, nssmf);
-        ResponseEntity res = nssmfRest.deAllocateNssi(deAllocateNssi(), "ab9af40f13f721b5f13539d87484098");
-        assertNotNull(res);
-        assertNotNull(res.getBody());
-        NssiResponse allRes = unMarshal(res.getBody().toString(), NssiResponse.class);
-        assertEquals(allRes.getJobId(), "4b45d919816ccaa2b762df5120f72067");
-    }
-
-    @Test
-    public void testNssiActivate() throws Exception {
-        NssmfInfo nssmf = new NssmfInfo();
-        nssmf.setUserName("nssmf-user");
-        nssmf.setPassword("nssmf-pass");
-        nssmf.setPort("8080");
-        nssmf.setIpAddress("127.0.0.1");
-
-        NssiResponse nssiRes = new NssiResponse();
-        nssiRes.setJobId("4b45d919816ccaa2b762df5120f72067");
-
-        TokenResponse token = new TokenResponse();
-        token.setAccessToken("7512eb3feb5249eca5ddd742fedddd39");
-        token.setExpires(1800);
-
-        postStream = new ByteArrayInputStream(marshal(nssiRes).getBytes(UTF_8));
-        tokenStream = new ByteArrayInputStream(marshal(token).getBytes(UTF_8));
-
-        createCommonMock(200, nssmf);
-        ResponseEntity res = nssmfRest.activateNssi(activateNssi(), "001-100001");
-        assertNotNull(res);
-        assertNotNull(res.getBody());
-        NssiResponse allRes = unMarshal(res.getBody().toString(), NssiResponse.class);
-        assertEquals(allRes.getJobId(), "4b45d919816ccaa2b762df5120f72067");
-    }
-
-    @Test
-    public void testNssiDeActivate() throws Exception {
-        NssmfInfo nssmf = new NssmfInfo();
-        nssmf.setUserName("nssmf-user");
-        nssmf.setPassword("nssmf-pass");
-        nssmf.setPort("8080");
-        nssmf.setIpAddress("127.0.0.1");
-
-        NssiResponse nssiRes = new NssiResponse();
-        nssiRes.setJobId("4b45d919816ccaa2b762df5120f72067");
-
-        TokenResponse token = new TokenResponse();
-        token.setAccessToken("7512eb3feb5249eca5ddd742fedddd39");
-        token.setExpires(1800);
-
-        postStream = new ByteArrayInputStream(marshal(nssiRes).getBytes(UTF_8));
-        tokenStream = new ByteArrayInputStream(marshal(token).getBytes(UTF_8));
-
-        createCommonMock(200, nssmf);
-        ResponseEntity res = nssmfRest.deactivateNssi(deActivateNssi(), "001-100001");
-        assertNotNull(res);
-        assertNotNull(res.getBody());
-        NssiResponse allRes = unMarshal(res.getBody().toString(), NssiResponse.class);
-        assertEquals(allRes.getJobId(), "4b45d919816ccaa2b762df5120f72067");
-    }
-
+    // @Test
+    // public void testNssiAllocate() throws Exception {
+    // NssmfInfo nssmf = new NssmfInfo();
+    // nssmf.setUserName("nssmf-user");
+    // nssmf.setPassword("nssmf-pass");
+    // nssmf.setPort("8080");
+    // nssmf.setIpAddress("127.0.0.1");
+    //
+    // NssiResponse nssiRes = new NssiResponse();
+    // nssiRes.setJobId("4b45d919816ccaa2b762df5120f72067");
+    // nssiRes.setNssiId("NSSI-C-001-HDBNJ-NSSMF-01-A-ZX");
+    //
+    // TokenResponse token = new TokenResponse();
+    // token.setAccessToken("7512eb3feb5249eca5ddd742fedddd39");
+    // token.setExpires(1800);
+    //
+    // postStream = new ByteArrayInputStream(marshal(nssiRes).getBytes(UTF_8));
+    // tokenStream = new ByteArrayInputStream(marshal(token).getBytes(UTF_8));
+    //
+    // createCommonMock(200, nssmf);
+    // // assertEquals(prettyPrint(createAllocateNssi()), ALLOCATE);
+    // ResponseEntity res = nssmfRest.createAllocateNssi(createAllocateNssi());
+    // assertNotNull(res);
+    // assertNotNull(res.getBody());
+    // NssiResponse allRes = unMarshal(res.getBody().toString(), NssiResponse.class);
+    // assertEquals(allRes.getJobId(), "4b45d919816ccaa2b762df5120f72067");
+    // assertEquals(allRes.getNssiId(), "NSSI-C-001-HDBNJ-NSSMF-01-A-ZX");
+    // }
+    //
+    // @Test
+    // public void testNssiDeAllocate() throws Exception {
+    // NssmfInfo nssmf = new NssmfInfo();
+    // nssmf.setUserName("nssmf-user");
+    // nssmf.setPassword("nssmf-pass");
+    // nssmf.setPort("8080");
+    // nssmf.setIpAddress("127.0.0.1");
+    //
+    // NssiResponse nssiRes = new NssiResponse();
+    // nssiRes.setJobId("4b45d919816ccaa2b762df5120f72067");
+    //
+    // TokenResponse token = new TokenResponse();
+    // token.setAccessToken("7512eb3feb5249eca5ddd742fedddd39");
+    // token.setExpires(1800);
+    //
+    // postStream = new ByteArrayInputStream(marshal(nssiRes).getBytes(UTF_8));
+    // tokenStream = new ByteArrayInputStream(marshal(token).getBytes(UTF_8));
+    //
+    // createCommonMock(200, nssmf);
+    // ResponseEntity res = nssmfRest.deAllocateNssi(deAllocateNssi(), "ab9af40f13f721b5f13539d87484098");
+    // assertNotNull(res);
+    // assertNotNull(res.getBody());
+    // NssiResponse allRes = unMarshal(res.getBody().toString(), NssiResponse.class);
+    // assertEquals(allRes.getJobId(), "4b45d919816ccaa2b762df5120f72067");
+    // }
+    //
+    // @Test
+    // public void testNssiActivate() throws Exception {
+    // NssmfInfo nssmf = new NssmfInfo();
+    // nssmf.setUserName("nssmf-user");
+    // nssmf.setPassword("nssmf-pass");
+    // nssmf.setPort("8080");
+    // nssmf.setIpAddress("127.0.0.1");
+    //
+    // NssiResponse nssiRes = new NssiResponse();
+    // nssiRes.setJobId("4b45d919816ccaa2b762df5120f72067");
+    //
+    // TokenResponse token = new TokenResponse();
+    // token.setAccessToken("7512eb3feb5249eca5ddd742fedddd39");
+    // token.setExpires(1800);
+    //
+    // postStream = new ByteArrayInputStream(marshal(nssiRes).getBytes(UTF_8));
+    // tokenStream = new ByteArrayInputStream(marshal(token).getBytes(UTF_8));
+    //
+    // createCommonMock(200, nssmf);
+    // ResponseEntity res = nssmfRest.activateNssi(activateNssi(), "001-100001");
+    // assertNotNull(res);
+    // assertNotNull(res.getBody());
+    // NssiResponse allRes = unMarshal(res.getBody().toString(), NssiResponse.class);
+    // assertEquals(allRes.getJobId(), "4b45d919816ccaa2b762df5120f72067");
+    // }
+    //
+    // @Test
+    // public void testNssiDeActivate() throws Exception {
+    // NssmfInfo nssmf = new NssmfInfo();
+    // nssmf.setUserName("nssmf-user");
+    // nssmf.setPassword("nssmf-pass");
+    // nssmf.setPort("8080");
+    // nssmf.setIpAddress("127.0.0.1");
+    //
+    // NssiResponse nssiRes = new NssiResponse();
+    // nssiRes.setJobId("4b45d919816ccaa2b762df5120f72067");
+    //
+    // TokenResponse token = new TokenResponse();
+    // token.setAccessToken("7512eb3feb5249eca5ddd742fedddd39");
+    // token.setExpires(1800);
+    //
+    // postStream = new ByteArrayInputStream(marshal(nssiRes).getBytes(UTF_8));
+    // tokenStream = new ByteArrayInputStream(marshal(token).getBytes(UTF_8));
+    //
+    // createCommonMock(200, nssmf);
+    // ResponseEntity res = nssmfRest.deactivateNssi(deActivateNssi(), "001-100001");
+    // assertNotNull(res);
+    // assertNotNull(res.getBody());
+    // NssiResponse allRes = unMarshal(res.getBody().toString(), NssiResponse.class);
+    // assertEquals(allRes.getJobId(), "4b45d919816ccaa2b762df5120f72067");
+    // }
+    //
     @Test
     public void testAllocateJsonSerDeSer() throws Exception {
         assertEquals(marshal(allocateNssi()), ALLOCATE);
@@ -334,50 +338,51 @@
         return allocate;
     }
 
-    public NssiDeAllocateRequest deAllocateNssi() throws Exception {
-        DeAllocateNssi deAllocateNssi = new DeAllocateNssi();
-        deAllocateNssi.setTerminateNssiOption(0);
-        List<String> snssai = new LinkedList<>();
-        snssai.add("001-100001");
-        deAllocateNssi.setNsiId("NSI-M-001-HDBNJ-NSMF-01-A-ZX");
-        deAllocateNssi.setNssiId("NSSI-C-001-HDBNJ-NSSMF-01-A-ZX");
-        deAllocateNssi.setScriptName("CN1");
-        deAllocateNssi.setSnssaiList(snssai);
-        EsrInfo esrInfo = new EsrInfo();
-        esrInfo.setVendor("huawei");
-        esrInfo.setNetworkType(CORE);
-        NssiDeAllocateRequest deAllocate = new NssiDeAllocateRequest();
-        deAllocate.setDeAllocateNssi(deAllocateNssi);
-        deAllocate.setEsrInfo(esrInfo);
-        return deAllocate;
-    }
-
-    public NssiActDeActRequest activateNssi() throws Exception {
-        EsrInfo esrInfo = new EsrInfo();
-        esrInfo.setVendor("huawei");
-        esrInfo.setNetworkType(CORE);
-        ActDeActNssi act = new ActDeActNssi();
-        act.setNsiId("NSI-M-001-HDBNJ-NSMF-01-A-ZX");
-        act.setNssiId("NSSI-C-001-HDBNJ-NSSMF-01-A-ZX");
-        NssiActDeActRequest actReq = new NssiActDeActRequest();
-        actReq.setActDeActNssi(act);
-        actReq.setEsrInfo(esrInfo);
-        return actReq;
-    }
-
-    public NssiActDeActRequest deActivateNssi() throws Exception {
-        EsrInfo esrInfo = new EsrInfo();
-        esrInfo.setVendor("huawei");
-        esrInfo.setNetworkType(CORE);
-        ActDeActNssi deAct = new ActDeActNssi();
-        deAct.setNsiId("NSI-M-001-HDBNJ-NSMF-01-A-ZX");
-        deAct.setNssiId("NSSI-C-001-HDBNJ-NSSMF-01-A-ZX");
-        NssiActDeActRequest deActReq = new NssiActDeActRequest();
-        deActReq.setActDeActNssi(deAct);
-        deActReq.setEsrInfo(esrInfo);
-        return deActReq;
-    }
-
+    //
+    // public NssiDeAllocateRequest deAllocateNssi() throws Exception {
+    // DeAllocateNssi deAllocateNssi = new DeAllocateNssi();
+    // deAllocateNssi.setTerminateNssiOption(0);
+    // List<String> snssai = new LinkedList<>();
+    // snssai.add("001-100001");
+    // deAllocateNssi.setNsiId("NSI-M-001-HDBNJ-NSMF-01-A-ZX");
+    // deAllocateNssi.setNssiId("NSSI-C-001-HDBNJ-NSSMF-01-A-ZX");
+    // deAllocateNssi.setScriptName("CN1");
+    // deAllocateNssi.setSnssaiList(snssai);
+    // EsrInfo esrInfo = new EsrInfo();
+    // esrInfo.setVendor("huawei");
+    // esrInfo.setNetworkType(CORE);
+    // NssiDeAllocateRequest deAllocate = new NssiDeAllocateRequest();
+    // deAllocate.setDeAllocateNssi(deAllocateNssi);
+    // deAllocate.setEsrInfo(esrInfo);
+    // return deAllocate;
+    // }
+    //
+    // public NssiActDeActRequest activateNssi() throws Exception {
+    // EsrInfo esrInfo = new EsrInfo();
+    // esrInfo.setVendor("huawei");
+    // esrInfo.setNetworkType(CORE);
+    // ActDeActNssi act = new ActDeActNssi();
+    // act.setNsiId("NSI-M-001-HDBNJ-NSMF-01-A-ZX");
+    // act.setNssiId("NSSI-C-001-HDBNJ-NSSMF-01-A-ZX");
+    // NssiActDeActRequest actReq = new NssiActDeActRequest();
+    // actReq.setActDeActNssi(act);
+    // actReq.setEsrInfo(esrInfo);
+    // return actReq;
+    // }
+    //
+    // public NssiActDeActRequest deActivateNssi() throws Exception {
+    // EsrInfo esrInfo = new EsrInfo();
+    // esrInfo.setVendor("huawei");
+    // esrInfo.setNetworkType(CORE);
+    // ActDeActNssi deAct = new ActDeActNssi();
+    // deAct.setNsiId("NSI-M-001-HDBNJ-NSMF-01-A-ZX");
+    // deAct.setNssiId("NSSI-C-001-HDBNJ-NSSMF-01-A-ZX");
+    // NssiActDeActRequest deActReq = new NssiActDeActRequest();
+    // deActReq.setActDeActNssi(deAct);
+    // deActReq.setEsrInfo(esrInfo);
+    // return deActReq;
+    // }
+    //
     public String queryJobStatusNssi() throws Exception {
         EsrInfo esrInfo = new EsrInfo();
         esrInfo.setVendor("huawei");
diff --git a/adapters/mso-nssmf-adapter/src/test/java/org/onap/so/adapters/nssmf/service/impl/NssmfManagerServiceImplTest.java b/adapters/mso-nssmf-adapter/src/test/java/org/onap/so/adapters/nssmf/service/impl/NssmfManagerServiceImplTest.java
new file mode 100644
index 0000000..3108ade
--- /dev/null
+++ b/adapters/mso-nssmf-adapter/src/test/java/org/onap/so/adapters/nssmf/service/impl/NssmfManagerServiceImplTest.java
@@ -0,0 +1,438 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ # Copyright (c) 2020, 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.nssmf.service.impl;
+
+
+import org.apache.http.Header;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.StatusLine;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpRequestBase;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.stubbing.Answer;
+import org.onap.so.adapters.nssmf.consts.NssmfAdapterConsts;
+import org.onap.so.adapters.nssmf.entity.NssmfInfo;
+import org.onap.so.adapters.nssmf.entity.TokenResponse;
+import org.onap.so.adapters.nssmf.enums.HttpMethod;
+import org.onap.so.adapters.nssmf.util.RestUtil;
+import org.onap.so.beans.nsmf.*;
+import org.onap.so.db.request.beans.ResourceOperationStatus;
+import org.onap.so.db.request.data.repository.ResourceOperationStatusRepository;
+import org.springframework.http.ResponseEntity;
+import org.springframework.test.context.junit4.SpringRunner;
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.lang.reflect.Field;
+import java.util.*;
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.when;
+import static org.mockito.MockitoAnnotations.initMocks;
+import static org.onap.so.adapters.nssmf.util.NssmfAdapterUtil.marshal;
+import static org.onap.so.adapters.nssmf.util.NssmfAdapterUtil.unMarshal;
+import static org.onap.so.beans.nsmf.NetworkType.CORE;
+import static org.onap.so.beans.nsmf.ResourceSharingLevel.NON_SHARED;
+
+@RunWith(SpringRunner.class)
+public class NssmfManagerServiceImplTest {
+
+    @Mock
+    private RestUtil restUtil;
+
+
+    private NssmfManagerServiceImpl nssiManagerService;
+
+    @Mock
+    private HttpResponse tokenResponse;
+
+    @Mock
+    private HttpEntity tokenEntity;
+
+    @Mock
+    private HttpResponse commonResponse;
+
+    @Mock
+    private HttpEntity commonEntity;
+
+    @Mock
+    private StatusLine statusLine;
+
+    @Mock
+    private HttpClient httpClient;
+
+    private InputStream postStream;
+
+    private InputStream tokenStream;
+
+    @Mock
+    private ResourceOperationStatusRepository repository;
+
+    @Before
+    public void setUp() throws Exception {
+        initMocks(this);
+
+        nssiManagerService = new NssmfManagerServiceImpl();
+
+        Field restUtil = nssiManagerService.getClass().getDeclaredField("restUtil");
+        restUtil.setAccessible(true);
+        restUtil.set(nssiManagerService, this.restUtil);
+
+        Field repository = nssiManagerService.getClass().getDeclaredField("repository");
+        repository.setAccessible(true);
+        repository.set(nssiManagerService, this.repository);
+        // nssiManagerService.setRestUtil(this.restUtil);
+
+        when(this.restUtil.send(any(String.class), any(HttpMethod.class), any(), any(Header.class)))
+                .thenCallRealMethod();
+        when(this.restUtil.createResponse(any(Integer.class), any(String.class))).thenCallRealMethod();
+    }
+
+    private void createCommonMock(int statusCode, NssmfInfo nssmf) throws Exception {
+        when(restUtil.getToken(any(NssmfInfo.class))).thenReturn("7512eb3feb5249eca5ddd742fedddd39");
+        when(restUtil.getHttpsClient()).thenReturn(httpClient);
+
+        when(statusLine.getStatusCode()).thenReturn(statusCode);
+        when(restUtil.getNssmfHost(any(EsrInfo.class))).thenReturn(nssmf);
+
+        when(tokenResponse.getEntity()).thenReturn(tokenEntity);
+        when(tokenResponse.getStatusLine()).thenReturn(statusLine);
+        when(tokenEntity.getContent()).thenReturn(tokenStream);
+
+        when(commonResponse.getEntity()).thenReturn(commonEntity);
+        when(commonResponse.getStatusLine()).thenReturn(statusLine);
+        when(commonEntity.getContent()).thenReturn(postStream);
+
+        Answer<HttpResponse> answer = invocation -> {
+            Object[] arguments = invocation.getArguments();
+            if (arguments != null && arguments.length == 1 && arguments[0] != null) {
+
+                HttpRequestBase base = (HttpRequestBase) arguments[0];
+                if (base.getURI().toString().endsWith("/oauth/token")) {
+                    return tokenResponse;
+                } else {
+                    return commonResponse;
+                }
+            }
+            return commonResponse;
+        };
+
+        doAnswer(answer).when(httpClient).execute(any(HttpRequestBase.class));
+
+    }
+
+    @Test
+    public void allocateNssi() throws Exception {
+
+        NssmfInfo nssmf = new NssmfInfo();
+        nssmf.setUserName("nssmf-user");
+        nssmf.setPassword("nssmf-pass");
+        nssmf.setPort("8080");
+        nssmf.setIpAddress("127.0.0.1");
+        nssmf.setUrl("http://127.0.0.1:8080");
+
+        NssiResponse nssiRes = new NssiResponse();
+        nssiRes.setJobId("4b45d919816ccaa2b762df5120f72067");
+        nssiRes.setNssiId("NSSI-C-001-HDBNJ-NSSMF-01-A-ZX");
+
+        TokenResponse token = new TokenResponse();
+        token.setAccessToken("7512eb3feb5249eca5ddd742fedddd39");
+        token.setExpires(1800);
+
+        postStream = new ByteArrayInputStream(marshal(nssiRes).getBytes(UTF_8));
+        tokenStream = new ByteArrayInputStream(marshal(token).getBytes(UTF_8));
+
+        createCommonMock(200, nssmf);
+
+
+        NssmfAdapterNBIRequest nbiRequest = createAllocateNssi();
+        assertNotNull(nbiRequest);
+        System.out.println(marshal(nbiRequest));
+        ResponseEntity res = nssiManagerService.allocateNssi(nbiRequest);
+        assertNotNull(res);
+        assertNotNull(res.getBody());
+        NssiResponse allRes = unMarshal(res.getBody().toString(), NssiResponse.class);
+        assertEquals(allRes.getJobId(), "4b45d919816ccaa2b762df5120f72067");
+        assertEquals(allRes.getNssiId(), "NSSI-C-001-HDBNJ-NSSMF-01-A-ZX");
+
+        System.out.println(res);
+    }
+
+
+
+    private NssmfAdapterNBIRequest createAllocateNssi() {
+        CnSliceProfile sP = new CnSliceProfile();
+        List<String> sns = new LinkedList<>();
+        sns.add("001-100001");
+        List<String> plmn = new LinkedList<>();
+        plmn.add("460-00");
+        plmn.add("460-01");
+        PerfReqEmbbList embb = new PerfReqEmbbList();
+        embb.setActivityFactor(50);
+        List<PerfReqEmbbList> embbList = new LinkedList<>();
+        embbList.add(embb);
+        PerfReq perfReq = new PerfReq();
+        perfReq.setPerfReqEmbbList(embbList);
+        List<String> taList = new LinkedList<>();
+        taList.add("1");
+        taList.add("2");
+        taList.add("3");
+        sP.setSnssaiList(sns);
+        sP.setSliceProfileId("ab9af40f13f721b5f13539d87484098");
+        sP.setPlmnIdList(plmn);
+        sP.setPerfReq(perfReq);
+        sP.setMaxNumberofUEs(200);
+        sP.setCoverageAreaTAList(taList);
+        sP.setLatency(6);
+        sP.setResourceSharingLevel(NON_SHARED);
+        NsiInfo nsiInfo = new NsiInfo();
+        nsiInfo.setNsiId("NSI-M-001-HDBNJ-NSMF-01-A-ZX");
+        nsiInfo.setNsiName("eMBB-001");
+        AllocateCnNssi cnNssi = new AllocateCnNssi();
+        cnNssi.setNssiId("NSST-C-001-HDBNJ-NSSMF-01-A-ZX");
+        cnNssi.setNssiName("eMBB-001");
+        cnNssi.setScriptName("CN1");
+        cnNssi.setSliceProfile(sP);
+        cnNssi.setNsiInfo(nsiInfo);
+
+        NssmfAdapterNBIRequest nbiRequest = createNbiRequest();
+        nbiRequest.setAllocateCnNssi(cnNssi);
+        return nbiRequest;
+    }
+
+    @Test
+    public void deAllocateNssi() throws Exception {
+        DeAllocateNssi deAllocateNssi = new DeAllocateNssi();
+        deAllocateNssi.setTerminateNssiOption(0);
+        List<String> snssai = new LinkedList<>();
+        snssai.add("001-100001");
+        deAllocateNssi.setNsiId("NSI-M-001-HDBNJ-NSMF-01-A-ZX");
+        deAllocateNssi.setNssiId("NSSI-C-001-HDBNJ-NSSMF-01-A-ZX");
+        deAllocateNssi.setScriptName("CN1");
+        deAllocateNssi.setSnssaiList(snssai);
+
+        NssmfAdapterNBIRequest nbiRequest = createNbiRequest();
+        nbiRequest.setDeAllocateNssi(deAllocateNssi);
+
+        NssmfInfo nssmf = new NssmfInfo();
+        nssmf.setUserName("nssmf-user");
+        nssmf.setPassword("nssmf-pass");
+        nssmf.setPort("8080");
+        nssmf.setIpAddress("127.0.0.1");
+
+        NssiResponse nssiRes = new NssiResponse();
+        nssiRes.setJobId("4b45d919816ccaa2b762df5120f72067");
+
+        TokenResponse token = new TokenResponse();
+        token.setAccessToken("7512eb3feb5249eca5ddd742fedddd39");
+        token.setExpires(1800);
+
+        postStream = new ByteArrayInputStream(marshal(nssiRes).getBytes(UTF_8));
+        tokenStream = new ByteArrayInputStream(marshal(token).getBytes(UTF_8));
+
+        createCommonMock(202, nssmf);
+        ResponseEntity res = nssiManagerService.deAllocateNssi(nbiRequest, "ab9af40f13f721b5f13539d87484098");
+        assertNotNull(res);
+        assertNotNull(res.getBody());
+        NssiResponse allRes = unMarshal(res.getBody().toString(), NssiResponse.class);
+        assertEquals(allRes.getJobId(), "4b45d919816ccaa2b762df5120f72067");
+        assertNotNull(res);
+        assertNotNull(res.getBody());
+    }
+
+    @Test
+    public void activateNssi() throws Exception {
+        NssmfInfo nssmf = new NssmfInfo();
+        nssmf.setUserName("nssmf-user");
+        nssmf.setPassword("nssmf-pass");
+        nssmf.setPort("8080");
+        nssmf.setIpAddress("127.0.0.1");
+
+        NssiResponse nssiRes = new NssiResponse();
+        nssiRes.setJobId("4b45d919816ccaa2b762df5120f72067");
+
+        TokenResponse token = new TokenResponse();
+        token.setAccessToken("7512eb3feb5249eca5ddd742fedddd39");
+        token.setExpires(1800);
+
+        postStream = new ByteArrayInputStream(marshal(nssiRes).getBytes(UTF_8));
+        tokenStream = new ByteArrayInputStream(marshal(token).getBytes(UTF_8));
+
+        ActDeActNssi act = new ActDeActNssi();
+        act.setNsiId("NSI-M-001-HDBNJ-NSMF-01-A-ZX");
+        act.setNssiId("NSSI-C-001-HDBNJ-NSSMF-01-A-ZX");
+
+        NssmfAdapterNBIRequest nbiRequest = createNbiRequest();
+        nbiRequest.setActDeActNssi(act);
+
+        createCommonMock(200, nssmf);
+        ResponseEntity res = nssiManagerService.activateNssi(nbiRequest, "001-100001");
+        assertNotNull(res);
+        assertNotNull(res.getBody());
+        NssiResponse allRes = unMarshal(res.getBody().toString(), NssiResponse.class);
+        assertEquals(allRes.getJobId(), "4b45d919816ccaa2b762df5120f72067");
+    }
+
+    @Test
+    public void deActivateNssi() throws Exception {
+        NssmfInfo nssmf = new NssmfInfo();
+        nssmf.setUserName("nssmf-user");
+        nssmf.setPassword("nssmf-pass");
+        nssmf.setPort("8080");
+        nssmf.setIpAddress("127.0.0.1");
+
+        NssiResponse nssiRes = new NssiResponse();
+        nssiRes.setJobId("4b45d919816ccaa2b762df5120f72067");
+
+        TokenResponse token = new TokenResponse();
+        token.setAccessToken("7512eb3feb5249eca5ddd742fedddd39");
+        token.setExpires(1800);
+
+        postStream = new ByteArrayInputStream(marshal(nssiRes).getBytes(UTF_8));
+        tokenStream = new ByteArrayInputStream(marshal(token).getBytes(UTF_8));
+
+        ActDeActNssi act = new ActDeActNssi();
+        act.setNsiId("NSI-M-001-HDBNJ-NSMF-01-A-ZX");
+        act.setNssiId("NSSI-C-001-HDBNJ-NSSMF-01-A-ZX");
+
+        NssmfAdapterNBIRequest nbiRequest = createNbiRequest();
+        nbiRequest.setActDeActNssi(act);
+
+        createCommonMock(200, nssmf);
+        ResponseEntity res = nssiManagerService.deActivateNssi(nbiRequest, "001-100001");
+        assertNotNull(res);
+        assertNotNull(res.getBody());
+        NssiResponse allRes = unMarshal(res.getBody().toString(), NssiResponse.class);
+        assertEquals(allRes.getJobId(), "4b45d919816ccaa2b762df5120f72067");
+    }
+
+    @Test
+    public void queryJobStatus() throws Exception {
+        NssmfInfo nssmf = new NssmfInfo();
+        nssmf.setUserName("nssmf-user");
+        nssmf.setPassword("nssmf-pass");
+        nssmf.setPort("8080");
+        nssmf.setIpAddress("127.0.0.1");
+
+        JobStatusResponse jobStatusResponse = new JobStatusResponse();
+        ResponseDescriptor descriptor = new ResponseDescriptor();
+        descriptor.setResponseId("7512eb3feb5249eca5ddd742fedddd39");
+        descriptor.setProgress(20);
+        descriptor.setStatusDescription("Initiating VNF Instance");
+        descriptor.setStatus("processing");
+        jobStatusResponse.setResponseDescriptor(descriptor);
+
+        TokenResponse token = new TokenResponse();
+        token.setAccessToken("7512eb3feb5249eca5ddd742fedddd39");
+        token.setExpires(1800);
+
+        postStream = new ByteArrayInputStream(marshal(jobStatusResponse).getBytes(UTF_8));
+        tokenStream = new ByteArrayInputStream(marshal(token).getBytes(UTF_8));
+
+        ResourceOperationStatus operationStatus = new ResourceOperationStatus();
+        operationStatus.setOperationId("4b45d919816ccaa2b762df5120f72067");
+        operationStatus.setResourceTemplateUUID("8ee5926d-720b-4bb2-86f9-d20e921c143b");
+        operationStatus.setServiceId("NSI-M-001-HDBNJ-NSMF-01-A-ZX");
+
+        NssmfAdapterNBIRequest nbiRequest = createNbiRequest();
+        nbiRequest.setResponseId("7512eb3feb5249eca5ddd742fedddd39");
+        Optional<ResourceOperationStatus> optional = Optional.of(operationStatus);
+
+        doAnswer(invocation -> optional).when(repository).findOne(any());
+
+        createCommonMock(200, nssmf);
+
+        ResponseEntity res = nssiManagerService.queryJobStatus(nbiRequest, "4b45d919816ccaa2b762df5120f72067");
+        assertNotNull(res);
+        assertNotNull(res.getBody());
+        JobStatusResponse allRes = unMarshal(res.getBody().toString(), JobStatusResponse.class);
+        assertEquals(allRes.getResponseDescriptor().getProgress(), 20);
+        assertEquals(allRes.getResponseDescriptor().getStatus(), "processing");
+        assertEquals(allRes.getResponseDescriptor().getResponseId(), "7512eb3feb5249eca5ddd742fedddd39");
+
+        System.out.println(res);
+
+    }
+
+    @Test
+    public void queryNSSISelectionCapability() throws Exception {
+
+        NssmfAdapterNBIRequest nbiRequest = createNbiRequest();
+        ResponseEntity res = nssiManagerService.queryNSSISelectionCapability(nbiRequest);
+        assertNotNull(res);
+        assertNotNull(res.getBody());
+        Map allRes = unMarshal(res.getBody().toString(), Map.class);
+        assertEquals(allRes.get("selection"), "NSMF");
+
+        System.out.println(res);
+
+        nbiRequest.getEsrInfo().setVendor(NssmfAdapterConsts.ONAP_INTERNAL_TAG);
+        res = nssiManagerService.queryNSSISelectionCapability(nbiRequest);
+        assertNotNull(res);
+        assertNotNull(res.getBody());
+        allRes = unMarshal(res.getBody().toString(), Map.class);
+        assertEquals(allRes.get("selection"), "NSSMF");
+
+        System.out.println(res);
+
+        nbiRequest.getEsrInfo().setNetworkType(NetworkType.ACCESS);
+        res = nssiManagerService.queryNSSISelectionCapability(nbiRequest);
+        assertNotNull(res);
+        assertNotNull(res.getBody());
+        allRes = unMarshal(res.getBody().toString(), Map.class);
+        assertEquals(allRes.get("selection"), "NSSMF");
+
+        System.out.println(res);
+    }
+
+    private NssmfAdapterNBIRequest createNbiRequest() {
+        NssmfAdapterNBIRequest nbiRequest = new NssmfAdapterNBIRequest();
+        EsrInfo esrInfo = new EsrInfo();
+        esrInfo.setVendor("huawei");
+        esrInfo.setNetworkType(CORE);
+        ServiceInfo serviceInfo = new ServiceInfo();
+        serviceInfo.setServiceUuid("8ee5926d-720b-4bb2-86f9-d20e921c143b");
+        serviceInfo.setServiceInvariantUuid("e75698d9-925a-4cdd-a6c0-edacbe6a0b51");
+        serviceInfo.setGlobalSubscriberId("5GCustomer");
+        serviceInfo.setServiceType("5G");
+        serviceInfo.setNsiId("NSI-M-001-HDBNJ-NSMF-01-A-ZX");
+        nbiRequest.setEsrInfo(esrInfo);
+        nbiRequest.setServiceInfo(serviceInfo);
+        return nbiRequest;
+    }
+
+    @Test
+    public void querySubnetCapability() {
+        NssmfAdapterNBIRequest nbiRequest = createNbiRequest();
+
+        String subnetCapabilityQuery = "\"subnetTypes\": [\"TN-FH\",\"TN-MH\",\"TN-BH\"]";
+        nbiRequest.setSubnetCapabilityQuery(subnetCapabilityQuery);
+        ResponseEntity res = nssiManagerService.queryNSSISelectionCapability(nbiRequest);
+        assertNotNull(res);
+        assertNotNull(res.getBody());
+    }
+}
diff --git a/adapters/mso-nssmf-adapter/src/test/resources/application-test.yaml b/adapters/mso-nssmf-adapter/src/test/resources/application-test.yaml
new file mode 100644
index 0000000..fa323e8
--- /dev/null
+++ b/adapters/mso-nssmf-adapter/src/test/resources/application-test.yaml
@@ -0,0 +1,60 @@
+
+aai:
+  auth: 2A11B07DB6214A839394AA1EC5844695F5114FC407FF5422625FB00175A3DCB8A1FF745F22867EFA72D5369D599BBD88DA8BED4233CF5586
+  endpoint: https://aai.onap:30233
+logging:
+  path: logs
+
+spring:
+  datasource:
+    username: root
+    password: 123456
+    driver-class-name: org.mariadb.jdbc.Driver
+    initialization-mode: always
+    url: jdbc:mariadb://49.232.146.162:8989/requestdb
+  jpa:
+    generate-ddl: false
+    show-sql: false
+    hibernate:
+      ddl-auto: none
+      naming-strategy: org.hibernate.cfg.ImprovedNamingStrategy
+      enable-lazy-load-no-trans: true
+    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
+  security:
+    usercredentials:
+      - username: bpel
+        password: '$2a$10$Fh9ffgPw2vnmsghsRD3ZauBL1aKXebigbq3BB1RPWtE62UDILsjke'
+        role: BPEL-Client
+      - username: mso_admin
+        password: '$2a$10$Fh9ffgPw2vnmsghsRD3ZauBL1aKXebigbq3BB1RPWtE62UDILsjke'
+        role: ACTUATOR
+server:
+  port: 8080
+  tomcat:
+    max-threads: 50
+
+mso:
+  key: 07a7159d3bf51a0e53be7a8f89699be7
+  site-name: localSite
+  logPath: ./logs/nssmf
+  adapters:
+    requestDb:
+      endpoint: https://so-request-db-adapter.{{ include "common.namespace" . }}:8083
+      auth: Basic YnBlbDpwYXNzd29yZDEk
+  infra:
+    endpoint: https://so.{{ include "common.namespace" . }}:8080
+    auth: Basic SW5mcmFQb3J0YWxDbGllbnQ6cGFzc3dvcmQxJA==
+
+#Actuator
+management:
+  endpoints:
+    web:
+      base-path: /manage
+      exposure:
+        include: "*"
+  metrics:
+    se-global-registry: false
+    export:
+      prometheus:
+        enabled: true # Whether exporting of metrics to Prometheus is enabled.
+        step: 1m # Step size (i.e. reporting frequency) to use.
\ No newline at end of file
diff --git a/docs/developer_info/Mso_Openstack_Adapter.rst b/docs/developer_info/Mso_Openstack_Adapter.rst
new file mode 100644
index 0000000..a8ca362
--- /dev/null
+++ b/docs/developer_info/Mso_Openstack_Adapter.rst
@@ -0,0 +1,796 @@
+.. This work is licensed under a Creative Commons Attribution 4.0 International License.
+.. http://creativecommons.org/licenses/by/4.0
+.. Copyright 2020 Huawei Technologies Co., Ltd.
+
+MSO-OPENSTACK-ADAPTER :
+=======================
+
+.. contents:: :depth: 3
+
+Cloud site operations
+++++++++++++++++++++++
+* Here we have 3 api's createCloudRegion, updateCloudRegion, deleteCloudRegion.
+
+1.Create Cloud site/Cloud region:
+
+Path: /v1/cloud-region
+
+Method Type: POST
+
+Request Body:
+*************
+{
+  "id": "MTN13",
+  "regionId": "mtn13",
+  "cloudVersion": "3.0",
+  "clli": "MDT13",
+  "platform": "testFlatform",
+  "orchestrator": "testOrchestrator",
+  "cloudifyId": "mtn13",
+  "cloudOwner": "testCloudOwner",
+
+  "identityService": {
+    "identityUrl": "testUrl",
+    "msoId": "admin",
+    "msoPass": "admin",
+    "projectDomainName": "testDomain",
+    "userDomainName": "testDomain",
+    "adminTenant": "test",
+    "memberRole": "test",
+    "tenantMetadata": "test",
+    "identityServerType": "test",
+    "identityAuthenticationType": "test",
+    "lastUpdatedBy": "test",
+    "created": "date",
+    "updated": "date"
+
+  },
+
+  "identityServiceId": "123",
+  "lastUpdatedBy": "test",
+  "created": "test",
+  "updated": "test",
+  "supportFabric": "true",
+  "uri": "test"
+
+}
+
+* In this api we can create cloud region and cloud site and saving in catalog db and in AAI.
+
+* This api requires cloud-region-id and cloudSite as inputs.
+
+* In createCloudRegion two steps are there.
+
+* CreateRegionInCatalogDb(cloudSite) :- here we are creating cloud region in catalogdb if it is not exists in db(cloud_sites).
+
+* CreateCloudRegionInAAI(cloudSite) :- mapping cloudSite into cloudregion , this cloudregion we are creating in AAI and create CloudRegion   NetworkTechnology Relationship.
+
+2.Delete Cloud site:
+
+* Path:/v1/cloud-region/{cloud-region-id}/{cloud-owner}
+
+* Here we can delete Cloud site by cloud region id
+
+3.Update Cloud site:
+
+* Path:/v1/cloud-region/{cloud-region-id}/{cloud-owner}
+
+* Here we can update Cloud site by cloud region id 
+
+Create Tenant in Cloud:
+++++++++++++++++++++++++
+
+Path: http://host:port/vnfs/rest/v1/tenants
+
+Method Type: POST
+
+Request Body:
+*************
+
+{ 
+"cloudSiteId": "DAN", 
+"tenantName":"RAA_1",
+"failIfExists": true, 
+"msoRequest": { 
+"requestId": "ra1",
+"serviceInstanceId":"sa1" 
+}
+} 
+
+RESPONSE:
+**********
+
+{
+
+"cloudSiteId": "DAN",
+"tenantId": "128e10b9996d43a7874f19bbc4eb6749", 
+"tenantCreated": true,
+"tenantRollback": {
+"tenantId": "128e10b9996d43a7874f19bbc4eb6749",
+"cloudId": "DAN", // RAA? cloudId instead of cloudSiteId
+"tenantCreated": true,
+"msoRequest": { 
+"requestId": "ra1",
+"serviceInstanceId": "sa1"
+ 
+} 
+} 
+}
+
+Code Flow:
+
+* Call to MSO createTenant adapter then  call to catalog db for cloud site info and from cloud site get IdentityServerType.
+* based on Cloud IdentityServerType it returns ORM or KEYSTONE Utils
+* Query for a tenant with the specified name in the given cloud. If the tenant exists, return an MsoTenant object. If not, return null.
+* Create a tenant with the specified name in the given cloud. If the tenant already exists, an Exception will be thrown. The MSO User will also be added to the "member" list of the new tenant to perform subsequent Nova/Heat commands in the tenant. If the MSO User association fails, the entire transaction will be rolled back.
+
+TaskServices
+++++++++++++++
+**1. CreateInventory**
+
+Flow Diagram:
+
+.. image :: ../images/InventoryCreate.png
+
+Code Flow:
+
+* Get cloud site using cloud region id from catalog db.
+
+* Instantiate heat bridge client by passing required values.
+
+* Authenticate heat bridge client.
+
+* If authentication is success we are getting all stack resources(openstack servers. servers contains openstack images and flavours.)
+
+* From stack resources we are getting osServers/ compute resources.
+
+* CreatePserversAndPinterfacesIfNotPresentInAai --Transform Openstack Server object to AAI Pserver object. create pserver in AAI if it is not exist. and get openstackresource id's / ports -- transform ports to pinterface Object in AAI.
+
+* After extract osimages and os flavours from osservers.
+
+* After that transform osimages to AAI images and osflavours to AAI flavors and add to AAI.
+
+* Create Vservers in AAI and make relationships to AAI image, AAI flavor, AAI pserver, vf-module.
+
+* Add Vservers and Linterfaces to AAI--Transform port to Linterface and for that port Get Ip addresses and updateLInterfaceIps and updateLInterfaceVlan.
+
+* Finally update AAI. 
+  
+**2. AuditCreateStack**
+
+Flow Diagram:
+
+.. image :: ../images/InventoryAddAudit.png
+
+Code Flow:
+
+* First we are capturing entry timestamp, MSO REQUESTID,  Servicename/topic name,partnername as openstack adapter, invocation id  is generating one random uuid.
+
+* After that getting auditInventory details from externalTask object
+
+* From auditInventory object we are getting cloud region,clowd owner,tenant id, heatstack name.these details we are passing to get AAIObjectAuditList.
+
+* Use cloudRegion, tenantId, heatStackName to get resources from Heat client.
+
+* To get resources we need heat client it means getting keystone url and token. 
+
+* Get keystone url based on server type(keystone/keystonev3)
+
+* From resources object we are getting novaResources and resource groups and neutronPortDetails.
+
+* Create VserverSet by passing resources, novaResources, neutronPortDetails and setting up servers with ports to Set of Servers.
+
+* From resource groups we are getting Link(stackLink) from that link we are extracting resource path .if path is present we are Fetching nested Resource Stack Information.
+
+* audit all vservers,l-interfaces and sub l-interfaces. and checking in these vservers , l-interfaces and sub interfaces are existed or not in AAI. 
+
+* If AAIObjectAuditList is present then we are setting audit type as create and Heat stack name to AAIObjectAuditList.
+
+* If Audit create success putting in variable to complete external task other wise sending exception.
+
+* If retrycount=1 sending error as retrycount exhausted.
+
+**3.  AuditQueryStack**
+
+Flow Diagram:
+
+.. image :: ../images/InventoryQueryAudit.png
+
+
+Code Flow:
+
+* Get AuditInventory details from external task.
+
+* Get AAIObjectAuditList from auditHeatStack  by passing these parametersauditInventory.getCloudRegion(),auditInventory.getCloudOwner(), auditInventory.getTenantId(), auditInventory.getHeatStackName().
+
+* Fetching Top Level Stack Information.i.e get all the heat model resources.
+
+* From heat model resources get all OS::Nova::Servers and OS::Heat::ResourceGroups and neutronPortDetails.
+
+* Once u got all the stack info u create vserverset and add that vserverset to AAIObjectAuditList.
+
+* After add AAIObjectAuditList to requestdb if it is not exist in requestdb.
+
+* If it is success complete the external task.
+
+**4. AuditDeleteStack**
+
+Flow Diagram:
+
+.. image :: ../images/InventoryDeleteAudit.png
+
+Code Flow:
+
+* Get AuditInventory details from external task 
+
+* GetStackDataFromRequestDb usiing AuditInventory details.
+
+* Get RequestProcessingData from requestdb using auditInventory.getVfModuleId(),auditInventory.getHeatStackName(), "AuditStackData".
+
+* From RequestProcessingData get AAIObjectAuditList.
+
+* If AAIObjectAuditList is empty check vservers is exist or not in AAI and set that result as setDoesObjectExist(true/false).
+
+* Else Auditing Vservers based on vf module relationships--i.e based on genericVnfId and vfModuleName get all the vservers and create AAIObject and set setDoesObjectExist(true) and set that object to list.
+
+* After that set audit type as delete and heatstackname and check that audit create success or not.
+
+* If it is success complete the external task.
+
+**5. DeleteInventory**
+
+Flow Diagram:
+
+.. image :: ../images/DeleteInventory.png
+
+
+Code Flow:
+
+* Get CloudInformation from external task.
+
+* First get CloudSite details from catalog db by using regionid.
+
+* From CloudSite get CloudIdentity details.
+
+* Create a heatbridgeclient. and authenticate the heatbridge.
+
+* After that delete the VFmodule data using vnfid and vf moduleid.
+
+* Once delete success complete the external task.
+
+**6. StackService**
+
+Flow Diagram:
+
+.. image :: ../images/OpenstackAdapterInvoke.png
+
+
+Code Flow:
+
+* From external task  getting openstackAdapterTaskRequest and adding to string(xmlRequest).
+
+* From xmlrequest we are getting requestType.
+
+1. If requestType is createVolumeGroupRequest then we are creating volume group.
+
+* Marshalling xmlRequest  to CreateVolumeGroupRequest.
+
+* From CreateVolumeGroupRequest getting completeVnfVfModuleType.
+
+* After that we are creating vf module by passing required paremeters.
+
+* If request type Start with X then we are orchestrating a VNF - *NOT* a module!
+
+* RequestType start with Volume then then we are sending true as volume request.
+
+* Creating a VnfRollback object by passing required parameters.
+
+* If nestedStackId is not null we are getting nested heat stack(stack information).
+
+* If nested heat stack is not null we are getting that output and storing into nestedVolumeOutputs object.
+
+* If nestedBaseStackId is not null we are getting nestedBaseHeatStack information and setting output to nestedBaseHeatStack.
+
+* If modelCustomizationUuid is available then with that mcu we are getting VFModuleCustomization(vfmc);
+
+* If we get VFModuleCustomization then we are extracting VfModule.
+
+* If vf version is not null then we will get vnfresource by passing vnftype and vnfversion.
+
+* By here - we would have either a vf or vnfResource.
+
+* If vf module is not null we are geting vnfresource from vf and from this vnfresource  we are getting minversionvnf and maxversionvnf.
+
+* If minversionvnf and maxversionvnf are not null we are checking cloudConfig is null or not, if cloudConfig is not null then we are getting cloud site intormation by passing cloud site id. once we get the cloud site details we are getting min and max cloud site versions. 
+
+* By the time we get here - heatTemplateId and heatEnvtId should be populated (or null)
+
+* If it is old way we will get heatTemplate directly. else if vf module is not null then
+* If it is a volume request then we will get volumeheattemplate and volumeheatenvironment.
+* If it is not a volume request then we will get ModuleHeatTemplate and HeatEnvironment.
+
+* Once we get heat templates we are getting nestedtemplates.
+
+* Also add the files: for any get_files associated with this vnf_resource_id
+
+* Add ability to turn on adding get_files with volume requests (by property).
+
+* If it is not a volume request get heat files from vf module.
+
+* CheckRequiredParameters in MsoVnfAdapterImpl.CHECK_REQD_PARAMS.
+
+* Parse envt entries to see if reqd parameter is there (before used a simple grep
+
+* Only submit to openstack the parameters in the envt that are in the heat template
+
+*  Convert what we got as inputs (Map<String, String>) to a Map<String, Object> - where the object matches the param type identified in the template This will also not copy over params that aren't identified in the template
+
+* Now simply add the outputs as we received them - no need to convert to string
+
+* Add in the volume stack outputs if applicable
+
+* Get all heat template parameters and add to list.
+
+* Check for missing parameters null or not.if no missing parameters we can proceed for next step.
+
+* Next create stack with all required values.
+
+* After creating add heat stackname to vfrollback and copy heatstack outputs to outputs value. so now vf module is created successfully.
+
+* After sending the response to create volume group.once it is created that response we are setting to VolumeGroup response object. 
+
+2. If requestType is createVfModuleRequest then we are creating VfModule.
+
+* Marshalling xmlRequest  to CreateVolumeGroupRequest.
+
+* From CreateVolumeGroupRequest getting completeVnfVfModuleType.
+
+* After that we are creating vf module by passing required paremeters.
+
+* If request type Start with X then we are orchestrating a VNF - *NOT* a module!
+
+* RequestType start with Volume then then we are sending true as volume request.
+
+* Creating a VnfRollback object by passing required parameters.
+
+* If nestedStackId is not null we are getting nested heat stack(stack information).
+
+* If nested heat stack is not null we are getting that output and storing into nestedVolumeOutputs object.
+
+* If nestedBaseStackId is not null we are getting nestedBaseHeatStack information and setting output to nestedBaseHeatStack.
+
+* If modelCustomizationUuid is available then with that mcu we are getting VFModuleCustomization(vfmc);
+
+* If we get VFModuleCustomization then we are extracting VfModule.
+
+* If vf version is not null then we will get vnfresource by passing vnftype and vnfversion.
+
+* By here - we would have either a vf or vnfResource.
+
+* If vf module is not null we are geting vnfresource from vf and from this vnfresource  we are getting minversionvnf and maxversionvnf.
+
+* If minversionvnf and maxversionvnf are not null we are checking cloudConfig is null or not, if cloudConfig is not null then we are getting cloud site intormation by passing cloud site id. once we get the cloud site details we are getting min and max cloud site versions. 
+
+* By the time we get here - heatTemplateId and heatEnvtId should be populated (or null)
+
+* If it is old way we will get heatTemplate directly. else if vf module is not null then
+
+* If it is a volume request then we will get volumeheattemplate and volumeheatenvironment.
+
+* If it is not a volume request then we will get ModuleHeatTemplate and HeatEnvironment.
+
+* Once we get heat templates we are getting nestedtemplates.
+
+* Also add the files: for any get_files associated with this vnf_resource_id
+
+* Add ability to turn on adding get_files with volume requests (by property).
+
+* If it is not a volume request get heat files from vf module.
+
+* CheckRequiredParameters in MsoVnfAdapterImpl.CHECK_REQD_PARAMS.
+
+* Parse envt entries to see if reqd parameter is there (before used a simple grep
+
+* Only submit to openstack the parameters in the envt that are in the heat template
+
+* Convert what we got as inputs (Map<String, String>) to a Map<String, Object> - where the object matches the param type identified in the template This will also not copy over params that aren't identified in the template
+
+* Now simply add the outputs as we received them - no need to convert to string
+
+* Add in the volume stack outputs if applicable
+
+* Get all heat template parameters and add to list.
+
+* Check for missing parameters null or not.if no missing parameters we can proceed for next step.
+
+* Next create stack with all required values.
+
+* After creating add heat stackname to vfrollback and copy heatstack outputs to outputs value. so now vf module is created successfully.
+
+3. If requestType is deleteVfModuleRequest then we are deleting VfModule .
+
+* Get stackinfo using msoHeatUtils by passing cloudSiteId, cloudOwner, tenantId, vnfName parameters.
+
+* After that using modelCustomizationUuid we are getting VFModuleCustomizaiton--VFModule--heattemplate.
+
+* After that we are callling msoHeatUtils.deleteStack to delete StackInfo once it deletes we are updating status as deleted using msoHeatUtils.updateResourceStatus.
+
+4. If requestType is deleteVolumeGroupRequest then we are deleting volume group.
+
+* Making DeleteVolumeGroupRequest by Unmarshalling xml request.
+
+* Getting stack information by passing stackName, cloudSiteId, tenantId.
+
+* If current stack is null then we confirm that heat status not found.
+
+* If current stack is not null then we are deleting the stack.
+
+* Once volumegroup is deleted we are setting the response to perticular response class.
+
+5. If requestType is createNetworkRequest then we are creating network.
+
+* Making CreateNetworkRequest by Unmarshalling xmlrequest.
+
+* Check request is contrailRequest or not if it is contrailRequest we are setting shared,external,routeTargets,fqdns,routeTable values else we are setting physicalNetworkName and vlans.
+
+* Now all the above required values  we are passing to create network.
+
+* Build a default NetworkRollback object (if no actions performed).
+
+* Getting the cloud site by passing cloudsite id.
+
+* After we are doing a network check and Retrieve the Network Resource definition.
+
+* If modelCustomizationUuid null and networkType is not null based on networkType we are getting Network Resource.
+
+* If modelCustomizationUuid not null then based on modelCustomizationUuid we are getting NetworkResourceCustomization and from that we are getting Network Resource.
+
+* If NetworkResourceCustomization is null then based on modelCustomizationUuid we are getting CollectionNetworkResourceCustomization and from that we are getting Network Resource.
+
+* Even though Network Resource is null we are sending error Unable to get network resource with NetworkType.
+
+* From the network resource we are extracting mode and network type.
+
+* All Networks are orchestrated via HEAT or Neutron if it is other than that we are sending error.
+
+* After that we are checking network resorce min and max versions with cloud site version if version is not supported throwing error.
+
+* After that validating the network parameters that if any parameter is missing.
+
+* Once we Retrieve the Network Resource we are getting heat template and NetworkType from that.
+
+* From the heat template  we are getting template and checking that template contains os3nw if it is contains making flag is true.
+
+* First, look up to see if the Network already exists (by name).For HEAT orchestration of networks, the stack name will always match the network name
+
+* If stack is already exist with the network name throw an error.
+
+* After that from stackinfo get network id and network fqdn and get outputs from Stackinfo.
+
+* After that get subnetIdMap based on one subnet_id output or multiples subnet_%aaid% outputs from Stackinfo outputs.
+
+* After that update the updateResourceStatus as exits in requestdb. 
+
+* Now we are Ready to deploy the new Network and  Build the common set of HEAT template parameters
+
+* Validate (and update) the input parameters against the DB definition
+
+* Shouldn't happen unless DB config is wrong, since all networks use same inputs and inputs were already validated.
+
+* If subnets are not null and template is os3template then mergesubnetsAIC3.
+
+* If subnets are not null and template is not os3template then merge subnets.
+
+* If policyFqdns are not null & os3template true then mergePolicyRefs.
+
+* After that deploy the network stack-- create stack and once stack is created save into stackinfo.
+
+* For Heat-based orchestration, the MSO-tracked network ID is the heat stack, and the neutronNetworkId is the network UUID returned in stack outputs.
+
+* After update the resource status  like network created successfully.
+
+* After set response to CreateNetworkResponse object.
+
+
+6. If requestType is deleteNetworkRequest then we are deleting network.
+
+* Form a DeleteNetworkRequest  by unmarshlling Xml request.
+
+* check for mandatory fields networkId, cloudSiteId, tenantId.
+
+* If it is there Retrieve the Network Resource definition.
+
+* After that get networkResource.from networkResource get heat template.
+
+* After that delete stackinfo udpate resource status as deleted.
+
+7. If requestType is updateNetworkRequest then we are updating Network.
+
+* Make UpdateNetworkRequest by unmarshalling xmlRequest.
+
+* Check the params contains key shared and external if it is contains get that shared and external keys.
+
+* Check the request is ContrailRequest or not, if it is ContrailRequest then get routeTargets , fqdns, routeTable from the actual request.
+
+* If it is not ContrailRequest then get the ProviderVlanNetwork details like physicalNetworkName and vlans.
+
+* Params to update network-req.getCloudSiteId(), req.getTenantId(), req.getNetworkType(),req.getModelCustomizationUuid(), req.getNetworkStackId(), req.getNetworkName(), physicalNetworkName,vlans, routeTargets, shared, external, req.getSubnets(), fqdns, routeTable, req.getMsoRequest(),    subnetIdMap, networkRollback.
+
+* Update Network adapter with Network using networkName, networkType,cloudSiteId, tenantId.
+
+* Capture execution time for metrics.
+
+* Build a default rollback object (no actions performed)
+
+* Get cloud site details from catalog db  using cloud site id.
+
+* If cloud site is not present send the error message like CloudSite does not exist in MSO Configuration.
+
+* Getting the cloud site by passing cloudsite id.
+
+* After we are doing a network check and Retrieve the Network Resource definition.
+
+* If modelCustomizationUuid null and networkType is not null based on networkType we are getting Network Resource.
+
+* If modelCustomizationUuid not null then based on modelCustomizationUuid we are getting NetworkResourceCustomization and from that we are getting Network Resource.
+
+* If NetworkResourceCustomization is null then based on modelCustomizationUuid we are getting CollectionNetworkResourceCustomization and from that we are getting Network Resource.
+
+* Even though Network Resource is null we are sending error Unable to get network resource with NetworkType.
+
+* From the network resource we are extracting mode and network type.
+
+* All Networks are orchestrated via HEAT or Neutron if it is other than that we are sending error.
+
+* After that we are checking network resorce min and max versions with cloud site version if version is not supported throwing error.
+
+* After that validating the network parameters that if any parameter is missing.
+
+* Once we Retrieve the Network Resource we are getting heat template and NetworkType from that.
+
+* Use an MsoNeutronUtils for all Neutron commands
+
+* If Orchestaration mode is NEUTRON Verify that the Network exists and For Neutron-based orchestration, the networkId is the Neutron Network UUID.
+
+* Get NetworkInfo from cloud site using networkId, tenantId, cloudSiteId as params.
+
+* If NetworkInfo is null then throw the error message as Network is does not exist.
+
+* Update the network in cloud site which is in catalog db using cloudSiteId,tenantId,networkId,                          			neutronNetworkType, physicalNetworkName, vlans as params.
+
+* Add the network ID and previously queried vlans to the rollback object.
+
+* Save previous parameters such as NetworkName,PhysicalNetwork,Vlans to the NetworkRollback.
+
+* If Orchestaration mode is HEAT then First, look up to see that the Network already exists. For Heat-based orchestration, the networkId is the network Stack ID.
+
+* Get StackInfo by querystack using cloudSiteId, CLOUD_OWNER, tenantId, networkName.
+
+* If StackInfo is null throw error as Network not found else continue the flow.
+
+* Get the previous parameters such as previousNetworkName and previousPhysicalNetwork  for rollback from StackInfo.
+
+* Get the previous vlans  from the heat params and Update Stack with Previous VLANS.
+
+* Now we are Ready to deploy the updated Network via Heat.
+
+* Get the HeatTemplate from NetworkResource and now we got HEAT Template from DB.
+
+* Now get the OS::ContrailV2::VirtualNetwork property from property file , if template contains os3nw set flag as true.
+
+* Build the common set of HEAT template parameters such as  neutronNetworkType, networkName, physicalNetworkName, vlans, routeTargets, shared, external, os3template.
+
+* Validate and update the input parameters against the DB definition and  Shouldn't happen unless DB config is wrong, since all networks use same inputs.
+
+* If subnets are not null and template is os3template then mergesubnetsAIC3.
+
+* If subnets are not null and template is not os3template then merge subnets.
+
+* If policyFqdns are not null & os3template true then mergePolicyRefs.
+
+* If routeTableFqdns are not null os3template not null then mergeRouteTableRefs using routeTableFqdns, stackParams as params.
+
+* Get outputs from StackInfo  and if key is contains subnet  and os3template not null then one subnet output expected else multiples subnet outputs allowed.
+
+* Reach this point if createStack is successful.Populate remaining rollback info and response parameters and save previous parameters.
+
+* Now Network successfully updated via HEAT.
+
+8. If requestType is rollbackNetworkRequest then we are doing rollbackNetwork.
+
+* Make RollbackNetworkRequest by unmarshalling xmlRequest.
+
+* Get NetworkRollback from RollbackNetworkRequest.
+
+* If pollForCompletion is null then set flag as true.
+
+* Get the elements of the VnfRollback object for easier access.
+
+* ROLLBACK Network using  networkId, cloudSiteId, tenantId.
+
+* If NetworkCreated then use tenantId, CLOUD_OWNER, cloudSiteId, networkId, pollForCompletion, timeoutMinutes params to delete stack.
+
+* Once deletion is success set the response to RollbackNetworkResponse.
+
+* Once task stack service is success set the status completed for the external task.
+
+
+**7. PollService**
+
+Flow Diagram:
+
+.. image :: ../images/OpenstackAdapterPoller.png
+
+
+Code Flow:
+
+* Get openstackAdapterTaskRequest as xmlRequest from the the external task.
+
+* Get requestType from the xmlRequest.
+
+1. If request type is createVolumeGroupRequest then Execute External Task Rollback Service for Create Volume Group.
+
+* Create CreateVolumeGroupRequest by unmarshalling xmlRequest.
+
+* Use CloudSiteId, CloudOwner, TenantId,VolumeGroupName, MsoRequest ,pollStackStatus as params to delete vnf.
+
+* Call to openstack to delete vnf if it is success nothing to return if it is failure return failure exception.
+
+* Once it is success set the boolean flags pollRollbackStatus and status as true.
+
+2. If request type is createVfModuleRequest then Execute External Task Rollback Service for Create Vf Module.
+
+* Create CreateVfModuleRequest by unmarshalling xmlRequest.
+
+* Use CloudSiteId, CloudOwner, TenantId,VfModuleName, VnfId, VfModuleId, ModelCustomizationUuid,MsoRequest ,Holder as params to delete vf module.
+
+* Call to openstack to get the stack outputs.
+
+* If modelCustomizationUuid is not null then use as a param to get the VfModuleCustomization and from VfModuleCustomization get the vf module details.
+
+* Use tenantId, cloudOwner, cloudSiteId, vnfName, pollForCompletion, timeoutMinutes as params to delete the stack .once it is success update the resources.
+
+* Once it is success set the boolean flags pollRollbackStatus and status as true.
+
+3. If requestType is deleteVfModuleRequest then Execute External Task Poll Service for Delete Vf Module.
+
+* Create DeleteVfModuleRequest by unmarshalling xmlRequest.
+
+* Get stackId from external task by using that get Stack.
+
+* Get pollingFrequency from properties file and calculate no.of polling attempts.
+
+* Using cloudSiteId, tenantId get Heatclient and once you got heatclient querystack to get the Stack object.
+
+* If Stack object is not null update the stack status in requestdb and it returns Stack object.
+
+* If Stack object is not null check the status is DELETE_COMPLETE then Stack Deletion completed successfully.
+
+
+4. If requestType is deleteVolumeGroupRequest then Execute Execute External Task Poll Service for Delete Volume Group.
+
+* Create DeleteVfModuleRequest by unmarshalling xmlRequest.
+
+* Get stackId from external task by using that get Stack.
+
+* Get pollingFrequency from properties file and calculate no.of polling attempts.
+
+* Using cloudSiteId, tenantId get Heatclient and once you got heatclient querystack to get the Stack object.
+
+* If Stack object is not null update the stack status in requestdb and it returns Stack object.
+
+* If Stack object is not null check the status is DELETE_COMPLETE then Stack Deletion completed successfully.
+
+5. If requestType is deleteNetworkRequest then Execute External Task Poll Service for Delete Network.
+
+* Create DeleteVfModuleRequest by unmarshalling xmlRequest.
+
+* Get stackId from external task by using that get Stack.
+
+* Get pollingFrequency from properties file and calculate no.of polling attempts.
+
+* Using cloudSiteId, tenantId get Heatclient and once you got heatclient querystack to get the Stack object.
+
+* If Stack object is not null update the stack status in requestdb and it returns Stack object.
+
+* If Stack object is not null check the status is DELETE_COMPLETE then Stack Deletion completed successfully.
+
+6. If requestType is createNetworkRequest then get the PollRollbackStatus from the external task.
+
+* If pollRollbackStatus is true then Execute External Task Poll Service for Rollback Create Network.
+
+* Get stackId from external task by using that get Stack.
+
+* Get pollingFrequency from properties file and calculate no.of polling attempts.
+
+* Using cloudSiteId, tenantId get Heatclient and once you got heatclient querystack to get the Stack object.
+
+* If Stack object is not null update the stack status in requestdb and it returns Stack object.
+
+* If Stack object is not null check the status is DELETE_COMPLETE then Stack Deletion completed successfully.
+
+* If pollRollbackStatus is false then Execute External Task Poll Service for Create Network.
+
+* Get stackId from external task by using that get Stack.
+
+* Get pollingFrequency from properties file and calculate no.of polling attempts.
+
+* Using cloudSiteId, tenantId get Heatclient and once you got heatclient querystack to get the Stack object.
+
+* If Stack object is not null update the stack status in requestdb and it returns Stack object.
+
+* If Stack object is not null check the status is CREATE_COMPLETE then Stack Creation completed successfully.
+
+7. If requestType is createNetworkRequest then Execute External Task Rollback Service for Create Network.
+
+* Get stackId from external task by using that get Stack.
+
+* Get pollingFrequency from properties file and calculate no.of polling attempts.
+
+* Using cloudSiteId, tenantId get Heatclient and once you got heatclient querystack to get the Stack object.
+
+* If Stack object is not null update the stack status in requestdb and it returns Stack object.
+
+* If Stack object is not null check the status is UPDATE_COMPLETE then Stack Updation completed successfully.
+
+* Once task stack service is success set the status completed for the external task.
+
+**8. RollbackService**
+
+Flow Diagram:
+
+.. image :: ../images/OpenstackAdapterRollback.png
+
+
+Code Flow:
+
+* Get openstackAdapterTaskRequest as xmlRequest from the the external task.
+
+* Get requestType from the xmlRequest.
+
+1. If request type is createVolumeGroupRequest then Execute External Task Rollback Service for Create Volume Group.
+
+* Making DeleteVolumeGroupRequest by Unmarshalling xml request.
+
+* Getting stack information by passing stackName, cloudSiteId, tenantId.
+
+* If current stack is null then we confirm that heat status not found.
+
+* If current stack is not null then we are deleting the stack.
+
+* Once volumegroup is deleted we are setting the response to perticular response class.
+
+2. If request type is createVfModuleRequest then Execute External Task Rollback Service for Create Vf Module.
+
+* Get stackinfo using msoHeatUtils by passing cloudSiteId, cloudOwner, tenantId, vnfName parameters.
+
+* After that using modelCustomizationUuid we are getting VFModuleCustomizaiton--VFModule--heattemplate.
+
+* After that we are callling msoHeatUtils.deleteStack to delete StackInfo once it deletes we are updating status as deleted using msoHeatUtils.updateResourceStatus.
+
+* Once it is success set the boolean flags pollRollbackStatus and status as true.
+
+3. If request type is createNetworkRequest then Execute External Task Rollback Service for Create Network.
+
+* Form a DeleteNetworkRequest  by unmarshlling Xml request.
+
+* Check for mandatory fields networkId, cloudSiteId, tenantId.
+
+* If it is there Retrieve the Network Resource definition.
+
+* After that get networkResource.from networkResource get heat template.
+
+* After that delete stackinfo udpate resource status as deleted.
+
+* Once task stack service is success set the status completed for the external task.
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/developer_info/developer_information.rst b/docs/developer_info/developer_information.rst
index 5708613..1b9e83b 100644
--- a/docs/developer_info/developer_information.rst
+++ b/docs/developer_info/developer_information.rst
@@ -20,5 +20,6 @@
    BPMN_Subprocess_Process_Flows.rst
    BPMN_Project_Deployment_Strategy.rst
    BPMN-INFRA_Workflow_Understanding.rst
+   Mso_Openstack_Adapter.rst
    instantiate/index.rst
    FAQs.rst
diff --git a/docs/images/DeleteInventory.png b/docs/images/DeleteInventory.png
new file mode 100644
index 0000000..0fd6629
--- /dev/null
+++ b/docs/images/DeleteInventory.png
Binary files differ
diff --git a/docs/images/InventoryAddAudit.png b/docs/images/InventoryAddAudit.png
new file mode 100644
index 0000000..9e61c15
--- /dev/null
+++ b/docs/images/InventoryAddAudit.png
Binary files differ
diff --git a/docs/images/InventoryCreate.png b/docs/images/InventoryCreate.png
new file mode 100644
index 0000000..7df732f
--- /dev/null
+++ b/docs/images/InventoryCreate.png
Binary files differ
diff --git a/docs/images/InventoryDeleteAudit.png b/docs/images/InventoryDeleteAudit.png
new file mode 100644
index 0000000..f2f08bf
--- /dev/null
+++ b/docs/images/InventoryDeleteAudit.png
Binary files differ
diff --git a/docs/images/InventoryQueryAudit.png b/docs/images/InventoryQueryAudit.png
new file mode 100644
index 0000000..34f6cad
--- /dev/null
+++ b/docs/images/InventoryQueryAudit.png
Binary files differ
diff --git a/docs/images/OpenstackAdapterInvoke.png b/docs/images/OpenstackAdapterInvoke.png
new file mode 100644
index 0000000..998c472
--- /dev/null
+++ b/docs/images/OpenstackAdapterInvoke.png
Binary files differ
diff --git a/docs/images/OpenstackAdapterPoller.png b/docs/images/OpenstackAdapterPoller.png
new file mode 100644
index 0000000..e95bede
--- /dev/null
+++ b/docs/images/OpenstackAdapterPoller.png
Binary files differ
diff --git a/docs/images/OpenstackAdapterRollback.png b/docs/images/OpenstackAdapterRollback.png
new file mode 100644
index 0000000..1e55426
--- /dev/null
+++ b/docs/images/OpenstackAdapterRollback.png
Binary files differ
