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 e4fcb0e..dcc84fa 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
@@ -269,9 +269,9 @@
                 DocumentPath.from(spath));
         Map<String, Versioned<DataNode.Type>> entries = null;
         entries = complete(ret);
-        if ((entries == null) || (entries.size() == 0)) {
+        /*if ((entries == null) || (entries.size() == 0)) {
             throw new FailedException("Inner node cannot have empty children map");
-        }
+        }*/
         entries.forEach((k, v) -> {
             String[] names = k.split(ResourceIdParser.NM_CHK);
             String name = names[0];
@@ -338,6 +338,43 @@
         throw new FailedException("Not yet implemented");
     }
 
+    private void deleteInner(String spath) {
+        CompletableFuture<Map<String, Versioned<DataNode.Type>>> ret = keystore.getChildren(
+                DocumentPath.from(spath));
+        Map<String, Versioned<DataNode.Type>> entries = null;
+        entries = complete(ret);
+        /*if ((entries == null) || (entries.size() == 0)) {
+            throw new FailedException("Inner node cannot have empty children map");
+        }*/
+        entries.forEach((k, v) -> {
+            String[] names = k.split(ResourceIdParser.NM_CHK);
+            String name = names[0];
+            String nmSpc = ResourceIdParser.getNamespace(names[1]);
+            String keyVal = ResourceIdParser.getKeyVal(names[1]);
+            DataNode.Type type = v.value();
+            String tempPath = ResourceIdParser.appendNodeKey(spath, name, nmSpc);
+            if (type == DataNode.Type.SINGLE_INSTANCE_LEAF_VALUE_NODE) {
+                removeLeaf(tempPath);
+            } else if (type == DataNode.Type.MULTI_INSTANCE_LEAF_VALUE_NODE) {
+                String mlpath = ResourceIdParser.appendLeafList(tempPath, keyVal);
+                removeLeaf(mlpath);
+            } else if (type == DataNode.Type.SINGLE_INSTANCE_NODE) {
+                deleteInner(tempPath);
+            } else if (type == DataNode.Type.MULTI_INSTANCE_NODE) {
+                tempPath = ResourceIdParser.appendMultiInstKey(tempPath, k);
+                deleteInner(tempPath);
+            } else {
+                throw new FailedException("Invalid node type");
+            }
+        });
+        keystore.removeNode(DocumentPath.from(spath));
+    }
+
+    private void removeLeaf(String path) {
+        keystore.removeNode(DocumentPath.from(path));
+        objectStore.remove(path);
+    }
+
     @Override
     public CompletableFuture<Boolean> deleteNodeRecursive(ResourceId path) {
         List<NodeKey> nodeKeyList = path.nodeKeys();
@@ -346,19 +383,33 @@
             nodeKeyList.remove(0);
         }
         String spath = ResourceIdParser.parseResId(path);
+        if (spath == null) {
+            throw new FailedException("Invalid RsourceId, cannot create Node");
+        }
+        if (spath.compareTo(ResourceIdParser.ROOT) == 0) {
+            throw new FailedException("Cannot delete Root");
+        }
         DocumentPath dpath = DocumentPath.from(spath);
         DataNode.Type type = null;
-        CompletableFuture<Versioned<DataNode.Type>> vtype = keystore.removeNode(dpath);
-        type = completeVersioned(vtype);
+        CompletableFuture<Versioned<DataNode.Type>> ret = keystore.get(dpath);
+        type = completeVersioned(ret);
         if (type == null) {
-            throw new FailedException("Node delete failed");
+            throw new FailedException("Cannot delete, Requested node or some of the parents" +
+                    "are not present in the requested path");
         }
-        Versioned<LeafNode> res = objectStore.remove(spath);
-        if (res == null) {
-            return CompletableFuture.completedFuture(false);
+        DataNode retVal = null;
+        if (type == DataNode.Type.SINGLE_INSTANCE_LEAF_VALUE_NODE) {
+            removeLeaf(spath);
+        } else if (type == DataNode.Type.MULTI_INSTANCE_LEAF_VALUE_NODE) {
+            removeLeaf(spath);
+        } else if (type == DataNode.Type.SINGLE_INSTANCE_NODE) {
+            deleteInner(spath);
+        } else if (type == DataNode.Type.MULTI_INSTANCE_NODE) {
+            deleteInner(spath);
         } else {
-            return CompletableFuture.completedFuture(true);
+            throw new FailedException("Invalid node type");
         }
+        return CompletableFuture.completedFuture(true);
     }
 
     public class InternalDocTreeListener implements DocumentTreeListener<DataNode.Type> {
diff --git a/apps/netconf/client/src/main/java/org/onosproject/netconf/client/impl/NetconfActiveComponent.java b/apps/netconf/client/src/main/java/org/onosproject/netconf/client/impl/NetconfActiveComponent.java
index ae6b453..b1b2f33 100644
--- a/apps/netconf/client/src/main/java/org/onosproject/netconf/client/impl/NetconfActiveComponent.java
+++ b/apps/netconf/client/src/main/java/org/onosproject/netconf/client/impl/NetconfActiveComponent.java
@@ -269,22 +269,23 @@
                 //checkIfRelevant already filters only the relevant events
                 event = e;
                 checkNotNull(event, "process:Event cannot be null");
-                Filter filt = new Filter();
-                DataNode node = cfgService.readNode(event.subject(), filt);
-                DeviceId deviceId = getDeviceId(node);
-                if (!isMaster(deviceId)) {
-                    log.info("NetConfListener: not master, ignoring config for {}", event.type());
-                    return;
-                }
-                initiateConnection(deviceId);
                 switch (event.type()) {
                     case NODE_ADDED:
                     case NODE_UPDATED:
                     case NODE_REPLACED:
+                        Filter filt = new Filter();
+                        DataNode node = cfgService.readNode(event.subject(), filt);
+                        DeviceId deviceId = getDeviceId(node);
+                        if (!isMaster(deviceId)) {
+                            log.info("NetConfListener: not master, ignoring config for {}", event.type());
+                            return;
+                        }
+                        initiateConnection(deviceId);
                         configUpdate(node, deviceId, event.subject());
                         break;
                     case NODE_DELETED:
-                        configDelete(node, deviceId, event.subject());
+                        log.info("NetConfListener: RXD DELETE EVT for {}", event.type());
+                        //configDelete(null, null, event.subject());
                         break;
                     case UNKNOWN_OPRN:
                     default:
