diff --git a/src/main/java/net/floodlightcontroller/core/IOF13Switch.java b/src/main/java/net/floodlightcontroller/core/IOF13Switch.java
index d6fc9e4..94b8930 100644
--- a/src/main/java/net/floodlightcontroller/core/IOF13Switch.java
+++ b/src/main/java/net/floodlightcontroller/core/IOF13Switch.java
@@ -158,4 +158,13 @@
      */
     public void removeTunnel(String tunnelId);
 
+    /**
+     * Return the first group ID for the tunnel.
+     * If the router is not the source of the tunnel, it returns -1
+     *
+     * @param tunnelID tunnel ID for the tunnel
+     * @param srcDpid source router DPID
+     * @return first Group ID for the tunnel or -1 if not found
+     */
+    public int getTunnelGroupId(String tunnelID);
 }
diff --git a/src/main/java/net/onrc/onos/apps/segmentrouting/SegmentRoutingManager.java b/src/main/java/net/onrc/onos/apps/segmentrouting/SegmentRoutingManager.java
index 6f5d570..4d586d0 100644
--- a/src/main/java/net/onrc/onos/apps/segmentrouting/SegmentRoutingManager.java
+++ b/src/main/java/net/onrc/onos/apps/segmentrouting/SegmentRoutingManager.java
@@ -105,8 +105,6 @@
     private HashMap<String, LinkData> linksDown;
     private HashMap<String, LinkData> linksToAdd;
     private ConcurrentLinkedQueue<TopologyEvents> topologyEventQueue;
-    //private HashMap<String, HashMap<String, TunnelRouteInfo>> stitchInfo;
-    //private HashMap<String, HashMap<String, Integer>> tunnelGroupMap;
     private HashMap<String, PolicyInfo> policyTable;
     private HashMap<String, TunnelInfo> tunnelTable;
 
@@ -178,9 +176,7 @@
         linksDown = new HashMap<String, LinkData>();
         linksToAdd = new HashMap<String, LinkData>();
         topologyEventQueue = new ConcurrentLinkedQueue<TopologyEvents>();
-        //stitchInfo = new HashMap<String, HashMap<String, TunnelRouteInfo>>();
         packetService = context.getServiceImpl(IPacketService.class);
-        //tunnelGroupMap = new HashMap<String, HashMap<String, Integer>>();
         restApi = context.getServiceImpl(IRestApiService.class);
         policyTable = new HashMap<String, PolicyInfo>();
         tunnelTable = new HashMap<String, TunnelInfo>();
