diff --git a/src/main/java/net/onrc/onos/core/topology/LinkImpl.java b/src/main/java/net/onrc/onos/core/topology/LinkImpl.java
new file mode 100644
index 0000000..d95d4fd
--- /dev/null
+++ b/src/main/java/net/onrc/onos/core/topology/LinkImpl.java
@@ -0,0 +1,94 @@
+package net.onrc.onos.core.topology;
+
+/**
+ * Link Object stored in In-memory Topology.
+ *
+ * TODO REMOVE following design memo: This object itself may hold the DBObject,
+ * 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;
+
+	protected static final Double DEFAULT_CAPACITY = Double.POSITIVE_INFINITY;
+	protected Double capacity = DEFAULT_CAPACITY;
+
+	protected static final int DEFAULT_COST = 1;
+	protected int cost = DEFAULT_COST;
+
+	/**
+	 * Constructor for when a link is read from the database and the Ports
+	 * already exist in the in-memory network graph.
+	 * @param graph
+	 * @param srcPort
+	 * @param dstPort
+	 */
+	public LinkImpl(NetworkGraph graph, Port srcPort, Port dstPort) {
+		super(graph);
+		this.srcPort = srcPort;
+		this.dstPort = dstPort;
+		setToPorts();
+	}
+
+	@Override
+	public Switch getSrcSwitch() {
+		return srcPort.getSwitch();
+	}
+
+	@Override
+	public Port getSrcPort() {
+		return srcPort;
+	}
+
+	@Override
+	public Switch getDstSwitch() {
+		return dstPort.getSwitch();
+	}
+
+	@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);
+	}
+
+	@Override
+	public long getLastSeenTime() {
+		// TODO Auto-generated method stub
+		return 0;
+	}
+
+	@Override
+	public int getCost() {
+		return cost;
+	}
+
+	public void setCost(int cost) {
+		this.cost = cost;
+	}
+
+	@Override
+	public Double getCapacity() {
+		return capacity;
+	}
+
+	public void setCapacity(Double capacity) {
+		this.capacity = capacity;
+	}
+
+	@Override
+	public String toString() {
+		return String.format("%s --(cap:%f Mbps)--> %s",
+				getSrcPort().toString(),
+				getCapacity(),
+				getDstPort().toString());
+	}
+}
