diff --git a/src/main/java/net/onrc/onos/ofcontroller/flowmanager/PathComputation.java b/src/main/java/net/onrc/onos/ofcontroller/flowmanager/PathComputation.java
index d840353..661fab1 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/flowmanager/PathComputation.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/flowmanager/PathComputation.java
@@ -15,6 +15,7 @@
 import net.onrc.onos.ofcontroller.topology.ShortestPath;
 import net.onrc.onos.ofcontroller.topology.Topology;
 import net.onrc.onos.ofcontroller.topology.TopologyElement;
+import net.onrc.onos.ofcontroller.topology.TopologyManager;
 import net.onrc.onos.ofcontroller.util.DataPath;
 import net.onrc.onos.ofcontroller.util.EventEntry;
 import net.onrc.onos.ofcontroller.util.FlowEntry;
@@ -239,7 +240,11 @@
 		modifiedFlowPaths.add(flowPath);
 	}
 
-	// TODO: Implement the rest: push the Flow Entries from modifiedFlowPaths!
+	//
+	// Push the Flow Entries that have been modified
+	//
+	// TODO: Uncomment the following to enable pushing of flow entries
+	// flowManager.pushModifiedFlowEntries(modifiedFlowPaths);
 
 	// Cleanup
 	topologyEvents.clear();
@@ -267,11 +272,9 @@
 
 	DataPath oldDataPath = flowPath.dataPath();
 
