diff --git a/src/main/java/net/onrc/onos/apps/segmentrouting/ISegmentRoutingService.java b/src/main/java/net/onrc/onos/apps/segmentrouting/ISegmentRoutingService.java
index e2efa42..9a887ae 100644
--- a/src/main/java/net/onrc/onos/apps/segmentrouting/ISegmentRoutingService.java
+++ b/src/main/java/net/onrc/onos/apps/segmentrouting/ISegmentRoutingService.java
@@ -6,7 +6,6 @@
 import net.floodlightcontroller.core.module.IFloodlightService;
 import net.floodlightcontroller.util.MACAddress;
 import net.onrc.onos.apps.segmentrouting.SegmentRoutingManager.TunnelInfo;
-import net.onrc.onos.core.util.Dpid;
 import net.onrc.onos.core.util.IPv4Net;
 
 /**
@@ -19,11 +18,11 @@
      * Create a tunnel for policy routing.
      *
      * @param tunnelId ID for the tunnel
-     * @param Ids Node IDs for the tunnel
+     * @param labelIds Node label IDs for the tunnel
      *
      * @return "true/false" depending tunnel creation status
      */
-    public boolean createTunnel(String tunnelId, List<Dpid> Ids);
+    public boolean createTunnel(String tunnelId, List<Integer> labelIds);
 
     /**
      * Remove a Segment Routing tunnel given a tunnel Id.
@@ -36,7 +35,7 @@
 
     /**
      * Create a policy for policy based segment routing
-     * 
+     *
      * @param pid Unique Policy Identifier
      * @param srcIP Source IP address in CIDR format
      * @param dstIP Destination IP address in CIDR format
@@ -65,6 +64,6 @@
      * info about tunnels
      * @return Collection<TunnelInfo>
      */
