diff --git a/onos.sh b/onos.sh
index 4814e34..e7a1651 100755
--- a/onos.sh
+++ b/onos.sh
@@ -46,8 +46,11 @@
 EOF_LOGBACK
 
 # Delete and recreate /tmp/netmap
-rm -r /tmp/netmap
-mkdir /tmp/netmap
+rm -rf /tmp/cassandra.titan
+mkdir /tmp/cassandra.titan
+
+# Clear logs
+rm onos.log
 
 # Run floodlight
 echo "Starting ONOS controller ..."
diff --git a/src/main/java/net/floodlightcontroller/core/IOFSwitch.java b/src/main/java/net/floodlightcontroller/core/IOFSwitch.java
index d63624c..df609e7 100644
--- a/src/main/java/net/floodlightcontroller/core/IOFSwitch.java
+++ b/src/main/java/net/floodlightcontroller/core/IOFSwitch.java
@@ -338,6 +338,12 @@
     Object removeAttribute(String name);
 
     /**
+     * Setup an unconnected switch with the info required.
+     * @param dpid of the switch
+     */
+    public void setupRemoteSwitch(Long dpid);
+    
+    /**
      * Clear all flowmods on this switch
      */
     public void clearAllFlowMods();
diff --git a/src/main/java/net/floodlightcontroller/core/internal/OFSwitchImpl.java b/src/main/java/net/floodlightcontroller/core/internal/OFSwitchImpl.java
index dff00fd..bf5aaf7 100644
--- a/src/main/java/net/floodlightcontroller/core/internal/OFSwitchImpl.java
+++ b/src/main/java/net/floodlightcontroller/core/internal/OFSwitchImpl.java
@@ -268,7 +268,7 @@
     public void disconnectOutputStream() {
         channel.close();
     }
-
+    
     @Override
     @JsonIgnore
     public void setFeaturesReply(OFFeaturesReply featuresReply) {
@@ -854,4 +854,11 @@
     public byte getTables() {
         return tables;
     }
+
+
+	@Override
+	public void setupRemoteSwitch(Long dpid) {
+	    this.datapathId = dpid;
+	    this.stringId = HexString.toHexString(this.datapathId);
+	}
 }
diff --git a/src/main/java/net/floodlightcontroller/linkdiscovery/ILinkStorage.java b/src/main/java/net/floodlightcontroller/linkdiscovery/ILinkStorage.java
index 6d66a49..a764227 100644
--- a/src/main/java/net/floodlightcontroller/linkdiscovery/ILinkStorage.java
+++ b/src/main/java/net/floodlightcontroller/linkdiscovery/ILinkStorage.java
@@ -11,26 +11,37 @@
      * Link creation
      */
 	public void update(Link link, DM_OPERATION op);
+	public void update(Link link, LinkInfo linkinfo, DM_OPERATION op);
 	public void update(List<Link> List, DM_OPERATION op);
-	
+
 	/*
 	 *  Add Linkinfo
 	 */
-	public void update(Link link, LinkInfo linkinfo, DM_OPERATION op);
+	public void addOrUpdateLink (Link link, LinkInfo linkinfo, DM_OPERATION op);
 	
 	/*
-	 * Get Links from Storage
-	 *  If dpid and port both are specified specific link is retrieved
-	 *  If only dpid is set all links associated with Switch are retrieved
+	 * Delete a single link
 	 */
-	public List<Link> getLinks(Long dpid, int port);
+	public void deleteLink(Link link);
 
 	/*
 	 * Delete links associated with dpid and port 
 	 * If only dpid is used, All links associated for switch are removed
 	 * Useful for port up/down and also switch join/remove events
 	 */ 
