diff --git a/src/main/java/net/onrc/onos/apps/websocket/TopologyWebSocket.java b/src/main/java/net/onrc/onos/apps/websocket/TopologyWebSocket.java
index 1a83b94..9d9ed6f 100644
--- a/src/main/java/net/onrc/onos/apps/websocket/TopologyWebSocket.java
+++ b/src/main/java/net/onrc/onos/apps/websocket/TopologyWebSocket.java
@@ -2,7 +2,6 @@
 
 import net.onrc.onos.core.topology.ITopologyListener;
 import net.onrc.onos.core.topology.ITopologyService;
-import net.onrc.onos.core.topology.Topology;
 import net.onrc.onos.core.topology.TopologyEvents;
 
 import java.io.IOException;
@@ -65,7 +64,7 @@
      */
     private void shutdown() {
         ITopologyService topologyService = WebSocketManager.topologyService;
-        topologyService.deregisterTopologyListener(this);
+        topologyService.removeListener(this);
         this.isOpen = false;            // Stop the thread
     }
 
@@ -124,34 +123,8 @@
         // Initialization and Topology Service registration
         //
         this.socketSession = session;
-        ObjectMapper mapper = new ObjectMapper();
-        String topologyJson = null;
         ITopologyService topologyService = WebSocketManager.topologyService;
-        topologyService.registerTopologyListener(this);
-
-        //
-        // Get the initial topology and encode it in JSON
-        //
-        Topology topology = topologyService.getTopology();
-        topology.acquireReadLock();
-        try {
-            topologyJson = mapper.writeValueAsString(topology);
-        } catch (IOException e) {
-            log.debug("Exception encoding topology as JSON: ", e);
-        } finally {
-            topology.releaseReadLock();
-        }
-
-        //
-        // Send the initial topology
-        //
-        if (topologyJson != null) {
-            try {
-                session.getBasicRemote().sendText(topologyJson);
-            } catch (IOException e) {
-                log.debug("Exception sending TopologyWebSocket topology: ", e);
-            }
-        }
+        topologyService.addListener(this, true);
 
         // Start the thread
         start();
diff --git a/src/main/java/net/onrc/onos/core/intent/runtime/PathCalcRuntimeModule.java b/src/main/java/net/onrc/onos/core/intent/runtime/PathCalcRuntimeModule.java
index 12d85d6..ccad3ba 100644
--- a/src/main/java/net/onrc/onos/core/intent/runtime/PathCalcRuntimeModule.java
+++ b/src/main/java/net/onrc/onos/core/intent/runtime/PathCalcRuntimeModule.java
@@ -525,7 +525,7 @@
         opEventChannel = datagridService.createChannel(
                 INTENT_OP_EVENT_CHANNEL_NAME, Long.class, IntentOperationList.class);
         datagridService.addListener(INTENT_STATE_EVENT_CHANNEL_NAME, this, Long.class, IntentStateList.class);
-        topologyService.registerTopologyListener(this);
+        topologyService.addListener(this, false);
         persistIntent = new PersistIntent(controllerRegistry);
         restApi.addRestletRoutable(new IntentWebRoutable());
     }
diff --git a/src/main/java/net/onrc/onos/core/topology/ITopologyService.java b/src/main/java/net/onrc/onos/core/topology/ITopologyService.java
index b6280bc..7ab5c47 100644
--- a/src/main/java/net/onrc/onos/core/topology/ITopologyService.java
+++ b/src/main/java/net/onrc/onos/core/topology/ITopologyService.java
@@ -14,19 +14,22 @@
     public Topology getTopology();
 
     /**
-     * Registers a listener for topology events.
+     * Adds a listener for topology events.
      *
-     * @param listener the listener to register
+     * @param listener the listener to add.
+     * @param startFromSnapshot if true, and if the topology is not
+     * empty, the first event should be a snapshot of the current topology.
      */
