diff --git a/src/main/java/net/onrc/onos/intent/runtime/PathCalcRuntimeModule.java b/src/main/java/net/onrc/onos/intent/runtime/PathCalcRuntimeModule.java
index df927f6..2c269fd 100755
--- a/src/main/java/net/onrc/onos/intent/runtime/PathCalcRuntimeModule.java
+++ b/src/main/java/net/onrc/onos/intent/runtime/PathCalcRuntimeModule.java
@@ -152,42 +152,18 @@
 	}
 
 	@Override
-	public void putSwitchEvent(SwitchEvent switchEvent) {
-		// do nothing
-	}
-
-	@Override
-	public void removeSwitchEvent(SwitchEvent switchEvent) {
-		// do nothing
-	}
-
-	@Override
-	public void putPortEvent(PortEvent portEvent) {
-		// do nothing
-	}
-
-	@Override
-	public void removePortEvent(PortEvent portEvent) {
-		// do nothing
-	}
-
-	@Override
-	public void putLinkEvent(LinkEvent linkEvent) {
-		// do nothing
-	}
-
-	@Override
-	public void removeLinkEvent(LinkEvent linkEvent) {
+	public void networkGraphEvents(
+				Collection<SwitchEvent> addedSwitchEvents,
+				Collection<SwitchEvent> removedSwitchEvents,
+				Collection<PortEvent> addedPortEvents,
+				Collection<PortEvent> removedPortEvents,
+				Collection<LinkEvent> addedLinkEvents,
+				Collection<LinkEvent> removedLinkEvents,
+				Collection<DeviceEvent> addedDeviceEvents,
+				Collection<DeviceEvent> removedDeviceEvents) {
+	    // TODO: The implementation below is incomplete
+	    for (LinkEvent linkEvent : removedLinkEvents) {
 		reroutePaths(linkEvent);
-	}
-
-	@Override
-	public void putDeviceEvent(DeviceEvent deviceEvent) {
-		// do nothing
-	}
-
-	@Override
-	public void removeDeviceEvent(DeviceEvent deviceEvent) {
-		// do nothing
+	    }
 	}
 }
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/INetworkGraphListener.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/INetworkGraphListener.java
index 88806ef..dfdba42 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/INetworkGraphListener.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/INetworkGraphListener.java
@@ -1,22 +1,30 @@
 package net.onrc.onos.ofcontroller.networkgraph;
 
+import java.util.Collection;
+
 /**
  * Interface which needs to be implemented to receive Topology events from
- * NetworkGraph
- *
- * TODO Should these interface hand over Event object or Object in NetworkGraph.
+ * the NetworkGraph.
  */
 public interface INetworkGraphListener {
-    public void putSwitchEvent(SwitchEvent switchEvent);
-    public void removeSwitchEvent(SwitchEvent switchEvent);
-
-    public void putPortEvent(PortEvent portEvent);
-    public void removePortEvent(PortEvent portEvent);
-
-    public void putLinkEvent(LinkEvent linkEvent);
-    public void removeLinkEvent(LinkEvent linkEvent);
-
-    public void putDeviceEvent(DeviceEvent deviceEvent);
-    public void removeDeviceEvent(DeviceEvent deviceEvent);
-
+    /**
+     * Network Graph events.
+     *
+     * @param addedSwitchEvents the Added Switch Events.
+     * @param removedSwitchEvents the Removed Switch Events.
+     * @param addedPortEvents the Added Port Events.
+     * @param removedPortEvents the Removed Port Events.
+     * @param addedLinkEvents the Added Link Events.
+     * @param removedLinkEvents the Removed Link Events.
+     * @param addedDeviceEvents the Added Device Events.
+     * @param removedDeviceEvents the Removed Device Events.
+     */
+    public void networkGraphEvents(Collection<SwitchEvent> addedSwitchEvents,
+				   Collection<SwitchEvent> removedSwitchEvents,
+				   Collection<PortEvent> addedPortEvents,
+				   Collection<PortEvent> removedPortEvents,
+				   Collection<LinkEvent> addedLinkEvents,
+				   Collection<LinkEvent> removedLinkEvents,
+				   Collection<DeviceEvent> addedDeviceEvents,
+				   Collection<DeviceEvent> removedDeviceEvents);
 }
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/TopologyManager.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/TopologyManager.java
index 7377ce6..47022f1 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/TopologyManager.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/TopologyManager.java
@@ -67,6 +67,18 @@
     private Map<ByteBuffer, DeviceEvent> reorderedAddedDeviceEvents =
 	new HashMap<ByteBuffer, DeviceEvent>();
 