-	public void deleteLinks(Long dpid, int port);
+	public void deleteLinksOnPort(Long dpid, short port);
+	
+	/*
+	 * Delete a list of links
+	 */
+	public void deleteLinks(List<Link> links);
+
+	/*
+	 * Get Links from Storage
+	 *  If dpid and port both are specified specific link is retrieved
+	 *  If only dpid is set all links associated with Switch are retrieved
+	 */
+	public List<Link> getLinks(Long dpid, short port);
 	
 	/*
 	 * Init with Storage conf
diff --git a/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkDiscoveryManager.java b/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkDiscoveryManager.java
index 8ad31c2..0247544 100644
--- a/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkDiscoveryManager.java
+++ b/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkDiscoveryManager.java
@@ -47,10 +47,12 @@
 import net.floodlightcontroller.core.IInfoProvider;
 import net.floodlightcontroller.core.IOFMessageListener;
 import net.floodlightcontroller.core.IOFSwitch;
+import net.floodlightcontroller.core.internal.OFSwitchImpl;
 import net.floodlightcontroller.core.IOFSwitchListener;
 import net.floodlightcontroller.core.annotations.LogMessageCategory;
 import net.floodlightcontroller.core.annotations.LogMessageDoc;
 import net.floodlightcontroller.core.annotations.LogMessageDocs;
+//import net.floodlightcontroller.core.internal.SwitchStorageImpl;
 import net.floodlightcontroller.core.module.FloodlightModuleContext;
 import net.floodlightcontroller.core.module.FloodlightModuleException;
 import net.floodlightcontroller.core.module.IFloodlightModule;
@@ -192,6 +194,7 @@
 
     // Storage
     protected LinkStorageImpl linkStore;
+   // protected SwitchStorageImpl swStore;
     
     /**
      * Flag to indicate if automatic port fast is enabled or not.
@@ -200,6 +203,12 @@
     boolean autoPortFastFeature = false;
 
     /**
+     * Map of remote switches that are not connected to this controller. This
+     * is used to learn remote switches in a distributed controller.
+     */
+    protected Map<Long, IOFSwitch> remoteSwitches;
+    
+    /**
      * Map from link to the most recent time it was verified functioning
      */
     protected Map<Link, LinkInfo> links;
@@ -509,6 +518,34 @@
     }
 
     /**
+     * Learn remote switches when running as a distributed controller
+     */
+    protected IOFSwitch addRemoteSwitch(long sw, short port) {
+    	IOFSwitch remotesw = null;
+    	
+    	// add a switch if we have not seen it before
+        if (!remoteSwitches.containsKey(sw)) {
+        	remotesw = new OFSwitchImpl();
+        	remotesw.setupRemoteSwitch(sw);
+        	remoteSwitches.put(remotesw.getId(), remotesw);
+        	log.debug("addRemoteSwitch(): added fake remote sw {}", remotesw);
+        }
+        
+        // add the port if we have not seen it before
+        if (remotesw.getPort(port) != null) {
+        	OFPhysicalPort remoteport = new OFPhysicalPort();
+        	remoteport.setPortNumber(port);
+        	remoteport.setName("fake_" + port);
+        	remoteport.setConfig(0); 
+        	remoteport.setState(0);
+        	remotesw.setPort(remoteport);
+        	log.debug("addRemoteSwitch(): added fake remote port {} to sw {}", remoteport, remotesw);
+        }
+        
+        return remotesw;
+    }
+    
+    /**
      * Send link discovery message out of a given switch port.
      * The discovery message may be a standard LLDP or a modified
      * LLDP, where the dst mac address is set to :ff.  
@@ -769,6 +806,11 @@
                     lldptlv.getValue()[2] == (byte)0xe1 && lldptlv.getValue()[3] == 0x0) {
                 ByteBuffer dpidBB = ByteBuffer.wrap(lldptlv.getValue());
                 remoteSwitch = floodlightProvider.getSwitches().get(dpidBB.getLong(4));
+                if (remoteSwitch == null) {
+                	// floodlight LLDP coming from a remote switch connected to a different controller
+                	// add it to our cache of unconnected remote switches
+                	remoteSwitch = addRemoteSwitch(dpidBB.getLong(4), remotePort);
+                }
             } else if (lldptlv.getType() == 12 && lldptlv.getLength() == 8){
                 otherId = ByteBuffer.wrap(lldptlv.getValue()).getLong();
                 if (myId == otherId)
@@ -1161,7 +1203,7 @@
                 // remove link from storage.
                 removeLinkFromStorage(lt);
 
-                // Write link to network map
+                // remote link from network map
                 linkStore.update(lt, DM_OPERATION.DELETE);
                 
                 // TODO  Whenever link is removed, it has to checked if
@@ -1211,6 +1253,7 @@
                     ((byte)OFPortReason.OFPPR_MODIFY.ordinal() ==
                     ps.getReason() && !portEnabled(ps.getDesc()))) {
                 deleteLinksOnPort(npt, "Port Status Changed");
+                //swStore.deletePort(HexString.toHexString(npt.getNodeId()), npt.getPortId());
                 LDUpdate update = new LDUpdate(sw, port, UpdateOperation.PORT_DOWN);
                 updates.add(update);
                 linkDeleted = true;
@@ -1871,6 +1914,11 @@
         this.linkStore = new LinkStorageImpl();
         this.linkStore.init("/tmp/cassandra.titan");
         
+        // Initialieze the switch storage connector to the network map. We may need to delete switches.
+        // TODO find a better place to delete switches and ports from network map
+        // this.swStore = new SwitchStorageImpl();
+        // this.swStore.init("/tmp/cassandra.titan");
+        
         ScheduledExecutorService ses = threadPool.getScheduledExecutor();
 
         // To be started by the first switch connection
diff --git a/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkStorageImpl.java b/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkStorageImpl.java
index 16770bd..0e9f32b 100644
--- a/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkStorageImpl.java
+++ b/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkStorageImpl.java
@@ -18,126 +18,169 @@
 import com.tinkerpop.blueprints.Direction;
 import com.tinkerpop.blueprints.TransactionalGraph.Conclusion;
 import com.tinkerpop.blueprints.Vertex;
+import com.tinkerpop.blueprints.Edge;
 import com.tinkerpop.gremlin.java.GremlinPipeline;
 
 public class LinkStorageImpl implements ILinkStorage {
 	public TitanGraph graph;
 	protected static Logger log = LoggerFactory.getLogger(LinkStorageImpl.class);
-	
+
 	@Override
 	public void update(Link link, DM_OPERATION op) {
-		update (link, (LinkInfo)null, op);
+		update(link, (LinkInfo)null, op);
 	}
 
 	@Override
 	public void update(List<Link> links, DM_OPERATION op) {
-		log.debug("LinkStorage:update(): {} {}", op, links);
-
 		for (Link lt: links) {
-			update(lt, op);
+			update(lt, (LinkInfo)null, op);
 		}
 	}
 
 	@Override
 	public void update(Link link, LinkInfo linkinfo, DM_OPERATION op) {
-		log.debug("LinkStorage:update(): {} {}", op, link);
-		
 		switch (op) {
 		case UPDATE:
 		case CREATE:
 		case INSERT:
-			addLink(link, linkinfo);
+			addOrUpdateLink(link, linkinfo, op);
 			break;
 		case DELETE:
+			deleteLink(link);
 			break;
 		}
 	}
 
-	protected void addLink(Link lt, LinkInfo linkinfo) {
-		Vertex vswSrc, vswDst;
+	private Vertex getPortVertex(String dpid, short port) {
+		Vertex vsw, vport = null;
+        if ((vsw = graph.getVertices("dpid", dpid).iterator().next()) != null) {
+        	GremlinPipeline<Vertex, Vertex> pipe = new GremlinPipeline<Vertex, Vertex>();        	
+        	pipe.start(vsw).out("on").has("number", port);
+        	if (pipe.hasNext()) {
+        		vport = pipe.next();
+        	}
+        }
+        return vport;
+	}
+	
+	public void addOrUpdateLink(Link lt, LinkInfo linkinfo, DM_OPERATION op) {
 		Vertex vportSrc = null, vportDst = null;
 	
-		log.info("addLink(): {} {} getSrc {}", new Object[]{lt, linkinfo, lt.getSrc()});
+		log.debug("addOrUpdateLink(): op {} {} {}", new Object[]{op, lt, linkinfo});
 		
         try {
             // get source port vertex
         	String dpid = HexString.toHexString(lt.getSrc());
         	short port = lt.getSrcPort();
-            if ((vswSrc = graph.getVertices("dpid", dpid).iterator().next()) != null) {
-            	log.debug("addLink(): sw exists {} {}", dpid, vswSrc);
-            	GremlinPipeline<Vertex, Vertex> pipe = new GremlinPipeline<Vertex, Vertex>();
-            	
-            	//if (vswSrc.query().direction(Direction.OUT).labels("on").has("number",port).vertices().iterator().hasNext()) {
-            	pipe.start(vswSrc).out("on").has("number", port);
-            	//pipe.start(vswSrc).out("on");
-            	//log.debug("pipe count {}", pipe.count());
-            	if (pipe.hasNext()) {
-            		//vportSrc = vswSrc.query().direction(Direction.OUT).labels("on").has("number",port).vertices().iterator().next();
-            		vportSrc = pipe.next();
-            		log.debug("addLink(): port found {} {}", port, vportSrc);
-            	} else {
-            		log.error("addLink(): sw {} port {} not found", dpid, port);
-            	}
-            }
+        	vportSrc = getPortVertex(dpid, port);
             
             // get dest port vertex
             dpid = HexString.toHexString(lt.getDst());
             port = lt.getDstPort();
-            if ((vswDst = graph.getVertices("dpid",dpid).iterator().next()) != null) {
-            	log.debug("addLink(): sw exists {} {}", dpid, vswDst);
-            	GremlinPipeline<Vertex, Vertex> pipe = new GremlinPipeline<Vertex, Vertex>();
-            	pipe.start(vswDst).out("on").has("number", port);
-            	//if (vswDst.query().direction(Direction.OUT).labels("on").has("number",port).vertices().iterator().hasNext()) {
-            	if (pipe.hasNext()){
-            		//vportDst = vswDst.query().direction(Direction.OUT).labels("on").has("number",port).vertices().iterator().next();
-            		vportDst = pipe.next();
-            		log.debug("addLink(): port found {} {}", port, vportDst);
-            	} else {
-            		log.error ("addLink(): sw {} port {} not found", dpid, port);
-            	}
-            }
-            
+            vportDst = getPortVertex(dpid, port);
+                        
             if (vportSrc != null && vportDst != null) {
-            	//TODO: If Edge already exists should we remove and add again?
+            	
+            	// check if the link exists
             	List<Vertex> currLinks = new ArrayList<Vertex>();
             	for (Vertex V : vportSrc.query().direction(Direction.OUT).labels("link").vertices()) {
             		currLinks.add(V);
             	}
             	
             	if (currLinks.contains(vportDst)) {
-            	// if (vportSrc.query().direction(Direction.OUT).labels("link").vertices().iterator().hasNext() &&
-            	//	vportSrc.query().direction(Direction.OUT).labels("link").) {
-            		//FIXME: Succeed silently for now
-            		log.debug("addLink(): Failure: link exists {} src {} dst {}", new Object[]{lt, vportSrc, vportDst});
+            		// TODO: update linkinfo
+            		if (op.equals(DM_OPERATION.INSERT) || op.equals(DM_OPERATION.CREATE)) {
+            			log.debug("addOrUpdateLink(): Failure: link exists {} {} src {} dst {}", 
+            					new Object[]{op, lt, vportSrc, vportDst});
+            		}
             	} else {
             		graph.addEdge(null, vportSrc, vportDst, "link");
             		graph.stopTransaction(Conclusion.SUCCESS);
+            		log.debug("addOrUpdateLink(): link added {} {} src {} dst {}", new Object[]{op, lt, vportSrc, vportDst});
             	}
-        		log.debug("addLink(): link added {} src {} dst {}", new Object[]{lt, vportSrc, vportDst});
             } else {
-            	log.error("addLink(): failed {} src {} dst {}", new Object[]{lt, vportSrc, vportDst});
+            	log.error("addOrUpdateLink(): failed {} {} src {} dst {}", new Object[]{op, lt, vportSrc, vportDst});
             	graph.stopTransaction(Conclusion.FAILURE);
             }
         } catch (TitanException e) {
             /*
              * retry till we succeed?
              */
-        	log.error("addLink(): {} failed", lt);
+        	log.error("addOrUpdateLink(): failed {} {}", new Object[]{op, lt});
         }
 	}
 	
 	@Override
-	public List<Link> getLinks(Long dpid, int port) {
-		// TODO Auto-generated method stub
-		return null;
+	public void deleteLinks(List<Link> links) {
+
+		for (Link lt : links) {
+			deleteLink(lt);
+		}
 	}
+	
 
 	@Override
-	public void deleteLinks(Long dpid, int port) {
-		// TODO Auto-generated method stub
-
+	public void deleteLink(Link lt) {
+		Vertex vportSrc = null, vportDst = null;
+		int count = 0;
+		
+		log.debug("deleteLink(): {}", lt);
+		
+        try {
+            // get source port vertex
+         	String dpid = HexString.toHexString(lt.getSrc());
+         	short port = lt.getSrcPort();
+         	vportSrc = getPortVertex(dpid, port);
+            
+            // get dst port vertex
+         	dpid = HexString.toHexString(lt.getDst());
+         	port = lt.getDstPort();
+         	vportDst = getPortVertex(dpid, port);
+         	
+         	if (vportSrc != null && vportDst != null) {
+         		for (Edge e : vportSrc.getEdges(Direction.OUT)) {
+         			log.debug("deleteLink(): {} in {} out {}", 
+         					new Object[]{e.getLabel(), e.getVertex(Direction.IN), e.getVertex(Direction.OUT)});
+         			if (e.getLabel().equals("link") && e.getVertex(Direction.IN).equals(vportDst)) {
+         				graph.removeEdge(e);
+         				count++;
+         			}
+         		}
+        		graph.stopTransaction(Conclusion.SUCCESS);
+            	log.debug("deleteLink(): deleted {} edges {} src {} dst {}", new Object[]{
+            			count, lt, vportSrc, vportDst});
+            	
+            } else {
+            	log.error("deleteLink(): failed src port vertex not found {} src {} dst {}", new Object[]{lt, vportSrc, vportDst});
+            	graph.stopTransaction(Conclusion.FAILURE);
+            }
+         	
+        } catch (TitanException e) {
+            /*
+             * retry till we succeed?
+             */
+        	log.error("deleteLink(): {} failed", lt);
+        }
 	}
 
+	// TODO: Fix me
+	@Override
+	public List<Link> getLinks(Long dpid, short port) {
+		Vertex vportSrc, vportDst;
+    	List<Link> links = null;
+    	Link lt;
+    	
+		vportSrc = getPortVertex(HexString.toHexString(dpid), port);
+		if (vportSrc != null) {
+     		for (Edge e : vportSrc.getEdges(Direction.OUT)) {
+     			if (e.getLabel().equals("link")) {
+     				break;
+     			}
+     		}
+		}
+     	return null;
+	}
+	
 	@Override
 	public void init(String conf) {
 		//TODO extract the DB location from conf
@@ -155,4 +198,11 @@
         	graph.stopTransaction(Conclusion.SUCCESS);
         }
 	}
+
+	@Override
+	public void deleteLinksOnPort(Long dpid, short port) {
+		// TODO Auto-generated method stub
+		
+	}
+
 }
