diff --git a/cps-ncmp-rest/docs/openapi/components.yaml b/cps-ncmp-rest/docs/openapi/components.yaml
index 26d55bf..9921041 100644
--- a/cps-ncmp-rest/docs/openapi/components.yaml
+++ b/cps-ncmp-rest/docs/openapi/components.yaml
@@ -29,14 +29,33 @@
           type: string
         details:
           type: string
-    MultipartFile:
-      required:
-        - file
+
+    RestDmiPluginRegistration:
+      type: object
       properties:
-        multipartFile:
+        dmiPlugin:
           type: string
-          description: multipartFile
-          format: binary
+          example: onap-dmi-plugin
+        createdCmHandles:
+          type: array
+          items:
+            $ref: '#/components/schemas/RestCmHandle'
+
+    RestCmHandle:
+      required:
+        - cmHandle
+      type: object
+      properties:
+        cmHandle:
+          type: string
+          example: cmHandle123
+        cmHandleProperties:
+            $ref: '#/components/schemas/RestCmHandleAdditionalProperties'
+    RestCmHandleAdditionalProperties:
+        type: object
+        additionalProperties:
+            type: string
+            example: system-001
 
   parameters:
     cmHandleInPath:
@@ -124,10 +143,7 @@
             type: object
     Created:
       description: Created
-      content:
-        text/plain:
-          schema:
-            type: string
+      content: {}
     NoContent:
       description: No Content
       content: {}
diff --git a/cps-ncmp-rest/docs/openapi/ncmproxy.yml b/cps-ncmp-rest/docs/openapi/ncmproxy.yml
index 6ed4f02..3ec7bfd 100755
--- a/cps-ncmp-rest/docs/openapi/ncmproxy.yml
+++ b/cps-ncmp-rest/docs/openapi/ncmproxy.yml
@@ -20,6 +20,7 @@
 nodeByCmHandleAndXpath:
   get:
     description: Get a node with an option to retrieve all the children for a given cm Handle
+    deprecated: true
     tags:
       - network-cm-proxy
     summary: Get a node given a cm Handle and xpath
@@ -43,6 +44,7 @@
 nodesByCmHandleAndCpsPath:
   get:
     description: Query nodes for the given cps path and cm Handle
+    deprecated: true
     tags:
       - network-cm-proxy
     summary: Query data nodes
@@ -66,6 +68,7 @@
 nodesByCmHandleAndXpath:
   post:
     description: Create a node with descendants for the given CM Handle; top level or under existing node (requires xpath)
+    deprecated: true
     tags:
       - network-cm-proxy
     summary: Create a node with descendants
@@ -93,6 +96,7 @@
 
   patch:
     description: Update node leaves for the given cps path and cm Handle
+    deprecated: true
     tags:
       - network-cm-proxy
     summary: Update node leaves
@@ -120,6 +124,7 @@
 
   put:
     description: Replace a node with descendants for the given cps path and cm Handle
+    deprecated: true
     tags:
       - network-cm-proxy
     summary: Replace a node with descendants
@@ -148,6 +153,7 @@
 listNodeByCmHandleAndXpath:
   post:
     description: Add one or more list-node child elements under existing node for the given CM Handle
+    deprecated: true
     tags:
       - network-cm-proxy
     summary: Add list-node child element(s)
@@ -172,3 +178,26 @@
         $ref: 'components.yaml#/components/responses/Forbidden'
       404:
         $ref: 'components.yaml#/components/responses/NotFound'