-    public void registerTopologyListener(ITopologyListener listener);
+    public void addListener(ITopologyListener listener,
+                            boolean startFromSnapshot);
 
     /**
-     * Deregisters a listener for topology events. The listener will no longer
+     * Removes a listener for topology events. The listener will no longer
      * receive topology events after this call.
      *
-     * @param listener the listener to deregister
+     * @param listener the listener to remove.
      */
-    public void deregisterTopologyListener(ITopologyListener listener);
+    public void removeListener(ITopologyListener listener);
 
     /**
      * Allows a module to get a reference to the southbound interface to
diff --git a/src/main/java/net/onrc/onos/core/topology/TopologyEvent.java b/src/main/java/net/onrc/onos/core/topology/TopologyEvent.java
index c51a157..82fa6e5 100644
--- a/src/main/java/net/onrc/onos/core/topology/TopologyEvent.java
+++ b/src/main/java/net/onrc/onos/core/topology/TopologyEvent.java
@@ -40,6 +40,20 @@
     }
 
     /**
+     * Constructor for creating an empty (NO-OP) Topology Event.
+     *
+     * @param onosInstanceId the ONOS Instance ID that originates the event.
+     */
+    protected TopologyEvent(OnosInstanceId onosInstanceId) {
+        mastershipEvent = null;
+        switchEvent = null;
+        portEvent = null;
+        linkEvent = null;
+        hostEvent = null;
+        this.onosInstanceId = checkNotNull(onosInstanceId);
+    }
+
+    /**
      * Constructor for given Switch Mastership event.
      *
      * @param mastershipEvent the Switch Mastership event to use.
@@ -270,8 +284,13 @@
                 eventStr = hostEvent.toString();
                 break stringLabel;
             }
+            // Test whether this is NO-OP event
+            if (onosInstanceId != null) {
+                eventStr = "NO-OP";
+                break stringLabel;
+            }
             // No event found
-            return "[Empty TopologyEvent]";
+            return "[Unknown TopologyEvent]";
         }
 
         return "[TopologyEvent " + eventStr + " from " +
@@ -319,6 +338,12 @@
                 eventId = hostEvent.getIDasByteBuffer();
                 break idLabel;
             }
+            // Test whether this is NO-OP event
+            if (onosInstanceId != null) {
+                String id = "NO-OP";
+                eventId = ByteBuffer.wrap(id.getBytes(StandardCharsets.UTF_8));
+                break idLabel;
+            }
             // No event found
             throw new IllegalStateException("Invalid TopologyEvent ID");
         }
diff --git a/src/main/java/net/onrc/onos/core/topology/TopologyEventPreprocessor.java b/src/main/java/net/onrc/onos/core/topology/TopologyEventPreprocessor.java
index 69d9b07..475dca1 100644
--- a/src/main/java/net/onrc/onos/core/topology/TopologyEventPreprocessor.java
+++ b/src/main/java/net/onrc/onos/core/topology/TopologyEventPreprocessor.java
@@ -217,6 +217,11 @@
         for (EventEntry<TopologyEvent> event : events) {
             List<EventEntry<TopologyEvent>> postponedEvents = null;
 
+            // Ignore NO-OP events
+            if (event.isNoop()) {
+                continue;
+            }
+
             TopologyEvent topologyEvent = event.eventData();
             OnosInstanceId onosInstanceId = topologyEvent.getOnosInstanceId();
 
diff --git a/src/main/java/net/onrc/onos/core/topology/TopologyEvents.java b/src/main/java/net/onrc/onos/core/topology/TopologyEvents.java
index 543c1cb..c930714 100644
--- a/src/main/java/net/onrc/onos/core/topology/TopologyEvents.java
+++ b/src/main/java/net/onrc/onos/core/topology/TopologyEvents.java
@@ -42,10 +42,11 @@
     private final Collection<HostEvent> removedHostEvents;
 
     /**
-     * Constructor.
+     * Constructor for added and removed events.
      *
      * @param addedMastershipEvents the collection of added Mastership Events.
-     * @param removedMastershipEvents the collection of removed Mastership Events.
+     * @param removedMastershipEvents the collection of removed Mastership
+     *        Events.
      * @param addedSwitchEvents the collection of added Switch Events.
      * @param removedSwitchEvents the collection of removed Switch Events.
      * @param addedPortEvents the collection of added Port Events.
@@ -90,6 +91,37 @@
     }
 
     /**
+     * Constructor for added events only.
+     *
+     * @param addedMastershipEvents the collection of added Mastership Events.
+     * @param addedSwitchEvents the collection of added Switch Events.
+     * @param addedPortEvents the collection of added Port Events.
+     * @param addedLinkEvents the collection of added Link Events.
+     * @param addedHostEvents the collection of added Host Events.
+     */
+    public TopologyEvents(Collection<MastershipEvent> addedMastershipEvents,
+                          Collection<SwitchEvent> addedSwitchEvents,
+                          Collection<PortEvent> addedPortEvents,
+                          Collection<LinkEvent> addedLinkEvents,
+                          Collection<HostEvent> addedHostEvents) {
+        this.addedMastershipEvents =
+            Collections.unmodifiableCollection(addedMastershipEvents);
+        this.removedMastershipEvents = Collections.emptyList();
+        this.addedSwitchEvents =
+            Collections.unmodifiableCollection(addedSwitchEvents);
+        this.removedSwitchEvents = Collections.emptyList();
+        this.addedPortEvents =
+            Collections.unmodifiableCollection(addedPortEvents);
+        this.removedPortEvents = Collections.emptyList();
+        this.addedLinkEvents =
+            Collections.unmodifiableCollection(addedLinkEvents);
+        this.removedLinkEvents = Collections.emptyList();
+        this.addedHostEvents =
+            Collections.unmodifiableCollection(addedHostEvents);
+        this.removedHostEvents = Collections.emptyList();
+    }
+
+    /**
      * Gets the collection of added Mastership Events.
      *
      * @return the collection of added Mastership Events.
diff --git a/src/main/java/net/onrc/onos/core/topology/TopologyImpl.java b/src/main/java/net/onrc/onos/core/topology/TopologyImpl.java
index fcf3caa..a0248b7 100644
--- a/src/main/java/net/onrc/onos/core/topology/TopologyImpl.java
+++ b/src/main/java/net/onrc/onos/core/topology/TopologyImpl.java
@@ -4,6 +4,7 @@
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Iterator;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
@@ -364,6 +365,11 @@
     }
 
     @Override
+    public Collection<SwitchEvent> getAllSwitchEvents() {
+        return Collections.unmodifiableCollection(switches.values());
+    }
+
+    @Override
     public PortEvent getPortEvent(final SwitchPort port) {
         ConcurrentMap<PortNumber, PortEvent> portMap = this.ports.get(port.getDpid());
         if (portMap != null) {
@@ -373,6 +379,15 @@
     }
 
     @Override
+    public Collection<PortEvent> getAllPortEvents() {
+        List<PortEvent> events = new LinkedList<>();
+        for (ConcurrentMap<PortNumber, PortEvent> cm : ports.values()) {
+            events.addAll(cm.values());
+        }
+        return Collections.unmodifiableCollection(events);
+    }
+
+    @Override
     public LinkEvent getLinkEvent(final LinkTuple linkId) {
         ConcurrentMap<String, LinkEvent> links = this.outgoingLinks.get(linkId.getSrc());
         if (links == null) {
@@ -411,10 +426,24 @@
     }
 
     @Override
+    public Collection<LinkEvent> getAllLinkEvents() {
+        List<LinkEvent> events = new LinkedList<>();
+        for (ConcurrentMap<String, LinkEvent> cm : outgoingLinks.values()) {
+            events.addAll(cm.values());
+        }
+        return Collections.unmodifiableCollection(events);
+    }
+
+    @Override
     public HostEvent getHostEvent(final MACAddress mac) {
         return this.mac2Host.get(mac);
     }
 
+    @Override
+    public Collection<HostEvent> getAllHostEvents() {
+        return Collections.unmodifiableCollection(mac2Host.values());
+    }
+
     /**
      * Puts a SwitchEvent.
      *
diff --git a/src/main/java/net/onrc/onos/core/topology/TopologyInternal.java b/src/main/java/net/onrc/onos/core/topology/TopologyInternal.java
index 10b008e..9656013 100644
--- a/src/main/java/net/onrc/onos/core/topology/TopologyInternal.java
+++ b/src/main/java/net/onrc/onos/core/topology/TopologyInternal.java
@@ -11,7 +11,6 @@
  * Interface to reference internal self-contained elements.
  */
 public interface TopologyInternal extends Topology {
-
     /**
      * Gets a SwitchEvent.
      *
@@ -21,6 +20,13 @@
     public SwitchEvent getSwitchEvent(Dpid dpid);
 
     /**
+     * Gets all SwitchEvent entries.
+     *
+     * @return all SwitchEvent entries.
+     */
+    public Collection<SwitchEvent> getAllSwitchEvents();
+
+    /**
      * Gets a PortEvent.
      *
      * @param port Port identifier
@@ -29,6 +35,13 @@
     public PortEvent getPortEvent(SwitchPort port);
 
     /**
+     * Gets all PortEvent entries.
+     *
+     * @return all PortEvent entries.
+     */
+    public Collection<PortEvent> getAllPortEvents();
+
+    /**
      * Gets a LinkEvent.
      *
      * @param linkId Link identifier
@@ -46,14 +59,21 @@
     public LinkEvent getLinkEvent(final LinkTuple linkId, final String type);
 
     /**
-     * Gets a LinkEvent.
+     * Gets a collection of LinkEvent entries.
      *
      * @param linkId Link identifier
-     * @return Collection of LinkEvent
+     * @return Collection of LinkEvent entries.
      */
     public Collection<LinkEvent> getLinkEvents(LinkTuple linkId);
 
     /**
+     * Gets all LinkEvent entries.
+     *
+     * @return all LinkEvent entries.
+     */
+    public Collection<LinkEvent> getAllLinkEvents();
+
+    /**
      * Gets a HostEvent.
      *
      * @param mac MACAddress of the host
@@ -61,4 +81,10 @@
      */
     public HostEvent getHostEvent(MACAddress mac);
 
+    /**
+     * Gets all HostEvent entries.
+     *
+     * @return all HostEvent entries.
+     */
+    public Collection<HostEvent> getAllHostEvents();
 }
