diff --git a/src/main/java/net/floodlightcontroller/core/web/serializers/NodePortTupleJSONSerializer.java b/src/main/java/net/floodlightcontroller/core/web/serializers/NodePortTupleJSONSerializer.java
new file mode 100644
index 0000000000000000000000000000000000000000..d3b44b95ec2f4588c81071d21a144d5bf0327de0
--- /dev/null
+++ b/src/main/java/net/floodlightcontroller/core/web/serializers/NodePortTupleJSONSerializer.java
@@ -0,0 +1,29 @@
+package net.floodlightcontroller.core.web.serializers;
+
+import java.io.IOException;
+
+import net.floodlightcontroller.topology.NodePortTuple;
+
+import org.codehaus.jackson.JsonGenerator;
+import org.codehaus.jackson.JsonProcessingException;
+import org.codehaus.jackson.map.JsonSerializer;
+import org.codehaus.jackson.map.SerializerProvider;
+import org.openflow.util.HexString;
+
+public class NodePortTupleJSONSerializer extends JsonSerializer<NodePortTuple> {
+
+    @Override
+    public void serialize(NodePortTuple ntp, JsonGenerator jgen,
+                          SerializerProvider sp) throws IOException,
+                                                  JsonProcessingException {
+        jgen.writeStartObject();
+        jgen.writeStringField("switch", HexString.toHexString(ntp.getNodeId()));
+        jgen.writeNumberField("port", ntp.getPortId());
+        jgen.writeEndObject();
+    }
+
+    @Override
+    public Class<NodePortTuple> handledType() {
+        return NodePortTuple.class;
+    }
+}
diff --git a/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkDiscoveryManager.java b/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkDiscoveryManager.java
index e2a1274a43a1a8f9eedb2ac1ace9ebc1d3ef4f39..b1f06633cc409039cb87510b07dcb747d86e71c7 100644
--- a/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkDiscoveryManager.java
+++ b/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkDiscoveryManager.java
@@ -67,7 +67,6 @@ import net.floodlightcontroller.packet.Ethernet;
 import net.floodlightcontroller.packet.IPv4;
 import net.floodlightcontroller.packet.LLDP;
 import net.floodlightcontroller.packet.LLDPTLV;
-import net.floodlightcontroller.restserver.IRestApiService;
 import net.floodlightcontroller.routing.IRoutingService;
 import net.floodlightcontroller.storage.IResultSet;
 import net.floodlightcontroller.storage.IStorageSourceService;
@@ -75,7 +74,6 @@ import net.floodlightcontroller.storage.IStorageSourceListener;
 import net.floodlightcontroller.storage.OperatorPredicate;
 import net.floodlightcontroller.storage.StorageException;
 import net.floodlightcontroller.threadpool.IThreadPoolService;
-import net.floodlightcontroller.topology.web.TopologyWebRoutable;
 import net.floodlightcontroller.util.EventHistory;
 import net.floodlightcontroller.util.EventHistory.EvAction;
 import net.floodlightcontroller.util.StackTraceUtil;
@@ -143,7 +141,6 @@ public class LinkDiscoveryManager
     protected IFloodlightProviderService floodlightProvider;
     protected IStorageSourceService storageSource;
     protected IRoutingService routingEngine;
-    protected IRestApiService restApi;
     protected IThreadPoolService threadPool;
     
     private static final byte[] LLDP_STANDARD_DST_MAC_STRING = 
@@ -1313,8 +1310,6 @@ public class LinkDiscoveryManager
                         IFloodlightService>();
         // We are the class that implements the service
         m.put(ILinkDiscoveryService.class, this);
-        //m.put(ITopologyService.class, this);
-        
         return m;
     }
 
@@ -1325,7 +1320,6 @@ public class LinkDiscoveryManager
         l.add(IFloodlightProviderService.class);
         l.add(IStorageSourceService.class);
         l.add(IRoutingService.class);
-        l.add(IRestApiService.class);
         l.add(IThreadPoolService.class);
         return l;
     }