+
+updateDmiRegistration:
+  post:
+    description: Register a DMI Plugin with any new CM Handles.
+    tags:
+      - network-cm-proxy
+    summary: DMI notifies NCMP of new CM Handles
+    operationId: updateDmiPluginRegistration
+    requestBody:
+      required: true
+      content:
+        application/json:
+          schema:
+            $ref: 'components.yaml#/components/schemas/RestDmiPluginRegistration'
+    responses:
+      201:
+        $ref: 'components.yaml#/components/responses/Created'
+      400:
+        $ref: 'components.yaml#/components/responses/BadRequest'
+      401:
+        $ref: 'components.yaml#/components/responses/Unauthorized'
+      403:
+        $ref: 'components.yaml#/components/responses/Forbidden'
\ No newline at end of file
diff --git a/cps-ncmp-rest/docs/openapi/openapi.yml b/cps-ncmp-rest/docs/openapi/openapi.yml
index c77f9a7..64de922 100755
--- a/cps-ncmp-rest/docs/openapi/openapi.yml
+++ b/cps-ncmp-rest/docs/openapi/openapi.yml
@@ -36,3 +36,6 @@
 
   /v1/cm-handles/{cm-handle}/nodes:
     $ref: 'ncmproxy.yml#/nodesByCmHandleAndXpath'
+
+  /ncmp-dmi/v1/ch:
+    $ref: 'ncmproxy.yml#/updateDmiRegistration'
\ 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
index 484a21a..e9e0223 100755
--- 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
@@ -21,46 +21,75 @@
 
 package org.onap.cps.ncmp.rest.controller;
 
+
+import com.fasterxml.jackson.databind.ObjectMapper;
 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.api.models.DmiPluginRegistration;
 import org.onap.cps.ncmp.rest.api.NetworkCmProxyApi;
+import org.onap.cps.ncmp.rest.model.RestDmiPluginRegistration;
 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();
 
-    @Autowired
-    private NetworkCmProxyDataService networkCmProxyDataService;
+    private final NetworkCmProxyDataService networkCmProxyDataService;
 
+    private final ObjectMapper objectMapper;
+
+    /**
+     * Constructor Injection for Dependencies.
+     * @param networkCmProxyDataService Data Service Interface
+     * @param objectMapper Object Mapper
+     */
+    public NetworkCmProxyController(final NetworkCmProxyDataService networkCmProxyDataService,
+        final ObjectMapper objectMapper) {
+        this.networkCmProxyDataService = networkCmProxyDataService;
+        this.objectMapper = objectMapper;
+    }
+
+    /**
+     * Create Node.
+     * @deprecated This Method is no longer used as part of NCMP.
+     */
     @Override
-    public ResponseEntity<String> createNode(final String jsonData, final String cmHandle,
+    @Deprecated(forRemoval = false)
+    public ResponseEntity<Void> createNode(final String jsonData, final String cmHandle,
         final String parentNodeXpath) {
         networkCmProxyDataService.createDataNode(cmHandle, parentNodeXpath, jsonData);
         return new ResponseEntity<>(HttpStatus.CREATED);
     }
 
+    /**
+     * Add List-node Child Element.
+     * @deprecated This Method is no longer used as part of NCMP.
+     */
     @Override
-    public ResponseEntity<String> addListNodeElements(final String jsonData, final String parentNodeXpath,
+    @Deprecated(forRemoval = false)
+    public ResponseEntity<Void> addListNodeElements(final String jsonData, final String parentNodeXpath,
         final String cmHandle) {
         networkCmProxyDataService.addListNodeElements(cmHandle, parentNodeXpath, jsonData);
         return new ResponseEntity<>(HttpStatus.CREATED);
     }
 
+    /**
+     * Get Node By CM Handle and X-Path.
+     * @deprecated This Method is no longer used as part of NCMP.
+     */
     @Override
+    @Deprecated(forRemoval = false)
     public ResponseEntity<Object> getNodeByCmHandleAndXpath(final String cmHandle, @Valid final String xpath,
         @Valid final Boolean includeDescendants) {
         final FetchDescendantsOption fetchDescendantsOption = Boolean.TRUE.equals(includeDescendants)
@@ -69,7 +98,25 @@
         return new ResponseEntity<>(DataMapUtils.toDataMap(dataNode), HttpStatus.OK);
     }
 
+    /**
+     * Update DMI Plugin Registration (used for first registration also).
+     * @param restDmiPluginRegistration the registration data
+     */
     @Override
+    public ResponseEntity<Void> updateDmiPluginRegistration(
+        final @Valid RestDmiPluginRegistration restDmiPluginRegistration) {
+        final DmiPluginRegistration dmiPluginRegistration =
+            convertRestObjectToJavaApiObject(restDmiPluginRegistration);
+        networkCmProxyDataService.updateDmiPluginRegistration(dmiPluginRegistration);
+        return new ResponseEntity<>(HttpStatus.CREATED);
+    }
+
+    /**
+     * Query Data Nodes.
+     * @deprecated This Method is no longer used as part of NCMP.
+     */
+    @Override
+    @Deprecated(forRemoval = false)
     public ResponseEntity<Object> queryNodesByCmHandleAndCpsPath(final String cmHandle, @Valid final String cpsPath,
         @Valid final Boolean includeDescendants) {
         final FetchDescendantsOption fetchDescendantsOption = Boolean.TRUE.equals(includeDescendants)
@@ -79,17 +126,34 @@
         return new ResponseEntity<>(GSON.toJson(dataNodes), HttpStatus.OK);
     }
 
+    /**
+     * Replace Node With Descendants.
+     * @deprecated This Method is no longer used as part of NCMP.
+     */
     @Override
+    @Deprecated(forRemoval = false)
     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);
     }
 