diff --git a/src/main/java/net/onrc/onos/core/topology/TopologyManager.java b/src/main/java/net/onrc/onos/core/topology/TopologyManager.java
index 1c0f531..57e8b6e 100644
--- a/src/main/java/net/onrc/onos/core/topology/TopologyManager.java
+++ b/src/main/java/net/onrc/onos/core/topology/TopologyManager.java
@@ -74,6 +74,8 @@
     private TopologyEventPreprocessor eventPreprocessor;
     private CopyOnWriteArrayList<ITopologyListener> topologyListeners =
         new CopyOnWriteArrayList<>();
+    private CopyOnWriteArrayList<ITopologyListener> newTopologyListeners =
+        new CopyOnWriteArrayList<>();
 
     //
     // Metrics
@@ -257,6 +259,11 @@
          */
         private void processEvents(List<EventEntry<TopologyEvent>> events) {
             //
+            // Process pending (new) listeners
+            //
+            processPendingListeners();
+
+            //
             // Pre-process the events
             //
             events = eventPreprocessor.processEvents(events);
@@ -273,6 +280,11 @@
                 // to naturally build and update the topology.
                 //
                 for (EventEntry<TopologyEvent> event : events) {
+                    // Ignore NO-OP events
+                    if (event.isNoop()) {
+                        continue;
+                    }
+
                     TopologyEvent topologyEvent = event.eventData();
 
                     // Get the event itself
@@ -381,6 +393,22 @@
             // NOTE: The ADD and UPDATE events are processed in same way
             entryAdded(value);
         }
+
+        /**
+         * Informs the event handler that a new listener has been added,
+         * and that listener expects the first event to be a snapshot of the
+         * current topology.
+         */
+        void listenerAdded() {
+            //
+            // Generate a NO-OP event so the Event Handler processing can be
+            // triggered to generate in-order a snapshot of the current
+            // topology.
+            // TODO: This is a hack.
+            //
+            EventEntry<TopologyEvent> eventEntry = EventEntry.makeNoop();
+            topologyEvents.add(eventEntry);
+        }
     }
 
     /**
@@ -397,22 +425,89 @@
     }
 
     /**
-     * Registers a listener for topology events.
+     * Adds a listener for topology events.
      *
-     * @param listener the listener to register
+     * @param listener the listener to add.
+     * @param startFromSnapshot if true, and if the topology is not
+     * empty, the first event should be a snapshot of the current topology.
      */
