diff --git a/src/main/java/net/onrc/onos/ofcontroller/floodlightlistener/NetworkGraphPublisher.java b/src/main/java/net/onrc/onos/ofcontroller/floodlightlistener/NetworkGraphPublisher.java
index bc03535..bddc74b 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/floodlightlistener/NetworkGraphPublisher.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/floodlightlistener/NetworkGraphPublisher.java
@@ -15,7 +15,6 @@
 import net.floodlightcontroller.core.module.IFloodlightService;
 import net.floodlightcontroller.core.util.SingletonTask;
 import net.floodlightcontroller.threadpool.IThreadPoolService;
-import net.onrc.onos.datagrid.IDatagridService;
 import net.onrc.onos.ofcontroller.core.IOFSwitchPortListener;
 import net.onrc.onos.ofcontroller.devicemanager.IOnosDeviceListener;
 import net.onrc.onos.ofcontroller.devicemanager.IOnosDeviceService;
@@ -52,7 +51,6 @@
 	private IFloodlightProviderService floodlightProvider;
 	private ILinkDiscoveryService linkDiscovery;
 	private IControllerRegistryService registryService;
-	private IDatagridService datagridService;
 	private INetworkGraphService networkGraphService;
 
 	private IOnosDeviceService onosDeviceService;
@@ -111,46 +109,10 @@
 		public void controlChanged(long dpid, boolean hasControl) {
 			if (hasControl) {
 				log.debug("Got control to set switch {} INACTIVE", HexString.toHexString(dpid));
-				/*
-				// Get the affected ports
-				List<Short> ports = swStore.getPorts(HexString.toHexString(dpid));
-				// Get the affected links
-				List<Link> links = linkStore.getLinks(HexString.toHexString(dpid));
-				// Get the affected reverse links
-				List<Link> reverseLinks = linkStore.getReverseLinks(HexString.toHexString(dpid));
-				links.addAll(reverseLinks);
-				*/
+
 				SwitchEvent switchEvent = new SwitchEvent(dpid);
 				networkGraphDiscoveryInterface.removeSwitchDiscoveryEvent(switchEvent);
 			    registryService.releaseControl(dpid);
-
-			    // TODO publish UPDATE_SWITCH event here
-			    //
-			    // NOTE: Here we explicitly send
-			    // notification to remove the
-			    // switch, because it is inactive
-			    //
-			    /*
-			    TopologyElement topologyElement =
-				new TopologyElement(dpid);
-			    datagridService.notificationSendTopologyElementRemoved(topologyElement);
-
-			    // Publish: remove the affected ports
-			    for (Short port : ports) {
-				TopologyElement topologyElementPort =
-				    new TopologyElement(dpid, port);
-				datagridService.notificationSendTopologyElementRemoved(topologyElementPort);
-			    }
-			    // Publish: remove the affected links
-			    for (Link link : links) {
-				TopologyElement topologyElementLink =
-				    new TopologyElement(link.getSrc(),
-							link.getSrcPort(),
-							link.getDst(),
-							link.getDstPort());
-				datagridService.notificationSendTopologyElementRemoved(topologyElementLink);
-			    }
-			    */
 			}
 		}
     }
