Merge "Add unit test for CheckServiceProcessStatus workflow"
diff --git a/adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/utils/NovaClientImpl.java b/adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/utils/NovaClientImpl.java
index 7f0f6e4..4dc139f 100644
--- a/adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/utils/NovaClientImpl.java
+++ b/adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/utils/NovaClientImpl.java
@@ -26,14 +26,20 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.woorea.openstack.base.client.Entity;
+import com.woorea.openstack.base.client.HttpMethod;
 import com.woorea.openstack.base.client.OpenStackRequest;
 import com.woorea.openstack.nova.Nova;
 import com.woorea.openstack.nova.model.Flavor;
 import com.woorea.openstack.nova.model.Flavors;
 import com.woorea.openstack.nova.model.HostAggregate;
 import com.woorea.openstack.nova.model.HostAggregates;
+import com.woorea.openstack.nova.model.Hypervisors;
 import com.woorea.openstack.nova.model.QuotaSet;
 import com.woorea.openstack.nova.model.Server;
+import com.woorea.openstack.nova.model.VolumeAttachment;
 
 
 @Component
@@ -216,4 +222,61 @@
             throw new NovaClientException("Error building Nova Client", e);
         }
     }
+
+    public void postActionToServer(String cloudSiteId, String tenantId, String id, String request)
+            throws NovaClientException {
+        try {
+            ObjectMapper mapper = new ObjectMapper();
+            JsonNode actualObj = mapper.readTree(request);
+            Entity<JsonNode> openstackEntity = new Entity<>(actualObj, "application/json");
+            CharSequence actionPath = "/servers/" + id + "/action";
+            Nova novaClient = getNovaClient(cloudSiteId, tenantId);
+            OpenStackRequest<Void> OSRequest =
+                    new OpenStackRequest<>(novaClient, HttpMethod.POST, actionPath, openstackEntity, Void.class);
+            executeAndRecordOpenstackRequest(OSRequest, false);
+        } catch (Exception e) {
+            logger.error("Error building Nova Client", e);
+            throw new NovaClientException("Error building Nova Client", e);
+        }
+    }
+
+    public void attachVolume(String cloudSiteId, String tenantId, String serverId, VolumeAttachment volumeAttachment)
+            throws NovaClientException {
+        Nova novaClient;
+        try {
+            novaClient = getNovaClient(cloudSiteId, tenantId);
+            OpenStackRequest<Void> request = novaClient.servers().attachVolume(serverId, volumeAttachment.getVolumeId(),
+                    volumeAttachment.getDevice());
+            executeAndRecordOpenstackRequest(request, false);
+        } catch (MsoException e) {
+            logger.error("Error building Nova Client", e);
+            throw new NovaClientException("Error building Nova Client", e);
+        }
+    }
+
+    public void detachVolume(String cloudSiteId, String tenantId, String serverId, String volumeId)
+            throws NovaClientException {
+        Nova novaClient;
+        try {
+            novaClient = getNovaClient(cloudSiteId, tenantId);
+            OpenStackRequest<Void> request = novaClient.servers().detachVolume(serverId, volumeId);
+            executeAndRecordOpenstackRequest(request, false);
+        } catch (MsoException e) {
+            logger.error("Error building Nova Client", e);
+            throw new NovaClientException("Error building Nova Client", e);
+        }
+    }
+
+    public Hypervisors getHypervisorDetails(String cloudSiteId, String tenantId) throws NovaClientException {
+        Nova novaClient;
+        try {
+            novaClient = getNovaClient(cloudSiteId, tenantId);
+            OpenStackRequest<Hypervisors> request = novaClient.hypervisors().listDetail();
+            return executeAndRecordOpenstackRequest(request, false);
+        } catch (MsoException e) {
+            logger.error("Error building Nova Client", e);
+            throw new NovaClientException("Error building Nova Client", e);
+        }
+    }
+
 }