+    //
+    // Local state for keeping track of the application event notifications
+    //
+    List<SwitchEvent> apiAddedSwitchEvents = new LinkedList<SwitchEvent>();
+    List<SwitchEvent> apiRemovedSwitchEvents = new LinkedList<SwitchEvent>();
+    List<PortEvent> apiAddedPortEvents = new LinkedList<PortEvent>();
+    List<PortEvent> apiRemovedPortEvents = new LinkedList<PortEvent>();
+    List<LinkEvent> apiAddedLinkEvents = new LinkedList<LinkEvent>();
+    List<LinkEvent> apiRemovedLinkEvents = new LinkedList<LinkEvent>();
+    List<DeviceEvent> apiAddedDeviceEvents = new LinkedList<DeviceEvent>();
+    List<DeviceEvent> apiRemovedDeviceEvents = new LinkedList<DeviceEvent>();
+
     /**
      * Constructor.
      *
@@ -275,37 +287,15 @@
 		removeSwitch(switchEvent);
 
 	    //
-	    // Try to apply the reordered events.
+	    // Apply reordered events
 	    //
-	    // NOTE: For simplicity we try to apply all events of a particular
-	    // type if any "parent" type event was processed:
-	    //  - Apply reordered Port Events if Switches were added
-	    //  - Apply reordered Link and Device Events if Switches or Ports
-	    //    were added
+	    applyReorderedEvents(! addedSwitchEvents.isEmpty(),
+				 ! addedPortEvents.isEmpty());
+
 	    //
-	    if (! (addedSwitchEvents.isEmpty() && addedPortEvents.isEmpty())) {
-		Map<ByteBuffer, PortEvent> portEvents = reorderedAddedPortEvents;
-		Map<ByteBuffer, LinkEvent> linkEvents = reorderedAddedLinkEvents;
-		Map<ByteBuffer, DeviceEvent> deviceEvents = reorderedAddedDeviceEvents;
-		reorderedAddedPortEvents = new HashMap<>();
-		reorderedAddedLinkEvents = new HashMap<>();
-		reorderedAddedDeviceEvents = new HashMap<>();
-		//
-		// Apply reordered Port Events if Switches were added
-		//
-		if (! addedSwitchEvents.isEmpty()) {
-		    for (PortEvent portEvent : portEvents.values())
-			addPort(portEvent);
-		}
-		//
-		// Apply reordered Link and Device Events if Switches or Ports
-		// were added.
-		//
-		for (LinkEvent linkEvent : linkEvents.values())
-		    addLink(linkEvent);
-		for (DeviceEvent deviceEvent : deviceEvents.values())
-		    addDevice(deviceEvent);
-	    }
+	    // Dispatch the Topology Notification Events to the applications
+	    //
+	    dispatchNetworkGraphEvents();
 	}
 
 	/**
@@ -359,6 +349,90 @@
 	eventHandler.start();
     }
 
+    /**
+     * Dispatch Network Graph Events to the listeners.
+     */
+    private void dispatchNetworkGraphEvents() {
+	if (apiAddedSwitchEvents.isEmpty() &&
+	    apiRemovedSwitchEvents.isEmpty() &&
+	    apiAddedPortEvents.isEmpty() &&
+	    apiRemovedPortEvents.isEmpty() &&
+	    apiAddedLinkEvents.isEmpty() &&
+	    apiRemovedLinkEvents.isEmpty() &&
+	    apiAddedDeviceEvents.isEmpty() &&
+	    apiRemovedDeviceEvents.isEmpty()) {
+	    return;		// No events to dispatch
+	}
+
+	// Deliver the events
+	for (INetworkGraphListener listener : this.networkGraphListeners) {
+	    // TODO: Should copy before handing them over to listener?
+	    listener.networkGraphEvents(apiAddedSwitchEvents,
+					apiRemovedSwitchEvents,
+					apiAddedPortEvents,
+					apiRemovedPortEvents,
+					apiAddedLinkEvents,
+					apiRemovedLinkEvents,
+					apiAddedDeviceEvents,
+					apiRemovedDeviceEvents);
+	}
+
+	//
+	// Cleanup
+	//
+	apiAddedSwitchEvents.clear();
+	apiRemovedSwitchEvents.clear();
+	apiAddedPortEvents.clear();
+	apiRemovedPortEvents.clear();
+	apiAddedLinkEvents.clear();
+	apiRemovedLinkEvents.clear();
+	apiAddedDeviceEvents.clear();
+	apiRemovedDeviceEvents.clear();
+    }
+
+    /**
+     * Apply reordered events.
+     *
+     * @param hasAddedSwitchEvents true if there were Added Switch Events.
+     * @param hasAddedPortEvents true if there were Added Port Events.
+     */
+    private void applyReorderedEvents(boolean hasAddedSwitchEvents,
+				      boolean hasAddedPortEvents) {
+	if (! (hasAddedSwitchEvents || hasAddedPortEvents))
+	    return;		// Nothing to do
+
+	//
+	// Try to apply the reordered events.
+	//
+	// NOTE: For simplicity we try to apply all events of a particular
+	// type if any "parent" type event was processed:
+	//  - Apply reordered Port Events if Switches were added
+	//  - Apply reordered Link and Device Events if Switches or Ports
+	//    were added
+	//
+	Map<ByteBuffer, PortEvent> portEvents = reorderedAddedPortEvents;
+	Map<ByteBuffer, LinkEvent> linkEvents = reorderedAddedLinkEvents;
+	Map<ByteBuffer, DeviceEvent> deviceEvents = reorderedAddedDeviceEvents;
+	reorderedAddedPortEvents = new HashMap<>();
+	reorderedAddedLinkEvents = new HashMap<>();
+	reorderedAddedDeviceEvents = new HashMap<>();
+	//
+	// Apply reordered Port Events if Switches were added
+	//
+	if (hasAddedSwitchEvents) {
+	    for (PortEvent portEvent : portEvents.values())
+		addPort(portEvent);
+	}
+	//
+	// Apply reordered Link and Device Events if Switches or Ports
+	// were added.
+	//
+	for (LinkEvent linkEvent : linkEvents.values())
+	    addLink(linkEvent);
+	for (DeviceEvent deviceEvent : deviceEvents.values())
+	    addDevice(deviceEvent);
+    }
+
     /* ******************************
      * NetworkGraphDiscoveryInterface methods
      * ******************************/