@@ -164,29 +126,12 @@
 		switch (update.getOperation()) {
 		case LINK_ADDED:
 			networkGraphDiscoveryInterface.putLinkDiscoveryEvent(linkEvent);
-			/*
-			TopologyElement topologyElement =
-					new TopologyElement(update.getSrc(),
-							update.getSrcPort(),
-							update.getDst(),
-							update.getDstPort());
-			datagridService.notificationSendTopologyElementAdded(topologyElement);
-			*/
 			break;
 		case LINK_UPDATED:
-			// I don't know what a LINK_UPDATED event is.
-			// We never use it.
+			// We don't use the LINK_UPDATED event (unsure what it means)
 			break;
 		case LINK_REMOVED:
 			networkGraphDiscoveryInterface.removeLinkDiscoveryEvent(linkEvent);
-			/*
-			TopologyElement topologyElement =
-					new TopologyElement(update.getSrc(),
-							update.getSrcPort(),
-							update.getDst(),
-							update.getDstPort());
-			datagridService.notificationSendTopologyElementRemoved(topologyElement);
-			*/
 			break;
 		default:
 			break;
@@ -219,56 +164,24 @@
 		for (OFPhysicalPort port : sw.getPorts()) {
 			portEvents.add(new PortEvent(sw.getId(), (long)port.getPortNumber()));
 		}
-		networkGraphDiscoveryInterface.putSwitchDiscoveryEvent(switchEvent, portEvents);
+		networkGraphDiscoveryInterface
+		    .putSwitchDiscoveryEvent(switchEvent, portEvents);
 
-		/*
-		// TODO publish ADD_SWITCH event here
-	    TopologyElement topologyElement =
-		new TopologyElement(sw.getId());
-	    datagridService.notificationSendTopologyElementAdded(topologyElement);
-		*/
-
-	    // Publish: add the ports
-	    // TODO: Add only ports that are UP?
 	    for (OFPhysicalPort port : sw.getPorts()) {
-			//TopologyElement topologyElementPort =
-			    //new TopologyElement(sw.getId(), port.getPortNumber());
-			//datagridService.notificationSendTopologyElementAdded(topologyElementPort);
-
 			// Allow links to be discovered on this port now that it's
 			// in the database
 			linkDiscovery.RemoveFromSuppressLLDPs(sw.getId(), port.getPortNumber());
 	    }
-
-	    /*
-	    // Add all links that might be connected already
-	    List<Link> links = linkStore.getLinks(HexString.toHexString(sw.getId()));
-	    // Add all reverse links as well
-	    List<Link> reverseLinks = linkStore.getReverseLinks(HexString.toHexString(sw.getId()));
-	    links.addAll(reverseLinks);
-
-	    // Publish: add the links
-	    for (Link link : links) {
-		TopologyElement topologyElementLink =
-		    new TopologyElement(link.getSrc(),
-					link.getSrcPort(),
-					link.getDst(),
-					link.getDstPort());
-		datagridService.notificationSendTopologyElementAdded(topologyElementLink);
-		*/
 	}
 
 	@Override
 	public void removedSwitch(IOFSwitch sw) {
-		// TODO move to cleanup thread
-		//SwitchEvent switchEvent = new SwitchEvent(sw.getId());
-		//networkGraphDiscoveryInterface.removeSwitchDiscoveryEvent(switchEvent);
+		// We don't use this event - switch remove is done by cleanup thread
 	}
 
 	@Override
 	public void switchPortChanged(Long switchId) {
-		// TODO Auto-generated method stub
-
+		// We don't use this event
 	}
 
 	@Override
@@ -300,7 +213,6 @@
         l.add(ILinkDiscoveryService.class);
         l.add(IThreadPoolService.class);
         l.add(IControllerRegistryService.class);
-        l.add(IDatagridService.class);
         l.add(INetworkGraphService.class);
         l.add(IOnosDeviceService.class);
         return l;
@@ -312,7 +224,6 @@
 		floodlightProvider = context.getServiceImpl(IFloodlightProviderService.class);
 		linkDiscovery = context.getServiceImpl(ILinkDiscoveryService.class);
 		registryService = context.getServiceImpl(IControllerRegistryService.class);
-		datagridService = context.getServiceImpl(IDatagridService.class);
 		onosDeviceService = context.getServiceImpl(IOnosDeviceService.class);
 
 		networkGraphService = context.getServiceImpl(INetworkGraphService.class);
@@ -320,7 +231,6 @@
 
 	@Override
 	public void startUp(FloodlightModuleContext context) {
-		// TODO enable cleanup thread
 		floodlightProvider.addOFSwitchListener(this);
 		linkDiscovery.addListener(this);
 		onosDeviceService.addOnosDeviceListener(this);
@@ -362,7 +272,7 @@
 			InetAddress ip = InetAddresses.fromInteger(device.getIpv4Address());
 			event.addIpAddress(ip);
 		}
-		//Does not use Vlan info now.
+		// Does not use vlan info now.
 
 		networkGraphDiscoveryInterface.putDeviceDiscoveryEvent(event);
 	}
