diff --git a/src/main/java/net/onrc/onos/ofcontroller/floodlightlistener/RCNetworkGraphPublisher.java b/src/main/java/net/onrc/onos/ofcontroller/floodlightlistener/RCNetworkGraphPublisher.java
index ecf7b0d..0067e27 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/floodlightlistener/RCNetworkGraphPublisher.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/floodlightlistener/RCNetworkGraphPublisher.java
@@ -20,9 +20,12 @@
 import net.onrc.onos.ofcontroller.networkgraph.NetworkGraph;
 import net.onrc.onos.ofcontroller.networkgraph.SouthboundNetworkGraph;
 import net.onrc.onos.ofcontroller.networkgraph.Switch;
+import net.onrc.onos.ofcontroller.util.Dpid;
 import net.onrc.onos.registry.controller.IControllerRegistryService;
 
 import org.openflow.protocol.OFPhysicalPort;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /*
  * I've created a copy of the NetworkGraphPublisher so I can integrate
@@ -31,33 +34,48 @@
  * TODO Remove old NetworkGraphPublisher once the integration of the new
  * API is complete.
  * For now, we just write to the database and don't worry about sending
- * notifications. 
+ * notifications.
  * TODO Send notification after each database write
  */
 public class RCNetworkGraphPublisher implements /*IOFSwitchListener,*/
 												IOFSwitchPortListener,
 												ILinkDiscoveryListener,
 												IFloodlightModule {
+	private final static Logger log = LoggerFactory.getLogger(RCNetworkGraphPublisher.class);
 
 	private IFloodlightProviderService floodlightProvider;
 	private ILinkDiscoveryService linkDiscovery;
 	private IControllerRegistryService registryService;
 	private IDatagridService datagridService;
 	private INetworkGraphService networkGraphService;
-	
+
 	private NetworkGraph networkGraph;
 	private SouthboundNetworkGraph southboundNetworkGraph;
-	
+
 
 	@Override
 	public void linkDiscoveryUpdate(LDUpdate update) {
-		// TODO Auto-generated method stub
-		LinkImpl link = new LinkImpl(networkGraph);
-		link.setSrcSwitch(update.getSrc());
-		link.setSrcPort(update.getSrcPort());
-		link.setDstSwitch(update.getDst());
-		link.setDstPort(update.getDstPort());
-		
+
+		// TODO Move this sanity check when retrieving port to common place?
+		Switch srcSw = networkGraph.getSwitch(update.getSrc());
+		if (srcSw == null) {
+			log.error("Switch {} missing when adding Link {}",
+					new Dpid(update.getSrc()), update);
+			return;
+		}
+
+		Switch dstSw = networkGraph.getSwitch(update.getDst());
+		if (dstSw == null) {
+			log.error("Switch {} missing when adding Link {}",
+					new Dpid(update.getDst()), update);
+			return;
+		}
+
+		// XXX Is it correct to add Link object created with networkGraph to southboundNetworkGraph?
+		LinkImpl link = new LinkImpl(networkGraph,
+			srcSw.getPort((long) update.getSrcPort()),
+			dstSw.getPort((long) update.getDstPort()));
+
 		switch (update.getOperation()) {
 		case LINK_ADDED:
 			southboundNetworkGraph.addLink(link);
@@ -93,13 +111,13 @@
 	@Override
 	public void switchPortAdded(Long switchId, OFPhysicalPort port) {
 		// TODO Auto-generated method stub
-		
+
 	}
 
 	@Override
 	public void switchPortRemoved(Long switchId, OFPhysicalPort port) {
 		// TODO Auto-generated method stub
-		
+
 	}
 
 	@Override
@@ -108,10 +126,10 @@
 		if (!registryService.hasControl(sw.getId())) {
 			return;
 		}
-		
+
 		Switch onosSwitch = FloodlightToOnosMappers.map(networkGraph, sw);
 		southboundNetworkGraph.addSwitch(onosSwitch);
-		
+
 		/*
 		// TODO publish ADD_SWITCH event here
 	    TopologyElement topologyElement =
@@ -150,13 +168,13 @@
 	@Override
 	public void removedSwitch(IOFSwitch sw) {
 		// TODO Auto-generated method stub
-		
+
 	}
 
 	@Override
 	public void switchPortChanged(Long switchId) {
 		// TODO Auto-generated method stub
-		
+
 	}
 
 	@Override
@@ -168,14 +186,14 @@
 	/* *****************
 	 * IFloodlightModule
 	 * *****************/
-	
+
 	@Override
 	public Collection<Class<? extends IFloodlightService>> getModuleServices() {
 		return null;
 	}
 
 	@Override
-	public Map<Class<? extends IFloodlightService>, IFloodlightService> 
+	public Map<Class<? extends IFloodlightService>, IFloodlightService>
 			getServiceImpls() {
 		return null;
 	}
@@ -199,7 +217,7 @@
 		linkDiscovery = context.getServiceImpl(ILinkDiscoveryService.class);
 		registryService = context.getServiceImpl(IControllerRegistryService.class);
 		datagridService = context.getServiceImpl(IDatagridService.class);
-		
+
 		networkGraphService = context.getServiceImpl(INetworkGraphService.class);
 	}
 
@@ -208,7 +226,7 @@
 		// TODO enable cleanup thread
 		floodlightProvider.addOFSwitchListener(this);
 		linkDiscovery.addListener(this);
-		
+
 		networkGraph = networkGraphService.getNetworkGraph();
 		southboundNetworkGraph = networkGraphService.getSouthboundNetworkGraph();
 	}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/AbstractNetworkGraph.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/AbstractNetworkGraph.java
index 3fa4ad9..71ef16e 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/AbstractNetworkGraph.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/AbstractNetworkGraph.java
@@ -15,82 +15,99 @@
 import org.slf4j.LoggerFactory;
 
 public class AbstractNetworkGraph implements NetworkGraph {
-    @SuppressWarnings("unused")
-    private static final Logger log = LoggerFactory
-	    .getLogger(AbstractNetworkGraph.class);
+	@SuppressWarnings("unused")
+	private static final Logger log = LoggerFactory.getLogger(AbstractNetworkGraph.class);
 
-    // DPID -> Switch
-    protected ConcurrentMap<Long, Switch> switches;
+	// DPID -> Switch
+	protected ConcurrentMap<Long, Switch> switches;
 
-    protected ConcurrentMap<InetAddress, Set<Device>> addr2Device;
-    protected ConcurrentMap<MACAddress, Set<Device>> mac2Device;
+	protected ConcurrentMap<InetAddress, Set<Device>> addr2Device;
+	protected ConcurrentMap<MACAddress, Set<Device>> mac2Device;
 
-    public AbstractNetworkGraph() {
-	// TODO: Does these object need to be stored in Concurrent Collection?
-	switches = new ConcurrentHashMap<>();
-	addr2Device = new ConcurrentHashMap<>();
-	mac2Device = new ConcurrentHashMap<>();
-    }
-
-    @Override
-    public Switch getSwitch(long dpid) {
-	// TODO Check if it is safe to directly return this Object.
-	return switches.get(dpid);
-    }
-
-    @Override
-    public Iterable<Switch> getSwitches() {
-	// TODO Check if it is safe to directly return this Object.
-	return Collections.unmodifiableCollection(switches.values());
-    }
-
-    @Override
-    public Iterable<Link> getLinks() {
-	List<Link> linklist = new LinkedList<>();
-
-	for (Switch sw : switches.values()) {
-	    Iterable<Link> links = sw.getLinks();
-	    for (Link l : links) {
-		linklist.add(l);
-	    }
+	public AbstractNetworkGraph() {
+		// TODO: Does these object need to be stored in Concurrent Collection?
+		switches = new ConcurrentHashMap<>();
+		addr2Device = new ConcurrentHashMap<>();
+		mac2Device = new ConcurrentHashMap<>();
 	}
-	return linklist;
-    }
 
-    @Override
-    public Iterable<Link> getLinksFromSwitch(long dpid) {
-	Switch sw = getSwitch(dpid);
-	if (sw == null) {
-	    return Collections.emptyList();
+	@Override
+	public Switch getSwitch(Long dpid) {
+		// TODO Check if it is safe to directly return this Object.
+		return switches.get(dpid);
 	}
-	Iterable<Link> links = sw.getLinks();
-	if (links instanceof Collection) {
-	    return Collections.unmodifiableCollection((Collection<Link>) links);
-	} else {
-	    List<Link> linklist = new LinkedList<>();
-	    for (Link l : links) {
-		linklist.add(l);
-	    }
-	    return linklist;
-	}
-    }
 
-    @Override
-    public Iterable<Device> getDeviceByIp(InetAddress ipAddress) {
-	Set<Device> devices = addr2Device.get(ipAddress);
-	if (devices == null) {
-	    return Collections.emptyList();
+	@Override
+	public Iterable<Switch> getSwitches() {
+		// TODO Check if it is safe to directly return this Object.
+		return Collections.unmodifiableCollection(switches.values());
 	}
-	return Collections.unmodifiableCollection(devices);
-    }
 
-    @Override
-    public Iterable<Device> getDeviceByMac(MACAddress address) {
-	Set<Device> devices = mac2Device.get(address);
-	if (devices == null) {
-	    return Collections.emptyList();
+	@Override
+	public Iterable<Link> getLinks() {
+		List<Link> linklist = new LinkedList<>();
+
+		for (Switch sw : switches.values()) {
+			Iterable<Link> links = sw.getOutgoingLinks();
+			for (Link l : links) {
+				linklist.add(l);
+			}
+		}
+		return linklist;
 	}
-	return Collections.unmodifiableCollection(devices);
-    }
 
+	@Override
+	public Iterable<Link> getOutgoingLinksFromSwitch(Long dpid) {
+		Switch sw = getSwitch(dpid);
+		if (sw == null) {
+			return Collections.emptyList();
+		}
+		Iterable<Link> links = sw.getOutgoingLinks();
+		if (links instanceof Collection) {
+			return Collections.unmodifiableCollection((Collection<Link>) links);
+		} else {
+			List<Link> linklist = new LinkedList<>();
+			for (Link l : links) {
+				linklist.add(l);
+			}
+			return linklist;
+		}
+	}
+	
+	@Override
+	public Iterable<Link> getIncomingLinksFromSwitch(Long dpid) {
+		Switch sw = getSwitch(dpid);
+		if (sw == null) {
+			return Collections.emptyList();
+		}
+		Iterable<Link> links = sw.getIncomingLinks();
+		if (links instanceof Collection) {
+			return Collections.unmodifiableCollection((Collection<Link>) links);
+		} else {
+			List<Link> linklist = new LinkedList<>();
+			for (Link l : links) {
+				linklist.add(l);
+			}
+			return linklist;
+		}
+	}
+
+
+	@Override
+	public Iterable<Device> getDeviceByIp(InetAddress ipAddress) {
+		Set<Device> devices = addr2Device.get(ipAddress);
+		if (devices == null) {
+			return Collections.emptyList();
+		}
+		return Collections.unmodifiableCollection(devices);
+	}
+
+	@Override
+	public Iterable<Device> getDeviceByMac(MACAddress address) {
+		Set<Device> devices = mac2Device.get(address);
+		if (devices == null) {
+			return Collections.emptyList();
+		}
+		return Collections.unmodifiableCollection(devices);
+	}
 }
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/FloodlightToOnosMappers.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/FloodlightToOnosMappers.java
index 9bd8051..8139737 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/FloodlightToOnosMappers.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/FloodlightToOnosMappers.java
@@ -7,32 +7,24 @@
 public class FloodlightToOnosMappers {
 
 	public static Switch map(NetworkGraph graph, IOFSwitch sw) {
-		SwitchImpl onosSwitch = new SwitchImpl(graph);
-		onosSwitch.setDpid(sw.getId());
+		SwitchImpl onosSwitch = new SwitchImpl(graph, sw.getId());
 
 		for (OFPhysicalPort port : sw.getPorts()) {
-			onosSwitch.addPort(map(graph, port));
+			onosSwitch.addPort(map(graph, onosSwitch, port));
 		}
 
 		return onosSwitch;
 	}
 
-	public static Port map(NetworkGraph graph, OFPhysicalPort port) {
-		PortImpl onosPort = new PortImpl(graph);
-		onosPort.setPortNumber(port.getPortNumber());
+	public static Port map(NetworkGraph graph, SwitchImpl sw, OFPhysicalPort port) {
+		PortImpl onosPort = new PortImpl(graph, sw, new Long(port.getPortNumber()));
 		return onosPort;
 	}
 
 	public static Link map(NetworkGraph graph, net.floodlightcontroller.routing.Link link) {
-		LinkImpl onosLink = new LinkImpl(graph);
-
-		Switch srcSw = graph.getSwitch(link.getSrc());
-		onosLink.setSrcSwitch(srcSw);
-		onosLink.setSrcPort(srcSw.getPort(link.getSrcPort()));
-
-		Switch dstSw = graph.getSwitch(link.getDst());
-		onosLink.setDstSwitch(dstSw);
-		onosLink.setDstPort(dstSw.getPort(link.getDstPort()));
+		Port srcPort = graph.getSwitch(link.getSrc()).getPort(Long.valueOf(link.getSrcPort()));
+		Port dstPort = graph.getSwitch(link.getDst()).getPort(Long.valueOf(link.getDstPort()));
+		LinkImpl onosLink = new LinkImpl(graph, srcPort, dstPort);
 
 		return onosLink;
 
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/Link.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/Link.java
index 0fc72f6..ef74f73 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/Link.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/Link.java
@@ -12,13 +12,17 @@
 	public Port getDestinationPort();
 	public Switch getSourceSwitch();
 	public Switch getDestinationSwitch();
-
+		
 	public long getLastSeenTime();
+
 	public int getCost();
+	public Double getCapacity();
 
 	// Not sure if we want to expose these northbound
-	public long getSourceSwitchDpid();
-	public short getSourcePortNumber();
-	public long getDestinationSwitchDpid();
-	public short getDestinationPortNumber();
+	// Toshi: I think these are unnecessary because we can get them
+	// Toshi: like "this.getSourcePort().getSwitch()" etc.
+	public Long getSourceSwitchDpid();
+	public Long getSourcePortNumber();
+	public Long getDestinationSwitchDpid();
+	public Long getDestinationPortNumber();
 }
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/LinkImpl.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/LinkImpl.java
index c566eea..b1fc9b8 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/LinkImpl.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/LinkImpl.java
@@ -7,41 +7,50 @@
  * but this Object itself will not issue any read/write to the DataStore.
  */
 public class LinkImpl extends NetworkGraphObject implements Link {
+	protected Port srcPort;
+	protected Port dstPort;
 
-	private Switch srcSwitch;
-	private Port srcPort;
-	private Switch dstSwitch;
-	private Port dstPort;
+	protected static final Double DEFAULT_CAPACITY = Double.POSITIVE_INFINITY;
+	protected Double capacity = DEFAULT_CAPACITY;
 
-	private static final int DEFAULT_COST = 1;
-	private int cost = DEFAULT_COST;
+	protected static final int DEFAULT_COST = 1;
+	protected int cost = DEFAULT_COST;
 
-	public LinkImpl(NetworkGraph graph) {
+	public LinkImpl(NetworkGraph graph, Port srcPort, Port dstPort) {
 		super(graph);
+		this.srcPort = srcPort;
+		this.dstPort = dstPort;
+		setToPorts();
+	}
+
+	protected void setToPorts() {
+		((PortImpl)srcPort).setOutgoingLink(this);
+		((PortImpl)srcPort).setIncomingLink(this);		
+	}
+	
+	protected void unsetFromPorts() {
+		((PortImpl)srcPort).setOutgoingLink(null);
+		((PortImpl)srcPort).setIncomingLink(null);
 	}
 
 	@Override
 	public Port getSourcePort() {
-		// TODO Auto-generated method stub
-		return null;
+		return srcPort;
 	}
 
 	@Override
 	public Port getDestinationPort() {
-		// TODO Auto-generated method stub
-		return null;
+		return dstPort;
 	}
 
 	@Override
 	public Switch getSourceSwitch() {
-		// TODO Auto-generated method stub
-		return null;
+		return srcPort.getSwitch();
 	}
 
 	@Override
 	public Switch getDestinationSwitch() {
-		// TODO Auto-generated method stub
-		return null;
+		return dstPort.getSwitch();
 	}
 
 	@Override
@@ -60,44 +69,39 @@
 	}
 
 	@Override
-	public long getSourceSwitchDpid() {
-		return srcSwitch.getDpid();
-	}
-
-	public void setSrcSwitch(Switch srcSwitch) {
-	    // TODO null check
-		this.srcSwitch = srcSwitch;
+	public Long getSourceSwitchDpid() {
+		return srcPort.getSwitch().getDpid();
 	}
 
 	@Override
-	public short getSourcePortNumber() {
+	public Long getSourcePortNumber() {
 		return srcPort.getNumber();
 	}
 
-	public void setSrcPort(Port srcPort) {
-	    // TODO null check
-		this.srcPort = srcPort;
+	@Override
+	public Long getDestinationSwitchDpid() {
+		return dstPort.getSwitch().getDpid();
 	}
 
 	@Override
-	public long getDestinationSwitchDpid() {
-		return dstSwitch.getDpid();
-	}
-
-	public void setDstSwitch(Switch dstSwitch) {
-	    // TODO null check
-		this.dstSwitch = dstSwitch;
-	}
-
-	@Override
-	public short getDestinationPortNumber() {
+	public Long getDestinationPortNumber() {
 		return dstPort.getNumber();
 	}
 
-	public void setDstPort(Port dstPort) {
-	    // TODO null check
-		this.dstPort = dstPort;
+	@Override
+	public Double getCapacity() {
+		return capacity;
+	}
+	
+	@Override
+	public String toString() {
+		return String.format("%s --(cap:%f Mbps)--> %s",
+				getSourcePort().toString(),
+				getCapacity(),
+				getDestinationPort().toString());
 	}
 
-
+	public void setCapacity(Double capacity) {
+		this.capacity = capacity;
+	}
 }
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/MutableNetworkGraph.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/MutableNetworkGraph.java
new file mode 100644
index 0000000..b617e47
--- /dev/null
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/MutableNetworkGraph.java
@@ -0,0 +1,110 @@
+package net.onrc.onos.ofcontroller.networkgraph;
+
+import java.net.InetAddress;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.LinkedList;
+
+import net.floodlightcontroller.util.MACAddress;
+
+/**
+ * @author Toshio Koide (t-koide@onlab.us)
+ */
+public class MutableNetworkGraph implements NetworkGraph {
+	protected HashMap<Long, SwitchImpl> switches;
+	
+	public MutableNetworkGraph() {
+		switches = new HashMap<Long, SwitchImpl>();
+	}
+
+	// Switch operations
+	
+	public Switch addSwitch(Long switchId) {
+		if (switches.containsKey(switchId)) {
+			return null; // should throw exception
+		}
+		SwitchImpl sw = new SwitchImpl(this, switchId);
+		switches.put(sw.getDpid(), sw);
+		return sw;
+		
+	}
+
+	@Override
+	public Switch getSwitch(Long dpid) {
+		return switches.get(dpid);
+	}
+	
+	@Override
+	public Iterable<? extends Switch> getSwitches() {
+		return switches.values();
+	}
+	
+	// Link operations
+	
+	public Link addLink(Long srcDpid, Long srcPortNo, Long dstDpid, Long dstPortNo) {
+		return new LinkImpl(
+				this,
+				getSwitch(srcDpid).getPort(srcPortNo),
+				getSwitch(dstDpid).getPort(dstPortNo));
+	}
+	
+	public Link[] addBidirectionalLinks(Long srcDpid, Long srcPortNo, Long dstDpid, Long dstPortNo) {
+		Link[] links = new Link[2];
+		links[0] = addLink(srcDpid, srcPortNo, dstDpid, dstPortNo);
+		links[1] = addLink(dstDpid, dstPortNo, srcDpid, srcPortNo);
+		
+		return links;
+	}
+	
+	@Override
+	public Collection<Link> getLinks() {
+		LinkedList<Link> links = new LinkedList<Link>();
+		for (Switch sw: switches.values()) {
+			for (Port port: sw.getPorts()) {
+				Link link = port.getOutgoingLink();
+				if (link != null) {
+					links.add(link);
+				}
+			}
+		}
+		return links;
+	}
+
+	@Override
+	public Iterable<Link> getOutgoingLinksFromSwitch(Long dpid) {
+		LinkedList<Link> links = new LinkedList<Link>();
+		for (Port port: getSwitch(dpid).getPorts()) {
+			Link link = port.getOutgoingLink();
+			if (link != null) {
+				links.add(link);
+			}
+		}
+		return links;
+	}
+
+	@Override
+	public Iterable<Link> getIncomingLinksFromSwitch(Long dpid) {
+		LinkedList<Link> links = new LinkedList<Link>();
+		for (Port port: getSwitch(dpid).getPorts()) {
+			Link link = port.getIncomingLink();
+			if (link != null) {
+				links.add(link);
+			}
+		}
+		return links;
+	}
+	
+	// Device operations
+
+	@Override
+	public Iterable<Device> getDeviceByIp(InetAddress ipAddress) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public Iterable<Device> getDeviceByMac(MACAddress address) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraph.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraph.java
index 867ae98..1c4a390 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraph.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraph.java
@@ -11,11 +11,12 @@
  *
  */
 public interface NetworkGraph {
-	public Switch getSwitch(long dpid);
-	public Iterable<Switch> getSwitches();
+	public Switch getSwitch(Long dpid);
+	public Iterable<? extends Switch> getSwitches();
 	
-	public Iterable<Link> getLinks();
-	public Iterable<Link> getLinksFromSwitch(long dpid);
+	public Iterable<? extends Link> getLinks();
+	public Iterable<? extends Link> getOutgoingLinksFromSwitch(Long dpid); // Toshi: unnecessary
+	public Iterable<? extends Link> getIncomingLinksFromSwitch(Long dpid); // Toshi: unnecessary
 	
 	public Iterable<Device> getDeviceByIp(InetAddress ipAddress);
 	public Iterable<Device> getDeviceByMac(MACAddress address);
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 0debb70..50fda95 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraphImpl.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraphImpl.java
@@ -116,8 +116,7 @@
 		sw.read();
 		// TODO SwitchImpl probably should have a constructor from
 		// RCSwitch
-		SwitchImpl memSw = new SwitchImpl(this);
-		memSw.setDpid(sw.getDpid());
+		SwitchImpl memSw = new SwitchImpl(this, sw.getDpid());
 
 		addSwitch(memSw);
 	    } catch (ObjectDoesntExistException e) {
@@ -130,16 +129,13 @@
 		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);
+		PortImpl memPort = new PortImpl(this, sw, p.getNumber());
 
 		addPort(memPort);
 	    } catch (ObjectDoesntExistException e) {
@@ -158,41 +154,38 @@
 	// }
 
 	for (RCLink l : RCLink.getAllLinks()) {
-	    try {
-		l.read();
+		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;
+			Switch srcSw = this.getSwitch(l.getSrc().dpid);
+			if (srcSw == null) {
+				log.error("Switch {} missing when adding Link {}",
+						new Dpid(l.getSrc().dpid), l);
+				continue;
+			}
+
+			Switch dstSw = this.getSwitch(l.getDst().dpid);
+			if (dstSw == null) {
+				log.error("Switch {} missing when adding Link {}",
+						new Dpid(l.getDst().dpid), l);
+				continue;
+			}
+
+			LinkImpl memLink = new LinkImpl(this,
+				srcSw.getPort(l.getSrc().number),
+				dstSw.getPort(l.getDst().number));
+
+			addLink(memLink);
+		} catch (ObjectDoesntExistException e) {
+			log.debug("Delete Link Failed", e);
 		}
-		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.
-    public void readSwitchFromTopology(long dpid) {
-	SwitchImpl sw = new SwitchImpl(this);
+    public void readSwitchFromTopology(Long dpid) {
+	SwitchImpl sw = new SwitchImpl(this, dpid);
 
 	RCSwitch rcSwitch = new RCSwitch(dpid);
 	try {
@@ -202,8 +195,6 @@
 	    return;
 	}
 
-	sw.setDpid(rcSwitch.getDpid());
-
 	addSwitch(sw);
 
 	for (byte[] portId : rcSwitch.getAllPortIds()) {
@@ -211,13 +202,8 @@
 	    try {
 		rcPort.read();
 
-		PortImpl port = new PortImpl(this);
-		// port.setDpid(dpid);
+		PortImpl port = new PortImpl(this, sw, rcPort.getNumber());
 
-		// TODO why are port numbers long?
-		// port.setPortNumber((short)rcPort.getNumber());
-
-		port.setSwitch(sw);
 		sw.addPort(port);
 
 		addPort(port);
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/Port.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/Port.java
index 453dd14..126bbab 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/Port.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/Port.java
@@ -10,11 +10,11 @@
  *
  */
 public interface Port {
-	public short getNumber();
-	public String getName();
-	public long getHardwareAddress();
+	public Long getNumber();
+	public Long getHardwareAddress();
 
 	public Switch getSwitch();
 
-	public Link getLink();
+	public Link getOutgoingLink();
+	public Link getIncomingLink();
 }
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/PortImpl.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/PortImpl.java
index 2e1086c..97ee8b5 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/PortImpl.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/PortImpl.java
@@ -8,43 +8,26 @@
  */
 public class PortImpl extends NetworkGraphObject implements Port {
 
-	//private long dpid;
 	private Switch sw;
-	private short number;
+	private Long number;
+	protected Link outgoingLink;
+	protected Link incomingLink;
 
-	public PortImpl(NetworkGraph graph) {
+	public PortImpl(NetworkGraph graph, Switch parentSwitch, Long number) {
 		super(graph);
-	}
-
-	public void setPortNumber(short portNumber) {
-		number = portNumber;
+		this.sw = parentSwitch;
+		this.number = number;
 	}
 
 	@Override
-	public short getNumber() {
+	public Long getNumber() {
 		return number;
 	}
 
-	/*
-	public void setDpid(long dpid) {
-		this.dpid = dpid;
-	}
-
-	public long getDpid() {
-		return dpid;
-	}
-	*/
-
 	@Override
-	public String getName() {
+	public Long getHardwareAddress() {
 		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public long getHardwareAddress() {
-		// TODO Auto-generated method stub
-		return 0;
+		return 0L;
 	}
 
 	@Override
@@ -52,14 +35,28 @@
 		return sw;
 	}
 
-	public void setSwitch(Switch sw) {
-		this.sw = sw;
+	@Override
+	public Link getOutgoingLink() {
+		return outgoingLink;
 	}
 
 	@Override
-	public Link getLink() {
-		// TODO Auto-generated method stub
-		return null;
+	public Link getIncomingLink() {
+		return incomingLink;
 	}
 
+	public void setOutgoingLink(Link link) {
+		outgoingLink = link;
+	}
+
+	public void setIncomingLink(Link link) {
+		incomingLink = link;
+	}
+
+	@Override
+	public String toString() {
+		return String.format("%d:%d",
+				getSwitch().getDpid(),
+				getNumber());
+	}
 }
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/Switch.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/Switch.java
index 7552399..95ab440 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/Switch.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/Switch.java
@@ -12,11 +12,11 @@
  *
  */
 public interface Switch {
-	public long getDpid();
+	public Long getDpid();
 
 	public Collection<Port> getPorts();
 
-	public Port getPort(short number);
+	public Port getPort(Long number);
 
 
 	// Flows
@@ -25,9 +25,10 @@
 	// Graph traversal API
 	public Iterable<Switch> getNeighbors();
 
-	public Iterable<Link> getLinks();
+	public Iterable<Link> getOutgoingLinks();
+	public Iterable<Link> getIncomingLinks();
 
-	public Link getLinkToNeighbor(long dpid);
+	public Link getLinkToNeighbor(Long dpid);
 
 	public Collection<Device> getDevices();
 }
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/SwitchImpl.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/SwitchImpl.java
index 325718a..c1d1a1a 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/SwitchImpl.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/SwitchImpl.java
@@ -3,9 +3,8 @@
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.HashSet;
+import java.util.LinkedList;
 import java.util.Map;
-import java.util.Set;
 
 import net.onrc.onos.datastore.topology.RCPort;
 import net.onrc.onos.datastore.topology.RCSwitch;
@@ -21,17 +20,17 @@
  */
 public class SwitchImpl extends NetworkGraphObject implements Switch {
 
-	private long dpid;
-	private final Map<Short, Port> ports;
+	private Long dpid;
+	private final Map<Long, Port> ports;
 
-	public SwitchImpl(NetworkGraph graph) {
+	public SwitchImpl(NetworkGraph graph, Long dpid) {
 		super(graph);
-
-		ports = new HashMap<Short, Port>();
+		this.dpid = dpid;
+		ports = new HashMap<Long, Port>();
 	}
 
 	@Override
-	public long getDpid() {
+	public Long getDpid() {
 		return dpid;
 	}
 
@@ -41,7 +40,7 @@
 	}
 
 	@Override
-	public Port getPort(short number) {
+	public Port getPort(Long number) {
 		return ports.get(number);
 	}
 
@@ -58,8 +57,8 @@
 	}
 
 	@Override
-	public Link getLinkToNeighbor(long neighborDpid) {
-		for (Link link : graph.getLinksFromSwitch(dpid)) {
+	public Link getLinkToNeighbor(Long neighborDpid) {
+		for (Link link : graph.getOutgoingLinksFromSwitch(dpid)) {
 			if (link.getDestinationSwitch().getDpid() == neighborDpid) {
 				return link;
 			}
@@ -73,21 +72,14 @@
 		return null;
 	}
 
-	public void setDpid(long dpid) {
-		this.dpid = dpid;
-	}
-
 	public void addPort(Port port) {
 		this.ports.put(port.getNumber(), port);
 	}
-
-	@Override
-	public Iterable<Link> getLinks() {
-		Set<Link> links = new HashSet<>();
-		for( Port p : ports.values()) {
-		    links.add(p.getLink());
-		}
-		return links;
+	
+	public Port addPort(Long portNumber) {
+		PortImpl port = new PortImpl(graph, this, portNumber);
+		ports.put(port.getNumber(), port);
+		return port;
 	}
 
 	public void store() {
@@ -108,4 +100,28 @@
 		}
 
 	}
+
+	@Override
+	public Iterable<Link> getOutgoingLinks() {
+		LinkedList<Link> links = new LinkedList<Link>();
+		for (Port port: getPorts()) {
+			Link link = port.getOutgoingLink(); 
+			if (link != null) {
+				links.add(link);
+			}
+		}
+		return links;
+	}
+
+	@Override
+	public Iterable<Link> getIncomingLinks() {
+		LinkedList<Link> links = new LinkedList<Link>();
+		for (Port port: getPorts()) {
+			Link link = port.getIncomingLink(); 
+			if (link != null) {
+				links.add(link);
+			}
+		}
+		return links;
+	}
 }
