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 968f960..8ec1a73 100644
--- a/src/main/java/net/onrc/onos/core/drivermanager/OFSwitchImplCPqD13.java
+++ b/src/main/java/net/onrc/onos/core/drivermanager/OFSwitchImplCPqD13.java
@@ -131,7 +131,7 @@
     private SegmentRouterConfig srConfig;
     private ConcurrentMap<Dpid, Set<PortNumber>> neighbors;
     private ConcurrentMap<PortNumber, Dpid> portToNeighbors;
-    private List<Integer> edgeLabels;
+    private List<Integer> segmentIds;
     private boolean isEdgeRouter;
     private int sid;
     private ConcurrentMap<NeighborSet, EcmpInfo> ecmpGroups;
@@ -150,7 +150,7 @@
         ecmpGroups = new ConcurrentHashMap<NeighborSet, EcmpInfo>();
         portNeighborSetMap =
                 new ConcurrentHashMap<PortNumber, ArrayList<NeighborSet>>();
-        edgeLabels = new ArrayList<Integer>();
+        segmentIds = new ArrayList<Integer>();
         isEdgeRouter = false;
         this.usePipeline13 = usePipeline13;
     }
@@ -233,6 +233,9 @@
             /* Delete the first matched bucket */
             EcmpInfo portEcmpInfo = ecmpGroups.get(ns);
             Iterator<BucketInfo> it = portEcmpInfo.buckets.iterator();
