diff --git a/src/main/java/net/floodlightcontroller/flowcache/FlowManager.java b/src/main/java/net/floodlightcontroller/flowcache/FlowManager.java
index b150ced..b1578e9 100644
--- a/src/main/java/net/floodlightcontroller/flowcache/FlowManager.java
+++ b/src/main/java/net/floodlightcontroller/flowcache/FlowManager.java
@@ -1378,103 +1378,7 @@
     public void reconcileFlows(Iterable<IFlowPath> flowObjSet) {
 	if (! flowObjSet.iterator().hasNext())
 	    return;
-
-	//
-	// Remove the old Flow Entries, and add the new Flow Entries
-	//
-
-	Map<Long, IOFSwitch> mySwitches = floodlightProvider.getSwitches();
-	LinkedList<FlowPath> flowPaths = new LinkedList<FlowPath>();
-	for (IFlowPath flowObj : flowObjSet) {
-	    FlowPath flowPath = extractFlowPath(flowObj);
-	    if (flowPath == null)
-		continue;
-	    flowPaths.add(flowPath);
-
-	    //
-	    // Remove the Flow Entries from the Network MAP
-	    //
-	    Iterable<IFlowEntry> flowEntries = flowObj.getFlowEntries();
-	    LinkedList<IFlowEntry> deleteFlowEntries = new LinkedList<IFlowEntry>();
-	    for (IFlowEntry flowEntryObj : flowEntries) {
-		String dpidStr = flowEntryObj.getSwitchDpid();
-		if (dpidStr == null)
-		    continue;
-		Dpid dpid = new Dpid(dpidStr);
-		/*
-		IOFSwitch mySwitch = mySwitches.get(dpid.value());
-		if (mySwitch == null)
-		    continue;		// Ignore the entry: not my switch
-		*/
-		deleteFlowEntries.add(flowEntryObj);
-	    }
-	    for (IFlowEntry flowEntryObj : deleteFlowEntries) {
-		flowObj.removeFlowEntry(flowEntryObj);
-		conn.utils().removeFlowEntry(conn, flowEntryObj);
-	    }
-	}
-
-	for (FlowPath flowPath : flowPaths) {
-	    //
-	    // Delete the flow entries from the switches
-	    //
-	    for (FlowEntry flowEntry : flowPath.dataPath().flowEntries()) {
-		flowEntry.setFlowEntryUserState(FlowEntryUserState.FE_USER_DELETE);
-		IOFSwitch mySwitch = mySwitches.get(flowEntry.dpid().value());
-		if (mySwitch == null) {
-		    // Not my switch
-		    installRemoteFlowEntry(flowPath, flowEntry);
-		} else {
-		    installFlowEntry(mySwitch, flowPath, flowEntry);
-		}
-	    }
-
-	    //
-	    // Calculate the new shortest path and install it in the
-	    // Network MAP.
-	    //
-	    FlowPath addedFlowPath = addAndMaintainShortestPathFlow(flowPath);
-	    if (addedFlowPath == null) {
-		log.error("Cannot add Shortest Path Flow from {} to {}: path not found?",
-			  flowPath.dataPath().srcPort().toString(),
-			  flowPath.dataPath().dstPort().toString());
-		continue;
-	    }
-
-	    //
-	    // Add the flow entries to the switches
-	    //
-	    for (FlowEntry flowEntry : addedFlowPath.dataPath().flowEntries()) {
-		flowEntry.setFlowEntryUserState(FlowEntryUserState.FE_USER_ADD);
-		IOFSwitch mySwitch = mySwitches.get(flowEntry.dpid().value());
-		if (mySwitch == null) {
-		    // Not my switch
-		    installRemoteFlowEntry(addedFlowPath, flowEntry);
-		    continue;
-		}
-
-		IFlowEntry flowEntryObj =
-		    conn.utils().searchFlowEntry(conn, flowEntry.flowEntryId());
-		if (flowEntryObj == null) {
-		    //
-		    // TODO: Remove the "new Object[] wrapper in the statement
-		    // below after the SLF4J logger is upgraded to
-		    // Version 1.7.5
-		    //
-		    log.error("Cannot add Flow Entry to switch {} for Path Flow from {} to {} : Flow Entry not in the Network MAP",
-			      new Object[] {
-				  flowEntry.dpid(),
-				  flowPath.dataPath().srcPort(),
-				  flowPath.dataPath().dstPort()
-			      });
-		    continue;
-		}
-		// Update the Flow Entry Switch State in the Network MAP
-		if (installFlowEntry(mySwitch, addedFlowPath, flowEntry)) {
-		    flowEntryObj.setSwitchState("FE_SWITCH_UPDATED");
-		}
-	    }
-	}
+	// TODO: Not implemented/used yet.
     }
 
     /**