diff --git a/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkStorageImplStubs.java b/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkStorageImplStubs.java
deleted file mode 100644
index 9d0cc6d..0000000
--- a/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkStorageImplStubs.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/**
- * 
- */
-package net.floodlightcontroller.linkdiscovery.internal;
-
-import java.util.List;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import net.floodlightcontroller.linkdiscovery.ILinkStorage;
-import net.floodlightcontroller.linkdiscovery.LinkInfo;
-import net.floodlightcontroller.routing.Link;
-
-/**
- * @author pankaj
- *
- */
-public class LinkStorageImplStubs implements ILinkStorage {
-
-	protected static Logger log = LoggerFactory.getLogger(LinkStorageImplStubs.class);
-
-	/* (non-Javadoc)
-	 * @see net.floodlightcontroller.linkdiscovery.ILinkStorage#update(net.floodlightcontroller.routing.Link, net.floodlightcontroller.core.INetMapStorage.DM_OPERATION)
-	 */
-	@Override
-	public void update(Link link, DM_OPERATION op) {
-		// TODO Auto-generated method stub
-		log.trace("LinkStorage:update(): op {} link {}", op, link);
-	}
-
-	/* (non-Javadoc)
-	 * @see net.floodlightcontroller.linkdiscovery.ILinkStorage#update(java.util.List, net.floodlightcontroller.core.INetMapStorage.DM_OPERATION)
-	 */
-	@Override
-	public void update(List<Link> list, DM_OPERATION op) {
-		// TODO Auto-generated method stub
-		log.trace("LinkStorage:update(): op {} link {}", op, list);
-	}
-
-	/* (non-Javadoc)
-	 * @see net.floodlightcontroller.linkdiscovery.ILinkStorage#update(net.floodlightcontroller.routing.Link, net.floodlightcontroller.linkdiscovery.LinkInfo, net.floodlightcontroller.core.INetMapStorage.DM_OPERATION)
-	 */
-	@Override
-	public void update(Link link, LinkInfo linkinfo, DM_OPERATION op) {
-		// TODO Auto-generated method stub
-		log.trace("LinkStorage:update(): op {} link {}", op, link);
-	}
-
-	/* (non-Javadoc)
-	 * @see net.floodlightcontroller.linkdiscovery.ILinkStorage#getLinks(java.lang.Long, int)
-	 */
-	@Override
-	public List<Link> getLinks(Long dpid, int port) {
-		// TODO Auto-generated method stub
-		log.trace("LinkStorage:getLinks(): dpid {} port {}", dpid, port);
-
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see net.floodlightcontroller.linkdiscovery.ILinkStorage#deleteLinks(java.lang.Long, int)
-	 */
-	@Override
-	public void deleteLinks(Long dpid, int port) {
-		// TODO Auto-generated method stub
-		log.trace("LinkStorage:deleteLinks(): dpid {} port {}", dpid, port);
-	}
-
-	/* (non-Javadoc)
-	 * @see net.floodlightcontroller.linkdiscovery.ILinkStorage#init(java.lang.String)
-	 */
-	@Override
-	public void init(String conf) {
-		// TODO Auto-generated method stub
-
-	}
-
-}
diff --git a/src/test/java/net/floodlightcontroller/linkdiscovery/internal/LinkStorageImplTest.java b/src/test/java/net/floodlightcontroller/linkdiscovery/internal/LinkStorageImplTest.java
index a911339..1e71138 100644
--- a/src/test/java/net/floodlightcontroller/linkdiscovery/internal/LinkStorageImplTest.java
+++ b/src/test/java/net/floodlightcontroller/linkdiscovery/internal/LinkStorageImplTest.java
@@ -74,7 +74,8 @@
 	//TODO enable once method is written
 	@Ignore @Test
 	public void testGetLinks(){
-		List<Link> list = linkStorage.getLinks(Long.decode("0x0000000000000a01"), 2);
+		//TODO Make sure this works when the implementation is written
+		List<Link> list = linkStorage.getLinks(Long.decode("0x0000000000000a01"), (short)2);
 		
 		assertEquals(list.size(), 1);
 		
@@ -108,7 +109,9 @@
 	//TODO enable once method is written
 	@Ignore @Test
 	public void testDeleteLinks(){
-		linkStorage.deleteLinks(Long.decode("0x0000000000000a01"), 2);
+		//TODO Make sure this works when the implementation is written
+		
+		linkStorage.deleteLinksOnPort(Long.decode("0x0000000000000a01"), (short)2);
 		
 		//Test if it was deleted correctly with the Gremlin API
 		GremlinPipeline<Vertex, Vertex> pipe = new GremlinPipeline<Vertex, Vertex>();
diff --git a/src/test/java/net/floodlightcontroller/util/OFMessageDamperMockSwitch.java b/src/test/java/net/floodlightcontroller/util/OFMessageDamperMockSwitch.java
index 59e0a51..ffabf6f 100644
--- a/src/test/java/net/floodlightcontroller/util/OFMessageDamperMockSwitch.java
+++ b/src/test/java/net/floodlightcontroller/util/OFMessageDamperMockSwitch.java
@@ -346,4 +346,10 @@
         return 0;
     }
 
+	@Override
+	public void setupRemoteSwitch(Long dpid) {
+		// TODO Auto-generated method stub
+		
+	}
+
 }
\ No newline at end of file