+            log.debug("removePortFromGroups: Group {} on Switch {} has {} buckets",
+                    portEcmpInfo.groupId, getStringId(),
+                    portEcmpInfo.buckets.size());
             while (it.hasNext()) {
                 BucketInfo bucket = it.next();
                 if (bucket.outport.equals(port)) {
@@ -266,21 +269,42 @@
 
         Dpid neighborDpid = portToNeighbors.get(port);
         for (NeighborSet ns : portNSSet) {
-            /* Delete the first matched bucket */
             EcmpInfo portEcmpInfo = ecmpGroups.get(ns);
-            BucketInfo b = new BucketInfo(neighborDpid,
-                            MacAddress.of(srConfig.getRouterMac()),
-                            getNeighborRouterMacAddress(neighborDpid),
-                            port,
-                            ns.getEdgeLabel());
+            /* Find if this port is already part of any bucket
+             * in this group
+             * NOTE: This is needed because in some cases
+             * (such as for configured network nodes), both driver and
+             * application detect the network elements and creates the
+             * buckets in the same group. This check is to avoid
+             * duplicate bucket creation in such scenarios
+             */
             List<BucketInfo> buckets = portEcmpInfo.buckets;
             if (buckets == null) {
                 buckets = new ArrayList<BucketInfo>();
-                buckets.add(b);
                 portEcmpInfo.buckets = buckets;
             } else {
-                buckets.add(b);
+                Iterator<BucketInfo> it = buckets.iterator();
+                boolean matchingBucketExist = false;
+                while (it.hasNext()) {
+                    BucketInfo bucket = it.next();
+                    if (bucket.outport.equals(port)) {
+                        matchingBucketExist = true;
+                        break;
+                    }
+                }
+                if (matchingBucketExist) {
+                    log.warn("addPortToGroups: On Switch {} duplicate "
+                            + "portAdd is called for port {} with buckets {}",
+                            getStringId(), port, buckets);
+                    continue;
+                }
             }
+            BucketInfo b = new BucketInfo(neighborDpid,
+                    MacAddress.of(srConfig.getRouterMac()),
+                    getNeighborRouterMacAddress(neighborDpid),
+                    port,
+                    ns.getEdgeLabel());
+            buckets.add(b);
             log.debug("addPortToGroups: Modifying Group on Switch {} "
                     + "and Neighborset {} with {}",
                     getStringId(), ns, portEcmpInfo);
@@ -562,7 +586,7 @@
 
         if (isEdgeRouter) {
             List<SwitchConfig> switchList = ncs.getConfiguredAllowedSwitches();
-            getAllEdgeLabels(switchList);
+            getAllNodeSegmentIds(switchList);
         }
     }
 
@@ -728,26 +752,26 @@
             portToNeighbors.put(portToNeighbor, neighborDpid);
     }
 
-    private void getAllEdgeLabels(List<SwitchConfig> switchList) {
+    private void getAllNodeSegmentIds(List<SwitchConfig> switchList) {
         for (SwitchConfig sc : switchList) {
             /* TODO: Do we need to check if the SwitchConfig is of
              * type SegmentRouter?
              */
-            if ((sc.getDpid() == getId()) ||
-                    (((SegmentRouterConfig) sc).isEdgeRouter() != true)) {
+            if (sc.getDpid() == getId()) {
                 continue;
             }
-            edgeLabels.add(((SegmentRouterConfig) sc).getNodeSid());
+            segmentIds.add(((SegmentRouterConfig) sc).getNodeSid());
         }
-        log.debug("getAllEdgeLabels: Node Labels found {}", edgeLabels);
+        log.debug("getAllNodeSegmentIds: at sw {} are {}",
+                getStringId(), segmentIds);
     }
 
-    private boolean isNodeLabelAndEdgeLabelSame(Dpid dpid, int edgeLabel) {
+    private boolean isSegmentIdSameAsNodeSegmentId(Dpid dpid, int sId) {
         INetworkConfigService ncs = floodlightProvider.getNetworkConfigService();
         SwitchConfigStatus scs = ncs.checkSwitchConfig(dpid);
         if (scs.getConfigState() == NetworkConfigState.ACCEPT_ADD) {
             return (((SegmentRouterConfig) scs.getSwitchConfig()).
-                    getNodeSid() == edgeLabel);
+                    getNodeSid() == sId);
         } else {
             // TODO: return false if router not allowed
             return false;
@@ -822,26 +846,23 @@
          * NOTE: Avoid any pairings of edge routers only
          */
         Set<Set<Dpid>> powerSet = getAllNeighborSets(dpids);
-        log.debug("The size of neighbor powerset for sw {} is ",
+        log.debug("createGroups: The size of neighbor powerset for sw {} is {}",
                 getStringId(), powerSet.size());
         Set<NeighborSet> nsSet = new HashSet<NeighborSet>();
         for (Set<Dpid> combo : powerSet) {
             if (combo.isEmpty())
                 continue;
-            if (isEdgeRouter && !edgeLabels.isEmpty()) {
-                for (Integer edgeLabel : edgeLabels) {
-                    /* If it is local node's edge label, continue */
-                    if (edgeLabel == sid)
-                        continue;
+            if (isEdgeRouter && !segmentIds.isEmpty()) {
+                for (Integer sId : segmentIds) {
                     NeighborSet ns = new NeighborSet();
                     ns.addDpids(combo);
                     /* Check if the edge label being set is of the
                      * same node in the Neighbor set
                      */
                     if ((combo.size() != 1) ||
-                        (!isNodeLabelAndEdgeLabelSame(
-                                combo.iterator().next(), edgeLabel))){
-                        ns.setEdgeLabel(edgeLabel);
+                            (!isSegmentIdSameAsNodeSegmentId(
+                                    combo.iterator().next(), sId))) {
+                        ns.setEdgeLabel(sId);
                     }
                     nsSet.add(ns);
                 }
@@ -851,7 +872,7 @@
                 nsSet.add(ns);
             }
         }
-        log.debug("The neighborset with label for sw {} is ",
+        log.debug("createGroups: The neighborset with label for sw {} is {}",
                 getStringId(), nsSet);
 
         int groupid = 1;
@@ -880,7 +901,8 @@
             EcmpInfo ecmpInfo = new EcmpInfo(groupid++, buckets);
             setEcmpGroup(ecmpInfo);
             ecmpGroups.put(ns, ecmpInfo);
-            log.debug("Creating ecmp group in sw {} for neighbor set {}: {}",
+            log.debug(
+                    "createGroups: Creating ecmp group in sw {} for neighbor set {}: {}",
                     getStringId(), ns, ecmpInfo);
         }
 