@@ -1336,7 +1330,6 @@ public class LinkDiscoveryManager
         floodlightProvider = context.getServiceImpl(IFloodlightProviderService.class);
         storageSource = context.getServiceImpl(IStorageSourceService.class);
         routingEngine = context.getServiceImpl(IRoutingService.class);
-        restApi = context.getServiceImpl(IRestApiService.class);
         threadPool = context.getServiceImpl(IThreadPoolService.class);
         
         // We create this here because there is no ordering guarantee
@@ -1440,13 +1433,6 @@ public class LinkDiscoveryManager
         floodlightProvider.addOFSwitchListener(this);
         floodlightProvider.addHAListener(this);
         floodlightProvider.addInfoProvider("summary", this);
-        
-        // init our rest api
-        if (restApi != null) {
-            restApi.addRestletRoutable(new TopologyWebRoutable());
-        } else {
-            log.error("Could not instantiate REST API");
-        }
 
         setControllerTLV();
     }
diff --git a/src/main/java/net/floodlightcontroller/topology/ITopologyService.java b/src/main/java/net/floodlightcontroller/topology/ITopologyService.java
index 725c0d25ddba98a92bead784f5df7163970ec83e..16b7a30c1ec53a7967407b91e14e4d54859a3782 100644
--- a/src/main/java/net/floodlightcontroller/topology/ITopologyService.java
+++ b/src/main/java/net/floodlightcontroller/topology/ITopologyService.java
@@ -51,8 +51,24 @@ public interface ITopologyService extends IFloodlightService  {
      */
     public boolean inSameIsland(long switch1, long switch2);
 
+    /**
+     * Adds a listener to get topology notifications
+     * @param listener The module that wants to listen for events
+     */
     public void addListener(ITopologyListener listener);
 
+    /**
+     * Gets the set of ports that belong to a broadcast domain.
+     * @return The set of ports that belong to a broadcast domain.
+     */
+    public Set<NodePortTuple> getBroadcastDomainLinks();
+    
+    /**
+     * Returns that set of links that are tunnel links.
+     * @return The set of links that are tunnel links.
+     */
+    public Set<NodePortTuple> getTunnelLinks();
+    
     public boolean isBroadcastDomainPort(long sw, short port);
 
     public boolean isAllowed(long sw, short portId);
diff --git a/src/main/java/net/floodlightcontroller/topology/TopologyInstance.java b/src/main/java/net/floodlightcontroller/topology/TopologyInstance.java
index 34f1c4667ec50412f77a39f0ba25c7033a43a2f6..eec06aae1e30a2140753d1fe64230a9027708f50 100644
--- a/src/main/java/net/floodlightcontroller/topology/TopologyInstance.java
+++ b/src/main/java/net/floodlightcontroller/topology/TopologyInstance.java
@@ -36,15 +36,14 @@ public class TopologyInstance {
     protected Set<Long> switches;
     protected Set<NodePortTuple> broadcastDomainPorts;
     protected Set<NodePortTuple> tunnelPorts;
-    //protected Set<NodePortTuple> blockedPorts;
 
     protected Set<Cluster> clusters;  // set of clusters
     protected Map<Long, Cluster> switchClusterMap; // switch to cluster map
 
     // States for routing
-    protected Map<Long, BroadcastTree> destinationRootedTrees;
-    protected Map<Long, Set<NodePortTuple>> clusterBroadcastNodePorts;
-    protected Map<Long, BroadcastTree> clusterBroadcastTrees;
+    protected Map<Long, BroadcastTree> destinationRootedTrees; // DPID -> BroadcastTree
+    protected Map<Long, Set<NodePortTuple>> clusterBroadcastNodePorts; // ClusterID -> BroadcastTree
+    protected Map<Long, BroadcastTree> clusterBroadcastTrees; // ClusterID -> BroadcastTree
     protected LRUHashMap<RouteId, Route> pathcache;
 
     public TopologyInstance() {
diff --git a/src/main/java/net/floodlightcontroller/topology/TopologyManager.java b/src/main/java/net/floodlightcontroller/topology/TopologyManager.java
index 6dd7037d5aebba46ad05dad5603cff132982fdfd..762e19186f6c392c162ab70aaf6a97dca40ad898 100644
--- a/src/main/java/net/floodlightcontroller/topology/TopologyManager.java
+++ b/src/main/java/net/floodlightcontroller/topology/TopologyManager.java
@@ -21,11 +21,13 @@ import net.floodlightcontroller.core.module.IFloodlightService;
 import net.floodlightcontroller.core.util.SingletonTask;
 import net.floodlightcontroller.linkdiscovery.ILinkDiscoveryListener;
 import net.floodlightcontroller.linkdiscovery.ILinkDiscoveryService;
+import net.floodlightcontroller.restserver.IRestApiService;
 import net.floodlightcontroller.routing.BroadcastTree;
 import net.floodlightcontroller.routing.IRoutingService;
 import net.floodlightcontroller.routing.Link;
 import net.floodlightcontroller.routing.Route;
 import net.floodlightcontroller.threadpool.IThreadPoolService;
+import net.floodlightcontroller.topology.web.TopologyWebRoutable;
 import net.floodlightcontroller.util.StackTraceUtil;
 
 
@@ -54,6 +56,7 @@ public class TopologyManager
     protected ILinkDiscoveryService linkDiscovery;
     protected IThreadPoolService threadPool;
     protected IFloodlightProviderService floodlightProvider;
+    protected IRestApiService restApi;
     // Modules that listen to our updates
     protected ArrayList<ITopologyListener> topologyAware;
 
@@ -261,11 +264,7 @@ public class TopologyManager
     public Map<NodePortTuple, Set<Link>> getPortBroadcastDomainLinks() {
         return portBroadcastDomainLinks;
     }
-
-    public Map<NodePortTuple, Set<Link>> getTunnelLinks() {
-        return tunnelLinks;
-    }
-
+    
     public TopologyInstance getCurrentInstance() {
         return currentInstance;
     }
@@ -297,7 +296,6 @@ public class TopologyManager
 
     @Override
     public Collection<Class<? extends IFloodlightService>> getModuleServices() {
-        // TODO Auto-generated method stub
         Collection<Class<? extends IFloodlightService>> l = 
                 new ArrayList<Class<? extends IFloodlightService>>();
         l.add(ITopologyService.class);
@@ -306,12 +304,10 @@ public class TopologyManager
     }
 
     @Override
-    public Map<Class<? extends IFloodlightService>, IFloodlightService>
-    getServiceImpls() {
+    public Map<Class<? extends IFloodlightService>, IFloodlightService> getServiceImpls() {
         Map<Class<? extends IFloodlightService>,
-        IFloodlightService> m = 
-        new HashMap<Class<? extends IFloodlightService>,
-        IFloodlightService>();
+            IFloodlightService> m = 
+                new HashMap<Class<? extends IFloodlightService>, IFloodlightService>();
         // We are the class that implements the service
         m.put(ITopologyService.class, this);
         m.put(IRoutingService.class, this);
@@ -327,6 +323,7 @@ public class TopologyManager
         l.add(ILinkDiscoveryService.class);
         l.add(IThreadPoolService.class);
         l.add(IFloodlightProviderService.class);
+        l.add(IRestApiService.class);
         return l;
     }
 
@@ -336,6 +333,7 @@ public class TopologyManager
         linkDiscovery = context.getServiceImpl(ILinkDiscoveryService.class);
         threadPool = context.getServiceImpl(IThreadPoolService.class);
         floodlightProvider = context.getServiceImpl(IFloodlightProviderService.class);
+        restApi = context.getServiceImpl(IRestApiService.class);
         
         switchPorts = new HashMap<Long,Set<Short>>();
         switchPortLinks = new HashMap<NodePortTuple, Set<Link>>();
@@ -351,8 +349,13 @@ public class TopologyManager
         newInstanceTask = new SingletonTask(ses, new NewInstanceWorker());
         linkDiscovery.addListener(this);
         floodlightProvider.addHAListener(this);
+        addWebRoutable();
         newInstanceTask.reschedule(1, TimeUnit.MILLISECONDS);
     }
+    
+    protected void addWebRoutable() {
+        restApi.addRestletRoutable(new TopologyWebRoutable());
+    }
 
     //
     // ITopologyService interface methods
@@ -499,5 +502,15 @@ public class TopologyManager
                 break;
         }
     }
+
+    @Override
+    public Set<NodePortTuple> getBroadcastDomainLinks() {
+        return portBroadcastDomainLinks.keySet();
+    }
+    
+    @Override
+    public Set<NodePortTuple> getTunnelLinks() {
+        return tunnelLinks.keySet();
+    }
 }
 