-	// Compute the new shortest path
-	DataPath newDataPath =
-	    ShortestPath.getTopologyShortestPath(topology,
-						 flowPath.dataPath().srcPort(),
-						 flowPath.dataPath().dstPort());
+	// Compute the new path
+	DataPath newDataPath = TopologyManager.computeNetworkPath(topology,
+								  flowPath);
 	if (newDataPath == null) {
 	    // We need the DataPath to compare the paths
 	    newDataPath = new DataPath();
@@ -279,7 +282,7 @@
 	newDataPath.applyFlowPathFlags(flowPath.flowPathFlags());
 
 	//
-	// Test whether the shortest path is same
+	// Test whether the new path is same
 	//
 	if (oldDataPath.flowEntries().size() !=
 	    newDataPath.flowEntries().size()) {
@@ -290,7 +293,8 @@
 	    while (oldIter.hasNext() && newIter.hasNext()) {
 		FlowEntry oldFlowEntry = oldIter.next();
 		FlowEntry newFlowEntry = newIter.next();
-		if (! newFlowEntry.isSameDataPath(oldFlowEntry)) {
+		if (! TopologyManager.isSameFlowEntryDataPath(oldFlowEntry,
+							      newFlowEntry)) {
 		    hasChanged = true;
 		    break;
 		}
@@ -300,7 +304,7 @@
 	    return hasChanged;
 
 	//
-	// Merge the changes in the shortest path:
+	// Merge the changes in the path:
 	//  - If a Flow Entry for a switch is in the old data path, but not
 	//    in the new data path, then mark it for deletion.
 	//  - If a Flow Entry for a switch is in the new data path, but not
@@ -348,7 +352,8 @@
 		oldFlowEntriesMap.get(newFlowEntry.dpid().value());
 
 	    if ((oldFlowEntry != null) &&
-		newFlowEntry.isSameDataPath(oldFlowEntry)) {
+		TopologyManager.isSameFlowEntryDataPath(oldFlowEntry,
+							newFlowEntry)) {
 		//
 		// Both Flow Entries are same
 		//
diff --git a/src/main/java/net/onrc/onos/ofcontroller/topology/TopologyManager.java b/src/main/java/net/onrc/onos/ofcontroller/topology/TopologyManager.java
index ccb64f8..ffe806a 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/topology/TopologyManager.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/topology/TopologyManager.java
@@ -15,6 +15,9 @@
 import net.onrc.onos.graph.GraphDBOperation;
 import net.onrc.onos.ofcontroller.floodlightlistener.INetworkGraphService;
 import net.onrc.onos.ofcontroller.util.DataPath;
+import net.onrc.onos.ofcontroller.util.FlowEntry;
+import net.onrc.onos.ofcontroller.util.FlowPath;
+import net.onrc.onos.ofcontroller.util.Port;
 import net.onrc.onos.ofcontroller.util.SwitchPort;
 
 import org.slf4j.Logger;
@@ -202,6 +205,80 @@
     }
 
     /**
+     * Compute the network path for a Flow.
+     *
+     * @param topology the topology handler to use.
+     * @param flowPath the Flow to compute the network path for.
+     * @return the data path with the computed path if found, otherwise null.
+     */
+    public static DataPath computeNetworkPath(Topology topology,
+					      FlowPath flowPath) {
+	//
+	// Compute the network path based on the desired Flow Path type
+	//
+	switch (flowPath.flowPathType()) {
+	case FP_TYPE_SHORTEST_PATH: {
+	    SwitchPort src = flowPath.dataPath().srcPort();
+	    SwitchPort dest = flowPath.dataPath().dstPort();
+	    return ShortestPath.getTopologyShortestPath(topology, src, dest);
+	}
+	case FP_TYPE_EXPLICIT_PATH:
+	    return flowPath.dataPath();
+	}
+
+	return null;
+    }
+
+    /**
+     * Test whether two Flow Entries represent same points in a data path.
+     *
+     * NOTE: Two Flow Entries represent same points in a data path if
+     * the Switch DPID, incoming port and outgoing port are same.
+     *
+     * NOTE: This method is specialized for shortest-path unicast paths,
+     * and probably should be moved somewhere else.
+     *
+     * @param oldFlowEntry the first Flow Entry to compare.
+     * @param newFlowEntry the second Flow Entry to compare.
+     * @return true if the two Flow Entries represent same points in a
+     * data path, otherwise false.
+     */
+    public static boolean isSameFlowEntryDataPath(FlowEntry oldFlowEntry,
+						  FlowEntry newFlowEntry) {
+	// Test the DPID
+	if (oldFlowEntry.dpid().value() != newFlowEntry.dpid().value())
+	    return false;
+
+	// Test the inPort
+	do {
+	    Port oldPort = oldFlowEntry.inPort();
+	    Port newPort = newFlowEntry.inPort();
+	    if ((oldPort != null) && (newPort != null) &&
+		(oldPort.value() == newPort.value())) {
+		break;
+	    }
+	    if ((oldPort == null) && (newPort == null))
+		break;
+	    return false;		// inPort is different
+	} while (false);
+
+	// Test the outPort
+	do {
+	    Port oldPort = oldFlowEntry.outPort();
+	    Port newPort = newFlowEntry.outPort();
+	    if ((oldPort != null) && (newPort != null) &&
+		(oldPort.value() == newPort.value())) {
+		break;
+	    }
+	    if ((oldPort == null) && (newPort == null))
+		break;
+	    return false;		// outPort is different
+	} while (false);
+
+	return true;
+    }
+
+    /**
      * Get the shortest path from a source to a destination by
      * using the pre-populated local topology state prepared
      * by method @ref newDatabaseTopology().
diff --git a/src/main/java/net/onrc/onos/ofcontroller/util/FlowEntry.java b/src/main/java/net/onrc/onos/ofcontroller/util/FlowEntry.java
index 29f3ceb..762d272 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/util/FlowEntry.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/util/FlowEntry.java
@@ -315,50 +315,6 @@
     }
 
     /**
-     * Test whether two Flow Entries represent same points in a data path.
-     *
-     * NOTE: Two Flow Entries represent same points in a data path if
-     * the Switch DPID, incoming port and outgoing port are same.
-     *
-     * @param otherFlowEntry the other Flow Entry to compare with.
-     * @return true if the two Flow Entries represent same points in a
-     * data path, otherwise false.
-     */
-    public boolean isSameDataPath(FlowEntry otherFlowEntry) {
-	// Test the DPID
-	if (this.dpid.value() != otherFlowEntry.dpid().value())
-	    return false;
-
-	// Test the inPort
-	do {
-	    Port oldPort = this.inPort;
-	    Port newPort = otherFlowEntry.inPort();
-	    if ((oldPort != null) && (newPort != null) &&
-		(oldPort.value() == newPort.value())) {
-		break;
-	    }
-	    if ((oldPort == null) && (newPort == null))
-		break;
-	    return false;		// inPort is different
-	} while (false);
-
-	// Test the outPort
-	do {
-	    Port oldPort = this.outPort;
-	    Port newPort = otherFlowEntry.outPort();
-	    if ((oldPort != null) && (newPort != null) &&
-		(oldPort.value() == newPort.value())) {
-		break;
-	    }
-	    if ((oldPort == null) && (newPort == null))
-		break;
-	    return false;		// outPort is different
-	} while (false);
-
-	return true;
-    }
-
-    /**
      * Convert the flow entry to a string.
      *
      * The string has the following form:
