diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/Device.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/Device.java
new file mode 100644
index 0000000..5124f82
--- /dev/null
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/Device.java
@@ -0,0 +1,16 @@
+package net.onrc.onos.ofcontroller.networkgraph;
+
+import java.net.InetAddress;
+import java.util.Collection;
+
+import net.floodlightcontroller.util.MACAddress;
+
+public interface Device {
+	public MACAddress getMacAddress();
+	
+	public Collection<InetAddress> getIpAddress();
+	
+	public Iterable<Port> getAttachmentPoints();
+	
+	public long getLastSeenTime();
+}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/FloodlightToOnosMappers.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/FloodlightToOnosMappers.java
new file mode 100644
index 0000000..0619087
--- /dev/null
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/FloodlightToOnosMappers.java
@@ -0,0 +1,37 @@
+package net.onrc.onos.ofcontroller.networkgraph;
+
+import org.openflow.protocol.OFPhysicalPort;
+
+import net.floodlightcontroller.core.IOFSwitch;
+
+public class FloodlightToOnosMappers {
+
+	public static Switch map(NetworkGraph graph, IOFSwitch sw) {
+		SwitchImpl onosSwitch = new SwitchImpl(graph);
+		onosSwitch.setDpid(sw.getId());
+		
+		for (OFPhysicalPort port : sw.getPorts()) {
+			onosSwitch.addPort(map(graph, port));
+		}
+		
+		return onosSwitch;
+	}
+	
+	public static Port map(NetworkGraph graph, OFPhysicalPort port) {
+		PortImpl onosPort = new PortImpl(graph);
+		onosPort.setPortNumber(port.getPortNumber());
+		return onosPort;
+	}
+	
+	public static Link map(NetworkGraph graph, net.floodlightcontroller.routing.Link link) {
+		LinkImpl onosLink = new LinkImpl(graph);
+		
+		onosLink.setSrcSwitch(link.getSrc());
+		onosLink.setSrcPort(link.getSrcPort());
+		onosLink.setDstSwitch(link.getDst());
+		onosLink.setDstPort(link.getDstPort());
+		
+		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
new file mode 100644
index 0000000..6c84382
--- /dev/null
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/Link.java
@@ -0,0 +1,17 @@
+package net.onrc.onos.ofcontroller.networkgraph;
+
+public interface Link {
+	public Port getSourcePort();
+	public Port getDestinationPort();
+	public Switch getSourceSwitch();
+	public Switch getDestinationSwitch();
+	
+	public long getLastSeenTime();
+	public int getCost();
+	
+	// Not sure if we want to expose these northbound
+	public long getSourceSwitchDpid();
+	public short getSourcePortNumber();
+	public long getDestinationSwitchDpid();
+	public short 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
new file mode 100644
index 0000000..888daae
--- /dev/null
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/LinkImpl.java
@@ -0,0 +1,93 @@
+package net.onrc.onos.ofcontroller.networkgraph;
+
+public class LinkImpl extends NetworkGraphObject implements Link {
+	
+	private long srcSwitch;
+	private short srcPort;
+	private long dstSwitch;
+	private short dstPort;
+	
+	private static final int DEFAULT_COST = 1;
+	private int cost = DEFAULT_COST;
+
+	public LinkImpl(NetworkGraph graph) {
+		super(graph);
+	}
+
+	@Override
+	public Port getSourcePort() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public Port getDestinationPort() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public Switch getSourceSwitch() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public Switch getDestinationSwitch() {
+		// TODO Auto-generated method stub
+		return 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 long getSourceSwitchDpid() {
+		return srcSwitch;
+	}
+
+	public void setSrcSwitch(long srcSwitch) {
+		this.srcSwitch = srcSwitch;
+	}
+
+	@Override
+	public short getSourcePortNumber() {
+		return srcPort;
+	}
+
+	public void setSrcPort(short srcPort) {
+		this.srcPort = srcPort;
+	}
+
+	@Override
+	public long getDestinationSwitchDpid() {
+		return dstSwitch;
+	}
+
+	public void setDstSwitch(long dstSwitch) {
+		this.dstSwitch = dstSwitch;
+	}
+
+	@Override
+	public short getDestinationPortNumber() {
+		return dstPort;
+	}
+
+	public void setDstPort(short dstPort) {
+		this.dstPort = dstPort;
+	}
+
+	
+}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraph.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraph.java
new file mode 100644
index 0000000..867ae98
--- /dev/null
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraph.java
@@ -0,0 +1,22 @@
+package net.onrc.onos.ofcontroller.networkgraph;
+
+import java.net.InetAddress;
+
+import net.floodlightcontroller.util.MACAddress;
+
+/**
+ * The northbound interface to the topology network graph. This interface
+ * is presented to the rest of ONOS. It is currently read-only, as we want
+ * only the discovery modules to be allowed to modify the topology.
+ *
+ */
+public interface NetworkGraph {
+	public Switch getSwitch(long dpid);
+	public Iterable<Switch> getSwitches();
+	
+	public Iterable<Link> getLinks();
+	public Iterable<Link> getLinksFromSwitch(long dpid);
+	
+	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
new file mode 100644
index 0000000..5f42ef2
--- /dev/null
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraphImpl.java
@@ -0,0 +1,84 @@
+package net.onrc.onos.ofcontroller.networkgraph;
+
+import java.net.InetAddress;
+
+import net.floodlightcontroller.util.MACAddress;
+import net.onrc.onos.datastore.topology.RCPort;
+import net.onrc.onos.datastore.topology.RCSwitch;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import edu.stanford.ramcloud.JRamCloud.ObjectDoesntExistException;
+
+public class NetworkGraphImpl implements NetworkGraph {
+
+	private static final Logger log = LoggerFactory.getLogger(NetworkGraphImpl.class);
+	
+	@Override
+	public Switch getSwitch(long dpid) {
+		SwitchImpl sw = new SwitchImpl(this);
+		
+		RCSwitch rcSwitch = new RCSwitch(dpid);
+		try {
+			rcSwitch.read();
+		} catch (ObjectDoesntExistException e) {
+			log.warn("Tried to get a switch that doesn't exist {}", dpid);
+			return null;
+		}
+		
+		sw.setDpid(rcSwitch.getDpid());
+		
+		for (byte[] portId : rcSwitch.getAllPortIds()) {
+			RCPort rcPort = RCPort.createFromKey(portId);
+			try {
+				rcPort.read();
+				
+				PortImpl port = new PortImpl(this);
+				//port.setDpid(dpid);
+				
+				// TODO why are port numbers long?
+				//port.setPortNumber((short)rcPort.getNumber());
+				
+				port.setSwitch(sw);
+				sw.addPort(port);
+				
+			} catch (ObjectDoesntExistException e) {
+				log.warn("Tried to read port that doesn't exist", rcPort);
+			}
+		}
+		
+		return sw;
+	}
+
+	@Override
+	public Iterable<Switch> getSwitches() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public Iterable<Link> getLinks() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public Iterable<Link> getLinksFromSwitch(long dpid) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@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/NetworkGraphObject.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraphObject.java
new file mode 100644
index 0000000..4bea422
--- /dev/null
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraphObject.java
@@ -0,0 +1,12 @@
+package net.onrc.onos.ofcontroller.networkgraph;
+
+
+public class NetworkGraphObject {
+
+	protected final NetworkGraph graph;
+	
+	public NetworkGraphObject(NetworkGraph graph) {
+		this.graph = graph;
+	}
+
+}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/Port.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/Port.java
new file mode 100644
index 0000000..8299022
--- /dev/null
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/Port.java
@@ -0,0 +1,13 @@
+package net.onrc.onos.ofcontroller.networkgraph;
+
+
+
+public interface Port {
+	public short getNumber();
+	public String getName();
+	public long getHardwareAddress();
+	
+	public Switch getSwitch();
+	
+	public Link getLink();
+}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/PortImpl.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/PortImpl.java
new file mode 100644
index 0000000..d0b605d
--- /dev/null
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/PortImpl.java
@@ -0,0 +1,59 @@
+package net.onrc.onos.ofcontroller.networkgraph;
+
+public class PortImpl extends NetworkGraphObject implements Port {
+	
+	//private long dpid;
+	private Switch sw;
+	private short number;
+
+	public PortImpl(NetworkGraph graph) {
+		super(graph);
+	}
+	
+	public void setPortNumber(short portNumber) {
+		number = portNumber;
+	}
+
+	@Override
+	public short getNumber() {
+		return number;
+	}
+	
+	/*
+	public void setDpid(long dpid) {
+		this.dpid = dpid;
+	}
+	
+	public long getDpid() {
+		return dpid;
+	}
+	*/
+
+	@Override
+	public String getName() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public long getHardwareAddress() {
+		// TODO Auto-generated method stub
+		return 0;
+	}
+	
+	@Override
+	public Switch getSwitch() {
+		return sw;
+	}
+	
+	public void setSwitch(Switch sw) {
+		this.sw = sw;
+	}
+
+	@Override
+	public Link getLink() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/SouthboundNetworkGraph.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/SouthboundNetworkGraph.java
new file mode 100644
index 0000000..cb52d15
--- /dev/null
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/SouthboundNetworkGraph.java
@@ -0,0 +1,230 @@
+package net.onrc.onos.ofcontroller.networkgraph;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import net.onrc.onos.datastore.RCObject;
+import net.onrc.onos.datastore.topology.RCLink;
+import net.onrc.onos.datastore.topology.RCPort;
+import net.onrc.onos.datastore.topology.RCSwitch;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import edu.stanford.ramcloud.JRamCloud.ObjectDoesntExistException;
+import edu.stanford.ramcloud.JRamCloud.ObjectExistsException;
+import edu.stanford.ramcloud.JRamCloud.WrongVersionException;
+
+/**
+ * The southbound interface to the network graph which allows clients to 
+ * mutate the graph. This class will maintain the invariants of the network
+ * graph. The southbound discovery modules will use this interface to update
+ * the network graph as they learn about the state of the network.
+ *
+ */
+public class SouthboundNetworkGraph {
+	private static final Logger log = LoggerFactory.getLogger(SouthboundNetworkGraph.class);
+	
+	private static final int NUM_RETRIES = 10;
+	
+	
+	public void addSwitch(Switch sw) {
+		RCSwitch rcSwitch = new RCSwitch(sw.getDpid());
+		rcSwitch.setStatus(RCSwitch.STATUS.ACTIVE);
+		
+		for (Port port : sw.getPorts()) {
+			RCPort rcPort = new RCPort(sw.getDpid(), (long)port.getNumber());
+			rcPort.setStatus(RCPort.STATUS.ACTIVE);
+			rcSwitch.addPortId(rcPort.getId());
+			
+			// TODO check how to write switch+ports together
+			writeObject(rcPort);
+		}
+		
+		writeObject(rcSwitch);
+	}
+	
+	public void deactivateSwitch(Switch sw) {
+		RCSwitch rcSwitch = new RCSwitch(sw.getDpid());
+		
+		List<RCObject> objectsToDeactive = new ArrayList<RCObject>();
+		
+		for (int i = 0; i < NUM_RETRIES; i++) {
+			try {
+				rcSwitch.read();
+				rcSwitch.setStatus(RCSwitch.STATUS.INACTIVE);
+				objectsToDeactive.add(rcSwitch);
+				
+				for (Port p : sw.getPorts()) {
+					RCPort rcPort = new RCPort(sw.getDpid(), (long)p.getNumber());
+					rcPort.read();
+					rcPort.setStatus(RCPort.STATUS.INACTIVE);
+					objectsToDeactive.add(rcPort);
+				}
+			} catch (ObjectDoesntExistException e) {
+				log.warn("Trying to deactivate an object that doesn't exist", e);
+				// We don't care to much if the object wasn't there, it's
+				// being deactivated anyway
+			}
+			
+			try {
+				for (RCObject rcObject : objectsToDeactive) {	
+					rcObject.update();
+				}
+				break;
+			} catch (ObjectDoesntExistException e) {
+				// Unlikely, and we don't care anyway. 
+				// TODO But, this will cause everything else to fail
+				log.warn("Trying to deactivate object that doesn't exist", e);
+			} catch (WrongVersionException e) {
+				// Need to re-read and retry
+			}
+		}
+	}
+	
+	public void addPort(Switch sw, Port port) {
+		RCSwitch rcSwitch = new RCSwitch(sw.getDpid());
+		
+		try {
+			rcSwitch.read();
+		} catch (ObjectDoesntExistException e) {
+			log.warn("Add port failed because switch {} doesn't exist", sw.getDpid(), e);
+			return;
+		}
+		
+		RCPort rcPort = new RCPort(port.getSwitch().getDpid(), (long)port.getNumber());
+		rcPort.setStatus(RCPort.STATUS.ACTIVE);
+		rcSwitch.addPortId(rcPort.getId());
+		
+		writeObject(rcPort);
+		writeObject(rcSwitch);
+	}
+	
+	public void deactivatePort(Port port) {
+		RCPort rcPort = new RCPort(port.getSwitch().getDpid(), (long)port.getNumber());
+		
+		for (int i = 0; i < NUM_RETRIES; i++) {
+			try {
+				rcPort.read();
+			} catch (ObjectDoesntExistException e) {
+				// oh well, we were deactivating anyway
+				log.warn("Trying to deactivate a port that doesn't exist: {}", port);
+				return;
+			}
+			
+			rcPort.setStatus(RCPort.STATUS.INACTIVE);
+			
+			try {
+				rcPort.update();
+				break;
+			} catch (ObjectDoesntExistException | WrongVersionException e) {
+				// retry
+			}
+		}
+	}
+	
+	public void addLink(Link link) {
+		RCLink rcLink = new RCLink(link.getSourceSwitchDpid(), (long)link.getSourcePortNumber(),
+				link.getDestinationSwitchDpid(), (long)link.getDestinationPortNumber());
+		
+		RCPort rcSrcPort = new RCPort(link.getSourceSwitchDpid(), (long)link.getSourcePortNumber());
+		RCPort rcDstPort = new RCPort(link.getDestinationSwitchDpid(), (long)link.getDestinationPortNumber());
+		
+		for (int i = 0; i < NUM_RETRIES; i++) {
+			try {
+				rcSrcPort.read();
+				rcDstPort.read();
+				rcLink.create();
+			} catch (ObjectDoesntExistException e) {
+				// port doesn't exist
+				log.error("Add link failed {}", link, e);
+				return;
+			} catch (ObjectExistsException e) {
+				log.debug("Link already exists {}", link);
+				return;
+			}
+			
+			rcSrcPort.addLinkId(rcLink.getId());
+			rcDstPort.addLinkId(rcLink.getId());
+			
+			rcLink.setStatus(RCLink.STATUS.ACTIVE);
+			
+			try {
+				rcLink.update();
+				rcSrcPort.update();
+				rcDstPort.update();
+				break;
+			} catch (ObjectDoesntExistException | WrongVersionException e) {
+				log.debug(" ", e);
+				// retry
+			}
+		}
+	}
+	
+	public void removeLink(Link link) {
+		RCLink rcLink = new RCLink(link.getSourceSwitchDpid(), (long)link.getSourcePortNumber(),
+				link.getDestinationSwitchDpid(), (long)link.getDestinationPortNumber());
+		
+		RCPort rcSrcPort = new RCPort(link.getSourceSwitchDpid(), (long)link.getSourcePortNumber());
+		RCPort rcDstPort = new RCPort(link.getDestinationSwitchDpid(), (long)link.getDestinationPortNumber());
+		
+		for (int i = 0; i < NUM_RETRIES; i++) {
+			try {
+				rcSrcPort.read();
+				rcDstPort.read();
+				rcLink.read();
+			} catch (ObjectDoesntExistException e) {
+				log.error("Remove link failed {}", link, e);
+				return;
+			}
+			
+			rcSrcPort.removeLinkId(rcLink.getId());
+			rcDstPort.removeLinkId(rcLink.getId());
+			
+			try {
+				rcSrcPort.update();
+				rcDstPort.update();
+				rcLink.delete();
+			} catch (ObjectDoesntExistException e) {
+				log.error("Remove link failed {}", link, e);
+				return;
+			} catch (WrongVersionException e) {
+				// retry
+			}
+		}
+	}
+	
+	public void updateDevice(Device device) {
+		// TODO implement
+	}
+	
+	public void removeDevice(Device device) {
+		// TODO implement
+	}
+	
+	// TODO what happens if this fails? why could it fail?
+	private void writeObject(RCObject object) {
+		for (int i = 0; i < NUM_RETRIES; i++) {
+			try {
+				object.create();
+			} catch (ObjectExistsException e) {
+				try {
+					object.read();
+				} catch (ObjectDoesntExistException e1) {
+					// TODO Auto-generated catch block
+					log.error(" ", e);
+					return;
+				}
+			}
+			
+			try {
+				// TODO check API for writing without caring what's there
+				object.update();
+				break;
+			} catch (ObjectDoesntExistException | WrongVersionException e) {
+				log.debug(" ", e);
+				// re-read and retry
+			}
+		}
+	}
+}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/Switch.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/Switch.java
new file mode 100644
index 0000000..3de47ce
--- /dev/null
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/Switch.java
@@ -0,0 +1,26 @@
+package net.onrc.onos.ofcontroller.networkgraph;
+
+import java.util.Collection;
+
+import net.onrc.onos.ofcontroller.util.FlowEntry;
+
+public interface Switch {
+	public long getDpid();
+	
+	public Collection<Port> getPorts();
+	
+	public Port getPort(short number);
+	
+	
+	// Flows
+	public Collection<FlowEntry> getFlowEntries();
+	
+	// Graph traversal API
+	public Iterable<Switch> getNeighbors();
+	
+	public Iterable<Link> getLinks();
+	
+	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
new file mode 100644
index 0000000..7b83224
--- /dev/null
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/SwitchImpl.java
@@ -0,0 +1,99 @@
+package net.onrc.onos.ofcontroller.networkgraph;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import edu.stanford.ramcloud.JRamCloud.ObjectDoesntExistException;
+import edu.stanford.ramcloud.JRamCloud.WrongVersionException;
+import net.onrc.onos.datastore.topology.RCPort;
+import net.onrc.onos.datastore.topology.RCSwitch;
+import net.onrc.onos.ofcontroller.util.FlowEntry;
+
+public class SwitchImpl extends NetworkGraphObject implements Switch {
+	
+	private long dpid;
+	private final Map<Short, Port> ports;
+
+	public SwitchImpl(NetworkGraph graph) {
+		super(graph);
+		
+		ports = new HashMap<Short, Port>();
+	}
+
+	@Override
+	public long getDpid() {
+		return dpid;
+	}
+
+	@Override
+	public Collection<Port> getPorts() {
+		return Collections.unmodifiableCollection(ports.values());
+	}
+
+	@Override
+	public Port getPort(short number) {
+		return ports.get(number);
+	}
+
+	@Override
+	public Collection<FlowEntry> getFlowEntries() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public Iterable<Switch> getNeighbors() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public Link getLinkToNeighbor(long neighborDpid) {
+		for (Link link : graph.getLinksFromSwitch(dpid)) {
+			if (link.getDestinationSwitch().getDpid() == neighborDpid) {
+				return link;
+			}
+		}
+		return null;
+	}
+
+	@Override
+	public Collection<Device> getDevices() {
+		// TODO Auto-generated method stub
+		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() {
+		return graph.getLinksFromSwitch(dpid);
+	}
+	
+	public void store() {
+		RCSwitch rcSwitch = new RCSwitch(dpid);
+		
+		for (Port port : ports.values()) {
+			RCPort rcPort = new RCPort(dpid, (long)port.getNumber());
+			rcSwitch.addPortId(rcPort.getId());
+		}
+		
+		
+		try {
+			rcSwitch.update();
+			
+		} catch (ObjectDoesntExistException | WrongVersionException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		
+	}
+}