-    
+
     public Collection<TunnelInfo> getTunnelTable();
 }
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 537a894..c29fc65 100644
--- a/src/main/java/net/onrc/onos/apps/segmentrouting/SegmentRoutingManager.java
+++ b/src/main/java/net/onrc/onos/apps/segmentrouting/SegmentRoutingManager.java
@@ -5,6 +5,7 @@
 import java.net.InetAddress;
 import java.net.UnknownHostException;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -967,19 +968,20 @@
 
     public class TunnelInfo {
         private String tunnelId;
-        private List<Dpid> dpids;
+        private List<Integer> labelIds;
         private List<TunnelRouteInfo> routes;
 
-        public TunnelInfo(String tid, List<Dpid> dpids, List<TunnelRouteInfo> routes) {
+        public TunnelInfo(String tid, List<Integer> labelIds, List<TunnelRouteInfo> routes) {
             this.tunnelId = tid;
-            this.dpids = dpids;
+            this.labelIds = labelIds;
             this.routes = routes;
         }
         public String getTunnelId(){
             return this.tunnelId;
         }
-        public List<Dpid> getDpids(){
-            return this.dpids;
+
+        public List<Integer> getLabelids() {
+            return this.labelIds;
         }
         public List<TunnelRouteInfo> getRoutes(){
             return this.routes;
@@ -1041,9 +1043,9 @@
      * @param tid tunnel ID
      * @return List of DPID
      */
-    public List<Dpid> getTunnelInfo(String tid) {
+    public List<Integer> getTunnelInfo(String tid) {
         TunnelInfo tunnelInfo =  tunnelTable.get(tid);
-        return tunnelInfo.dpids;
+        return tunnelInfo.labelIds;
 
     }
 
@@ -1076,16 +1078,16 @@
      * @param tunnelId  Node IDs for the tunnel
      * @param Ids tunnel ID
      */
-    public boolean createTunnel(String tunnelId, List<Dpid> dpids) {
+    public boolean createTunnel(String tunnelId, List<Integer> labelIds) {
 
-        if (dpids.isEmpty() || dpids.size() < 2) {
+        if (labelIds.isEmpty() || labelIds.size() < 2) {
             log.debug("Wrong tunnel information");
             return false;
         }
 
         List<String> Ids = new ArrayList<String>();
-        for (Dpid dpid: dpids) {
-            Ids.add(getMplsLabel(dpid.toString()));
+        for (Integer label : labelIds) {
+            Ids.add(label.toString());
         }
 
         List<TunnelRouteInfo> stitchingRule = getStitchingRule(Ids);
@@ -1115,7 +1117,7 @@
         }
 
         //tunnelGroupMap.put(tunnelId, switchGroupPair);
-        TunnelInfo tunnelInfo = new TunnelInfo(tunnelId, dpids, stitchingRule);
+        TunnelInfo tunnelInfo = new TunnelInfo(tunnelId, labelIds, stitchingRule);
         tunnelTable.put(tunnelId, tunnelInfo);
 
         return true;
@@ -1685,14 +1687,14 @@
     private void runTest() {
 
         if (testMode == POLICY_ADD1) {
-            String[] routeArray = {"101", "105", "110"};
-            List<Dpid> routeList = new ArrayList<Dpid>();
+            Integer[] routeArray = {101, 105, 110};
+            /*List<Dpid> routeList = new ArrayList<Dpid>();
             for (int i = 0; i < routeArray.length; i++) {
                 Dpid dpid = getSwitchFromNodeId(routeArray[i]).getDpid();
                 routeList.add(dpid);
-            }
+            }*/
 
-            if (createTunnel("1", routeList)) {
+            if (createTunnel("1", Arrays.asList(routeArray))) {
                 IPv4Net srcIp = new IPv4Net("10.0.1.1/24");
                 IPv4Net dstIp = new IPv4Net("10.1.2.1/24");
 
@@ -1709,15 +1711,9 @@
             }
         }
         else if (testMode == POLICY_ADD2) {
-            String[] routeArray = {"101", "102", "103", "104", "105", "108",
-                    "110"};
-            List<Dpid> routeList = new ArrayList<Dpid>();
-            for (int i = 0; i < routeArray.length; i++) {
-                Dpid dpid = getSwitchFromNodeId(routeArray[i]).getDpid();
-                routeList.add(dpid);
-            }
+            Integer[] routeArray = {101, 102, 103, 104, 105, 108, 110};
 
-            if (createTunnel("2", routeList)) {
+            if (createTunnel("2", Arrays.asList(routeArray))) {
                 IPv4Net srcIp = new IPv4Net("10.0.1.1/24");
                 IPv4Net dstIp = new IPv4Net("10.1.2.1/24");
 
diff --git a/src/main/java/net/onrc/onos/apps/segmentrouting/web/SegmentRouterTunnelInfo.java b/src/main/java/net/onrc/onos/apps/segmentrouting/web/SegmentRouterTunnelInfo.java
index 785dde7..cd6f9be 100644
--- a/src/main/java/net/onrc/onos/apps/segmentrouting/web/SegmentRouterTunnelInfo.java
+++ b/src/main/java/net/onrc/onos/apps/segmentrouting/web/SegmentRouterTunnelInfo.java
@@ -2,30 +2,28 @@
 
 import java.util.List;
 
-import net.onrc.onos.apps.segmentrouting.SegmentRoutingManager.TunnelRouteInfo;
-import net.onrc.onos.core.util.Dpid;
-
 /**
  * This class contains tunnel info of ONOS Segement Routing App
  * Used for rest API
  */
 public class SegmentRouterTunnelInfo {
     private String tunnelId;
-    private List<Dpid> nodes;
+    // private List<Dpid> nodes;
     private List<List<String>> labelStack;
-    
-    public SegmentRouterTunnelInfo (String tId, List<Dpid> dpids, 
+
+    public SegmentRouterTunnelInfo(String tId, /*List<Dpid> dpids,*/
             List<List<String>> tunnelRoutes){
         this.tunnelId = tId;
-        this.nodes = dpids;
+        // this.nodes = dpids;
         this.labelStack = tunnelRoutes;
     }
     public String getTunnelId (){
         return this.tunnelId;
     }
-    public List<Dpid> getnodes (){
+
+    /*public List<Dpid> getnodes (){
         return this.nodes;
-    }
+    }*/
     public List<List<String>> getLabelStack (){
         return this.labelStack;
     }
diff --git a/src/main/java/net/onrc/onos/apps/segmentrouting/web/SegmentRouterTunnelRESTParams.java b/src/main/java/net/onrc/onos/apps/segmentrouting/web/SegmentRouterTunnelRESTParams.java
index 4248b24..6eedfb1 100644
--- a/src/main/java/net/onrc/onos/apps/segmentrouting/web/SegmentRouterTunnelRESTParams.java
+++ b/src/main/java/net/onrc/onos/apps/segmentrouting/web/SegmentRouterTunnelRESTParams.java
@@ -4,11 +4,11 @@
 
 public class SegmentRouterTunnelRESTParams {
     private String tunnel_id;
-    private List<String> tunnel_path;
+    private List<Integer> label_path;
 
     public SegmentRouterTunnelRESTParams() {
         this.tunnel_id = null;
-        this.tunnel_path = null;
+        this.label_path = null;
     }
 
     public void setTunnel_id(String tunnel_id) {
@@ -19,11 +19,11 @@
         return this.tunnel_id;
     }
 
-    public void setTunnel_path(List<String> tunnel_path) {
-        this.tunnel_path = tunnel_path;
+    public void setLabel_path(List<Integer> label_path) {
+        this.label_path = label_path;
     }
 
-    public List<String> getTunnel_path() {
-        return this.tunnel_path;
+    public List<Integer> getLabel_path() {
+        return this.label_path;
     }
 }
diff --git a/src/main/java/net/onrc/onos/apps/segmentrouting/web/SegmentRouterTunnelResource.java b/src/main/java/net/onrc/onos/apps/segmentrouting/web/SegmentRouterTunnelResource.java
index 3c19a21..bf3a084 100644
--- a/src/main/java/net/onrc/onos/apps/segmentrouting/web/SegmentRouterTunnelResource.java
+++ b/src/main/java/net/onrc/onos/apps/segmentrouting/web/SegmentRouterTunnelResource.java
@@ -2,10 +2,14 @@
 
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 
 import net.onrc.onos.apps.segmentrouting.ISegmentRoutingService;
-import net.onrc.onos.core.util.Dpid;
+import net.onrc.onos.apps.segmentrouting.SegmentRoutingManager.TunnelInfo;
+import net.onrc.onos.apps.segmentrouting.SegmentRoutingManager.TunnelRouteInfo;
 
 import org.codehaus.jackson.map.ObjectMapper;
 import org.restlet.resource.Delete;
@@ -14,17 +18,6 @@
 import org.restlet.resource.ServerResource;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import net.onrc.onos.apps.segmentrouting.ISegmentRoutingService;
-import net.onrc.onos.apps.segmentrouting.SegmentRoutingManager;
-import net.onrc.onos.apps.segmentrouting.SegmentRoutingManager.TunnelInfo;
-import net.onrc.onos.apps.segmentrouting.SegmentRoutingManager.TunnelRouteInfo;
 /**
  * Base class for return router statistics
  *
@@ -49,14 +42,10 @@
             log.error("Exception occurred parsing inbound JSON", ex);
             return "fail";
         }
-        log.debug("createTunnel with tunnelId {} tunnelPath{}",
-                createParams.getTunnel_id(), createParams.getTunnel_path());
-        List<Dpid> tunnelDpids = new ArrayList<Dpid>();
-        for (String dpid : createParams.getTunnel_path()) {
-            tunnelDpids.add(new Dpid(dpid));
-        }
+        log.debug("createTunnel with tunnelId {} Label Path{}",
+                createParams.getTunnel_id(), createParams.getLabel_path());
         boolean result = segmentRoutingService.createTunnel(createParams.getTunnel_id(),
-                tunnelDpids);
+                createParams.getLabel_path());
         return (result == true) ? "success" : "fail";
     }
 
@@ -99,10 +88,10 @@
                labelStack.add(label.getRoute());
            }
            SegmentRouterTunnelInfo info = new SegmentRouterTunnelInfo(tunnelInfo.getTunnelId(),
-                   tunnelInfo.getDpids(), labelStack );
+                    /*tunnelInfo.getDpids(),*/labelStack);
            infoList.add(info);
            //TODO Add Group/DPID
-           
+
         }
         log.debug("getTunnel with params");
         Map <String,List<SegmentRouterTunnelInfo>>result = new HashMap<String,List<SegmentRouterTunnelInfo>>();
