diff --git a/cli/cli/c_actions.py b/cli/cli/c_actions.py
index 17e41b5..a7b95b5 100755
--- a/cli/cli/c_actions.py
+++ b/cli/cli/c_actions.py
@@ -175,18 +175,6 @@
     
     
 
-    if not detail:
-        detail = data.get('detail', 'default')
-    url = "http://%s/rest/v1/" % sdnsh.controller + (select_url % data)
-
-    result = sdnsh.store.rest_simple_request(url)
-    check_rest_result(result)
-    if sdnsh.description:   # description debugging
-        print "command_display_rest: result ", result
-    entries = json.loads(result)
-    
-    
-
 def write_fields(obj_type, obj_id, data):
     """
     Typical action to update fields of a row in the model
diff --git a/src/main/java/net/onrc/onos/core/drivermanager/OFSwitchImplCPqD13.java b/src/main/java/net/onrc/onos/core/drivermanager/OFSwitchImplCPqD13.java
index cae7d41..5bd8e08 100644
--- a/src/main/java/net/onrc/onos/core/drivermanager/OFSwitchImplCPqD13.java
+++ b/src/main/java/net/onrc/onos/core/drivermanager/OFSwitchImplCPqD13.java
@@ -1681,7 +1681,7 @@
         }
     }
 
-    private void createIndirectGroup(int groupId, MacAddress srcMac,
+    private EcmpInfo createIndirectGroup(int groupId, MacAddress srcMac,
             MacAddress dstMac, PortNumber outPort, int gotoGroupNo,
             int mplsLabel, boolean bos) {
         List<BucketInfo> buckets = new ArrayList<BucketInfo>();
@@ -1694,7 +1694,7 @@
         log.debug(
                 "createIndirectGroup: Creating indirect group {} in sw {} "
                         + "with: {}", groupId, getStringId(), ecmpInfo);
-        return;
+        return ecmpInfo;
     }
 
     private EcmpInfo createInnermostLabelGroup(int innermostGroupId,
@@ -1713,7 +1713,7 @@
         EcmpInfo ecmpInfo = new EcmpInfo(innermostGroupId, buckets);
         setEcmpGroup(ecmpInfo);
         log.debug(
-                "createInnermostLabelGroup: Creating indirect group {} in sw {} "
+                "createInnermostLabelGroup: Creating select group {} in sw {} "
                         + "with: {}", innermostGroupId, getStringId(), ecmpInfo);
         return ecmpInfo;
     }
@@ -1792,10 +1792,11 @@
                 if (i == 0) {
                     /* Outermost label processing */
                     int currGroupId = groupid.incrementAndGet();
-                    createIndirectGroup(currGroupId,
+                    EcmpInfo indirectGroup = createIndirectGroup(currGroupId,
                             null, null, sp, -1,
                             labelStack.get(i).intValue(), false);
                     lastSetOfGroupIds.put(sp, currGroupId);
+                    userDefinedGroups.put(currGroupId, indirectGroup);
                 }
                 else if (i == (labelStack.size() - 1)) {
                     /* Innermost label processing */
@@ -1812,15 +1813,18 @@
                 else {
                     /* Middle label processing */
                     int currGroupId = groupid.incrementAndGet();
-                    createIndirectGroup(currGroupId,
+                    EcmpInfo indirectGroup = createIndirectGroup(currGroupId,
                             null, null, null,
                             lastSetOfGroupIds.get(sp),
                             labelStack.get(i).intValue(), false);
                     /* Overwrite with this iteration's group IDs */
                     lastSetOfGroupIds.put(sp, currGroupId);
+                    userDefinedGroups.put(currGroupId, indirectGroup);
                 }
             }
         }
+        log.debug("createGroup: group created with innermost group id {}",
+                innermostGroupId);
         return innermostGroupId;
     }
 
@@ -1847,7 +1851,27 @@
      * @return success/fail
      */
     public boolean removeGroup(int groupId) {
-        return false;
+        EcmpInfo group = userDefinedGroups.get(groupId);
+        if (group == null) {
+            log.warn("removeGroup: with invalid group id");
+            return false;
+        }
+        for (BucketInfo bucket : group.buckets) {
+            int currGroupIdToBeDeleted = bucket.groupNo;
+            while (currGroupIdToBeDeleted != -1) {
+                /* Assuming indirect groups with single buckets */
+                int nextGroupIdToBeDeleted =
+                        userDefinedGroups.get(currGroupIdToBeDeleted).
+                        buckets.get(0).groupNo;
+                deleteGroup(groupId);
+                userDefinedGroups.remove(currGroupIdToBeDeleted);
+                currGroupIdToBeDeleted = nextGroupIdToBeDeleted;
+            }
+        }
+
+        userDefinedGroups.remove(groupid);
+        log.debug("removeGroup: removed group with group id {}", groupId);
+        return true;
     }
 
     @Override
