diff --git a/cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/config/NetworkCmProxyConfig.java b/cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/config/NetworkCmProxyConfig.java
new file mode 100644
index 0000000..300765d
--- /dev/null
+++ b/cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/config/NetworkCmProxyConfig.java
@@ -0,0 +1,47 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 Pantheon.tech
+ *  Modifications (C) 2021 Nordix Foundation
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.cps.ncmp.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+
+@Configuration
+public class NetworkCmProxyConfig {
+
+    /**
+     * Swagger-ui configuration.
+     */
+    @Bean("ncmp-docket")
+    public Docket api() {
+        return new Docket(DocumentationType.OAS_30)
+            .groupName("ncmp-docket")
+            .select()
+            .apis(RequestHandlerSelectors.any())
+            .paths(PathSelectors.any())
+            .build();
+    }
+
+}
\ No newline at end of file
diff --git a/cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/controller/NetworkCmProxyController.java b/cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/controller/NetworkCmProxyController.java
new file mode 100644
index 0000000..acbbdd9
--- /dev/null
+++ b/cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/controller/NetworkCmProxyController.java
@@ -0,0 +1,85 @@
+/*
+ *  ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 Pantheon.tech
+ *  Modifications (C) 2021 Nordix Foundation
+ *  Modification Copyright (C) 2021 highstreet technologies GmbH
+ *  ================================================================================
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ *  SPDX-License-Identifier: Apache-2.0
+ *  ============LICENSE_END=========================================================
+ */
+
+package org.onap.cps.ncmp.rest.controller;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import java.util.Collection;
+import javax.validation.Valid;
+import org.onap.cps.ncmp.api.NetworkCmProxyDataService;
+import org.onap.cps.ncmp.rest.api.NetworkCmProxyApi;
+import org.onap.cps.spi.FetchDescendantsOption;
+import org.onap.cps.spi.model.DataNode;
+import org.onap.cps.utils.DataMapUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+
+@RestController
+@RequestMapping("${rest.api.ncmp-base-path}")
+public class NetworkCmProxyController implements NetworkCmProxyApi {
+
+    private static final Gson GSON = new GsonBuilder().create();
+    private static final String XPATH_ROOT = "/";
+
+    @Autowired
+    private NetworkCmProxyDataService networkCmProxyDataService;
+
+    @Override
+    public ResponseEntity<Object> getNodeByCmHandleAndXpath(final String cmHandle, @Valid final String xpath,
+        @Valid final Boolean includeDescendants) {
+        if (XPATH_ROOT.equals(xpath)) {
+            return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);
+        }
+        final FetchDescendantsOption fetchDescendantsOption = Boolean.TRUE.equals(includeDescendants)
+            ? FetchDescendantsOption.INCLUDE_ALL_DESCENDANTS : FetchDescendantsOption.OMIT_DESCENDANTS;
+        final DataNode dataNode = networkCmProxyDataService.getDataNode(cmHandle, xpath, fetchDescendantsOption);
+        return new ResponseEntity<>(DataMapUtils.toDataMap(dataNode), HttpStatus.OK);
+    }
+
+    @Override
+    public ResponseEntity<Object> queryNodesByCmHandleAndCpsPath(final String cmHandle, @Valid final String cpsPath,
+        @Valid final Boolean includeDescendants) {
+        final FetchDescendantsOption fetchDescendantsOption = Boolean.TRUE.equals(includeDescendants)
+            ? FetchDescendantsOption.INCLUDE_ALL_DESCENDANTS : FetchDescendantsOption.OMIT_DESCENDANTS;
+        final Collection<DataNode> dataNodes =
+            networkCmProxyDataService.queryDataNodes(cmHandle, cpsPath, fetchDescendantsOption);
+        return new ResponseEntity<>(GSON.toJson(dataNodes), HttpStatus.OK);
+    }
+
+    @Override
+    public ResponseEntity<Object> replaceNode(@Valid final String jsonData, final String cmHandle,
+        @Valid final String parentNodeXpath) {
+        networkCmProxyDataService.replaceNodeTree(cmHandle, parentNodeXpath, jsonData);
+        return new ResponseEntity<>(HttpStatus.OK);
+    }
+
+    @Override
+    public ResponseEntity<Object> updateNodeLeaves(@Valid final String jsonData, final String cmHandle,
+        @Valid final String parentNodeXpath) {
+        networkCmProxyDataService.updateNodeLeaves(cmHandle, parentNodeXpath, jsonData);
+        return new ResponseEntity<>(HttpStatus.OK);
+    }
+}
diff --git a/cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/exceptions/NetworkCmProxyRestExceptionHandler.java b/cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/exceptions/NetworkCmProxyRestExceptionHandler.java
new file mode 100755
index 0000000..bb922e7
--- /dev/null
+++ b/cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/exceptions/NetworkCmProxyRestExceptionHandler.java
@@ -0,0 +1,71 @@
+/*
+ *  ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 Pantheon.tech
+ *  ================================================================================
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ *  SPDX-License-Identifier: Apache-2.0
+ *  ============LICENSE_END=========================================================
+ */
+
+package org.onap.cps.ncmp.rest.exceptions;
+
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.onap.cps.ncmp.rest.controller.NetworkCmProxyController;
+import org.onap.cps.ncmp.rest.model.ErrorMessage;
+import org.onap.cps.spi.exceptions.CpsException;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+/**
+ * Exception handler with error message return.
+ */
+@Slf4j
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+@RestControllerAdvice(assignableTypes = {NetworkCmProxyController.class})
+public class NetworkCmProxyRestExceptionHandler {
+
+    private static final String CHECK_LOGS_FOR_DETAILS = "Check logs for details.";
+
+    /**
+     * Default exception handler.
+     *
+     * @param exception the exception to handle
+     * @return response with response code 500.
+     */
+    @ExceptionHandler
+    public static ResponseEntity<Object> handleInternalServerErrorExceptions(
+        final Exception exception) {
+        return buildErrorResponse(HttpStatus.INTERNAL_SERVER_ERROR, exception);
+    }
+
+    @ExceptionHandler({CpsException.class})
+    public static ResponseEntity<Object> handleAnyOtherCpsExceptions(final CpsException exception) {
+        return buildErrorResponse(HttpStatus.INTERNAL_SERVER_ERROR, exception);
+    }
+
+    private static ResponseEntity<Object> buildErrorResponse(final HttpStatus status, final Exception exception) {
+        if (exception.getCause() != null || !(exception instanceof CpsException)) {
+            log.error("Exception occurred", exception);
+        }
+        final ErrorMessage errorMessage = new ErrorMessage();
+        errorMessage.setStatus(status.toString());
+        errorMessage.setMessage(exception.getMessage());
+        errorMessage.setDetails(exception instanceof CpsException ? ((CpsException) exception).getDetails() :
+            CHECK_LOGS_FOR_DETAILS);
+        return new ResponseEntity<>(errorMessage, status);
+    }
+}
diff --git a/cps-ncmp-rest/src/main/resources/openapi-configuration.json b/cps-ncmp-rest/src/main/resources/openapi-configuration.json
new file mode 100644
index 0000000..5736c3d
--- /dev/null
+++ b/cps-ncmp-rest/src/main/resources/openapi-configuration.json
@@ -0,0 +1,28 @@
+{
+    "resourcePackages": [
+        "org.onap.cps.ncmp.rest.controller"
+    ],
+    "prettyPrint": true,
+    "cacheTTL": 0,
+    "openAPI": {
+        "info": {
+            "title": "ONAP Open API v3 CPS Network CM Proxy Spec",
+            "description": "The API Description may be multiline, and GitHub Flavored Markdown, GFM syntax, can be used for rich text representation.",
+            "x-logo": {
+                "url": "logo.png"
+            },
+            "contact": {
+                "name": "ONAP",
+                "url": "https://onap.readthedocs.io",
+                "email": "onap-discuss@lists.onap.org"
+            },
+            "license": {
+                "name": "Apache 2.0",
+                "url": "http://www.apache.org/licenses/LICENSE-2.0"
+            },
+            "version": "1.2.34",
+            "x-planned-retirement-date": "202207",
+            "x-component": "Modeling"
+        }
+    }
+}
diff --git a/cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/config/NetworkCmProxyConfigSpec.groovy b/cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/config/NetworkCmProxyConfigSpec.groovy
new file mode 100644
index 0000000..4b0e256
--- /dev/null
+++ b/cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/config/NetworkCmProxyConfigSpec.groovy
@@ -0,0 +1,33 @@
+/*
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 highstreet technologies GmbH
+ *  Modification Copyright (C) 2021 Nordix Foundation
+ *  ================================================================================
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ *  SPDX-License-Identifier: Apache-2.0
+ *  ============LICENSE_END=========================================================
+ */
+
+package org.onap.cps.ncmp.config
+
+import spock.lang.Specification
+import springfox.documentation.spring.web.plugins.Docket
+
+class NetworkCmProxyConfigSpec extends Specification {
+    def objectUnderTest = new NetworkCmProxyConfig()
+
+    def 'NetworkCmProxy configuration has a Docket API.'() {
+        expect: 'the NetworkCmProxy configuration has a Docket API'
+            objectUnderTest.api() instanceof Docket
+    }
+}
diff --git a/cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/rest/controller/NetworkCmProxyControllerSpec.groovy b/cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/rest/controller/NetworkCmProxyControllerSpec.groovy
new file mode 100644
index 0000000..aa9fa86
--- /dev/null
+++ b/cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/rest/controller/NetworkCmProxyControllerSpec.groovy
@@ -0,0 +1,138 @@
+/*
+ *  ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 Pantheon.tech
+ *  Modification Copyright (C) 2021 highstreet technologies GmbH
+ *  Modification Copyright (C) 2021 Nordix Foundation
+ *  ================================================================================
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ *  SPDX-License-Identifier: Apache-2.0
+ *  ============LICENSE_END=========================================================
+ */
+
+package org.onap.cps.ncmp.rest.controller
+
+
+import com.google.gson.Gson
+import org.onap.cps.ncmp.api.NetworkCmProxyDataService
+import org.onap.cps.spi.model.DataNodeBuilder
+import org.spockframework.spring.SpringBean
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.beans.factory.annotation.Value
+import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest
+import org.springframework.http.HttpStatus
+import org.springframework.http.MediaType
+import org.springframework.test.web.servlet.MockMvc
+import spock.lang.Specification
+import spock.lang.Unroll
+
+import static org.onap.cps.spi.FetchDescendantsOption.INCLUDE_ALL_DESCENDANTS
+import static org.onap.cps.spi.FetchDescendantsOption.OMIT_DESCENDANTS
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*
+
+@WebMvcTest
+class NetworkCmProxyControllerSpec extends Specification {
+
+    @Autowired
+    MockMvc mvc
+
+    @SpringBean
+    NetworkCmProxyDataService mockNetworkCmProxyDataService = Mock()
+
+    @Value('${rest.api.ncmp-base-path}')
+    def basePath
+
+    def dataNodeBaseEndpoint
+
+    def setup() {
+        dataNodeBaseEndpoint = "$basePath/v1"
+    }
+
+    def cmHandle = 'some handle'
+    def xpath = 'some xpath'
+
+    @Unroll
+    def 'Query data node by cps path for the given cm handle with #scenario.'() {
+        given: 'service method returns a list containing a data node'
+            def dataNode = new DataNodeBuilder().withXpath('/xpath').build()
+            def cpsPath = 'some cps-path'
+            mockNetworkCmProxyDataService.queryDataNodes(cmHandle, cpsPath, expectedCpsDataServiceOption) >> [dataNode]
+        and: 'the query endpoint'
+            def dataNodeEndpoint = "$dataNodeBaseEndpoint/cm-handles/$cmHandle/nodes/query"
+        when: 'query data nodes API is invoked'
+            def response = mvc.perform(get(dataNodeEndpoint)
+                    .param('cps-path', cpsPath)
+                    .param('include-descendants', includeDescendantsOption))
+                    .andReturn().response
+        then: 'the response contains the the datanode in json format'
+            response.status == HttpStatus.OK.value()
+            def expectedJsonContent = new Gson().toJson(dataNode)
+            response.getContentAsString().contains(expectedJsonContent)
+        where: 'the following options for include descendants are provided in the request'
+            scenario                   | includeDescendantsOption || expectedCpsDataServiceOption
+            'no descendants by default'| ''                       || OMIT_DESCENDANTS
+            'no descendant explicitly' | 'false'                  || OMIT_DESCENDANTS
+            'descendants'              | 'true'                   || INCLUDE_ALL_DESCENDANTS
+    }
+
+    def 'Update data node leaves.'() {
+        given: 'json data'
+            def jsonData = 'json data'
+        and: 'the query endpoint'
+            def endpoint = "$dataNodeBaseEndpoint/cm-handles/$cmHandle/nodes"
+        when: 'patch request is performed'
+            def response = mvc.perform(
+                    patch(endpoint)
+                            .contentType(MediaType.APPLICATION_JSON)
+                            .content(jsonData)
+                            .param('xpath', xpath)
+            ).andReturn().response
+        then: 'the service method is invoked once with expected parameters'
+            1 * mockNetworkCmProxyDataService.updateNodeLeaves(cmHandle, xpath, jsonData)
+        and: 'response status indicates success'
+            response.status == HttpStatus.OK.value()
+    }
+
+    def 'Replace data node tree.'() {
+        given: 'json data'
+            def jsonData = 'json data'
+        and: 'the query endpoint'
+            def endpoint = "$dataNodeBaseEndpoint/cm-handles/$cmHandle/nodes"
+        when: 'put request is performed'
+            def response = mvc.perform(
+                    put(endpoint)
+                            .contentType(MediaType.APPLICATION_JSON)
+                            .content(jsonData)
+                            .param('xpath', xpath)
+            ).andReturn().response
+        then: 'the service method is invoked once with expected parameters'
+            1 * mockNetworkCmProxyDataService.replaceNodeTree(cmHandle, xpath, jsonData)
+        and: 'response status indicates success'
+            response.status == HttpStatus.OK.value()
+    }
+
+    def 'Get data node.'() {
+        given: 'the service returns a data node'
+            def xpath = 'some xpath'
+            def dataNode = new DataNodeBuilder().withXpath(xpath).withLeaves(["leaf": "value"]).build()
+            mockNetworkCmProxyDataService.getDataNode(cmHandle, xpath, OMIT_DESCENDANTS) >> dataNode
+        and: 'the query endpoint'
+            def endpoint = "$dataNodeBaseEndpoint/cm-handles/$cmHandle/node"
+        when: 'get request is performed through REST API'
+            def response = mvc.perform(get(endpoint).param('xpath', xpath)).andReturn().response
+        then: 'a success response is returned'
+            response.status == HttpStatus.OK.value()
+        and: 'response contains expected leaf and value'
+            response.contentAsString.contains('"leaf":"value"')
+    }
+}
+
diff --git a/cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/rest/exceptions/NetworkCmProxyRestExceptionHandlerSpec.groovy b/cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/rest/exceptions/NetworkCmProxyRestExceptionHandlerSpec.groovy
new file mode 100644
index 0000000..8153eeb
--- /dev/null
+++ b/cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/rest/exceptions/NetworkCmProxyRestExceptionHandlerSpec.groovy
@@ -0,0 +1,98 @@
+/*
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 highstreet technologies GmbH
+ *  Modification Copyright (C) 2021 Nordix Foundation
+ *  ================================================================================
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ *  SPDX-License-Identifier: Apache-2.0
+ *  ============LICENSE_END=========================================================
+ */
+
+package org.onap.cps.ncmp.rest.exceptions
+
+import groovy.json.JsonSlurper
+import org.onap.cps.ncmp.api.NetworkCmProxyDataService
+import org.onap.cps.spi.FetchDescendantsOption
+import org.onap.cps.spi.exceptions.CpsException
+import org.spockframework.spring.SpringBean
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.beans.factory.annotation.Value
+import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest
+import org.springframework.test.web.servlet.MockMvc
+import spock.lang.Shared
+import spock.lang.Specification
+
+import static org.springframework.http.HttpStatus.INTERNAL_SERVER_ERROR
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get
+
+@WebMvcTest
+class NetworkCmProxyRestExceptionHandlerSpec extends Specification {
+
+    @Autowired
+    MockMvc mvc
+
+    @SpringBean
+    NetworkCmProxyDataService mockNetworkCmProxyDataService = Mock()
+
+    @Value('${rest.api.ncmp-base-path}')
+    def basePath
+
+    def dataNodeBaseEndpoint
+
+    @Shared
+    def errorMessage = 'some error message'
+    @Shared
+    def errorDetails = 'some error details'
+
+    def cmHandle = 'some handle'
+    def xpath = 'some xpath'
+
+    def setup() {
+        dataNodeBaseEndpoint = "$basePath/v1"
+    }
+
+    def 'Get request with runtime exception returns HTTP Status Internal Server Error.'() {
+        when: 'runtime exception is thrown by the service'
+            setupTestException(new IllegalStateException(errorMessage))
+            def response = performTestRequest()
+        then: 'an HTTP Internal Server Error response is returned with correct message and details'
+            assertTestResponse(response, INTERNAL_SERVER_ERROR, errorMessage, null)
+    }
+
+    def 'Get request with generic CPS exception returns HTTP Status Internal Server Error.'() {
+        when: 'generic CPS exception is thrown by the service'
+            setupTestException(new CpsException(errorMessage, errorDetails))
+            def response = performTestRequest()
+        then: 'an HTTP Internal Server Error response is returned with correct message and details'
+            assertTestResponse(response, INTERNAL_SERVER_ERROR, errorMessage, errorDetails)
+    }
+
+    def setupTestException(exception) {
+        mockNetworkCmProxyDataService.getDataNode(cmHandle, xpath, FetchDescendantsOption.OMIT_DESCENDANTS) >>
+                { throw exception}
+    }
+
+    def performTestRequest() {
+        return mvc.perform(get("$dataNodeBaseEndpoint/cm-handles/$cmHandle/node").param('xpath', xpath))
+                .andReturn().response
+    }
+
+    static void assertTestResponse(response, expectedStatus,expectedErrorMessage,
+                                   expectedErrorDetails) {
+        assert response.status == expectedStatus.value()
+        def content = new JsonSlurper().parseText(response.contentAsString)
+        assert content['status'] == expectedStatus.toString()
+        assert content['message'] == expectedErrorMessage
+        assert expectedErrorDetails == null || content['details'] == expectedErrorDetails
+    }
+}
diff --git a/cps-ncmp-rest/src/test/java/org/onap/cps/TestApplication.java b/cps-ncmp-rest/src/test/java/org/onap/cps/TestApplication.java
new file mode 100644
index 0000000..5e0e367
--- /dev/null
+++ b/cps-ncmp-rest/src/test/java/org/onap/cps/TestApplication.java
@@ -0,0 +1,30 @@
+/*
+ *  ============LICENSE_START=======================================================
+ *  Copyright (C) 2020 Pantheon.tech
+ *  ================================================================================
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ *  SPDX-License-Identifier: Apache-2.0
+ *  ============LICENSE_END=========================================================
+ */
+
+package org.onap.cps;
+
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+/**
+ * The @SpringBootApplication annotated class is required in order to run tests
+ * marked with @SpringBootTest annotation.
+ */
+@SpringBootApplication
+public class TestApplication {
+}
diff --git a/cps-ncmp-rest/src/test/resources/application.yml b/cps-ncmp-rest/src/test/resources/application.yml
new file mode 100644
index 0000000..14ccf06
--- /dev/null
+++ b/cps-ncmp-rest/src/test/resources/application.yml
@@ -0,0 +1,21 @@
+#  ============LICENSE_START=======================================================
+#  Copyright (C) 2021 Nordix Foundation
+#  ================================================================================
+#  Licensed under the Apache License, Version 2.0 (the "License");
+#  you may not use this file except in compliance with the License.
+#  You may obtain a copy of the License at
+#
+#        http://www.apache.org/licenses/LICENSE-2.0
+#  Unless required by applicable law or agreed to in writing, software
+#  distributed under the License is distributed on an "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#  See the License for the specific language governing permissions and
+#  limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+#  ============LICENSE_END=========================================================
+
+rest:
+    api:
+        ncmp-base-path: /cps-ncmp/api
+spring:
\ No newline at end of file
