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 ae14e09..b9806b5 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/flowmanager/PathComputation.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/flowmanager/PathComputation.java
@@ -46,11 +46,13 @@
     private BlockingQueue<EventEntry<?>> networkEvents =
 	new LinkedBlockingQueue<EventEntry<?>>();
 
-    // The pending Topology and Flow Path events
+    // The pending Topology, FlowPath, and FlowEntry events
     private List<EventEntry<TopologyElement>> topologyEvents =
 	new LinkedList<EventEntry<TopologyElement>>();
     private List<EventEntry<FlowPath>> flowPathEvents =
 	new LinkedList<EventEntry<FlowPath>>();
+    private List<EventEntry<FlowEntry>> flowEntryEvents =
+	new LinkedList<EventEntry<FlowEntry>>();
 
     /**
      * Constructor for a given Flow Manager and Datagrid Service.
@@ -89,6 +91,16 @@
 		new EventEntry<FlowPath>(EventEntry.Type.ENTRY_ADD, flowPath);
 	    flowPathEvents.add(eventEntry);
 	}
+	//
+	// Obtain the initial FlowEntry state
+	//
+	Collection<FlowEntry> flowEntries = datagridService.getAllFlowEntries();
+	for (FlowEntry flowEntry : flowEntries) {
+	    EventEntry<FlowEntry> eventEntry =
+		new EventEntry<FlowEntry>(EventEntry.Type.ENTRY_ADD, flowEntry);
+	    flowEntryEvents.add(eventEntry);
+	}
+
 	// Process the events (if any)
 	processEvents();
 
@@ -106,6 +118,7 @@
 		// Demultiplex all events:
 		//  - EventEntry<TopologyElement>
 		//  - EventEntry<FlowPath>
+		//  - EventEntry<FlowEntry>
 		//
 		for (EventEntry<?> event : collection) {
 		    if (event.eventData() instanceof TopologyElement) {
@@ -116,6 +129,10 @@
 			EventEntry<FlowPath> flowPathEventEntry =
 			    (EventEntry<FlowPath>)event;
 			flowPathEvents.add(flowPathEventEntry);
+		    } else if (event.eventData() instanceof FlowEntry) {
+			EventEntry<FlowEntry> flowEntryEventEntry =
+			    (EventEntry<FlowEntry>)event;
+			flowEntryEvents.add(flowEntryEventEntry);
 		    }
 		}
 		collection.clear();
@@ -136,8 +153,13 @@
 	List<FlowPath> recomputeFlowPaths = new LinkedList<FlowPath>();
 	List<FlowPath> modifiedFlowPaths = new LinkedList<FlowPath>();
 
-	if (topologyEvents.isEmpty() && flowPathEvents.isEmpty())
+	// TODO: For now we don't use/process the FlowEntry events
+	flowEntryEvents.clear();
+
+	if (topologyEvents.isEmpty() && flowPathEvents.isEmpty() &&
+	    flowEntryEvents.isEmpty()) {
 	    return;		// Nothing to do
+	}
 
 	//
 	// Process the Flow Path events
@@ -422,7 +444,7 @@
     /**
      * Receive a notification that a Flow is added.
      *
-     * @param flowPath the flow that is added.
+     * @param flowPath the Flow that is added.
      */
     @Override
     public void notificationRecvFlowAdded(FlowPath flowPath) {
@@ -434,7 +456,7 @@
     /**
      * Receive a notification that a Flow is removed.
      *
-     * @param flowPath the flow that is removed.
+     * @param flowPath the Flow that is removed.
      */
     @Override
     public void notificationRecvFlowRemoved(FlowPath flowPath) {
@@ -446,7 +468,7 @@
     /**
      * Receive a notification that a Flow is updated.
      *
-     * @param flowPath the flow that is updated.
+     * @param flowPath the Flow that is updated.
      */
     @Override
     public void notificationRecvFlowUpdated(FlowPath flowPath) {
@@ -457,6 +479,43 @@
     }
 
     /**
+     * Receive a notification that a FlowEntry is added.
+     *
+     * @param flowEntry the FlowEntry that is added.
+     */
+    @Override
+    public void notificationRecvFlowEntryAdded(FlowEntry flowEntry) {
+	EventEntry<FlowEntry> eventEntry =
+	    new EventEntry<FlowEntry>(EventEntry.Type.ENTRY_ADD, flowEntry);
+	networkEvents.add(eventEntry);
+    }
+
+    /**
+     * Receive a notification that a FlowEntry is removed.
+     *
+     * @param flowEntry the FlowEntry that is removed.
+     */
+    @Override
+    public void notificationRecvFlowEntryRemoved(FlowEntry flowEntry) {
+	EventEntry<FlowEntry> eventEntry =
+	    new EventEntry<FlowEntry>(EventEntry.Type.ENTRY_REMOVE, flowEntry);
+	networkEvents.add(eventEntry);
+    }
+
+    /**
+     * Receive a notification that a FlowEntry is updated.
+     *
+     * @param flowEntry the FlowEntry that is updated.
+     */
+    @Override
+    public void notificationRecvFlowEntryUpdated(FlowEntry flowEntry) {
+	// NOTE: The ADD and UPDATE events are processed in same way
+	EventEntry<FlowEntry> eventEntry =
+	    new EventEntry<FlowEntry>(EventEntry.Type.ENTRY_ADD, flowEntry);
+	networkEvents.add(eventEntry);
+    }
+
+    /**
      * Receive a notification that a Topology Element is added.
      *
      * @param topologyElement the Topology Element that is added.
