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 7b7f5bd..23c107d 100755
--- a/apps/config/src/main/java/org/onosproject/config/ResourceIdParser.java
+++ b/apps/config/src/main/java/org/onosproject/config/ResourceIdParser.java
@@ -16,35 +16,199 @@
 package org.onosproject.config;
 
 import java.util.Iterator;
+
+import java.util.List;
+
+import org.onosproject.yang.model.KeyLeaf;
+import org.onosproject.yang.model.LeafListKey;
+import org.onosproject.yang.model.ListKey;
 import org.onosproject.yang.model.NodeKey;
 import org.onosproject.yang.model.ResourceId;
 
 /**
- * Representation of an entity which identifies a resource in the logical tree
- * data store. It is a list of node keys to identify the branch point
- * hierarchy to reach a resource in the instance tree.
+ * Utilities to work on the ResourceId.
  */
 
 public final class ResourceIdParser {
 
+    public static final String ROOT = "root";
+    public static final String NM_SEP = "#";
+    public static final String VAL_SEP = "@";
+    public static final String KEY_SEP = "$";
+    public static final String EL_SEP = ".";
+
+
+
     private ResourceIdParser() {
 
     }
-    public static String asString(ResourceId path) {
+
+    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);
+        if (ret instanceof NodeKey) {
+            return ret;
+        } else {
+            return null;
+        }
+    }
+
+    public static NodeKey getMultiInstanceKey(ResourceId path) {
+        int last = path.nodeKeys().size();
+        NodeKey ret = path.nodeKeys().get(last - 1);
+        if (ret instanceof ListKey) {
+            return ret;
+        } else {
+            return null;
+        }
+    }
+
+    public static String appendMultiInstKey(String path, String leaf) {
+        return (path + leaf.substring(leaf.indexOf(KEY_SEP)));
+    }
+
+    public static String appendKeyLeaf(String path, String key) {
+        return (path + EL_SEP + key);
+    }
+
+    //DONE
+    public static String appendKeyLeaf(String path, KeyLeaf key) {
         StringBuilder bldr = new StringBuilder();
-            bldr.append("root.");
-            Iterator<NodeKey> iter = path.nodeKeys().iterator();
-            NodeKey key;
-            while (iter.hasNext()) {
-                key = iter.next();
-                //log.info("Iter: key {}", key.toString());
-                bldr.append(key.schemaId().name());
-                bldr.append("#");
-                bldr.append(key.schemaId().namespace());
-                if (iter.hasNext()) {
-                    bldr.append(".");
-                }
-            }
+        bldr.append(key.leafSchema().name());
+        bldr.append(NM_SEP);
+        bldr.append(key.leafSchema().namespace());
+        bldr.append(NM_SEP);
+        bldr.append(key.leafValue().toString());
+        return (path + EL_SEP + bldr.toString());
+    }
+
+    public static String appendNodeKey(String path, NodeKey key) {
+        return (path + EL_SEP + key.schemaId().name() + NM_SEP + key.schemaId().namespace());
+    }
+
+    public static String appendNodeKey(String path, String name, String nmSpc) {
+        return (path + EL_SEP + name + NM_SEP + nmSpc);
+    }
+
+    public static String appendLeafList(String path, LeafListKey key) {
+        return (path + NM_SEP + key.asString());
+    }
+
+    public static String appendLeafList(String path, String val) {
+        return (path + NM_SEP + val);
+    }
+
+    public static String appendKeyList(String path, ListKey key) {
+        StringBuilder bldr = new StringBuilder();
+        for (KeyLeaf keyLeaf : key.keyLeafs()) {
+            bldr.append(KEY_SEP);
+            bldr.append(keyLeaf.leafSchema().name());
+            bldr.append(NM_SEP);
+            bldr.append(keyLeaf.leafSchema().namespace());
+            bldr.append(NM_SEP);
+            bldr.append(keyLeaf.leafValue().toString());
+        }
+        return (path + bldr.toString());
+    }
+
+    public static String parseNodeKey(NodeKey key) {
+        if (key == null) {
+            return null;
+        }
+        StringBuilder bldr = new StringBuilder();
+        if (key instanceof LeafListKey) {
+            parseLeafList((LeafListKey) key, bldr);
+        } else if (key instanceof ListKey) {
+            parseKeyList((ListKey) key, bldr);
+        } else {
+            parseNodeKey(key, bldr);
+        }
         return bldr.toString();
     }