@@ -447,21 +521,22 @@
     /* ************************************************
      * Internal methods to maintain the network graph
      * ************************************************/
-    private void addSwitch(SwitchEvent swEvent) {
-	Switch sw = networkGraph.getSwitch(swEvent.getDpid());
+    private void addSwitch(SwitchEvent switchEvent) {
+	Switch sw = networkGraph.getSwitch(switchEvent.getDpid());
 	if (sw == null) {
-	    sw = new SwitchImpl(networkGraph, swEvent.getDpid());
+	    sw = new SwitchImpl(networkGraph, switchEvent.getDpid());
 	    networkGraph.putSwitch(sw);
 	} else {
 	    // TODO: Update the switch attributes
 	    // TODO: Nothing to do for now
 	}
+	apiAddedSwitchEvents.add(switchEvent);
     }
 
-    private void removeSwitch(SwitchEvent swEvent) {
-	Switch sw = networkGraph.getSwitch(swEvent.getDpid());
+    private void removeSwitch(SwitchEvent switchEvent) {
+	Switch sw = networkGraph.getSwitch(switchEvent.getDpid());
 	if (sw == null) {
-	    log.warn("Switch {} already removed, ignoring", swEvent);
+	    log.warn("Switch {} already removed, ignoring", switchEvent);
 	    return;
 	}
 
@@ -471,7 +546,7 @@
 	ArrayList<PortEvent> portsToRemove = new ArrayList<>();
 	for (Port port : sw.getPorts()) {
 	    log.warn("Port {} on Switch {} should be removed prior to removing Switch. Removing Port now.",
-		     port, swEvent);
+		     port, switchEvent);
 	    PortEvent portEvent = new PortEvent(port.getDpid(),
 						port.getNumber());
 	    portsToRemove.add(portEvent);
@@ -479,7 +554,8 @@
 	for (PortEvent portEvent : portsToRemove)
 	    removePort(portEvent);
 
-	networkGraph.removeSwitch(swEvent.getDpid());
+	networkGraph.removeSwitch(switchEvent.getDpid());
+	apiRemovedSwitchEvents.add(switchEvent);
     }
 
     private void addPort(PortEvent portEvent) {
@@ -499,6 +575,7 @@
 	} else {
 	    // TODO: Update the port attributes
 	}
+	apiAddedPortEvents.add(portEvent);
     }
 
     private void removePort(PortEvent portEvent) {
@@ -553,6 +630,8 @@
 	// Remove the Port from the Switch
 	SwitchImpl switchImpl = getSwitchImpl(sw);
 	switchImpl.removePort(port);
+
+	apiRemovedPortEvents.add(portEvent);
     }
 
     private void addLink(LinkEvent linkEvent) {
@@ -600,6 +679,8 @@
 	} else {
 	    // TODO: Update the link attributes
 	}
+
+	apiAddedLinkEvents.add(linkEvent);
     }
 
     private void removeLink(LinkEvent linkEvent) {
@@ -633,6 +714,8 @@
 	}
 	getPortImpl(dstPort).setIncomingLink(null);
 	getPortImpl(srcPort).setOutgoingLink(null);