diff --git a/src/main/java/net/floodlightcontroller/topology/web/BroadcastDomainResource.java b/src/main/java/net/floodlightcontroller/topology/web/BroadcastDomainResource.java
new file mode 100644
index 0000000000000000000000000000000000000000..dc7dd46ebaeeacd88608ad9b93528717ffd6ed77
--- /dev/null
+++ b/src/main/java/net/floodlightcontroller/topology/web/BroadcastDomainResource.java
@@ -0,0 +1,20 @@
+package net.floodlightcontroller.topology.web;
+
+import java.util.Set;
+
+import net.floodlightcontroller.topology.ITopologyService;
+import net.floodlightcontroller.topology.NodePortTuple;
+
+import org.restlet.resource.Get;
+import org.restlet.resource.ServerResource;
+
+public class BroadcastDomainResource extends ServerResource {
+    @Get("json")
+    public Set<NodePortTuple> retrieve() {
+        ITopologyService topology = 
+                (ITopologyService)getContext().getAttributes().
+                    get(ITopologyService.class.getCanonicalName());
+        
+        return topology.getBroadcastDomainLinks();
+    }
+}
diff --git a/src/main/java/net/floodlightcontroller/topology/web/TopologyWebRoutable.java b/src/main/java/net/floodlightcontroller/topology/web/TopologyWebRoutable.java
index afe65fc9e5e7279ebbb25de444625567361a3aff..efe180c725dacbfab626c69c380a05be84ae2eae 100644
--- a/src/main/java/net/floodlightcontroller/topology/web/TopologyWebRoutable.java
+++ b/src/main/java/net/floodlightcontroller/topology/web/TopologyWebRoutable.java
@@ -1,7 +1,6 @@
 package net.floodlightcontroller.topology.web;
 
 import org.restlet.Context;
