diff --git a/src/main/java/net/floodlightcontroller/routing/IRoutingService.java b/src/main/java/net/floodlightcontroller/routing/IRoutingService.java
index fcd70ad8b132c2d3e899532862c5d65b2162f2b9..8fededaf783bbe34bb448b5aec3892ad080f430a 100644
--- a/src/main/java/net/floodlightcontroller/routing/IRoutingService.java
+++ b/src/main/java/net/floodlightcontroller/routing/IRoutingService.java
@@ -17,6 +17,8 @@
 
 package net.floodlightcontroller.routing;
 
+import java.util.ArrayList;
+
 import net.floodlightcontroller.core.module.IFloodlightService;
 import net.floodlightcontroller.routing.Route;
 
@@ -37,6 +39,9 @@ public interface IRoutingService extends IFloodlightService {
                              long dstId, short dstPort, 
                              boolean tunnelEnabled);
 
+    /** return all routes, if available */
+    public ArrayList<Route> getRoutes(long longSrcDpid, long longDstDpid, boolean tunnelEnabled);
+
     /** Check if a route exists between src and dst, including tunnel links
      *  in the path.
      */
@@ -46,4 +51,5 @@ public interface IRoutingService extends IFloodlightService {
      *  or not have tunnels as part of the path.
      */
     public boolean routeExists(long src, long dst, boolean tunnelEnabled);
+
 }
\ No newline at end of file
diff --git a/src/main/java/net/floodlightcontroller/routing/Link.java b/src/main/java/net/floodlightcontroller/routing/Link.java
index 79585969aadaebd238f268943f4d3f50367eef43..b79b9a9bc942aeb425a046f42aa790b0d29f011d 100755
--- a/src/main/java/net/floodlightcontroller/routing/Link.java
+++ b/src/main/java/net/floodlightcontroller/routing/Link.java
@@ -24,7 +24,7 @@ import org.codehaus.jackson.annotate.JsonProperty;
 import org.codehaus.jackson.map.annotate.JsonSerialize;
 import org.openflow.util.HexString;
 
-public class Link {
+public class Link implements Comparable<Link> {
     private long src;
     private short srcPort;
     private long dst;
@@ -118,5 +118,20 @@ public class Link {
     			HexString.toHexString(this.dst) + "|" +
     		    (this.dstPort & 0xffff) );
     }
+
+    @Override
+    public int compareTo(Link a) {
+        // compare link based on natural ordering - src id, src port, dst id, dst port
+        if (this.getSrc() != a.getSrc())
+            return (int) (this.getSrc() - a.getSrc());
+        
+        if (this.getSrcPort() != a.getSrcPort())
+            return (int) (this.getSrc() - a.getSrc());
+        
+        if (this.getDst() != a.getDst())
+            return (int) (this.getDst() - a.getDst());
+        
+        return (int) (this.getDstPort() - a.getDstPort());
+    }
 }
 
