diff --git a/apps/config/src/main/java/org/onosproject/config/ResourceIdParser.java b/apps/config/src/main/java/org/onosproject/config/ResourceIdParser.java
index 802e682..6bcdecc 100755
--- a/apps/config/src/main/java/org/onosproject/config/ResourceIdParser.java
+++ b/apps/config/src/main/java/org/onosproject/config/ResourceIdParser.java
@@ -17,6 +17,7 @@
 
 import java.util.Iterator;
 
+import java.util.LinkedList;
 import java.util.List;
 
 import org.onosproject.yang.model.KeyLeaf;
@@ -46,12 +47,6 @@
 
     }
 
-    public static ResourceId getParent(ResourceId path) {
-        int last = path.nodeKeys().size();
-        path.nodeKeys().remove(last - 1);
-        return path;
-    }
-
     public static NodeKey getInstanceKey(ResourceId path) {
         int last = path.nodeKeys().size();
         NodeKey ret = path.nodeKeys().get(last - 1);
@@ -92,7 +87,6 @@
         return ret;
     }
 
-
     public static String appendMultiInstKey(String path, String leaf) {
         return (path + leaf.substring(leaf.indexOf(KEY_SEP)));
     }
@@ -161,7 +155,14 @@
         if (path == null) {
             return bldr.toString();
         }
-        List<NodeKey> nodeKeyList = path.nodeKeys();
+        List<NodeKey> nodeKeyList = new LinkedList<>();
+        Iterator<NodeKey> itr = path.nodeKeys().iterator();
+        while (itr.hasNext()) {
+            nodeKeyList.add(itr.next());
+        }
+        if (nodeKeyList.get(0).schemaId().name().compareTo("/") == 0) {
+            nodeKeyList.remove(0);
+        }
         for (NodeKey key : nodeKeyList) {
             bldr.append(EL_SEP);
             if (key instanceof LeafListKey) {
diff --git a/apps/config/src/main/java/org/onosproject/config/impl/DistributedDynamicConfigStore.java b/apps/config/src/main/java/org/onosproject/config/impl/DistributedDynamicConfigStore.java
index d1359e3..a1287a2 100644
--- a/apps/config/src/main/java/org/onosproject/config/impl/DistributedDynamicConfigStore.java
+++ b/apps/config/src/main/java/org/onosproject/config/impl/DistributedDynamicConfigStore.java
@@ -56,7 +56,6 @@
 import org.slf4j.LoggerFactory;
 
 import java.math.BigInteger;
-import java.util.List;
 import java.util.Map;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ExecutionException;
@@ -125,11 +124,6 @@
     public CompletableFuture<Boolean>
     addNode(ResourceId complete, DataNode node) {
         CompletableFuture<Boolean> eventFuture = CompletableFuture.completedFuture(true);
-        List<NodeKey> nodeKeyList = complete.nodeKeys();
-        NodeKey f = nodeKeyList.get(0);
-        if (f.schemaId().name().compareTo("/") == 0) {
-            nodeKeyList.remove(0);
-        }
         String spath = ResourceIdParser.parseResId(complete);
         if (spath == null) {
             throw new FailedException("Invalid RsourceId, cannot create Node");
@@ -211,11 +205,6 @@
     @Override
     public CompletableFuture<DataNode> readNode(ResourceId path, Filter filter) {
         CompletableFuture<DataNode> eventFuture = CompletableFuture.completedFuture(null);
-        List<NodeKey> nodeKeyList = path.nodeKeys();
-        NodeKey f = nodeKeyList.get(0);
-        if (f.schemaId().name().compareTo("/") == 0) {
-            nodeKeyList.remove(0);
-        }
         String spath = ResourceIdParser.parseResId(path);
         DocumentPath dpath = DocumentPath.from(spath);
         DataNode.Type type = null;
@@ -339,11 +328,6 @@
     @Override
     public CompletableFuture<Boolean> updateNode(ResourceId complete, DataNode node) {
         CompletableFuture<Boolean> eventFuture = CompletableFuture.completedFuture(true);
-        List<NodeKey> nodeKeyList = complete.nodeKeys();
-        NodeKey f = nodeKeyList.get(0);
-        if (f.schemaId().name().compareTo("/") == 0) {
-            nodeKeyList.remove(0);
-        }
         String spath = ResourceIdParser.parseResId(complete);
         if (spath == null) {
             throw new FailedException("Invalid RsourceId, cannot update Node");
@@ -361,11 +345,6 @@
     @Override
     public CompletableFuture<Boolean> nodeExist(ResourceId complete) {
         Boolean stat = true;
-        List<NodeKey> nodeKeyList = complete.nodeKeys();
-        NodeKey f = nodeKeyList.get(0);
-        if (f.schemaId().name().compareTo("/") == 0) {
-            nodeKeyList.remove(0);
-        }
         String spath = ResourceIdParser.parseResId(complete);
         if (spath == null) {
             stat = false;
@@ -423,14 +402,9 @@
 
     @Override
     public CompletableFuture<Boolean> deleteNodeRecursive(ResourceId path) {
-        List<NodeKey> nodeKeyList = path.nodeKeys();
-        NodeKey f = nodeKeyList.get(0);
-        if (f.schemaId().name().compareTo("/") == 0) {
-            nodeKeyList.remove(0);
-        }
         String spath = ResourceIdParser.parseResId(path);
         if (spath == null) {
-            throw new FailedException("Invalid RsourceId, cannot create Node");
+            throw new FailedException("Invalid RsourceId, cannot delete Node");
         }
         if (spath.compareTo(ResourceIdParser.ROOT) == 0) {
             throw new FailedException("Cannot delete Root");