diff --git a/adapters/mso-catalog-db-adapter/src/main/resources/db/migration/V7.5__AddServiceArtifact.sql b/adapters/mso-catalog-db-adapter/src/main/resources/db/migration/V7.5__AddServiceArtifact.sql
new file mode 100644
index 0000000..d32c466
--- /dev/null
+++ b/adapters/mso-catalog-db-adapter/src/main/resources/db/migration/V7.5__AddServiceArtifact.sql
@@ -0,0 +1,30 @@
+use catalogdb;
+
+CREATE TABLE IF NOT EXISTS `service_info` (
+  `ID` int (11) AUTO_INCREMENT,
+  `SERVICE_INPUT` varchar (5000),
+  `SERVICE_PROPERTIES` varchar (5000),
+  PRIMARY KEY (`ID`)
+)ENGINE=InnoDB DEFAULT CHARSET=latin1;
+
+CREATE TABLE IF NOT EXISTS `service_artifact`(
+  `ARTIFACT_UUID` varchar (200) NOT NULL,
+  `TYPE` varchar (200) NOT NULL,
+  `NAME` varchar (200) NOT NULL,
+  `VERSION` varchar (200) NOT NULL,
+  `DESCRIPTION` varchar (200) DEFAULT NULL,
+  `CONTENT` LONGTEXT DEFAULT NULL,
+  `CHECKSUM` varchar (200) DEFAULT NULL,
+  `CREATION_TIMESTAMP` DATETIME DEFAULT CURRENT_TIMESTAMP,
+  `SERVICE_MODEL_UUID` varchar (200) NOT NULL,
+  PRIMARY KEY (`ARTIFACT_UUID`),
+  CONSTRAINT `fk_service_artifact_service_info1` FOREIGN KEY (`SERVICE_MODEL_UUID`) REFERENCES `service` (`MODEL_UUID`) ON DELETE CASCADE ON UPDATE CASCADE
+)ENGINE=InnoDB DEFAULT CHARSET=latin1;
+
+CREATE TABLE IF NOT EXISTS `service_to_service_info` (
+  `SERVICE_MODEL_UUID` varchar (200) NOT NULL,
+  `SERVICE_INFO_ID` INT (11) NOT NULL,
+  PRIMARY KEY (`SERVICE_MODEL_UUID`,`SERVICE_INFO_ID`),
+  CONSTRAINT `fk_service_to_service_info__service1` FOREIGN KEY (`SERVICE_MODEL_UUID`) REFERENCES `service` (`MODEL_UUID`) ON DELETE CASCADE ON UPDATE CASCADE,
+  CONSTRAINT `fk_service_to_service_info__service_info1` FOREIGN KEY (`SERVICE_INFO_ID`) REFERENCES `service_info` (`ID`) ON DELETE CASCADE ON UPDATE CASCADE
+)
\ No newline at end of file
diff --git a/adapters/mso-nssmf-adapter/pom.xml b/adapters/mso-nssmf-adapter/pom.xml
new file mode 100644
index 0000000..b6b52ce
--- /dev/null
+++ b/adapters/mso-nssmf-adapter/pom.xml
@@ -0,0 +1,149 @@
+<!--
+  ~*
+  ~============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=========================================================
+  ~*/
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.onap.so</groupId>
+    <artifactId>adapters</artifactId>
+    <version>1.6.0-SNAPSHOT</version>
+  </parent>
+  <artifactId>mso-nssmf-adapter</artifactId>
+  <packaging>jar</packaging>
+  <name>mso-nssmf-adapter</name>
+  <description>Web service endpoint for nssmf operations</description>
+  <dependencyManagement>
+    <dependencies>
+      <dependency>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-dependencies</artifactId>
+        <version>${springboot.version}</version>
+        <type>pom</type>
+        <scope>import</scope>
+      </dependency>
+    </dependencies>
+  </dependencyManagement>
+  <build>
+    <finalName>${project.artifactId}-${project.version}</finalName>
+    <plugins>
+      <plugin>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-maven-plugin</artifactId>
+        <configuration>
+          <mainClass>org.onap.so.adapters.nssmf.MSONssmfApplication</mainClass>
+        </configuration>
+        <executions>
+          <execution>
+            <goals>
+              <goal>repackage</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.jacoco</groupId>
+        <artifactId>jacoco-maven-plugin</artifactId>
+      </plugin>
+    </plugins>
+  </build>
+  <dependencies>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-actuator</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-web</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-jdbc</artifactId>
+      <exclusions>
+        <exclusion>
+          <groupId>org.apache.tomcat</groupId>
+          <artifactId>tomcat-jdbc</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.cxf</groupId>
+      <artifactId>cxf-spring-boot-starter-jaxws</artifactId>
+      <version>${cxf.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.cxf</groupId>
+      <artifactId>cxf-spring-boot-starter-jaxrs</artifactId>
+      <version>${cxf.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.cxf</groupId>
+      <artifactId>cxf-rt-rs-service-description-swagger</artifactId>
+      <version>${cxf.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-data-jpa</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-test</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.onap.so</groupId>
+      <artifactId>mso-requests-db</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.onap.so</groupId>
+      <artifactId>mso-requests-db-repositories</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.mariadb.jdbc</groupId>
+      <artifactId>mariadb-java-client</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>ch.vorburger.mariaDB4j</groupId>
+      <artifactId>mariaDB4j</artifactId>
+      <version>2.2.3</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-configuration-processor</artifactId>
+      <optional>true</optional>
+    </dependency>
+    <dependency>
+      <groupId>com.squareup.okhttp3</groupId>
+      <artifactId>okhttp</artifactId>
+      <version>3.14.0</version>
+      <scope>test</scope>
+    </dependency>
+    <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
new file mode 100644
index 0000000..cd011e6
--- /dev/null
+++ b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/MSONssmfApplication.java
@@ -0,0 +1,32 @@
+/*-
+ * ============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;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication(scanBasePackages = {"org.onap.so"})
+public class MSONssmfApplication {
+
+    public static void main(String... args) {
+        SpringApplication.run(MSONssmfApplication.class, args);
+    }
+}
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/RequestDbConfig.java
new file mode 100644
index 0000000..484f762
--- /dev/null
+++ b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/RequestDbConfig.java
@@ -0,0 +1,68 @@
+/*-
+ * ============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;
+
+import javax.persistence.EntityManagerFactory;
+import javax.sql.DataSource;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.boot.jdbc.DataSourceBuilder;
+import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+import org.springframework.context.annotation.Profile;
+import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
+import org.springframework.orm.jpa.JpaTransactionManager;
+import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
+import org.springframework.transaction.PlatformTransactionManager;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+@Profile({"!test"})
+@Configuration
+@EnableTransactionManagement
+@EnableJpaRepositories(entityManagerFactoryRef = "requestEntityManagerFactory",
+        transactionManagerRef = "requestTransactionManager", basePackages = {"org.onap.so.db.request.data.repository"})
+public class RequestDbConfig {
+
+    @Primary
+    @Bean(name = "requestDataSource")
+    @ConfigurationProperties(prefix = "spring.datasource")
+    public DataSource dataSource() {
+        return DataSourceBuilder.create().build();
+    }
+
+    @Primary
+    @Bean(name = "requestEntityManagerFactory")
+    public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder,
+            @Qualifier("requestDataSource") DataSource dataSource) {
+        return builder.dataSource(dataSource).packages("org.onap.so.db.request.beans").persistenceUnit("requestDB")
+                .build();
+    }
+
+    @Primary
+    @Bean(name = "requestTransactionManager")
+    public PlatformTransactionManager transactionManager(
+            @Qualifier("requestEntityManagerFactory") EntityManagerFactory entityManagerFactory) {
+        return new JpaTransactionManager(entityManagerFactory);
+    }
+
+}
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/WebSecurityConfig.java
new file mode 100644
index 0000000..1522ca9
--- /dev/null
+++ b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/WebSecurityConfig.java
@@ -0,0 +1,37 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.adapters.nssmf;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
+
+@EnableWebSecurity
+@Configuration
+public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
+
+    @Override
+    protected void configure(HttpSecurity http) throws Exception {
+        http.csrf().disable();
+    }
+
+}
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
new file mode 100644
index 0000000..f63ba35
--- /dev/null
+++ b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/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.nssmf.exceptions;
+
+import org.onap.so.adapters.nssmf.model.ErrorResponse;
+import org.springframework.http.ResponseEntity;
+import static org.onap.so.adapters.nssmf.util.NssmfAdapterUtil.marshal;
+
+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-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/extclients/aai/AaiClientPropertiesImpl.java b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/extclients/aai/AaiClientPropertiesImpl.java
new file mode 100644
index 0000000..3333c64
--- /dev/null
+++ b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/extclients/aai/AaiClientPropertiesImpl.java
@@ -0,0 +1,69 @@
+/*-
+ * ============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.extclients.aai;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import org.onap.so.client.aai.AAIProperties;
+import org.onap.so.client.aai.AAIVersion;
+import org.onap.so.spring.SpringContextHelper;
+import org.springframework.context.ApplicationContext;
+
+public class AaiClientPropertiesImpl implements AAIProperties {
+
+    private final String endpoint;
+
+    private final String encryptedBasicAuth;
+
+    private final String encrytptionKey;
+
+    public AaiClientPropertiesImpl() {
+        final ApplicationContext context = SpringContextHelper.getAppContext();
+        this.endpoint = context.getEnvironment().getProperty("aai.endpoint");
+        this.encryptedBasicAuth = context.getEnvironment().getProperty("aai.auth");
+        this.encrytptionKey = context.getEnvironment().getProperty("mso.key");
+    }
+
+    @Override
+    public AAIVersion getDefaultVersion() {
+        return AAIVersion.LATEST;
+    }
+
+    @Override
+    public String getAuth() {
+        return encryptedBasicAuth;
+    }
+
+    @Override
+    public String getKey() {
+        return encrytptionKey;
+    }
+
+    @Override
+    public URL getEndpoint() throws MalformedURLException {
+        return new URL(endpoint);
+    }
+
+    @Override
+    public String getSystemName() {
+        return "MSO";
+    }
+}
diff --git a/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/extclients/aai/AaiClientProvider.java b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/extclients/aai/AaiClientProvider.java
new file mode 100644
index 0000000..48e3ef1
--- /dev/null
+++ b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/extclients/aai/AaiClientProvider.java
@@ -0,0 +1,34 @@
+/*-
+ * ============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.extclients.aai;
+
+import org.onap.so.client.aai.AAIResourcesClient;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class AaiClientProvider {
+
+    @Bean
+    public AAIResourcesClient getAaiClient() {
+        return new AAIResourcesClient();
+    }
+}
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
new file mode 100644
index 0000000..c737ba6
--- /dev/null
+++ b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/extclients/aai/AaiServiceProvider.java
@@ -0,0 +1,32 @@
+/*-
+ * ============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.extclients.aai;
+
+import org.onap.aai.domain.yang.EsrSystemInfoList;
+import org.onap.aai.domain.yang.EsrThirdpartySdncList;
+
+public interface AaiServiceProvider {
+
+    EsrThirdpartySdncList invokeGetThirdPartySdncList();
+
+    EsrSystemInfoList invokeGetThirdPartySdncEsrSystemInfo(String sdncId);
+
+}
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
new file mode 100644
index 0000000..f8422e2
--- /dev/null
+++ b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/extclients/aai/AaiServiceProviderImpl.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.nssmf.extclients.aai;
+
+
+import org.onap.aai.domain.yang.EsrSystemInfoList;
+import org.onap.aai.domain.yang.EsrThirdpartySdncList;
+import org.onap.so.client.aai.AAIObjectType;
+import org.onap.so.client.aai.entities.uri.AAIUriFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class AaiServiceProviderImpl implements AaiServiceProvider {
+
+    private static final Logger logger = LoggerFactory.getLogger(AaiServiceProviderImpl.class);
+
+    private final AaiClientProvider aaiClientProvider;
+
+    @Autowired
+    public AaiServiceProviderImpl(final AaiClientProvider aaiClientProvider) {
+        this.aaiClientProvider = aaiClientProvider;
+    }
+
+    @Override
+    public EsrThirdpartySdncList invokeGetThirdPartySdncList() {
+        return aaiClientProvider.getAaiClient()
+                .get(EsrThirdpartySdncList.class, AAIUriFactory.createResourceUri(AAIObjectType.THIRDPARTY_SDNC_LIST))
+                .orElseGet(() -> {
+                    logger.debug("No VNFMs in AAI");
+                    return null;
+                });
+    }
+
+    @Override
+    public EsrSystemInfoList invokeGetThirdPartySdncEsrSystemInfo(String sdncId) {
+        return aaiClientProvider.getAaiClient()
+                .get(EsrSystemInfoList.class,
+                        AAIUriFactory.createResourceUri(AAIObjectType.THIRDPARTY_SDNC_SYSTEM_INFO_LIST, sdncId))
+                .orElseGet(() -> {
+                    logger.debug("VNFM not found in AAI");
+                    return null;
+                });
+    }
+
+}
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/model/ErrorResponse.java
new file mode 100644
index 0000000..188349c
--- /dev/null
+++ b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/model/ErrorResponse.java
@@ -0,0 +1,63 @@
+/*-
+ * ============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.model;
+
+public class ErrorResponse {
+
+    private int status;
+
+    private String error;
+
+    private String message;
+
+    public ErrorResponse(int status, String message) {
+        this.status = status;
+        this.message = message;
+        this.error = "Bad Request";
+    }
+
+    public int getStatus() {
+        return status;
+    }
+
+    public void setStatus(int status) {
+        this.status = status;
+    }
+
+    public String getError() {
+        if (status == 500) {
+            this.error = "Internal Server Error";
+        }
+        return error;
+    }
+
+    public void setError(String error) {
+        this.error = error;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+}
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/model/TokenRequest.java
new file mode 100644
index 0000000..3590c68
--- /dev/null
+++ b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/model/TokenRequest.java
@@ -0,0 +1,54 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.adapters.nssmf.model;
+
+public class TokenRequest {
+
+    private String grantType;
+
+    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/model/TokenResponse.java
new file mode 100644
index 0000000..8007075
--- /dev/null
+++ b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/model/TokenResponse.java
@@ -0,0 +1,44 @@
+/*-
+ * ============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.model;
+
+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/rest/HttpMethod.java b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/rest/HttpMethod.java
new file mode 100644
index 0000000..f6abd98
--- /dev/null
+++ b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/rest/HttpMethod.java
@@ -0,0 +1,41 @@
+/*-
+ * ============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 enum HttpMethod {
+    GET, POST, PUT, DELETE, PATCH;
+
+    public static HttpMethod fromString(String s) {
+        if (s == null)
+            return null;
+        if (("get").equalsIgnoreCase(s))
+            return GET;
+        if (("post").equalsIgnoreCase(s))
+            return POST;
+        if (("put").equalsIgnoreCase(s))
+            return PUT;
+        if (("delete").equalsIgnoreCase(s))
+            return DELETE;
+        if (("patch").equalsIgnoreCase(s))
+            return PATCH;
+        throw new IllegalArgumentException("Invalid value for HTTP Method: " + s);
+    }
+}
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/rest/JobStatus.java
new file mode 100644
index 0000000..f2e651f
--- /dev/null
+++ b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/rest/JobStatus.java
@@ -0,0 +1,42 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.adapters.nssmf.rest;
+
+import org.onap.so.adapters.nssmf.exceptions.ApplicationException;
+
+
+public enum JobStatus {
+    STARTED, PROCESSING, FINISHED, ERROR;
+
+    public static JobStatus fromString(String s) throws ApplicationException {
+        if (s == null)
+            return null;
+        if (("started").equalsIgnoreCase(s))
+            return STARTED;
+        if (("processing").equalsIgnoreCase(s))
+            return PROCESSING;
+        if (("finished").equalsIgnoreCase(s))
+            return FINISHED;
+        if (("error").equalsIgnoreCase(s))
+            return ERROR;
+        throw new ApplicationException(500, "Invalid value for Job " + "Status: " + s);
+    }
+}
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
new file mode 100644
index 0000000..d8e1e36
--- /dev/null
+++ b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/rest/NssmfAdapterRest.java
@@ -0,0 +1,205 @@
+/*-
+ * ============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;
+
+import org.onap.so.adapters.nssmf.exceptions.ApplicationException;
+import org.onap.so.beans.nsmf.JobStatusRequest;
+import org.onap.so.beans.nsmf.NssiActDeActRequest;
+import org.onap.so.beans.nsmf.NssiAllocateRequest;
+import org.onap.so.beans.nsmf.NssiCreateRequest;
+import org.onap.so.beans.nsmf.NssiDeAllocateRequest;
+import org.onap.so.beans.nsmf.NssiTerminateRequest;
+import org.onap.so.beans.nsmf.NssiUpdateRequest;
+import org.onap.so.beans.nsmf.NssiUpdateRequestById;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
+import static org.onap.so.adapters.nssmf.util.NssmfAdapterUtil.assertObjectNotNull;
+
+@Controller
+@RequestMapping(value = "/api/rest/provMns/v1", produces = {APPLICATION_JSON}, consumes = {APPLICATION_JSON})
+public class NssmfAdapterRest {
+
+    private static final Logger logger = LoggerFactory.getLogger(NssmfAdapterRest.class);
+
+    @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) {
+        try {
+            logger.info("Nssmf create request is invoked");
+            assertObjectNotNull(create);
+            RestResponse rsp = getNssmfMgr().createNssi(create);
+            return buildResponse(rsp);
+        } catch (ApplicationException e) {
+            return e.buildErrorResponse();
+        }
+    }
+
+    @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) {
+        try {
+            logger.info("Nssmf terminate request is invoked");
+            assertObjectNotNull(terminate);
+            RestResponse rsp = getNssmfMgr().terminateNssi(terminate, nssiId);
+            return buildResponse(rsp);
+        } catch (ApplicationException e) {
+            return e.buildErrorResponse();
+        }
+    }
+
+    @PutMapping(value = "/NSS/SliceProfiles/{sliceProfileId}")
+    public ResponseEntity modifyNssi(@RequestBody NssiUpdateRequest update,
+            @PathVariable("sliceProfileId") String sliceId) {
+        try {
+            logger.info("Nssmf modify request is invoked");
+            assertObjectNotNull(update);
+            RestResponse rsp = getNssmfMgr().updateNssi(update, sliceId);
+            return buildResponse(rsp);
+        } catch (ApplicationException e) {
+            return e.buildErrorResponse();
+        }
+    }
+
+    @PutMapping(value = "/NSS/nssi/{nssiId}")
+    public ResponseEntity modifyNssiById(@RequestBody NssiUpdateRequestById updateById,
+            @PathVariable("nssiId") String nssiId) {
+        try {
+            logger.info("Nssmf modify by ID request is invoked");
+            assertObjectNotNull(updateById);
+            RestResponse rsp = getNssmfMgr().updateNssiById(updateById, nssiId);
+            return buildResponse(rsp);
+        } catch (ApplicationException e) {
+            return e.buildErrorResponse();
+        }
+    }
+
+    @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,
+            @PathVariable("networktype") String networkType, @PathVariable("sliceProfileId") String sliceId) {
+        try {
+            logger.info("Nssmf query nssi request is invoked");
+            RestResponse rsp = getNssmfMgr().queryNssi(vendorName, networkType, sliceId);
+            return buildResponse(rsp);
+        } catch (ApplicationException e) {
+            return e.buildErrorResponse();
+        }
+    }
+
+    @GetMapping(value = "/vendor/{vendorName}/type/{networkType}/NSS/nssi" + "/{nssiId}")
+    public ResponseEntity queryNssiById(@PathVariable("vendorName") String vendorName,
+            @PathVariable("networkTtype") String networkType, @PathVariable("nssiId") String nssiId) {
+        try {
+            logger.info("Nssmf query nssi by ID request is invoked");
+            RestResponse rsp = getNssmfMgr().queryNssiById(vendorName, networkType, nssiId);
+            return buildResponse(rsp);
+        } catch (ApplicationException e) {
+            return e.buildErrorResponse();
+        }
+    }
+
+    public void setNssmfMgr(NssmfManager nssmfMgr) {
+        this.nssmfMgr = nssmfMgr;
+    }
+
+    public NssmfManager getNssmfMgr() {
+        return nssmfMgr;
+    }
+
+    private ResponseEntity buildResponse(RestResponse rsp) {
+        return ResponseEntity.status(rsp.getStatus()).body(rsp.getResponseContent());
+    }
+}
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
new file mode 100644
index 0000000..6306643
--- /dev/null
+++ b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/rest/NssmfInfo.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.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
new file mode 100644
index 0000000..0e25729
--- /dev/null
+++ b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/rest/NssmfManager.java
@@ -0,0 +1,541 @@
+/*-
+ * ============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;
+
+import org.onap.so.adapters.nssmf.exceptions.ApplicationException;
+import org.onap.so.beans.nsmf.ActDeActNssi;
+import org.onap.so.beans.nsmf.AllocateAnNssi;
+import org.onap.so.beans.nsmf.AllocateCnNssi;
+import org.onap.so.beans.nsmf.AllocateTnNssi;
+import org.onap.so.beans.nsmf.CreateCnNssi;
+import org.onap.so.beans.nsmf.DeAllocateNssi;
+import org.onap.so.beans.nsmf.EsrInfo;
+import org.onap.so.beans.nsmf.JobStatusRequest;
+import org.onap.so.beans.nsmf.JobStatusResponse;
+import org.onap.so.beans.nsmf.NetworkType;
+import org.onap.so.beans.nsmf.NssiActDeActRequest;
+import org.onap.so.beans.nsmf.NssiAllocateRequest;
+import org.onap.so.beans.nsmf.NssiCreateRequest;
+import org.onap.so.beans.nsmf.NssiDeAllocateRequest;
+import org.onap.so.beans.nsmf.NssiResponse;
+import org.onap.so.beans.nsmf.NssiTerminateRequest;
+import org.onap.so.beans.nsmf.NssiUpdateRequest;
+import org.onap.so.beans.nsmf.NssiUpdateRequestById;
+import org.onap.so.beans.nsmf.ResponseDescriptor;
+import org.onap.so.beans.nsmf.TerminateNssi;
+import org.onap.so.beans.nsmf.UpdateCnNssi;
+import org.onap.so.beans.nsmf.UpdateCnNssiById;
+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.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Primary;
+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.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;
+import static org.onap.so.adapters.nssmf.util.NssmfAdapterUtil.StatusDesc.DEACTIVATE_NSS_SUCCESS;
+import static org.onap.so.adapters.nssmf.util.NssmfAdapterUtil.StatusDesc.DEALLOCATE_NSS_SUCCESS;
+import static org.onap.so.adapters.nssmf.util.NssmfAdapterUtil.StatusDesc.QUERY_JOB_STATUS_FAILED;
+import static org.onap.so.adapters.nssmf.util.NssmfAdapterUtil.StatusDesc.QUERY_JOB_STATUS_SUCCESS;
+import static org.onap.so.adapters.nssmf.util.NssmfAdapterUtil.assertObjectNotNull;
+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.ActDeActNssi.ACT_URL;
+import static org.onap.so.beans.nsmf.ActDeActNssi.DE_ACT_URL;
+
+@Component
+@Primary
+public class NssmfManager {
+
+    private static final Logger logger = LoggerFactory.getLogger(NssmfManager.class);
+
+    public final static String QUERY = "/api/rest/provMns/v1/NSS" + "/SliceProfiles/{sliceProfileId}";
+
+    public final static String QUERY_BY_ID = "/api/rest/provMns/v1/NSS/nssi" + "/{nssiId}";
+
+    @Autowired
+    private ResourceOperationStatusRepository rscOperStatusRepo;
+
+    @Autowired
+    private RestUtil restUtil;
+
+
+    public RestResponse allocateNssi(NssiAllocateRequest nssmiAllocate) throws ApplicationException {
+
+        assertObjectNotNull(nssmiAllocate.getEsrInfo());
+        assertObjectNotNull(nssmiAllocate.getEsrInfo().getNetworkType());
+        assertObjectNotNull(nssmiAllocate.getEsrInfo().getVendor());
+
+        String nsiId = null;
+        String allocateReq = null;
+        String allocateUrl = null;
+        logger.info("Allocate Nssi for " + nssmiAllocate.getEsrInfo().getNetworkType() + " Network has begun");
+
+        switch (nssmiAllocate.getEsrInfo().getNetworkType()) {
+
+            case CORE:
+                AllocateCnNssi cn = nssmiAllocate.getAllocateCnNssi();
+                assertObjectNotNull(cn);
+                assertObjectNotNull(cn.getNsiInfo());
+                assertObjectNotNull(cn.getNsiInfo().getNsiId());
+                nsiId = cn.getNsiInfo().getNsiId();
+                assertObjectNotNull(nsiId);
+                allocateReq = marshal(cn);
+                allocateUrl = AllocateCnNssi.URL;
+                break;
+
+            case ACCESS:
+                AllocateAnNssi an = nssmiAllocate.getAllocateAnNssi();
+                assertObjectNotNull(an);
+                assertObjectNotNull(an.getNsiInfo());
+                assertObjectNotNull(an.getNsiInfo().getNsiId());
+                nsiId = an.getNsiInfo().getNsiId();
+                assertObjectNotNull(nsiId);
+                allocateReq = marshal(an);
+                allocateUrl = AllocateAnNssi.URL;
+                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;
+
+        }
+        RestResponse rsp = restUtil.sendRequest(allocateUrl, POST, allocateReq, nssmiAllocate.getEsrInfo());
+        assertObjectNotNull(rsp);
+
+        if (valueOf(rsp.getStatus()).startsWith("2")) {
+            NssiResponse allocateRes = unMarshal(rsp.getResponseContent(), NssiResponse.class);
+
+            ResourceOperationStatus status =
+                    new ResourceOperationStatus(allocateRes.getNssiId(), allocateRes.getJobId(), nsiId);
+            logger.info("save segment and operaton info -> begin");
+            updateDbStatus(status, rsp.getStatus(), STARTED, ALLOCATE_NSS_SUCCESS);
+            logger.info("save segment and operation info -> end");
+        }
+        return rsp;
+    }
+
+    public RestResponse createNssi(NssiCreateRequest nssiCreate) throws ApplicationException {
+
+        assertObjectNotNull(nssiCreate.getEsrInfo());
+        assertObjectNotNull(nssiCreate.getEsrInfo().getNetworkType());
+        assertObjectNotNull(nssiCreate.getEsrInfo().getVendor());
+
+        String nsiId = null;
+        String createReq = null;
+        String createUrl = null;
+        logger.info("Create Nssi for " + nssiCreate.getEsrInfo().getNetworkType() + " Network has begun");
+
+        switch (nssiCreate.getEsrInfo().getNetworkType()) {
+            case CORE:
+                CreateCnNssi cn = nssiCreate.getCreateCnNssi();
+                nsiId = cn.getNsiInfo().getNsiId();
+                assertObjectNotNull(nsiId);
+                createReq = marshal(cn);
+                createUrl = AllocateCnNssi.URL;
+                break;
+
+            case ACCESS:
+            case TRANSPORT:
+                throw new ApplicationException(1, "Create Nssi doesn't " + "support the Network type:"
+                        + nssiCreate.getEsrInfo().getNetworkType());
+        }
+        RestResponse rsp = restUtil.sendRequest(createUrl, POST, createReq, nssiCreate.getEsrInfo());
+        assertObjectNotNull(rsp);
+
+        if (valueOf(rsp.getStatus()).startsWith("2")) {
+            NssiResponse allocateRes = unMarshal(rsp.getResponseContent(), NssiResponse.class);
+
+            ResourceOperationStatus status =
+                    new ResourceOperationStatus(allocateRes.getNssiId(), allocateRes.getJobId(), nsiId);
+            logger.info("save segment and operaton info -> begin");
+            updateDbStatus(status, rsp.getStatus(), STARTED, CREATE_NSS_SUCCESS);
+            logger.info("save segment and operaton info -> end");
+        }
+        return rsp;
+    }
+
+    public RestResponse deAllocateNssi(NssiDeAllocateRequest nssiDeallocate, String sliceId)
+            throws ApplicationException {
+
+        assertObjectNotNull(nssiDeallocate.getEsrInfo());
+        assertObjectNotNull(nssiDeallocate.getEsrInfo().getNetworkType());
+        assertObjectNotNull(nssiDeallocate.getEsrInfo().getVendor());
+
+        DeAllocateNssi deAllocate = nssiDeallocate.getDeAllocateNssi();
+
+        assertObjectNotNull(sliceId);
+        assertObjectNotNull(deAllocate.getNssiId());
+        assertObjectNotNull(deAllocate.getNsiId());
+
+        String deallocateUrl = formTnAndAnUrl(nssiDeallocate.getEsrInfo(), DeAllocateNssi.URL, sliceId);
+        String deAllocateReq = marshal(deAllocate);
+
+        logger.info("Deallocate Nssi has begun");
+
+        RestResponse rsp = restUtil.sendRequest(deallocateUrl, DELETE, deAllocateReq, nssiDeallocate.getEsrInfo());
+        assertObjectNotNull(rsp);
+
+        if (valueOf(rsp.getStatus()).startsWith("2")) {
+            NssiResponse res = unMarshal(rsp.getResponseContent(), NssiResponse.class);
+
+            ResourceOperationStatus status =
+                    new ResourceOperationStatus(deAllocate.getNssiId(), res.getJobId(), deAllocate.getNsiId());
+            logger.info("save segment and operaton info -> begin");
+            updateDbStatus(status, rsp.getStatus(), STARTED, DEALLOCATE_NSS_SUCCESS);
+            logger.info("save segment and operaton info -> end");
+        }
+        return rsp;
+    }
+
+    private String formTnAndAnUrl(EsrInfo esrInfo, String origUrl, String variable) {
+
+        origUrl = formatUrl(origUrl, variable);
+        String[] val;
+
+        switch (esrInfo.getNetworkType()) {
+
+            case TRANSPORT:
+                val = origUrl.split("v1");
+                return val[0] + "v1/tn" + val[1];
+
+            case ACCESS:
+                val = origUrl.split("v1");
+                return val[0] + "v1/an" + val[1];
+
+            case CORE:
+                return origUrl;
+        }
+        return origUrl;
+    }
+
+    private String formatUrl(String origUrl, String variable) {
+
+        if (variable != null) {
+            origUrl = String.format(origUrl, variable);
+        }
+        return origUrl;
+    }
+
+
+    public RestResponse terminateNssi(NssiTerminateRequest nssiTerminate, String nssiId) throws ApplicationException {
+
+        assertObjectNotNull(nssiTerminate.getEsrInfo());
+        assertObjectNotNull(nssiTerminate.getEsrInfo().getNetworkType());
+        assertObjectNotNull(nssiTerminate.getEsrInfo().getVendor());
+
+        TerminateNssi terminate = nssiTerminate.getTerminateNssi();
+
+        assertObjectNotNull(nssiId);
+        assertObjectNotNull(terminate.getNsiId());
+
+        logger.info("Terminate Nssi has begun");
+
+        String terminateUrl = formTnAndAnUrl(nssiTerminate.getEsrInfo(), TerminateNssi.URL, nssiId);
+        String terminateReq = marshal(terminate);
+
+        RestResponse rsp = restUtil.sendRequest(terminateUrl, DELETE, terminateReq, nssiTerminate.getEsrInfo());
+        assertObjectNotNull(rsp);
+
+        if (valueOf(rsp.getStatus()).startsWith("2")) {
+            NssiResponse res = unMarshal(rsp.getResponseContent(), NssiResponse.class);
+
+            ResourceOperationStatus status = new ResourceOperationStatus(nssiId, res.getJobId(), terminate.getNsiId());
+            logger.info("save segment and operaton info -> begin");
+            updateDbStatus(status, rsp.getStatus(), STARTED, DEALLOCATE_NSS_SUCCESS);
+            logger.info("save segment and operaton info -> end");
+        }
+        return rsp;
+    }
+
+    public RestResponse activateNssi(NssiActDeActRequest nssiActivate, String snssai) throws ApplicationException {
+
+        assertObjectNotNull(nssiActivate.getEsrInfo());
+        assertObjectNotNull(nssiActivate.getEsrInfo().getNetworkType());
+        assertObjectNotNull(nssiActivate.getEsrInfo().getVendor());
+
+        ActDeActNssi activate = nssiActivate.getActDeActNssi();
+
+        assertObjectNotNull(snssai);
+        assertObjectNotNull(activate.getNssiId());
+        assertObjectNotNull(activate.getNsiId());
+
+        logger.info("Activate Nssi has begun");
+
+        String activateUrl = formTnAndAnUrl(nssiActivate.getEsrInfo(), ACT_URL, snssai);
+        String activateReq = marshal(activate);
+
+        RestResponse rsp = restUtil.sendRequest(activateUrl, PUT, activateReq, nssiActivate.getEsrInfo());
+        assertObjectNotNull(rsp);
+
+        if (valueOf(rsp.getStatus()).startsWith("2")) {
+            NssiResponse activateRes = unMarshal(rsp.getResponseContent(), NssiResponse.class);
+
+            ResourceOperationStatus status =
+                    new ResourceOperationStatus(activate.getNssiId(), activateRes.getJobId(), activate.getNsiId());
+            logger.info("save segment and operaton info -> begin");
+            updateDbStatus(status, rsp.getStatus(), STARTED, ACTIVATE_NSS_SUCCESS);
+            logger.info("save segment and operaton info -> end");
+        }
+        return rsp;
+    }
+
+    public RestResponse deActivateNssi(NssiActDeActRequest nssiDeActivate, String snssai) throws ApplicationException {
+
+        assertObjectNotNull(nssiDeActivate.getEsrInfo());
+        assertObjectNotNull(nssiDeActivate.getEsrInfo().getNetworkType());
+        assertObjectNotNull(nssiDeActivate.getEsrInfo().getVendor());
+
+        logger.info("Deactivate Nssi has begun");
+
+        ActDeActNssi deActivate = nssiDeActivate.getActDeActNssi();
+
+        assertObjectNotNull(snssai);
+        assertObjectNotNull(deActivate.getNssiId());
+        assertObjectNotNull(deActivate.getNsiId());
+
+        String deActivateUrl = formTnAndAnUrl(nssiDeActivate.getEsrInfo(), DE_ACT_URL, snssai);
+        String deActivateReq = marshal(deActivate);
+
+        RestResponse rsp = restUtil.sendRequest(deActivateUrl, PUT, deActivateReq, nssiDeActivate.getEsrInfo());
+        assertObjectNotNull(rsp);
+
+        if (valueOf(rsp.getStatus()).startsWith("2")) {
+            NssiResponse deActivateRes = unMarshal(rsp.getResponseContent(), NssiResponse.class);
+
+            ResourceOperationStatus status = new ResourceOperationStatus(deActivate.getNssiId(),
+                    deActivateRes.getJobId(), deActivate.getNsiId());
+            logger.info("save segment and operaton info -> begin");
+            updateDbStatus(status, rsp.getStatus(), STARTED, DEACTIVATE_NSS_SUCCESS);
+            logger.info("save segment and operaton info -> end");
+        }
+        return rsp;
+    }
+
+    public RestResponse queryJobStatus(JobStatusRequest jobReq, String jobId) throws ApplicationException {
+
+        assertObjectNotNull(jobReq.getEsrInfo());
+        assertObjectNotNull(jobReq.getEsrInfo().getNetworkType());
+        assertObjectNotNull(jobReq.getEsrInfo().getVendor());
+        assertObjectNotNull(jobId);
+        assertObjectNotNull(jobReq.getNssiId());
+        assertObjectNotNull(jobReq.getNsiId());
+
+        logger.info("Query job status has begun");
+
+        ResourceOperationStatus status = new ResourceOperationStatus(jobReq.getNssiId(), jobId, jobReq.getNsiId());
+        status = rscOperStatusRepo.findOne(Example.of(status))
+                .orElseThrow(() -> new ApplicationException(404, "Cannot Find Operation Status"));
+
+        String statusUrl = formatUrl(JobStatusRequest.URL, jobId);
+        if (jobReq.getResponseId() != null) {
+            statusUrl = statusUrl + "?responseId=" + jobReq.getResponseId();
+        }
+
+        RestResponse rsp = restUtil.sendRequest(statusUrl, GET, "", jobReq.getEsrInfo());
+        assertObjectNotNull(rsp);
+
+        if (!valueOf(rsp.getStatus()).startsWith("2")) {
+            updateDbStatus(status, rsp.getStatus(), ERROR, QUERY_JOB_STATUS_FAILED);
+            throw new ApplicationException(500, QUERY_JOB_STATUS_FAILED);
+        }
+
+        ResponseDescriptor rspDesc =
+                unMarshal(rsp.getResponseContent(), JobStatusResponse.class).getResponseDescriptor();
+        logger.info("save segment and operaton info -> begin");
+        updateRequestDbJobStatus(rspDesc, status, rsp);
+        logger.info("save segment and operaton info -> end");
+        return rsp;
+    }
+
+
+    public RestResponse updateNssi(NssiUpdateRequest nssiUpdate, String sliceId) throws ApplicationException {
+
+        assertObjectNotNull(nssiUpdate.getEsrInfo());
+        assertObjectNotNull(nssiUpdate.getEsrInfo().getNetworkType());
+        assertObjectNotNull(nssiUpdate.getEsrInfo().getVendor());
+        assertObjectNotNull(sliceId);
+
+        String nsiId = null;
+        String nssiId = null;
+        String updateReq = null;
+        String updateUrl = null;
+        logger.info("Update Nssi for " + nssiUpdate.getEsrInfo().getNetworkType() + " Network has begun");
+
+        switch (nssiUpdate.getEsrInfo().getNetworkType()) {
+            case CORE:
+                UpdateCnNssi cn = nssiUpdate.getUpdateCnNssi();
+                nsiId = cn.getNsiInfo().getNsiId();
+                nssiId = cn.getNssiId();
+                assertObjectNotNull(nsiId);
+                assertObjectNotNull(nssiId);
+                updateReq = marshal(cn);
+                updateUrl = formatUrl(UpdateCnNssi.URL, sliceId);
+                break;
+
+            case ACCESS:
+            case TRANSPORT:
+                throw new ApplicationException(1, "Update Nssi doesn't " + "support the Network type:"
+                        + nssiUpdate.getEsrInfo().getNetworkType());
+        }
+
+        RestResponse rsp = restUtil.sendRequest(updateUrl, PUT, updateReq, nssiUpdate.getEsrInfo());
+        assertObjectNotNull(rsp);
+
+        if (valueOf(rsp.getStatus()).startsWith("2")) {
+            NssiResponse allocateRes = unMarshal(rsp.getResponseContent(), NssiResponse.class);
+
+            ResourceOperationStatus status = new ResourceOperationStatus(nssiId, allocateRes.getJobId(), nsiId);
+            logger.info("save segment and operaton info -> begin");
+            updateDbStatus(status, rsp.getStatus(), STARTED, ALLOCATE_NSS_SUCCESS);
+            logger.info("save segment and operaton info -> end");
+        }
+        return rsp;
+    }
+
+    public RestResponse updateNssiById(NssiUpdateRequestById nssiUpdateById, String nssiId)
+            throws ApplicationException {
+
+        assertObjectNotNull(nssiUpdateById.getEsrInfo());
+        assertObjectNotNull(nssiUpdateById.getEsrInfo().getNetworkType());
+        assertObjectNotNull(nssiUpdateById.getEsrInfo().getVendor());
+        assertObjectNotNull(nssiId);
+
+        String nsiId = null;
+        String updateReq = null;
+        String updateUrl = null;
+        logger.info("Update Nssi by ID for " + nssiUpdateById.getEsrInfo().getNetworkType() + " Network has begun");
+
+        switch (nssiUpdateById.getEsrInfo().getNetworkType()) {
+            case CORE:
+                UpdateCnNssiById cn = nssiUpdateById.getUpdateCnNssiById();
+                nsiId = cn.getNsiInfo().getNsiId();
+                assertObjectNotNull(nsiId);
+                updateReq = marshal(cn);
+                updateUrl = formatUrl(UpdateCnNssiById.URL, nssiId);
+                break;
+
+            case ACCESS:
+            case TRANSPORT:
+                throw new ApplicationException(1, "Update Nssi doesn't " + "support the Network type:"
+                        + nssiUpdateById.getEsrInfo().getNetworkType());
+        }
+
+        RestResponse rsp = restUtil.sendRequest(updateUrl, PUT, updateReq, nssiUpdateById.getEsrInfo());
+        assertObjectNotNull(rsp);
+
+        if (valueOf(rsp.getStatus()).startsWith("2")) {
+            NssiResponse allocateRes = unMarshal(rsp.getResponseContent(), NssiResponse.class);
+
+            ResourceOperationStatus status = new ResourceOperationStatus(nssiId, allocateRes.getJobId(), nsiId);
+            logger.info("save segment and operaton info -> begin");
+            updateDbStatus(status, rsp.getStatus(), STARTED, ALLOCATE_NSS_SUCCESS);
+            logger.info("save segment and operaton info -> end");
+        }
+        return rsp;
+    }
+
+    public RestResponse queryNssi(String vendor, String type, String sliceId) throws ApplicationException {
+
+        logger.info("Query Nssi has begun");
+        String getUrl = formatUrl(QUERY, sliceId);
+        EsrInfo esr = new EsrInfo();
+        esr.setVendor(vendor);
+        esr.setNetworkType(NetworkType.valueOf(type));
+        RestResponse rsp = restUtil.sendRequest(getUrl, GET, "", esr);
+        assertObjectNotNull(rsp);
+        return rsp;
+    }
+
+    public RestResponse queryNssiById(String vendor, String type, String nssiId) throws ApplicationException {
+
+        logger.info("Query Nssi by ID has begun");
+        String getUrl = formatUrl(QUERY_BY_ID, nssiId);
+        EsrInfo esr = new EsrInfo();
+        esr.setVendor(vendor);
+        esr.setNetworkType(NetworkType.valueOf(type));
+        RestResponse rsp = restUtil.sendRequest(getUrl, GET, "", esr);
+        assertObjectNotNull(rsp);
+        return rsp;
+    }
+
+    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 ERROR:
+                updateDbStatus(status, rsp.getStatus(), ERROR, QUERY_JOB_STATUS_FAILED);
+                throw new ApplicationException(500, QUERY_JOB_STATUS_FAILED);
+
+            case FINISHED:
+                if (rspDesc.getProgress() == 100) {
+                    updateDbStatus(status, rsp.getStatus(), FINISHED, QUERY_JOB_STATUS_SUCCESS);
+                }
+                break;
+
+            case PROCESSING:
+                updateDbStatus(status, rsp.getStatus(), PROCESSING, QUERY_JOB_STATUS_SUCCESS);
+                break;
+        }
+    }
+
+    private 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");
+        rscOperStatusRepo.save(status);
+        logger.info("Updating successful");
+    }
+
+    public void setRscOperStatusRepo(ResourceOperationStatusRepository rscOperStatusRepo) {
+        this.rscOperStatusRepo = rscOperStatusRepo;
+    }
+
+    public void setRestUtil(RestUtil restUtil) {
+        this.restUtil = restUtil;
+    }
+}
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/rest/RestResponse.java
new file mode 100644
index 0000000..cc047e4
--- /dev/null
+++ b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/rest/RestResponse.java
@@ -0,0 +1,92 @@
+/*-
+ * ============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;
+
+import java.util.Map;
+
+public class RestResponse {
+
+    // the response content
+    private String responseContent;
+
+    // the response status
+    private int status;
+
+    // the response header
+    private Map<String, String> respHeaderMap;
+
+    public RestResponse() {
+        this.status = -1;
+
+        this.respHeaderMap = null;
+    }
+
+    public int getStatus() {
+        return this.status;
+    }
+
+    public void setStatus(int status) {
+        this.status = status;
+    }
+
+    public Map<String, String> getRespHeaderMap() {
+        return this.respHeaderMap;
+    }
+
+    public void setRespHeaderMap(Map<String, String> header) {
+        this.respHeaderMap = header;
+    }
+
+    public int getRespHeaderInt(String key) {
+        if (this.respHeaderMap != null) {
+            String result = this.respHeaderMap.get(key);
+            if (result != null) {
+                return Integer.parseInt(result);
+            }
+        }
+        return -1;
+    }
+
+    public long getRespHeaderLong(String key) {
+        if (this.respHeaderMap != null) {
+            String result = this.respHeaderMap.get(key);
+            if (result != null) {
+                return Long.parseLong(result);
+            }
+        }
+        return -1L;
+    }
+
+    public String getRespHeaderStr(String key) {
+        if (this.respHeaderMap != null) {
+            return this.respHeaderMap.get(key);
+        }
+        return null;
+    }
+
+    public String getResponseContent() {
+        return this.responseContent;
+    }
+
+    public void setResponseContent(String responseString) {
+        this.responseContent = responseString;
+    }
+}
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/rest/RestUtil.java
new file mode 100644
index 0000000..3592d4f
--- /dev/null
+++ b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/rest/RestUtil.java
@@ -0,0 +1,307 @@
+/*-
+ * ============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;
+
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.X509TrustManager;
+import javax.ws.rs.core.UriBuilder;
+import java.net.SocketTimeoutException;
+import java.net.URI;
+import org.apache.http.Header;
+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.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.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.beans.nsmf.EsrInfo;
+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.util.NssmfAdapterUtil.BAD_REQUEST;
+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.logger.ErrorCode.AvailabilityError;
+import static org.onap.so.logger.LoggingAnchor.FOUR;
+import static org.onap.so.logger.MessageEnum.RA_NS_EXC;
+
+@Component
+public class RestUtil {
+
+    private static final Logger logger = LoggerFactory.getLogger(RestUtil.class);
+
+    private static final int DEFAULT_TIME_OUT = 60000;
+
+    private static final String NSSMI_ADAPTER = "NSSMI Adapter";
+
+    private static final String TOKEN_URL = "/api/rest/securityManagement/v1" + "/oauth/token";
+
+    @Autowired
+    private AaiServiceProvider aaiSvcProv;
+
+
+    public NssmfInfo getNssmfHost(EsrInfo esrInfo) throws ApplicationException {
+        EsrThirdpartySdncList sdncList = aaiSvcProv.invokeGetThirdPartySdncList();
+        if (sdncList != null && sdncList.getEsrThirdpartySdnc() != null) {
+            for (EsrThirdpartySdnc sdncEsr : sdncList.getEsrThirdpartySdnc()) {
+
+                EsrSystemInfoList sysInfoList =
+                        aaiSvcProv.invokeGetThirdPartySdncEsrSystemInfo(sdncEsr.getThirdpartySdncId());
+
+                if (sysInfoList != null && sysInfoList.getEsrSystemInfo() != null) {
+                    for (EsrSystemInfo esr : sysInfoList.getEsrSystemInfo()) {
+                        if (esr != null && esr.getType().equals(esrInfo.getNetworkType().getNetworkType())
+                                && esr.getVendor().equals(esrInfo.getVendor())) {
+                            logger.info("Found an entry with vendor name " + esrInfo.getVendor() + " and network type "
+                                    + esrInfo.getNetworkType() + " in ESR.");
+                            NssmfInfo nssmfInfo = new NssmfInfo();
+                            nssmfInfo.setIpAddress(esr.getIpAddress());
+                            nssmfInfo.setPort(esr.getPort());
+                            nssmfInfo.setCacert(esr.getSslCacert());
+                            nssmfInfo.setUserName(esr.getUserName());
+                            nssmfInfo.setPassword(esr.getPassword());
+                            String endPoint = UriBuilder.fromPath("").host(esr.getIpAddress())
+                                    .port(Integer.valueOf(esr.getPort())).scheme("https").build().toString();
+                            nssmfInfo.setUrl(endPoint);
+                            return nssmfInfo;
+                        }
+                    }
+                }
+
+            }
+        }
+
+        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);
+
+        TokenRequest req = new TokenRequest();
+        req.setGrantType("password");
+        req.setUserName(nssmfInfo.getUserName());
+        req.setValue(nssmfInfo.getPassword());
+
+        String tokenReq = marshal(req);
+
+        logger.info("Sending token request to NSSMF: " + tokenReq);
+        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);
+    }
+
+    private RestResponse send(String url, HttpMethod methodType, String content, Header header) {
+
+        HttpRequestBase req = null;
+        HttpResponse res = null;
+
+        logger.debug("Beginning to send message {}: {}", methodType, url);
+
+        try {
+            int timeout = DEFAULT_TIME_OUT;
+
+            RequestConfig config = RequestConfig.custom().setSocketTimeout(timeout).setConnectTimeout(timeout)
+                    .setConnectionRequestTimeout(timeout).build();
+            logger.debug("Sending request to NSSMF: " + content);
+            req = getHttpReq(url, methodType, header, config, content);
+            res = getHttpsClient().execute(req);
+
+            String resContent = null;
+            if (res.getEntity() != null) {
+                resContent = EntityUtils.toString(res.getEntity(), "UTF-8");
+            }
+
+            int statusCode = res.getStatusLine().getStatusCode();
+            String statusMessage = res.getStatusLine().getReasonPhrase();
+            logger.info("NSSMF Response: {} {}", statusCode,
+                    statusMessage + (resContent == null ? "" : System.lineSeparator() + resContent));
+
+            if (res.getStatusLine().getStatusCode() >= 300) {
+                String errMsg = "{\n  \"errorCode\": " + res.getStatusLine().getStatusCode()
+                        + "\n  \"errorDescription\": " + statusMessage + "\n}";
+                logError(errMsg);
+                return createResponse(statusCode, errMsg);
+            }
+            if (null != req) {
+                req.reset();
+            } else {
+                logger.debug("method is NULL:");
+            }
+            req = null;
+
+            return createResponse(statusCode, resContent);
+
+        } catch (SocketTimeoutException | ConnectTimeoutException e) {
+            String errMsg = "Request to NSSMF timed out";
+            logError(errMsg, e);
+            return createResponse(408, errMsg);
+        } catch (Exception e) {
+            String errMsg = "Error processing request to NSSMF";
+            logError(errMsg, e);
+            return createResponse(500, errMsg);
+        } finally {
+            if (res != null) {
+                try {
+                    EntityUtils.consume(res.getEntity());
+                } catch (Exception e) {
+                    logger.debug("Exception :", e);
+                }
+            }
+            if (req != null) {
+                try {
+                    req.reset();
+                } catch (Exception e) {
+                    logger.debug("Exception :", e);
+                }
+            }
+        }
+    }
+
+    private RestResponse createResponse(int statusCode, String errMsg) {
+        RestResponse restResponse = new RestResponse();
+        restResponse.setStatus(statusCode);
+        restResponse.setResponseContent(errMsg);
+        return restResponse;
+    }
+
+    private HttpRequestBase getHttpReq(String url, HttpMethod method, Header header, RequestConfig config,
+            String content) throws ApplicationException {
+        HttpRequestBase base = null;
+        switch (method) {
+            case POST:
+                HttpPost post = new HttpPost(url);
+                post.setEntity(new StringEntity(content, APPLICATION_JSON));
+                base = post;
+                break;
+
+            case GET:
+                base = new HttpGet(url);
+                break;
+
+            case PUT:
+                HttpPut put = new HttpPut(url);
+                put.setEntity(new StringEntity(content, APPLICATION_JSON));
+                base = put;
+                break;
+
+            case PATCH:
+                break;
+
+            case DELETE:
+                HttpDeleteWithBody delete = new HttpDeleteWithBody(url);
+                if (content != null) {
+                    delete.setEntity(new StringEntity(content, APPLICATION_JSON));
+                }
+                base = delete;
+                break;
+
+        }
+        base.setConfig(config);
+        if (header != null) {
+            base.setHeader(header);
+        }
+        return base;
+    }
+
+    class HttpDeleteWithBody extends HttpEntityEnclosingRequestBase {
+        public static final String METHOD_NAME = "DELETE";
+
+        public String getMethod() {
+            return METHOD_NAME;
+        }
+
+        public HttpDeleteWithBody(final String uri) {
+            super();
+            setURI(URI.create(uri));
+        }
+
+        public HttpDeleteWithBody(final URI uri) {
+            super();
+            setURI(uri);
+        }
+
+        public HttpDeleteWithBody() {
+            super();
+        }
+    }
+
+
+    public HttpClient getHttpsClient() {
+
+        TrustManager[] trustAllCerts = new TrustManager[] {new X509TrustManager() {
+            public java.security.cert.X509Certificate[] getAcceptedIssuers() {
+                return null;
+            }
+
+            public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) {}
+
+            public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) {}
+        }};
+
+        // Install the all-trusting trust manager
+        try {
+            SSLContext sc = SSLContext.getInstance("SSL");
+            sc.init(null, trustAllCerts, new java.security.SecureRandom());
+            // HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
+
+            SSLConnectionSocketFactory sslsf =
+                    new SSLConnectionSocketFactory(sc, new String[] {"TLSv1"}, null, new TrustAllHostNameVerifier());
+            return HttpClients.custom().setSSLSocketFactory(sslsf).build();
+        } catch (Exception e) {
+            throw new IllegalArgumentException(e);
+        }
+    }
+
+    private static void logError(String errMsg, Throwable t) {
+        logger.error(FOUR, RA_NS_EXC.toString(), NSSMI_ADAPTER, AvailabilityError.getValue(), errMsg, t);
+    }
+
+    private static void logError(String errMsg) {
+        logger.error(FOUR, RA_NS_EXC.toString(), NSSMI_ADAPTER, AvailabilityError.toString(), errMsg);
+    }
+}
+
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
new file mode 100644
index 0000000..254186b
--- /dev/null
+++ b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/rest/TrustAllHostNameVerifier.java
@@ -0,0 +1,32 @@
+/*-
+ * ============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;
+
+import javax.net.ssl.HostnameVerifier;
+import javax.net.ssl.SSLSession;
+
+public class TrustAllHostNameVerifier implements HostnameVerifier {
+
+    public boolean verify(String hostname, SSLSession session) {
+        return true;
+    }
+
+}
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
new file mode 100644
index 0000000..b0b84d8
--- /dev/null
+++ b/adapters/mso-nssmf-adapter/src/main/java/org/onap/so/adapters/nssmf/util/NssmfAdapterUtil.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.nssmf.util;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import java.io.IOException;
+import org.onap.so.adapters.nssmf.exceptions.ApplicationException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.onap.so.logger.ErrorCode;
+import static org.onap.so.logger.LoggingAnchor.THREE;
+import static org.onap.so.logger.MessageEnum.RA_NS_EXC;
+
+public class NssmfAdapterUtil {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(NssmfAdapterUtil.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 NssmfAdapterUtil() {
+
+    }
+
+    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-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/aai/AaiConnection.java b/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/aai/AaiConnection.java
index a2bd603..9b2a8c3 100644
--- a/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/aai/AaiConnection.java
+++ b/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/aai/AaiConnection.java
@@ -20,6 +20,8 @@
 
 package org.onap.so.adapters.vevnfm.aai;
 
+import java.util.Collections;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Optional;
 import org.apache.logging.log4j.util.Strings;
@@ -43,27 +45,27 @@
 
     private static final int FIRST_INDEX = 0;
 
-    private static void isValid(final EsrSystemInfo info) throws VeVnfmException {
-        if (info == null || Strings.isBlank(info.getServiceUrl())) {
+    private static void isValid(final List<EsrSystemInfo> infos) throws VeVnfmException {
+        if (infos == null || infos.isEmpty() || Strings.isBlank(infos.get(FIRST_INDEX).getServiceUrl())) {
             throw new VeVnfmException("No 'url' field in VNFM info");
         }
     }
 
-    public EsrSystemInfo receiveVnfm() throws VeVnfmException {
-        EsrSystemInfo info;
+    public List<EsrSystemInfo> receiveVnfm() throws VeVnfmException {
+        List<EsrSystemInfo> infos;
 
         try {
-            info = receiveVnfmInternal();
+            infos = receiveVnfmInternal();
         } catch (Exception e) {
             throw new VeVnfmException(e);
         }
 
-        isValid(info);
+        isValid(infos);
 
-        return info;
+        return infos;
     }
 
-    private EsrSystemInfo receiveVnfmInternal() {
+    private List<EsrSystemInfo> receiveVnfmInternal() {
         final AAIResourcesClient resourcesClient = new AAIResourcesClient();
         final AAIResourceUri resourceUri = AAIUriFactory.createResourceUri(AAIObjectType.VNFM_LIST);
         final Optional<EsrVnfmList> response = resourcesClient.get(EsrVnfmList.class, resourceUri);
@@ -73,33 +75,29 @@
             logger.info("The VNFM replied with: {}", esrVnfmList);
             final List<EsrVnfm> esrVnfm = esrVnfmList.getEsrVnfm();
 
-            if (esrVnfm.isEmpty()) {
-                return null;
+            final List<EsrSystemInfo> infos = new LinkedList<>();
+
+            for (final EsrVnfm vnfm : esrVnfm) {
+                final String vnfmId = vnfm.getVnfmId();
+                infos.addAll(receiveVnfmServiceUrl(resourcesClient, vnfmId));
             }
 
-            final String vnfmId = esrVnfm.get(FIRST_INDEX).getVnfmId();
-            return receiveVnfmServiceUrl(resourcesClient, vnfmId);
+            return infos;
         }
 
         return null;
     }
 
-    private EsrSystemInfo receiveVnfmServiceUrl(final AAIResourcesClient resourcesClient, final String vnfmId) {
+    private List<EsrSystemInfo> receiveVnfmServiceUrl(final AAIResourcesClient resourcesClient, final String vnfmId) {
         final Optional<EsrVnfm> response = resourcesClient.get(EsrVnfm.class,
                 AAIUriFactory.createResourceUri(AAIObjectType.VNFM, vnfmId).depth(Depth.ONE));
 
         if (response.isPresent()) {
             final EsrVnfm esrVnfm = response.get();
             logger.info("The VNFM replied with: {}", esrVnfm);
-            final List<EsrSystemInfo> esrSystemInfo = esrVnfm.getEsrSystemInfoList().getEsrSystemInfo();
-
-            if (esrSystemInfo.isEmpty()) {
-                return null;
-            }
-
-            return esrSystemInfo.get(FIRST_INDEX);
+            return esrVnfm.getEsrSystemInfoList().getEsrSystemInfo();
         }
 
-        return null;
+        return Collections.emptyList();
     }
 }
diff --git a/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/aai/EsrId.java b/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/aai/EsrId.java
new file mode 100644
index 0000000..13ff2b6
--- /dev/null
+++ b/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/aai/EsrId.java
@@ -0,0 +1,45 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SO
+ * ================================================================================
+ * Copyright (C) 2020 Samsung. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.adapters.vevnfm.aai;
+
+import org.onap.aai.domain.yang.EsrSystemInfo;
+
+public class EsrId {
+
+    private EsrSystemInfo info;
+    private String id;
+
+    public EsrSystemInfo getInfo() {
+        return info;
+    }
+
+    public void setInfo(final EsrSystemInfo info) {
+        this.info = info;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(final String id) {
+        this.id = id;
+    }
+}
diff --git a/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/configuration/StartupConfiguration.java b/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/configuration/StartupConfiguration.java
index ae330f7..c033fc3 100644
--- a/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/configuration/StartupConfiguration.java
+++ b/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/configuration/StartupConfiguration.java
@@ -20,6 +20,7 @@
 
 package org.onap.so.adapters.vevnfm.configuration;
 
+import java.util.List;
 import org.onap.aai.domain.yang.EsrSystemInfo;
 import org.onap.so.adapters.vevnfm.service.StartupService;
 import org.onap.so.adapters.vevnfm.service.SubscriptionScheduler;
@@ -47,8 +48,8 @@
     @EventListener(ApplicationReadyEvent.class)
     public void onApplicationReadyEvent() throws Exception {
         if (!environment.acceptsProfiles(Profiles.of(TEST_PROFILE))) {
-            final EsrSystemInfo info = startupService.receiveVnfm();
-            subscriptionScheduler.setInfo(info);
+            final List<EsrSystemInfo> infos = startupService.receiveVnfm();
+            subscriptionScheduler.setInfos(infos);
         }
     }
 }
diff --git a/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/service/DmaapService.java b/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/service/DmaapService.java
index 59397ce..36a4c33 100644
--- a/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/service/DmaapService.java
+++ b/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/service/DmaapService.java
@@ -25,12 +25,15 @@
     private HttpRestServiceProvider restProvider;
 
     public void send(final VnfLcmOperationOccurrenceNotification notification) {
-        final ResponseEntity<String> response = restProvider.postHttpRequest(notification, getUrl(), String.class);
+        try {
+            final ResponseEntity<String> response = restProvider.postHttpRequest(notification, getUrl(), String.class);
+            final HttpStatus statusCode = response.getStatusCode();
+            final String body = response.getBody();
 
-        final HttpStatus statusCode = response.getStatusCode();
-        final String body = response.getBody();
-
-        logger.info("The DMaaP replied with the code {} and the body {}", statusCode, body);
+            logger.info("The DMaaP replied with the code {} and the body {}", statusCode, body);
+        } catch (Exception e) {
+            logger.warn("An issue connecting to DMaaP", e);
+        }
     }
 
     private String getUrl() {
diff --git a/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/service/StartupService.java b/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/service/StartupService.java
index 3d21514..92906ef 100644
--- a/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/service/StartupService.java
+++ b/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/service/StartupService.java
@@ -20,6 +20,8 @@
 
 package org.onap.so.adapters.vevnfm.service;
 
+import java.util.Collections;
+import java.util.List;
 import org.onap.aai.domain.yang.EsrSystemInfo;
 import org.onap.so.adapters.vevnfm.aai.AaiConnection;
 import org.onap.so.adapters.vevnfm.exception.VeVnfmException;
@@ -45,18 +47,17 @@
     @Autowired
     private AaiConnection aaiConnection;
 
-    @Retryable(value = {VeVnfmException.class}, maxAttempts = 5, backoff = @Backoff(delay = 5000, multiplier = 10))
-    public EsrSystemInfo receiveVnfm() throws VeVnfmException {
+    @Retryable(value = {Exception.class}, maxAttempts = 5, backoff = @Backoff(delay = 5000, multiplier = 2))
+    public List<EsrSystemInfo> receiveVnfm() throws VeVnfmException {
         return aaiConnection.receiveVnfm();
     }
 
     @Recover
-    public EsrSystemInfo recoverReceiveVnfm(final Throwable e) {
+    public List<EsrSystemInfo> recoverReceiveVnfm(final Throwable t) {
         logger.warn("Connection to AAI failed");
         final EsrSystemInfo info = new EsrSystemInfo();
         info.setServiceUrl(vnfmDefaultEndpoint);
         logger.warn("This EsrSystemInfo is used by default: {}", info);
-
-        return info;
+        return Collections.singletonList(info);
     }
 }
diff --git a/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/service/SubscriptionScheduler.java b/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/service/SubscriptionScheduler.java
index 1642743..d9f3acc 100644
--- a/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/service/SubscriptionScheduler.java
+++ b/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/service/SubscriptionScheduler.java
@@ -20,7 +20,10 @@
 
 package org.onap.so.adapters.vevnfm.service;
 
+import java.util.LinkedList;
+import java.util.List;
 import org.onap.aai.domain.yang.EsrSystemInfo;
+import org.onap.so.adapters.vevnfm.aai.EsrId;
 import org.onap.so.adapters.vevnfm.exception.VeVnfmException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -38,33 +41,57 @@
     @Autowired
     private SubscriberService subscriberService;
 
-    private String subscribedId;
+    private List<EsrId> esrIds;
 
-    private EsrSystemInfo info;
+    public void setInfos(final List<EsrSystemInfo> infos) {
+        esrIds = new LinkedList<>();
 
-    public void setInfo(final EsrSystemInfo info) {
-        this.info = info;
+        for (final EsrSystemInfo info : infos) {
+            final EsrId esrId = new EsrId();
+            esrId.setInfo(info);
+            esrIds.add(esrId);
+        }
+    }
+
+    List<EsrId> getEsrIds() {
+        return esrIds;
     }
 
     @Scheduled(fixedRate = 5000, initialDelay = 2000)
     void subscribeTask() throws VeVnfmException {
-        if (info != null) {
-            if (subscribedId == null) {
-                logger.info("Starting subscribe task");
-                subscribedId = subscriberService.subscribe(info);
+        if (isEsrIdsValid()) {
+            for (final EsrId esrId : esrIds) {
+                singleSubscribe(esrId);
             }
         }
     }
 
     @Scheduled(fixedRate = 20000)
     void checkSubscribeTask() throws VeVnfmException {
-        if (info != null) {
-            if (subscribedId != null) {
-                logger.info("Checking subscription: {}", subscribedId);
-                if (!subscriberService.checkSubscription(info, subscribedId)) {
-                    logger.info("Subscription {} not available", subscribedId);
-                    subscribedId = null;
-                }
+        if (isEsrIdsValid()) {
+            for (final EsrId esrId : esrIds) {
+                singleCheckSubscription(esrId);
+            }
+        }
+    }
+
+    private boolean isEsrIdsValid() {
+        return esrIds != null && !esrIds.isEmpty();
+    }
+
+    private void singleSubscribe(final EsrId esrId) throws VeVnfmException {
+        if (esrId.getId() == null) {
+            logger.info("Single subscribe task");
+            esrId.setId(subscriberService.subscribe(esrId.getInfo()));
+        }
+    }
+
+    private void singleCheckSubscription(final EsrId esrId) throws VeVnfmException {
+        if (esrId.getId() != null) {
+            logger.info("Checking subscription: {}", esrId.getId());
+            if (!subscriberService.checkSubscription(esrId.getInfo(), esrId.getId())) {
+                logger.info("Subscription {} not available", esrId.getId());
+                esrId.setId(null);
             }
         }
     }
diff --git a/adapters/mso-ve-vnfm-adapter/src/test/java/org/onap/so/adapters/vevnfm/service/StartupServiceTest.java b/adapters/mso-ve-vnfm-adapter/src/test/java/org/onap/so/adapters/vevnfm/service/StartupServiceTest.java
index d1d34a7..9b18cf9 100644
--- a/adapters/mso-ve-vnfm-adapter/src/test/java/org/onap/so/adapters/vevnfm/service/StartupServiceTest.java
+++ b/adapters/mso-ve-vnfm-adapter/src/test/java/org/onap/so/adapters/vevnfm/service/StartupServiceTest.java
@@ -23,6 +23,8 @@
 import static org.junit.Assert.assertEquals;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
+import java.util.Collections;
+import java.util.List;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
@@ -52,14 +54,15 @@
         // given
         final EsrSystemInfo info = new EsrSystemInfo();
         info.setServiceUrl(URL);
+        final List<EsrSystemInfo> infos = Collections.singletonList(info);
 
-        when(aaiConnection.receiveVnfm()).thenReturn(info);
+        when(aaiConnection.receiveVnfm()).thenReturn(infos);
 
         // when
-        final EsrSystemInfo systemInfo = startupService.receiveVnfm();
+        final List<EsrSystemInfo> systemInfo = startupService.receiveVnfm();
 
         // then
         verify(aaiConnection).receiveVnfm();
-        assertEquals(info, systemInfo);
+        assertEquals(infos, systemInfo);
     }
 }
diff --git a/adapters/mso-ve-vnfm-adapter/src/test/java/org/onap/so/adapters/vevnfm/service/SubscriptionSchedulerTest.java b/adapters/mso-ve-vnfm-adapter/src/test/java/org/onap/so/adapters/vevnfm/service/SubscriptionSchedulerTest.java
new file mode 100644
index 0000000..d3da7c8
--- /dev/null
+++ b/adapters/mso-ve-vnfm-adapter/src/test/java/org/onap/so/adapters/vevnfm/service/SubscriptionSchedulerTest.java
@@ -0,0 +1,69 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SO
+ * ================================================================================
+ * Copyright (C) 2020 Samsung. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.adapters.vevnfm.service;
+
+import static org.junit.Assert.assertNull;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import java.util.Collections;
+import java.util.List;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+import org.onap.aai.domain.yang.EsrSystemInfo;
+
+@RunWith(MockitoJUnitRunner.class)
+public class SubscriptionSchedulerTest {
+
+    private static final String URL = "url";
+    private static final String ID = "id044";
+
+    @Mock
+    private SubscriberService subscriberService;
+
+    @InjectMocks
+    private SubscriptionScheduler subscriptionScheduler;
+
+    @Test
+    public void testFullScenario() throws Exception {
+        // given
+        final EsrSystemInfo info = new EsrSystemInfo();
+        info.setServiceUrl(URL);
+        final List<EsrSystemInfo> infos = Collections.singletonList(info);
+
+        when(subscriberService.subscribe(eq(info))).thenReturn(ID);
+        when(subscriberService.checkSubscription(eq(info), eq(ID))).thenReturn(false);
+
+        // when
+        subscriptionScheduler.setInfos(infos);
+        subscriptionScheduler.subscribeTask();
+        subscriptionScheduler.checkSubscribeTask();
+
+        // then
+        verify(subscriberService).subscribe(info);
+        verify(subscriberService).checkSubscription(info, ID);
+
+        assertNull(subscriptionScheduler.getEsrIds().get(0).getId());
+    }
+}
diff --git a/adapters/pom.xml b/adapters/pom.xml
index 8acc701..5d382fd 100644
--- a/adapters/pom.xml
+++ b/adapters/pom.xml
@@ -23,6 +23,7 @@
     <module>mso-openstack-adapters</module>
     <module>mso-vnfm-adapter</module>
     <module>mso-ve-vnfm-adapter</module>
+    <module>mso-nssmf-adapter</module>
     <module>so-appc-orchestrator</module>
   </modules>
 
diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/CreateSDNCNetworkResource.groovy b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/CreateSDNCNetworkResource.groovy
index 4b3c1aa..3da4161 100644
--- a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/CreateSDNCNetworkResource.groovy
+++ b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/CreateSDNCNetworkResource.groovy
@@ -163,36 +163,20 @@
         String serInput = jsonUtil.getJsonValue(resourceInputTmp, "requestsInputs")
 
         switch (modelName) {
-            case ~/[\w\s\W]*OLT[\w\s\W]*/ :
+            case ~/[\w\s\W]*OLT[\w\s\W]*/ : // for backward compatibilty only, this case will be deprecated
+            case ~/[\w\s\W]*AccessConnectivity[\w\s\W]*/ :
                 // get the required properties and update in resource input
 
                 def resourceInput = resourceInputObj.getResourceParameters()
                 String incomingRequest = resourceInputObj.getRequestsInputs()
                 String serviceParameters = JsonUtils.getJsonValue(incomingRequest, "service.parameters")
                 String requestInputs = JsonUtils.getJsonValue(serviceParameters, "requestInputs")
-                String cvlan
-                String svlan
-                String remoteId
-
-                List<Metadatum> metadatum = getMetaDatum(resourceInputObj.getGlobalSubscriberId(),
-                        resourceInputObj.getServiceType(),
-                        resourceInputObj.getServiceInstanceId())
-                for(Metadatum datum: metadatum) {
-                    if (datum.getMetaname().equalsIgnoreCase("cvlan")) {
-                        cvlan = datum.getMetaval()
-                    }
-
-                    if (datum.getMetaname().equalsIgnoreCase("svlan")) {
-                        svlan = datum.getMetaval()
-                    }
-
-                    if (datum.getMetaname().equalsIgnoreCase("remoteId")) {
-                        remoteId = datum.getMetaval()
-                    }
-                }
-
-                logger.debug("cvlan: "+cvlan+" | svlan: "+svlan+" | remoteId: "+remoteId)
-
+                String cvlan = jsonUtil.getJsonValue(serInput,
+                        "service.parameters.requestInputs.cvlan")
+                String svlan = jsonUtil.getJsonValue(serInput,
+                        "service.parameters.requestInputs.svlan")
+                String remoteId = jsonUtil.getJsonValue(serInput,
+                        "service.parameters.requestInputs.edgeinternetprofile_ip_remote_id")
                 String manufacturer = jsonUtil.getJsonValue(serInput,
                         "service.parameters.requestInputs.ont_ont_manufacturer")
                 String ontsn = jsonUtil.getJsonValue(serInput,
@@ -209,7 +193,8 @@
                 logger.debug("new resource Input :" + resourceInputObj.toString())
                 break
 
-            case ~/[\w\s\W]*EdgeInternetProfile[\w\s\W]*/ :
+            case ~/[\w\s\W]*EdgeInternetProfile[\w\s\W]*/ : // for backward compatibilty only, this case will be deprecated
+            case ~/[\w\s\W]*InternetProfile[\w\s\W]*/ :
                 // get the required properties and update in resource input
                 def resourceInput = resourceInputObj.getResourceParameters()
                 String incomingRequest = resourceInputObj.getRequestsInputs()
@@ -217,37 +202,34 @@
                 String requestInputs = JsonUtils.getJsonValue(serviceParameters, "requestInputs")
                 JSONObject inputParameters = new JSONObject(requestInputs)
 
-                String cvlan
-                String svlan
-                String remoteId
+                String cvlan = jsonUtil.getJsonValue(serInput,
+                        "service.parameters.requestInputs.cvlan")
+                String svlan = jsonUtil.getJsonValue(serInput,
+                        "service.parameters.requestInputs.svlan")
                 String manufacturer = jsonUtil.getJsonValue(serInput,
                         "service.parameters.requestInputs.ont_ont_manufacturer")
-
+                String remoteId = jsonUtil.getJsonValue(serInput,
+                        "service.parameters.requestInputs.edgeinternetprofile_ip_remote_id")
                 String ontsn = jsonUtil.getJsonValue(serInput,
                         "service.parameters.requestInputs.ont_ont_serial_num")
-
-                List<Metadatum> metadatum = getMetaDatum(resourceInputObj.getGlobalSubscriberId(),
-                        resourceInputObj.getServiceType(),
-                        resourceInputObj.getServiceInstanceId())
-                for(Metadatum datum: metadatum) {
-                    if (datum.getMetaname().equalsIgnoreCase("cvlan")) {
-                        cvlan = datum.getMetaval()
-                    }
-
-                    if (datum.getMetaname().equalsIgnoreCase("svlan")) {
-                        svlan = datum.getMetaval()
-                    }
-
-                    if (datum.getMetaname().equalsIgnoreCase("remoteId")) {
-                        remoteId = datum.getMetaval()
-                    }
-                }
+                String serviceType = jsonUtil.getJsonValue(serInput,
+                        "service.parameters.requestInputs.edgeinternetprofile_ip_service_type")
+                String macAddr = jsonUtil.getJsonValue(serInput,
+                        "service.parameters.requestInputs.edgeinternetprofile_ip_rg_mac_addr")
+                String upStream = jsonUtil.getJsonValue(serInput,
+                        "service.parameters.requestInputs.edgeinternetprofile_ip_upstream_speed")
+                String downStream = jsonUtil.getJsonValue(serInput,
+                        "service.parameters.requestInputs.edgeinternetprofile_ip_downstream_speed")
 
                 String uResourceInput = jsonUtil.addJsonValue(resourceInput, "requestInputs.c_vlan", cvlan)
                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.s_vlan", svlan)
                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.manufacturer", manufacturer)
-                uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ip_access_id", remoteId)
+                uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ip_remote_id", remoteId)
                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ont_sn", ontsn)
+                uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ip_service_type", serviceType)
+                uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ip_rg_mac_addr", macAddr)
+                uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ip_upstream_speed", upStream)
+                uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ip_downstream_speed", downStream)
                 logger.debug("old resource input:" + resourceInputObj.toString())
                 resourceInputObj.setResourceParameters(uResourceInput)
                 execution.setVariable(Prefix + "resourceInput", resourceInputObj.toString())
diff --git a/common/src/main/java/org/onap/so/client/aai/AAIObjectType.java b/common/src/main/java/org/onap/so/client/aai/AAIObjectType.java
index db541f7..f78ac73 100644
--- a/common/src/main/java/org/onap/so/client/aai/AAIObjectType.java
+++ b/common/src/main/java/org/onap/so/client/aai/AAIObjectType.java
@@ -191,6 +191,11 @@
     public static final AAIObjectType CLOUD_ESR_SYSTEM_INFO_LIST = new AAIObjectType(
             AAIObjectType.CLOUD_REGION.uriTemplate(), "/esr-system-info-list", "cloud-esr-system-info-list");
     public static final AAIObjectType ZONE = new AAIObjectType(AAINamespaceConstants.NETWORK, Zone.class);
+    public static final AAIObjectType THIRDPARTY_SDNC_LIST = new AAIObjectType(AAINamespaceConstants.EXTERNAL_SYSTEM,
+            "/esr-thirdparty-sdnc-list", "thirdparty-sdnc-list");
+    public static final AAIObjectType THIRDPARTY_SDNC_SYSTEM_INFO_LIST =
+            new AAIObjectType(AAINamespaceConstants.EXTERNAL_SYSTEM + "/esr-thirdparty-sdnc-list",
+                    "/esr-thirdparty-sdnc/{sdnc-id}/esr-system-info-list", "thirdparty-sdnc-system-info-list");
 
     private final String uriTemplate;
     private final String parentUri;
diff --git a/mso-catalog-db/src/main/java/org/onap/so/db/catalog/beans/ServiceArtifact.java b/mso-catalog-db/src/main/java/org/onap/so/db/catalog/beans/ServiceArtifact.java
new file mode 100644
index 0000000..a8884a8
--- /dev/null
+++ b/mso-catalog-db/src/main/java/org/onap/so/db/catalog/beans/ServiceArtifact.java
@@ -0,0 +1,168 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (c) 2019, CMCC Technologies Co., Ltd.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.db.catalog.beans;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.openpojo.business.annotation.BusinessKey;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import javax.persistence.*;
+import java.io.Serializable;
+import java.util.Date;
+import java.util.Objects;
+
+@Entity
+@Table(name = "service_artifact")
+public class ServiceArtifact implements Serializable {
+
+    private static final long serialVersionUID = 768026109321305392L;
+
+    @BusinessKey
+    @Id
+    @Column(name = "ARTIFACT_UUID")
+    private String artifactUUID;
+
+    @Column(name = "TYPE")
+    private String type;
+
+    @Column(name = "NAME")
+    private String name;
+
+    @Column(name = "VERSION")
+    private String version;
+
+    @Column(name = "DESCRIPTION")
+    private String description;
+
+    @Column(name = "CONTENT", columnDefinition = "LONGTEXT")
+    private String content;
+
+    @Column(name = "CHECKSUM")
+    private String checksum;
+
+    @Column(name = "CREATION_TIMESTAMP", updatable = false)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss.SSS")
+    @Temporal(TemporalType.TIMESTAMP)
+    private Date creationTimestamp;
+
+    @ManyToOne(cascade = CascadeType.ALL)
+    @JoinColumn(name = "SERVICE_MODEL_UUID")
+    private Service service;
+
+    @PrePersist
+    protected void onCreate() {
+        this.creationTimestamp = new Date();
+    }
+
+    public String getArtifactUUID() {
+        return artifactUUID;
+    }
+
+    public void setArtifactUUID(String artifactUUID) {
+        this.artifactUUID = artifactUUID;
+    }
+
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getVersion() {
+        return version;
+    }
+
+    public void setVersion(String version) {
+        this.version = version;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public String getChecksum() {
+        return checksum;
+    }
+
+    public void setChecksum(String checksum) {
+        this.checksum = checksum;
+    }
+
+    public Date getCreationTimestamp() {
+        return creationTimestamp;
+    }
+
+    public void setCreationTimestamp(Date creationTimestamp) {
+        this.creationTimestamp = creationTimestamp;
+    }
+
+    public Service getService() {
+        return service;
+    }
+
+    public void setService(Service service) {
+        this.service = service;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this).append("artifactUUID", artifactUUID).append("type", type).append("name", name)
+                .append("version", version).append("description", description).append("content", content)
+                .append("checksum", checksum).append("creationTimestamp", creationTimestamp).toString();
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o)
+            return true;
+        if (o == null || getClass() != o.getClass())
+            return false;
+        ServiceArtifact that = (ServiceArtifact) o;
+        return artifactUUID.equals(that.artifactUUID);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(artifactUUID);
+    }
+}
diff --git a/mso-catalog-db/src/main/java/org/onap/so/db/catalog/beans/ServiceInfo.java b/mso-catalog-db/src/main/java/org/onap/so/db/catalog/beans/ServiceInfo.java
new file mode 100644
index 0000000..f9c9576
--- /dev/null
+++ b/mso-catalog-db/src/main/java/org/onap/so/db/catalog/beans/ServiceInfo.java
@@ -0,0 +1,106 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (c) 2019, CMCC Technologies Co., Ltd.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.db.catalog.beans;
+
+import com.openpojo.business.annotation.BusinessKey;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import uk.co.blackpepper.bowman.annotation.LinkedResource;
+import javax.persistence.*;
+import java.io.Serializable;
+import java.util.Objects;
+
+@Entity
+@Table(name = "service_info")
+public class ServiceInfo implements Serializable {
+
+    private static final long serialVersionUID = 768026109321305392L;
+
+    @Id
+    @BusinessKey
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "ID")
+    private Integer id;
+
+    @Column(name = "SERVICE_INPUT")
+    private String serviceInput;
+
+    @Column(name = "SERVICE_PROPERTIES")
+    private String serviceProperties;
+
+    @OneToOne(cascade = CascadeType.ALL)
+    @JoinTable(name = "service_to_service_info", joinColumns = @JoinColumn(name = "SERVICE_INFO_ID"),
+            inverseJoinColumns = @JoinColumn(name = "SERVICE_MODEL_UUID"))
+    private Service service;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer serviceInfoId) {
+        this.id = serviceInfoId;
+    }
+
+    public String getServiceInput() {
+        return serviceInput;
+    }
+
+    public void setServiceInput(String serviceInput) {
+        this.serviceInput = serviceInput;
+    }
+
+    public String getServiceProperties() {
+        return serviceProperties;
+    }
+
+    public void setServiceProperties(String serviceProperties) {
+        this.serviceProperties = serviceProperties;
+    }
+
+    @LinkedResource
+    public Service getService() {
+        return service;
+    }
+
+    public void setService(Service service) {
+        this.service = service;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this).append("id", id).append("serviceProperties", serviceProperties)
+                .append("serviceInput", serviceInput).toString();
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o)
+            return true;
+        if (o == null || getClass() != o.getClass())
+            return false;
+        ServiceInfo that = (ServiceInfo) o;
+        return id.equals(that.id);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(id);
+    }
+}
diff --git a/packages/docker/pom.xml b/packages/docker/pom.xml
index 545fc92..8d95d06 100644
--- a/packages/docker/pom.xml
+++ b/packages/docker/pom.xml
@@ -257,6 +257,31 @@
               </build>
             </image>
             <image>
