diff --git a/src/main/java/net/floodlightcontroller/topology/TopologyInstance.java b/src/main/java/net/floodlightcontroller/topology/TopologyInstance.java
index ec9c6c9642e730ee97d8fcb7c3eb8d05d268b6f1..44f3036a727fd3b0f0bdd689193db2d3eb484c68 100644
--- a/src/main/java/net/floodlightcontroller/topology/TopologyInstance.java
+++ b/src/main/java/net/floodlightcontroller/topology/TopologyInstance.java
@@ -32,6 +32,7 @@ import org.slf4j.LoggerFactory;
 import com.google.common.collect.ImmutableSet;
 
 import java.util.*;
+import java.util.Map.Entry;
 import java.util.stream.Collectors;
 
 /**
@@ -135,7 +136,7 @@ public class TopologyInstance {
         this.pathcache = new HashMap<RouteId, List<Route>>();
 
         this.broadcastPortsPerArchipelago = new HashMap<DatapathId, Set<NodePortTuple>>();
-        
+
         this.clusterArchipelagoMap = new HashMap<Cluster, Archipelago>();
     }
 
@@ -145,42 +146,43 @@ public class TopologyInstance {
         // Must ignore blocked links.
         identifyClusters();
 
-        // Step 1.1: Add links within clusters to the owning cluster
+        // Step 2: Add links within clusters to the owning cluster
         // Avoid adding blocked links
         // Remaining links are inter-cluster links
         addIntraClusterLinks();
-        
-        log.warn("Clusters {}", clusters);
 
-        // Step 1.2 Compute the archipelagos (def: group of clusters). Each archipelago
+        // Step 3: Compute the archipelagos (def: group of clusters). Each archipelago
         // will have its own finiteBroadcastTree, which will be chosen by running dijkstra's
         // algorithm from the archipelago ID switch (lowest switch DPID). This is
         // because each archipelago is by definition isolated from all other archipelagos.
         calculateArchipelagos();
 
-        // Step 2. Compute shortest path trees in each cluster for
-        // unicast routing.  The trees are rooted at the destination.
+        // Step 4: Compute a shortest path tree in each cluster for
+        // the purpose of.  The trees are rooted at the destination.
         // Cost for tunnel links and direct links are the same.
         calculateShortestPathTreeInClusters();
 
-        // Step 3. Compute broadcast tree in each cluster.
+        // Step 5: Compute broadcast tree in each cluster.
         // Cost for tunnel links are high to discourage use of
-        // tunnel links.  The cost is set to the number of nodes
+        // tunnel links. The cost is set to the number of nodes
         // in the cluster + 1, to use as minimum number of
         // clusters as possible.
         calculateBroadcastNodePortsInClusters();
 
-        // Step 4.1 Use Yens algorithm to compute multiple paths 
+        // Step 6: Use Yens algorithm to compute multiple paths 
         computeOrderedPaths();
-        
-        //computeBroadcastPortsPerArchipelago();
 
-        // Step 5. Determine broadcast switch ports for each archipelago
-        //computeBcastNPTsFromArchipelagos();
+        // Step 7: Get the broadcast ports for each archipelago 
+        // (i.e. for each disjoint network)
+        computeBroadcastPortsPerArchipelago();
+        
+        // Step 8: Get all broadcast ports in NPT form
+        // Edge port included
+        computeBcastNPTsFromArchipelagos();
 
-        // Step 6. Sort into set of broadcast ports per switch, for quick lookup.
+        // Step 9. Sort into set of broadcast ports per switch, for quick lookup.
         // Edge ports included
-        //computeBcastPortsPerSwitchFromBcastNTPs();
+        computeBcastPortsPerSwitchFromBcastNTPs();
 
         // Make immutable
         //TODO makeDataImmutable();
@@ -1521,9 +1523,12 @@ public class TopologyInstance {
     private void computeBroadcastPortsPerArchipelago() {
         ImmutableSet.Builder<NodePortTuple> s = ImmutableSet.builder();
         for (Archipelago a : archipelagos) {
-            for (Link l : a.getBroadcastTree().getLinks().values()) {
-                s.add(new NodePortTuple(l.getSrc(), l.getSrcPort()));
-                s.add(new NodePortTuple(l.getDst(), l.getDstPort()));
+            for (Entry<DatapathId, Link> e : a.getBroadcastTree().getLinks().entrySet()) {
+                Link l = e.getValue();
+                if (l != null) { /* null --> root */
+                    s.add(new NodePortTuple(l.getSrc(), l.getSrcPort()));
+                    s.add(new NodePortTuple(l.getDst(), l.getDstPort()));
+                }
             }
             broadcastPortsPerArchipelago.put(a.getId(), s.build());
         }