+    /**
+     * Update Node Leaves.
+     * @deprecated This Method is no longer used as part of NCMP.
+     */
     @Override
+    @Deprecated(forRemoval = false)
     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);
     }
+
+
+    private DmiPluginRegistration convertRestObjectToJavaApiObject(
+        final RestDmiPluginRegistration restDmiPluginRegistration) {
+        return objectMapper.convertValue(restDmiPluginRegistration, DmiPluginRegistration.class);
+    }
+
 }
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
index 45e8f11..f537980 100644
--- 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
@@ -28,7 +28,9 @@
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put
 
+import com.fasterxml.jackson.databind.ObjectMapper
 import com.google.gson.Gson
+import org.onap.cps.TestUtils
 import org.onap.cps.ncmp.api.NetworkCmProxyDataService
 import org.onap.cps.spi.model.DataNodeBuilder
 import org.spockframework.spring.SpringBean
@@ -49,13 +51,19 @@
     @SpringBean
     NetworkCmProxyDataService mockNetworkCmProxyDataService = Mock()
 
+    @SpringBean
+    ObjectMapper objectMapper = new ObjectMapper()
+
     @Value('${rest.api.ncmp-base-path}')
     def basePath
 
-    def dataNodeBaseEndpoint
+    def deprecatedDataNodeBaseEndPoint
+
+    def ncmpDmiEndpoint
 
     def setup() {
-        dataNodeBaseEndpoint = "$basePath/v1"
+        deprecatedDataNodeBaseEndPoint = "$basePath/v1"
+        ncmpDmiEndpoint = "$basePath/ncmp-dmi/v1"
     }
 
     def cmHandle = 'some handle'
@@ -67,7 +75,7 @@
             def cpsPath = 'some cps-path'
             mockNetworkCmProxyDataService.queryDataNodes(cmHandle, cpsPath, expectedCpsDataServiceOption) >> [dataNode]
         and: 'the query endpoint'