-    void registerTopologyListener(ITopologyListener listener) {
-        topologyListeners.addIfAbsent(listener);
+    void addListener(ITopologyListener listener, boolean startFromSnapshot) {
+        if (startFromSnapshot) {
+            newTopologyListeners.addIfAbsent(listener);
+            eventHandler.listenerAdded();
+        } else {
+            topologyListeners.addIfAbsent(listener);
+        }
     }
 
     /**
-     * Deregisters a listener for topology events. The listener will no longer
+     * Removes a listener for topology events. The listener will no longer
      * receive topology events after this call.
      *
-     * @param listener the listener to deregister
+     * @param listener the listener to remove.
      */
-    void deregisterTopologyListener(ITopologyListener listener) {
+    void removeListener(ITopologyListener listener) {
         topologyListeners.remove(listener);
+        newTopologyListeners.remove(listener);
+    }
+
+    /**
+     * Processes pending (new) listeners.
+     * <p>
+     * During the processing, we dispatch Topology Snapshot Events to new
+     * listeners.
+     */
+    private void processPendingListeners() {
+        if (newTopologyListeners.isEmpty()) {
+            return;
+        }
+
+        //
+        // Create the Topology Snapshot Event
+        //
+        TopologyEvents events = null;
+        List<MastershipEvent> mastershipEvents =
+            new ArrayList<>(lastAddMastershipEvents.values());
+        List<SwitchEvent> switchEvents =
+            new ArrayList<>(topology.getAllSwitchEvents());
+        List<PortEvent> portEvents =
+            new ArrayList<>(topology.getAllPortEvents());
+        List<LinkEvent> linkEvents =
+            new ArrayList<>(topology.getAllLinkEvents());
+        List<HostEvent> hostEvents =
+            new ArrayList<>(topology.getAllHostEvents());
+        if (!(mastershipEvents.isEmpty() &&
+              switchEvents.isEmpty() &&
+              portEvents.isEmpty() &&
+              linkEvents.isEmpty() &&
+              hostEvents.isEmpty())) {
+            events = new TopologyEvents(mastershipEvents,
+                                        switchEvents,
+                                        portEvents,
+                                        linkEvents,
+                                        hostEvents);
+        }
+
+        //
+        // Dispatch Snapshot Event to each new listener, and keep track
+        // of each processed listener.
+        //
+        // NOTE: We deliver the event only if it is not empty.
+        // NOTE: We need to execute the loop so we can properly
+        // move the new listeners together with the older listeners.
+        //
+        List<ITopologyListener> processedListeners = new LinkedList<>();
+        for (ITopologyListener listener : newTopologyListeners) {
+            processedListeners.add(listener);
+            // Move the new listener together with the rest of the listeners
+            topologyListeners.addIfAbsent(listener);
+
+            // Dispatch the event
+            if (events != null) {
+                listener.topologyEvents(events);
+            }
+        }
+        newTopologyListeners.removeAll(processedListeners);
     }
 
     /**
@@ -484,20 +579,29 @@
         this.lastEventTimestampEpochMs = System.currentTimeMillis();
 
         //
+        // Allocate the events to deliver.
+        //
+        // TODO: We could avoid the extra list allocation and copy
+        // by using directly the original list. However, during
+        // the cleanup below, we should create new LinkedList objects
+        // instead of using clear()
+        //
+        TopologyEvents events = new TopologyEvents(
+                new ArrayList<>(apiAddedMastershipEvents),
+                new ArrayList<>(apiRemovedMastershipEvents),
+                new ArrayList<>(apiAddedSwitchEvents),
+                new ArrayList<>(apiRemovedSwitchEvents),
+                new ArrayList<>(apiAddedPortEvents),
+                new ArrayList<>(apiRemovedPortEvents),
+                new ArrayList<>(apiAddedLinkEvents),
+                new ArrayList<>(apiRemovedLinkEvents),
+                new ArrayList<>(apiAddedHostEvents),
+                new ArrayList<>(apiRemovedHostEvents));
+
+        //
         // Deliver the events
         //
         for (ITopologyListener listener : this.topologyListeners) {
-            TopologyEvents events =
-                new TopologyEvents(kryo.copy(apiAddedMastershipEvents),
-                                   kryo.copy(apiRemovedMastershipEvents),
-                                   kryo.copy(apiAddedSwitchEvents),
-                                   kryo.copy(apiRemovedSwitchEvents),
-                                   kryo.copy(apiAddedPortEvents),
-                                   kryo.copy(apiRemovedPortEvents),
-                                   kryo.copy(apiAddedLinkEvents),
-                                   kryo.copy(apiRemovedLinkEvents),
-                                   kryo.copy(apiAddedHostEvents),
-                                   kryo.copy(apiRemovedHostEvents));
             listener.topologyEvents(events);
         }
 
diff --git a/src/main/java/net/onrc/onos/core/topology/TopologyModule.java b/src/main/java/net/onrc/onos/core/topology/TopologyModule.java
index d24f4df..fee98b4 100644
--- a/src/main/java/net/onrc/onos/core/topology/TopologyModule.java
+++ b/src/main/java/net/onrc/onos/core/topology/TopologyModule.java
@@ -77,12 +77,13 @@
     }
 
     @Override
-    public void registerTopologyListener(ITopologyListener listener) {
-        topologyManager.registerTopologyListener(listener);
+    public void addListener(ITopologyListener listener,
+                            boolean startFromSnapshot) {
+        topologyManager.addListener(listener, startFromSnapshot);
     }
 
     @Override
-    public void deregisterTopologyListener(ITopologyListener listener) {
-        topologyManager.deregisterTopologyListener(listener);
+    public void removeListener(ITopologyListener listener) {
+        topologyManager.removeListener(listener);
     }
 }
diff --git a/src/main/java/net/onrc/onos/core/util/EventEntry.java b/src/main/java/net/onrc/onos/core/util/EventEntry.java
index e1abcaf..d19a1ac 100644
--- a/src/main/java/net/onrc/onos/core/util/EventEntry.java
+++ b/src/main/java/net/onrc/onos/core/util/EventEntry.java
@@ -8,12 +8,13 @@
      * The event types.
      */
     public enum Type {
-        ENTRY_ADD,            // Add or update an entry
-        ENTRY_REMOVE            // Remove an entry
+        ENTRY_ADD,              // Add or update an entry
+        ENTRY_REMOVE,           // Remove an entry
+        ENTRY_NOOP              // NO-OP event (No Operation)
     }
 
-    private Type eventType;    // The event type
-    private T eventData;    // The relevant event data entry
+    private Type eventType;     // The event type
+    private T eventData;        // The relevant event data entry
 
     /**
      * Constructor for a given event type and event-related data entry.
@@ -27,7 +28,22 @@
     }
 
     /**
-     * Test whether the event type is ENTRY_ADD.
+     * Creates a NO-OP event.
+     * <p/>
+     * This is a factory method that can be called without an object:
+     * <p/>
+     * <code>
+     *   EventEntry<TopologyEvent> eventEntry = EventEntry.makeNoop();
+     * </code>
+     *
+     * @return a NO-OP event.
+     */
+    public static <T> EventEntry<T> makeNoop() {
+        return new EventEntry<T>(Type.ENTRY_NOOP, null);
+    }
+
+    /**
+     * Tests whether the event type is ENTRY_ADD.
      *
      * @return true if the event type is ENTRY_ADD, otherwise false.
      */
@@ -36,7 +52,7 @@
     }
 
     /**
-     * Test whether the event type is ENTRY_REMOVE.
+     * Tests whether the event type is ENTRY_REMOVE.
      *
      * @return true if the event type is ENTRY_REMOVE, otherwise false.
      */
@@ -45,7 +61,16 @@
     }
 
     /**
-     * Get the event type.
+     * Tests whether the event type is ENTRY_NOOP.
+     *
+     * @return true if the event type is ENTRY_NOOP, otherwise false.
+     */
+    public boolean isNoop() {
+        return (this.eventType == Type.ENTRY_NOOP);
+    }
+
+    /**
+     * Gets the event type.
      *
      * @return the event type.
      */
