diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraphImpl.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraphImpl.java
index 29cc1d7..0debb70 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraphImpl.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraphImpl.java
@@ -1,7 +1,9 @@
 package net.onrc.onos.ofcontroller.networkgraph;
 
+import net.onrc.onos.datastore.topology.RCLink;
 import net.onrc.onos.datastore.topology.RCPort;
 import net.onrc.onos.datastore.topology.RCSwitch;
+import net.onrc.onos.ofcontroller.util.Dpid;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -11,8 +13,7 @@
 /**
  * The "NB" read-only Network Map.
  *
- * TODO Current implementation directly read from DB, but eventually, it should
- * read from In-memory shared Network Map instance within ONOS process.
+ * TODO To be synchronized based on TopologyEvent Notification.
  *
  */
 public class NetworkGraphImpl extends AbstractNetworkGraph {
@@ -25,32 +26,34 @@
     }
 
     void addSwitch(Switch sw) {
-	if ( sw == null ) {
+	if (sw == null) {
 	    throw new IllegalArgumentException("Switch cannot be null");
 	}
 	switches.put(sw.getDpid(), sw);
-
     }
 
     /**
-     * Deactivate Switch (and its Ports)
+     * Deactivate Switch (and its Ports?)
+     *
      * @param sw
      */
     void deactivateSwitch(Switch sw) {
-	if ( sw == null ) {
+	if (sw == null) {
 	    throw new IllegalArgumentException("Switch cannot be null");
 	}
 	SwitchImpl s = getSwitchImpl(sw);
+	// XXX When modifying existing object should we change the object itself
+	// or create a modified copy and switch them?
+
 	// TODO Deactivate Switch
 
 	// XXX Are we sure we want to deactivate Ports also?
 
 	// TODO Auto-generated method stub
-
     }
 
     void addPort(Port port) {
-	if ( port == null ) {
+	if (port == null) {
 	    throw new IllegalArgumentException("Port cannot be null");
 	}
 	// TODO Auto-generated method stub
@@ -58,7 +61,7 @@
     }
 
     void deactivatePort(Port port) {
-	if ( port == null ) {
+	if (port == null) {
 	    throw new IllegalArgumentException("Port cannot be null");
 	}
 	// TODO Auto-generated method stub
@@ -66,7 +69,7 @@
     }
 
     void addLink(Link link) {
-	if ( link == null ) {
+	if (link == null) {
 	    throw new IllegalArgumentException("Link cannot be null");
 	}
 	// TODO Auto-generated method stub
@@ -74,7 +77,7 @@
     }
 
     void removeLink(Link link) {
-	if ( link == null ) {
+	if (link == null) {
 	    throw new IllegalArgumentException("Link cannot be null");
 	}
 	// TODO Auto-generated method stub
@@ -82,7 +85,7 @@
     }
 
     void updateDevice(Device device) {
-	if ( device == null ) {
+	if (device == null) {
 	    throw new IllegalArgumentException("Device cannot be null");
 	}
 	// TODO Auto-generated method stub
@@ -90,7 +93,7 @@
     }
 
     void removeDevice(Device device) {
-	if ( device == null ) {
+	if (device == null) {
 	    throw new IllegalArgumentException("Device cannot be null");
 	}
 	// TODO Auto-generated method stub
@@ -98,10 +101,93 @@
     }
 
     private SwitchImpl getSwitchImpl(Switch sw) {
-	if( sw instanceof SwitchImpl ) {
+	if (sw instanceof SwitchImpl) {
 	    return (SwitchImpl) sw;
 	}
-	throw new ClassCastException("SwitchImpl expected, but found:" + sw.getClass().getName()  );
+	throw new ClassCastException("SwitchImpl expected, but found:"
+	        + sw.getClass().getName());
+    }
+
+    public void loadWholeTopologyFromDB() {
+	// XXX clear everything first?
+
+	for (RCSwitch sw : RCSwitch.getAllSwitches()) {
+	    try {
+		sw.read();
+		// TODO SwitchImpl probably should have a constructor from
+		// RCSwitch
+		SwitchImpl memSw = new SwitchImpl(this);
+		memSw.setDpid(sw.getDpid());
+
+		addSwitch(memSw);
+	    } catch (ObjectDoesntExistException e) {
+		log.error("Read Switch Failed, skipping", e);
+	    }
+	}
+
+	for (RCPort p : RCPort.getAllPorts()) {
+	    try {
+		p.read();
+
+		// TODO PortImpl probably should have a constructor from RCPort
+		PortImpl memPort = new PortImpl(this);
+		// FIXME remove shortValue()
+		memPort.setPortNumber(p.getNumber().shortValue());
+		Switch sw = this.getSwitch(p.getDpid());
+		if (sw == null) {
+		    log.error("Switch {} missing when adding Port {}",
+			    new Dpid(p.getDpid()), p);
+		    continue;
+		}
+		memPort.setSwitch(sw);
+
+		addPort(memPort);
+	    } catch (ObjectDoesntExistException e) {
+		log.error("Read Port Failed, skipping", e);
+	    }
+	}
+
+	// TODO Is Device going to be in DB? If so, read from DB.
+	// for (RCDevice d : RCDevice.getAllDevices()) {
+	// try {
+	// d.read();
+	//
+	// } catch (ObjectDoesntExistException e) {
+	// log.debug("Read Device Failed, skipping", e);
+	// }
+	// }
+
+	for (RCLink l : RCLink.getAllLinks()) {
+	    try {
+		l.read();
+
+		LinkImpl memLink = new LinkImpl(this);
+
+		Switch srcSw = this.getSwitch(l.getSrc().dpid);
+		if (srcSw == null) {
+		    log.error("Switch {} missing when adding Link {}",
+			    new Dpid(l.getSrc().dpid), l);
+		    continue;
+		}
+		memLink.setSrcSwitch(srcSw);
+		// FIXME remove shortValue()
+		memLink.setSrcPort(srcSw.getPort(l.getSrc().number.shortValue()));
+
+		Switch dstSw = this.getSwitch(l.getDst().dpid);
+		if (dstSw == null) {
+		    log.error("Switch {} missing when adding Link {}",
+			    new Dpid(l.getDst().dpid), l);
+		    continue;
+		}
+		memLink.setDstSwitch(dstSw);
+		// FIXME remove shortValue()
+		memLink.setDstPort(srcSw.getPort(l.getDst().number.shortValue()));
+
+		addLink(memLink);
+	    } catch (ObjectDoesntExistException e) {
+		log.debug("Delete Link Failed", e);
+	    }
+	}
     }
 
     // FIXME To be removed later this class should never read from DB.