+             <name>${docker.image.prefix}/nssmf-adapter</name>
+              <build>
+               <cleanup>try</cleanup>
+               <dockerFileDir>docker-files</dockerFileDir>
+               <dockerFile>Dockerfile.so-app</dockerFile>
+               <tags>
+                <tag>${project.version}</tag>
+                <tag>${project.version}-${maven.build.timestamp}</tag>
+                <tag>${project.docker.latesttag.version}</tag>
+               </tags>
+               <assembly>
+                <inline>
+                 <dependencySets>
+                  <dependencySet>
+                   <includes>
+                    <include>org.onap.so.adapters:mso-nssmf-adapter</include>
+                   </includes>
+                   <outputFileNameMapping>app.jar</outputFileNameMapping>
+                 </dependencySet>
+                </dependencySets>
+               </inline>
+              </assembly>
+             </build>
+           </image>
+            <image>
               <name>${docker.image.prefix}/so-appc-orchestrator</name>
               <build>
                 <cleanup>try</cleanup>
@@ -437,7 +462,7 @@
               <goal>push</goal>
             </goals>
             <configuration>
-              <image>${docker.image.prefix}/catalog-db-adapter,${docker.image.prefix}/request-db-adapter,${docker.image.prefix}/sdnc-adapter,${docker.image.prefix}/openstack-adapter,${docker.image.prefix}/vfc-adapter,${docker.image.prefix}/sdc-controller,${docker.image.prefix}/bpmn-infra,${docker.image.prefix}/api-handler-infra,${docker.image.prefix}/so-monitoring,${docker.image.prefix}/so-simulator</image>
+              <image>${docker.image.prefix}/catalog-db-adapter,${docker.image.prefix}/request-db-adapter,${docker.image.prefix}/sdnc-adapter,${docker.image.prefix}/openstack-adapter,${docker.image.prefix}/vfc-adapter,${docker.image.prefix}/sdc-controller,${docker.image.prefix}/bpmn-infra,${docker.image.prefix}/api-handler-infra,${docker.image.prefix}/so-monitoring,${docker.image.prefix}/so-simulator,${docker.image.prefix}/mso-nssmf-adapter</image>
             </configuration>
           </execution>
         </executions>