@@ -54,7 +79,7 @@
     }
 
     /**
-     * Get the event-related data entry.
+     * Gets the event-related data entry.
      *
      * @return the event-related data entry.
      */
diff --git a/src/test/java/net/onrc/onos/core/hostmanager/HostManagerTest.java b/src/test/java/net/onrc/onos/core/hostmanager/HostManagerTest.java
index 7e552ed..3c4bfee 100644
--- a/src/test/java/net/onrc/onos/core/hostmanager/HostManagerTest.java
+++ b/src/test/java/net/onrc/onos/core/hostmanager/HostManagerTest.java
@@ -86,7 +86,7 @@
         controllerRegistryService = createMock(IControllerRegistryService.class);
         eventChannel = createMock(IEventChannel.class);
         expect(networkGraphService.getTopology()).andReturn(topology).anyTimes();
-        networkGraphService.registerTopologyListener(anyObject(ITopologyListener.class));
+        networkGraphService.addListener(anyObject(ITopologyListener.class), eq(false));
         expectLastCall();
 
         expect(datagridService.createChannel("onos.host", Long.class, Host.class))
diff --git a/src/test/java/net/onrc/onos/core/intent/runtime/IntentTestMocks.java b/src/test/java/net/onrc/onos/core/intent/runtime/IntentTestMocks.java
index a6dde8b..486604c 100644
--- a/src/test/java/net/onrc/onos/core/intent/runtime/IntentTestMocks.java
+++ b/src/test/java/net/onrc/onos/core/intent/runtime/IntentTestMocks.java
@@ -88,8 +88,8 @@
 
             expect(topologyService.getTopology()).andReturn(topology)
                     .anyTimes();
