diff --git a/src/main/java/net/onrc/onos/core/devicemanager/OnosDeviceManager.java b/src/main/java/net/onrc/onos/core/devicemanager/OnosDeviceManager.java
index dde6f55..3177f61 100644
--- a/src/main/java/net/onrc/onos/core/devicemanager/OnosDeviceManager.java
+++ b/src/main/java/net/onrc/onos/core/devicemanager/OnosDeviceManager.java
@@ -166,7 +166,7 @@
         }
 
         //If the switch port we try to attach a new device already has a link, then stop adding device
-        if (networkGraph.getLink(dpid, (long) portId) != null) {
+        if (networkGraph.getOutgoingLink(dpid, (long) portId) != null) {
             if (log.isTraceEnabled()) {
                 log.trace("Stop adding OnosDevice {} due to there is a link to: dpid {} port {}",
                         srcDevice.getMacAddress(), dpid, portId);
diff --git a/src/main/java/net/onrc/onos/core/topology/LinkImpl.java b/src/main/java/net/onrc/onos/core/topology/LinkImpl.java
index 4333e38..bf66100 100644
--- a/src/main/java/net/onrc/onos/core/topology/LinkImpl.java
+++ b/src/main/java/net/onrc/onos/core/topology/LinkImpl.java
@@ -1,5 +1,7 @@
 package net.onrc.onos.core.topology;
 
+import net.onrc.onos.core.util.SwitchPort;
+
 /**
  * Link Object stored in In-memory Topology.
  * <p/>
@@ -7,8 +9,8 @@
  * 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 SwitchPort srcPort;
+    private SwitchPort dstPort;
 
     protected static final Double DEFAULT_CAPACITY = Double.POSITIVE_INFINITY;
     protected Double capacity = DEFAULT_CAPACITY;
@@ -26,39 +28,28 @@
      */
     public LinkImpl(NetworkGraph graph, Port srcPort, Port dstPort) {
         super(graph);
-        this.srcPort = srcPort;
-        this.dstPort = dstPort;
-        setToPorts();
+        this.srcPort = srcPort.asSwitchPort();
+        this.dstPort = dstPort.asSwitchPort();
     }
 
     @Override
     public Switch getSrcSwitch() {
-        return srcPort.getSwitch();
+        return graph.getSwitch(srcPort.dpid().value());
     }
 
     @Override
     public Port getSrcPort() {
-        return srcPort;
+        return graph.getPort(srcPort.dpid().value(), (long) srcPort.port().value());
     }
 
     @Override
     public Switch getDstSwitch() {
-        return dstPort.getSwitch();
+        return graph.getSwitch(dstPort.dpid().value());
     }
 
     @Override
     public Port getDstPort() {
-        return dstPort;
-    }
-
-    protected void setToPorts() {
-        ((PortImpl) srcPort).setOutgoingLink(this);
-        ((PortImpl) dstPort).setIncomingLink(this);
-    }
-
-    protected void unsetFromPorts() {
-        ((PortImpl) srcPort).setOutgoingLink(null);
-        ((PortImpl) dstPort).setIncomingLink(null);
+        return graph.getPort(dstPort.dpid().value(), (long) dstPort.port().value());
     }
 
     @Override
diff --git a/src/main/java/net/onrc/onos/core/topology/NetworkGraph.java b/src/main/java/net/onrc/onos/core/topology/NetworkGraph.java
index d450784..6133bb6 100644
--- a/src/main/java/net/onrc/onos/core/topology/NetworkGraph.java
+++ b/src/main/java/net/onrc/onos/core/topology/NetworkGraph.java
@@ -33,13 +33,23 @@
     public Port getPort(Long dpid, Long number);
 
     /**
-     * Get the outgoing link for a switch and a port.
+     * Get the outgoing link from a switch port.
      *
      * @param dpid   the switch DPID.
      * @param number the switch port number.
      * @return the outgoing link if found, otherwise null.
      */
-    public Link getLink(Long dpid, Long number);
+    public Link getOutgoingLink(Long dpid, Long number);
+    // TODO See if we should change <dpid, port_num> pairs to SwitchPort
+
+    /**
+     * Get the incoming link to a switch port.
+     *
+     * @param dpid   the switch DPID.
+     * @param number the switch port number.
+     * @return the incoming link if found, otherwise null.
+     */
+    public Link getIncomingLink(Long dpid, Long number);
 
     /**
      * Get the outgoing link from a switch and a port to another switch and
diff --git a/src/main/java/net/onrc/onos/core/topology/NetworkGraphImpl.java b/src/main/java/net/onrc/onos/core/topology/NetworkGraphImpl.java
index b20ab6b..395f2af 100644
--- a/src/main/java/net/onrc/onos/core/topology/NetworkGraphImpl.java
+++ b/src/main/java/net/onrc/onos/core/topology/NetworkGraphImpl.java
@@ -1,8 +1,6 @@
 package net.onrc.onos.core.topology;
 
 import java.util.Collections;
-import java.util.LinkedList;
-import java.util.List;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.locks.Lock;
@@ -10,6 +8,7 @@
 import java.util.concurrent.locks.ReentrantReadWriteLock;
 
 import net.floodlightcontroller.util.MACAddress;
+import net.onrc.onos.core.util.SwitchPort;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -19,8 +18,11 @@
     private static final Logger log = LoggerFactory.getLogger(NetworkGraphImpl.class);
 
     // DPID -> Switch
-    private ConcurrentMap<Long, Switch> switches;
-    private ConcurrentMap<MACAddress, Device> mac2Device;
+    private final ConcurrentMap<Long, Switch> switches;
+    private final ConcurrentMap<MACAddress, Device> mac2Device;
+
+    private final ConcurrentMap<SwitchPort, Link> outgoingLinks;
+    private final ConcurrentMap<SwitchPort, Link> incomingLinks;
 
     private ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
     private Lock readLock = readWriteLock.readLock();
@@ -31,6 +33,8 @@
         // TODO: Does these object need to be stored in Concurrent Collection?
         switches = new ConcurrentHashMap<>();
         mac2Device = new ConcurrentHashMap<>();
+        outgoingLinks = new ConcurrentHashMap<>();
+        incomingLinks = new ConcurrentHashMap<>();
     }
 
     @Override
@@ -63,18 +67,19 @@
     }
 
     @Override
-    public Link getLink(Long dpid, Long number) {
-        Port srcPort = getPort(dpid, number);
-        if (srcPort == null) {
-            return null;
-        }
-        return srcPort.getOutgoingLink();
+    public Link getOutgoingLink(Long dpid, Long number) {
+        return outgoingLinks.get(new SwitchPort(dpid, number.shortValue()));
+    }
+
+    @Override
+    public Link getIncomingLink(Long dpid, Long number) {
+        return incomingLinks.get(new SwitchPort(dpid, number.shortValue()));
     }
 
     @Override
     public Link getLink(Long srcDpid, Long srcNumber, Long dstDpid,
                         Long dstNumber) {
-        Link link = getLink(srcDpid, srcNumber);
+        Link link = getOutgoingLink(srcDpid, srcNumber);
         if (link == null) {
             return null;
         }
@@ -89,15 +94,17 @@
 
     @Override
     public Iterable<Link> getLinks() {
-        List<Link> linklist = new LinkedList<>();
+        return Collections.unmodifiableCollection(outgoingLinks.values());
+    }
 
-        for (Switch sw : switches.values()) {
-            Iterable<Link> links = sw.getOutgoingLinks();
-            for (Link l : links) {
-                linklist.add(l);
-            }
-        }
-        return linklist;
+    protected void putLink(Link link) {
+        outgoingLinks.put(link.getSrcPort().asSwitchPort(), link);
+        incomingLinks.put(link.getDstPort().asSwitchPort(), link);
+    }
+
+    protected void removeLink(Link link) {
+        outgoingLinks.remove(link.getSrcPort().asSwitchPort(), link);
+        incomingLinks.remove(link.getDstPort().asSwitchPort(), link);
     }
 
     @Override
diff --git a/src/main/java/net/onrc/onos/core/topology/Port.java b/src/main/java/net/onrc/onos/core/topology/Port.java
index 75aac52..44f4bcf 100644
--- a/src/main/java/net/onrc/onos/core/topology/Port.java
+++ b/src/main/java/net/onrc/onos/core/topology/Port.java
@@ -1,7 +1,10 @@
 package net.onrc.onos.core.topology;
 
-// TODO Everything returned by these interfaces must be either Unmodifiable view,
-// immutable object, or a copy of the original "SB" In-memory Topology.
+import net.onrc.onos.core.util.SwitchPort;
+
+//TODO Everything returned by these interfaces must be either Unmodifiable view,
+//immutable object, or a copy of the original "SB" In-memory Topology.
+
 /**
  * Interface of Port object in Network Graph topology.
  */
@@ -22,6 +25,14 @@
     public Long getNumber();
 
     /**
+     * Gets a {@link SwitchPort} that represents this Port's dpid and port
+     * number.
+     *
+     * @return a SwitchPort representing the Port
+     */
+    public SwitchPort asSwitchPort();
+
+    /**
      * Gets the hardware address of this port.
      * <p/>
      * TODO Not implemented yet.
diff --git a/src/main/java/net/onrc/onos/core/topology/PortImpl.java b/src/main/java/net/onrc/onos/core/topology/PortImpl.java
index 32646d0..1f6946a 100644
--- a/src/main/java/net/onrc/onos/core/topology/PortImpl.java
+++ b/src/main/java/net/onrc/onos/core/topology/PortImpl.java
@@ -4,6 +4,8 @@
 import java.util.HashSet;
 import java.util.Set;
 
+import net.onrc.onos.core.util.SwitchPort;
+
 /**
  * Port Object stored in In-memory Topology.
  * <p/>
@@ -17,8 +19,8 @@
     private Long number;
     private String description;
 
-    protected Link outgoingLink;
-    protected Link incomingLink;
+    private final SwitchPort switchPort;
+
     // These needs to be ConcurrentCollecton if allowing Graph to be accessed Concurrently
     protected Set<Device> devices;
 
@@ -27,6 +29,8 @@
         this.sw = parentSwitch;
         this.number = number;
         this.devices = new HashSet<>();
+
+        switchPort = new SwitchPort(parentSwitch.getDpid(), number.shortValue());
     }
 
     @Override
@@ -40,6 +44,11 @@
     }
 
     @Override
+    public SwitchPort asSwitchPort() {
+        return switchPort;
+    }
+
+    @Override
     public String getDescription() {
         return description;
     }
@@ -61,12 +70,14 @@
 
     @Override
     public Link getOutgoingLink() {
-        return outgoingLink;
+        return graph.getOutgoingLink(switchPort.dpid().value(),
+                (long) switchPort.port().value());
     }
 
     @Override
     public Link getIncomingLink() {
-        return incomingLink;
+        return graph.getIncomingLink(switchPort.dpid().value(),
+                (long) switchPort.port().value());
     }
 
     @Override
@@ -74,14 +85,6 @@
         return Collections.unmodifiableSet(this.devices);
     }
 
-    public void setOutgoingLink(Link link) {
-        outgoingLink = link;
-    }
-
-    public void setIncomingLink(Link link) {
-        incomingLink = link;
-    }
-
     /**
      * @param d
      * @return true if successfully added
diff --git a/src/main/java/net/onrc/onos/core/topology/SwitchImpl.java b/src/main/java/net/onrc/onos/core/topology/SwitchImpl.java
index 3fe053c..1e5e1e2 100644
--- a/src/main/java/net/onrc/onos/core/topology/SwitchImpl.java
+++ b/src/main/java/net/onrc/onos/core/topology/SwitchImpl.java
@@ -99,7 +99,7 @@
     @Override
     public Iterable<Link> getOutgoingLinks() {
         LinkedList<Link> links = new LinkedList<Link>();
-        for (Port port : getPorts()) {
+        for (Port port : ports.values()) {
             Link link = port.getOutgoingLink();
             if (link != null) {
                 links.add(link);
@@ -111,7 +111,7 @@
     @Override
     public Iterable<Link> getIncomingLinks() {
         LinkedList<Link> links = new LinkedList<Link>();
-        for (Port port : getPorts()) {
+        for (Port port : ports.values()) {
             Link link = port.getIncomingLink();
             if (link != null) {
                 links.add(link);
diff --git a/src/main/java/net/onrc/onos/core/topology/TopologyManager.java b/src/main/java/net/onrc/onos/core/topology/TopologyManager.java
index bf3874b..67e8e5d 100644
--- a/src/main/java/net/onrc/onos/core/topology/TopologyManager.java
+++ b/src/main/java/net/onrc/onos/core/topology/TopologyManager.java
@@ -951,10 +951,7 @@
         assert (link == srcPort.getOutgoingLink());
         if (link == null) {
             link = new LinkImpl(networkGraph, srcPort, dstPort);
-            PortImpl srcPortImpl = getPortImpl(srcPort);
-            PortImpl dstPortImpl = getPortImpl(dstPort);
-            srcPortImpl.setOutgoingLink(link);
-            dstPortImpl.setIncomingLink(link);
+            networkGraph.putLink(link);
 
             // Remove all Devices attached to the Ports
             ArrayList<DeviceEvent> devicesToRemove = new ArrayList<>();
@@ -1019,8 +1016,11 @@
         if (link == null) {
             log.warn("Link {} already removed on src Port", linkEvent);
         }
-        getPortImpl(dstPort).setIncomingLink(null);
-        getPortImpl(srcPort).setOutgoingLink(null);
+
+        // TODO should we check that we get the same link from each port?
+        if (link != null) {
+            networkGraph.removeLink(link);
+        }
 
         apiRemovedLinkEvents.add(linkEvent);
     }
diff --git a/src/test/java/net/onrc/onos/core/intent/ConstrainedBFSTreeTest.java b/src/test/java/net/onrc/onos/core/intent/ConstrainedBFSTreeTest.java
index 1a12cf9..669311f 100644
--- a/src/test/java/net/onrc/onos/core/intent/ConstrainedBFSTreeTest.java
+++ b/src/test/java/net/onrc/onos/core/intent/ConstrainedBFSTreeTest.java
@@ -3,7 +3,6 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
-
 import net.onrc.onos.core.intent.IntentOperation.Operator;
 import net.onrc.onos.core.topology.LinkEvent;
 import net.onrc.onos.core.topology.Path;
@@ -58,21 +57,21 @@
 
         assertNotNull(path12);
         assertEquals(1, path12.size());
-        assertEquals(new LinkEvent(graph.getLink(1L, 12L)), path12.get(0));
+        assertEquals(new LinkEvent(graph.getOutgoingLink(1L, 12L)), path12.get(0));
 
         assertNotNull(path13);
         assertEquals(2, path13.size());
         if (path13.get(0).getDst().getDpid() == 2L) {
-            assertEquals(new LinkEvent(graph.getLink(1L, 12L)), path13.get(0));
-            assertEquals(new LinkEvent(graph.getLink(2L, 23L)), path13.get(1));
+            assertEquals(new LinkEvent(graph.getOutgoingLink(1L, 12L)), path13.get(0));
+            assertEquals(new LinkEvent(graph.getOutgoingLink(2L, 23L)), path13.get(1));
         } else {
-            assertEquals(new LinkEvent(graph.getLink(1L, 14L)), path13.get(0));
-            assertEquals(new LinkEvent(graph.getLink(4L, 43L)), path13.get(1));
+            assertEquals(new LinkEvent(graph.getOutgoingLink(1L, 14L)), path13.get(0));
+            assertEquals(new LinkEvent(graph.getOutgoingLink(4L, 43L)), path13.get(1));
         }
 
         assertNotNull(path14);
         assertEquals(1, path14.size());
-        assertEquals(new LinkEvent(graph.getLink(1L, 14L)), path14.get(0));
+        assertEquals(new LinkEvent(graph.getOutgoingLink(1L, 14L)), path14.get(0));
     }
 
     @Test
@@ -96,7 +95,7 @@
         assertNull(path14);
         assertNotNull(path21);
         assertEquals(1, path21.size());
-        assertEquals(new LinkEvent(graph.getLink(2L, 21L)), path21.get(0));
+        assertEquals(new LinkEvent(graph.getOutgoingLink(2L, 21L)), path21.get(0));
     }
 
     @Test
@@ -118,7 +117,7 @@
 
         assertNotNull(path1);
         assertEquals(1, path1.size());
-        assertEquals(new LinkEvent(graph.getLink(1L, 12L)), path1.get(0));
+        assertEquals(new LinkEvent(graph.getOutgoingLink(1L, 12L)), path1.get(0));
 
         PathIntent pathIntent1 = new PathIntent("pi1", path1, 600.0, intent1);
         intentOps.add(Operator.ADD, pathIntent1);
@@ -130,8 +129,8 @@
 
         assertNotNull(path2);
         assertEquals(2, path2.size());
-        assertEquals(new LinkEvent(graph.getLink(1L, 14L)), path2.get(0));
-        assertEquals(new LinkEvent(graph.getLink(4L, 42L)), path2.get(1));
+        assertEquals(new LinkEvent(graph.getOutgoingLink(1L, 14L)), path2.get(0));
+        assertEquals(new LinkEvent(graph.getOutgoingLink(4L, 42L)), path2.get(1));
 
         PathIntent pathIntent2 = new PathIntent("pi2", path2, 600.0, intent2);
         intentOps.add(Operator.ADD, pathIntent2);
diff --git a/src/test/java/net/onrc/onos/core/intent/MockNetworkGraph.java b/src/test/java/net/onrc/onos/core/intent/MockNetworkGraph.java
index b2435d6..d481182 100644
--- a/src/test/java/net/onrc/onos/core/intent/MockNetworkGraph.java
+++ b/src/test/java/net/onrc/onos/core/intent/MockNetworkGraph.java
@@ -2,9 +2,7 @@
 
 import net.onrc.onos.core.topology.Link;
 import net.onrc.onos.core.topology.LinkImpl;
-import net.onrc.onos.core.topology.NetworkGraph;
 import net.onrc.onos.core.topology.NetworkGraphImpl;
-import net.onrc.onos.core.topology.Port;
 import net.onrc.onos.core.topology.Switch;
 import net.onrc.onos.core.topology.SwitchImpl;
 
@@ -15,36 +13,29 @@
  * @author Toshio Koide (t-koide@onlab.us)
  */
 public class MockNetworkGraph extends NetworkGraphImpl {
+    // TODO this class doesn't seem like it should extend NetworkGraphImpl. It
+    // isn't a NetworkGraph, it's more of a NetworkGraphBuilder - methods to
+    // create an populate a fake network graph that's not based on discovery
+    // data from the driver modules.
+    // We may well need a MockNetworkGraph, but that's not what this class is
+    // doing.
+
     public static Long LOCAL_PORT = 0xFFFEL;
     public SwitchImpl sw1, sw2, sw3, sw4;
 
-    class DetachableLinkImpl extends LinkImpl {
-        public DetachableLinkImpl(NetworkGraph graph, Port srcPort, Port dstPort) {
-            super(graph, srcPort, dstPort);
-        }
-
-        public void detachFromGraph() {
-            unsetFromPorts();
-        }
-    }
-
     public Switch addSwitch(Long switchId) {
         SwitchImpl sw = new SwitchImpl(this, switchId);
         this.putSwitch(sw);
         return sw;
     }
 
-    public Link addLink(Long srcDpid, Long srcPortNo, Long dstDpid, Long dstPortNo) {
-        return new DetachableLinkImpl(
-                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);
+        links[0] = new LinkImpl(this, getPort(srcDpid, srcPortNo), getPort(dstDpid, dstPortNo));
+        links[1] = new LinkImpl(this, getPort(dstDpid, dstPortNo), getPort(srcDpid, srcPortNo));
+
+        putLink(links[0]);
+        putLink(links[1]);
 
         return links;
     }
@@ -92,9 +83,6 @@
     }
 
     public void removeLink(Long srcDpid, Long srcPortNo, Long dstDpid, Long dstPortNo) {
-        DetachableLinkImpl link = (DetachableLinkImpl) getSwitch(srcDpid).getPort(srcPortNo).getOutgoingLink();
-        if (link.getDstSwitch().getDpid().equals(dstDpid) && link.getDstPort().getNumber().equals(dstPortNo)) {
-            link.detachFromGraph();
-        }
+        removeLink(getLink(srcDpid, srcPortNo, dstDpid, dstPortNo));
     }
 }