-import org.restlet.Restlet;
 import org.restlet.routing.Router;
 
 import net.floodlightcontroller.linkdiscovery.web.LinksResource;
@@ -12,10 +11,12 @@ public class TopologyWebRoutable implements RestletRoutable {
      * Create the Restlet router and bind to the proper resources.
      */
     @Override
-    public Restlet getRestlet(Context context) {
+    public Router getRestlet(Context context) {
         Router router = new Router(context);
         router.attach("/links/json", LinksResource.class);
+        router.attach("/tunnellinks/json", TunnelLinksResource.class);
         router.attach("/switchclusters/json", SwitchClustersResource.class);
+        router.attach("/broadcastdomainports/json", BroadcastDomainResource.class);
         return router;
     }
 
diff --git a/src/main/java/net/floodlightcontroller/topology/web/TunnelLinksResource.java b/src/main/java/net/floodlightcontroller/topology/web/TunnelLinksResource.java
new file mode 100644
index 0000000000000000000000000000000000000000..ac7c0e367681910573f22f1c350c30bca679b038
--- /dev/null
+++ b/src/main/java/net/floodlightcontroller/topology/web/TunnelLinksResource.java
@@ -0,0 +1,20 @@
+package net.floodlightcontroller.topology.web;
+
+import java.util.Set;
+
+import net.floodlightcontroller.topology.ITopologyService;
+import net.floodlightcontroller.topology.NodePortTuple;
+
+import org.restlet.resource.Get;
+import org.restlet.resource.ServerResource;
+
+public class TunnelLinksResource extends ServerResource {
+    @Get("json")
+    public Set<NodePortTuple> retrieve() {
+        ITopologyService topology = 
+                (ITopologyService)getContext().getAttributes().
+                    get(ITopologyService.class.getCanonicalName());
+        
+        return topology.getTunnelLinks();
+    }
+}