+
+	apiRemovedLinkEvents.add(linkEvent);
     }
 
     // TODO: Device-related work is incomplete
@@ -675,8 +758,10 @@
 	}
 
 	// Update the device in the Network Graph
-	if (attachmentFound)
+	if (attachmentFound) {
 	    networkGraph.putDevice(device);
+	    apiAddedDeviceEvents.add(deviceEvent);
+	}
     }
 
     private void removeDevice(DeviceEvent deviceEvent) {
@@ -701,20 +786,22 @@
 	    portImpl.removeDevice(device);
 	    deviceImpl.removeAttachmentPoint(port);
 	}
+
 	networkGraph.removeDevice(device);
+	apiRemovedDeviceEvents.add(deviceEvent);
     }
 
     /**
      *
-     * @param swEvent
+     * @param switchEvent
      * @return true if ready to accept event.
      */
-    private boolean prepareForAddSwitchEvent(SwitchEvent swEvent) {
+    private boolean prepareForAddSwitchEvent(SwitchEvent switchEvent) {
 	// No show stopping precondition
 	return true;
     }
 
-    private boolean prepareForRemoveSwitchEvent(SwitchEvent swEvent) {
+    private boolean prepareForRemoveSwitchEvent(SwitchEvent switchEvent) {
 	// No show stopping precondition
 	return true;
     }
@@ -888,62 +975,6 @@
 	return true;
     }
 
-    private void dispatchPutSwitchEvent(SwitchEvent switchEvent) {
-	for (INetworkGraphListener listener : this.networkGraphListeners) {
-	    // TODO Should copy before handing them over to listener
-	    listener.putSwitchEvent(switchEvent);
-	}
-    }
-
-    private void dispatchRemoveSwitchEvent(SwitchEvent switchEvent) {
-	for (INetworkGraphListener listener : this.networkGraphListeners) {
-	    // TODO Should copy before handing them over to listener
-	    listener.removeSwitchEvent(switchEvent);
-	}
-    }
-
-    private void dispatchPutPortEvent(PortEvent portEvent) {
-	for (INetworkGraphListener listener : this.networkGraphListeners) {
-	    // TODO Should copy before handing them over to listener
-	    listener.putPortEvent(portEvent);
-	}
-    }
-
-    private void dispatchRemovePortEvent(PortEvent portEvent) {
-	for (INetworkGraphListener listener : this.networkGraphListeners) {
-	    // TODO Should copy before handing them over to listener
-	    listener.removePortEvent(portEvent);
-	}
-    }
-
-    private void dispatchPutLinkEvent(LinkEvent linkEvent) {
-	for (INetworkGraphListener listener : this.networkGraphListeners) {
-	    // TODO Should copy before handing them over to listener
-	    listener.putLinkEvent(linkEvent);
-	}
-    }
-
-    private void dispatchRemoveLinkEvent(LinkEvent linkEvent) {
-	for (INetworkGraphListener listener : this.networkGraphListeners) {
-	    // TODO Should copy before handing them over to listener
-	    listener.removeLinkEvent(linkEvent);
-	}
-    }
-
-    private void dispatchPutDeviceEvent(DeviceEvent deviceEvent) {
-	for (INetworkGraphListener listener : this.networkGraphListeners) {
-	    // TODO Should copy before handing them over to listener
-	    listener.putDeviceEvent(deviceEvent);;
-	}
-    }
-
-    private void dispatchRemoveDeviceEvent(DeviceEvent deviceEvent) {
-	for (INetworkGraphListener listener : this.networkGraphListeners) {
-	    // TODO Should copy before handing them over to listener
-	    listener.removeDeviceEvent(deviceEvent);
-	}
-    }
-
     private SwitchImpl getSwitchImpl(Switch sw) {
 	if (sw instanceof SwitchImpl) {
 	    return (SwitchImpl) sw;
