diff --git a/src/main/java/net/onrc/onos/core/topology/PortEvent.java b/src/main/java/net/onrc/onos/core/topology/PortEvent.java
index f23f907..9907a19 100644
--- a/src/main/java/net/onrc/onos/core/topology/PortEvent.java
+++ b/src/main/java/net/onrc/onos/core/topology/PortEvent.java
@@ -134,7 +134,7 @@
 
     @Override
     public String toString() {
-        return "[PortEvent 0x" + getDpid() + "@" + getPortNumber() + "]";
+        return "[PortEvent " + getDpid() + "@" + getPortNumber() + "]";
     }
 
     public static final int PORTID_BYTES = SwitchEvent.SWITCHID_BYTES + 2 + 8;
diff --git a/src/main/java/net/onrc/onos/core/topology/SwitchEvent.java b/src/main/java/net/onrc/onos/core/topology/SwitchEvent.java
index a3b6a93..47f8e81 100644
--- a/src/main/java/net/onrc/onos/core/topology/SwitchEvent.java
+++ b/src/main/java/net/onrc/onos/core/topology/SwitchEvent.java
@@ -95,7 +95,7 @@
 
     @Override
     public String toString() {
-        return "[SwitchEvent 0x" + Long.toHexString(dpid.value()) + "]";
+        return "[SwitchEvent " + dpid + "]";
     }
 
     public static final int SWITCHID_BYTES = 2 + 8;
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 28c23da..1e3dccd 100644
--- a/src/main/java/net/onrc/onos/core/topology/TopologyManager.java
+++ b/src/main/java/net/onrc/onos/core/topology/TopologyManager.java
@@ -513,7 +513,10 @@
     @Override
     public void removeSwitchMastershipEvent(MastershipEvent mastershipEvent) {
         // Send out notification
-        eventChannel.removeEntry(mastershipEvent.getID());
+        TopologyEvent topologyEvent =
+            new TopologyEvent(mastershipEvent,
+                              registryService.getOnosInstanceId());
+        eventChannel.removeEntry(topologyEvent.getID());
     }
 
     /**
@@ -587,6 +590,8 @@
      */
     @Override
     public void removeSwitchDiscoveryEvent(SwitchEvent switchEvent) {
+        TopologyEvent topologyEvent;
+
         // Get the old Port Events
         Map<ByteBuffer, PortEvent> oldPortEvents =
                 discoveredAddedPortEvents.get(switchEvent.getDpid());
@@ -597,7 +602,10 @@
         if (datastore.deactivateSwitch(switchEvent, oldPortEvents.values())) {
             log.debug("Sending remove switch: {}", switchEvent);
             // Send out notification
-            eventChannel.removeEntry(switchEvent.getID());
+            topologyEvent =
+                new TopologyEvent(switchEvent,
+                                  registryService.getOnosInstanceId());
+            eventChannel.removeEntry(topologyEvent.getID());
 
             //
             // Send out notification for each port.
@@ -608,7 +616,10 @@
             //
             for (PortEvent portEvent : oldPortEvents.values()) {
                 log.debug("Sending remove port:", portEvent);
-                eventChannel.removeEntry(portEvent.getID());
+                topologyEvent =
+                    new TopologyEvent(portEvent,
+                                      registryService.getOnosInstanceId());
+                eventChannel.removeEntry(topologyEvent.getID());
             }
             discoveredAddedPortEvents.remove(switchEvent.getDpid());
 
@@ -672,7 +683,10 @@
         if (datastore.deactivatePort(portEvent)) {
             log.debug("Sending remove port: {}", portEvent);
             // Send out notification
-            eventChannel.removeEntry(portEvent.getID());
+            TopologyEvent topologyEvent =
+                new TopologyEvent(portEvent,
+                                  registryService.getOnosInstanceId());
+            eventChannel.removeEntry(topologyEvent.getID());
 
             // Cleanup the Port Event from the local cache
             Map<ByteBuffer, PortEvent> oldPortEvents =
@@ -754,7 +768,10 @@
         if (datastore.removeLink(linkEvent)) {
             log.debug("Sending remove link: {}", linkEvent);
             // Send out notification
-            eventChannel.removeEntry(linkEvent.getID());
+            TopologyEvent topologyEvent =
+                new TopologyEvent(linkEvent,
+                                  registryService.getOnosInstanceId());
+            eventChannel.removeEntry(topologyEvent.getID());
 
             // Cleanup the Link Event from the local cache
             Map<ByteBuffer, LinkEvent> oldLinkEvents =
@@ -806,7 +823,10 @@
     public void removeHostDiscoveryEvent(HostEvent hostEvent) {
         if (datastore.removeHost(hostEvent)) {
             // Send out notification
-            eventChannel.removeEntry(hostEvent.getID());
+            TopologyEvent topologyEvent =
+                new TopologyEvent(hostEvent,
+                                  registryService.getOnosInstanceId());
+            eventChannel.removeEntry(topologyEvent.getID());
             log.debug("Remove the host info into the cache of the topology. mac {}", hostEvent.getMac());
 
             // Cleanup the Host Event from the local cache
