diff --git a/src/main/java/net/floodlightcontroller/core/IOF13Switch.java b/src/main/java/net/floodlightcontroller/core/IOF13Switch.java
index 81e9fea..4c924cc 100644
--- a/src/main/java/net/floodlightcontroller/core/IOF13Switch.java
+++ b/src/main/java/net/floodlightcontroller/core/IOF13Switch.java
@@ -160,15 +160,6 @@
     public TableId getTableId(String tableType);
 
     /**
-     * Create a tunnel for policy routing
-     *
-     * @param tunnelId tunnel ID for the tunnel
-     * @param route list of router DPIDs for the tunnel
-     * @param ns NeighborSet to get to the first router of the tunnel
-     */
-    public void createTunnel(String tunnelId, List<String> route, NeighborSet ns);
-
-    /**
      * Create a group chain with the specified label stack for a given set of
      * ports. This API can be used by user to create groups for a tunnel based
      * policy routing scenario. NOTE: This API can not be used if a group to be
@@ -186,13 +177,6 @@
     public int createGroup(List<Integer> labelStack, List<PortNumber> ports);
 
     /**
-     * Remove all groups for the tunnel
-     *
-     * @param tunnelId tunnel ID to remove
-     */
-    public void removeTunnel(String tunnelId);
-
-    /**
      * Remove the specified group
      *
      * @param groupId group identifier
@@ -200,15 +184,5 @@
      */
     public boolean removeGroup(int groupId);
 
-    /**
-     * 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);
-
     public Map<String, String> getPublishAttributes();
 }
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 0823385..cae7d41 100644
--- a/src/main/java/net/onrc/onos/core/drivermanager/OFSwitchImplCPqD13.java
+++ b/src/main/java/net/onrc/onos/core/drivermanager/OFSwitchImplCPqD13.java
@@ -147,7 +147,6 @@
     private boolean isEdgeRouter;
     private ConcurrentMap<NeighborSet, EcmpInfo> ecmpGroups;
     private ConcurrentMap<Integer, EcmpInfo> userDefinedGroups;
-    private ConcurrentMap<String, List<Integer>> tunnelGroupIdTable;
     private ConcurrentMap<PortNumber, ArrayList<NeighborSet>> portNeighborSetMap;
     private AtomicInteger groupid;
     private Map<String, String> publishAttributes;
@@ -164,7 +163,6 @@
         userDefinedGroups = new ConcurrentHashMap<Integer, EcmpInfo>();
         portNeighborSetMap =
                 new ConcurrentHashMap<PortNumber, ArrayList<NeighborSet>>();
-        tunnelGroupIdTable = new ConcurrentHashMap<String, List<Integer>>();
         segmentIds = new ArrayList<Integer>();
         isEdgeRouter = false;
         groupid = new AtomicInteger(0);
@@ -317,7 +315,7 @@
                     MacAddress.of(srConfig.getRouterMac()),
                     getNeighborRouterMacAddress(neighborDpid),
                     port,
-                    ns.getEdgeLabel());
+                    ns.getEdgeLabel(), true, -1);
             buckets.add(b);
             log.debug("addPortToGroups: Modifying Group on Switch {} "
                     + "and Neighborset {} with {}",
@@ -859,7 +857,7 @@
                 BucketInfo b = new BucketInfo(d,
                         MacAddress.of(srConfig.getRouterMac()),
                         getNeighborRouterMacAddress(d), sp,
-                        ns.getEdgeLabel());
+                        ns.getEdgeLabel(), true, -1);
                 buckets.add(b);
 
                 /* Update Port Neighborset map */
@@ -884,22 +882,6 @@
         return;
     }
 