@@ -492,6 +517,11 @@
     </dependency>
     <dependency>
       <groupId>org.onap.so.adapters</groupId>
+      <artifactId>mso-nssmf-adapter</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.onap.so.adapters</groupId>
       <artifactId>so-appc-orchestrator</artifactId>
       <version>${project.version}</version>
     </dependency>
diff --git a/pom.xml b/pom.xml
index bde0d7a..3037cca 100644
--- a/pom.xml
+++ b/pom.xml
@@ -49,7 +49,7 @@
     <sonar.cpd.exclusions>**/*</sonar.cpd.exclusions>
     <jacoco.version>0.8.5</jacoco.version>
     <org.apache.maven.user-settings />
-    <openstack.version>1.5.1</openstack.version>
+    <openstack.version>1.5.2-SNAPSHOT</openstack.version>
     <maven.build.timestamp.format>yyyyMMdd'T'HHmm</maven.build.timestamp.format>
     <originalClassifier>original</originalClassifier>
     <docker.skip>true</docker.skip>
diff --git a/so-simulator/pom.xml b/so-simulator/pom.xml
index 352a167..35964d6 100644
--- a/so-simulator/pom.xml
+++ b/so-simulator/pom.xml
@@ -17,8 +17,19 @@
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
     <citrus.simulator.version>1.1.0</citrus.simulator.version>
+    <spring.boot.version>2.0.9.RELEASE</spring.boot.version>
   </properties>
-
+  <dependencyManagement>
+    <dependencies>
+      <dependency>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-dependencies</artifactId>
+        <version>${spring.boot.version}</version>
+        <type>pom</type>
+        <scope>import</scope>
+      </dependency>
+    </dependencies>
+  </dependencyManagement>
   <dependencies>
     <dependency>
       <groupId>org.springframework.boot</groupId>