@@ -1152,12 +1148,12 @@
     }
 
     /**
+     * Split the nodes IDs into multiple tunnel if Segment Stitching is required.
+     * We assume that the first node ID is the one of source router, and the last
+     * node ID is that of the destination router.
      *
-     *
-     * @param srcSw
-     * @param dstSw
-     * @param route
-     * @return
+     * @param route list of node IDs
+     * @return List of the TunnelRoutInfo
      */
     private List<TunnelRouteInfo> getStitchingRule(List<String> route) {
 
@@ -1182,10 +1178,10 @@
 
         int i = 0;
         TunnelRouteInfo routeInfo = new TunnelRouteInfo();
-        String prevNodeId = null;
         boolean checkNeighbor = true;
 
         for (String nodeId: route) {
+            // First node ID is always the source router
             if (i == 0) {
                 routeInfo.setSrcDpid(srcDpid);
                 srcSw = getSwitchFromNodeId(nodeId);
@@ -1215,7 +1211,7 @@
                         routeInfo.setFwdSwDpid(fwdSwDpids);
                         i++;
                     }
-
+                    // we check only the next node ID of the source router
                     checkNeighbor = false;
                 }
                 else {
@@ -1228,6 +1224,7 @@
                 i++;
             }
 
+            // If the number of labels reaches the limit, start over the procedure
             if (i == MAX_NUM_LABELS+1) {
                 rules.add(routeInfo);
                 routeInfo = new TunnelRouteInfo();
@@ -1279,9 +1276,6 @@
         MatchActionOperationEntry maEntry =
                 new MatchActionOperationEntry(Operator.REMOVE, matchAction);
 
-        //HashMap<String, Integer> groupInfo = tunnelGroupMap.get(tid);
-
-
         TunnelInfo tunnelInfo = tunnelTable.get(tid);
         List<TunnelRouteInfo> routes = tunnelInfo.routes;
 
@@ -1307,6 +1301,27 @@
     }
 
     /**
+     * Get the first group ID for the tunnel for specific source router
+     * If Segment Stitching was required to create the tunnel, there are
+     * mutiple source routers.
+     *
+     * @param tunnelId ID for the tunnel
+     * @param dpid source router DPID
+     * @return the first group ID of the tunnel
+     */
+    public int getTunnelGroupId(String tunnelId, String dpid) {
+        IOF13Switch sw13 = (IOF13Switch) floodlightProvider.getMasterSwitch(
+                getSwId(dpid));
+
+        if (sw13 == null) {
+            return -1;
+        }
+        else {
+            return sw13.getTunnelGroupId(tunnelId);
+        }
+    }
+
+    /**
      * Remove a tunnel
      * It removes all groups for the tunnel if the tunnel is not used for any
      * policy.
@@ -1622,68 +1637,6 @@
     // Test functions
     // ************************************
 
-    /*
-    private void runTest() {
-
-        if (testMode == POLICY_ADD1) {
-            String[] routeArray = {"101", "105", "110"};
-            List<String> routeList = new ArrayList<String>();
-            for (int i = 0; i < routeArray.length; i++)
-                routeList.add(routeArray[i]);
-
-            if (createTunnel(1, routeList)) {
-                IPv4Net srcIp = new IPv4Net("10.0.1.1/24");
-                IPv4Net dstIp = new IPv4Net("10.1.2.1/24");
-
-                log.debug("Set the policy 1");
-                this.setPolicyTable(1, null, null, Ethernet.TYPE_IPV4, srcIp,
-                        dstIp, IPv4.PROTOCOL_ICMP, (short)-1, (short)-1, 10000,
-                        1);
-                testMode = POLICY_ADD2;
-                testTask.reschedule(10, TimeUnit.SECONDS);
-            }
-            else {
-                // retry it
-                testTask.reschedule(5, TimeUnit.SECONDS);
-            }
-        }
-        else if (testMode == POLICY_ADD2) {
-            String[] routeArray = {"101", "102", "103", "104", "105", "108",
-                    "110"};
-            List<String> routeList = new ArrayList<String>();
-            for (int i = 0; i < routeArray.length; i++)
-                routeList.add(routeArray[i]);
-
-            if (createTunnel(2, routeList)) {
-                IPv4Net srcIp = new IPv4Net("10.0.1.1/24");
-                IPv4Net dstIp = new IPv4Net("10.1.2.1/24");
-
-                log.debug("Set the policy 2");
-                this.setPolicyTable(2, null, null, Ethernet.TYPE_IPV4, srcIp,
-                        dstIp, IPv4.PROTOCOL_ICMP, (short)-1, (short)-1, 20000,
-                        2);
-                testMode = POLICY_REMOVE2;
-                testTask.reschedule(10, TimeUnit.SECONDS);
-            }
-            else {
-                log.debug("Retry it");
-                testTask.reschedule(5, TimeUnit.SECONDS);
-            }
-        }
-        else if (testMode == POLICY_REMOVE2){
-            log.debug("Remove the policy 2");
-            this.removePolicy(2);
-            testMode = POLICY_REMOVE1;
-            testTask.reschedule(10, TimeUnit.SECONDS);
-        }
-        else if (testMode == POLICY_REMOVE1){
-            log.debug("Remove the policy 1");
-            this.removePolicy(1);
-        }
-
-    }
-    */
-
     private void runTest() {
 
         if (testMode == POLICY_ADD1) {
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 4726b8e..2353fb7 100644
--- a/src/main/java/net/onrc/onos/core/drivermanager/OFSwitchImplCPqD13.java
+++ b/src/main/java/net/onrc/onos/core/drivermanager/OFSwitchImplCPqD13.java
@@ -1671,6 +1671,9 @@
     @Override
     public void removeTunnel(String tunnelId) {
         List<Integer> groups = tunnelGroupIdTable.get(tunnelId);
+        if (groups == null)
+            return;
+
         // we need to delete groups in reverse order
         for (int i = groups.size() - 1; i >= 0; i--) {
             int groupId = groups.get(i);
@@ -1679,11 +1682,20 @@
         tunnelGroupIdTable.remove(tunnelId);
     }
 
+    @Override
+    public int getTunnelGroupId(String tunnelId) {
+        List<Integer> groups = tunnelGroupIdTable.get(tunnelId);
+        if (groups == null)
+            return -1;
+
+        return groups.get(0);
+    }
+
+
     // *****************************
     // Unused
     // *****************************
 
-
     @SuppressWarnings("unused")
     private void setAsyncConfig() throws IOException {
         List<OFMessage> msglist = new ArrayList<OFMessage>(3);