-    private void createGroupForMplsLabel(int groupId, String nodeId,
-            int nextGroupId, boolean bos) {
-        List<BucketInfo> buckets = new ArrayList<BucketInfo>();
-        BucketInfo bucket = new BucketInfo(nextGroupId,
-                Integer.parseInt(nodeId), bos);
-        buckets.add(bucket);
-        EcmpInfo ecmpInfo = new EcmpInfo(groupId, buckets);
-        setEcmpGroup(ecmpInfo);
-//        ecmpGroups.put(ns, ecmpInfo);
-        log.debug(
-                "createGroupForANeighborSet: Creating ecmp group {} in sw {} "
-                        + "for pushing label {} and group to {}",
-                groupId, getStringId(), nodeId, nextGroupId);
-        return;
-    }
-
     /**
      * createGroups creates ECMP groups for all ports on this router connected
      * to other routers (in the OF network). The information for ports is
@@ -989,26 +971,27 @@
         int mplsLabel;
         boolean bos;
 
-        BucketInfo(Dpid nDpid, MacAddress smac, MacAddress dmac,
-                PortNumber p, int label) {
-            neighborDpid = nDpid;
-            srcMac = smac;
-            dstMac = dmac;
-            outport = p;
-            mplsLabel = label;
-            groupNo = -1;
-        }
+        /*
+                BucketInfo(Dpid nDpid, MacAddress smac, MacAddress dmac,
+                        PortNumber p, int label) {
+                    neighborDpid = nDpid;
+                    srcMac = smac;
+                    dstMac = dmac;
+                    outport = p;
+                    mplsLabel = label;
+                    groupNo = -1;
+                }
 
-        BucketInfo(int no, int label, boolean b) {
-            neighborDpid = null;
-            srcMac = null;
-            dstMac = null;
-            outport = null;
-            groupNo = no;
-            mplsLabel = label;
-            bos = b;
-        }
-
+                BucketInfo(int no, int label, boolean b) {
+                    neighborDpid = null;
+                    srcMac = null;
+                    dstMac = null;
+                    outport = null;
+                    groupNo = no;
+                    mplsLabel = label;
+                    bos = b;
+                }
+        */
         BucketInfo(Dpid nDpid, MacAddress smac, MacAddress dmac,
                 PortNumber p, int label, boolean bos, int gotoGroupNo) {
             neighborDpid = nDpid;
@@ -1353,9 +1336,8 @@
         } else if (action instanceof GroupAction) {
             int gid = -1;
             GroupAction ga = (GroupAction)action;
-            if (ga.getTunnelId() != null) {
-                List<Integer> groupIds = tunnelGroupIdTable.get(ga.getTunnelId());
-                gid = groupIds.get(groupIds.size()-1);
+            if (ga.getGroupId() > 0) {
+                gid = ga.getGroupId();
             }
             else {
                 NeighborSet ns = ((GroupAction) action).getDpids();
@@ -1699,57 +1681,6 @@
         }
     }
 
-    @Override
-    @Deprecated
-    public void createTunnel(String tunnelId, List<String> route, NeighborSet ns) {
-
-        List<Integer> groups = new ArrayList<Integer>();
-
-        // create a last group of the group chaining
-        int finalGroupId = groupid.incrementAndGet();
-        createGroupForANeighborSet(ns, finalGroupId);
-        groups.add(Integer.valueOf(finalGroupId));
-
-        int groupId = 0;
-        int nextGroupId = finalGroupId;
-        boolean bos = false;
-
-        // process the node ID in order
-        for (int i = 0; i < route.size(); i++) {
-            String nodeId = route.get(i);
-            groupId = groupid.incrementAndGet();
-            groups.add(Integer.valueOf(groupId));
-            if (i == route.size()-1)
-                bos = true;
-            createGroupForMplsLabel(groupId, nodeId, nextGroupId, bos);
-            nextGroupId = groupId;
-        }
-        tunnelGroupIdTable.putIfAbsent(tunnelId, groups);
-    }
-
-    @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);
-            deleteGroup(groupId);
-        }
-        tunnelGroupIdTable.remove(tunnelId);
-    }
-
-    @Override
-    public int getTunnelGroupId(String tunnelId) {
-        List<Integer> groups = tunnelGroupIdTable.get(tunnelId);
-        if (groups == null)
-            return -1;
-
-        return groups.get(0);
-    }
-
     private void createIndirectGroup(int groupId, MacAddress srcMac,
             MacAddress dstMac, PortNumber outPort, int gotoGroupNo,
             int mplsLabel, boolean bos) {
@@ -1893,6 +1824,22 @@
         return innermostGroupId;
     }
 
+    /*
+    @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);
+            deleteGroup(groupId);
+        }
+        tunnelGroupIdTable.remove(tunnelId);
+    }
+    */
+
     /**
      * Remove the specified group
      *
@@ -1902,6 +1849,7 @@
     public boolean removeGroup(int groupId) {
         return false;
     }
+
     @Override
     public Map<String, String> getPublishAttributes() {
         return publishAttributes;