-            def dataNodeEndpoint = "$dataNodeBaseEndpoint/cm-handles/$cmHandle/nodes/query"
+            def dataNodeEndpoint = "$deprecatedDataNodeBaseEndPoint/cm-handles/$cmHandle/nodes/query"
         when: 'query data nodes API is invoked'
             def response = mvc.perform(get(dataNodeEndpoint)
                     .param('cps-path', cpsPath)
@@ -89,7 +97,7 @@
             def jsonData = 'json data'
         when: 'post request is performed'
             def response = mvc.perform(
-                    post("$dataNodeBaseEndpoint/cm-handles/$cmHandle/nodes")
+                    post("$deprecatedDataNodeBaseEndPoint/cm-handles/$cmHandle/nodes")
                             .contentType(MediaType.APPLICATION_JSON)
                             .content(jsonData)
                             .param('xpath', reqXpath)
@@ -111,7 +119,7 @@
             def parentNodeXpath = 'parent node xpath'
         when: 'post request is performed'
             def response = mvc.perform(
-                    post("$dataNodeBaseEndpoint/cm-handles/$cmHandle/list-node")
+                    post("$deprecatedDataNodeBaseEndPoint/cm-handles/$cmHandle/list-node")
                             .contentType(MediaType.APPLICATION_JSON)
                             .content(jsonData)
                             .param('xpath', parentNodeXpath)
@@ -126,7 +134,7 @@
         given: 'json data'
             def jsonData = 'json data'
         and: 'the query endpoint'
-            def endpoint = "$dataNodeBaseEndpoint/cm-handles/$cmHandle/nodes"
+            def endpoint = "$deprecatedDataNodeBaseEndPoint/cm-handles/$cmHandle/nodes"
         when: 'patch request is performed'
             def response = mvc.perform(
                     patch(endpoint)
@@ -144,7 +152,7 @@
         given: 'json data'
             def jsonData = 'json data'
         and: 'the query endpoint'
-            def endpoint = "$dataNodeBaseEndpoint/cm-handles/$cmHandle/nodes"
+            def endpoint = "$deprecatedDataNodeBaseEndPoint/cm-handles/$cmHandle/nodes"
         when: 'put request is performed'
             def response = mvc.perform(
                     put(endpoint)
@@ -164,7 +172,7 @@
             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"
+            def endpoint = "$deprecatedDataNodeBaseEndPoint/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'
@@ -172,5 +180,21 @@
         and: 'response contains expected leaf and value'
             response.contentAsString.contains('"leaf":"value"')
     }
+
+    def 'Register CM Handle Event' () {
+        given: 'jsonData'
+            def jsonData = TestUtils.getResourceFileContent('dmi-registration.json')
+        when: 'post request is performed'
+            def response = mvc.perform(
+                post("$ncmpDmiEndpoint/ch")
+                .contentType(MediaType.APPLICATION_JSON)
+                .content(jsonData)
+            ).andReturn().response
+        then: 'the cm handles are registered with the service'
+            1 * mockNetworkCmProxyDataService.updateDmiPluginRegistration(_)
+        and: 'response status is created'
+            response.status == HttpStatus.CREATED.value()
+    }
+
 }
 
diff --git a/cps-ncmp-rest/src/test/java/org/onap/cps/TestUtils.java b/cps-ncmp-rest/src/test/java/org/onap/cps/TestUtils.java
new file mode 100644
index 0000000..4a6f5e5
--- /dev/null
+++ b/cps-ncmp-rest/src/test/java/org/onap/cps/TestUtils.java
@@ -0,0 +1,54 @@
+/*
+ * ============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=========================================================
+ */
+
+package org.onap.cps;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+
+/**
+ * Common convenience methods for testing.
+ */
+public class TestUtils {
+
+    /**
+     * Convert a file in the test resource folder to file.
+     *
+     * @param filename to name of the file in test/resources
+     * @return the file
+     * @throws IOException when there is an IO issue
+     */
+    public static File readFile(final String filename) {
+        return new File(ClassLoader.getSystemClassLoader().getResource(filename).getFile());
+    }
+
+    /**
+     * Convert a file in the test resource folder to a string.
+     *
+     * @param filename to name of the file in test/resources
+     * @return the content of the file as a String
+     * @throws IOException when there is an IO issue
+     */
+    public static String getResourceFileContent(final String filename) throws IOException {
+        final File file = readFile(filename);
+        return new String(Files.readAllBytes(file.toPath()));
+    }
+}
diff --git a/cps-ncmp-rest/src/test/resources/dmi-registration.json b/cps-ncmp-rest/src/test/resources/dmi-registration.json
new file mode 100644
index 0000000..24bc9f9
--- /dev/null
+++ b/cps-ncmp-rest/src/test/resources/dmi-registration.json
@@ -0,0 +1,11 @@
+{
+  "dmiPlugin": "onap-dmi-plugin",
+  "createdCmHandles": [
+    {
+      "cmHandle": "example-name",
+      "cmHandleProperties": {
+          "subSystemId" : "system-001"
+        }
+    }
+  ]
+}
\ No newline at end of file