diff --git a/src/main/java/net/floodlightcontroller/routing/Route.java b/src/main/java/net/floodlightcontroller/routing/Route.java
index 211a924f7d5e912753882e88d5d54ae70009bca0..da00d50b7b82a3d3498b1523543a8558abbd579a 100755
--- a/src/main/java/net/floodlightcontroller/routing/Route.java
+++ b/src/main/java/net/floodlightcontroller/routing/Route.java
@@ -30,17 +30,20 @@ import net.floodlightcontroller.topology.NodePortTuple;
 public class Route implements Comparable<Route> {
     protected RouteId id;
     protected List<NodePortTuple> switchPorts;
+    protected int routeCount;
 
     public Route(RouteId id, List<NodePortTuple> switchPorts) {
         super();
         this.id = id;
         this.switchPorts = switchPorts;
+        this.routeCount = 0; // useful if multipath routing available
     }
 
     public Route(Long src, Long dst) {
         super();
         this.id = new RouteId(src, dst);
         this.switchPorts = new ArrayList<NodePortTuple>();
+        this.routeCount = 0;
     }
 
     /**
@@ -71,6 +74,20 @@ public class Route implements Comparable<Route> {
         this.switchPorts = switchPorts;
     }
 
+    /**
+     * @param routeCount routeCount set by (ECMP) buildRoute method 
+     */
+    public void setRouteCount(int routeCount) {
+        this.routeCount = routeCount;
+    }
+    
+    /**
+     * @return routeCount return routeCount set by (ECMP) buildRoute method 
+     */
+    public int getRouteCount() {
+        return routeCount;
+    }
+    
     @Override
     public int hashCode() {
         final int prime = 5791;
diff --git a/src/main/java/net/floodlightcontroller/routing/RouteId.java b/src/main/java/net/floodlightcontroller/routing/RouteId.java
index a55096163d3dfd11e89a80a9ef935e9f624d8e93..511db735969aa849d619783cdd88229d1922b27a 100755
--- a/src/main/java/net/floodlightcontroller/routing/RouteId.java
+++ b/src/main/java/net/floodlightcontroller/routing/RouteId.java
@@ -27,11 +27,20 @@ import org.openflow.util.HexString;
 public class RouteId implements Cloneable, Comparable<RouteId> {
     protected Long src;
     protected Long dst;
+    protected long cookie;
 
     public RouteId(Long src, Long dst) {
         super();
         this.src = src;
         this.dst = dst;
+        this.cookie = 0;
+    }
+
+    public RouteId(Long src, Long dst, long cookie) {
+        super();
+        this.src = src;
+        this.dst = dst;
+        this.cookie = cookie;
     }
 
     public Long getSrc() {
@@ -50,13 +59,24 @@ public class RouteId implements Cloneable, Comparable<RouteId> {
         this.dst = dst;
     }
 
+    public long getCookie() {
+        return cookie;
+    }
+
+    public void setCookie(int cookie) {
+        this.cookie = cookie;
+    }
+
     @Override
     public int hashCode() {
         final int prime = 2417;
-        int result = 1;
+        Long result = new Long(1);
         result = prime * result + ((dst == null) ? 0 : dst.hashCode());
         result = prime * result + ((src == null) ? 0 : src.hashCode());
-        return result;
+        result = prime * result + cookie; 
+        // To cope with long cookie, use Long to compute hash then use Long's 
+        // built-in hash to produce int hash code
+        return result.hashCode(); 
     }
 
     @Override
diff --git a/src/main/java/net/floodlightcontroller/topology/TopologyInstance.java b/src/main/java/net/floodlightcontroller/topology/TopologyInstance.java
index 7fea75b348d6362c3968c71f78bb1ba0abd8d3c9..6204d3e448beb61b5a12c99c3ec26e8d9b108bec 100644
--- a/src/main/java/net/floodlightcontroller/topology/TopologyInstance.java
+++ b/src/main/java/net/floodlightcontroller/topology/TopologyInstance.java
@@ -421,7 +421,7 @@ public class TopologyInstance {
         return broadcastDomainPorts.contains(npt);
     }
 
-    class NodeDist implements Comparable<NodeDist> {
+    protected class NodeDist implements Comparable<NodeDist> {
         private Long node;
         public Long getNode() {
             return node;
diff --git a/src/main/java/net/floodlightcontroller/topology/TopologyManager.java b/src/main/java/net/floodlightcontroller/topology/TopologyManager.java
index 0d2e974428b619c092fd6b81739dc827da0e6ae6..cf936198eada7fcc97ca66db6024a3079291cc51 100644
--- a/src/main/java/net/floodlightcontroller/topology/TopologyManager.java
+++ b/src/main/java/net/floodlightcontroller/topology/TopologyManager.java
@@ -529,7 +529,7 @@ public class TopologyManager implements
         TopologyInstance ti = getCurrentInstance(tunnelEnabled);
         return ti.getRoute(src, srcPort, dst, dstPort);
     }
-
+    
     @Override
     public boolean routeExists(long src, long dst) {
         return routeExists(src, dst, true);
@@ -1263,4 +1263,15 @@ public class TopologyManager implements
         ports.addAll(ofpList);
         return ports;
     }
+
+    @Override
+    public ArrayList<Route> getRoutes(long srcDpid, long dstDpid,
+                                      boolean tunnelEnabled) {
+        // Floodlight supports single path routing now
+        
+        // return single path now
+        ArrayList<Route> result=new ArrayList<Route>();
+        result.add(getRoute(srcDpid, dstDpid, tunnelEnabled));
+        return result;
+    }
 }