+
+    public static String parseResId(ResourceId path) {
+        StringBuilder bldr = new StringBuilder();
+        bldr.append(ROOT);
+        if (path == null) {
+            return bldr.toString();
+        }
+        List<NodeKey> nodeKeyList = path.nodeKeys();
+        for (NodeKey key : nodeKeyList) {
+            bldr.append(EL_SEP);
+            if (key instanceof LeafListKey) {
+                parseLeafList((LeafListKey) key, bldr);
+            } else if (key instanceof ListKey) {
+                parseKeyList((ListKey) key, bldr);
+            } else {
+                parseNodeKey(key, bldr);
+            }
+        }
+        return bldr.toString();
+    }
+
+    private static void parseLeafList(LeafListKey key, StringBuilder bldr) {
+        bldr.append(key.schemaId().name());
+        bldr.append(NM_SEP);
+        bldr.append(key.schemaId().namespace());
+        bldr.append(NM_SEP);
+        bldr.append(key.asString());
+    }
+
+    private static void parseKeyList(ListKey key, StringBuilder bldr) {
+        bldr.append(key.schemaId().name());
+        bldr.append(NM_SEP);
+        bldr.append(key.schemaId().namespace());
+        bldr.append(NM_SEP);
+        Iterator<KeyLeaf> iter = key.keyLeafs().iterator();
+        KeyLeaf next;
+        while (iter.hasNext()) {
+            next = iter.next();
+            bldr.append(KEY_SEP);
+            bldr.append(next.leafSchema().name());
+            bldr.append(NM_SEP);
+            bldr.append(next.leafSchema().namespace());
+            bldr.append(NM_SEP);
+            bldr.append(next.leafValue().toString());
+        }
+    }
+
+    private static void parseNodeKey(NodeKey key, StringBuilder bldr) {
+        bldr.append(key.schemaId().name());
+        bldr.append(NM_SEP);
+        bldr.append(key.schemaId().namespace());
+    }
+
+    public static ResourceId getResId(List<String> dpath) {
+        ResourceId.Builder resBldr = new ResourceId.Builder();
+        Iterator<String> itr = dpath.iterator();
+        itr.next();
+        while (itr.hasNext()) {
+            String name = itr.next();
+            if (name.contains(VAL_SEP)) {
+                resBldr.addLeafListBranchPoint(name.substring(0, name.indexOf(NM_SEP)),
+                        name.substring(name.indexOf(NM_SEP) + 1, name.indexOf(VAL_SEP)),
+                        name.substring(name.indexOf(VAL_SEP) + 1));
+            } else if (name.contains(KEY_SEP)) {
+                resBldr.addBranchPointSchema(name.substring(0, name.indexOf(NM_SEP)),
+                        name.substring(name.indexOf(NM_SEP) + 1, name.indexOf(KEY_SEP)));
+                String[] keys = name.split(KEY_SEP);
+                for (int i = 1; i < keys.length; i++) {
+                    String key = keys[i];
+                    resBldr.addKeyLeaf(key.substring(0, key.indexOf(NM_SEP)),
+                            key.substring(key.indexOf(NM_SEP) + 1, key.lastIndexOf(NM_SEP)),
+                            key.substring(name.lastIndexOf(NM_SEP) + 1));
+                }
+            } else {
+                resBldr.addBranchPointSchema(name.substring(0, name.indexOf(NM_SEP)),
+                        name.substring(name.indexOf(NM_SEP) + 1));
+            }
+        }
+        return resBldr.build();
+    }
 }
\ No newline at end of file