-            topologyService.registerTopologyListener(
-                    anyObject(ITopologyListener.class));
+            topologyService.addListener(
+                    anyObject(ITopologyListener.class), eq(false));
             expectLastCall();
 
             expect(datagridService.createChannel("onos.pathintent",
diff --git a/src/test/java/net/onrc/onos/core/intent/runtime/UseCaseTest.java b/src/test/java/net/onrc/onos/core/intent/runtime/UseCaseTest.java
index 1d85984..69f8e01 100644
--- a/src/test/java/net/onrc/onos/core/intent/runtime/UseCaseTest.java
+++ b/src/test/java/net/onrc/onos/core/intent/runtime/UseCaseTest.java
@@ -106,7 +106,8 @@
                 .andReturn(restApi).once();
 
         expect(topologyService.getTopology()).andReturn(mockTopology).anyTimes();
-        topologyService.registerTopologyListener(anyObject(ITopologyListener.class));
+        topologyService.addListener(anyObject(ITopologyListener.class),
+                                    eq(false));
         expectLastCall();
 
         expect(datagridService.createChannel("onos.pathintent", Long.class, IntentOperationList.class))
diff --git a/src/test/java/net/onrc/onos/core/topology/TopologyManagerTest.java b/src/test/java/net/onrc/onos/core/topology/TopologyManagerTest.java
index 231ba6f..a84b00f 100644
--- a/src/test/java/net/onrc/onos/core/topology/TopologyManagerTest.java
+++ b/src/test/java/net/onrc/onos/core/topology/TopologyManagerTest.java
@@ -145,14 +145,10 @@
 
         // Setup the Registry Service
         expect(registryService.getOnosInstanceId()).andReturn(ONOS_INSTANCE_ID_1).anyTimes();
-        try {
-            expect(registryService.getControllerForSwitch(DPID_1.value())).
-                andReturn(ONOS_INSTANCE_ID_1.toString()).anyTimes();
-            expect(registryService.getControllerForSwitch(DPID_2.value())).
-                andReturn(ONOS_INSTANCE_ID_2.toString()).anyTimes();
-        } catch (RegistryException ex) {
-            throw new IllegalStateException(ex);
-        }
+        expect(registryService.getControllerForSwitch(DPID_1.value()))
+            .andReturn(ONOS_INSTANCE_ID_1.toString()).anyTimes();
+        expect(registryService.getControllerForSwitch(DPID_2.value()))
+            .andReturn(ONOS_INSTANCE_ID_2.toString()).anyTimes();
 
         allTopologyEvents = new CopyOnWriteArrayList<>();
         expect(eventChannel.getAllEntries())
@@ -186,7 +182,7 @@
     private void setupTopologyManagerWithEventHandler() {
         // Create a TopologyManager object for testing
         theTopologyManager = new TopologyManager(registryService);
-        theTopologyManager.registerTopologyListener(theTopologyListener);
+        theTopologyManager.addListener(theTopologyListener, true);
 
         // Allocate the Event Handler, so we can have direct access to it
         theEventHandler = theTopologyManager.new EventHandler();
@@ -1432,9 +1428,12 @@
      *   instances are processed - both events should be delivered.
      * - Finally, a REMOVE Switch Event is received from the first ONOS
      *   instance - no event should be delivered.
+     *
+     * @throws RegistryException
      */
     @Test
-    public void testProcessSwitchMastershipSwitchover() {
+    public void testProcessSwitchMastershipSwitchover()
+                        throws RegistryException {
         TopologyEvents topologyEvents;
         List<EventEntry<TopologyEvent>> events = new LinkedList<>();
         EventEntry<TopologyEvent> eventEntry;
@@ -1484,12 +1483,8 @@
         // Master.
         //
         reset(registryService);
-        try {
-            expect(registryService.getControllerForSwitch(DPID_1.value())).
-                andReturn(ONOS_INSTANCE_ID_2.toString()).anyTimes();
-        } catch (RegistryException ex) {
-            throw new IllegalStateException(ex);
-        }
+        expect(registryService.getControllerForSwitch(DPID_1.value()))
+            .andReturn(ONOS_INSTANCE_ID_2.toString()).anyTimes();
         replay(registryService);
 
         // Prepare the Mastership Event from the second ONOS instance
