diff --git a/src/main/java/net/onrc/onos/apps/forwarding/Forwarding.java b/src/main/java/net/onrc/onos/apps/forwarding/Forwarding.java
index 5e07018..6758b7a 100644
--- a/src/main/java/net/onrc/onos/apps/forwarding/Forwarding.java
+++ b/src/main/java/net/onrc/onos/apps/forwarding/Forwarding.java
@@ -32,7 +32,7 @@
 import net.onrc.onos.core.registry.IControllerRegistryService;
 import net.onrc.onos.core.topology.Host;
 import net.onrc.onos.core.topology.ITopologyService;
-import net.onrc.onos.core.topology.LinkEvent;
+import net.onrc.onos.core.topology.LinkData;
 import net.onrc.onos.core.topology.Port;
 import net.onrc.onos.core.topology.Switch;
 import net.onrc.onos.core.topology.MutableTopology;
@@ -406,13 +406,13 @@
                         outPort = spfIntent.getDstPortNumber();
                     }
 
-                    for (Iterator<LinkEvent> i = path.iterator(); i.hasNext();) {
-                        LinkEvent le = i.next();
+                    for (Iterator<LinkData> i = path.iterator(); i.hasNext();) {
+                        LinkData ld = i.next();
 
-                        if (le.getSrc().getDpid().equals(sw.getDpid())) {
+                        if (ld.getSrc().getDpid().equals(sw.getDpid())) {
                             log.trace("The packet-in sw dpid {} is on the path.", sw.getDpid());
                             isflowEntryForThisSwitch = true;
-                            outPort = le.getSrc().getPortNumber().value();
+                            outPort = ld.getSrc().getPortNumber().value();
                             break;
                         }
                     }
diff --git a/src/main/java/net/onrc/onos/core/datastore/topology/KVDevice.java b/src/main/java/net/onrc/onos/core/datastore/topology/KVDevice.java
index 2e4b138..addb207 100644
--- a/src/main/java/net/onrc/onos/core/datastore/topology/KVDevice.java
+++ b/src/main/java/net/onrc/onos/core/datastore/topology/KVDevice.java
@@ -16,7 +16,7 @@
 import net.onrc.onos.core.datastore.utils.ByteArrayComparator;
 import net.onrc.onos.core.datastore.utils.ByteArrayUtil;
 import net.onrc.onos.core.datastore.utils.KVObject;
-import net.onrc.onos.core.topology.HostEvent;
+import net.onrc.onos.core.topology.HostData;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -61,7 +61,7 @@
      * @return HostID
      */
     public static byte[] getHostID(final byte[] mac) {
-        return HostEvent.getHostID(mac).array();
+        return HostData.getHostID(mac).array();
     }
 
     /**
diff --git a/src/main/java/net/onrc/onos/core/datastore/topology/KVLink.java b/src/main/java/net/onrc/onos/core/datastore/topology/KVLink.java
index a6a02a7..7caf097 100644
--- a/src/main/java/net/onrc/onos/core/datastore/topology/KVLink.java
+++ b/src/main/java/net/onrc/onos/core/datastore/topology/KVLink.java
@@ -9,8 +9,8 @@
 import net.onrc.onos.core.datastore.IKVTable.IKVEntry;
 import net.onrc.onos.core.datastore.serializers.Topology.LinkProperty;
 import net.onrc.onos.core.datastore.utils.KVObject;
-import net.onrc.onos.core.topology.LinkEvent;
-import net.onrc.onos.core.topology.PortEvent;
+import net.onrc.onos.core.topology.LinkData;
+import net.onrc.onos.core.topology.PortData;
 import net.onrc.onos.core.util.Dpid;
 import net.onrc.onos.core.util.PortNumber;
 
@@ -122,7 +122,7 @@
      */
     public static byte[] getLinkID(final Dpid srcDpid, final PortNumber srcPortNo,
                                    final Dpid dstDpid, final PortNumber dstPortNo) {
-        return LinkEvent.getLinkID(srcDpid, srcPortNo,
+        return LinkData.getLinkID(srcDpid, srcPortNo,
                                    dstDpid, dstPortNo).array();
     }
 
@@ -137,7 +137,7 @@
      */
     public static byte[] getLinkID(final Long srcDpid, final Long srcPortNo,
                                    final Long dstDpid, final Long dstPortNo) {
-        return LinkEvent.getLinkID(srcDpid, srcPortNo, dstDpid,
+        return LinkData.getLinkID(srcDpid, srcPortNo, dstDpid,
                 dstPortNo).array();
     }
 
@@ -162,7 +162,7 @@
             throw new IllegalArgumentException("Invalid Link key");
         }
         final long[] srcPortPair = KVPort.getPortPairFromKey(keyBuf.slice());
-        keyBuf.position(2 + PortEvent.PORTID_BYTES);
+        keyBuf.position(2 + PortData.PORTID_BYTES);
         final long[] dstPortPair = KVPort.getPortPairFromKey(keyBuf.slice());
 
         long[] tuple = new long[4];
diff --git a/src/main/java/net/onrc/onos/core/datastore/topology/KVPort.java b/src/main/java/net/onrc/onos/core/datastore/topology/KVPort.java
index 2fc6be9..341e867 100644
--- a/src/main/java/net/onrc/onos/core/datastore/topology/KVPort.java
+++ b/src/main/java/net/onrc/onos/core/datastore/topology/KVPort.java
@@ -10,7 +10,7 @@
 import net.onrc.onos.core.datastore.serializers.Topology.PortProperty;
 import net.onrc.onos.core.datastore.utils.ByteArrayUtil;
 import net.onrc.onos.core.datastore.utils.KVObject;
-import net.onrc.onos.core.topology.PortEvent;
+import net.onrc.onos.core.topology.PortData;
 import net.onrc.onos.core.util.Dpid;
 import net.onrc.onos.core.util.PortNumber;
 
@@ -69,7 +69,7 @@
      * @return PortID
      */
     public static byte[] getPortID(final Dpid dpid, final PortNumber number) {
-        return PortEvent.getPortID(dpid, number).array();
+        return PortData.getPortID(dpid, number).array();
     }
 
     /**
@@ -80,7 +80,7 @@
      * @return PortID
      */
     public static byte[] getPortID(final Long dpid, final Long number) {
-        return PortEvent.getPortID(dpid, number).array();
+        return PortData.getPortID(dpid, number).array();
     }
 
     /**
diff --git a/src/main/java/net/onrc/onos/core/datastore/topology/KVSwitch.java b/src/main/java/net/onrc/onos/core/datastore/topology/KVSwitch.java
index 1d9b58e..9c3889f 100644
--- a/src/main/java/net/onrc/onos/core/datastore/topology/KVSwitch.java
+++ b/src/main/java/net/onrc/onos/core/datastore/topology/KVSwitch.java
@@ -9,7 +9,7 @@
 import net.onrc.onos.core.datastore.IKVTable.IKVEntry;
 import net.onrc.onos.core.datastore.serializers.Topology.SwitchProperty;
 import net.onrc.onos.core.datastore.utils.KVObject;
-import net.onrc.onos.core.topology.SwitchEvent;
+import net.onrc.onos.core.topology.SwitchData;
 import net.onrc.onos.core.util.Dpid;
 
 import org.slf4j.Logger;
@@ -64,7 +64,7 @@
      * @return SwitchID
      */
     public static byte[] getSwitchID(final Long dpid) {
-        return SwitchEvent.getSwitchID(dpid).array();
+        return SwitchData.getSwitchID(dpid).array();
     }
 
     /**
diff --git a/src/main/java/net/onrc/onos/core/intent/ConstrainedBFSTree.java b/src/main/java/net/onrc/onos/core/intent/ConstrainedBFSTree.java
index 4d9d4ef..a3e9826 100644
--- a/src/main/java/net/onrc/onos/core/intent/ConstrainedBFSTree.java
+++ b/src/main/java/net/onrc/onos/core/intent/ConstrainedBFSTree.java
@@ -5,7 +5,7 @@
 import java.util.LinkedList;
 
 import net.onrc.onos.core.topology.Link;
-import net.onrc.onos.core.topology.LinkEvent;
+import net.onrc.onos.core.topology.LinkData;
 import net.onrc.onos.core.topology.Switch;
 import net.onrc.onos.core.util.Dpid;
 
@@ -19,7 +19,7 @@
 public class ConstrainedBFSTree {
     LinkedList<Switch> switchQueue = new LinkedList<>();
     HashSet<Dpid> switchSearched = new HashSet<>();
-    HashMap<Dpid, LinkEvent> upstreamLinks = new HashMap<>();
+    HashMap<Dpid, LinkData> upstreamLinks = new HashMap<>();
     HashMap<Dpid, Path> paths = new HashMap<>();
     Switch rootSwitch;
     PathIntentMap intents = null;
@@ -68,7 +68,7 @@
                 }
                 switchQueue.add(reachedSwitch);
                 switchSearched.add(reachedSwitch.getDpid());
-                upstreamLinks.put(reachedSwitch.getDpid(), new LinkEvent(link));
+                upstreamLinks.put(reachedSwitch.getDpid(), new LinkData(link));
             }
         }
     }
@@ -86,7 +86,7 @@
             path = new Path();
             Dpid sw = leafSwitch.getDpid();
             while (!sw.equals(rootSwitchDpid)) {
-                LinkEvent upstreamLink = upstreamLinks.get(sw);
+                LinkData upstreamLink = upstreamLinks.get(sw);
                 path.add(0, upstreamLink);
                 sw = upstreamLink.getSrc().getDpid();
             }
diff --git a/src/main/java/net/onrc/onos/core/intent/Path.java b/src/main/java/net/onrc/onos/core/intent/Path.java
index 1fa33cf..a618822 100644
--- a/src/main/java/net/onrc/onos/core/intent/Path.java
+++ b/src/main/java/net/onrc/onos/core/intent/Path.java
@@ -6,31 +6,31 @@
 import java.util.List;
 import java.util.ListIterator;
 
-import net.onrc.onos.core.topology.LinkEvent;
+import net.onrc.onos.core.topology.LinkData;
 
 /**
  * Base class for Path representation, which implements the List interface.
  */
-public class Path implements List<LinkEvent> {
+public class Path implements List<LinkData> {
 
-    private final List<LinkEvent> links;
+    private final List<LinkData> links;
 
     /**
      * Default constructor to create an empty path.
      */
     public Path() {
-        links = new LinkedList<LinkEvent>();
+        links = new LinkedList<LinkData>();
     }
 
     /**
      * Returns a string representation of the path.
      *
-     * @return "[LinkEvent src->dst],..."
+     * @return "[LinkData src->dst],..."
      */
     @Override
     public String toString() {
         StringBuilder builder = new StringBuilder();
-        Iterator<LinkEvent> i = this.iterator();
+        Iterator<LinkData> i = this.iterator();
         while (i.hasNext()) {
             builder.append(i.next().toString());
             if (i.hasNext()) {
@@ -56,7 +56,7 @@
     }
 
     @Override
-    public Iterator<LinkEvent> iterator() {
+    public Iterator<LinkData> iterator() {
         return links.iterator();
     }
 
@@ -71,8 +71,8 @@
     }
 
     @Override
-    public boolean add(LinkEvent e) {
-        return links.add(e);
+    public boolean add(LinkData d) {
+        return links.add(d);
     }
 
     @Override
@@ -86,12 +86,12 @@
     }
 
     @Override
-    public boolean addAll(Collection<? extends LinkEvent> c) {
+    public boolean addAll(Collection<? extends LinkData> c) {
         return links.addAll(c);
     }
 
     @Override
-    public boolean addAll(int index, Collection<? extends LinkEvent> c) {
+    public boolean addAll(int index, Collection<? extends LinkData> c) {
         return links.addAll(index, c);
     }
 
@@ -121,22 +121,22 @@
     }
 
     @Override
-    public LinkEvent get(int index) {
+    public LinkData get(int index) {
         return links.get(index);
     }
 
     @Override
-    public LinkEvent set(int index, LinkEvent element) {
+    public LinkData set(int index, LinkData element) {
         return links.set(index, element);
     }
 
     @Override
-    public void add(int index, LinkEvent element) {
+    public void add(int index, LinkData element) {
         links.add(index, element);
     }
 
     @Override
-    public LinkEvent remove(int index) {
+    public LinkData remove(int index) {
         return links.remove(index);
     }
 
@@ -151,17 +151,17 @@
     }
 
     @Override
-    public ListIterator<LinkEvent> listIterator() {
+    public ListIterator<LinkData> listIterator() {
         return links.listIterator();
     }
 
     @Override
-    public ListIterator<LinkEvent> listIterator(int index) {
+    public ListIterator<LinkData> listIterator(int index) {
         return links.listIterator(index);
     }
 
     @Override
-    public List<LinkEvent> subList(int fromIndex, int toIndex) {
+    public List<LinkData> subList(int fromIndex, int toIndex) {
         return links.subList(fromIndex, toIndex);
     }
 }
diff --git a/src/main/java/net/onrc/onos/core/intent/PathIntentMap.java b/src/main/java/net/onrc/onos/core/intent/PathIntentMap.java
index d784439..b8962d8 100644
--- a/src/main/java/net/onrc/onos/core/intent/PathIntentMap.java
+++ b/src/main/java/net/onrc/onos/core/intent/PathIntentMap.java
@@ -6,7 +6,7 @@
 import java.util.HashSet;
 
 import net.onrc.onos.core.topology.Link;
-import net.onrc.onos.core.topology.LinkEvent;
+import net.onrc.onos.core.topology.LinkData;
 import net.onrc.onos.core.util.Dpid;
 import net.onrc.onos.core.util.LinkTuple;
 import net.onrc.onos.core.util.PortNumber;
@@ -74,9 +74,9 @@
         super.putIntent(intent);
 
         PathIntent pathIntent = (PathIntent) intent;
-        for (LinkEvent linkEvent : pathIntent.getPath()) {
-            put(linkEvent.getSrc(), (PathIntent) intent);
-            put(linkEvent.getDst(), (PathIntent) intent);
+        for (LinkData linkData : pathIntent.getPath()) {
+            put(linkData.getSrc(), (PathIntent) intent);
+            put(linkData.getDst(), (PathIntent) intent);
         }
     }
 
@@ -88,9 +88,9 @@
     @Override
     protected void removeIntent(String intentId) {
         PathIntent intent = (PathIntent) getIntent(intentId);
-        for (LinkEvent linkEvent : intent.getPath()) {
-            get(linkEvent.getSrc()).remove(intent);
-            get(linkEvent.getDst()).remove(intent);
+        for (LinkData linkData : intent.getPath()) {
+            get(linkData.getSrc()).remove(intent);
+            get(linkData.getDst()).remove(intent);
         }
         super.removeIntent(intentId);
     }
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 ccad3ba..bb1208d 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
@@ -43,9 +43,9 @@
 import net.onrc.onos.core.registry.IControllerRegistryService;
 import net.onrc.onos.core.topology.ITopologyListener;
 import net.onrc.onos.core.topology.ITopologyService;
-import net.onrc.onos.core.topology.LinkEvent;
-import net.onrc.onos.core.topology.PortEvent;
-import net.onrc.onos.core.topology.SwitchEvent;
+import net.onrc.onos.core.topology.LinkData;
+import net.onrc.onos.core.topology.PortData;
+import net.onrc.onos.core.topology.SwitchData;
 import net.onrc.onos.core.topology.TopologyEvents;
 import net.onrc.onos.core.util.Dpid;
 import net.onrc.onos.core.util.LinkTuple;
@@ -265,7 +265,7 @@
     private static final String INTENT_STATE_EVENT_CHANNEL_NAME = "onos.pathintent_state";
     private static final Logger log = LoggerFactory.getLogger(PathCalcRuntimeModule.class);
 
-    private HashSet<LinkTuple> unmatchedLinkEvents = new HashSet<>();
+    private HashSet<LinkTuple> unmatchedLinkDataEntries = new HashSet<>();
     private ConcurrentMap<String, Set<Long>> intentInstalledMap = new ConcurrentHashMap<String, Set<Long>>();
     private ConcurrentMap<String, Intent> staleIntents = new ConcurrentHashMap<String, Intent>();
     private DeleteIntentsTracker deleteIntentsTracker = new DeleteIntentsTracker();
@@ -414,8 +414,8 @@
         Set<Long> allSwitchesForPath = new HashSet<Long>();
         ShortestPathIntent spfIntent = (ShortestPathIntent) pathIntent.getParentIntent();
 
-        for (LinkEvent linkEvent : pathIntent.getPath()) {
-            long sw = linkEvent.getSrc().getDpid().value();
+        for (LinkData linkData : pathIntent.getPath()) {
+            long sw = linkData.getSrc().getDpid().value();
             allSwitchesForPath.add(sw);
         }
         allSwitchesForPath.add(spfIntent.getDstSwitchDpid());
@@ -446,8 +446,8 @@
         Set<Long> allSwitchesForPath = new HashSet<Long>();
         ShortestPathIntent spfIntent = (ShortestPathIntent) pathIntent.getParentIntent();
 
-        for (LinkEvent linkEvent : pathIntent.getPath()) {
-            long sw = linkEvent.getSrc().getDpid().value();
+        for (LinkData linkData : pathIntent.getPath()) {
+            long sw = linkData.getSrc().getDpid().value();
 
             if (domainSwitchDpids.contains(sw)) {
                 allSwitchesForPath.add(sw);
@@ -835,56 +835,56 @@
         HashSet<Intent> affectedPaths = new HashSet<>();
 
         boolean rerouteAll = false;
-        for (LinkEvent le : topologyEvents.getAddedLinkEvents()) {
-            final LinkTuple rev = new LinkTuple(le.getDst(), le.getSrc());
-            if (unmatchedLinkEvents.contains(rev)) {
+        for (LinkData ld : topologyEvents.getAddedLinkDataEntries()) {
+            final LinkTuple rev = new LinkTuple(ld.getDst(), ld.getSrc());
+            if (unmatchedLinkDataEntries.contains(rev)) {
                 rerouteAll = true;
-                unmatchedLinkEvents.remove(rev);
-                log.debug("Found matched LinkEvent: {} {}", rev, le);
+                unmatchedLinkDataEntries.remove(rev);
+                log.debug("Found matched LinkData: {} {}", rev, ld);
             } else {
-                unmatchedLinkEvents.add(le.getLinkTuple());
-                log.debug("Adding unmatched LinkEvent: {}", le);
+                unmatchedLinkDataEntries.add(ld.getLinkTuple());
+                log.debug("Adding unmatched LinkData: {}", ld);
             }
         }
-        for (LinkEvent le : topologyEvents.getRemovedLinkEvents()) {
-            if (unmatchedLinkEvents.contains(le.getLinkTuple())) {
-                unmatchedLinkEvents.remove(le.getLinkTuple());
-                log.debug("Removing LinkEvent: {}", le);
+        for (LinkData ld : topologyEvents.getRemovedLinkDataEntries()) {
+            if (unmatchedLinkDataEntries.contains(ld.getLinkTuple())) {
+                unmatchedLinkDataEntries.remove(ld.getLinkTuple());
+                log.debug("Removing LinkData: {}", ld);
             }
         }
-        if (unmatchedLinkEvents.size() > 0) {
-            log.debug("Unmatched link events: {} events", unmatchedLinkEvents.size());
+        if (unmatchedLinkDataEntries.size() > 0) {
+            log.debug("Unmatched link events: {} events", unmatchedLinkDataEntries.size());
         }
 
         if (rerouteAll) {
             //
-            // (topologyEvents.getAddedLinkEvents().size() > 0) ||
-            // (topologyEvents.getAddedPortEvents().size() > 0) ||
-            // (topologyEvents.getAddedSwitchEvents.size() > 0)
+            // (topologyEvents.getAddedLinkDataEntries().size() > 0) ||
+            // (topologyEvents.getAddedPortDataEntries().size() > 0) ||
+            // (topologyEvents.getAddedSwitchDataEntries().size() > 0)
             //
             p.log("begin_getAllIntents");
             affectedPaths.addAll(getPathIntents().getAllIntents());
             p.log("end_getAllIntents");
-        } else if (topologyEvents.getRemovedSwitchEvents().size() > 0 ||
-                   topologyEvents.getRemovedLinkEvents().size() > 0 ||
-                   topologyEvents.getRemovedPortEvents().size() > 0) {
+        } else if (topologyEvents.getRemovedSwitchDataEntries().size() > 0 ||
+                   topologyEvents.getRemovedLinkDataEntries().size() > 0 ||
+                   topologyEvents.getRemovedPortDataEntries().size() > 0) {
             p.log("begin_getIntentsByLink");
-            for (LinkEvent linkEvent : topologyEvents.getRemovedLinkEvents()) {
-                affectedPaths.addAll(pathIntents.getIntentsByLink(linkEvent.getLinkTuple()));
+            for (LinkData linkData : topologyEvents.getRemovedLinkDataEntries()) {
+                affectedPaths.addAll(pathIntents.getIntentsByLink(linkData.getLinkTuple()));
             }
             p.log("end_getIntentsByLink");
 
             p.log("begin_getIntentsByPort");
-            for (PortEvent portEvent : topologyEvents.getRemovedPortEvents()) {
+            for (PortData portData : topologyEvents.getRemovedPortDataEntries()) {
                 affectedPaths.addAll(pathIntents.getIntentsByPort(
-                        portEvent.getDpid(),
-                        portEvent.getPortNumber()));
+                        portData.getDpid(),
+                        portData.getPortNumber()));
             }
             p.log("end_getIntentsByPort");
 
             p.log("begin_getIntentsByDpid");
-            for (SwitchEvent switchEvent : topologyEvents.getRemovedSwitchEvents()) {
-                affectedPaths.addAll(pathIntents.getIntentsByDpid(switchEvent.getDpid()));
+            for (SwitchData switchData : topologyEvents.getRemovedSwitchDataEntries()) {
+                affectedPaths.addAll(pathIntents.getIntentsByDpid(switchData.getDpid()));
             }
             p.log("end_getIntentsByDpid");
         }
diff --git a/src/main/java/net/onrc/onos/core/intent/runtime/PlanCalcRuntime.java b/src/main/java/net/onrc/onos/core/intent/runtime/PlanCalcRuntime.java
index 07f7bec..39320c9 100644
--- a/src/main/java/net/onrc/onos/core/intent/runtime/PlanCalcRuntime.java
+++ b/src/main/java/net/onrc/onos/core/intent/runtime/PlanCalcRuntime.java
@@ -18,7 +18,7 @@
 import net.onrc.onos.core.intent.IntentOperationList;
 import net.onrc.onos.core.intent.PathIntent;
 import net.onrc.onos.core.intent.ShortestPathIntent;
-import net.onrc.onos.core.topology.LinkEvent;
+import net.onrc.onos.core.topology.LinkData;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -117,9 +117,9 @@
                 continue;
             }
             List<FlowEntry> entries = new ArrayList<>();
-            for (LinkEvent linkEvent : intent.getPath()) {
-                long sw = linkEvent.getSrc().getDpid().value();
-                dstPort = linkEvent.getSrc().getPortNumber().value();
+            for (LinkData linkData : intent.getPath()) {
+                long sw = linkData.getSrc().getDpid().value();
+                dstPort = linkData.getSrc().getPortNumber().value();
                 FlowEntry fe = new FlowEntry(sw, srcPort, dstPort, srcMac, dstMac,
                                              srcIP, dstIP, i.operator);
                 if (sw != firstSrcSw) {
@@ -134,7 +134,7 @@
                     fe.setFlowEntryId(cookieId);
                 }
                 entries.add(fe);
-                srcPort = linkEvent.getDst().getPortNumber().value();
+                srcPort = linkData.getDst().getPortNumber().value();
             }
             if (lastDstSw >= 0 && lastDstPort >= 0) {
                 long sw = lastDstSw;
diff --git a/src/main/java/net/onrc/onos/core/intent/runtime/web/ShortestPathResource.java b/src/main/java/net/onrc/onos/core/intent/runtime/web/ShortestPathResource.java
index 2910c3d..5f76f33 100644
--- a/src/main/java/net/onrc/onos/core/intent/runtime/web/ShortestPathResource.java
+++ b/src/main/java/net/onrc/onos/core/intent/runtime/web/ShortestPathResource.java
@@ -8,7 +8,7 @@
 import net.onrc.onos.core.intent.Path;
 import net.onrc.onos.core.topology.ITopologyService;
 import net.onrc.onos.core.topology.Link;
-import net.onrc.onos.core.topology.LinkEvent;
+import net.onrc.onos.core.topology.LinkData;
 import net.onrc.onos.core.topology.Switch;
 import net.onrc.onos.core.topology.MutableTopology;
 import net.onrc.onos.core.util.Dpid;
@@ -65,12 +65,12 @@
                 return null;
             }
             List<Link> links = new LinkedList<>();
-            for (LinkEvent linkEvent : path) {
+            for (LinkData linkData : path) {
                 Link link = mutableTopology.getLink(
-                        linkEvent.getSrc().getDpid(),
-                        linkEvent.getSrc().getPortNumber(),
-                        linkEvent.getDst().getDpid(),
-                        linkEvent.getDst().getPortNumber());
+                        linkData.getSrc().getDpid(),
+                        linkData.getSrc().getPortNumber(),
+                        linkData.getDst().getDpid(),
+                        linkData.getDst().getPortNumber());
                 if (link == null) {
                     return null;
                 }
diff --git a/src/main/java/net/onrc/onos/core/newintent/PointToPointIntentCompiler.java b/src/main/java/net/onrc/onos/core/newintent/PointToPointIntentCompiler.java
index 3c04e0d..a4cfceb 100644
--- a/src/main/java/net/onrc/onos/core/newintent/PointToPointIntentCompiler.java
+++ b/src/main/java/net/onrc/onos/core/newintent/PointToPointIntentCompiler.java
@@ -16,7 +16,7 @@
 import net.onrc.onos.core.matchaction.match.PacketMatch;
 import net.onrc.onos.core.topology.BaseTopology;
 import net.onrc.onos.core.topology.ITopologyService;
-import net.onrc.onos.core.topology.LinkEvent;
+import net.onrc.onos.core.topology.LinkData;
 import net.onrc.onos.core.topology.Switch;
 import net.onrc.onos.core.util.IdGenerator;
 import net.onrc.onos.core.util.SwitchPort;
@@ -104,13 +104,13 @@
         // transform is avoided.
         // Ref: https://code.google.com/p/guava-libraries/issues/detail?id=1812
         // TODO: replace with transform when the above issue is resolved
-        ImmutableList<LinkEvent> events = FluentIterable.from(path)
+        ImmutableList<LinkData> dataEntries = FluentIterable.from(path)
                 .filter(Predicates.notNull())
                 .toList();
 
         Path converted = new Path();
-        for (LinkEvent event: events) {
-            converted.add(new FlowLink(event.getSrc(), event.getDst()));
+        for (LinkData data: dataEntries) {
+            converted.add(new FlowLink(data.getSrc(), data.getDst()));
         }
         return converted;
     }
diff --git a/src/main/java/net/onrc/onos/core/topology/BaseInternalTopology.java b/src/main/java/net/onrc/onos/core/topology/BaseInternalTopology.java
index cf44c32..3cd6979 100644
--- a/src/main/java/net/onrc/onos/core/topology/BaseInternalTopology.java
+++ b/src/main/java/net/onrc/onos/core/topology/BaseInternalTopology.java
@@ -14,120 +14,121 @@
 public interface BaseInternalTopology extends BaseMastership {
 
     /**
-     * Gets a SwitchEvent.
+     * Gets a SwitchData.
      *
      * @param dpid Switch DPID
-     * @return the SwitchEvent for the Switch DPID if found, otherwise null
+     * @return the SwitchData for the Switch DPID if found, otherwise null
      */
-    public SwitchEvent getSwitchEvent(Dpid dpid);
+    public SwitchData getSwitchData(Dpid dpid);
 
     /**
-     * Gets all SwitchEvent entries.
+     * Gets all SwitchData entries.
      *
-     * @return all SwitchEvent entries.
+     * @return all SwitchData entries.
      */
-    public Collection<SwitchEvent> getAllSwitchEvents();
+    public Collection<SwitchData> getAllSwitchDataEntries();
 
     /**
-     * Gets a PortEvent.
+     * Gets a PortData.
      *
      * @param port Port identifier
-     * @return the PortEvent for the Port identifier if found, otherwise null
+     * @return the PortData for the Port identifier if found, otherwise null
      */
-    public PortEvent getPortEvent(SwitchPort port);
+    public PortData getPortData(SwitchPort port);
 
     /**
-     * Gets a PortEvent.
+     * Gets a PortData.
      *
      * @param dpid Switch DPID
      * @param portNumber Port number
-     * @return the PortEvent for the (Dpid, PortNumber) if found, otherwise null
+     * @return the PortData for the (Dpid, PortNumber) if found, otherwise null
      */
-    public PortEvent getPortEvent(Dpid dpid, PortNumber portNumber);
+    public PortData getPortData(Dpid dpid, PortNumber portNumber);
 
     /**
-     * Gets all the PortEvents on a switch.
+     * Gets all PortData entries on a switch.
      *
      * @param dpid Switch DPID
-     * @return PortEvents
+     * @return all PortData entries on a switch.
      */
-    public Collection<PortEvent> getPortEvents(Dpid dpid);
+    public Collection<PortData> getPortDataEntries(Dpid dpid);
 
     /**
-     * Gets all PortEvent entries.
+     * Gets all PortData entries.
      *
-     * @return all PortEvent entries.
+     * @return all PortData entries.
      */
-    public Collection<PortEvent> getAllPortEvents();
+    public Collection<PortData> getAllPortDataEntries();
 
     /**
-     * Gets a LinkEvent.
+     * Gets a LinkData.
      *
      * @param linkId Link identifier
-     * @return the LinkEvent for the Link identifier if found, otherwise null
+     * @return the LinkData for the Link identifier if found, otherwise null
      */
-    public LinkEvent getLinkEvent(LinkTuple linkId);
+    public LinkData getLinkData(LinkTuple linkId);
 
     /**
-     * Gets a LinkEvent.
+     * Gets a LinkData.
      *
      * @param linkId Link identifier
      * @param type type
-     * @return the LinkEvent for the Link identifier and type if found, otherwise null
+     * @return the LinkData for the Link identifier and type if found,
+     * otherwise null
      */
-    public LinkEvent getLinkEvent(final LinkTuple linkId, final String type);
+    public LinkData getLinkData(final LinkTuple linkId, final String type);
 
     /**
-     * Gets all the LinkEvent departing from specified port.
+     * Gets all LinkData entries departing from a specified port.
      *
      * @param srcPort source port identifier
-     * @return Collection of LinkEvent entries
+     * @return Collection of LinkData entries
      */
-    public Collection<LinkEvent> getLinkEventsFrom(final SwitchPort srcPort);
+    public Collection<LinkData> getLinkDataEntriesFrom(final SwitchPort srcPort);
 
     /**
-     * Gets all the LinkEvent pointing toward specified port.
+     * Gets all LinkData entries pointing toward a specified port.
      *
      * @param dstPort destination port identifier
-     * @return Collection of LinkEvent entries
+     * @return Collection of LinkData entries
      */
-    public Collection<LinkEvent> getLinkEventsTo(final SwitchPort dstPort);
+    public Collection<LinkData> getLinkDataEntriesTo(final SwitchPort dstPort);
 
     /**
-     * Gets a collection of LinkEvent entries.
+     * Gets a collection of LinkData entries.
      *
      * @param linkId Link identifier
-     * @return Collection of LinkEvent entries.
+     * @return Collection of LinkData entries.
      */
-    public Collection<LinkEvent> getLinkEvents(LinkTuple linkId);
+    public Collection<LinkData> getLinkDataEntries(LinkTuple linkId);
 
     /**
-     * Gets all LinkEvent entries.
+     * Gets all LinkData entries.
      *
-     * @return all LinkEvent entries.
+     * @return all LinkData entries.
      */
-    public Collection<LinkEvent> getAllLinkEvents();
+    public Collection<LinkData> getAllLinkDataEntries();
 
     /**
-     * Gets a HostEvent.
+     * Gets a HostData.
      *
      * @param mac MACAddress of the host
-     * @return the HostEvent for the MACAddress if found, otherwise null
+     * @return the HostData for the MACAddress if found, otherwise null
      */
-    public HostEvent getHostEvent(MACAddress mac);
+    public HostData getHostData(MACAddress mac);
 
     /**
-     * Gets all HostEvent entries attached to specified port.
+     * Gets all HostData entries attached to a specified port.
      *
      * @param port attachment point identifier
-     * @return Collection of HostEvent entries.
+     * @return Collection of HostData entries.
      */
-    public Collection<HostEvent> getHostEvents(SwitchPort port);
+    public Collection<HostData> getHostDataEntries(SwitchPort port);
 
     /**
-     * Gets all HostEvent entries.
+     * Gets all HostData entries.
      *
-     * @return all HostEvent entries.
+     * @return all HostData entries.
      */
-    public Collection<HostEvent> getAllHostEvents();
+    public Collection<HostData> getAllHostDataEntries();
 }
diff --git a/src/main/java/net/onrc/onos/core/topology/BaseTopologyAdaptor.java b/src/main/java/net/onrc/onos/core/topology/BaseTopologyAdaptor.java
index 2a6ac33..274c7ed 100644
--- a/src/main/java/net/onrc/onos/core/topology/BaseTopologyAdaptor.java
+++ b/src/main/java/net/onrc/onos/core/topology/BaseTopologyAdaptor.java
@@ -32,7 +32,7 @@
 
     @Override
     public Switch getSwitch(Dpid dpid) {
-        final SwitchEvent sw = internal.getSwitchEvent(dpid);
+        final SwitchData sw = internal.getSwitchData(dpid);
         if (sw != null) {
             return new SwitchImpl(internal, dpid);
         }
@@ -41,9 +41,9 @@
 
     @Override
     public Iterable<Switch> getSwitches() {
-        final Collection<SwitchEvent> switches = internal.getAllSwitchEvents();
+        final Collection<SwitchData> switches = internal.getAllSwitchDataEntries();
         List<Switch> list = new ArrayList<>(switches.size());
-        for (SwitchEvent elm : switches) {
+        for (SwitchData elm : switches) {
             list.add(new SwitchImpl(internal, elm.getDpid()));
         }
         return list;
@@ -51,7 +51,7 @@
 
     @Override
     public Port getPort(Dpid dpid, PortNumber portNumber) {
-        final PortEvent port = internal.getPortEvent(dpid, portNumber);
+        final PortData port = internal.getPortData(dpid, portNumber);
         if (port != null) {
             return new PortImpl(internal, port.getSwitchPort());
         }
@@ -65,9 +65,9 @@
 
     @Override
     public Collection<Port> getPorts(Dpid dpid) {
-        final Collection<PortEvent> ports = internal.getPortEvents(dpid);
+        final Collection<PortData> ports = internal.getPortDataEntries(dpid);
         List<Port> list = new ArrayList<>(ports.size());
-        for (PortEvent elm : ports) {
+        for (PortData elm : ports) {
             list.add(new PortImpl(internal, elm.getSwitchPort()));
         }
         return list;
@@ -86,8 +86,8 @@
 
     @Override
     public Link getOutgoingLink(SwitchPort port) {
-        final Collection<LinkEvent> links = internal.getLinkEventsFrom(port);
-        LinkEvent link = getPacketLinkEventIfExists(links);
+        final Collection<LinkData> links = internal.getLinkDataEntriesFrom(port);
+        LinkData link = getPacketLinkDataIfExists(links);
         if (link != null) {
             return new LinkImpl(internal, link.getLinkTuple());
         }
@@ -96,8 +96,8 @@
 
     @Override
     public Link getIncomingLink(SwitchPort port) {
-        final Collection<LinkEvent> links = internal.getLinkEventsTo(port);
-        LinkEvent link = getPacketLinkEventIfExists(links);
+        final Collection<LinkData> links = internal.getLinkDataEntriesTo(port);
+        LinkData link = getPacketLinkDataIfExists(links);
         if (link != null) {
             return new LinkImpl(internal, link.getLinkTuple());
         }
@@ -111,8 +111,8 @@
      * @param links Collection of links to search from
      * @return Link instance found or null if no link exists
      */
-    private static LinkEvent getPacketLinkEventIfExists(Collection<LinkEvent> links) {
-        for (LinkEvent link : links) {
+    private static LinkData getPacketLinkDataIfExists(Collection<LinkData> links) {
+        for (LinkData link : links) {
             if (TopologyElement.TYPE_PACKET_LAYER.equals(link.getType())) {
                 return link;
             }
@@ -136,8 +136,8 @@
 
     @Override
     public Link getOutgoingLink(SwitchPort port, String type) {
-        final Collection<LinkEvent> links = internal.getLinkEventsFrom(port);
-        for (LinkEvent link : links) {
+        final Collection<LinkData> links = internal.getLinkDataEntriesFrom(port);
+        for (LinkData link : links) {
             if (link.getType().equals(type)) {
                 return new LinkImpl(internal, link.getLinkTuple());
             }
@@ -147,8 +147,8 @@
 
     @Override
     public Link getIncomingLink(SwitchPort port, String type) {
-        final Collection<LinkEvent> links = internal.getLinkEventsTo(port);
-        for (LinkEvent link : links) {
+        final Collection<LinkData> links = internal.getLinkDataEntriesTo(port);
+        for (LinkData link : links) {
             if (link.getType().equals(type)) {
                 return new LinkImpl(internal, link.getLinkTuple());
             }
@@ -159,33 +159,33 @@
 
     @Override
     public Collection<Link> getOutgoingLinks(SwitchPort port) {
-        final Collection<LinkEvent> links = internal.getLinkEventsFrom(port);
+        final Collection<LinkData> links = internal.getLinkDataEntriesFrom(port);
         return toLinkImpls(internal, links);
     }
 
     @Override
     public Collection<Link> getIncomingLinks(SwitchPort port) {
-        final Collection<LinkEvent> links = internal.getLinkEventsTo(port);
+        final Collection<LinkData> links = internal.getLinkDataEntriesTo(port);
         return toLinkImpls(internal, links);
     }
 
 
     /**
-     * Converts collection of LinkEvent to collection of LinkImpls.
+     * Converts collection of LinkData to collection of LinkImpls.
      *
      * @param internalTopology topology {@code links} resides
-     * @param links collection of LinkEvent
+     * @param links collection of LinkData
      * @return collection of {@link LinkImpl}s
      */
     private static Collection<Link> toLinkImpls(
                                 final BaseInternalTopology internalTopology,
-                                final Collection<LinkEvent> links) {
+                                final Collection<LinkData> links) {
 
         if (links == null) {
             return Collections.emptyList();
         }
         List<Link> list = new ArrayList<>(links.size());
-        for (LinkEvent elm : links) {
+        for (LinkData elm : links) {
             list.add(new LinkImpl(internalTopology, elm.getLinkTuple()));
         }
         return list;
@@ -228,14 +228,14 @@
 
     @Override
     public Iterable<Link> getLinks() {
-        final Collection<LinkEvent> links = internal.getAllLinkEvents();
+        final Collection<LinkData> links = internal.getAllLinkDataEntries();
         return toLinkImpls(internal, links);
     }
 
     @Override
     public Host getHostByMac(MACAddress address) {
 
-        HostEvent host = internal.getHostEvent(address);
+        HostData host = internal.getHostData(address);
         if (host != null) {
             return new HostImpl(internal, address);
         }
@@ -244,23 +244,23 @@
 
     @Override
     public Iterable<Host> getHosts() {
-        return toHostImpls(internal, internal.getAllHostEvents());
+        return toHostImpls(internal, internal.getAllHostDataEntries());
     }
 
     /**
-     * Converts collection of HostEvent to collection of HostImpl.
+     * Converts collection of HostData to collection of HostImpl.
      *
      * @param internalTopology topology {@code hosts} resides
-     * @param hosts collection of HostEvent
+     * @param hosts collection of HostData
      * @return collection of HostImpl
      */
     private static List<Host> toHostImpls(BaseInternalTopology internalTopology,
-                                          Collection<HostEvent> hosts) {
+                                          Collection<HostData> hosts) {
         if (hosts == null) {
             return Collections.emptyList();
         }
         List<Host> list = new ArrayList<>(hosts.size());
-        for (HostEvent elm : hosts) {
+        for (HostData elm : hosts) {
             list.add(new HostImpl(internalTopology, elm.getMac()));
         }
         return list;
@@ -268,7 +268,7 @@
 
     @Override
     public Collection<Host> getHosts(SwitchPort port) {
-        return toHostImpls(internal, internal.getHostEvents(port));
+        return toHostImpls(internal, internal.getHostDataEntries(port));
     }
 
 
diff --git a/src/main/java/net/onrc/onos/core/topology/HostEvent.java b/src/main/java/net/onrc/onos/core/topology/HostData.java
similarity index 82%
rename from src/main/java/net/onrc/onos/core/topology/HostEvent.java
rename to src/main/java/net/onrc/onos/core/topology/HostData.java
index 4b7de52..d799113 100644
--- a/src/main/java/net/onrc/onos/core/topology/HostEvent.java
+++ b/src/main/java/net/onrc/onos/core/topology/HostData.java
@@ -8,7 +8,7 @@
 import java.util.Objects;
 
 import net.floodlightcontroller.util.MACAddress;
-import net.onrc.onos.core.topology.web.serializers.HostEventSerializer;
+import net.onrc.onos.core.topology.web.serializers.HostDataSerializer;
 import net.onrc.onos.core.util.Dpid;
 import net.onrc.onos.core.util.SwitchPort;
 
@@ -16,21 +16,10 @@
 import org.codehaus.jackson.map.annotate.JsonSerialize;
 
 /**
- * Self-contained Host event(s) Object
- * <p/>
- * Host event differ from other events.
- * Host Event represent add/remove of attachmentPoint.
- * Not add/remove of the Host Object itself.
- * <p/>
- * Multiple attachmentPoints can be specified to batch events into 1 object.
- * Each should be treated as independent events.
- * <p/>
- * TODO: Rename to match what it is. (Switch/Port/Link/Host)Snapshot?
- * FIXME: Current implementation directly use this object as
- *        Replication message, but should be sending update operation info.
+ * Self-contained Host object.
  */
-@JsonSerialize(using = HostEventSerializer.class)
-public class HostEvent extends TopologyElement<HostEvent> {
+@JsonSerialize(using = HostDataSerializer.class)
+public class HostData extends TopologyElement<HostData> {
 
     private final MACAddress mac;
     private List<SwitchPort> attachmentPoints;
@@ -40,7 +29,7 @@
      * Default constructor for Serializer to use.
      */
     @Deprecated
-    protected HostEvent() {
+    protected HostData() {
         mac = null;
     }
 
@@ -49,7 +38,7 @@
      *
      * @param mac the MAC address to identify the host
      */
-    public HostEvent(MACAddress mac) {
+    public HostData(MACAddress mac) {
         this.mac = checkNotNull(mac);
         this.attachmentPoints = new LinkedList<>();
     }
@@ -57,11 +46,11 @@
     /**
      * Copy constructor.
      * <p>
-     * Creates an unfrozen copy of the given HostEvent object.
+     * Creates an unfrozen copy of the given HostData object.
      *
      * @param original the object to make copy of
      */
-    public HostEvent(HostEvent original) {
+    public HostData(HostData original) {
         super(original);
         this.mac = original.mac;
         this.attachmentPoints = new ArrayList<>(original.attachmentPoints);
@@ -193,7 +182,7 @@
             return false;
         }
 
-        HostEvent other = (HostEvent) o;
+        HostData other = (HostData) o;
         // XXX lastSeenTime excluded from Equality condition, is it OK?
         return Objects.equals(mac, other.mac) &&
                 Objects.equals(this.attachmentPoints, other.attachmentPoints);
@@ -201,6 +190,6 @@
 
     @Override
     public String toString() {
-        return "[HostEvent " + mac + " attachmentPoints:" + attachmentPoints + "]";
+        return "[HostData " + mac + " attachmentPoints:" + attachmentPoints + "]";
     }
 }
diff --git a/src/main/java/net/onrc/onos/core/topology/HostImpl.java b/src/main/java/net/onrc/onos/core/topology/HostImpl.java
index 90af82b..e45e015 100644
--- a/src/main/java/net/onrc/onos/core/topology/HostImpl.java
+++ b/src/main/java/net/onrc/onos/core/topology/HostImpl.java
@@ -35,7 +35,7 @@
     public Iterable<Port> getAttachmentPoints() {
         List<Port> ports = new ArrayList<>();
         final BaseTopologyAdaptor topo = new BaseTopologyAdaptor(topology);
-        for (SwitchPort swp : getHostEvent().getAttachmentPoints()) {
+        for (SwitchPort swp : getHostData().getAttachmentPoints()) {
             Port port = topo.getPort(swp);
             if (port != null) {
                 ports.add(port);
@@ -46,7 +46,7 @@
 
     @Override
     public long getLastSeenTime() {
-        return this.topology.getHostEvent(id).getLastSeenTime();
+        return this.topology.getHostData(id).getLastSeenTime();
     }
 
     @Override
@@ -55,12 +55,12 @@
     }
 
     /**
-     * Gets the current HostEvent.
+     * Gets the current HostData.
      *
-     * @return HostEvent
+     * @return HostData
      */
-    private HostEvent getHostEvent() {
-        return this.topology.getHostEvent(id);
+    private HostData getHostData() {
+        return this.topology.getHostData(id);
     }
 
     /**
diff --git a/src/main/java/net/onrc/onos/core/topology/ImmutableInternalTopologyWrapper.java b/src/main/java/net/onrc/onos/core/topology/ImmutableInternalTopologyWrapper.java
index 8a2a89a..2b9c976 100644
--- a/src/main/java/net/onrc/onos/core/topology/ImmutableInternalTopologyWrapper.java
+++ b/src/main/java/net/onrc/onos/core/topology/ImmutableInternalTopologyWrapper.java
@@ -38,78 +38,78 @@
     }
 
     @Override
-    public SwitchEvent getSwitchEvent(Dpid dpid) {
-        return wrapped.getSwitchEvent(dpid);
+    public SwitchData getSwitchData(Dpid dpid) {
+        return wrapped.getSwitchData(dpid);
     }
 
     @Override
-    public Collection<SwitchEvent> getAllSwitchEvents() {
-        return wrapped.getAllSwitchEvents();
+    public Collection<SwitchData> getAllSwitchDataEntries() {
+        return wrapped.getAllSwitchDataEntries();
     }
 
     @Override
-    public PortEvent getPortEvent(SwitchPort port) {
-        return wrapped.getPortEvent(port);
+    public PortData getPortData(SwitchPort port) {
+        return wrapped.getPortData(port);
     }
 
     @Override
-    public PortEvent getPortEvent(Dpid dpid, PortNumber portNumber) {
-        return wrapped.getPortEvent(dpid, portNumber);
+    public PortData getPortData(Dpid dpid, PortNumber portNumber) {
+        return wrapped.getPortData(dpid, portNumber);
     }
 
     @Override
-    public Collection<PortEvent> getPortEvents(Dpid dpid) {
-        return wrapped.getPortEvents(dpid);
+    public Collection<PortData> getPortDataEntries(Dpid dpid) {
+        return wrapped.getPortDataEntries(dpid);
     }
 
     @Override
-    public Collection<PortEvent> getAllPortEvents() {
-        return wrapped.getAllPortEvents();
+    public Collection<PortData> getAllPortDataEntries() {
+        return wrapped.getAllPortDataEntries();
     }
 
     @Override
-    public LinkEvent getLinkEvent(LinkTuple linkId) {
-        return wrapped.getLinkEvent(linkId);
+    public LinkData getLinkData(LinkTuple linkId) {
+        return wrapped.getLinkData(linkId);
     }
 
     @Override
-    public LinkEvent getLinkEvent(LinkTuple linkId, String type) {
-        return wrapped.getLinkEvent(linkId, type);
+    public LinkData getLinkData(LinkTuple linkId, String type) {
+        return wrapped.getLinkData(linkId, type);
     }
 
     @Override
-    public Collection<LinkEvent> getLinkEvents(LinkTuple linkId) {
-        return wrapped.getLinkEvents(linkId);
+    public Collection<LinkData> getLinkDataEntries(LinkTuple linkId) {
+        return wrapped.getLinkDataEntries(linkId);
     }
 
     @Override
-    public Collection<LinkEvent> getAllLinkEvents() {
-        return wrapped.getAllLinkEvents();
+    public Collection<LinkData> getAllLinkDataEntries() {
+        return wrapped.getAllLinkDataEntries();
     }
 
     @Override
-    public HostEvent getHostEvent(MACAddress mac) {
-        return wrapped.getHostEvent(mac);
+    public HostData getHostData(MACAddress mac) {
+        return wrapped.getHostData(mac);
     }
 
     @Override
-    public Collection<HostEvent> getAllHostEvents() {
-        return wrapped.getAllHostEvents();
+    public Collection<HostData> getAllHostDataEntries() {
+        return wrapped.getAllHostDataEntries();
     }
 
     @Override
-    public Collection<LinkEvent> getLinkEventsFrom(SwitchPort srcPort) {
-        return wrapped.getLinkEventsFrom(srcPort);
+    public Collection<LinkData> getLinkDataEntriesFrom(SwitchPort srcPort) {
+        return wrapped.getLinkDataEntriesFrom(srcPort);
     }
 
     @Override
-    public Collection<LinkEvent> getLinkEventsTo(SwitchPort dstPort) {
-        return wrapped.getLinkEventsTo(dstPort);
+    public Collection<LinkData> getLinkDataEntriesTo(SwitchPort dstPort) {
+        return wrapped.getLinkDataEntriesTo(dstPort);
     }
 
     @Override
-    public Collection<HostEvent> getHostEvents(SwitchPort port) {
-        return wrapped.getHostEvents(port);
+    public Collection<HostData> getHostDataEntries(SwitchPort port) {
+        return wrapped.getHostDataEntries(port);
     }
 
     @Override
diff --git a/src/main/java/net/onrc/onos/core/topology/ImmutableTopologySnapshot.java b/src/main/java/net/onrc/onos/core/topology/ImmutableTopologySnapshot.java
index 0539e18..20b3c48 100644
--- a/src/main/java/net/onrc/onos/core/topology/ImmutableTopologySnapshot.java
+++ b/src/main/java/net/onrc/onos/core/topology/ImmutableTopologySnapshot.java
@@ -55,16 +55,16 @@
     private final Map<Dpid, SortedSet<MastershipEvent>> mastership;
 
     // DPID -> Switch
-    private final Map<Dpid, SwitchEvent> switches;
-    private final Map<Dpid, Map<PortNumber, PortEvent>> ports;
+    private final Map<Dpid, SwitchData> switches;
+    private final Map<Dpid, Map<PortNumber, PortData>> ports;
 
     // Index from Port to Host
-    private final Multimap<SwitchPort, HostEvent> hosts;
-    private final Map<MACAddress, HostEvent> mac2Host;
+    private final Multimap<SwitchPort, HostData> hosts;
+    private final Map<MACAddress, HostData> mac2Host;
 
     // SwitchPort -> (type -> Link)
-    private final Map<SwitchPort, Map<String, LinkEvent>> outgoingLinks;
-    private final Map<SwitchPort, Map<String, LinkEvent>> incomingLinks;
+    private final Map<SwitchPort, Map<String, LinkData>> outgoingLinks;
+    private final Map<SwitchPort, Map<String, LinkData>> incomingLinks;
 
 
     // TODO Slice out Topology Builder interface.
@@ -129,23 +129,23 @@
         //          Treat as error or silently remove?
 
         /**
-         * Puts a SwitchEvent.
+         * Puts a SwitchData.
          *
          * @param sw Switch to add. (Will be frozen if not already)
          * @return Builder
          */
-        public Builder putSwitch(SwitchEvent sw) {
+        public Builder putSwitch(SwitchData sw) {
             checkNotNull(sw);
 
             current.switches.put(sw.getDpid(), sw.freeze());
             if (current.ports.get(sw.getDpid()) == null) {
-                current.ports.put(sw.getDpid(), new HashMap<PortNumber, PortEvent>());
+                current.ports.put(sw.getDpid(), new HashMap<PortNumber, PortData>());
             }
             return this;
         }
 
         /**
-         * Removes a SwitchEvent from this snapshot.
+         * Removes a SwitchData from this snapshot.
          * <p>
          * Will also remove ports, if it has not been removed already.
          *
@@ -156,7 +156,7 @@
             checkNotNull(dpid);
 
             current.switches.remove(dpid);
-            Map<PortNumber, PortEvent> removedPorts = current.ports.remove(dpid);
+            Map<PortNumber, PortData> removedPorts = current.ports.remove(dpid);
             if (removedPorts != null && !removedPorts.isEmpty()) {
                 log.warn("Some ports were removed as side-effect of #removeSwitch({})", dpid);
             }
@@ -164,17 +164,17 @@
         }
 
         /**
-         * Puts a PortEvent.
+         * Puts a PortData.
          *
          * @param port Port to add. (Will be frozen if not already)
          * @return Builder
          */
-        public Builder putPort(PortEvent port) {
+        public Builder putPort(PortData port) {
             checkNotNull(port);
 
             // TODO check parent port and throw TopologyMutationFailed
 
-            Map<PortNumber, PortEvent> portMap = current.ports.get(port.getDpid());
+            Map<PortNumber, PortData> portMap = current.ports.get(port.getDpid());
             if (portMap == null) {
                 // shouldn't happen but just to be sure
                 portMap = new HashMap<>();
@@ -185,7 +185,7 @@
         }
 
         /**
-         * Removes a PortEvent from this snapshot.
+         * Removes a PortData from this snapshot.
          *
          * @param port SwitchPort to remove
          * @return Builder
@@ -198,7 +198,7 @@
         }
 
         /**
-         * Removes a PortEvent from this snapshot.
+         * Removes a PortData from this snapshot.
          * <p>
          * Will also remove ports, if it has not been removed already.
          *
@@ -213,7 +213,7 @@
             // TODO sanity check:
             // - Links should be removed
             // - Host attachment point should be updated.
-            Map<PortNumber, PortEvent> portMap = current.ports.get(dpid);
+            Map<PortNumber, PortData> portMap = current.ports.get(dpid);
             if (portMap != null) {
                 portMap.remove(number);
             }
@@ -221,12 +221,12 @@
         }
 
         /**
-         * Puts a LinkEvent.
+         * Puts a LinkData.
          *
-         * @param link LinkEvent
+         * @param link LinkData
          * @return Builder
          */
-        public Builder putLink(LinkEvent link) {
+        public Builder putLink(LinkData link) {
             checkNotNull(link);
 
             // TODO check ports and throw TopologyMutationFailed
@@ -247,19 +247,19 @@
          * @param port {@code linkMap} key to update
          * @param link Link to add
          */
-        private void putLinkMap(Map<SwitchPort, Map<String, LinkEvent>> linkMap,
-                                SwitchPort port, LinkEvent link) {
+        private void putLinkMap(Map<SwitchPort, Map<String, LinkData>> linkMap,
+                                SwitchPort port, LinkData link) {
 
-            Map<String, LinkEvent> linksOnPort = linkMap.get(port);
+            Map<String, LinkData> linksOnPort = linkMap.get(port);
             if (linksOnPort == null) {
-                linksOnPort = new HashMap<String, LinkEvent>();
+                linksOnPort = new HashMap<String, LinkData>();
                 linkMap.put(port, linksOnPort);
             }
             linksOnPort.put(link.getType(), link);
         }
 
         /**
-         * Removes a LinkEvent from this snapshot.
+         * Removes a LinkData from this snapshot.
          *
          * @param link Link to remove
          * @param type type of link to remove
@@ -268,7 +268,7 @@
         public Builder removeLink(LinkTuple link, String type) {
             checkNotNull(link);
 
-            Map<String, LinkEvent> portLinks
+            Map<String, LinkData> portLinks
                 = current.outgoingLinks.get(link.getSrc());
             if (portLinks != null) {
                 // no conditional update here
@@ -284,7 +284,7 @@
         }
 
         /**
-         * Removes a LinkEvent from this snapshot.
+         * Removes a LinkData from this snapshot.
          *
          * @param link Link to remove
          * @return Builder
@@ -292,28 +292,28 @@
         public Builder removeLink(LinkTuple link) {
             checkNotNull(link);
 
-            Map<String, LinkEvent> links = current.outgoingLinks.get(link.getSrc());
+            Map<String, LinkData> links = current.outgoingLinks.get(link.getSrc());
             if (links == null) {
                 // nothing to do
                 return this;
             }
 
-            for (LinkEvent linkEvt : links.values()) {
-                removeLink(linkEvt.getLinkTuple(), linkEvt.getType());
+            for (LinkData linkData : links.values()) {
+                removeLink(linkData.getLinkTuple(), linkData.getType());
             }
             return this;
         }
 
         /**
-         * Puts a HostEvent.
+         * Puts a HostData.
          * <p>
-         * Removes attachment points for previous HostEvent and update
-         * them with new HostEvent
+         * Removes attachment points for previous HostData and update
+         * them with new HostData
          *
-         * @param host HostEvent
+         * @param host HostData
          * @return Builder
          */
-        public Builder putHost(HostEvent host) {
+        public Builder putHost(HostData host) {
             checkNotNull(host);
 
             // TODO check Link does not exist on port and throw TopologyMutationFailed
@@ -334,7 +334,7 @@
         }
 
         /**
-         * Removes a HostEvent from this snapshot.
+         * Removes a HostData from this snapshot.
          *
          * @param mac MACAddress of the Host to remove
          * @return Builder
@@ -342,7 +342,7 @@
         public Builder removeHost(MACAddress mac) {
             checkNotNull(mac);
 
-            HostEvent host = current.mac2Host.remove(mac);
+            HostData host = current.mac2Host.remove(mac);
             if (host != null) {
                 for (SwitchPort port : host.getAttachmentPoints()) {
                     current.hosts.remove(port, host);
@@ -438,25 +438,25 @@
 
         // shallow copy Map in Map
         this.ports = new HashMap<>(builder.current.ports.size());
-        for (Entry<Dpid, Map<PortNumber, PortEvent>> entry
+        for (Entry<Dpid, Map<PortNumber, PortData>> entry
                     : builder.current.ports.entrySet()) {
             this.ports.put(entry.getKey(), new HashMap<>(entry.getValue()));
         }
 
         this.hosts =
-                HashMultimap.<SwitchPort, HostEvent>create(builder.current.hosts);
+                HashMultimap.<SwitchPort, HostData>create(builder.current.hosts);
         this.mac2Host = new HashMap<>(builder.current.mac2Host);
 
         // shallow copy Map in Map
         this.outgoingLinks = new HashMap<>(builder.current.outgoingLinks.size());
-        for (Entry<SwitchPort, Map<String, LinkEvent>> entry
+        for (Entry<SwitchPort, Map<String, LinkData>> entry
                 : builder.current.outgoingLinks.entrySet()) {
             this.outgoingLinks.put(entry.getKey(), new HashMap<>(entry.getValue()));
         }
 
         // shallow copy Map in Map
         this.incomingLinks = new HashMap<>(builder.current.incomingLinks.size());
-        for (Entry<SwitchPort, Map<String, LinkEvent>> entry
+        for (Entry<SwitchPort, Map<String, LinkData>> entry
                 : builder.current.incomingLinks.entrySet()) {
             this.incomingLinks.put(entry.getKey(), new HashMap<>(entry.getValue()));
         }
@@ -484,25 +484,25 @@
 
         // shallow copy Map in Map
         this.ports = new HashMap<>(original.ports.size());
-        for (Entry<Dpid, Map<PortNumber, PortEvent>> entry
+        for (Entry<Dpid, Map<PortNumber, PortData>> entry
                 : original.ports.entrySet()) {
             this.ports.put(entry.getKey(), new HashMap<>(entry.getValue()));
         }
 
         this.hosts =
-                HashMultimap.<SwitchPort, HostEvent>create(original.hosts);
+                HashMultimap.<SwitchPort, HostData>create(original.hosts);
         this.mac2Host = new HashMap<>(original.mac2Host);
 
         // shallow copy Map in Map
         this.outgoingLinks = new HashMap<>(original.outgoingLinks.size());
-        for (Entry<SwitchPort, Map<String, LinkEvent>> entry
+        for (Entry<SwitchPort, Map<String, LinkData>> entry
                 : original.outgoingLinks.entrySet()) {
             this.outgoingLinks.put(entry.getKey(), new HashMap<>(entry.getValue()));
         }
 
         // shallow copy Map in Map
         this.incomingLinks = new HashMap<>(original.incomingLinks.size());
-        for (Entry<SwitchPort, Map<String, LinkEvent>> entry
+        for (Entry<SwitchPort, Map<String, LinkData>> entry
                 : original.incomingLinks.entrySet()) {
             this.incomingLinks.put(entry.getKey(), new HashMap<>(entry.getValue()));
         }
@@ -530,23 +530,23 @@
     }
 
     @Override
-    public SwitchEvent getSwitchEvent(final Dpid dpid) {
+    public SwitchData getSwitchData(final Dpid dpid) {
         return this.switches.get(dpid);
     }
 
     @Override
-    public Collection<SwitchEvent> getAllSwitchEvents() {
+    public Collection<SwitchData> getAllSwitchDataEntries() {
         return Collections.unmodifiableCollection(switches.values());
     }
 
     @Override
-    public PortEvent getPortEvent(final SwitchPort port) {
-        return getPortEvent(port.getDpid(), port.getPortNumber());
+    public PortData getPortData(final SwitchPort port) {
+        return getPortData(port.getDpid(), port.getPortNumber());
     }
 
     @Override
-    public PortEvent getPortEvent(final Dpid dpid, PortNumber portNumber) {
-        Map<PortNumber, PortEvent> portMap = this.ports.get(dpid);
+    public PortData getPortData(final Dpid dpid, PortNumber portNumber) {
+        Map<PortNumber, PortData> portMap = this.ports.get(dpid);
         if (portMap != null) {
             return portMap.get(portNumber);
         }
@@ -554,8 +554,8 @@
     }
 
     @Override
-    public Collection<PortEvent> getPortEvents(final Dpid dpid) {
-        Map<PortNumber, PortEvent> portList = ports.get(dpid);
+    public Collection<PortData> getPortDataEntries(final Dpid dpid) {
+        Map<PortNumber, PortData> portList = ports.get(dpid);
         if (portList == null) {
             return Collections.emptyList();
         }
@@ -563,17 +563,17 @@
     }
 
     @Override
-    public Collection<PortEvent> getAllPortEvents() {
-        List<PortEvent> events = new LinkedList<>();
-        for (Map<PortNumber, PortEvent> cm : ports.values()) {
-            events.addAll(cm.values());
+    public Collection<PortData> getAllPortDataEntries() {
+        List<PortData> dataEntries = new LinkedList<>();
+        for (Map<PortNumber, PortData> cm : ports.values()) {
+            dataEntries.addAll(cm.values());
         }
-        return Collections.unmodifiableCollection(events);
+        return Collections.unmodifiableCollection(dataEntries);
     }
 
     @Override
-    public LinkEvent getLinkEvent(final LinkTuple linkId) {
-        Map<String, LinkEvent> links = this.outgoingLinks.get(linkId.getSrc());
+    public LinkData getLinkData(final LinkTuple linkId) {
+        Map<String, LinkData> links = this.outgoingLinks.get(linkId.getSrc());
         if (links == null) {
             return null;
         }
@@ -581,7 +581,7 @@
         // Should we look for Packet link first?
         //  => Not needed unless invariant is broken.
 
-        for (LinkEvent link : links.values()) {
+        for (LinkData link : links.values()) {
             if (link.getDst().equals(linkId.getDst())) {
                 return link;
             }
@@ -590,12 +590,12 @@
     }
 
     @Override
-    public LinkEvent getLinkEvent(final LinkTuple linkId, final String type) {
-        Map<String, LinkEvent> links = this.outgoingLinks.get(linkId.getSrc());
+    public LinkData getLinkData(final LinkTuple linkId, final String type) {
+        Map<String, LinkData> links = this.outgoingLinks.get(linkId.getSrc());
         if (links == null) {
             return null;
         }
-        LinkEvent link = links.get(type);
+        LinkData link = links.get(type);
         if (link.getDst().equals(linkId.getDst())) {
             return link;
         }
@@ -603,8 +603,8 @@
     }
 
     @Override
-    public Collection<LinkEvent> getLinkEventsFrom(SwitchPort srcPort) {
-        Map<String, LinkEvent> links = this.outgoingLinks.get(srcPort);
+    public Collection<LinkData> getLinkDataEntriesFrom(SwitchPort srcPort) {
+        Map<String, LinkData> links = this.outgoingLinks.get(srcPort);
         if (links == null) {
             return Collections.emptyList();
         }
@@ -613,8 +613,8 @@
     }
 
     @Override
-    public Collection<LinkEvent> getLinkEventsTo(SwitchPort dstPort) {
-        Map<String, LinkEvent> links = this.incomingLinks.get(dstPort);
+    public Collection<LinkData> getLinkDataEntriesTo(SwitchPort dstPort) {
+        Map<String, LinkData> links = this.incomingLinks.get(dstPort);
         if (links == null) {
             return Collections.emptyList();
         }
@@ -623,44 +623,44 @@
     }
 
     @Override
-    public Collection<LinkEvent> getLinkEvents(final LinkTuple linkId) {
-        Map<String, LinkEvent> links = this.outgoingLinks.get(linkId.getSrc());
+    public Collection<LinkData> getLinkDataEntries(final LinkTuple linkId) {
+        Map<String, LinkData> links = this.outgoingLinks.get(linkId.getSrc());
         if (links == null) {
             return Collections.emptyList();
         }
 
-        List<LinkEvent> linkEvents = new ArrayList<>();
-        for (LinkEvent e : links.values()) {
-            if (e.getDst().equals(linkId.getDst())) {
-                linkEvents.add(e);
+        List<LinkData> linkDataEntries = new ArrayList<>();
+        for (LinkData ld : links.values()) {
+            if (ld.getDst().equals(linkId.getDst())) {
+                linkDataEntries.add(ld);
             }
         }
 
         // unless invariant is broken, this should contain at most 1 element.
-        return linkEvents;
+        return linkDataEntries;
     }
 
     @Override
-    public Collection<LinkEvent> getAllLinkEvents() {
-        List<LinkEvent> events = new LinkedList<>();
-        for (Map<String, LinkEvent> cm : outgoingLinks.values()) {
-            events.addAll(cm.values());
+    public Collection<LinkData> getAllLinkDataEntries() {
+        List<LinkData> dataEntries = new LinkedList<>();
+        for (Map<String, LinkData> cm : outgoingLinks.values()) {
+            dataEntries.addAll(cm.values());
         }
-        return Collections.unmodifiableCollection(events);
+        return Collections.unmodifiableCollection(dataEntries);
     }
 
     @Override
-    public HostEvent getHostEvent(final MACAddress mac) {
+    public HostData getHostData(final MACAddress mac) {
         return this.mac2Host.get(mac);
     }
 
     @Override
-    public Collection<HostEvent> getHostEvents(SwitchPort port) {
+    public Collection<HostData> getHostDataEntries(SwitchPort port) {
         return Collections.unmodifiableCollection(this.hosts.get(port));
     }
 
     @Override
-    public Collection<HostEvent> getAllHostEvents() {
+    public Collection<HostData> getAllHostDataEntries() {
         return Collections.unmodifiableCollection(mac2Host.values());
     }
 
diff --git a/src/main/java/net/onrc/onos/core/topology/LinkEvent.java b/src/main/java/net/onrc/onos/core/topology/LinkData.java
similarity index 81%
rename from src/main/java/net/onrc/onos/core/topology/LinkEvent.java
rename to src/main/java/net/onrc/onos/core/topology/LinkData.java
index 4296fee..59f69bd 100644
--- a/src/main/java/net/onrc/onos/core/topology/LinkEvent.java
+++ b/src/main/java/net/onrc/onos/core/topology/LinkData.java
@@ -3,7 +3,7 @@
 import java.nio.ByteBuffer;
 import java.util.Objects;
 
-import net.onrc.onos.core.topology.web.serializers.LinkEventSerializer;
+import net.onrc.onos.core.topology.web.serializers.LinkDataSerializer;
 import net.onrc.onos.core.util.Dpid;
 import net.onrc.onos.core.util.LinkTuple;
 import net.onrc.onos.core.util.PortNumber;
@@ -13,16 +13,12 @@
 import org.codehaus.jackson.map.annotate.JsonSerialize;
 
 /**
- * Self-contained Link event Object.
- * <p/>
- * TODO: Rename to match what it is. (Switch/Port/Link/Host)Snapshot?
- * FIXME: Current implementation directly use this object as
- *        Replication message, but should be sending update operation info.
+ * Self-contained Link object.
  */
 
-@JsonSerialize(using = LinkEventSerializer.class)
-public class LinkEvent extends TopologyElement<LinkEvent> {
-    public static final int LINKID_BYTES = 2 + PortEvent.PORTID_BYTES * 2;
+@JsonSerialize(using = LinkDataSerializer.class)
+public class LinkData extends TopologyElement<LinkData> {
+    public static final int LINKID_BYTES = 2 + PortData.PORTID_BYTES * 2;
 
     private final LinkTuple id;
     // TODO add LastSeenTime, Capacity if appropriate
@@ -33,7 +29,7 @@
      * Default constructor for Serializer to use.
      */
     @Deprecated
-    protected LinkEvent() {
+    protected LinkData() {
         id = null;
     }
 
@@ -42,7 +38,7 @@
      *
      * @param id the link tuple to identify the link
      */
-    public LinkEvent(LinkTuple id) {
+    public LinkData(LinkTuple id) {
         this.id = checkNotNull(id);
     }
 
@@ -52,7 +48,7 @@
      * @param src the source SwitchPort to use
      * @param dst the destination SwitchPort to use
      */
-    public LinkEvent(SwitchPort src, SwitchPort dst) {
+    public LinkData(SwitchPort src, SwitchPort dst) {
         this(new LinkTuple(src, dst));
     }
 
@@ -63,7 +59,7 @@
      *
      * @param link the Link object to use.
      */
-    public LinkEvent(Link link) {
+    public LinkData(Link link) {
         this(link.getLinkTuple());
         // FIXME losing attributes here
     }
@@ -71,11 +67,11 @@
     /**
      * Copy constructor.
      * <p>
-     * Creates an unfrozen copy of the given LinkEvent object.
+     * Creates an unfrozen copy of the given LinkData object.
      *
      * @param original the object ot make copy of
      */
-    public LinkEvent(LinkEvent original) {
+    public LinkData(LinkData original) {
         super(original);
         this.id = original.id;
     }
@@ -164,10 +160,10 @@
      */
     public static ByteBuffer getLinkID(Long srcDpid, Long srcPortNo,
                                        Long dstDpid, Long dstPortNo) {
-        return (ByteBuffer) ByteBuffer.allocate(LinkEvent.LINKID_BYTES)
+        return (ByteBuffer) ByteBuffer.allocate(LinkData.LINKID_BYTES)
                 .putChar('L')
-                .put(PortEvent.getPortID(srcDpid, srcPortNo))
-                .put(PortEvent.getPortID(dstDpid, dstPortNo)).flip();
+                .put(PortData.getPortID(srcDpid, srcPortNo))
+                .put(PortData.getPortID(dstDpid, dstPortNo)).flip();
     }
 
     @Override
@@ -201,12 +197,12 @@
             return false;
         }
 
-        LinkEvent other = (LinkEvent) o;
+        LinkData other = (LinkData) o;
         return Objects.equals(this.id, other.id);
     }
 
     @Override
     public String toString() {
-        return "[LinkEvent " + getSrc() + "->" + getDst() + "]";
+        return "[LinkData " + getSrc() + "->" + getDst() + "]";
     }
 }
diff --git a/src/main/java/net/onrc/onos/core/topology/LinkImpl.java b/src/main/java/net/onrc/onos/core/topology/LinkImpl.java
index 0fcb092..281df21 100644
--- a/src/main/java/net/onrc/onos/core/topology/LinkImpl.java
+++ b/src/main/java/net/onrc/onos/core/topology/LinkImpl.java
@@ -57,7 +57,7 @@
 
     @Override
     public Double getCapacity() {
-        return this.topology.getLinkEvent(id).getCapacity();
+        return this.topology.getLinkData(id).getCapacity();
     }
 
     /**
@@ -73,7 +73,7 @@
 
     @Override
     public String getStringAttribute(String attr) {
-        return this.topology.getLinkEvent(id).getStringAttribute(attr);
+        return this.topology.getLinkData(id).getStringAttribute(attr);
     }
 
     @Override
@@ -88,7 +88,7 @@
 
     @Override
     public Map<String, String> getAllStringAttributes() {
-        return this.topology.getLinkEvent(id).getAllStringAttributes();
+        return this.topology.getLinkData(id).getAllStringAttributes();
     }
 
     @Override
diff --git a/src/main/java/net/onrc/onos/core/topology/MastershipEvent.java b/src/main/java/net/onrc/onos/core/topology/MastershipEvent.java
index f23a9ca..d816376 100644
--- a/src/main/java/net/onrc/onos/core/topology/MastershipEvent.java
+++ b/src/main/java/net/onrc/onos/core/topology/MastershipEvent.java
@@ -16,7 +16,7 @@
 import org.codehaus.jackson.map.annotate.JsonSerialize;
 
 /**
- * Self-contained Switch Mastership event Object.
+ * Self-contained Switch Mastership event object.
  * <p/>
  * TODO: Rename to match what it is. (Switch/Port/Link/Host)Snapshot?
  * FIXME: Current implementation directly use this object as
diff --git a/src/main/java/net/onrc/onos/core/topology/PortEvent.java b/src/main/java/net/onrc/onos/core/topology/PortData.java
similarity index 79%
rename from src/main/java/net/onrc/onos/core/topology/PortEvent.java
rename to src/main/java/net/onrc/onos/core/topology/PortData.java
index 0961382..86785cd 100644
--- a/src/main/java/net/onrc/onos/core/topology/PortEvent.java
+++ b/src/main/java/net/onrc/onos/core/topology/PortData.java
@@ -1,6 +1,6 @@
 package net.onrc.onos.core.topology;
 
-import net.onrc.onos.core.topology.web.serializers.PortEventSerializer;
+import net.onrc.onos.core.topology.web.serializers.PortDataSerializer;
 import net.onrc.onos.core.util.Dpid;
 import net.onrc.onos.core.util.PortNumber;
 import net.onrc.onos.core.util.SwitchPort;
@@ -12,15 +12,11 @@
 import java.util.Objects;
 
 /**
- * Self-contained Port event Object.
- * <p/>
- * TODO: Rename to match what it is. (Switch/Port/Link/Host)Snapshot?
- * FIXME: Current implementation directly use this object as
- *        Replication message, but should be sending update operation info.
+ * Self-contained Port object.
  */
-@JsonSerialize(using = PortEventSerializer.class)
-public class PortEvent extends TopologyElement<PortEvent> {
-    public static final int PORTID_BYTES = SwitchEvent.SWITCHID_BYTES + 2 + 8;
+@JsonSerialize(using = PortDataSerializer.class)
+public class PortData extends TopologyElement<PortData> {
+    public static final int PORTID_BYTES = SwitchData.SWITCHID_BYTES + 2 + 8;
 
     private final SwitchPort id;
     // TODO Add Hardware Address
@@ -35,7 +31,7 @@
      * Default constructor for Serializer to use.
      */
     @Deprecated
-    protected PortEvent() {
+    protected PortData() {
         id = null;
     }
 
@@ -44,7 +40,7 @@
      *
      * @param switchPort the SwitchPort to identify the port
      */
-    public PortEvent(SwitchPort switchPort) {
+    public PortData(SwitchPort switchPort) {
         this.id = checkNotNull(switchPort);
     }
 
@@ -54,18 +50,18 @@
      * @param dpid the DPID of the switch the port belongs to
      * @param number the PortNumber to identify the port
      */
-    public PortEvent(Dpid dpid, PortNumber number) {
+    public PortData(Dpid dpid, PortNumber number) {
         this.id = new SwitchPort(dpid, number);
     }
 
     /**
      * Copy constructor.
      * <p>
-     * Creates an unfrozen copy of the given PortEvent object.
+     * Creates an unfrozen copy of the given PortData object.
      *
      * @param original the object to make copy of
      */
-    public PortEvent(PortEvent original) {
+    public PortData(PortData original) {
         super(original);
         this.id = original.id;
     }
@@ -127,7 +123,7 @@
         if (number == null) {
             throw new IllegalArgumentException("number cannot be null");
         }
-        return (ByteBuffer) ByteBuffer.allocate(PortEvent.PORTID_BYTES)
+        return (ByteBuffer) ByteBuffer.allocate(PortData.PORTID_BYTES)
                 .putChar('S').putLong(dpid)
                 .putChar('P').putLong(number).flip();
     }
@@ -162,12 +158,12 @@
             return false;
         }
 
-        PortEvent other = (PortEvent) o;
+        PortData other = (PortData) o;
         return Objects.equals(this.id, other.id);
     }
 
     @Override
     public String toString() {
-        return "[PortEvent " + getDpid() + "@" + getPortNumber() + "]";
+        return "[PortData " + getDpid() + "@" + getPortNumber() + "]";
     }
 }
diff --git a/src/main/java/net/onrc/onos/core/topology/PortImpl.java b/src/main/java/net/onrc/onos/core/topology/PortImpl.java
index d957809..8b8f966 100644
--- a/src/main/java/net/onrc/onos/core/topology/PortImpl.java
+++ b/src/main/java/net/onrc/onos/core/topology/PortImpl.java
@@ -60,7 +60,7 @@
 
     @Override
     public String getDescription() {
-        return getStringAttribute(PortEvent.DESCRIPTION, "");
+        return getStringAttribute(PortData.DESCRIPTION, "");
     }
 
     @Override
@@ -124,7 +124,7 @@
 
     @Override
     public String getStringAttribute(String attr) {
-        return this.topology.getPortEvent(id).getStringAttribute(attr);
+        return this.topology.getPortData(id).getStringAttribute(attr);
     }
 
     @Override
@@ -139,7 +139,7 @@
 
     @Override
     public Map<String, String> getAllStringAttributes() {
-        return this.topology.getPortEvent(id).getAllStringAttributes();
+        return this.topology.getPortData(id).getAllStringAttributes();
     }
 
     @Override
diff --git a/src/main/java/net/onrc/onos/core/topology/SwitchEvent.java b/src/main/java/net/onrc/onos/core/topology/SwitchData.java
similarity index 75%
rename from src/main/java/net/onrc/onos/core/topology/SwitchEvent.java
rename to src/main/java/net/onrc/onos/core/topology/SwitchData.java
index f89005d..46598c0 100644
--- a/src/main/java/net/onrc/onos/core/topology/SwitchEvent.java
+++ b/src/main/java/net/onrc/onos/core/topology/SwitchData.java
@@ -1,6 +1,6 @@
 package net.onrc.onos.core.topology;
 
-import net.onrc.onos.core.topology.web.serializers.SwitchEventSerializer;
+import net.onrc.onos.core.topology.web.serializers.SwitchDataSerializer;
 import net.onrc.onos.core.util.Dpid;
 
 import java.nio.ByteBuffer;
@@ -10,14 +10,10 @@
 import org.codehaus.jackson.map.annotate.JsonSerialize;
 
 /**
- * Self-contained Switch Object.
- * <p/>
- * TODO: Rename to match what it is. (Switch/Port/Link/Host)Snapshot?
- * FIXME: Current implementation directly use this object as
- *        Replication message, but should be sending update operation info.
+ * Self-contained Switch object.
  */
-@JsonSerialize(using = SwitchEventSerializer.class)
-public class SwitchEvent extends TopologyElement<SwitchEvent> {
+@JsonSerialize(using = SwitchDataSerializer.class)
+public class SwitchData extends TopologyElement<SwitchData> {
     public static final int SWITCHID_BYTES = 2 + 8;
 
     private final Dpid dpid;
@@ -26,7 +22,7 @@
      * Default constructor for Serializer to use.
      */
     @Deprecated
-    protected SwitchEvent() {
+    protected SwitchData() {
         dpid = null;
     }
 
@@ -35,18 +31,18 @@
      *
      * @param dpid the switch DPID to identify the switch
      */
-    public SwitchEvent(Dpid dpid) {
+    public SwitchData(Dpid dpid) {
         this.dpid = checkNotNull(dpid);
     }
 
     /**
      * Copy constructor.
      * <p>
-     * Creates an unfrozen copy of the given SwitchEvent object.
+     * Creates an unfrozen copy of the given SwitchData object.
      *
      * @param original the object to make copy of
      */
-    public SwitchEvent(SwitchEvent original) {
+    public SwitchData(SwitchData original) {
         super(original);
         this.dpid = original.dpid;
     }
@@ -83,7 +79,7 @@
         if (dpid == null) {
             throw new IllegalArgumentException("dpid cannot be null");
         }
-        return (ByteBuffer) ByteBuffer.allocate(SwitchEvent.SWITCHID_BYTES)
+        return (ByteBuffer) ByteBuffer.allocate(SwitchData.SWITCHID_BYTES)
                 .putChar('S').putLong(dpid).flip();
     }
 
@@ -117,12 +113,12 @@
             return false;
         }
 
-        SwitchEvent other = (SwitchEvent) o;
+        SwitchData other = (SwitchData) o;
         return Objects.equals(this.dpid, other.dpid);
     }
 
     @Override
     public String toString() {
-        return "[SwitchEvent " + dpid + "]";
+        return "[SwitchData " + dpid + "]";
     }
 }
diff --git a/src/main/java/net/onrc/onos/core/topology/SwitchImpl.java b/src/main/java/net/onrc/onos/core/topology/SwitchImpl.java
index 6d4e27a..27fcbce 100644
--- a/src/main/java/net/onrc/onos/core/topology/SwitchImpl.java
+++ b/src/main/java/net/onrc/onos/core/topology/SwitchImpl.java
@@ -122,7 +122,7 @@
 
     @Override
     public String getStringAttribute(String attr) {
-        return this.topology.getSwitchEvent(getDpid()).getStringAttribute(attr);
+        return this.topology.getSwitchData(getDpid()).getStringAttribute(attr);
     }
 
     @Override
@@ -137,7 +137,7 @@
 
     @Override
     public Map<String, String> getAllStringAttributes() {
-        return this.topology.getSwitchEvent(getDpid()).getAllStringAttributes();
+        return this.topology.getSwitchData(getDpid()).getAllStringAttributes();
     }
 
     @Override
diff --git a/src/main/java/net/onrc/onos/core/topology/TopologyDatastore.java b/src/main/java/net/onrc/onos/core/topology/TopologyDatastore.java
index 815958f..deef13a 100644
--- a/src/main/java/net/onrc/onos/core/topology/TopologyDatastore.java
+++ b/src/main/java/net/onrc/onos/core/topology/TopologyDatastore.java
@@ -28,11 +28,11 @@
      * Add a switch to the database.
      *
      * @param sw         the switch to add.
-     * @param portEvents the corresponding switch ports to add.
+     * @param portDataEntries the corresponding switch ports to add.
      * @return true on success, otherwise false.
      */
-    public boolean addSwitch(SwitchEvent sw,
-                             Collection<PortEvent> portEvents) {
+    public boolean addSwitch(SwitchData sw,
+                             Collection<PortData> portDataEntries) {
         log.debug("Adding switch {}", sw);
         ArrayList<WriteOp> groupOp = new ArrayList<>();
 
@@ -46,8 +46,8 @@
         // to assure that DPID is unique cluster-wide, etc.
         groupOp.add(rcSwitch.forceCreateOp(client));
 
-        for (PortEvent portEvent : portEvents) {
-            KVPort rcPort = new KVPort(sw.getDpid(), portEvent.getPortNumber());
+        for (PortData portData : portDataEntries) {
+            KVPort rcPort = new KVPort(sw.getDpid(), portData.getPortNumber());
             rcPort.setStatus(KVPort.STATUS.ACTIVE);
 
             groupOp.add(rcPort.forceCreateOp(client));
@@ -71,11 +71,11 @@
      * Update a switch as inactive in the database.
      *
      * @param sw         the switch to update.
-     * @param portEvents the corresponding switch ports to update.
+     * @param portDataEntries the corresponding switch ports to update.
      * @return true on success, otherwise false.
      */
-    public boolean deactivateSwitch(SwitchEvent sw,
-                                    Collection<PortEvent> portEvents) {
+    public boolean deactivateSwitch(SwitchData sw,
+                                    Collection<PortData> portDataEntries) {
         log.debug("Deactivating switch {}", sw);
         KVSwitch rcSwitch = new KVSwitch(sw.getDpid());
 
@@ -86,8 +86,8 @@
 
         groupOp.add(rcSwitch.forceCreateOp(client));
 
-        for (PortEvent portEvent : portEvents) {
-            KVPort rcPort = new KVPort(sw.getDpid(), portEvent.getPortNumber());
+        for (PortData portData : portDataEntries) {
+            KVPort rcPort = new KVPort(sw.getDpid(), portData.getPortNumber());
             rcPort.setStatus(KVPort.STATUS.INACTIVE);
 
             groupOp.add(rcPort.forceCreateOp(client));
@@ -104,7 +104,7 @@
      * @param port the port to add.
      * @return true on success, otherwise false.
      */
-    public boolean addPort(PortEvent port) {
+    public boolean addPort(PortData port) {
         log.debug("Adding port {}", port);
 
         KVPort rcPort = new KVPort(port.getDpid(), port.getPortNumber());
@@ -122,7 +122,7 @@
      * @param port the port to update.
      * @return true on success, otherwise false.
      */
-    public boolean deactivatePort(PortEvent port) {
+    public boolean deactivatePort(PortData port) {
         log.debug("Deactivating port {}", port);
 
         KVPort rcPort = new KVPort(port.getDpid(), port.getPortNumber());
@@ -139,7 +139,7 @@
      * @param link the link to add.
      * @return true on success, otherwise false.
      */
-    public boolean addLink(LinkEvent link) {
+    public boolean addLink(LinkData link) {
         log.debug("Adding link {}", link);
 
         KVLink rcLink = new KVLink(link.getSrc().getDpid(),
@@ -158,11 +158,11 @@
         return true;                    // Success
     }
 
-    public boolean removeLink(LinkEvent linkEvent) {
-        log.debug("Removing link {}", linkEvent);
+    public boolean removeLink(LinkData linkData) {
+        log.debug("Removing link {}", linkData);
 
-        KVLink rcLink = new KVLink(linkEvent.getSrc().getDpid(), linkEvent.getSrc().getPortNumber(),
-                linkEvent.getDst().getDpid(), linkEvent.getDst().getPortNumber());
+        KVLink rcLink = new KVLink(linkData.getSrc().getDpid(), linkData.getSrc().getPortNumber(),
+                linkData.getDst().getDpid(), linkData.getDst().getPortNumber());
         rcLink.forceDelete();
 
         return true;
@@ -174,7 +174,7 @@
      * @param device the device to add.
      * @return true on success, otherwise false.
      */
-    public boolean addHost(HostEvent device) {
+    public boolean addHost(HostData device) {
         log.debug("Adding host into DB. mac {}", device.getMac());
 
         KVDevice rcDevice = new KVDevice(device.getMac().toBytes());
@@ -195,7 +195,7 @@
      * @param device the device to remove.
      * @return true on success, otherwise false.
      */
-    public boolean removeHost(HostEvent device) {
+    public boolean removeHost(HostData device) {
         log.debug("Removing host into DB. mac {}", device.getMac());
 
         KVDevice rcDevice = new KVDevice(device.getMac().toBytes());
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 c86bcc6..2c805e8 100644
--- a/src/main/java/net/onrc/onos/core/topology/TopologyEvent.java
+++ b/src/main/java/net/onrc/onos/core/topology/TopologyEvent.java
@@ -72,48 +72,48 @@
     /**
      * Constructor for given Switch event.
      *
-     * @param switchEvent the Switch event to use.
+     * @param switchData the Switch event to use.
      * @param onosInstanceId the ONOS Instance ID that originates the event.
      */
-    TopologyEvent(SwitchEvent switchEvent, OnosInstanceId onosInstanceId) {
+    TopologyEvent(SwitchData switchData, OnosInstanceId onosInstanceId) {
         this.eventType = Type.SWITCH;
-        this.event = checkNotNull(switchEvent);
+        this.event = checkNotNull(switchData);
         this.onosInstanceId = checkNotNull(onosInstanceId);
     }
 
     /**
      * Constructor for given Port event.
      *
-     * @param portEvent the Port event to use.
+     * @param portData the Port event to use.
      * @param onosInstanceId the ONOS Instance ID that originates the event.
      */
-    TopologyEvent(PortEvent portEvent, OnosInstanceId onosInstanceId) {
+    TopologyEvent(PortData portData, OnosInstanceId onosInstanceId) {
         this.eventType = Type.PORT;
-        this.event = checkNotNull(portEvent);
+        this.event = checkNotNull(portData);
         this.onosInstanceId = checkNotNull(onosInstanceId);
     }
 
     /**
      * Constructor for given Link event.
      *
-     * @param linkEvent the Link event to use.
+     * @param linkData the Link event to use.
      * @param onosInstanceId the ONOS Instance ID that originates the event.
      */
-    TopologyEvent(LinkEvent linkEvent, OnosInstanceId onosInstanceId) {
+    TopologyEvent(LinkData linkData, OnosInstanceId onosInstanceId) {
         this.eventType = Type.LINK;
-        this.event = checkNotNull(linkEvent);
+        this.event = checkNotNull(linkData);
         this.onosInstanceId = checkNotNull(onosInstanceId);
     }
 
     /**
      * Constructor for given Host event.
      *
-     * @param hostEvent the Host event to use.
+     * @param hostData the Host event to use.
      * @param onosInstanceId the ONOS Instance ID that originates the event.
      */
-    TopologyEvent(HostEvent hostEvent, OnosInstanceId onosInstanceId) {
+    TopologyEvent(HostData hostData, OnosInstanceId onosInstanceId) {
         this.eventType = Type.HOST;
-        this.event = checkNotNull(hostEvent);
+        this.event = checkNotNull(hostData);
         this.onosInstanceId = checkNotNull(onosInstanceId);
     }
 
@@ -144,12 +144,12 @@
      *
      * @return the Switch event.
      */
-    public SwitchEvent getSwitchEvent() {
+    public SwitchData getSwitchData() {
         if (eventType != Type.SWITCH) {
             return null;
         }
-        SwitchEvent switchEvent = (SwitchEvent) event;
-        return switchEvent;
+        SwitchData switchData = (SwitchData) event;
+        return switchData;
     }
 
     /**
@@ -157,12 +157,12 @@
      *
      * @return the Port event.
      */
-    public PortEvent getPortEvent() {
+    public PortData getPortData() {
         if (eventType != Type.PORT) {
             return null;
         }
-        PortEvent portEvent = (PortEvent) event;
-        return portEvent;
+        PortData portData = (PortData) event;
+        return portData;
     }
 
     /**
@@ -170,12 +170,12 @@
      *
      * @return the Link event.
      */
-    public LinkEvent getLinkEvent() {
+    public LinkData getLinkData() {
         if (eventType != Type.LINK) {
             return null;
         }
-        LinkEvent linkEvent = (LinkEvent) event;
-        return linkEvent;
+        LinkData linkData = (LinkData) event;
+        return linkData;
     }
 
     /**
@@ -183,12 +183,12 @@
      *
      * @return the Host event.
      */
-    public HostEvent getHostEvent() {
+    public HostData getHostData() {
         if (eventType != Type.HOST) {
             return null;
         }
-        HostEvent hostEvent = (HostEvent) event;
-        return hostEvent;
+        HostData hostData = (HostData) event;
+        return hostData;
     }
 
     /**
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 90f7315..a843fb5 100644
--- a/src/main/java/net/onrc/onos/core/topology/TopologyEventPreprocessor.java
+++ b/src/main/java/net/onrc/onos/core/topology/TopologyEventPreprocessor.java
@@ -339,8 +339,8 @@
      * <p/>
      * The result events can be applied to the Topology in the following
      * order: REMOVE events followed by ADD events. The ADD events are in the
-     * natural order to build a Topology: MastershipEvent, SwitchEvent,
-     * PortEvent, LinkEvent, HostEvent. The REMOVE events are in the reverse
+     * natural order to build a Topology: MastershipEvent, SwitchData,
+     * PortData, LinkData, HostData. The REMOVE events are in the reverse
      * order.
      *
      * @param events the events to classify and reorder.
@@ -353,21 +353,21 @@
             new HashMap<>();
         Map<ByteBuffer, EventEntry<TopologyEvent>> removedMastershipEvents =
             new HashMap<>();
-        Map<ByteBuffer, EventEntry<TopologyEvent>> addedSwitchEvents =
+        Map<ByteBuffer, EventEntry<TopologyEvent>> addedSwitchDataEntries =
             new HashMap<>();
-        Map<ByteBuffer, EventEntry<TopologyEvent>> removedSwitchEvents =
+        Map<ByteBuffer, EventEntry<TopologyEvent>> removedSwitchDataEntries =
             new HashMap<>();
-        Map<ByteBuffer, EventEntry<TopologyEvent>> addedPortEvents =
+        Map<ByteBuffer, EventEntry<TopologyEvent>> addedPortDataEntries =
             new HashMap<>();
-        Map<ByteBuffer, EventEntry<TopologyEvent>> removedPortEvents =
+        Map<ByteBuffer, EventEntry<TopologyEvent>> removedPortDataEntries =
             new HashMap<>();
-        Map<ByteBuffer, EventEntry<TopologyEvent>> addedLinkEvents =
+        Map<ByteBuffer, EventEntry<TopologyEvent>> addedLinkDataEntries =
             new HashMap<>();
-        Map<ByteBuffer, EventEntry<TopologyEvent>> removedLinkEvents =
+        Map<ByteBuffer, EventEntry<TopologyEvent>> removedLinkDataEntries =
             new HashMap<>();
-        Map<ByteBuffer, EventEntry<TopologyEvent>> addedHostEvents =
+        Map<ByteBuffer, EventEntry<TopologyEvent>> addedHostDataEntries =
             new HashMap<>();
-        Map<ByteBuffer, EventEntry<TopologyEvent>> removedHostEvents =
+        Map<ByteBuffer, EventEntry<TopologyEvent>> removedHostDataEntries =
             new HashMap<>();
 
         //
@@ -383,10 +383,10 @@
             // Get the event itself
             MastershipEvent mastershipEvent =
                 topologyEvent.getMastershipEvent();
-            SwitchEvent switchEvent = topologyEvent.getSwitchEvent();
-            PortEvent portEvent = topologyEvent.getPortEvent();
-            LinkEvent linkEvent = topologyEvent.getLinkEvent();
-            HostEvent hostEvent = topologyEvent.getHostEvent();
+            SwitchData switchData = topologyEvent.getSwitchData();
+            PortData portData = topologyEvent.getPortData();
+            LinkData linkData = topologyEvent.getLinkData();
+            HostData hostData = topologyEvent.getHostData();
 
             //
             // Extract the events
@@ -398,25 +398,25 @@
                     addedMastershipEvents.put(id, event);
                     removedMastershipEvents.remove(id);
                 }
-                if (switchEvent != null) {
-                    ByteBuffer id = switchEvent.getIDasByteBuffer();
-                    addedSwitchEvents.put(id, event);
-                    removedSwitchEvents.remove(id);
+                if (switchData != null) {
+                    ByteBuffer id = switchData.getIDasByteBuffer();
+                    addedSwitchDataEntries.put(id, event);
+                    removedSwitchDataEntries.remove(id);
                 }
-                if (portEvent != null) {
-                    ByteBuffer id = portEvent.getIDasByteBuffer();
-                    addedPortEvents.put(id, event);
-                    removedPortEvents.remove(id);
+                if (portData != null) {
+                    ByteBuffer id = portData.getIDasByteBuffer();
+                    addedPortDataEntries.put(id, event);
+                    removedPortDataEntries.remove(id);
                 }
-                if (linkEvent != null) {
-                    ByteBuffer id = linkEvent.getIDasByteBuffer();
-                    addedLinkEvents.put(id, event);
-                    removedLinkEvents.remove(id);
+                if (linkData != null) {
+                    ByteBuffer id = linkData.getIDasByteBuffer();
+                    addedLinkDataEntries.put(id, event);
+                    removedLinkDataEntries.remove(id);
                 }
-                if (hostEvent != null) {
-                    ByteBuffer id = hostEvent.getIDasByteBuffer();
-                    addedHostEvents.put(id, event);
-                    removedHostEvents.remove(id);
+                if (hostData != null) {
+                    ByteBuffer id = hostData.getIDasByteBuffer();
+                    addedHostDataEntries.put(id, event);
+                    removedHostDataEntries.remove(id);
                 }
                 break;
             case ENTRY_REMOVE:
@@ -425,25 +425,25 @@
                     addedMastershipEvents.remove(id);
                     removedMastershipEvents.put(id, event);
                 }
-                if (switchEvent != null) {
-                    ByteBuffer id = switchEvent.getIDasByteBuffer();
-                    addedSwitchEvents.remove(id);
-                    removedSwitchEvents.put(id, event);
+                if (switchData != null) {
+                    ByteBuffer id = switchData.getIDasByteBuffer();
+                    addedSwitchDataEntries.remove(id);
+                    removedSwitchDataEntries.put(id, event);
                 }
-                if (portEvent != null) {
-                    ByteBuffer id = portEvent.getIDasByteBuffer();
-                    addedPortEvents.remove(id);
-                    removedPortEvents.put(id, event);
+                if (portData != null) {
+                    ByteBuffer id = portData.getIDasByteBuffer();
+                    addedPortDataEntries.remove(id);
+                    removedPortDataEntries.put(id, event);
                 }
-                if (linkEvent != null) {
-                    ByteBuffer id = linkEvent.getIDasByteBuffer();
-                    addedLinkEvents.remove(id);
-                    removedLinkEvents.put(id, event);
+                if (linkData != null) {
+                    ByteBuffer id = linkData.getIDasByteBuffer();
+                    addedLinkDataEntries.remove(id);
+                    removedLinkDataEntries.put(id, event);
                 }
-                if (hostEvent != null) {
-                    ByteBuffer id = hostEvent.getIDasByteBuffer();
-                    addedHostEvents.remove(id);
-                    removedHostEvents.put(id, event);
+                if (hostData != null) {
+                    ByteBuffer id = hostData.getIDasByteBuffer();
+                    addedHostDataEntries.remove(id);
+                    removedHostDataEntries.put(id, event);
                 }
                 break;
             default:
@@ -459,17 +459,17 @@
         //    Host
         //
         List<EventEntry<TopologyEvent>> result = new LinkedList<>();
-        result.addAll(removedHostEvents.values());
-        result.addAll(removedLinkEvents.values());
-        result.addAll(removedPortEvents.values());
-        result.addAll(removedSwitchEvents.values());
+        result.addAll(removedHostDataEntries.values());
+        result.addAll(removedLinkDataEntries.values());
+        result.addAll(removedPortDataEntries.values());
+        result.addAll(removedSwitchDataEntries.values());
         result.addAll(removedMastershipEvents.values());
         //
         result.addAll(addedMastershipEvents.values());
-        result.addAll(addedSwitchEvents.values());
-        result.addAll(addedPortEvents.values());
-        result.addAll(addedLinkEvents.values());
-        result.addAll(addedHostEvents.values());
+        result.addAll(addedSwitchDataEntries.values());
+        result.addAll(addedPortDataEntries.values());
+        result.addAll(addedLinkDataEntries.values());
+        result.addAll(addedHostDataEntries.values());
 
         return result;
     }
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 b69a409..9bb9184 100644
--- a/src/main/java/net/onrc/onos/core/topology/TopologyEvents.java
+++ b/src/main/java/net/onrc/onos/core/topology/TopologyEvents.java
@@ -16,12 +16,12 @@
  * (a) Process "removed" events before "added" events.
  * <p/>
  * (b) The processing order of the "removed" events should be:
- * removedHostEvents, removedLinkEvents, removedPortEvents,
- * removedSwitchEvents, removedMastershipEvents
+ * removedHostDataEntries, removedLinkDataEntries, removedPortDataEntries,
+ * removedSwitchDataEntries, removedMastershipEvents
  * <p/>
  * (c) The processing order of the "added" events should be:
- * addedMastershipEvents, addedSwitchEvents, addedPortEvents, addedLinkEvents,
- * addedHostEvents
+ * addedMastershipEvents, addedSwitchDataEntries, addedPortDataEntries,
+ * addedLinkDataEntries, addedHostDataEntries
  * <p/>
  * The above ordering guarantees that removing a port for example
  * will be processed before the corresponding switch itself is
@@ -34,14 +34,14 @@
 public final class TopologyEvents {
     private final ImmutableList<MastershipEvent> addedMastershipEvents;
     private final ImmutableList<MastershipEvent> removedMastershipEvents;
-    private final ImmutableList<SwitchEvent> addedSwitchEvents;
-    private final ImmutableList<SwitchEvent> removedSwitchEvents;
-    private final ImmutableList<PortEvent> addedPortEvents;
-    private final ImmutableList<PortEvent> removedPortEvents;
-    private final ImmutableList<LinkEvent> addedLinkEvents;
-    private final ImmutableList<LinkEvent> removedLinkEvents;
-    private final ImmutableList<HostEvent> addedHostEvents;
-    private final ImmutableList<HostEvent> removedHostEvents;
+    private final ImmutableList<SwitchData> addedSwitchDataEntries;
+    private final ImmutableList<SwitchData> removedSwitchDataEntries;
+    private final ImmutableList<PortData> addedPortDataEntries;
+    private final ImmutableList<PortData> removedPortDataEntries;
+    private final ImmutableList<LinkData> addedLinkDataEntries;
+    private final ImmutableList<LinkData> removedLinkDataEntries;
+    private final ImmutableList<HostData> addedHostDataEntries;
+    private final ImmutableList<HostData> removedHostDataEntries;
 
     /**
      * Constructor for added and removed events.
@@ -49,78 +49,83 @@
      * @param addedMastershipEvents the collection of added 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.
-     * @param removedPortEvents the collection of removed Port Events.
-     * @param addedLinkEvents the collection of added Link Events.
-     * @param removedLinkEvents the collection of removed Link Events.
-     * @param addedHostEvents the collection of added Host Events.
-     * @param removedHostEvents the collection of removed Host Events.
+     * @param addedSwitchDataEntries the collection of added Switch Data
+     * Entries.
+     * @param removedSwitchDataEntries the collection of removed Switch Data
+     * Entries.
+     * @param addedPortDataEntries the collection of added Port Data Entries.
+     * @param removedPortDataEntries the collection of removed Port Data
+     * Entries.
+     * @param addedLinkDataEntries the collection of added Link Data Entries.
+     * @param removedLinkDataEntries the collection of removed Link Data
+     * Entries.
+     * @param addedHostDataEntries the collection of added Host Data Entries.
+     * @param removedHostDataEntries the collection of removed Host Data
+     * Entries.
      */
     public TopologyEvents(Collection<MastershipEvent> addedMastershipEvents,
                           Collection<MastershipEvent> removedMastershipEvents,
-                          Collection<SwitchEvent> addedSwitchEvents,
-                          Collection<SwitchEvent> removedSwitchEvents,
-                          Collection<PortEvent> addedPortEvents,
-                          Collection<PortEvent> removedPortEvents,
-                          Collection<LinkEvent> addedLinkEvents,
-                          Collection<LinkEvent> removedLinkEvents,
-                          Collection<HostEvent> addedHostEvents,
-                          Collection<HostEvent> removedHostEvents) {
+                          Collection<SwitchData> addedSwitchDataEntries,
+                          Collection<SwitchData> removedSwitchDataEntries,
+                          Collection<PortData> addedPortDataEntries,
+                          Collection<PortData> removedPortDataEntries,
+                          Collection<LinkData> addedLinkDataEntries,
+                          Collection<LinkData> removedLinkDataEntries,
+                          Collection<HostData> addedHostDataEntries,
+                          Collection<HostData> removedHostDataEntries) {
         this.addedMastershipEvents = ImmutableList.<MastershipEvent>copyOf(
                         checkNotNull(addedMastershipEvents));
         this.removedMastershipEvents = ImmutableList.<MastershipEvent>copyOf(
                         checkNotNull(removedMastershipEvents));
-        this.addedSwitchEvents = ImmutableList.<SwitchEvent>copyOf(
-                        checkNotNull(addedSwitchEvents));
-        this.removedSwitchEvents = ImmutableList.<SwitchEvent>copyOf(
-                        checkNotNull(removedSwitchEvents));
-        this.addedPortEvents = ImmutableList.<PortEvent>copyOf(
-                        checkNotNull(addedPortEvents));
-        this.removedPortEvents = ImmutableList.<PortEvent>copyOf(
-                        checkNotNull(removedPortEvents));
-        this.addedLinkEvents = ImmutableList.<LinkEvent>copyOf(
-                        checkNotNull(addedLinkEvents));
-        this.removedLinkEvents = ImmutableList.<LinkEvent>copyOf(
-                        checkNotNull(removedLinkEvents));
-        this.addedHostEvents = ImmutableList.<HostEvent>copyOf(
-                        checkNotNull(addedHostEvents));
-        this.removedHostEvents = ImmutableList.<HostEvent>copyOf(
-                        checkNotNull(removedHostEvents));
+        this.addedSwitchDataEntries = ImmutableList.<SwitchData>copyOf(
+                        checkNotNull(addedSwitchDataEntries));
+        this.removedSwitchDataEntries = ImmutableList.<SwitchData>copyOf(
+                        checkNotNull(removedSwitchDataEntries));
+        this.addedPortDataEntries = ImmutableList.<PortData>copyOf(
+                        checkNotNull(addedPortDataEntries));
+        this.removedPortDataEntries = ImmutableList.<PortData>copyOf(
+                        checkNotNull(removedPortDataEntries));
+        this.addedLinkDataEntries = ImmutableList.<LinkData>copyOf(
+                        checkNotNull(addedLinkDataEntries));
+        this.removedLinkDataEntries = ImmutableList.<LinkData>copyOf(
+                        checkNotNull(removedLinkDataEntries));
+        this.addedHostDataEntries = ImmutableList.<HostData>copyOf(
+                        checkNotNull(addedHostDataEntries));
+        this.removedHostDataEntries = ImmutableList.<HostData>copyOf(
+                        checkNotNull(removedHostDataEntries));
     }
 
     /**
      * 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.
+     * @param addedSwitchDataEntries the collection of added Switch Events.
+     * @param addedPortDataEntries the collection of added Port Events.
+     * @param addedLinkDataEntries the collection of added Link Events.
+     * @param addedHostDataEntries the collection of added Host Events.
      */
     public TopologyEvents(Collection<MastershipEvent> addedMastershipEvents,
-                          Collection<SwitchEvent> addedSwitchEvents,
-                          Collection<PortEvent> addedPortEvents,
-                          Collection<LinkEvent> addedLinkEvents,
-                          Collection<HostEvent> addedHostEvents) {
+                          Collection<SwitchData> addedSwitchDataEntries,
+                          Collection<PortData> addedPortDataEntries,
+                          Collection<LinkData> addedLinkDataEntries,
+                          Collection<HostData> addedHostDataEntries) {
         this.addedMastershipEvents = ImmutableList.<MastershipEvent>copyOf(
                         checkNotNull(addedMastershipEvents));
-        this.addedSwitchEvents = ImmutableList.<SwitchEvent>copyOf(
-                        checkNotNull(addedSwitchEvents));
-        this.addedPortEvents = ImmutableList.<PortEvent>copyOf(
-                        checkNotNull(addedPortEvents));
-        this.addedLinkEvents = ImmutableList.<LinkEvent>copyOf(
-                        checkNotNull(addedLinkEvents));
-        this.addedHostEvents = ImmutableList.<HostEvent>copyOf(
-                        checkNotNull(addedHostEvents));
+        this.addedSwitchDataEntries = ImmutableList.<SwitchData>copyOf(
+                        checkNotNull(addedSwitchDataEntries));
+        this.addedPortDataEntries = ImmutableList.<PortData>copyOf(
+                        checkNotNull(addedPortDataEntries));
+        this.addedLinkDataEntries = ImmutableList.<LinkData>copyOf(
+                        checkNotNull(addedLinkDataEntries));
+        this.addedHostDataEntries = ImmutableList.<HostData>copyOf(
+                        checkNotNull(addedHostDataEntries));
 
         // Assign empty lists to the removed events
         this.removedMastershipEvents = ImmutableList.<MastershipEvent>of();
-        this.removedSwitchEvents = ImmutableList.<SwitchEvent>of();
-        this.removedPortEvents = ImmutableList.<PortEvent>of();
-        this.removedLinkEvents = ImmutableList.<LinkEvent>of();
-        this.removedHostEvents = ImmutableList.<HostEvent>of();
+        this.removedSwitchDataEntries = ImmutableList.<SwitchData>of();
+        this.removedPortDataEntries = ImmutableList.<PortData>of();
+        this.removedLinkDataEntries = ImmutableList.<LinkData>of();
+        this.removedHostDataEntries = ImmutableList.<HostData>of();
     }
 
     /**
@@ -146,8 +151,8 @@
      *
      * @return the immutable collection of added Switch Events.
      */
-    public Collection<SwitchEvent> getAddedSwitchEvents() {
-        return addedSwitchEvents;
+    public Collection<SwitchData> getAddedSwitchDataEntries() {
+        return addedSwitchDataEntries;
     }
 
     /**
@@ -155,8 +160,8 @@
      *
      * @return the immutable collection of removed Switch Events.
      */
-    public Collection<SwitchEvent> getRemovedSwitchEvents() {
-        return removedSwitchEvents;
+    public Collection<SwitchData> getRemovedSwitchDataEntries() {
+        return removedSwitchDataEntries;
     }
 
     /**
@@ -164,8 +169,8 @@
      *
      * @return the immutable collection of added Port Events.
      */
-    public Collection<PortEvent> getAddedPortEvents() {
-        return addedPortEvents;
+    public Collection<PortData> getAddedPortDataEntries() {
+        return addedPortDataEntries;
     }
 
     /**
@@ -173,8 +178,8 @@
      *
      * @return the immutable collection of removed Port Events.
      */
-    public Collection<PortEvent> getRemovedPortEvents() {
-        return removedPortEvents;
+    public Collection<PortData> getRemovedPortDataEntries() {
+        return removedPortDataEntries;
     }
 
     /**
@@ -182,8 +187,8 @@
      *
      * @return the immutable collection of added Link Events.
      */
-    public Collection<LinkEvent> getAddedLinkEvents() {
-        return addedLinkEvents;
+    public Collection<LinkData> getAddedLinkDataEntries() {
+        return addedLinkDataEntries;
     }
 
     /**
@@ -191,8 +196,8 @@
      *
      * @return the immutable collection of removed Link Events.
      */
-    public Collection<LinkEvent> getRemovedLinkEvents() {
-        return removedLinkEvents;
+    public Collection<LinkData> getRemovedLinkDataEntries() {
+        return removedLinkDataEntries;
     }
 
     /**
@@ -200,8 +205,8 @@
      *
      * @return the immutable collection of added Host Events.
      */
-    public Collection<HostEvent> getAddedHostEvents() {
-        return addedHostEvents;
+    public Collection<HostData> getAddedHostDataEntries() {
+        return addedHostDataEntries;
     }
 
     /**
@@ -209,7 +214,7 @@
      *
      * @return the immutable collection of removed Host Events.
      */
-    public Collection<HostEvent> getRemovedHostEvents() {
-        return removedHostEvents;
+    public Collection<HostData> getRemovedHostDataEntries() {
+        return removedHostDataEntries;
     }
 }
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 cc1cc9f..c27a247 100644
--- a/src/main/java/net/onrc/onos/core/topology/TopologyImpl.java
+++ b/src/main/java/net/onrc/onos/core/topology/TopologyImpl.java
@@ -52,16 +52,16 @@
     private final Map<Dpid, SortedSet<MastershipEvent>> mastership;
 
     // DPID -> Switch
-    private final ConcurrentMap<Dpid, SwitchEvent> switches;
-    private final ConcurrentMap<Dpid, ConcurrentMap<PortNumber, PortEvent>> ports;
+    private final ConcurrentMap<Dpid, SwitchData> switches;
+    private final ConcurrentMap<Dpid, ConcurrentMap<PortNumber, PortData>> ports;
 
     // Index from Port to Host
-    private final Multimap<SwitchPort, HostEvent> hosts;
-    private final ConcurrentMap<MACAddress, HostEvent> mac2Host;
+    private final Multimap<SwitchPort, HostData> hosts;
+    private final ConcurrentMap<MACAddress, HostData> mac2Host;
 
     // SwitchPort -> (type -> Link)
-    private final ConcurrentMap<SwitchPort, ConcurrentMap<String, LinkEvent>> outgoingLinks;
-    private final ConcurrentMap<SwitchPort, ConcurrentMap<String, LinkEvent>> incomingLinks;
+    private final ConcurrentMap<SwitchPort, ConcurrentMap<String, LinkData>> outgoingLinks;
+    private final ConcurrentMap<SwitchPort, ConcurrentMap<String, LinkData>> incomingLinks;
 
     private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
     private final Lock readLock = readWriteLock.readLock();
@@ -77,7 +77,7 @@
         switches = new ConcurrentHashMap<>();
         ports = new ConcurrentHashMap<>();
         hosts = Multimaps.synchronizedMultimap(
-                HashMultimap.<SwitchPort, HostEvent>create());
+                HashMultimap.<SwitchPort, HostData>create());
         mac2Host = new ConcurrentHashMap<>();
         outgoingLinks = new ConcurrentHashMap<>();
         incomingLinks = new ConcurrentHashMap<>();
@@ -102,25 +102,25 @@
 
             // shallow copy Map in Map
             this.ports = new ConcurrentHashMap<>(original.ports.size());
-            for (Entry<Dpid, ConcurrentMap<PortNumber, PortEvent>> entry
+            for (Entry<Dpid, ConcurrentMap<PortNumber, PortData>> entry
                     : original.ports.entrySet()) {
                 this.ports.put(entry.getKey(), new ConcurrentHashMap<>(entry.getValue()));
             }
 
             this.hosts = Multimaps.synchronizedMultimap(
-                    HashMultimap.<SwitchPort, HostEvent>create(original.hosts));
+                    HashMultimap.<SwitchPort, HostData>create(original.hosts));
             this.mac2Host = new ConcurrentHashMap<>(original.mac2Host);
 
             // shallow copy Map in Map
             this.outgoingLinks = new ConcurrentHashMap<>(original.outgoingLinks.size());
-            for (Entry<SwitchPort, ConcurrentMap<String, LinkEvent>> entry
+            for (Entry<SwitchPort, ConcurrentMap<String, LinkData>> entry
                     : original.outgoingLinks.entrySet()) {
                 this.outgoingLinks.put(entry.getKey(), new ConcurrentHashMap<>(entry.getValue()));
             }
 
             // shallow copy Map in Map
             this.incomingLinks = new ConcurrentHashMap<>(original.incomingLinks.size());
-            for (Entry<SwitchPort, ConcurrentMap<String, LinkEvent>> entry
+            for (Entry<SwitchPort, ConcurrentMap<String, LinkData>> entry
                     : original.incomingLinks.entrySet()) {
                 this.incomingLinks.put(entry.getKey(), new ConcurrentHashMap<>(entry.getValue()));
             }
@@ -131,7 +131,7 @@
 
     @Override
     public Switch getSwitch(Dpid dpid) {
-        final SwitchEvent sw = switches.get(dpid);
+        final SwitchData sw = switches.get(dpid);
         if (sw != null) {
             return new SwitchImpl(this, dpid);
         } else {
@@ -142,7 +142,7 @@
     @Override
     public Iterable<Switch> getSwitches() {
         List<Switch> list = new ArrayList<>(switches.size());
-        for (SwitchEvent elm : switches.values()) {
+        for (SwitchData elm : switches.values()) {
             list.add(new SwitchImpl(this, elm.getDpid()));
         }
         return list;
@@ -150,9 +150,9 @@
 
     @Override
     public Port getPort(Dpid dpid, PortNumber number) {
-        ConcurrentMap<PortNumber, PortEvent> portMap = ports.get(dpid);
+        ConcurrentMap<PortNumber, PortData> portMap = ports.get(dpid);
         if (portMap != null) {
-            final PortEvent port = portMap.get(number);
+            final PortData port = portMap.get(number);
             if (port != null) {
                 return new PortImpl(this, port.getSwitchPort());
             }
@@ -167,12 +167,12 @@
 
     @Override
     public Collection<Port> getPorts(Dpid dpid) {
-        ConcurrentMap<PortNumber, PortEvent> portMap = ports.get(dpid);
+        ConcurrentMap<PortNumber, PortData> portMap = ports.get(dpid);
         if (portMap == null) {
             return Collections.emptyList();
         }
         List<Port> list = new ArrayList<>(portMap.size());
-        for (PortEvent elm : portMap.values()) {
+        for (PortData elm : portMap.values()) {
             list.add(new PortImpl(this, elm.getSwitchPort()));
         }
         return list;
@@ -185,7 +185,7 @@
 
     @Override
     public Link getOutgoingLink(SwitchPort port) {
-        Map<String, LinkEvent> links = outgoingLinks.get(port);
+        Map<String, LinkData> links = outgoingLinks.get(port);
         return getPacketLinkIfExists(links);
     }
 
@@ -197,19 +197,19 @@
      * @param links Collection of links to search from
      * @return Link instance found or null if no link exists
      */
-    private Link getPacketLinkIfExists(Map<String, LinkEvent> links) {
+    private Link getPacketLinkIfExists(Map<String, LinkData> links) {
 
         if (links == null) {
             return null;
         }
 
-        LinkEvent link = links.get(TopologyElement.TYPE_PACKET_LAYER);
+        LinkData link = links.get(TopologyElement.TYPE_PACKET_LAYER);
         if (link != null) {
             // return packet link
             return new LinkImpl(this, link.getLinkTuple());
         } else {
             // return whatever found
-            Iterator<LinkEvent> it = links.values().iterator();
+            Iterator<LinkData> it = links.values().iterator();
             if (it.hasNext()) {
                 return new LinkImpl(this, it.next().getLinkTuple());
             }
@@ -224,8 +224,8 @@
 
     @Override
     public Link getOutgoingLink(SwitchPort port, String type) {
-        Map<String, LinkEvent> links = outgoingLinks.get(port);
-        final LinkEvent link = links.get(type);
+        Map<String, LinkData> links = outgoingLinks.get(port);
+        final LinkData link = links.get(type);
         if (link != null) {
             return new LinkImpl(this, link.getLinkTuple());
         }
@@ -234,7 +234,7 @@
 
     @Override
     public Collection<Link> getOutgoingLinks(SwitchPort port) {
-        ConcurrentMap<String, LinkEvent> typeMap = outgoingLinks.get(port);
+        ConcurrentMap<String, LinkData> typeMap = outgoingLinks.get(port);
         if (typeMap == null) {
             return Collections.emptyList();
         }
@@ -242,17 +242,17 @@
     }
 
     /**
-     * Converts collection of LinkEvent to collection of LinkImpls.
+     * Converts collection of LinkData to collection of LinkImpls.
      *
-     * @param links collection of LinkEvent
+     * @param links collection of LinkData
      * @return collection of LinkImpls
      */
-    private Collection<Link> toLinkImpls(final Collection<LinkEvent> links) {
+    private Collection<Link> toLinkImpls(final Collection<LinkData> links) {
         if (links == null) {
             return Collections.emptyList();
         }
         List<Link> list = new ArrayList<>(links.size());
-        for (LinkEvent elm : links) {
+        for (LinkData elm : links) {
             list.add(new LinkImpl(this, elm.getLinkTuple()));
         }
         return list;
@@ -265,7 +265,7 @@
 
     @Override
     public Link getIncomingLink(SwitchPort port) {
-        Map<String, LinkEvent> links = incomingLinks.get(port);
+        Map<String, LinkData> links = incomingLinks.get(port);
         return getPacketLinkIfExists(links);
     }
 
@@ -276,8 +276,8 @@
 
     @Override
     public Link getIncomingLink(SwitchPort port, String type) {
-        Map<String, LinkEvent> links = incomingLinks.get(port);
-        final LinkEvent link = links.get(type);
+        Map<String, LinkData> links = incomingLinks.get(port);
+        final LinkData link = links.get(type);
         if (link != null) {
             return new LinkImpl(this, link.getLinkTuple());
         }
@@ -286,7 +286,7 @@
 
     @Override
     public Collection<Link> getIncomingLinks(SwitchPort port) {
-        ConcurrentMap<String, LinkEvent> typeMap = incomingLinks.get(port);
+        ConcurrentMap<String, LinkData> typeMap = incomingLinks.get(port);
         if (typeMap == null) {
             return Collections.emptyList();
         }
@@ -332,11 +332,11 @@
     public Iterable<Link> getLinks() {
         List<Link> links = new ArrayList<>();
 
-        for (Map<String, LinkEvent> portLinks : outgoingLinks.values()) {
+        for (Map<String, LinkData> portLinks : outgoingLinks.values()) {
             if (portLinks == null) {
                 continue;
             }
-            for (LinkEvent elm : portLinks.values()) {
+            for (LinkData elm : portLinks.values()) {
                 links.add(new LinkImpl(this, elm.getLinkTuple()));
             }
         }
@@ -345,7 +345,7 @@
 
     @Override
     public Host getHostByMac(MACAddress address) {
-        HostEvent host = mac2Host.get(address);
+        HostData host = mac2Host.get(address);
         if (host != null) {
             return new HostImpl(this, address);
         }
@@ -358,17 +358,17 @@
     }
 
     /**
-     * Converts collection of HostEvent to collection of HostImpl.
+     * Converts collection of HostData to collection of HostImpl.
      *
-     * @param events collection of HostEvent
+     * @param events collection of HostData
      * @return collection of HostImpl
      */
-    private List<Host> toHostImpls(Collection<HostEvent> events) {
+    private List<Host> toHostImpls(Collection<HostData> events) {
         if (events == null) {
             return Collections.emptyList();
         }
         List<Host> list = new ArrayList<>(events.size());
-        for (HostEvent elm : events) {
+        for (HostData elm : events) {
             list.add(new HostImpl(this, elm.getMac()));
         }
         return list;
@@ -380,23 +380,23 @@
     }
 
     @Override
-    public SwitchEvent getSwitchEvent(final Dpid dpid) {
+    public SwitchData getSwitchData(final Dpid dpid) {
         return this.switches.get(dpid);
     }
 
     @Override
-    public Collection<SwitchEvent> getAllSwitchEvents() {
+    public Collection<SwitchData> getAllSwitchDataEntries() {
         return Collections.unmodifiableCollection(switches.values());
     }
 
     @Override
-    public PortEvent getPortEvent(final SwitchPort port) {
-        return getPortEvent(port.getDpid(), port.getPortNumber());
+    public PortData getPortData(final SwitchPort port) {
+        return getPortData(port.getDpid(), port.getPortNumber());
     }
 
     @Override
-    public PortEvent getPortEvent(final Dpid dpid, PortNumber portNumber) {
-        ConcurrentMap<PortNumber, PortEvent> portMap = this.ports.get(dpid);
+    public PortData getPortData(final Dpid dpid, PortNumber portNumber) {
+        ConcurrentMap<PortNumber, PortData> portMap = this.ports.get(dpid);
         if (portMap != null) {
             return portMap.get(portNumber);
         }
@@ -404,8 +404,8 @@
     }
 
     @Override
-    public Collection<PortEvent> getPortEvents(final Dpid dpid) {
-        ConcurrentMap<PortNumber, PortEvent> portList = ports.get(dpid);
+    public Collection<PortData> getPortDataEntries(final Dpid dpid) {
+        ConcurrentMap<PortNumber, PortData> portList = ports.get(dpid);
         if (portList == null) {
             return Collections.emptyList();
         }
@@ -413,17 +413,17 @@
     }
 
     @Override
-    public Collection<PortEvent> getAllPortEvents() {
-        List<PortEvent> events = new LinkedList<>();
-        for (ConcurrentMap<PortNumber, PortEvent> cm : ports.values()) {
+    public Collection<PortData> getAllPortDataEntries() {
+        List<PortData> events = new LinkedList<>();
+        for (ConcurrentMap<PortNumber, PortData> 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());
+    public LinkData getLinkData(final LinkTuple linkId) {
+        ConcurrentMap<String, LinkData> links = this.outgoingLinks.get(linkId.getSrc());
         if (links == null) {
             return null;
         }
@@ -431,7 +431,7 @@
         // TODO Should we look for Packet link first?
         //  Not unless invariant is broken.
 
-        for (LinkEvent link : links.values()) {
+        for (LinkData link : links.values()) {
             if (link.getDst().equals(linkId.getDst())) {
                 return link;
             }
@@ -440,12 +440,12 @@
     }
 
     @Override
-    public LinkEvent getLinkEvent(final LinkTuple linkId, final String type) {
-        ConcurrentMap<String, LinkEvent> links = this.outgoingLinks.get(linkId.getSrc());
+    public LinkData getLinkData(final LinkTuple linkId, final String type) {
+        ConcurrentMap<String, LinkData> links = this.outgoingLinks.get(linkId.getSrc());
         if (links == null) {
             return null;
         }
-        LinkEvent link = links.get(type);
+        LinkData link = links.get(type);
         if (link.getDst().equals(linkId.getDst())) {
             return link;
         }
@@ -453,8 +453,8 @@
     }
 
     @Override
-    public Collection<LinkEvent> getLinkEventsFrom(SwitchPort srcPort) {
-        ConcurrentMap<String, LinkEvent> links = this.outgoingLinks.get(srcPort);
+    public Collection<LinkData> getLinkDataEntriesFrom(SwitchPort srcPort) {
+        ConcurrentMap<String, LinkData> links = this.outgoingLinks.get(srcPort);
         if (links == null) {
             return Collections.emptyList();
         }
@@ -462,8 +462,8 @@
     }
 
     @Override
-    public Collection<LinkEvent> getLinkEventsTo(SwitchPort dstPort) {
-        ConcurrentMap<String, LinkEvent> links = this.incomingLinks.get(dstPort);
+    public Collection<LinkData> getLinkDataEntriesTo(SwitchPort dstPort) {
+        ConcurrentMap<String, LinkData> links = this.incomingLinks.get(dstPort);
         if (links == null) {
             return Collections.emptyList();
         }
@@ -471,44 +471,44 @@
     }
 
     @Override
-    public Collection<LinkEvent> getLinkEvents(final LinkTuple linkId) {
-        ConcurrentMap<String, LinkEvent> links = this.outgoingLinks.get(linkId.getSrc());
+    public Collection<LinkData> getLinkDataEntries(final LinkTuple linkId) {
+        ConcurrentMap<String, LinkData> links = this.outgoingLinks.get(linkId.getSrc());
         if (links == null) {
             return Collections.emptyList();
         }
 
-        List<LinkEvent> linkEvents = new ArrayList<>();
-        for (LinkEvent e : links.values()) {
+        List<LinkData> linkDataEntries = new ArrayList<>();
+        for (LinkData e : links.values()) {
             if (e.getDst().equals(linkId.getDst())) {
-                linkEvents.add(e);
+                linkDataEntries.add(e);
             }
         }
 
         // unless invariant is broken, this should contain at most 1 element.
-        return linkEvents;
+        return linkDataEntries;
     }
 
     @Override
-    public Collection<LinkEvent> getAllLinkEvents() {
-        List<LinkEvent> events = new LinkedList<>();
-        for (ConcurrentMap<String, LinkEvent> cm : outgoingLinks.values()) {
+    public Collection<LinkData> getAllLinkDataEntries() {
+        List<LinkData> events = new LinkedList<>();
+        for (ConcurrentMap<String, LinkData> cm : outgoingLinks.values()) {
             events.addAll(cm.values());
         }
         return Collections.unmodifiableCollection(events);
     }
 
     @Override
-    public HostEvent getHostEvent(final MACAddress mac) {
+    public HostData getHostData(final MACAddress mac) {
         return this.mac2Host.get(mac);
     }
 
     @Override
-    public Collection<HostEvent> getHostEvents(SwitchPort port) {
+    public Collection<HostData> getHostDataEntries(SwitchPort port) {
         return Collections.unmodifiableCollection(hosts.get(port));
     }
 
     @Override
-    public Collection<HostEvent> getAllHostEvents() {
+    public Collection<HostData> getAllHostDataEntries() {
         return Collections.unmodifiableCollection(mac2Host.values());
     }
 
@@ -527,19 +527,19 @@
     }
 
     /**
-     * Puts a SwitchEvent.
+     * Puts a SwitchData.
      *
      * @param sw Switch to add. (Will be frozen if not already)
      */
     @GuardedBy("writeLock")
-    protected void putSwitch(SwitchEvent sw) {
+    protected void putSwitch(SwitchData sw) {
         // TODO isFrozen check once we implement CoW/lock-free
         switches.put(sw.getDpid(), sw.freeze());
-        ports.putIfAbsent(sw.getDpid(), new ConcurrentHashMap<PortNumber, PortEvent>());
+        ports.putIfAbsent(sw.getDpid(), new ConcurrentHashMap<PortNumber, PortData>());
     }
 
     /**
-     * Removes a SwitchEvent from this snapshot.
+     * Removes a SwitchData from this snapshot.
      * <p/>
      * Will also remove ports, if it has not been removed already.
      *
@@ -549,24 +549,24 @@
     protected void removeSwitch(Dpid dpid) {
         // TODO isFrozen check once we implement CoW/lock-free
         switches.remove(dpid);
-        ConcurrentMap<PortNumber, PortEvent> removedPorts = ports.remove(dpid);
+        ConcurrentMap<PortNumber, PortData> removedPorts = ports.remove(dpid);
         if (removedPorts != null && !removedPorts.isEmpty()) {
             log.warn("Some ports were removed as side-effect of #removeSwitch({})", dpid);
         }
     }
 
     /**
-     * Puts a PortEvent.
+     * Puts a PortData.
      *
      * @param port Port to add. (Will be frozen if not already)
      */
     @GuardedBy("writeLock")
-    protected void putPort(PortEvent port) {
+    protected void putPort(PortData port) {
 
-        ConcurrentMap<PortNumber, PortEvent> portMap = ports.get(port.getDpid());
+        ConcurrentMap<PortNumber, PortData> portMap = ports.get(port.getDpid());
         if (portMap == null) {
             portMap = new ConcurrentHashMap<>();
-            ConcurrentMap<PortNumber, PortEvent> existing
+            ConcurrentMap<PortNumber, PortData> existing
                 = ports.putIfAbsent(port.getDpid(), portMap);
             if (existing != null) {
                 // port map was added concurrently, using theirs
@@ -577,7 +577,7 @@
     }
 
     /**
-     * Removes a PortEvent from this snapshot.
+     * Removes a PortData from this snapshot.
      *
      * @param port SwitchPort to remove
      */
@@ -587,7 +587,7 @@
     }
 
     /**
-     * Removes a PortEvent from this snapshot.
+     * Removes a PortData from this snapshot.
      * <p/>
      * Will also remove ports, if it has not been removed already.
      *
@@ -597,19 +597,19 @@
     @GuardedBy("writeLock")
     protected void removePort(Dpid dpid, PortNumber number) {
         // TODO sanity check Host attachment point.
-        ConcurrentMap<PortNumber, PortEvent> portMap = ports.get(dpid);
+        ConcurrentMap<PortNumber, PortData> portMap = ports.get(dpid);
         if (portMap != null) {
             portMap.remove(number);
         }
     }
 
     /**
-     * Puts a LinkEvent.
+     * Puts a LinkData.
      *
-     * @param link LinkEvent
+     * @param link LinkData
      */
     @GuardedBy("writeLock")
-    protected void putLink(LinkEvent link) {
+    protected void putLink(LinkData link) {
         // TODO Do sanity check?
         //   - There cannot be 2 links in same direction between a port pair.
         putLinkMap(outgoingLinks, link.getSrc(), link);
@@ -624,13 +624,13 @@
      * @param link Link to add
      */
     @GuardedBy("writeLock")
-    private void putLinkMap(ConcurrentMap<SwitchPort, ConcurrentMap<String, LinkEvent>> linkMap,
-                            SwitchPort port, LinkEvent link) {
+    private void putLinkMap(ConcurrentMap<SwitchPort, ConcurrentMap<String, LinkData>> linkMap,
+                            SwitchPort port, LinkData link) {
 
-        ConcurrentMap<String, LinkEvent> linksOnPort = linkMap.get(port);
+        ConcurrentMap<String, LinkData> linksOnPort = linkMap.get(port);
         if (linksOnPort == null) {
             linksOnPort = new ConcurrentHashMap<>(4);
-            ConcurrentMap<String, LinkEvent> existing
+            ConcurrentMap<String, LinkData> existing
                 = linkMap.putIfAbsent(
                     port,
                     linksOnPort);
@@ -643,14 +643,14 @@
     }
 
     /**
-     * Removes a LinkEvent from this snapshot.
+     * Removes a LinkData from this snapshot.
      *
      * @param link Link to remove
      * @param type type of link to remove
      */
     @GuardedBy("writeLock")
     protected void removeLink(LinkTuple link, String type) {
-        ConcurrentMap<String, LinkEvent> portLinks
+        ConcurrentMap<String, LinkData> portLinks
             = outgoingLinks.get(link.getSrc());
         if (portLinks != null) {
             // no conditional update here
@@ -665,28 +665,28 @@
     }
 
     /**
-     * Removes a LinkEvent from this snapshot.
+     * Removes a LinkData from this snapshot.
      *
      * @param link Link to remove
      */
     @GuardedBy("writeLock")
     protected void removeLink(LinkTuple link) {
-        Collection<LinkEvent> links = getLinkEvents(link);
-        for (LinkEvent l : links) {
+        Collection<LinkData> links = getLinkDataEntries(link);
+        for (LinkData l : links) {
             removeLink(link, l.getType());
         }
     }
 
     /**
-     * Puts a HostEvent.
+     * Puts a HostData.
      * <p/>
-     * Removes attachment points for previous HostEvent and update
-     * them with new HostEvent
+     * Removes attachment points for previous HostData and update
+     * them with new HostData
      *
-     * @param host HostEvent
+     * @param host HostData
      */
     @GuardedBy("writeLock")
-    protected void putHost(HostEvent host) {
+    protected void putHost(HostData host) {
         // Host cannot be simply put() to replace instance since it has mobility.
         // Simply remove -> put for now.
 
@@ -701,13 +701,13 @@
     }
 
     /**
-     * Removes a HostEvent from this snapshot.
+     * Removes a HostData from this snapshot.
      *
      * @param mac MACAddress of the Host to remove
      */
     @GuardedBy("writeLock")
     protected void removeHost(MACAddress mac) {
-        HostEvent host = mac2Host.remove(mac);
+        HostData host = mac2Host.remove(mac);
         if (host != null) {
             for (SwitchPort port : host.getAttachmentPoints()) {
                 hosts.remove(port, host);
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 62228f0..47cdcff 100644
--- a/src/main/java/net/onrc/onos/core/topology/TopologyManager.java
+++ b/src/main/java/net/onrc/onos/core/topology/TopologyManager.java
@@ -110,14 +110,14 @@
         new LinkedList<>();
     private List<MastershipEvent> apiRemovedMastershipEvents =
         new LinkedList<>();
-    private List<SwitchEvent> apiAddedSwitchEvents = new LinkedList<>();
-    private List<SwitchEvent> apiRemovedSwitchEvents = new LinkedList<>();
-    private List<PortEvent> apiAddedPortEvents = new LinkedList<>();
-    private List<PortEvent> apiRemovedPortEvents = new LinkedList<>();
-    private List<LinkEvent> apiAddedLinkEvents = new LinkedList<>();
-    private List<LinkEvent> apiRemovedLinkEvents = new LinkedList<>();
-    private List<HostEvent> apiAddedHostEvents = new LinkedList<>();
-    private List<HostEvent> apiRemovedHostEvents = new LinkedList<>();
+    private List<SwitchData> apiAddedSwitchDataEntries = new LinkedList<>();
+    private List<SwitchData> apiRemovedSwitchDataEntries = new LinkedList<>();
+    private List<PortData> apiAddedPortDataEntries = new LinkedList<>();
+    private List<PortData> apiRemovedPortDataEntries = new LinkedList<>();
+    private List<LinkData> apiAddedLinkDataEntries = new LinkedList<>();
+    private List<LinkData> apiRemovedLinkDataEntries = new LinkedList<>();
+    private List<HostData> apiAddedHostDataEntries = new LinkedList<>();
+    private List<HostData> apiRemovedHostDataEntries = new LinkedList<>();
 
     /**
      * Constructor.
@@ -235,10 +235,10 @@
                     // Get the event itself
                     MastershipEvent mastershipEvent =
                         topologyEvent.getMastershipEvent();
-                    SwitchEvent switchEvent = topologyEvent.getSwitchEvent();
-                    PortEvent portEvent = topologyEvent.getPortEvent();
-                    LinkEvent linkEvent = topologyEvent.getLinkEvent();
-                    HostEvent hostEvent = topologyEvent.getHostEvent();
+                    SwitchData switchData = topologyEvent.getSwitchData();
+                    PortData portData = topologyEvent.getPortData();
+                    LinkData linkData = topologyEvent.getLinkData();
+                    HostData hostData = topologyEvent.getHostData();
                     boolean wasAdded = false;
 
                     //
@@ -249,17 +249,17 @@
                         if (mastershipEvent != null) {
                             wasAdded = addMastershipEvent(mastershipEvent);
                         }
-                        if (switchEvent != null) {
-                            wasAdded = addSwitch(switchEvent);
+                        if (switchData != null) {
+                            wasAdded = addSwitch(switchData);
                         }
-                        if (portEvent != null) {
-                            wasAdded = addPort(portEvent);
+                        if (portData != null) {
+                            wasAdded = addPort(portData);
                         }
-                        if (linkEvent != null) {
-                            wasAdded = addLink(linkEvent);
+                        if (linkData != null) {
+                            wasAdded = addLink(linkData);
                         }
-                        if (hostEvent != null) {
-                            wasAdded = addHost(hostEvent);
+                        if (hostData != null) {
+                            wasAdded = addHost(hostData);
                         }
                         // If the item wasn't added, probably it was reordered
                         if (!wasAdded) {
@@ -271,17 +271,17 @@
                         if (mastershipEvent != null) {
                             removeMastershipEvent(mastershipEvent);
                         }
-                        if (switchEvent != null) {
-                            removeSwitch(switchEvent);
+                        if (switchData != null) {
+                            removeSwitch(switchData);
                         }
-                        if (portEvent != null) {
-                            removePort(portEvent);
+                        if (portData != null) {
+                            removePort(portData);
                         }
-                        if (linkEvent != null) {
-                            removeLink(linkEvent);
+                        if (linkData != null) {
+                            removeLink(linkData);
                         }
-                        if (hostEvent != null) {
-                            removeHost(hostEvent);
+                        if (hostData != null) {
+                            removeHost(hostData);
                         }
                         break;
                     default:
@@ -413,20 +413,20 @@
         TopologyEvents events = null;
         Collection<MastershipEvent> mastershipEvents =
             lastAddMastershipEvents.values();
-        Collection<SwitchEvent> switchEvents = topology.getAllSwitchEvents();
-        Collection<PortEvent> portEvents = topology.getAllPortEvents();
-        Collection<LinkEvent> linkEvents = topology.getAllLinkEvents();
-        Collection<HostEvent> hostEvents = topology.getAllHostEvents();
+        Collection<SwitchData> switchDataEntries = topology.getAllSwitchDataEntries();
+        Collection<PortData> portDataEntries = topology.getAllPortDataEntries();
+        Collection<LinkData> linkDataEntries = topology.getAllLinkDataEntries();
+        Collection<HostData> hostDataEntries = topology.getAllHostDataEntries();
         if (!(mastershipEvents.isEmpty() &&
-              switchEvents.isEmpty() &&
-              portEvents.isEmpty() &&
-              linkEvents.isEmpty() &&
-              hostEvents.isEmpty())) {
+              switchDataEntries.isEmpty() &&
+              portDataEntries.isEmpty() &&
+              linkDataEntries.isEmpty() &&
+              hostDataEntries.isEmpty())) {
             events = new TopologyEvents(mastershipEvents,
-                                        switchEvents,
-                                        portEvents,
-                                        linkEvents,
-                                        hostEvents);
+                                        switchDataEntries,
+                                        portDataEntries,
+                                        linkDataEntries,
+                                        hostDataEntries);
         }
 
         //
@@ -457,14 +457,14 @@
     private void dispatchTopologyEvents() {
         if (apiAddedMastershipEvents.isEmpty() &&
                 apiRemovedMastershipEvents.isEmpty() &&
-                apiAddedSwitchEvents.isEmpty() &&
-                apiRemovedSwitchEvents.isEmpty() &&
-                apiAddedPortEvents.isEmpty() &&
-                apiRemovedPortEvents.isEmpty() &&
-                apiAddedLinkEvents.isEmpty() &&
-                apiRemovedLinkEvents.isEmpty() &&
-                apiAddedHostEvents.isEmpty() &&
-                apiRemovedHostEvents.isEmpty()) {
+                apiAddedSwitchDataEntries.isEmpty() &&
+                apiRemovedSwitchDataEntries.isEmpty() &&
+                apiAddedPortDataEntries.isEmpty() &&
+                apiRemovedPortDataEntries.isEmpty() &&
+                apiAddedLinkDataEntries.isEmpty() &&
+                apiRemovedLinkDataEntries.isEmpty() &&
+                apiAddedHostDataEntries.isEmpty() &&
+                apiRemovedHostDataEntries.isEmpty()) {
             return;        // No events to dispatch
         }
 
@@ -481,29 +481,29 @@
                 log.debug("Dispatch Topology Event: REMOVED {}",
                           mastershipEvent);
             }
-            for (SwitchEvent switchEvent : apiAddedSwitchEvents) {
-                log.debug("Dispatch Topology Event: ADDED {}", switchEvent);
+            for (SwitchData switchData : apiAddedSwitchDataEntries) {
+                log.debug("Dispatch Topology Event: ADDED {}", switchData);
             }
-            for (SwitchEvent switchEvent : apiRemovedSwitchEvents) {
-                log.debug("Dispatch Topology Event: REMOVED {}", switchEvent);
+            for (SwitchData switchData : apiRemovedSwitchDataEntries) {
+                log.debug("Dispatch Topology Event: REMOVED {}", switchData);
             }
-            for (PortEvent portEvent : apiAddedPortEvents) {
-                log.debug("Dispatch Topology Event: ADDED {}", portEvent);
+            for (PortData portData : apiAddedPortDataEntries) {
+                log.debug("Dispatch Topology Event: ADDED {}", portData);
             }
-            for (PortEvent portEvent : apiRemovedPortEvents) {
-                log.debug("Dispatch Topology Event: REMOVED {}", portEvent);
+            for (PortData portData : apiRemovedPortDataEntries) {
+                log.debug("Dispatch Topology Event: REMOVED {}", portData);
             }
-            for (LinkEvent linkEvent : apiAddedLinkEvents) {
-                log.debug("Dispatch Topology Event: ADDED {}", linkEvent);
+            for (LinkData linkData : apiAddedLinkDataEntries) {
+                log.debug("Dispatch Topology Event: ADDED {}", linkData);
             }
-            for (LinkEvent linkEvent : apiRemovedLinkEvents) {
-                log.debug("Dispatch Topology Event: REMOVED {}", linkEvent);
+            for (LinkData linkData : apiRemovedLinkDataEntries) {
+                log.debug("Dispatch Topology Event: REMOVED {}", linkData);
             }
-            for (HostEvent hostEvent : apiAddedHostEvents) {
-                log.debug("Dispatch Topology Event: ADDED {}", hostEvent);
+            for (HostData hostData : apiAddedHostDataEntries) {
+                log.debug("Dispatch Topology Event: ADDED {}", hostData);
             }
-            for (HostEvent hostEvent : apiRemovedHostEvents) {
-                log.debug("Dispatch Topology Event: REMOVED {}", hostEvent);
+            for (HostData hostData : apiRemovedHostDataEntries) {
+                log.debug("Dispatch Topology Event: REMOVED {}", hostData);
             }
         }
 
@@ -512,10 +512,10 @@
         //
         long totalEvents =
             apiAddedMastershipEvents.size() + apiRemovedMastershipEvents.size() +
-            apiAddedSwitchEvents.size() + apiRemovedSwitchEvents.size() +
-            apiAddedPortEvents.size() + apiRemovedPortEvents.size() +
-            apiAddedLinkEvents.size() + apiRemovedLinkEvents.size() +
-            apiAddedHostEvents.size() + apiRemovedHostEvents.size();
+            apiAddedSwitchDataEntries.size() + apiRemovedSwitchDataEntries.size() +
+            apiAddedPortDataEntries.size() + apiRemovedPortDataEntries.size() +
+            apiAddedLinkDataEntries.size() + apiRemovedLinkDataEntries.size() +
+            apiAddedHostDataEntries.size() + apiRemovedHostDataEntries.size();
         this.listenerEventRate.mark(totalEvents);
         this.lastEventTimestampEpochMs = System.currentTimeMillis();
 
@@ -525,14 +525,14 @@
         TopologyEvents events = new TopologyEvents(
                 apiAddedMastershipEvents,
                 apiRemovedMastershipEvents,
-                apiAddedSwitchEvents,
-                apiRemovedSwitchEvents,
-                apiAddedPortEvents,
-                apiRemovedPortEvents,
-                apiAddedLinkEvents,
-                apiRemovedLinkEvents,
-                apiAddedHostEvents,
-                apiRemovedHostEvents);
+                apiAddedSwitchDataEntries,
+                apiRemovedSwitchDataEntries,
+                apiAddedPortDataEntries,
+                apiRemovedPortDataEntries,
+                apiAddedLinkDataEntries,
+                apiRemovedLinkDataEntries,
+                apiAddedHostDataEntries,
+                apiRemovedHostDataEntries);
 
         //
         // Deliver the events
@@ -546,14 +546,14 @@
         //
         apiAddedMastershipEvents.clear();
         apiRemovedMastershipEvents.clear();
-        apiAddedSwitchEvents.clear();
-        apiRemovedSwitchEvents.clear();
-        apiAddedPortEvents.clear();
-        apiRemovedPortEvents.clear();
-        apiAddedLinkEvents.clear();
-        apiRemovedLinkEvents.clear();
-        apiAddedHostEvents.clear();
-        apiRemovedHostEvents.clear();
+        apiAddedSwitchDataEntries.clear();
+        apiRemovedSwitchDataEntries.clear();
+        apiAddedPortDataEntries.clear();
+        apiRemovedPortDataEntries.clear();
+        apiAddedLinkDataEntries.clear();
+        apiRemovedLinkDataEntries.clear();
+        apiAddedHostDataEntries.clear();
+        apiRemovedHostDataEntries.clear();
     }
 
     //
@@ -590,86 +590,86 @@
     /**
      * Adds a switch to the topology replica.
      *
-     * @param switchEvent the SwitchEvent with the switch to add.
+     * @param switchData the SwitchData with the switch to add.
      * @return true if the item was successfully added, otherwise false.
      */
     @GuardedBy("topology.writeLock")
-    private boolean addSwitch(SwitchEvent switchEvent) {
+    private boolean addSwitch(SwitchData switchData) {
         if (log.isDebugEnabled()) {
-            SwitchEvent sw = topology.getSwitchEvent(switchEvent.getDpid());
+            SwitchData sw = topology.getSwitchData(switchData.getDpid());
             if (sw != null) {
-                log.debug("Update {}", switchEvent);
+                log.debug("Update {}", switchData);
             } else {
-                log.debug("Added {}", switchEvent);
+                log.debug("Added {}", switchData);
             }
         }
-        topology.putSwitch(switchEvent.freeze());
-        apiAddedSwitchEvents.add(switchEvent);
+        topology.putSwitch(switchData.freeze());
+        apiAddedSwitchDataEntries.add(switchData);
         return true;
     }
 
     /**
      * Removes a switch from the topology replica.
      * <p/>
-     * It will call {@link #removePort(PortEvent)} for each ports on this
+     * It will call {@link #removePort(PortData)} for each ports on this
      * switch.
      *
-     * @param switchEvent the SwitchEvent with the switch to remove.
+     * @param switchData the SwitchData with the switch to remove.
      */
     @GuardedBy("topology.writeLock")
-    private void removeSwitch(SwitchEvent switchEvent) {
-        final Dpid dpid = switchEvent.getDpid();
+    private void removeSwitch(SwitchData switchData) {
+        final Dpid dpid = switchData.getDpid();
 
-        SwitchEvent swInTopo = topology.getSwitchEvent(dpid);
+        SwitchData swInTopo = topology.getSwitchData(dpid);
         if (swInTopo == null) {
-            log.warn("Switch {} already removed, ignoring", switchEvent);
+            log.warn("Switch {} already removed, ignoring", switchData);
             return;
         }
 
         //
         // Remove all Ports on the Switch
         //
-        ArrayList<PortEvent> portsToRemove = new ArrayList<>();
+        ArrayList<PortData> portsToRemove = new ArrayList<>();
         for (Port port : topology.getPorts(dpid)) {
             log.warn("Port {} on Switch {} should be removed prior to removing Switch. Removing Port now.",
-                    port, switchEvent);
-            PortEvent portEvent = new PortEvent(port.getSwitchPort());
-            portsToRemove.add(portEvent);
+                    port, switchData);
+            PortData portData = new PortData(port.getSwitchPort());
+            portsToRemove.add(portData);
         }
-        for (PortEvent portEvent : portsToRemove) {
-            removePort(portEvent);
+        for (PortData portData : portsToRemove) {
+            removePort(portData);
         }
 
         log.debug("Removed {}", swInTopo);
         topology.removeSwitch(dpid);
-        apiRemovedSwitchEvents.add(swInTopo);
+        apiRemovedSwitchDataEntries.add(swInTopo);
     }
 
     /**
      * Adds a port to the topology replica.
      *
-     * @param portEvent the PortEvent with the port to add.
+     * @param portData the PortData with the port to add.
      * @return true if the item was successfully added, otherwise false.
      */
     @GuardedBy("topology.writeLock")
-    private boolean addPort(PortEvent portEvent) {
-        Switch sw = topology.getSwitch(portEvent.getDpid());
+    private boolean addPort(PortData portData) {
+        Switch sw = topology.getSwitch(portData.getDpid());
         if (sw == null) {
             // Reordered event
-            log.debug("{} reordered because switch is null", portEvent);
+            log.debug("{} reordered because switch is null", portData);
             return false;
         }
 
         if (log.isDebugEnabled()) {
-            PortEvent port = topology.getPortEvent(portEvent.getSwitchPort());
+            PortData port = topology.getPortData(portData.getSwitchPort());
             if (port != null) {
-                log.debug("Update {}", portEvent);
+                log.debug("Update {}", portData);
             } else {
-                log.debug("Added {}", portEvent);
+                log.debug("Added {}", portData);
             }
         }
-        topology.putPort(portEvent.freeze());
-        apiAddedPortEvents.add(portEvent);
+        topology.putPort(portData.freeze());
+        apiAddedPortDataEntries.add(portData);
         return true;
     }
 
@@ -677,47 +677,47 @@
      * Removes a port from the topology replica.
      * <p/>
      * It will remove attachment points from each hosts on this port
-     * and call {@link #removeLink(LinkEvent)} for each links on this port.
+     * and call {@link #removeLink(LinkData)} for each links on this port.
      *
-     * @param portEvent the PortEvent with the port to remove.
+     * @param portData the PortData with the port to remove.
      */
     @GuardedBy("topology.writeLock")
-    private void removePort(PortEvent portEvent) {
-        SwitchEvent sw = topology.getSwitchEvent(portEvent.getDpid());
+    private void removePort(PortData portData) {
+        SwitchData sw = topology.getSwitchData(portData.getDpid());
         if (sw == null) {
             log.warn("Parent Switch for Port {} already removed, ignoring",
-                    portEvent);
+                    portData);
             return;
         }
 
-        final SwitchPort switchPort = portEvent.getSwitchPort();
-        PortEvent portInTopo = topology.getPortEvent(switchPort);
+        final SwitchPort switchPort = portData.getSwitchPort();
+        PortData portInTopo = topology.getPortData(switchPort);
         if (portInTopo == null) {
-            log.warn("Port {} already removed, ignoring", portEvent);
+            log.warn("Port {} already removed, ignoring", portData);
             return;
         }
 
         //
         // Remove all Host attachment points bound to this Port
         //
-        List<HostEvent> hostsToUpdate = new ArrayList<>();
+        List<HostData> hostsToUpdate = new ArrayList<>();
         for (Host host : topology.getHosts(switchPort)) {
             log.debug("Removing Host {} on Port {}", host, portInTopo);
-            HostEvent hostEvent = topology.getHostEvent(host.getMacAddress());
-            hostsToUpdate.add(hostEvent);
+            HostData hostData = topology.getHostData(host.getMacAddress());
+            hostsToUpdate.add(hostData);
         }
-        for (HostEvent hostEvent : hostsToUpdate) {
-            HostEvent newHostEvent = new HostEvent(hostEvent);
-            newHostEvent.removeAttachmentPoint(switchPort);
-            newHostEvent.freeze();
+        for (HostData hostData : hostsToUpdate) {
+            HostData newHostData = new HostData(hostData);
+            newHostData.removeAttachmentPoint(switchPort);
+            newHostData.freeze();
 
             // TODO should this event be fired inside #addHost?
-            if (newHostEvent.getAttachmentPoints().isEmpty()) {
+            if (newHostData.getAttachmentPoints().isEmpty()) {
                 // No more attachment point left -> remove Host
-                removeHost(hostEvent);
+                removeHost(hostData);
             } else {
                 // Update Host
-                addHost(newHostEvent);
+                addHost(newHostData);
             }
         }
 
@@ -731,10 +731,10 @@
             if (link == null) {
                 continue;
             }
-            LinkEvent linkEvent = topology.getLinkEvent(link.getLinkTuple());
-            if (linkEvent != null) {
+            LinkData linkData = topology.getLinkData(link.getLinkTuple());
+            if (linkData != null) {
                 log.debug("Removing Link {} on Port {}", link, portInTopo);
-                removeLink(linkEvent);
+                removeLink(linkData);
             }
         }
 
@@ -742,7 +742,7 @@
         log.debug("Removed {}", portInTopo);
         topology.removePort(switchPort);
 
-        apiRemovedPortEvents.add(portInTopo);
+        apiRemovedPortDataEntries.add(portInTopo);
     }
 
     /**
@@ -750,16 +750,16 @@
      * <p/>
      * It will remove attachment points from each hosts using the same ports.
      *
-     * @param linkEvent the LinkEvent with the link to add.
+     * @param linkData the LinkData with the link to add.
      * @return true if the item was successfully added, otherwise false.
      */
     @GuardedBy("topology.writeLock")
-    private boolean addLink(LinkEvent linkEvent) {
-        PortEvent srcPort = topology.getPortEvent(linkEvent.getSrc());
-        PortEvent dstPort = topology.getPortEvent(linkEvent.getDst());
+    private boolean addLink(LinkData linkData) {
+        PortData srcPort = topology.getPortData(linkData.getSrc());
+        PortData dstPort = topology.getPortData(linkData.getDst());
         if ((srcPort == null) || (dstPort == null)) {
             // Reordered event
-            log.debug("{} reordered because {} port is null", linkEvent,
+            log.debug("{} reordered because {} port is null", linkData,
                     (srcPort == null) ? "src" : "dst");
             return false;
         }
@@ -772,15 +772,15 @@
         //        Hazelcast delay.
         // FIXME: May need to manage local truth and use them instead.
         //
-        if (topology.getLinkEvent(linkEvent.getLinkTuple()) == null) {
+        if (topology.getLinkData(linkData.getLinkTuple()) == null) {
             // Only check for existing Host when adding new Link.
             // Remove all Hosts attached to the ports on both ends
 
-            Set<HostEvent> hostsToUpdate =
-                new TreeSet<>(new Comparator<HostEvent>() {
+            Set<HostData> hostsToUpdate =
+                new TreeSet<>(new Comparator<HostData>() {
                 // Comparison only using ID(=MAC)
                 @Override
-                public int compare(HostEvent o1, HostEvent o2) {
+                public int compare(HostData o1, HostData o2) {
                     return Long.compare(o1.getMac().toLong(), o2.getMac().toLong());
                 }
             });
@@ -793,92 +793,92 @@
             for (SwitchPort port : portsToCheck) {
                 for (Host host : topology.getHosts(port)) {
                     log.error("Host {} on Port {} should have been removed prior to adding Link {}",
-                            host, port, linkEvent);
+                            host, port, linkData);
 
-                    HostEvent hostEvent =
-                        topology.getHostEvent(host.getMacAddress());
-                    hostsToUpdate.add(hostEvent);
+                    HostData hostData =
+                        topology.getHostData(host.getMacAddress());
+                    hostsToUpdate.add(hostData);
                 }
             }
             // Remove attachment point from them
-            for (HostEvent hostEvent : hostsToUpdate) {
+            for (HostData hostData : hostsToUpdate) {
                 // Remove port from attachment point and update
-                HostEvent newHostEvent = new HostEvent(hostEvent);
-                newHostEvent.removeAttachmentPoint(srcPort.getSwitchPort());
-                newHostEvent.removeAttachmentPoint(dstPort.getSwitchPort());
-                newHostEvent.freeze();
+                HostData newHostData = new HostData(hostData);
+                newHostData.removeAttachmentPoint(srcPort.getSwitchPort());
+                newHostData.removeAttachmentPoint(dstPort.getSwitchPort());
+                newHostData.freeze();
 
                 // TODO should this event be fired inside #addHost?
-                if (newHostEvent.getAttachmentPoints().isEmpty()) {
+                if (newHostData.getAttachmentPoints().isEmpty()) {
                     // No more attachment point left -> remove Host
-                    removeHost(hostEvent);
+                    removeHost(hostData);
                 } else {
                     // Update Host
-                    addHost(newHostEvent);
+                    addHost(newHostData);
                 }
             }
         }
 
         if (log.isDebugEnabled()) {
-            LinkEvent link = topology.getLinkEvent(linkEvent.getLinkTuple());
+            LinkData link = topology.getLinkData(linkData.getLinkTuple());
             if (link != null) {
-                log.debug("Update {}", linkEvent);
+                log.debug("Update {}", linkData);
             } else {
-                log.debug("Added {}", linkEvent);
+                log.debug("Added {}", linkData);
             }
         }
-        topology.putLink(linkEvent.freeze());
-        apiAddedLinkEvents.add(linkEvent);
+        topology.putLink(linkData.freeze());
+        apiAddedLinkDataEntries.add(linkData);
         return true;
     }
 
     /**
      * Removes a link from the topology replica.
      *
-     * @param linkEvent the LinkEvent with the link to remove.
+     * @param linkData the LinkData with the link to remove.
      */
     @GuardedBy("topology.writeLock")
-    private void removeLink(LinkEvent linkEvent) {
-        Port srcPort = topology.getPort(linkEvent.getSrc().getDpid(),
-                linkEvent.getSrc().getPortNumber());
+    private void removeLink(LinkData linkData) {
+        Port srcPort = topology.getPort(linkData.getSrc().getDpid(),
+                linkData.getSrc().getPortNumber());
         if (srcPort == null) {
             log.warn("Src Port for Link {} already removed, ignoring",
-                    linkEvent);
+                    linkData);
             return;
         }
 
-        Port dstPort = topology.getPort(linkEvent.getDst().getDpid(),
-                linkEvent.getDst().getPortNumber());
+        Port dstPort = topology.getPort(linkData.getDst().getDpid(),
+                linkData.getDst().getPortNumber());
         if (dstPort == null) {
             log.warn("Dst Port for Link {} already removed, ignoring",
-                    linkEvent);
+                    linkData);
             return;
         }
 
-        LinkEvent linkInTopo = topology.getLinkEvent(linkEvent.getLinkTuple(),
-                linkEvent.getType());
+        LinkData linkInTopo = topology.getLinkData(linkData.getLinkTuple(),
+                linkData.getType());
         if (linkInTopo == null) {
-            log.warn("Link {} already removed, ignoring", linkEvent);
+            log.warn("Link {} already removed, ignoring", linkData);
             return;
         }
 
         if (log.isDebugEnabled()) {
             // only do sanity check on debug level
 
-            Link linkIn = dstPort.getIncomingLink(linkEvent.getType());
+            Link linkIn = dstPort.getIncomingLink(linkData.getType());
             if (linkIn == null) {
                 log.warn("Link {} already removed on destination Port",
-                         linkEvent);
+                         linkData);
             }
-            Link linkOut = srcPort.getOutgoingLink(linkEvent.getType());
+            Link linkOut = srcPort.getOutgoingLink(linkData.getType());
             if (linkOut == null) {
-                log.warn("Link {} already removed on src Port", linkEvent);
+                log.warn("Link {} already removed on src Port", linkData);
             }
         }
 
         log.debug("Removed {}", linkInTopo);
-        topology.removeLink(linkEvent.getLinkTuple(), linkEvent.getType());
-        apiRemovedLinkEvents.add(linkInTopo);
+        topology.removeLink(linkData.getLinkTuple(), linkData.getType());
+        apiRemovedLinkDataEntries.add(linkInTopo);
     }
 
     /**
@@ -886,27 +886,27 @@
      * <p/>
      * TODO: Host-related work is incomplete.
      * TODO: Eventually, we might need to consider reordering
-     * or {@link #addLink(LinkEvent)} and {@link #addHost(HostEvent)} events
+     * or {@link #addLink(LinkData)} and {@link #addHost(HostData)} events
      * on the same port.
      *
-     * @param hostEvent the HostEvent with the host to add.
+     * @param hostData the HostData with the host to add.
      * @return true if the item was successfully added, otherwise false.
      */
     @GuardedBy("topology.writeLock")
-    private boolean addHost(HostEvent hostEvent) {
+    private boolean addHost(HostData hostData) {
 
         // TODO Decide how to handle update scenario.
-        // If the new HostEvent has less attachment point compared to
-        // existing HostEvent, what should the event be?
-        // - AddHostEvent with some attachment point removed? (current behavior)
+        // If the new HostData has less attachment point compared to
+        // existing HostData, what should the event be?
+        // - Add HostData with some attachment point removed? (current behavior)
 
         // create unfrozen copy
         //  for removing attachment points which already has a link
-        HostEvent modifiedHostEvent = new HostEvent(hostEvent);
+        HostData modifiedHostData = new HostData(hostData);
 
         // Verify each attachment point
         boolean attachmentFound = false;
-        for (SwitchPort swp : hostEvent.getAttachmentPoints()) {
+        for (SwitchPort swp : hostData.getAttachmentPoints()) {
             // XXX domain knowledge: Port must exist before Host
             //      but this knowledge cannot be pushed down to driver.
 
@@ -914,7 +914,7 @@
             Port port = topology.getPort(swp.getDpid(), swp.getPortNumber());
             if (port == null) {
                 log.debug("{} reordered because port {} was not there",
-                          hostEvent, swp);
+                          hostData, swp);
                 // Reordered event
                 return false; // should not continue if re-applying later
             }
@@ -924,11 +924,11 @@
                 log.warn("Link (Out:{},In:{}) exist on the attachment point. "
                         + "Ignoring this attachmentpoint ({}) from {}.",
                         port.getOutgoingLink(), port.getIncomingLink(),
-                        swp, modifiedHostEvent);
-                // FIXME Should either reject, reorder this HostEvent,
-                //       or remove attachment point from given HostEvent
-                // Removing attachment point from given HostEvent for now.
-                modifiedHostEvent.removeAttachmentPoint(swp);
+                        swp, modifiedHostData);
+                // FIXME Should either reject, reorder this HostData,
+                //       or remove attachment point from given HostData
+                // Removing attachment point from given HostData for now.
+                modifiedHostData.removeAttachmentPoint(swp);
                 continue;
             }
 
@@ -937,25 +937,25 @@
 
         // Update the host in the topology
         if (attachmentFound) {
-            if (modifiedHostEvent.getAttachmentPoints().isEmpty()) {
+            if (modifiedHostData.getAttachmentPoints().isEmpty()) {
                 log.warn("No valid attachment point left. Ignoring."
                         + "original: {}, modified: {}",
-                         hostEvent, modifiedHostEvent);
+                         hostData, modifiedHostData);
                 // TODO Should we call #removeHost to trigger remove event?
                 //      only if this call is update.
                 return false;
             }
 
             if (log.isDebugEnabled()) {
-                HostEvent host = topology.getHostEvent(hostEvent.getMac());
+                HostData host = topology.getHostData(hostData.getMac());
                 if (host != null) {
-                    log.debug("Update {}", modifiedHostEvent);
+                    log.debug("Update {}", modifiedHostData);
                 } else {
-                    log.debug("Added {}", modifiedHostEvent);
+                    log.debug("Added {}", modifiedHostData);
                 }
             }
-            topology.putHost(modifiedHostEvent.freeze());
-            apiAddedHostEvents.add(modifiedHostEvent);
+            topology.putHost(modifiedHostData.freeze());
+            apiAddedHostDataEntries.add(modifiedHostData);
             return true;
         }
         return false;
@@ -966,20 +966,20 @@
      * <p/>
      * TODO: Host-related work is incomplete.
      *
-     * @param hostEvent the Host Event with the host to remove.
+     * @param hostData the Host Event with the host to remove.
      */
     @GuardedBy("topology.writeLock")
-    private void removeHost(HostEvent hostEvent) {
+    private void removeHost(HostData hostData) {
 
-        final MACAddress mac = hostEvent.getMac();
-        HostEvent hostInTopo = topology.getHostEvent(mac);
+        final MACAddress mac = hostData.getMac();
+        HostData hostInTopo = topology.getHostData(mac);
         if (hostInTopo == null) {
-            log.warn("Host {} already removed, ignoring", hostEvent);
+            log.warn("Host {} already removed, ignoring", hostData);
             return;
         }
 
         log.debug("Removed {}", hostInTopo);
         topology.removeHost(mac);
-        apiRemovedHostEvents.add(hostInTopo);
+        apiRemovedHostDataEntries.add(hostInTopo);
     }
 }
diff --git a/src/main/java/net/onrc/onos/core/topology/TopologyPublisher.java b/src/main/java/net/onrc/onos/core/topology/TopologyPublisher.java
index ff05cc3..e2bdb77 100644
--- a/src/main/java/net/onrc/onos/core/topology/TopologyPublisher.java
+++ b/src/main/java/net/onrc/onos/core/topology/TopologyPublisher.java
@@ -101,14 +101,14 @@
     //
     private ConcurrentMap<Dpid, MastershipEvent> publishedMastershipEvents =
         new ConcurrentHashMap<>();
-    private ConcurrentMap<Dpid, SwitchEvent> publishedSwitchEvents =
+    private ConcurrentMap<Dpid, SwitchData> publishedSwitchDataEntries =
         new ConcurrentHashMap<>();
-    private ConcurrentMap<Dpid, ConcurrentMap<ByteBuffer, PortEvent>>
-        publishedPortEvents = new ConcurrentHashMap<>();
-    private ConcurrentMap<Dpid, ConcurrentMap<ByteBuffer, LinkEvent>>
-        publishedLinkEvents = new ConcurrentHashMap<>();
-    private ConcurrentMap<Dpid, ConcurrentMap<ByteBuffer, HostEvent>>
-        publishedHostEvents = new ConcurrentHashMap<>();
+    private ConcurrentMap<Dpid, ConcurrentMap<ByteBuffer, PortData>>
+        publishedPortDataEntries = new ConcurrentHashMap<>();
+    private ConcurrentMap<Dpid, ConcurrentMap<ByteBuffer, LinkData>>
+        publishedLinkDataEntries = new ConcurrentHashMap<>();
+    private ConcurrentMap<Dpid, ConcurrentMap<ByteBuffer, HostData>>
+        publishedHostDataEntries = new ConcurrentHashMap<>();
 
     private BlockingQueue<TopologyBatchOperation> delayedOperations =
         new LinkedBlockingQueue<>();
@@ -195,8 +195,8 @@
                 log.debug("Got control to set switch {} INACTIVE",
                         HexString.toHexString(dpid));
 
-                SwitchEvent switchEvent = new SwitchEvent(new Dpid(dpid));
-                publishRemoveSwitchEvent(switchEvent);
+                SwitchData switchData = new SwitchData(new Dpid(dpid));
+                publishRemoveSwitchEvent(switchData);
                 registryService.releaseControl(dpid);
             }
         }
@@ -246,8 +246,8 @@
                             switch (oper) {
                             case ADD:
                                 TopologyEvent topologyEvent = boe.getTarget();
-                                LinkEvent linkEvent =
-                                    topologyEvent.getLinkEvent();
+                                LinkData linkData =
+                                    topologyEvent.getLinkData();
                                 //
                                 // Test whether the Link Event still can be
                                 // published.
@@ -256,19 +256,19 @@
                                 // removed in the middle of checking, we might
                                 // incorrectly publish it again from here.
                                 //
-                                if (linkEvent == null) {
+                                if (linkData == null) {
                                     break;
                                 }
-                                ConcurrentMap<ByteBuffer, LinkEvent>
-                                    linkEvents = publishedLinkEvents.get(
-                                                linkEvent.getDst().getDpid());
-                                if (linkEvents == null) {
+                                ConcurrentMap<ByteBuffer, LinkData>
+                                    linkDataEntries = publishedLinkDataEntries.get(
+                                                linkData.getDst().getDpid());
+                                if (linkDataEntries == null) {
                                     break;
                                 }
-                                if (linkEvents.get(linkEvent.getIDasByteBuffer()) == null) {
+                                if (linkDataEntries.get(linkData.getIDasByteBuffer()) == null) {
                                     break;
                                 }
-                                publishAddLinkEvent(linkEvent);
+                                publishAddLinkEvent(linkData);
                                 break;
                             case REMOVE:
                                 break;
@@ -288,38 +288,38 @@
 
     @Override
     public void linkAdded(Link link) {
-        LinkEvent linkEvent = new LinkEvent(
+        LinkData linkData = new LinkData(
                 new SwitchPort(link.getSrc(), link.getSrcPort()),
                 new SwitchPort(link.getDst(), link.getDstPort()));
 
         // FIXME should be merging, with existing attrs, etc..
         // TODO define attr name as constant somewhere.
         // TODO populate appropriate attributes.
-        linkEvent.createStringAttribute(TopologyElement.TYPE,
+        linkData.createStringAttribute(TopologyElement.TYPE,
                 TopologyElement.TYPE_PACKET_LAYER);
-        linkEvent.createStringAttribute(TopologyElement.ELEMENT_CONFIG_STATE,
+        linkData.createStringAttribute(TopologyElement.ELEMENT_CONFIG_STATE,
                 ConfigState.NOT_CONFIGURED.toString());
-        linkEvent.createStringAttribute(TopologyElement.ELEMENT_ADMIN_STATUS,
+        linkData.createStringAttribute(TopologyElement.ELEMENT_ADMIN_STATUS,
                 AdminStatus.ACTIVE.toString());
-        linkEvent.freeze();
+        linkData.freeze();
 
-        publishAddLinkEvent(linkEvent);
+        publishAddLinkEvent(linkData);
     }
 
     @Override
     public void linkRemoved(Link link) {
-        LinkEvent linkEvent = new LinkEvent(
+        LinkData linkData = new LinkData(
                 new SwitchPort(link.getSrc(), link.getSrcPort()),
                 new SwitchPort(link.getDst(), link.getDstPort()));
 
         // FIXME should be merging, with existing attrs, etc..
         // TODO define attr name as constant somewhere.
         // TODO populate appropriate attributes.
-        linkEvent.createStringAttribute(TopologyElement.TYPE,
+        linkData.createStringAttribute(TopologyElement.TYPE,
                 TopologyElement.TYPE_PACKET_LAYER);
-        linkEvent.freeze();
+        linkData.freeze();
 
-        publishRemoveLinkEvent(linkEvent);
+        publishRemoveLinkEvent(linkData);
     }
 
     /* *****************
@@ -337,39 +337,39 @@
 
         controllerRoleChanged(dpid, Role.MASTER);
 
-        SwitchEvent switchEvent = new SwitchEvent(dpid);
+        SwitchData switchData = new SwitchData(dpid);
         // FIXME should be merging, with existing attrs, etc..
         // TODO define attr name as constant somewhere.
         // TODO populate appropriate attributes.
-        switchEvent.createStringAttribute(TopologyElement.TYPE,
+        switchData.createStringAttribute(TopologyElement.TYPE,
                 TopologyElement.TYPE_PACKET_LAYER);
-        switchEvent.createStringAttribute("ConnectedSince",
+        switchData.createStringAttribute("ConnectedSince",
                 sw.getConnectedSince().toString());
-        switchEvent.createStringAttribute(TopologyElement.ELEMENT_CONFIG_STATE,
+        switchData.createStringAttribute(TopologyElement.ELEMENT_CONFIG_STATE,
                 ConfigState.NOT_CONFIGURED.toString());
-        switchEvent.createStringAttribute(TopologyElement.ELEMENT_ADMIN_STATUS,
+        switchData.createStringAttribute(TopologyElement.ELEMENT_ADMIN_STATUS,
                 AdminStatus.ACTIVE.toString());
-        switchEvent.freeze();
+        switchData.freeze();
         // The Port events
-        List<PortEvent> portEvents = new ArrayList<PortEvent>();
+        List<PortData> portDataEntries = new ArrayList<PortData>();
         for (OFPortDesc port : sw.getPorts()) {
-            PortEvent portEvent = new PortEvent(dpid,
+            PortData portData = new PortData(dpid,
                                                 PortNumberUtils.openFlow(port));
             // FIXME should be merging, with existing attrs, etc..
             // TODO define attr name as constant somewhere.
             // TODO populate appropriate attributes.
-            portEvent.createStringAttribute("name", port.getName());
-            portEvent.createStringAttribute(TopologyElement.TYPE,
+            portData.createStringAttribute("name", port.getName());
+            portData.createStringAttribute(TopologyElement.TYPE,
                     TopologyElement.TYPE_PACKET_LAYER);
-            portEvent.createStringAttribute(TopologyElement.ELEMENT_CONFIG_STATE,
+            portData.createStringAttribute(TopologyElement.ELEMENT_CONFIG_STATE,
                     ConfigState.NOT_CONFIGURED.toString());
-            portEvent.createStringAttribute(TopologyElement.ELEMENT_ADMIN_STATUS,
+            portData.createStringAttribute(TopologyElement.ELEMENT_ADMIN_STATUS,
                     AdminStatus.ACTIVE.toString());
 
-            portEvent.freeze();
-            portEvents.add(portEvent);
+            portData.freeze();
+            portDataEntries.add(portData);
         }
-        publishAddSwitchEvent(switchEvent, portEvents);
+        publishAddSwitchEvent(switchData, portDataEntries);
     }
 
     @Override
@@ -443,17 +443,17 @@
      */
     private void switchPortAdded(long switchId, OFPortDesc port) {
         final Dpid dpid = new Dpid(switchId);
-        final PortEvent portEvent = new PortEvent(dpid,
+        final PortData portData = new PortData(dpid,
                                         PortNumberUtils.openFlow(port));
         // FIXME should be merging, with existing attrs, etc..
         // TODO define attr name as constant somewhere.
         // TODO populate appropriate attributes.
-        portEvent.createStringAttribute(TopologyElement.TYPE,
+        portData.createStringAttribute(TopologyElement.TYPE,
                 TopologyElement.TYPE_PACKET_LAYER);
-        portEvent.createStringAttribute("name", port.getName());
-        portEvent.freeze();
+        portData.createStringAttribute("name", port.getName());
+        portData.freeze();
 
-        publishAddPortEvent(portEvent);
+        publishAddPortEvent(portData);
     }
 
     /**
@@ -465,17 +465,17 @@
     private void switchPortRemoved(long switchId, OFPortDesc port) {
         final Dpid dpid = new Dpid(switchId);
 
-        final PortEvent portEvent = new PortEvent(dpid,
+        final PortData portData = new PortData(dpid,
                                         PortNumberUtils.openFlow(port));
         // FIXME should be merging, with existing attrs, etc..
         // TODO define attr name as constant somewhere.
         // TODO populate appropriate attributes.
-        portEvent.createStringAttribute(TopologyElement.TYPE,
+        portData.createStringAttribute(TopologyElement.TYPE,
                 TopologyElement.TYPE_PACKET_LAYER);
-        portEvent.createStringAttribute("name", port.getName());
-        portEvent.freeze();
+        portData.createStringAttribute("name", port.getName());
+        portData.freeze();
 
-        publishRemovePortEvent(portEvent);
+        publishRemovePortEvent(portData);
     }
 
     @Override
@@ -573,13 +573,13 @@
         SwitchPort sp = new SwitchPort(host.getSwitchDPID(), host.getSwitchPort());
         List<SwitchPort> spLists = new ArrayList<SwitchPort>();
         spLists.add(sp);
-        HostEvent event = new HostEvent(host.getMacAddress());
-        event.setAttachmentPoints(spLists);
-        event.setLastSeenTime(host.getLastSeenTimestamp().getTime());
+        HostData hostData = new HostData(host.getMacAddress());
+        hostData.setAttachmentPoints(spLists);
+        hostData.setLastSeenTime(host.getLastSeenTimestamp().getTime());
         // Does not use vlan info now.
-        event.freeze();
+        hostData.freeze();
 
-        publishAddHostEvent(event);
+        publishAddHostEvent(hostData);
     }
 
     @Override
@@ -587,26 +587,26 @@
         log.debug("Host removed with MAC {}", host.getMacAddress());
 
         //
-        // Remove all previously added HostEvent for this MAC address
+        // Remove all previously added HostData for this MAC address
         //
         // TODO: Currently, the caller of hostRemoved() might not include
-        // the correct set of Attachment Points in the HostEvent entry itself.
-        // Also, we might have multiple HostEvent entries for the same
+        // the correct set of Attachment Points in the HostData entry itself.
+        // Also, we might have multiple HostData entries for the same
         // host (MAC address), each containing a single (different) Attachment
         // Point.
-        // Hence, here we have to cleanup all HostEvent entries for this
+        // Hence, here we have to cleanup all HostData entries for this
         // particular host, based on its MAC address.
         //
-        List<HostEvent> removeHostEvents = new LinkedList<>();
-        for (ConcurrentMap<ByteBuffer, HostEvent> cm : publishedHostEvents.values()) {
-            for (HostEvent hostEvent : cm.values()) {
-                if (hostEvent.getMac().equals(host.getMacAddress())) {
-                    removeHostEvents.add(hostEvent);
+        List<HostData> removeHostDataEntries = new LinkedList<>();
+        for (ConcurrentMap<ByteBuffer, HostData> cm : publishedHostDataEntries.values()) {
+            for (HostData hostData : cm.values()) {
+                if (hostData.getMac().equals(host.getMacAddress())) {
+                    removeHostDataEntries.add(hostData);
                 }
             }
         }
-        for (HostEvent event : removeHostEvents) {
-            publishRemoveHostEvent(event);
+        for (HostData hostData : removeHostDataEntries) {
+            publishRemoveHostEvent(hostData);
         }
     }
 
@@ -676,66 +676,66 @@
     /**
      * Publishes ADD Switch Event.
      *
-     * @param switchEvent the switch event to publish
-     * @param portEvents the corresponding port events for the switch to
+     * @param switchData the switch event to publish
+     * @param portDataEntries the corresponding port events for the switch to
      * publish
      */
-    private void publishAddSwitchEvent(SwitchEvent switchEvent,
-                                       Collection<PortEvent> portEvents) {
-        if (!registryService.hasControl(switchEvent.getOriginDpid().value())) {
+    private void publishAddSwitchEvent(SwitchData switchData,
+                                       Collection<PortData> portDataEntries) {
+        if (!registryService.hasControl(switchData.getOriginDpid().value())) {
             log.debug("Not the master for switch {}. Suppressed switch add event {}.",
-                      switchEvent.getOriginDpid(), switchEvent);
+                      switchData.getOriginDpid(), switchData);
             return;
         }
 
         // Keep track of the old Port Events that should be removed
-        ConcurrentMap<ByteBuffer, PortEvent> oldPortEvents =
-            publishedPortEvents.get(switchEvent.getDpid());
-        if (oldPortEvents == null) {
-            oldPortEvents = new ConcurrentHashMap<>();
+        ConcurrentMap<ByteBuffer, PortData> oldPortDataEntries =
+            publishedPortDataEntries.get(switchData.getDpid());
+        if (oldPortDataEntries == null) {
+            oldPortDataEntries = new ConcurrentHashMap<>();
         }
 
         // Publish the information for the switch
         TopologyBatchOperation tbo = new TopologyBatchOperation();
         TopologyEvent topologyEvent =
-            new TopologyEvent(switchEvent, getOnosInstanceId());
+            new TopologyEvent(switchData, getOnosInstanceId());
         tbo.appendAddOperation(topologyEvent);
 
         // Publish the information for each port
-        ConcurrentMap<ByteBuffer, PortEvent> newPortEvents =
+        ConcurrentMap<ByteBuffer, PortData> newPortDataEntries =
             new ConcurrentHashMap<>();
-        for (PortEvent portEvent : portEvents) {
+        for (PortData portData : portDataEntries) {
             topologyEvent =
-                new TopologyEvent(portEvent, getOnosInstanceId());
+                new TopologyEvent(portData, getOnosInstanceId());
             tbo.appendAddOperation(topologyEvent);
 
-            ByteBuffer id = portEvent.getIDasByteBuffer();
-            newPortEvents.put(id, portEvent);
-            oldPortEvents.remove(id);
+            ByteBuffer id = portData.getIDasByteBuffer();
+            newPortDataEntries.put(id, portData);
+            oldPortDataEntries.remove(id);
         }
         publishTopologyOperations(tbo);
-        publishedSwitchEvents.put(switchEvent.getDpid(), switchEvent);
-        publishedPortEvents.put(switchEvent.getDpid(), newPortEvents);
+        publishedSwitchDataEntries.put(switchData.getDpid(), switchData);
+        publishedPortDataEntries.put(switchData.getDpid(), newPortDataEntries);
 
         // Cleanup for each of the old removed port
-        for (PortEvent portEvent : oldPortEvents.values()) {
-            publishRemovePortEvent(portEvent);
+        for (PortData portData : oldPortDataEntries.values()) {
+            publishRemovePortEvent(portData);
         }
     }
 
     /**
      * Publishes REMOVE Switch Event.
      *
-     * @param switchEvent the switch event to publish
+     * @param switchData the switch event to publish
      */
-    private void publishRemoveSwitchEvent(SwitchEvent switchEvent) {
+    private void publishRemoveSwitchEvent(SwitchData switchData) {
         //
         // TODO: Removed the check for now, because currently this method is
         // also called by the SwitchCleanup thread, and in that case
         // the Switch Event was published by some other ONOS instance.
         //
         /*
-        if (publishedSwitchEvents.get(switchEvent.getDpid()) == null) {
+        if (publishedSwitchDataEntries.get(switchData.getDpid()) == null) {
             return;     // Nothing to do
         }
         */
@@ -743,210 +743,210 @@
         // Publish the information
         TopologyBatchOperation tbo = new TopologyBatchOperation();
         TopologyEvent topologyEvent =
-            new TopologyEvent(switchEvent, getOnosInstanceId());
+            new TopologyEvent(switchData, getOnosInstanceId());
         tbo.appendRemoveOperation(topologyEvent);
         publishTopologyOperations(tbo);
-        publishedSwitchEvents.remove(switchEvent.getDpid());
+        publishedSwitchDataEntries.remove(switchData.getDpid());
 
         // Cleanup for each port
-        ConcurrentMap<ByteBuffer, PortEvent> portEvents =
-            publishedPortEvents.get(switchEvent.getDpid());
-        if (portEvents != null) {
-            for (PortEvent portEvent : portEvents.values()) {
-                publishRemovePortEvent(portEvent);
+        ConcurrentMap<ByteBuffer, PortData> portDataEntries =
+            publishedPortDataEntries.get(switchData.getDpid());
+        if (portDataEntries != null) {
+            for (PortData portData : portDataEntries.values()) {
+                publishRemovePortEvent(portData);
             }
         }
 
-        publishedPortEvents.remove(switchEvent.getDpid());
-        publishedLinkEvents.remove(switchEvent.getDpid());
-        publishedHostEvents.remove(switchEvent.getDpid());
+        publishedPortDataEntries.remove(switchData.getDpid());
+        publishedLinkDataEntries.remove(switchData.getDpid());
+        publishedHostDataEntries.remove(switchData.getDpid());
     }
 
     /**
      * Publishes ADD Port Event.
      *
-     * @param portEvent the port event to publish
+     * @param portData the port event to publish
      */
-    private void publishAddPortEvent(PortEvent portEvent) {
-        if (!registryService.hasControl(portEvent.getOriginDpid().value())) {
+    private void publishAddPortEvent(PortData portData) {
+        if (!registryService.hasControl(portData.getOriginDpid().value())) {
             log.debug("Not the master for switch {}. Suppressed port add event {}.",
-                      portEvent.getOriginDpid(), portEvent);
+                      portData.getOriginDpid(), portData);
             return;
         }
 
         // Publish the information
         TopologyBatchOperation tbo = new TopologyBatchOperation();
         TopologyEvent topologyEvent =
-            new TopologyEvent(portEvent, getOnosInstanceId());
+            new TopologyEvent(portData, getOnosInstanceId());
         tbo.appendAddOperation(topologyEvent);
         publishTopologyOperations(tbo);
 
         // Store the new Port Event in the local cache
-        ConcurrentMap<ByteBuffer, PortEvent> portEvents =
-            ConcurrentUtils.putIfAbsent(publishedPortEvents,
-                        portEvent.getDpid(),
-                        new ConcurrentHashMap<ByteBuffer, PortEvent>());
-        portEvents.put(portEvent.getIDasByteBuffer(), portEvent);
+        ConcurrentMap<ByteBuffer, PortData> portDataEntries =
+            ConcurrentUtils.putIfAbsent(publishedPortDataEntries,
+                        portData.getDpid(),
+                        new ConcurrentHashMap<ByteBuffer, PortData>());
+        portDataEntries.put(portData.getIDasByteBuffer(), portData);
     }
 
     /**
      * Publishes REMOVE Port Event.
      *
-     * @param portEvent the port event to publish
+     * @param portData the port event to publish
      */
-    private void publishRemovePortEvent(PortEvent portEvent) {
-        ConcurrentMap<ByteBuffer, PortEvent> portEvents =
-            publishedPortEvents.get(portEvent.getDpid());
-        if (portEvents == null) {
+    private void publishRemovePortEvent(PortData portData) {
+        ConcurrentMap<ByteBuffer, PortData> portDataEntries =
+            publishedPortDataEntries.get(portData.getDpid());
+        if (portDataEntries == null) {
             return;     // Nothing to do
         }
-        if (portEvents.get(portEvent.getIDasByteBuffer()) == null) {
+        if (portDataEntries.get(portData.getIDasByteBuffer()) == null) {
             return;     // Nothing to do
         }
 
         // Publish the information
         TopologyBatchOperation tbo = new TopologyBatchOperation();
         TopologyEvent topologyEvent =
-            new TopologyEvent(portEvent, getOnosInstanceId());
+            new TopologyEvent(portData, getOnosInstanceId());
         tbo.appendRemoveOperation(topologyEvent);
         publishTopologyOperations(tbo);
 
         // Cleanup for the incoming link(s)
-        ConcurrentMap<ByteBuffer, LinkEvent> linkEvents =
-            publishedLinkEvents.get(portEvent.getDpid());
-        if (linkEvents != null) {
-            for (LinkEvent linkEvent : linkEvents.values()) {
-                if (linkEvent.getDst().equals(portEvent.getSwitchPort())) {
-                    publishRemoveLinkEvent(linkEvent);
+        ConcurrentMap<ByteBuffer, LinkData> linkDataEntries =
+            publishedLinkDataEntries.get(portData.getDpid());
+        if (linkDataEntries != null) {
+            for (LinkData linkData : linkDataEntries.values()) {
+                if (linkData.getDst().equals(portData.getSwitchPort())) {
+                    publishRemoveLinkEvent(linkData);
                 }
             }
         }
 
         // Cleanup for the connected hosts
-        ConcurrentMap<ByteBuffer, HostEvent> hostEvents =
-            publishedHostEvents.get(portEvent.getDpid());
-        if (hostEvents != null) {
-            for (HostEvent hostEvent : hostEvents.values()) {
-                for (SwitchPort swp : hostEvent.getAttachmentPoints()) {
-                    if (swp.equals(portEvent.getSwitchPort())) {
-                        publishRemoveHostEvent(hostEvent);
+        ConcurrentMap<ByteBuffer, HostData> hostDataEntries =
+            publishedHostDataEntries.get(portData.getDpid());
+        if (hostDataEntries != null) {
+            for (HostData hostData : hostDataEntries.values()) {
+                for (SwitchPort swp : hostData.getAttachmentPoints()) {
+                    if (swp.equals(portData.getSwitchPort())) {
+                        publishRemoveHostEvent(hostData);
                     }
                 }
             }
         }
 
-        portEvents.remove(portEvent.getIDasByteBuffer());
+        portDataEntries.remove(portData.getIDasByteBuffer());
     }
 
     /**
      * Publishes ADD Link Event.
      *
-     * @param linkEvent the link event to publish
+     * @param linkData the link event to publish
      */
-    private void publishAddLinkEvent(LinkEvent linkEvent) {
-        if (!registryService.hasControl(linkEvent.getOriginDpid().value())) {
+    private void publishAddLinkEvent(LinkData linkData) {
+        if (!registryService.hasControl(linkData.getOriginDpid().value())) {
             log.debug("Not the master for dst switch {}. Suppressed link add event {}.",
-                      linkEvent.getOriginDpid(), linkEvent);
+                      linkData.getOriginDpid(), linkData);
             return;
         }
 
         // Publish the information
         TopologyBatchOperation tbo = new TopologyBatchOperation();
         TopologyEvent topologyEvent =
-            new TopologyEvent(linkEvent, getOnosInstanceId());
+            new TopologyEvent(linkData, getOnosInstanceId());
         tbo.appendAddOperation(topologyEvent);
         publishTopologyOperations(tbo);
 
         // Store the new Link Event in the local cache
-        ConcurrentMap<ByteBuffer, LinkEvent> linkEvents =
-            ConcurrentUtils.putIfAbsent(publishedLinkEvents,
-                        linkEvent.getDst().getDpid(),
-                        new ConcurrentHashMap<ByteBuffer, LinkEvent>());
-        linkEvents.put(linkEvent.getIDasByteBuffer(), linkEvent);
+        ConcurrentMap<ByteBuffer, LinkData> linkDataEntries =
+            ConcurrentUtils.putIfAbsent(publishedLinkDataEntries,
+                        linkData.getDst().getDpid(),
+                        new ConcurrentHashMap<ByteBuffer, LinkData>());
+        linkDataEntries.put(linkData.getIDasByteBuffer(), linkData);
     }
 
     /**
      * Publishes REMOVE Link Event.
      *
-     * @param linkEvent the link event to publish
+     * @param linkData the link event to publish
      */
-    private void publishRemoveLinkEvent(LinkEvent linkEvent) {
-        ConcurrentMap<ByteBuffer, LinkEvent> linkEvents =
-            publishedLinkEvents.get(linkEvent.getDst().getDpid());
-        if (linkEvents == null) {
+    private void publishRemoveLinkEvent(LinkData linkData) {
+        ConcurrentMap<ByteBuffer, LinkData> linkDataEntries =
+            publishedLinkDataEntries.get(linkData.getDst().getDpid());
+        if (linkDataEntries == null) {
             return;     // Nothing to do
         }
-        if (linkEvents.get(linkEvent.getIDasByteBuffer()) == null) {
+        if (linkDataEntries.get(linkData.getIDasByteBuffer()) == null) {
             return;     // Nothing to do
         }
 
         // Publish the information
         TopologyBatchOperation tbo = new TopologyBatchOperation();
         TopologyEvent topologyEvent =
-            new TopologyEvent(linkEvent, getOnosInstanceId());
+            new TopologyEvent(linkData, getOnosInstanceId());
         tbo.appendRemoveOperation(topologyEvent);
         publishTopologyOperations(tbo);
 
-        linkEvents.remove(linkEvent.getIDasByteBuffer());
+        linkDataEntries.remove(linkData.getIDasByteBuffer());
     }
 
     /**
      * Publishes ADD Host Event.
      *
-     * @param hostEvent the host event to publish
+     * @param hostData the host event to publish
      */
-    private void publishAddHostEvent(HostEvent hostEvent) {
+    private void publishAddHostEvent(HostData hostData) {
         //
         // NOTE: The implementation below assumes that there is just one
-        // attachment point stored in hostEvent. Currently, this assumption
+        // attachment point stored in hostData. Currently, this assumption
         // is true based on the existing implementation of the caller
         // hostAdded().
         //
 
-        if (!registryService.hasControl(hostEvent.getOriginDpid().value())) {
+        if (!registryService.hasControl(hostData.getOriginDpid().value())) {
             log.debug("Not the master for attachment switch {}. Suppressed host add event {}.",
-                      hostEvent.getOriginDpid(), hostEvent);
+                      hostData.getOriginDpid(), hostData);
             return;
         }
 
         // Publish the information
         TopologyBatchOperation tbo = new TopologyBatchOperation();
         TopologyEvent topologyEvent =
-            new TopologyEvent(hostEvent, getOnosInstanceId());
+            new TopologyEvent(hostData, getOnosInstanceId());
         tbo.appendAddOperation(topologyEvent);
         publishTopologyOperations(tbo);
 
         // Store the new Host Event in the local cache
-        ConcurrentMap<ByteBuffer, HostEvent> hostEvents =
-            ConcurrentUtils.putIfAbsent(publishedHostEvents,
-                hostEvent.getOriginDpid(),
-                new ConcurrentHashMap<ByteBuffer, HostEvent>());
-        hostEvents.put(hostEvent.getIDasByteBuffer(), hostEvent);
+        ConcurrentMap<ByteBuffer, HostData> hostDataEntries =
+            ConcurrentUtils.putIfAbsent(publishedHostDataEntries,
+                hostData.getOriginDpid(),
+                new ConcurrentHashMap<ByteBuffer, HostData>());
+        hostDataEntries.put(hostData.getIDasByteBuffer(), hostData);
     }
 
     /**
      * Publishes REMOVE Host Event.
      *
-     * @param hostEvent the host event to publish
+     * @param hostData the host event to publish
      */
-    private void publishRemoveHostEvent(HostEvent hostEvent) {
-        ConcurrentMap<ByteBuffer, HostEvent> hostEvents =
-            publishedHostEvents.get(hostEvent.getOriginDpid());
-        if (hostEvents == null) {
+    private void publishRemoveHostEvent(HostData hostData) {
+        ConcurrentMap<ByteBuffer, HostData> hostDataEntries =
+            publishedHostDataEntries.get(hostData.getOriginDpid());
+        if (hostDataEntries == null) {
             return;     // Nothing to do
         }
-        if (hostEvents.get(hostEvent.getIDasByteBuffer()) == null) {
+        if (hostDataEntries.get(hostData.getIDasByteBuffer()) == null) {
             return;     // Nothing to do
         }
 
         // Publish the information
         TopologyBatchOperation tbo = new TopologyBatchOperation();
         TopologyEvent topologyEvent =
-            new TopologyEvent(hostEvent, getOnosInstanceId());
+            new TopologyEvent(hostData, getOnosInstanceId());
         tbo.appendRemoveOperation(topologyEvent);
         publishTopologyOperations(tbo);
 
-        hostEvents.remove(hostEvent.getIDasByteBuffer());
+        hostDataEntries.remove(hostData.getIDasByteBuffer());
     }
 
     /**
diff --git a/src/main/java/net/onrc/onos/core/topology/web/serializers/HostEventSerializer.java b/src/main/java/net/onrc/onos/core/topology/web/serializers/HostDataSerializer.java
similarity index 69%
rename from src/main/java/net/onrc/onos/core/topology/web/serializers/HostEventSerializer.java
rename to src/main/java/net/onrc/onos/core/topology/web/serializers/HostDataSerializer.java
index cfb1247..7099c83 100644
--- a/src/main/java/net/onrc/onos/core/topology/web/serializers/HostEventSerializer.java
+++ b/src/main/java/net/onrc/onos/core/topology/web/serializers/HostDataSerializer.java
@@ -3,7 +3,7 @@
 import java.io.IOException;
 import java.util.Map.Entry;
 
-import net.onrc.onos.core.topology.HostEvent;
+import net.onrc.onos.core.topology.HostData;
 import net.onrc.onos.core.topology.TopologyElement;
 import net.onrc.onos.core.util.SwitchPort;
 
@@ -12,26 +12,26 @@
 import org.codehaus.jackson.map.ser.std.SerializerBase;
 
 /**
- * JSON serializer for HostEvent objects.
+ * JSON serializer for HostData objects.
  */
-public class HostEventSerializer extends SerializerBase<HostEvent> {
+public class HostDataSerializer extends SerializerBase<HostData> {
     /**
      * Default constructor.
      */
-    public HostEventSerializer() {
-        super(HostEvent.class);
+    public HostDataSerializer() {
+        super(HostData.class);
     }
 
     /**
-     * Serializes a HostEvent object in JSON.
+     * Serializes a HostData object in JSON.
      *
-     * @param hostEvent the HostEvent that is being converted to JSON
+     * @param hostData the HostData that is being converted to JSON
      * @param jsonGenerator generator to place the serialized JSON into
      * @param serializerProvider unused but required for method override
      * @throws IOException if the JSON serialization process fails
      */
     @Override
-    public void serialize(HostEvent hostEvent, JsonGenerator jsonGenerator,
+    public void serialize(HostData hostData, JsonGenerator jsonGenerator,
                           SerializerProvider serializerProvider)
         throws IOException {
 
@@ -42,16 +42,16 @@
         //
 
         jsonGenerator.writeStartObject();
-        jsonGenerator.writeStringField(TopologyElement.TYPE, hostEvent.getType());
-        jsonGenerator.writeStringField("mac", hostEvent.getMac().toString());
+        jsonGenerator.writeStringField(TopologyElement.TYPE, hostData.getType());
+        jsonGenerator.writeStringField("mac", hostData.getMac().toString());
         jsonGenerator.writeFieldName("attachmentPoints");
         jsonGenerator.writeStartArray();
-        for (SwitchPort switchPort : hostEvent.getAttachmentPoints()) {
+        for (SwitchPort switchPort : hostData.getAttachmentPoints()) {
             jsonGenerator.writeObject(switchPort);
         }
         jsonGenerator.writeEndArray();
         jsonGenerator.writeObjectFieldStart("stringAttributes");
-        for (Entry<String, String> entry : hostEvent.getAllStringAttributes().entrySet()) {
+        for (Entry<String, String> entry : hostData.getAllStringAttributes().entrySet()) {
             jsonGenerator.writeStringField(entry.getKey(), entry.getValue());
         }
         jsonGenerator.writeEndObject();         // stringAttributes
diff --git a/src/main/java/net/onrc/onos/core/topology/web/serializers/HostSerializer.java b/src/main/java/net/onrc/onos/core/topology/web/serializers/HostSerializer.java
index b979922..b0f7824 100644
--- a/src/main/java/net/onrc/onos/core/topology/web/serializers/HostSerializer.java
+++ b/src/main/java/net/onrc/onos/core/topology/web/serializers/HostSerializer.java
@@ -36,7 +36,7 @@
 
         //
         // TODO: For now, the JSON format of the serialized output should
-        // be same as the JSON format of the corresponding class HostEvent.
+        // be same as the JSON format of the corresponding class HostData.
         // In the future, we will use a single serializer.
         //
 
@@ -51,7 +51,7 @@
         jsonGenerator.writeEndArray();
         //
         // NOTE: Class Host itself doesn't have stringAttributes.
-        // Adding empty object for now for consistency with HostEventSerializer
+        // Adding empty object for now for consistency with HostDataSerializer
         //
         jsonGenerator.writeObjectFieldStart("stringAttributes");
         /*
diff --git a/src/main/java/net/onrc/onos/core/topology/web/serializers/LinkEventSerializer.java b/src/main/java/net/onrc/onos/core/topology/web/serializers/LinkDataSerializer.java
similarity index 68%
rename from src/main/java/net/onrc/onos/core/topology/web/serializers/LinkEventSerializer.java
rename to src/main/java/net/onrc/onos/core/topology/web/serializers/LinkDataSerializer.java
index f57db5c..028f33b 100644
--- a/src/main/java/net/onrc/onos/core/topology/web/serializers/LinkEventSerializer.java
+++ b/src/main/java/net/onrc/onos/core/topology/web/serializers/LinkDataSerializer.java
@@ -3,7 +3,7 @@
 import java.io.IOException;
 import java.util.Map.Entry;
 
-import net.onrc.onos.core.topology.LinkEvent;
+import net.onrc.onos.core.topology.LinkData;
 import net.onrc.onos.core.topology.TopologyElement;
 
 import org.codehaus.jackson.JsonGenerator;
@@ -11,26 +11,26 @@
 import org.codehaus.jackson.map.ser.std.SerializerBase;
 
 /**
- * JSON serializer for LinkEvents objects.
+ * JSON serializer for LinkData objects.
  */
-public class LinkEventSerializer extends SerializerBase<LinkEvent> {
+public class LinkDataSerializer extends SerializerBase<LinkData> {
     /**
      * Default constructor.
      */
-    public LinkEventSerializer() {
-        super(LinkEvent.class);
+    public LinkDataSerializer() {
+        super(LinkData.class);
     }
 
     /**
-     * Serializes a LinkEvent object in JSON.
+     * Serializes a LinkData object in JSON.
      *
-     * @param linkEvent the LinkEvent that is being converted to JSON
+     * @param linkData the LinkData that is being converted to JSON
      * @param jsonGenerator generator to place the serialized JSON into
      * @param serializerProvider unused but required for method override
      * @throws IOException if the JSON serialization process fails
      */
     @Override
-    public void serialize(final LinkEvent linkEvent,
+    public void serialize(final LinkData linkData,
                           final JsonGenerator jsonGenerator,
                           final SerializerProvider serializerProvider)
         throws IOException {
@@ -42,11 +42,11 @@
         //
 
         jsonGenerator.writeStartObject();
-        jsonGenerator.writeStringField(TopologyElement.TYPE, linkEvent.getType());
-        jsonGenerator.writeObjectField("src", linkEvent.getSrc());
-        jsonGenerator.writeObjectField("dst", linkEvent.getDst());
+        jsonGenerator.writeStringField(TopologyElement.TYPE, linkData.getType());
+        jsonGenerator.writeObjectField("src", linkData.getSrc());
+        jsonGenerator.writeObjectField("dst", linkData.getDst());
         jsonGenerator.writeObjectFieldStart("stringAttributes");
-        for (Entry<String, String> entry : linkEvent.getAllStringAttributes().entrySet()) {
+        for (Entry<String, String> entry : linkData.getAllStringAttributes().entrySet()) {
             jsonGenerator.writeStringField(entry.getKey(), entry.getValue());
         }
         jsonGenerator.writeEndObject();         // stringAttributes
diff --git a/src/main/java/net/onrc/onos/core/topology/web/serializers/LinkSerializer.java b/src/main/java/net/onrc/onos/core/topology/web/serializers/LinkSerializer.java
index bbc08ef..62fd25e 100644
--- a/src/main/java/net/onrc/onos/core/topology/web/serializers/LinkSerializer.java
+++ b/src/main/java/net/onrc/onos/core/topology/web/serializers/LinkSerializer.java
@@ -36,7 +36,7 @@
 
         //
         // TODO: For now, the JSON format of the serialized output should
-        // be same as the JSON format of the corresponding class LinkEvent.
+        // be same as the JSON format of the corresponding class LinkData.
         // In the future, we will use a single serializer.
         //
 
diff --git a/src/main/java/net/onrc/onos/core/topology/web/serializers/PortEventSerializer.java b/src/main/java/net/onrc/onos/core/topology/web/serializers/PortDataSerializer.java
similarity index 69%
rename from src/main/java/net/onrc/onos/core/topology/web/serializers/PortEventSerializer.java
rename to src/main/java/net/onrc/onos/core/topology/web/serializers/PortDataSerializer.java
index 8d81d03..e47c652 100644
--- a/src/main/java/net/onrc/onos/core/topology/web/serializers/PortEventSerializer.java
+++ b/src/main/java/net/onrc/onos/core/topology/web/serializers/PortDataSerializer.java
@@ -3,7 +3,7 @@
 import java.io.IOException;
 import java.util.Map.Entry;
 
-import net.onrc.onos.core.topology.PortEvent;
+import net.onrc.onos.core.topology.PortData;
 import net.onrc.onos.core.topology.TopologyElement;
 
 import org.codehaus.jackson.JsonGenerator;
@@ -11,26 +11,26 @@
 import org.codehaus.jackson.map.ser.std.SerializerBase;
 
 /**
- * JSON serializer for PortEvent objects.
+ * JSON serializer for PortData objects.
  */
-public class PortEventSerializer extends SerializerBase<PortEvent> {
+public class PortDataSerializer extends SerializerBase<PortData> {
     /**
      * Default constructor.
      */
-    public PortEventSerializer() {
-        super(PortEvent.class);
+    public PortDataSerializer() {
+        super(PortData.class);
     }
 
     /**
-     * Serializes a PortEvent object in JSON.
+     * Serializes a PortData object in JSON.
      *
-     * @param portEvent the PortEvent that is being converted to JSON
+     * @param portData the PortData that is being converted to JSON
      * @param jsonGenerator generator to place the serialized JSON into
      * @param serializerProvider unused but required for method override
      * @throws IOException if the JSON serialization process fails
      */
     @Override
-    public void serialize(PortEvent portEvent, JsonGenerator jsonGenerator,
+    public void serialize(PortData portData, JsonGenerator jsonGenerator,
                           SerializerProvider serializerProvider)
         throws IOException {
 
@@ -41,15 +41,15 @@
         //
 
         jsonGenerator.writeStartObject();
-        jsonGenerator.writeStringField(TopologyElement.TYPE, portEvent.getType());
+        jsonGenerator.writeStringField(TopologyElement.TYPE, portData.getType());
         jsonGenerator.writeStringField("state", "ACTIVE");
-        jsonGenerator.writeStringField("dpid", portEvent.getDpid().toString());
+        jsonGenerator.writeStringField("dpid", portData.getDpid().toString());
         jsonGenerator.writeNumberField("portNumber",
-                                       portEvent.getPortNumber().value());
+                                       portData.getPortNumber().value());
         jsonGenerator.writeStringField("desc",
                                        null /* port.getDescription() */);
         jsonGenerator.writeObjectFieldStart("stringAttributes");
-        for (Entry<String, String> entry : portEvent.getAllStringAttributes().entrySet()) {
+        for (Entry<String, String> entry : portData.getAllStringAttributes().entrySet()) {
             jsonGenerator.writeStringField(entry.getKey(), entry.getValue());
         }
         jsonGenerator.writeEndObject();         // stringAttributes
diff --git a/src/main/java/net/onrc/onos/core/topology/web/serializers/PortSerializer.java b/src/main/java/net/onrc/onos/core/topology/web/serializers/PortSerializer.java
index 092336e..7c9b093 100644
--- a/src/main/java/net/onrc/onos/core/topology/web/serializers/PortSerializer.java
+++ b/src/main/java/net/onrc/onos/core/topology/web/serializers/PortSerializer.java
@@ -36,7 +36,7 @@
 
         //
         // TODO: For now, the JSON format of the serialized output should
-        // be same as the JSON format of the corresponding class PortEvent.
+        // be same as the JSON format of the corresponding class PortData.
         // In the future, we will use a single serializer.
         //
 
diff --git a/src/main/java/net/onrc/onos/core/topology/web/serializers/SwitchEventSerializer.java b/src/main/java/net/onrc/onos/core/topology/web/serializers/SwitchDataSerializer.java
similarity index 74%
rename from src/main/java/net/onrc/onos/core/topology/web/serializers/SwitchEventSerializer.java
rename to src/main/java/net/onrc/onos/core/topology/web/serializers/SwitchDataSerializer.java
index a377d4b..0565e08 100644
--- a/src/main/java/net/onrc/onos/core/topology/web/serializers/SwitchEventSerializer.java
+++ b/src/main/java/net/onrc/onos/core/topology/web/serializers/SwitchDataSerializer.java
@@ -3,7 +3,7 @@
 import java.io.IOException;
 import java.util.Map.Entry;
 
-import net.onrc.onos.core.topology.SwitchEvent;
+import net.onrc.onos.core.topology.SwitchData;
 import net.onrc.onos.core.topology.TopologyElement;
 
 import org.codehaus.jackson.JsonGenerator;
@@ -11,26 +11,26 @@
 import org.codehaus.jackson.map.ser.std.SerializerBase;
 
 /**
- * JSON serializer for SwitchEvent objects.
+ * JSON serializer for SwitchData objects.
  */
-public class SwitchEventSerializer extends SerializerBase<SwitchEvent> {
+public class SwitchDataSerializer extends SerializerBase<SwitchData> {
     /**
      * Default constructor.
      */
-    public SwitchEventSerializer() {
-        super(SwitchEvent.class);
+    public SwitchDataSerializer() {
+        super(SwitchData.class);
     }
 
     /**
-     * Serializes a SwitchEvent object in JSON.
+     * Serializes a SwitchData object in JSON.
      *
-     * @param switchEvent the SwitchEvent that is being converted to JSON
+     * @param switchData the SwitchData that is being converted to JSON
      * @param jsonGenerator generator to place the serialized JSON into
      * @param serializerProvider unused but required for method override
      * @throws IOException if the JSON serialization process fails
      */
     @Override
-    public void serialize(SwitchEvent switchEvent, JsonGenerator jsonGenerator,
+    public void serialize(SwitchData switchData, JsonGenerator jsonGenerator,
                           SerializerProvider serializerProvider)
         throws IOException {
 
@@ -41,9 +41,9 @@
         //
 
         jsonGenerator.writeStartObject();
-        jsonGenerator.writeStringField(TopologyElement.TYPE, switchEvent.getType());
+        jsonGenerator.writeStringField(TopologyElement.TYPE, switchData.getType());
         jsonGenerator.writeStringField("dpid",
-                                       switchEvent.getDpid().toString());
+                                       switchData.getDpid().toString());
         jsonGenerator.writeStringField("state", "ACTIVE");
         //
         // TODO: For now, we write empty "ports" array for consistency
@@ -57,7 +57,7 @@
         */
         jsonGenerator.writeEndArray();
         jsonGenerator.writeObjectFieldStart("stringAttributes");
-        for (Entry<String, String> entry : switchEvent.getAllStringAttributes().entrySet()) {
+        for (Entry<String, String> entry : switchData.getAllStringAttributes().entrySet()) {
             jsonGenerator.writeStringField(entry.getKey(), entry.getValue());
         }
         jsonGenerator.writeEndObject();         // stringAttributes
diff --git a/src/main/java/net/onrc/onos/core/topology/web/serializers/SwitchSerializer.java b/src/main/java/net/onrc/onos/core/topology/web/serializers/SwitchSerializer.java
index df331b7..ffe5749 100644
--- a/src/main/java/net/onrc/onos/core/topology/web/serializers/SwitchSerializer.java
+++ b/src/main/java/net/onrc/onos/core/topology/web/serializers/SwitchSerializer.java
@@ -37,7 +37,7 @@
 
         //
         // TODO: For now, the JSON format of the serialized output should
-        // be same as the JSON format of the corresponding class SwitchEvent.
+        // be same as the JSON format of the corresponding class SwitchData.
         // In the future, we will use a single serializer.
         //
 
diff --git a/src/main/java/net/onrc/onos/core/topology/web/serializers/TopologyEventsSerializer.java b/src/main/java/net/onrc/onos/core/topology/web/serializers/TopologyEventsSerializer.java
index b117404..2737ec7 100644
--- a/src/main/java/net/onrc/onos/core/topology/web/serializers/TopologyEventsSerializer.java
+++ b/src/main/java/net/onrc/onos/core/topology/web/serializers/TopologyEventsSerializer.java
@@ -2,11 +2,11 @@
 
 import java.io.IOException;
 
-import net.onrc.onos.core.topology.HostEvent;
-import net.onrc.onos.core.topology.LinkEvent;
+import net.onrc.onos.core.topology.HostData;
+import net.onrc.onos.core.topology.LinkData;
 import net.onrc.onos.core.topology.MastershipEvent;
-import net.onrc.onos.core.topology.PortEvent;
-import net.onrc.onos.core.topology.SwitchEvent;
+import net.onrc.onos.core.topology.PortData;
+import net.onrc.onos.core.topology.SwitchData;
 import net.onrc.onos.core.topology.TopologyEvents;
 import org.codehaus.jackson.JsonGenerator;
 import org.codehaus.jackson.map.SerializerProvider;
@@ -57,57 +57,57 @@
 
         // Output the added switches array
         jsonGenerator.writeArrayFieldStart("addedSwitches");
-        for (final SwitchEvent switchEvent : topologyEvents.getAddedSwitchEvents()) {
-            jsonGenerator.writeObject(switchEvent);
+        for (final SwitchData switchData : topologyEvents.getAddedSwitchDataEntries()) {
+            jsonGenerator.writeObject(switchData);
         }
         jsonGenerator.writeEndArray();
 
         // Output the removed switches array
         jsonGenerator.writeArrayFieldStart("removedSwitches");
-        for (final SwitchEvent switchEvent : topologyEvents.getRemovedSwitchEvents()) {
-            jsonGenerator.writeObject(switchEvent);
+        for (final SwitchData switchData : topologyEvents.getRemovedSwitchDataEntries()) {
+            jsonGenerator.writeObject(switchData);
         }
         jsonGenerator.writeEndArray();
 
         // Output the added ports array
         jsonGenerator.writeArrayFieldStart("addedPorts");
-        for (final PortEvent portEvent : topologyEvents.getAddedPortEvents()) {
-            jsonGenerator.writeObject(portEvent);
+        for (final PortData portData : topologyEvents.getAddedPortDataEntries()) {
+            jsonGenerator.writeObject(portData);
         }
         jsonGenerator.writeEndArray();
 
         // Output the removed ports array
         jsonGenerator.writeArrayFieldStart("removedPorts");
-        for (final PortEvent portEvent : topologyEvents.getRemovedPortEvents()) {
-            jsonGenerator.writeObject(portEvent);
+        for (final PortData portData : topologyEvents.getRemovedPortDataEntries()) {
+            jsonGenerator.writeObject(portData);
         }
         jsonGenerator.writeEndArray();
 
         // Output the added links array
         jsonGenerator.writeArrayFieldStart("addedLinks");
-        for (final LinkEvent linkEvent : topologyEvents.getAddedLinkEvents()) {
-            jsonGenerator.writeObject(linkEvent);
+        for (final LinkData linkData : topologyEvents.getAddedLinkDataEntries()) {
+            jsonGenerator.writeObject(linkData);
         }
         jsonGenerator.writeEndArray();
 
         // Output the removed links array
         jsonGenerator.writeArrayFieldStart("removedLinks");
-        for (final LinkEvent linkEvent : topologyEvents.getRemovedLinkEvents()) {
-            jsonGenerator.writeObject(linkEvent);
+        for (final LinkData linkData : topologyEvents.getRemovedLinkDataEntries()) {
+            jsonGenerator.writeObject(linkData);
         }
         jsonGenerator.writeEndArray();
 
         // Output the added hosts array
         jsonGenerator.writeArrayFieldStart("addedHosts");
-        for (final HostEvent hostEvent : topologyEvents.getAddedHostEvents()) {
-            jsonGenerator.writeObject(hostEvent);
+        for (final HostData hostData : topologyEvents.getAddedHostDataEntries()) {
+            jsonGenerator.writeObject(hostData);
         }
         jsonGenerator.writeEndArray();
 
         // Output the removed hosts array
         jsonGenerator.writeArrayFieldStart("removedHosts");
-        for (final HostEvent hostEvent : topologyEvents.getRemovedHostEvents()) {
-            jsonGenerator.writeObject(hostEvent);
+        for (final HostData hostData : topologyEvents.getRemovedHostDataEntries()) {
+            jsonGenerator.writeObject(hostData);
         }
         jsonGenerator.writeEndArray();
 
diff --git a/src/main/java/net/onrc/onos/core/util/serializers/KryoFactory.java b/src/main/java/net/onrc/onos/core/util/serializers/KryoFactory.java
index f5bf01d..7f67289 100644
--- a/src/main/java/net/onrc/onos/core/util/serializers/KryoFactory.java
+++ b/src/main/java/net/onrc/onos/core/util/serializers/KryoFactory.java
@@ -62,11 +62,11 @@
 import net.onrc.onos.core.packetservice.SinglePacketOutNotification;
 import net.onrc.onos.core.topology.AdminStatus;
 import net.onrc.onos.core.topology.ConfigState;
-import net.onrc.onos.core.topology.HostEvent;
-import net.onrc.onos.core.topology.LinkEvent;
+import net.onrc.onos.core.topology.HostData;
+import net.onrc.onos.core.topology.LinkData;
 import net.onrc.onos.core.topology.MastershipEvent;
-import net.onrc.onos.core.topology.PortEvent;
-import net.onrc.onos.core.topology.SwitchEvent;
+import net.onrc.onos.core.topology.PortData;
+import net.onrc.onos.core.topology.SwitchData;
 import net.onrc.onos.core.topology.TopologyBatchOperation;
 import net.onrc.onos.core.topology.TopologyElement;
 import net.onrc.onos.core.topology.TopologyEvent;
@@ -200,14 +200,14 @@
         kryo.register(AdminStatus.class);
         kryo.register(ConcurrentHashMap.class);
         kryo.register(ConfigState.class);
-        kryo.register(HostEvent.class);
+        kryo.register(HostData.class);
         kryo.register(LinkedList.class);
-        kryo.register(LinkEvent.class);
+        kryo.register(LinkData.class);
         kryo.register(MastershipEvent.class);
         kryo.register(OnosInstanceId.class);
-        kryo.register(PortEvent.class);
+        kryo.register(PortData.class);
         kryo.register(Role.class);
-        kryo.register(SwitchEvent.class);
+        kryo.register(SwitchData.class);
         kryo.register(TopologyBatchOperation.class);
         kryo.register(TopologyBatchOperation.Operator.class);
         kryo.register(TopologyElement.class);
diff --git a/src/test/java/net/onrc/onos/core/intent/ConstrainedBFSTreeTest.java b/src/test/java/net/onrc/onos/core/intent/ConstrainedBFSTreeTest.java
index a0095be..1f41ad3 100644
--- a/src/test/java/net/onrc/onos/core/intent/ConstrainedBFSTreeTest.java
+++ b/src/test/java/net/onrc/onos/core/intent/ConstrainedBFSTreeTest.java
@@ -4,7 +4,7 @@
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import net.onrc.onos.core.intent.IntentOperation.Operator;
-import net.onrc.onos.core.topology.LinkEvent;
+import net.onrc.onos.core.topology.LinkData;
 import net.onrc.onos.core.topology.MockTopology;
 import net.onrc.onos.core.util.Dpid;
 import net.onrc.onos.core.util.PortNumber;
@@ -72,21 +72,21 @@
 
         assertNotNull(path12);
         assertEquals(1, path12.size());
-        assertEquals(new LinkEvent(topology.getOutgoingLink(DPID_1, PORT_NUMBER_12)), path12.get(0));
+        assertEquals(new LinkData(topology.getOutgoingLink(DPID_1, PORT_NUMBER_12)), path12.get(0));
 
         assertNotNull(path13);
         assertEquals(2, path13.size());
         if (path13.get(0).getDst().getDpid().value() == 2L) {
-            assertEquals(new LinkEvent(topology.getOutgoingLink(DPID_1, PORT_NUMBER_12)), path13.get(0));
-            assertEquals(new LinkEvent(topology.getOutgoingLink(DPID_2, PORT_NUMBER_23)), path13.get(1));
+            assertEquals(new LinkData(topology.getOutgoingLink(DPID_1, PORT_NUMBER_12)), path13.get(0));
+            assertEquals(new LinkData(topology.getOutgoingLink(DPID_2, PORT_NUMBER_23)), path13.get(1));
         } else {
-            assertEquals(new LinkEvent(topology.getOutgoingLink(DPID_1, PORT_NUMBER_14)), path13.get(0));
-            assertEquals(new LinkEvent(topology.getOutgoingLink(DPID_4, PORT_NUMBER_43)), path13.get(1));
+            assertEquals(new LinkData(topology.getOutgoingLink(DPID_1, PORT_NUMBER_14)), path13.get(0));
+            assertEquals(new LinkData(topology.getOutgoingLink(DPID_4, PORT_NUMBER_43)), path13.get(1));
         }
 
         assertNotNull(path14);
         assertEquals(1, path14.size());
-        assertEquals(new LinkEvent(topology.getOutgoingLink(DPID_1, PORT_NUMBER_14)), path14.get(0));
+        assertEquals(new LinkData(topology.getOutgoingLink(DPID_1, PORT_NUMBER_14)), path14.get(0));
     }
 
     @Test
@@ -110,7 +110,7 @@
         assertNull(path14);
         assertNotNull(path21);
         assertEquals(1, path21.size());
-        assertEquals(new LinkEvent(topology.getOutgoingLink(DPID_2, PORT_NUMBER_21)), path21.get(0));
+        assertEquals(new LinkData(topology.getOutgoingLink(DPID_2, PORT_NUMBER_21)), path21.get(0));
     }
 
     @Test
@@ -132,7 +132,7 @@
 
         assertNotNull(path1);
         assertEquals(1, path1.size());
-        assertEquals(new LinkEvent(topology.getOutgoingLink(DPID_1, PORT_NUMBER_12)), path1.get(0));
+        assertEquals(new LinkData(topology.getOutgoingLink(DPID_1, PORT_NUMBER_12)), path1.get(0));
 
         PathIntent pathIntent1 = new PathIntent("pi1", path1, 600.0, intent1);
         intentOps.add(Operator.ADD, pathIntent1);
@@ -144,8 +144,8 @@
 
         assertNotNull(path2);
         assertEquals(2, path2.size());
-        assertEquals(new LinkEvent(topology.getOutgoingLink(DPID_1, PORT_NUMBER_14)), path2.get(0));
-        assertEquals(new LinkEvent(topology.getOutgoingLink(DPID_4, PORT_NUMBER_42)), path2.get(1));
+        assertEquals(new LinkData(topology.getOutgoingLink(DPID_1, PORT_NUMBER_14)), path2.get(0));
+        assertEquals(new LinkData(topology.getOutgoingLink(DPID_4, PORT_NUMBER_42)), path2.get(1));
 
         PathIntent pathIntent2 = new PathIntent("pi2", path2, 600.0, intent2);
         intentOps.add(Operator.ADD, pathIntent2);
diff --git a/src/test/java/net/onrc/onos/core/intent/IntentOperationListTest.java b/src/test/java/net/onrc/onos/core/intent/IntentOperationListTest.java
index 30cdfb8..86a02a1 100644
--- a/src/test/java/net/onrc/onos/core/intent/IntentOperationListTest.java
+++ b/src/test/java/net/onrc/onos/core/intent/IntentOperationListTest.java
@@ -1,7 +1,7 @@
 package net.onrc.onos.core.intent;
 
 import static org.junit.Assert.assertEquals;
-import net.onrc.onos.core.topology.LinkEvent;
+import net.onrc.onos.core.topology.LinkData;
 import net.onrc.onos.core.util.SwitchPort;
 import net.onrc.onos.core.util.serializers.KryoFactory;
 
@@ -34,9 +34,9 @@
                 new ConstrainedShortestPathIntent("1", 2L, 3L, 4L, 5L, 6L, 7L, 1000.0);
 
         Path path = new Path();
-        path.add(new LinkEvent(new SwitchPort(1L, 2L), new SwitchPort(3L, 4L)));
-        path.add(new LinkEvent(new SwitchPort(5L, 6L), new SwitchPort(7L, 8L)));
-        path.add(new LinkEvent(new SwitchPort(9L, 0L), new SwitchPort(1L, 2L)));
+        path.add(new LinkData(new SwitchPort(1L, 2L), new SwitchPort(3L, 4L)));
+        path.add(new LinkData(new SwitchPort(5L, 6L), new SwitchPort(7L, 8L)));
+        path.add(new LinkData(new SwitchPort(9L, 0L), new SwitchPort(1L, 2L)));
 
         PathIntent pathIntent1 = new PathIntent("11", path, 123.45, cspIntent1);
         opList.add(IntentOperation.Operator.ADD, pathIntent1);
diff --git a/src/test/java/net/onrc/onos/core/intent/PathIntentMapTest.java b/src/test/java/net/onrc/onos/core/intent/PathIntentMapTest.java
index f0d7464..e5fa721 100644
--- a/src/test/java/net/onrc/onos/core/intent/PathIntentMapTest.java
+++ b/src/test/java/net/onrc/onos/core/intent/PathIntentMapTest.java
@@ -10,7 +10,7 @@
 
 import net.onrc.onos.core.intent.IntentOperation.Operator;
 import net.onrc.onos.core.topology.Link;
-import net.onrc.onos.core.topology.LinkEvent;
+import net.onrc.onos.core.topology.LinkData;
 import net.onrc.onos.core.topology.Port;
 import net.onrc.onos.core.topology.Switch;
 import net.onrc.onos.core.util.Dpid;
@@ -103,12 +103,12 @@
         replay(link24);
 
         path1 = new Path();
-        path1.add(new LinkEvent(link12));
-        path1.add(new LinkEvent(link23));
+        path1.add(new LinkData(link12));
+        path1.add(new LinkData(link23));
 
         path2 = new Path();
-        path2.add(new LinkEvent(link12));
-        path2.add(new LinkEvent(link24));
+        path2.add(new LinkData(link12));
+        path2.add(new LinkData(link24));
 
         intent1 = new PathIntent("1", path1, 400.0, new Intent("_1"));
         intent2 = new PathIntent("2", path2, 400.0, new Intent("_2"));
diff --git a/src/test/java/net/onrc/onos/core/intent/PathIntentTest.java b/src/test/java/net/onrc/onos/core/intent/PathIntentTest.java
index 6ffc0f4..2450ab5 100644
--- a/src/test/java/net/onrc/onos/core/intent/PathIntentTest.java
+++ b/src/test/java/net/onrc/onos/core/intent/PathIntentTest.java
@@ -1,7 +1,7 @@
 package net.onrc.onos.core.intent;
 
 import static org.junit.Assert.assertEquals;
-import net.onrc.onos.core.topology.LinkEvent;
+import net.onrc.onos.core.topology.LinkData;
 import net.onrc.onos.core.util.Dpid;
 import net.onrc.onos.core.util.PortNumber;
 import net.onrc.onos.core.util.SwitchPort;
@@ -58,9 +58,9 @@
                 new ConstrainedShortestPathIntent("1", 2L, 3L, 4L, 5L, 6L, 7L, 1000.0);
 
         Path path = new Path();
-        path.add(new LinkEvent(new SwitchPort(1L, 1L), new SwitchPort(2L, 2L)));
-        path.add(new LinkEvent(new SwitchPort(2L, 1L), new SwitchPort(3L, 2L)));
-        path.add(new LinkEvent(new SwitchPort(3L, 1L), new SwitchPort(4L, 2L)));
+        path.add(new LinkData(new SwitchPort(1L, 1L), new SwitchPort(2L, 2L)));
+        path.add(new LinkData(new SwitchPort(2L, 1L), new SwitchPort(3L, 2L)));
+        path.add(new LinkData(new SwitchPort(3L, 1L), new SwitchPort(4L, 2L)));
 
         PathIntent pathIntent1 = new PathIntent("11", path, 123.45, cspIntent1);
 
diff --git a/src/test/java/net/onrc/onos/core/intent/runtime/PathCalcRuntimeModuleTest.java b/src/test/java/net/onrc/onos/core/intent/runtime/PathCalcRuntimeModuleTest.java
index 8f179db..3379417 100644
--- a/src/test/java/net/onrc/onos/core/intent/runtime/PathCalcRuntimeModuleTest.java
+++ b/src/test/java/net/onrc/onos/core/intent/runtime/PathCalcRuntimeModuleTest.java
@@ -18,12 +18,12 @@
 import net.onrc.onos.core.intent.IntentOperation.Operator;
 import net.onrc.onos.core.intent.IntentOperationList;
 import net.onrc.onos.core.intent.ShortestPathIntent;
-import net.onrc.onos.core.topology.HostEvent;
-import net.onrc.onos.core.topology.LinkEvent;
+import net.onrc.onos.core.topology.HostData;
+import net.onrc.onos.core.topology.LinkData;
 import net.onrc.onos.core.topology.MastershipEvent;
 import net.onrc.onos.core.topology.MockTopology;
-import net.onrc.onos.core.topology.PortEvent;
-import net.onrc.onos.core.topology.SwitchEvent;
+import net.onrc.onos.core.topology.PortData;
+import net.onrc.onos.core.topology.SwitchData;
 import net.onrc.onos.core.topology.TopologyElement;
 import net.onrc.onos.core.topology.TopologyEvents;
 import net.onrc.onos.core.util.SwitchPort;
@@ -457,33 +457,33 @@
 
         //  Remove one of the links and check results
         final List<MastershipEvent> emptyMastershipEvents = new LinkedList<>();
-        final List<SwitchEvent> emptySwitchEvents = new LinkedList<>();
-        final List<PortEvent> emptyPortEvents = new LinkedList<>();
-        final List<HostEvent> emptyHostEvents = new LinkedList<>();
-        final List<LinkEvent> addedLinkEvents = new LinkedList<>();
-        final List<LinkEvent> removedLinkEvents = new LinkedList<>();
+        final List<SwitchData> emptySwitchDataEntries = new LinkedList<>();
+        final List<PortData> emptyPortDataEntries = new LinkedList<>();
+        final List<HostData> emptyHostDataEntries = new LinkedList<>();
+        final List<LinkData> addedLinkDataEntries = new LinkedList<>();
+        final List<LinkData> removedLinkDataEntries = new LinkedList<>();
         TopologyEvents topologyEvents;
 
         final MockTopology topology = mocks.getTopology();
         topology.removeLink(1L, 12L, 2L, 21L); // This link is used by the intent "1"
         topology.removeLink(2L, 21L, 1L, 12L);
-        LinkEvent linkEvent1 = new LinkEvent(new SwitchPort(1L, 12L), new SwitchPort(2L, 21L));
-        LinkEvent linkEvent2 = new LinkEvent(new SwitchPort(2L, 21L), new SwitchPort(1L, 12L));
-        linkEvent1.createStringAttribute(TopologyElement.TYPE, TopologyElement.TYPE_PACKET_LAYER);
-        linkEvent2.createStringAttribute(TopologyElement.TYPE, TopologyElement.TYPE_PACKET_LAYER);
-        removedLinkEvents.add(linkEvent1);
-        removedLinkEvents.add(linkEvent2);
+        LinkData linkData1 = new LinkData(new SwitchPort(1L, 12L), new SwitchPort(2L, 21L));
+        LinkData linkData2 = new LinkData(new SwitchPort(2L, 21L), new SwitchPort(1L, 12L));
+        linkData1.createStringAttribute(TopologyElement.TYPE, TopologyElement.TYPE_PACKET_LAYER);
+        linkData2.createStringAttribute(TopologyElement.TYPE, TopologyElement.TYPE_PACKET_LAYER);
+        removedLinkDataEntries.add(linkData1);
+        removedLinkDataEntries.add(linkData2);
 
         topologyEvents = new TopologyEvents(emptyMastershipEvents,
                                             emptyMastershipEvents,
-                                            emptySwitchEvents,
-                                            emptySwitchEvents,
-                                            emptyPortEvents,
-                                            emptyPortEvents,
-                                            addedLinkEvents,
-                                            removedLinkEvents,
-                                            emptyHostEvents,
-                                            emptyHostEvents);
+                                            emptySwitchDataEntries,
+                                            emptySwitchDataEntries,
+                                            emptyPortDataEntries,
+                                            emptyPortDataEntries,
+                                            addedLinkDataEntries,
+                                            removedLinkDataEntries,
+                                            emptyHostDataEntries,
+                                            emptyHostDataEntries);
 
         runtime.topologyEvents(topologyEvents);
 
@@ -695,33 +695,33 @@
 
         //  Remove one of the links and check results
         final List<MastershipEvent> emptyMastershipEvents = new LinkedList<>();
-        final List<SwitchEvent> emptySwitchEvents = new LinkedList<>();
-        final List<PortEvent> emptyPortEvents = new LinkedList<>();
-        final List<HostEvent> emptyHostEvents = new LinkedList<>();
-        final List<LinkEvent> addedLinkEvents = new LinkedList<>();
-        final List<LinkEvent> removedLinkEvents = new LinkedList<>();
+        final List<SwitchData> emptySwitchDataEntries = new LinkedList<>();
+        final List<PortData> emptyPortDataEntries = new LinkedList<>();
+        final List<HostData> emptyHostDataEntries = new LinkedList<>();
+        final List<LinkData> addedLinkDataEntries = new LinkedList<>();
+        final List<LinkData> removedLinkDataEntries = new LinkedList<>();
         TopologyEvents topologyEvents;
 
         final MockTopology topology = mocks.getTopology();
         topology.removeLink(1L, 12L, 2L, 21L); // This link is used by the intent "1"
         topology.removeLink(2L, 21L, 1L, 12L);
-        final LinkEvent linkEvent1 = new LinkEvent(new SwitchPort(1L, 12L), new SwitchPort(2L, 21L));
-        final LinkEvent linkEvent2 = new LinkEvent(new SwitchPort(2L, 21L), new SwitchPort(1L, 12L));
-        linkEvent1.createStringAttribute(TopologyElement.TYPE, TopologyElement.TYPE_PACKET_LAYER);
-        linkEvent2.createStringAttribute(TopologyElement.TYPE, TopologyElement.TYPE_PACKET_LAYER);
-        removedLinkEvents.add(linkEvent1);
-        removedLinkEvents.add(linkEvent2);
+        final LinkData linkData1 = new LinkData(new SwitchPort(1L, 12L), new SwitchPort(2L, 21L));
+        final LinkData linkData2 = new LinkData(new SwitchPort(2L, 21L), new SwitchPort(1L, 12L));
+        linkData1.createStringAttribute(TopologyElement.TYPE, TopologyElement.TYPE_PACKET_LAYER);
+        linkData2.createStringAttribute(TopologyElement.TYPE, TopologyElement.TYPE_PACKET_LAYER);
+        removedLinkDataEntries.add(linkData1);
+        removedLinkDataEntries.add(linkData2);
 
         topologyEvents = new TopologyEvents(emptyMastershipEvents,
                                             emptyMastershipEvents,
-                                            emptySwitchEvents,
-                                            emptySwitchEvents,
-                                            emptyPortEvents,
-                                            emptyPortEvents,
-                                            addedLinkEvents,
-                                            removedLinkEvents,
-                                            emptyHostEvents,
-                                            emptyHostEvents);
+                                            emptySwitchDataEntries,
+                                            emptySwitchDataEntries,
+                                            emptyPortDataEntries,
+                                            emptyPortDataEntries,
+                                            addedLinkDataEntries,
+                                            removedLinkDataEntries,
+                                            emptyHostDataEntries,
+                                            emptyHostDataEntries);
 
         runtime.topologyEvents(topologyEvents);
 
@@ -760,22 +760,22 @@
                 hasIntentWithIdAndState("3___0", IntentState.INST_ACK));
 
         // Interrupt by topology changed event while the reroute
-        removedLinkEvents.clear();
-        addedLinkEvents.clear();
+        removedLinkDataEntries.clear();
+        addedLinkDataEntries.clear();
         topology.addBidirectionalLinks(1L, 12L, 2L, 21L); // Restoration of the failure
-        addedLinkEvents.add(linkEvent1);
-        addedLinkEvents.add(linkEvent2);
+        addedLinkDataEntries.add(linkData1);
+        addedLinkDataEntries.add(linkData2);
 
         topologyEvents = new TopologyEvents(emptyMastershipEvents,
                                             emptyMastershipEvents,
-                                            emptySwitchEvents,
-                                            emptySwitchEvents,
-                                            emptyPortEvents,
-                                            emptyPortEvents,
-                                            addedLinkEvents,
-                                            removedLinkEvents,
-                                            emptyHostEvents,
-                                            emptyHostEvents);
+                                            emptySwitchDataEntries,
+                                            emptySwitchDataEntries,
+                                            emptyPortDataEntries,
+                                            emptyPortDataEntries,
+                                            addedLinkDataEntries,
+                                            removedLinkDataEntries,
+                                            emptyHostDataEntries,
+                                            emptyHostDataEntries);
 
         runtime.topologyEvents(topologyEvents);
 
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 cd9b676..78661b1 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
@@ -29,14 +29,14 @@
 import net.onrc.onos.core.intent.ShortestPathIntent;
 import net.onrc.onos.core.intent.runtime.web.IntentWebRoutable;
 import net.onrc.onos.core.registry.IControllerRegistryService;
-import net.onrc.onos.core.topology.HostEvent;
+import net.onrc.onos.core.topology.HostData;
 import net.onrc.onos.core.topology.ITopologyListener;
 import net.onrc.onos.core.topology.ITopologyService;
-import net.onrc.onos.core.topology.LinkEvent;
+import net.onrc.onos.core.topology.LinkData;
 import net.onrc.onos.core.topology.MastershipEvent;
 import net.onrc.onos.core.topology.MockTopology;
-import net.onrc.onos.core.topology.PortEvent;
-import net.onrc.onos.core.topology.SwitchEvent;
+import net.onrc.onos.core.topology.PortData;
+import net.onrc.onos.core.topology.SwitchData;
 import net.onrc.onos.core.topology.MutableTopology;
 import net.onrc.onos.core.topology.TopologyEvents;
 import net.onrc.onos.core.util.SwitchPort;
@@ -234,14 +234,14 @@
     public void rerouteShortestPaths() throws FloodlightModuleException {
         List<MastershipEvent> addedMastershipEvents = new LinkedList<>();
         List<MastershipEvent> removedMastershipEvents = new LinkedList<>();
-        List<SwitchEvent> addedSwitchEvents = new LinkedList<>();
-        List<SwitchEvent> removedSwitchEvents = new LinkedList<>();
-        List<PortEvent> addedPortEvents = new LinkedList<>();
-        List<PortEvent> removedPortEvents = new LinkedList<>();
-        List<LinkEvent> addedLinkEvents = new LinkedList<>();
-        List<LinkEvent> removedLinkEvents = new LinkedList<>();
-        List<HostEvent> addedHostEvents = new LinkedList<>();
-        List<HostEvent> removedHostEvents = new LinkedList<>();
+        List<SwitchData> addedSwitchDataEntries = new LinkedList<>();
+        List<SwitchData> removedSwitchDataEntries = new LinkedList<>();
+        List<PortData> addedPortDataEntries = new LinkedList<>();
+        List<PortData> removedPortDataEntries = new LinkedList<>();
+        List<LinkData> addedLinkDataEntries = new LinkedList<>();
+        List<LinkData> removedLinkDataEntries = new LinkedList<>();
+        List<HostData> addedHostDataEntries = new LinkedList<>();
+        List<HostData> removedHostDataEntries = new LinkedList<>();
         TopologyEvents topologyEvents;
 
         // create shortest path intents
@@ -279,22 +279,22 @@
         // link down
         ((MockTopology) mutableTopology).removeLink(1L, 12L, 2L, 21L); // This link is used by the intent "1"
         ((MockTopology) mutableTopology).removeLink(2L, 21L, 1L, 12L);
-        LinkEvent linkEvent1 = new LinkEvent(new SwitchPort(1L, 12L), new SwitchPort(2L, 21L));
-        LinkEvent linkEvent2 = new LinkEvent(new SwitchPort(2L, 21L), new SwitchPort(1L, 12L));
-        removedLinkEvents.clear();
-        removedLinkEvents.add(linkEvent1);
-        removedLinkEvents.add(linkEvent2);
+        LinkData linkData1 = new LinkData(new SwitchPort(1L, 12L), new SwitchPort(2L, 21L));
+        LinkData linkData2 = new LinkData(new SwitchPort(2L, 21L), new SwitchPort(1L, 12L));
+        removedLinkDataEntries.clear();
+        removedLinkDataEntries.add(linkData1);
+        removedLinkDataEntries.add(linkData2);
 
         topologyEvents = new TopologyEvents(addedMastershipEvents,
                                             removedMastershipEvents,
-                                            addedSwitchEvents,
-                                            removedSwitchEvents,
-                                            addedPortEvents,
-                                            removedPortEvents,
-                                            addedLinkEvents,
-                                            removedLinkEvents,
-                                            addedHostEvents,
-                                            removedHostEvents);
+                                            addedSwitchDataEntries,
+                                            removedSwitchDataEntries,
+                                            addedPortDataEntries,
+                                            removedPortDataEntries,
+                                            addedLinkDataEntries,
+                                            removedLinkDataEntries,
+                                            addedHostDataEntries,
+                                            removedHostDataEntries);
 
         runtime1.topologyEvents(topologyEvents);
         log.debug("*** Link goes down. ***");
@@ -313,23 +313,23 @@
 
         // link up
         ((MockTopology) mutableTopology).addBidirectionalLinks(1L, 12L, 2L, 21L);
-        linkEvent1 = new LinkEvent(new SwitchPort(1L, 12L), new SwitchPort(2L, 21L));
-        linkEvent2 = new LinkEvent(new SwitchPort(2L, 21L), new SwitchPort(1L, 12L));
-        removedLinkEvents.clear();
-        addedLinkEvents.clear();
-        addedLinkEvents.add(linkEvent1);
-        addedLinkEvents.add(linkEvent2);
+        linkData1 = new LinkData(new SwitchPort(1L, 12L), new SwitchPort(2L, 21L));
+        linkData2 = new LinkData(new SwitchPort(2L, 21L), new SwitchPort(1L, 12L));
+        removedLinkDataEntries.clear();
+        addedLinkDataEntries.clear();
+        addedLinkDataEntries.add(linkData1);
+        addedLinkDataEntries.add(linkData2);
 
         topologyEvents = new TopologyEvents(addedMastershipEvents,
                                             removedMastershipEvents,
-                                            addedSwitchEvents,
-                                            removedSwitchEvents,
-                                            addedPortEvents,
-                                            removedPortEvents,
-                                            addedLinkEvents,
-                                            removedLinkEvents,
-                                            addedHostEvents,
-                                            removedHostEvents);
+                                            addedSwitchDataEntries,
+                                            removedSwitchDataEntries,
+                                            addedPortDataEntries,
+                                            removedPortDataEntries,
+                                            addedLinkDataEntries,
+                                            removedLinkDataEntries,
+                                            addedHostDataEntries,
+                                            removedHostDataEntries);
 
         runtime1.topologyEvents(topologyEvents);
         log.debug("*** Link goes up. ***");
diff --git a/src/test/java/net/onrc/onos/core/topology/ImmutableTopologySnapshotTest.java b/src/test/java/net/onrc/onos/core/topology/ImmutableTopologySnapshotTest.java
index 5b5990a..201b2b6 100644
--- a/src/test/java/net/onrc/onos/core/topology/ImmutableTopologySnapshotTest.java
+++ b/src/test/java/net/onrc/onos/core/topology/ImmutableTopologySnapshotTest.java
@@ -60,9 +60,9 @@
     public void testInitialBuilder() {
         final Builder builder = ImmutableTopologySnapshot.initialBuilder();
         assertTrue("Topology should be empty",
-                builder.getCurrentInternal().getAllSwitchEvents().isEmpty());
+                builder.getCurrentInternal().getAllSwitchDataEntries().isEmpty());
         assertTrue("Topology should be empty",
-                builder.build().getAllSwitchEvents().isEmpty());
+                builder.build().getAllSwitchDataEntries().isEmpty());
     }
 
     /**
@@ -72,120 +72,120 @@
     public void testBuilder() {
         final Builder builder = ss.builder();
         assertEquals("Number of switch", NUM_SWITCH,
-                builder.getCurrentInternal().getAllSwitchEvents().size());
+                builder.getCurrentInternal().getAllSwitchDataEntries().size());
         assertEquals("Number of ports", NUM_PORTS * NUM_SWITCH,
-                builder.getCurrentInternal().getAllPortEvents().size());
+                builder.getCurrentInternal().getAllPortDataEntries().size());
         assertEquals("Number of links", NUM_LINKS,
-                builder.getCurrentInternal().getAllLinkEvents().size());
+                builder.getCurrentInternal().getAllLinkDataEntries().size());
         assertEquals("Number of hosts", NUM_HOSTS,
-                builder.getCurrentInternal().getAllHostEvents().size());
+                builder.getCurrentInternal().getAllHostDataEntries().size());
 
         final ImmutableTopologySnapshot clone = builder.build();
         assertEquals("Number of switch", NUM_SWITCH,
-                clone.getAllSwitchEvents().size());
+                clone.getAllSwitchDataEntries().size());
         assertEquals("Number of ports", NUM_PORTS * NUM_SWITCH,
-                clone.getAllPortEvents().size());
+                clone.getAllPortDataEntries().size());
         assertEquals("Number of links", NUM_LINKS,
-                clone.getAllLinkEvents().size());
+                clone.getAllLinkDataEntries().size());
         assertEquals("Number of hosts", NUM_HOSTS,
-                clone.getAllHostEvents().size());
+                clone.getAllHostDataEntries().size());
     }
 
     /**
-     * Test for {@link ImmutableTopologySnapshot#getSwitchEvent(Dpid)}.
+     * Test for {@link ImmutableTopologySnapshot#getSwitchData(Dpid)}.
      */
     @Test
-    public void testGetSwitchEvent() {
+    public void testGetSwitchData() {
         final Dpid dpid1 = new Dpid(1);
         assertNotNull("Switch 1 should exist",
-                ss.getSwitchEvent(dpid1));
+                ss.getSwitchData(dpid1));
 
         final Dpid dpidNa = new Dpid(NUM_SWITCH + 1);
         assertNull("Switch NUM_SWITCH + 1 should not exist",
-                ss.getSwitchEvent(dpidNa));
+                ss.getSwitchData(dpidNa));
     }
 
     /**
-     * Test for {@link ImmutableTopologySnapshot#getAllSwitchEvents()}.
+     * Test for {@link ImmutableTopologySnapshot#getAllSwitchDataEntries()}.
      */
     @Test
-    public void testGetAllSwitchEvents() {
+    public void testGetAllSwitchDataEntries() {
         assertEquals("Number of switch", NUM_SWITCH,
-                ss.getAllSwitchEvents().size());
+                ss.getAllSwitchDataEntries().size());
     }
 
     /**
-     * Test for {@link ImmutableTopologySnapshot#getPortEvent(SwitchPort)}.
+     * Test for {@link ImmutableTopologySnapshot#getPortData(SwitchPort)}.
      */
     @Test
-    public void testGetPortEventSwitchPort() {
+    public void testGetPortDataSwitchPort() {
         final Dpid dpid1 = new Dpid(1);
         final PortNumber port1 = PortNumber.uint32(1);
         assertNotNull("Switch 1 Port 1 should exist",
-                ss.getPortEvent(new SwitchPort(dpid1, port1)));
+                ss.getPortData(new SwitchPort(dpid1, port1)));
 
         final PortNumber portNa = PortNumber.uint32(PORT_NUM_NA);
         assertNull("Switch 1 Port PORT_NUM_NA should not exist",
-                ss.getPortEvent(new SwitchPort(dpid1, portNa)));
+                ss.getPortData(new SwitchPort(dpid1, portNa)));
     }
 
     /**
-     * Test for {@link ImmutableTopologySnapshot#getPortEvent(Dpid, PortNumber)}.
+     * Test for {@link ImmutableTopologySnapshot#getPortData(Dpid, PortNumber)}.
      */
     @Test
-    public void testGetPortEventDpidPortNumber() {
+    public void testGetPortDataDpidPortNumber() {
         final Dpid dpid1 = new Dpid(1);
         final PortNumber port1 = PortNumber.uint32(1);
         assertNotNull("Switch 1 Port 1 should exist",
-                ss.getPortEvent(dpid1, port1));
+                ss.getPortData(dpid1, port1));
 
         final PortNumber portNa = PortNumber.uint32(PORT_NUM_NA);
         assertNull("Switch 1 Port PORT_NUM_NA should not exist",
-                ss.getPortEvent(dpid1, portNa));
+                ss.getPortData(dpid1, portNa));
     }
 
     /**
-     * Test for {@link ImmutableTopologySnapshot#getPortEvents(Dpid)}.
+     * Test for {@link ImmutableTopologySnapshot#getPortDataEntries(Dpid)}.
      */
     @Test
-    public void testGetPortEvents() {
+    public void testGetPortDataEntries() {
         final Dpid dpid1 = new Dpid(1);
         assertEquals("Number of ports", NUM_PORTS,
-                ss.getPortEvents(dpid1).size());
+                ss.getPortDataEntries(dpid1).size());
     }
 
     /**
-     * Test for {@link ImmutableTopologySnapshot#getAllPortEvents()}.
+     * Test for {@link ImmutableTopologySnapshot#getAllPortDataEntries()}.
      */
     @Test
-    public void testGetAllPortEvents() {
+    public void testGetAllPortDataEntries() {
         assertEquals("Number of ports", NUM_PORTS * NUM_SWITCH,
-                ss.getAllPortEvents().size());
+                ss.getAllPortDataEntries().size());
     }
 
     /**
-     * Test for {@link ImmutableTopologySnapshot#getLinkEvent(LinkTuple)}.
+     * Test for {@link ImmutableTopologySnapshot#getLinkData(LinkTuple)}.
      */
     @Test
-    public void testGetLinkEventLinkTuple() {
+    public void testGetLinkDataLinkTuple() {
         assertNotNull("Link (1:1 -> 2:1) should exist",
-                ss.getLinkEvent(LINK_IN_TOPOLOGY));
+                ss.getLinkData(LINK_IN_TOPOLOGY));
 
         final Dpid dpid1 = new Dpid(1);
         final Dpid dpid2 = new Dpid(2);
         final PortNumber port1 = PortNumber.uint32(1);
         final PortNumber portNa = PortNumber.uint32(PORT_NUM_NA);
         assertNull("Link (1:1 -> 2:PORT_NUM_NA) should not exist",
-                ss.getLinkEvent(new LinkTuple(dpid1, port1, dpid2, portNa)));
+                ss.getLinkData(new LinkTuple(dpid1, port1, dpid2, portNa)));
     }
 
     /**
-     * Test for {@link ImmutableTopologySnapshot#getLinkEvent(LinkTuple, String)}.
+     * Test for {@link ImmutableTopologySnapshot#getLinkData(LinkTuple, String)}.
      */
     @Test
-    public void testGetLinkEventLinkTupleString() {
+    public void testGetLinkDataLinkTupleString() {
         assertNotNull("Link (1:1 -> 2:1) should exist",
-                ss.getLinkEvent(LINK_IN_TOPOLOGY,
+                ss.getLinkData(LINK_IN_TOPOLOGY,
                         TopologyElement.TYPE_PACKET_LAYER));
 
         final Dpid dpid1 = new Dpid(1);
@@ -193,87 +193,87 @@
         final PortNumber port1 = PortNumber.uint32(1);
         final PortNumber portNa = PortNumber.uint32(PORT_NUM_NA);
         assertNull("Link (1:1 -> 2:PORT_NUM_NA) should not exist",
-                ss.getLinkEvent(new LinkTuple(dpid1, port1, dpid2, portNa),
+                ss.getLinkData(new LinkTuple(dpid1, port1, dpid2, portNa),
                         TopologyElement.TYPE_PACKET_LAYER));
     }
 
     /**
-     * Test for {@link ImmutableTopologySnapshot#getLinkEventsFrom(SwitchPort)}.
+     * Test for {@link ImmutableTopologySnapshot#getLinkDataEntriesFrom(SwitchPort)}.
      */
     @Test
-    public void testGetLinkEventsFrom() {
+    public void testGetLinkDataEntriesFrom() {
         assertThat("Port 1:1 should at least have 1 outgoing link",
-                ss.getLinkEventsFrom(LINK_IN_TOPOLOGY.getSrc()).size(),
+                ss.getLinkDataEntriesFrom(LINK_IN_TOPOLOGY.getSrc()).size(),
                 is(greaterThanOrEqualTo(1)));
     }
 
     /**
-     * Test for {@link ImmutableTopologySnapshot#getLinkEventsTo(SwitchPort)}.
+     * Test for {@link ImmutableTopologySnapshot#getLinkDataEntriesTo(SwitchPort)}.
      */
     @Test
-    public void testGetLinkEventsTo() {
+    public void testGetLinkDataEntriesTo() {
         assertThat("Port 2:1 should at least have 1 incoming link",
-                ss.getLinkEventsTo(LINK_IN_TOPOLOGY.getDst()).size(),
+                ss.getLinkDataEntriesTo(LINK_IN_TOPOLOGY.getDst()).size(),
                 is(greaterThanOrEqualTo(1)));
     }
 
     /**
-     * Test for {@link ImmutableTopologySnapshot#getLinkEvents(LinkTuple)}.
+     * Test for {@link ImmutableTopologySnapshot#getLinkDataEntries(LinkTuple)}.
      */
     @Test
-    public void testGetLinkEvents() {
+    public void testGetLinkDataEntries() {
         assertFalse("Link (1:1 -> 2:1) should exist",
-                ss.getLinkEvents(LINK_IN_TOPOLOGY).isEmpty());
+                ss.getLinkDataEntries(LINK_IN_TOPOLOGY).isEmpty());
 
         final Dpid dpid1 = new Dpid(1);
         final Dpid dpid2 = new Dpid(2);
         final PortNumber port1 = PortNumber.uint32(1);
         final PortNumber portNa = PortNumber.uint32(PORT_NUM_NA);
         assertTrue("Link (1:1 -> 2:PORT_NUM_NA) should not exist",
-                ss.getLinkEvents(new LinkTuple(dpid1, port1, dpid2, portNa)).isEmpty());
+                ss.getLinkDataEntries(new LinkTuple(dpid1, port1, dpid2, portNa)).isEmpty());
     }
 
     /**
-     * Test for {@link ImmutableTopologySnapshot#getAllLinkEvents()}.
+     * Test for {@link ImmutableTopologySnapshot#getAllLinkDataEntries()}.
      */
     @Test
-    public void testGetAllLinkEvents() {
+    public void testGetAllLinkDataEntries() {
         assertEquals("Number of links", NUM_LINKS,
-                ss.getAllLinkEvents().size());
+                ss.getAllLinkDataEntries().size());
     }
 
     /**
-     * Test for {@link ImmutableTopologySnapshot#getHostEvent(MACAddress)}.
+     * Test for {@link ImmutableTopologySnapshot#getHostData(MACAddress)}.
      */
     @Test
-    public void testGetHostEvent() {
+    public void testGetHostData() {
         assertNotNull("Host 0:..:0 should exist",
-                ss.getHostEvent(MACAddress.valueOf(0L)));
+                ss.getHostData(MACAddress.valueOf(0L)));
 
         assertNull("Host MAC_NA should exist",
-                ss.getHostEvent(MACAddress.valueOf(MAC_NA)));
+                ss.getHostData(MACAddress.valueOf(MAC_NA)));
     }
 
     /**
-     * Test for {@link ImmutableTopologySnapshot#getHostEvents(SwitchPort)}.
+     * Test for {@link ImmutableTopologySnapshot#getHostDataEntries(SwitchPort)}.
      */
     @Test
-    public void testGetHostEvents() {
-        final HostEvent host = ss.getHostEvent(MACAddress.valueOf(0L));
+    public void testGetHostDataEntries() {
+        final HostData host = ss.getHostData(MACAddress.valueOf(0L));
         final SwitchPort attachment = host.getAttachmentPoints().get(0);
 
         assertThat("should at least have 1 host attached",
-                ss.getHostEvents(attachment).size(),
+                ss.getHostDataEntries(attachment).size(),
                 is(greaterThanOrEqualTo(1)));
     }
 
     /**
-     * Test for {@link ImmutableTopologySnapshot#getAllHostEvents()}.
+     * Test for {@link ImmutableTopologySnapshot#getAllHostDataEntries()}.
      */
     @Test
-    public void testGetAllHostEvents() {
+    public void testGetAllHostDataEntries() {
         assertEquals("Number of hosts", NUM_HOSTS,
-                ss.getAllHostEvents().size());
+                ss.getAllHostDataEntries().size());
     }
 
     /**
@@ -542,7 +542,7 @@
      */
     @Test
     public void testGetHostsSwitchPort() {
-        final HostEvent host = ss.getHostEvent(MACAddress.valueOf(0L));
+        final HostData host = ss.getHostData(MACAddress.valueOf(0L));
         final SwitchPort attachment = host.getAttachmentPoints().get(0);
 
         assertThat("should at least have 1 host attached",
@@ -571,9 +571,9 @@
             builder.putSwitchMastershipEvent(new MastershipEvent(dpid,
                                 INSTANCE_ID,
                                 Role.MASTER));
-            builder.putSwitch(new SwitchEvent(dpid));
+            builder.putSwitch(new SwitchData(dpid));
             for (int j = 0; j < ports; ++j) {
-                builder.putPort(new PortEvent(dpid, PortNumber.uint32(j + 1)));
+                builder.putPort(new PortData(dpid, PortNumber.uint32(j + 1)));
             }
         }
 
@@ -581,7 +581,7 @@
         final RandomDataGenerator rand = new RandomDataGenerator();
         int l = 0;
         // Always add Link (1:1 -> 2:1)
-        builder.putLink(new LinkEvent(LINK_IN_TOPOLOGY));
+        builder.putLink(new LinkData(LINK_IN_TOPOLOGY));
         ++l;
 
         while (l < links) {
@@ -597,26 +597,26 @@
                     new Dpid(sw2), PortNumber.uint32(port2));
 
             final BaseInternalTopology current = builder.getCurrentInternal();
-            if (!current.getLinkEventsFrom(linkId.getSrc()).isEmpty() ||
-                !current.getLinkEventsTo(linkId.getSrc()).isEmpty()) {
+            if (!current.getLinkDataEntriesFrom(linkId.getSrc()).isEmpty() ||
+                !current.getLinkDataEntriesTo(linkId.getSrc()).isEmpty()) {
                 // src port already has a link
                 continue;
             }
-            if (!current.getLinkEventsFrom(linkId.getDst()).isEmpty() ||
-                !current.getLinkEventsTo(linkId.getDst()).isEmpty()) {
+            if (!current.getLinkDataEntriesFrom(linkId.getDst()).isEmpty() ||
+                !current.getLinkDataEntriesTo(linkId.getDst()).isEmpty()) {
                 // dst port already has a link
                 continue;
             }
 
             // add only if both port doesn't have any link
-            builder.putLink(new LinkEvent(linkId));
+            builder.putLink(new LinkData(linkId));
             ++l;
         }
 
         // Add host with mac 0 -> hosts
         int h = 0;
         while (h < hosts) {
-            HostEvent host = new HostEvent(MACAddress.valueOf(h));
+            HostData host = new HostData(MACAddress.valueOf(h));
             SwitchPort swp = new SwitchPort(
                                 new Dpid(rand.nextInt(1, switches)),
                                 PortNumber.uint32(rand.nextInt(1, ports)));
diff --git a/src/test/java/net/onrc/onos/core/topology/MockPacketOpticalTopology.java b/src/test/java/net/onrc/onos/core/topology/MockPacketOpticalTopology.java
index 36b6abf..37fbf8d 100644
--- a/src/test/java/net/onrc/onos/core/topology/MockPacketOpticalTopology.java
+++ b/src/test/java/net/onrc/onos/core/topology/MockPacketOpticalTopology.java
@@ -16,37 +16,37 @@
 
     @Override
     public Switch addSwitch(Long switchId) {
-        SwitchEvent switchEvent = new SwitchEvent(new Dpid(switchId));
-        switchEvent.createStringAttribute(TopologyElement.TYPE,
+        SwitchData switchData = new SwitchData(new Dpid(switchId));
+        switchData.createStringAttribute(TopologyElement.TYPE,
                                           TopologyElement.TYPE_PACKET_LAYER);
-        switchEvent.createStringAttribute(TopologyElement.ELEMENT_TYPE,
+        switchData.createStringAttribute(TopologyElement.ELEMENT_TYPE,
                                           SwitchType.ETHERNET_SWITCH.
                                                   toString());
-        switchEvent.createStringAttribute(TopologyElement
+        switchData.createStringAttribute(TopologyElement
                                                   .ELEMENT_CONFIG_STATE,
                                           ConfigState.NOT_CONFIGURED.
                                                   toString());
-        switchEvent.createStringAttribute(TopologyElement
+        switchData.createStringAttribute(TopologyElement
                                                   .ELEMENT_ADMIN_STATUS,
                                           AdminStatus.ACTIVE.toString());
-        this.putSwitch(switchEvent);
-        return this.getSwitch(switchEvent.getDpid());
+        this.putSwitch(switchData);
+        return this.getSwitch(switchData.getDpid());
     }
 
     @Override
     public Port addPort(Switch sw, Long portNumber) {
-        PortEvent portEvent = new PortEvent(sw.getDpid(),
+        PortData portData = new PortData(sw.getDpid(),
                                     PortNumber.uint16(portNumber.shortValue()));
-        portEvent.createStringAttribute(TopologyElement.TYPE,
+        portData.createStringAttribute(TopologyElement.TYPE,
                                         TopologyElement.TYPE_PACKET_LAYER);
-        portEvent.createStringAttribute(TopologyElement.ELEMENT_TYPE,
+        portData.createStringAttribute(TopologyElement.ELEMENT_TYPE,
                                         PortType.ETHERNET_PORT.toString());
-        portEvent.createStringAttribute(TopologyElement.ELEMENT_CONFIG_STATE,
+        portData.createStringAttribute(TopologyElement.ELEMENT_CONFIG_STATE,
                                         ConfigState.NOT_CONFIGURED.toString());
-        portEvent.createStringAttribute(TopologyElement.ELEMENT_ADMIN_STATUS,
+        portData.createStringAttribute(TopologyElement.ELEMENT_ADMIN_STATUS,
                                         AdminStatus.ACTIVE.toString());
-        this.putPort(portEvent);
-        return this.getPort(sw.getDpid(), portEvent.getPortNumber());
+        this.putPort(portData);
+        return this.getPort(sw.getDpid(), portData.getPortNumber());
     }
 
     /**
@@ -55,23 +55,23 @@
      * @param switchId returns Switch
      */
     public Switch addOpticalSwitch(Long switchId) {
-        SwitchEvent switchEvent = new SwitchEvent(new Dpid(switchId));
-        switchEvent.createStringAttribute(TopologyElement.TYPE,
+        SwitchData switchData = new SwitchData(new Dpid(switchId));
+        switchData.createStringAttribute(TopologyElement.TYPE,
                                           TopologyElement.TYPE_OPTICAL_LAYER);
-        switchEvent.createStringAttribute(TopologyElement.ELEMENT_TYPE,
+        switchData.createStringAttribute(TopologyElement.ELEMENT_TYPE,
                                           SwitchType.OPTICAL_SWITCH.toString());
-        switchEvent.createStringAttribute(TopologyElement
+        switchData.createStringAttribute(TopologyElement
                                                   .ELEMENT_CONFIG_STATE,
                                           ConfigState.CONFIGURED.toString());
-        switchEvent.createStringAttribute(TopologyElement
+        switchData.createStringAttribute(TopologyElement
                                                   .ELEMENT_ADMIN_STATUS,
                                           AdminStatus.INACTIVE.toString());
-        switchEvent.createStringAttribute(TOTAL_REGEN_COUNT,
+        switchData.createStringAttribute(TOTAL_REGEN_COUNT,
                                           Integer.toString(2));
-        switchEvent.createStringAttribute(REGEN_IN_USE_COUNT,
+        switchData.createStringAttribute(REGEN_IN_USE_COUNT,
                                           Integer.toString(2));
-        this.putSwitch(switchEvent);
-        return this.getSwitch(switchEvent.getDpid());
+        this.putSwitch(switchData);
+        return this.getSwitch(switchData.getDpid());
     }
 
     /**
@@ -83,18 +83,18 @@
      */
     //todo - add t-port specific properties
     public Port addTPort(Switch sw, Long portNumber) {
-        PortEvent portEvent = new PortEvent(sw.getDpid(),
+        PortData portData = new PortData(sw.getDpid(),
                                     PortNumber.uint16(portNumber.shortValue()));
-        portEvent.createStringAttribute(TopologyElement.TYPE,
+        portData.createStringAttribute(TopologyElement.TYPE,
                                         TopologyElement.TYPE_OPTICAL_LAYER);
-        portEvent.createStringAttribute(TopologyElement.ELEMENT_TYPE,
+        portData.createStringAttribute(TopologyElement.ELEMENT_TYPE,
                                         PortType.TRANSPONDER_PORT.toString());
-        portEvent.createStringAttribute(TopologyElement.ELEMENT_CONFIG_STATE,
+        portData.createStringAttribute(TopologyElement.ELEMENT_CONFIG_STATE,
                                         ConfigState.CONFIGURED.toString());
-        portEvent.createStringAttribute(TopologyElement.ELEMENT_ADMIN_STATUS,
+        portData.createStringAttribute(TopologyElement.ELEMENT_ADMIN_STATUS,
                                         AdminStatus.INACTIVE.toString());
-        this.putPort(portEvent);
-        return this.getPort(sw.getDpid(), portEvent.getPortNumber());
+        this.putPort(portData);
+        return this.getPort(sw.getDpid(), portData.getPortNumber());
     }
 
     /**
@@ -106,18 +106,18 @@
      */
     //todo - add w-port specific properties
     public Port addWPort(Switch sw, Long portNumber) {
-        PortEvent portEvent = new PortEvent(sw.getDpid(),
+        PortData portData = new PortData(sw.getDpid(),
                                     PortNumber.uint16(portNumber.shortValue()));
-        portEvent.createStringAttribute(TopologyElement.TYPE,
+        portData.createStringAttribute(TopologyElement.TYPE,
                                         TopologyElement.TYPE_OPTICAL_LAYER);
-        portEvent.createStringAttribute(TopologyElement.ELEMENT_TYPE,
+        portData.createStringAttribute(TopologyElement.ELEMENT_TYPE,
                                         PortType.WDM_PORT.toString());
-        portEvent.createStringAttribute(TopologyElement.ELEMENT_CONFIG_STATE,
+        portData.createStringAttribute(TopologyElement.ELEMENT_CONFIG_STATE,
                                         ConfigState.CONFIGURED.toString());
-        portEvent.createStringAttribute(TopologyElement.ELEMENT_ADMIN_STATUS,
+        portData.createStringAttribute(TopologyElement.ELEMENT_ADMIN_STATUS,
                                         AdminStatus.INACTIVE.toString());
-        this.putPort(portEvent);
-        return this.getPort(sw.getDpid(), portEvent.getPortNumber());
+        this.putPort(portData);
+        return this.getPort(sw.getDpid(), portData.getPortNumber());
     }
 
     /**
@@ -145,19 +145,19 @@
         final Dpid dstDpidObj = new Dpid(dstDpid);
         final PortNumber srcPortNum = PortNumber.uint16(srcPortNo.shortValue());
         final PortNumber dstPortNum = PortNumber.uint16(dstPortNo.shortValue());
-        LinkEvent linkEvent = new LinkEvent(new SwitchPort(srcDpidObj,
+        LinkData linkData = new LinkData(new SwitchPort(srcDpidObj,
                                                            srcPortNum),
                                             new SwitchPort(dstDpidObj,
                                                            dstPortNum));
-        linkEvent.createStringAttribute(TopologyElement.TYPE, type);
-        linkEvent.createStringAttribute(TopologyElement.ELEMENT_TYPE,
+        linkData.createStringAttribute(TopologyElement.TYPE, type);
+        linkData.createStringAttribute(TopologyElement.ELEMENT_TYPE,
                                         linkType.toString());
-        linkEvent.createStringAttribute(TopologyElement.ELEMENT_CONFIG_STATE,
+        linkData.createStringAttribute(TopologyElement.ELEMENT_CONFIG_STATE,
                                         configState.toString());
-        linkEvent.createStringAttribute(TopologyElement.ELEMENT_ADMIN_STATUS,
+        linkData.createStringAttribute(TopologyElement.ELEMENT_ADMIN_STATUS,
                                         adminStatus.toString());
-        LinkEvent[] links = new LinkEvent[1];
-        links[0] = linkEvent;
+        LinkData[] links = new LinkData[1];
+        links[0] = linkData;
         putLink(links[0]);
 
     }
diff --git a/src/test/java/net/onrc/onos/core/topology/MockTopology.java b/src/test/java/net/onrc/onos/core/topology/MockTopology.java
index 05660f7..df21f36 100644
--- a/src/test/java/net/onrc/onos/core/topology/MockTopology.java
+++ b/src/test/java/net/onrc/onos/core/topology/MockTopology.java
@@ -22,13 +22,13 @@
     public SwitchImpl sw1, sw2, sw3, sw4;
 
     public Switch addSwitch(Long switchId) {
-        SwitchEvent sw = new SwitchEvent(new Dpid(switchId));
+        SwitchData sw = new SwitchData(new Dpid(switchId));
         this.putSwitch(sw);
         return this.getSwitch(sw.getDpid());
     }
 
     public Port addPort(Switch sw, Long portNumber) {
-        PortEvent port = new PortEvent(sw.getDpid(),
+        PortData port = new PortData(sw.getDpid(),
                                 PortNumber.uint16(portNumber.shortValue()));
         ((TopologyImpl) this).putPort(port);
         return this.getPort(port.getSwitchPort());
@@ -42,11 +42,11 @@
     public void addBidirectionalLinks(Long srcDpid, Long srcPortNo,
                                       Long dstDpid, Long dstPortNo,
                                       Double capacity) {
-        LinkEvent[] links = new LinkEvent[2];
+        LinkData[] links = new LinkData[2];
         final SwitchPort src = new SwitchPort(srcDpid, srcPortNo);
         final SwitchPort dst = new SwitchPort(dstDpid, dstPortNo);
-        links[0] = new LinkEvent(src, dst);
-        links[1] = new LinkEvent(dst, src);
+        links[0] = new LinkData(src, dst);
+        links[1] = new LinkData(dst, src);
         if (capacity != null) {
             links[0].setCapacity(capacity);
             links[1].setCapacity(capacity);
@@ -128,13 +128,13 @@
         Port port43 = addPort(sw4, 43L); // sw4 -> sw3
 
         MACAddress mac1 = MACAddress.valueOf("00:44:33:22:11:00");
-        HostEvent host1 = new HostEvent(mac1);
+        HostData host1 = new HostData(mac1);
         host1.addAttachmentPoint(port15.getSwitchPort());
         host1.setLastSeenTime(1L);
         this.putHost(host1);
 
         MACAddress mac3 = MACAddress.valueOf("00:11:22:33:44:55");
-        HostEvent host3 = new HostEvent(mac3);
+        HostData host3 = new HostData(mac3);
         host3.addAttachmentPoint(port35.getSwitchPort());
         host3.setLastSeenTime(1L);
         this.putHost(host3);
diff --git a/src/test/java/net/onrc/onos/core/topology/TopologyImplTest.java b/src/test/java/net/onrc/onos/core/topology/TopologyImplTest.java
index 99a7993..3be8f92 100644
--- a/src/test/java/net/onrc/onos/core/topology/TopologyImplTest.java
+++ b/src/test/java/net/onrc/onos/core/topology/TopologyImplTest.java
@@ -49,16 +49,16 @@
         // Create a number of switches and install two ports for each switch
         for (long switchID = 1; switchID <= TEST_SWITCH_NUM; switchID++) {
             final Dpid dpid = new Dpid(switchID);
-            SwitchEvent testSwitch = new SwitchEvent(dpid);
+            SwitchData testSwitch = new SwitchData(dpid);
             testTopology.putSwitch(testSwitch);
-            testTopology.putPort(new PortEvent(dpid, PORT_NUMBER_1));
-            testTopology.putPort(new PortEvent(dpid, PORT_NUMBER_2));
-            PortEvent hostPort = new PortEvent(dpid, PORT_NUMBER_HOST);
+            testTopology.putPort(new PortData(dpid, PORT_NUMBER_1));
+            testTopology.putPort(new PortData(dpid, PORT_NUMBER_2));
+            PortData hostPort = new PortData(dpid, PORT_NUMBER_HOST);
             testTopology.putPort(hostPort);
 
             // Create a host for each switch
             MACAddress hostMac = MACAddress.valueOf(switchID);
-            HostEvent testHost = new HostEvent(hostMac);
+            HostData testHost = new HostData(hostMac);
             testHost.addAttachmentPoint(hostPort.getSwitchPort());
             testTopology.putHost(testHost);
         }
@@ -70,11 +70,11 @@
         for (long switchID = 1; switchID <= TEST_SWITCH_NUM; switchID++) {
             final Dpid dpidA = new Dpid(switchID);
             final Dpid dpidB = new Dpid(switchID % TEST_SWITCH_NUM + 1);
-            LinkEvent testLinkEast = new LinkEvent(
+            LinkData testLinkEast = new LinkData(
                     testTopology.getPort(dpidA, PORT_NUMBER_2).getSwitchPort(),
                     testTopology.getPort(dpidB, PORT_NUMBER_1).getSwitchPort()
                     );
-            LinkEvent testLinkWest = new LinkEvent(
+            LinkData testLinkWest = new LinkData(
                     testTopology.getPort(dpidB, PORT_NUMBER_1).getSwitchPort(),
                     testTopology.getPort(dpidA, PORT_NUMBER_2).getSwitchPort()
                     );
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 35bf039..fc7b5b1 100644
--- a/src/test/java/net/onrc/onos/core/topology/TopologyManagerTest.java
+++ b/src/test/java/net/onrc/onos/core/topology/TopologyManagerTest.java
@@ -278,21 +278,21 @@
         PortNumber portNumber = PortNumber.uint32(1);
 
         // Generate the Switch Event along with a Port Event
-        SwitchEvent switchEvent = new SwitchEvent(DPID_1);
-        Collection<PortEvent> portEvents = new ArrayList<PortEvent>();
-        portEvents.add(new PortEvent(DPID_1, portNumber));
+        SwitchData switchData = new SwitchData(DPID_1);
+        Collection<PortData> portDataEntries = new ArrayList<PortData>();
+        portDataEntries.add(new PortData(DPID_1, portNumber));
 
         // Call the TopologyPublisher function for adding a Switch
         TestUtils.callMethod(theTopologyPublisher,
                              "publishAddSwitchEvent",
-                             new Class<?>[] {SwitchEvent.class,
+                             new Class<?>[] {SwitchData.class,
                                      Collection.class},
-                             switchEvent, portEvents);
+                             switchData, portDataEntries);
         // Call the TopologyPublisher function for adding a Port
-        for (PortEvent portEvent : portEvents) {
+        for (PortData portData : portDataEntries) {
             TestUtils.callMethod(theTopologyPublisher,
                                  "publishAddPortEvent",
-                                 PortEvent.class, portEvent);
+                                 PortData.class, portData);
         }
 
         // Verify the function calls
@@ -315,27 +315,27 @@
         PortNumber portNumber = PortNumber.uint32(1);
 
         // Generate the Switch Event along with a Port Event
-        SwitchEvent switchEvent = new SwitchEvent(DPID_1);
-        Collection<PortEvent> portEvents = new ArrayList<PortEvent>();
-        portEvents.add(new PortEvent(DPID_1, portNumber));
+        SwitchData switchData = new SwitchData(DPID_1);
+        Collection<PortData> portDataEntries = new ArrayList<PortData>();
+        portDataEntries.add(new PortData(DPID_1, portNumber));
 
         // Call the TopologyPublisher function for adding a Switch and Ports
         TestUtils.callMethod(theTopologyPublisher,
                              "publishAddSwitchEvent",
-                             new Class<?>[] {SwitchEvent.class,
+                             new Class<?>[] {SwitchData.class,
                                      Collection.class},
-                             switchEvent, portEvents);
+                             switchData, portDataEntries);
 
         // Call the TopologyPublisher function for removing a Port
-        for (PortEvent portEvent : portEvents) {
+        for (PortData portData : portDataEntries) {
             TestUtils.callMethod(theTopologyPublisher,
                                  "publishRemovePortEvent",
-                                 PortEvent.class, portEvent);
+                                 PortData.class, portData);
         }
         // Call the TopologyPublisher function for removing a Switch
         TestUtils.callMethod(theTopologyPublisher,
                              "publishRemoveSwitchEvent",
-                             SwitchEvent.class, switchEvent);
+                             SwitchData.class, switchData);
 
         // Verify the function calls
         verify(eventChannel);
@@ -357,39 +357,39 @@
 
         // Generate the Switch and Port Events
         PortNumber portNumber1 = PortNumber.uint32(1);
-        SwitchEvent switchEvent1 = new SwitchEvent(DPID_1);
-        Collection<PortEvent> portEvents1 = new ArrayList<PortEvent>();
-        portEvents1.add(new PortEvent(DPID_1, portNumber1));
+        SwitchData switchData1 = new SwitchData(DPID_1);
+        Collection<PortData> portDataEntries1 = new ArrayList<PortData>();
+        portDataEntries1.add(new PortData(DPID_1, portNumber1));
 
         // Call the TopologyPublisher function for adding a Switch
         TestUtils.callMethod(theTopologyPublisher,
                              "publishAddSwitchEvent",
-                             new Class<?>[] {SwitchEvent.class,
+                             new Class<?>[] {SwitchData.class,
                                      Collection.class},
-                             switchEvent1, portEvents1);
+                             switchData1, portDataEntries1);
 
         // Generate the Switch and Port Events
         PortNumber portNumber2 = PortNumber.uint32(2);
-        SwitchEvent switchEvent2 = new SwitchEvent(DPID_2);
-        Collection<PortEvent> portEvents2 = new ArrayList<PortEvent>();
-        portEvents2.add(new PortEvent(DPID_2, portNumber2));
+        SwitchData switchData2 = new SwitchData(DPID_2);
+        Collection<PortData> portDataEntries2 = new ArrayList<PortData>();
+        portDataEntries2.add(new PortData(DPID_2, portNumber2));
 
         // Call the TopologyPublisher function for adding a Switch
         TestUtils.callMethod(theTopologyPublisher,
                              "publishAddSwitchEvent",
-                             new Class<?>[] {SwitchEvent.class,
+                             new Class<?>[] {SwitchData.class,
                                      Collection.class},
-                             switchEvent2, portEvents2);
+                             switchData2, portDataEntries2);
 
         // Generate the Link Event
-        LinkEvent linkEvent =
-            new LinkEvent(new SwitchPort(DPID_1, portNumber1),
+        LinkData linkData =
+            new LinkData(new SwitchPort(DPID_1, portNumber1),
                           new SwitchPort(DPID_2, portNumber2));
 
         // Call the TopologyPublisher function for adding a Link
         TestUtils.callMethod(theTopologyPublisher,
                              "publishAddLinkEvent",
-                             LinkEvent.class, linkEvent);
+                             LinkData.class, linkData);
 
         // Verify the function calls
         verify(eventChannel);
@@ -409,44 +409,44 @@
 
         // Generate the Switch and Port Events
         PortNumber portNumber1 = PortNumber.uint32(1);
-        SwitchEvent switchEvent1 = new SwitchEvent(DPID_1);
-        Collection<PortEvent> portEvents1 = new ArrayList<PortEvent>();
-        portEvents1.add(new PortEvent(DPID_1, portNumber1));
+        SwitchData switchData1 = new SwitchData(DPID_1);
+        Collection<PortData> portDataEntries1 = new ArrayList<PortData>();
+        portDataEntries1.add(new PortData(DPID_1, portNumber1));
 
         // Call the TopologyPublisher function for adding a Switch
         TestUtils.callMethod(theTopologyPublisher,
                              "publishAddSwitchEvent",
-                             new Class<?>[] {SwitchEvent.class,
+                             new Class<?>[] {SwitchData.class,
                                      Collection.class},
-                             switchEvent1, portEvents1);
+                             switchData1, portDataEntries1);
 
         // Generate the Switch and Port Events
         PortNumber portNumber2 = PortNumber.uint32(2);
-        SwitchEvent switchEvent2 = new SwitchEvent(DPID_2);
-        Collection<PortEvent> portEvents2 = new ArrayList<PortEvent>();
-        portEvents2.add(new PortEvent(DPID_2, portNumber2));
+        SwitchData switchData2 = new SwitchData(DPID_2);
+        Collection<PortData> portDataEntries2 = new ArrayList<PortData>();
+        portDataEntries2.add(new PortData(DPID_2, portNumber2));
 
         // Call the TopologyPublisher function for adding a Switch
         TestUtils.callMethod(theTopologyPublisher,
                              "publishAddSwitchEvent",
-                             new Class<?>[] {SwitchEvent.class,
+                             new Class<?>[] {SwitchData.class,
                                      Collection.class},
-                             switchEvent2, portEvents2);
+                             switchData2, portDataEntries2);
 
         // Generate the Link Event
-        LinkEvent linkEvent =
-            new LinkEvent(new SwitchPort(DPID_1, portNumber1),
+        LinkData linkData =
+            new LinkData(new SwitchPort(DPID_1, portNumber1),
                           new SwitchPort(DPID_2, portNumber2));
 
         // Call the TopologyPublisher function for adding a Link
         TestUtils.callMethod(theTopologyPublisher,
                              "publishAddLinkEvent",
-                             LinkEvent.class, linkEvent);
+                             LinkData.class, linkData);
 
         // Call the TopologyPublisher function for removing a Link
         TestUtils.callMethod(theTopologyPublisher,
                              "publishRemoveLinkEvent",
-                             LinkEvent.class, linkEvent);
+                             LinkData.class, linkData);
 
         // Verify the function calls
         verify(eventChannel);
@@ -467,16 +467,16 @@
 
         // Generate the Switch and Port Events
         PortNumber portNumber1 = PortNumber.uint32(1);
-        SwitchEvent switchEvent1 = new SwitchEvent(DPID_1);
-        Collection<PortEvent> portEvents1 = new ArrayList<PortEvent>();
-        portEvents1.add(new PortEvent(DPID_1, portNumber1));
+        SwitchData switchData1 = new SwitchData(DPID_1);
+        Collection<PortData> portDataEntries1 = new ArrayList<PortData>();
+        portDataEntries1.add(new PortData(DPID_1, portNumber1));
 
         // Call the TopologyPublisher function for adding a Switch
         TestUtils.callMethod(theTopologyPublisher,
                              "publishAddSwitchEvent",
-                             new Class<?>[] {SwitchEvent.class,
+                             new Class<?>[] {SwitchData.class,
                                      Collection.class},
-                             switchEvent1, portEvents1);
+                             switchData1, portDataEntries1);
 
         // Generate the Host Event
         PortNumber portNumber = PortNumber.uint32(1);
@@ -484,13 +484,13 @@
         SwitchPort sp = new SwitchPort(DPID_1, portNumber);
         List<SwitchPort> spLists = new ArrayList<SwitchPort>();
         spLists.add(sp);
-        HostEvent hostEvent = new HostEvent(hostMac);
-        hostEvent.setAttachmentPoints(spLists);
+        HostData hostData = new HostData(hostMac);
+        hostData.setAttachmentPoints(spLists);
 
         // Call the TopologyPublisher function for adding a Host
         TestUtils.callMethod(theTopologyPublisher,
                              "publishAddHostEvent",
-                             HostEvent.class, hostEvent);
+                             HostData.class, hostData);
 
         // Verify the function calls
         verify(eventChannel);
@@ -510,16 +510,16 @@
 
         // Generate the Switch and Port Events
         PortNumber portNumber1 = PortNumber.uint32(1);
-        SwitchEvent switchEvent1 = new SwitchEvent(DPID_1);
-        Collection<PortEvent> portEvents1 = new ArrayList<PortEvent>();
-        portEvents1.add(new PortEvent(DPID_1, portNumber1));
+        SwitchData switchData1 = new SwitchData(DPID_1);
+        Collection<PortData> portDataEntries1 = new ArrayList<PortData>();
+        portDataEntries1.add(new PortData(DPID_1, portNumber1));
 
         // Call the TopologyPublisher function for adding a Switch
         TestUtils.callMethod(theTopologyPublisher,
                              "publishAddSwitchEvent",
-                             new Class<?>[] {SwitchEvent.class,
+                             new Class<?>[] {SwitchData.class,
                                      Collection.class},
-                             switchEvent1, portEvents1);
+                             switchData1, portDataEntries1);
 
         // Generate the Host Event
         PortNumber portNumber = PortNumber.uint32(1);
@@ -527,18 +527,18 @@
         SwitchPort sp = new SwitchPort(DPID_1, portNumber);
         List<SwitchPort> spLists = new ArrayList<SwitchPort>();
         spLists.add(sp);
-        HostEvent hostEvent = new HostEvent(hostMac);
-        hostEvent.setAttachmentPoints(spLists);
+        HostData hostData = new HostData(hostMac);
+        hostData.setAttachmentPoints(spLists);
 
         // Call the TopologyPublisher function for adding a Host
         TestUtils.callMethod(theTopologyPublisher,
                              "publishAddHostEvent",
-                             HostEvent.class, hostEvent);
+                             HostData.class, hostData);
 
         // Call the TopologyPublisher function for removing a Host
         TestUtils.callMethod(theTopologyPublisher,
                              "publishRemoveHostEvent",
-                             HostEvent.class, hostEvent);
+                             HostData.class, hostData);
 
         // Verify the function calls
         verify(eventChannel);
@@ -613,24 +613,24 @@
     public void testAddSwitch() {
         setupTopologyManager();
 
-        SwitchEvent sw = new SwitchEvent(DPID_1);
+        SwitchData sw = new SwitchData(DPID_1);
         sw.createStringAttribute("foo", "bar");
 
         TestUtils.callMethod(theTopologyManager, "addSwitch",
-                             SwitchEvent.class, sw);
+                             SwitchData.class, sw);
 
         // Check the topology structure
         BaseInternalTopology topology =
             (BaseInternalTopology) theTopologyManager.getTopology();
-        SwitchEvent swInTopo = topology.getSwitchEvent(DPID_1);
+        SwitchData swInTopo = topology.getSwitchData(DPID_1);
         assertEquals(sw, swInTopo);
         assertTrue(swInTopo.isFrozen());
         assertEquals("bar", swInTopo.getStringAttribute("foo"));
 
         // Check the events to be fired
-        List<SwitchEvent> apiAddedSwitchEvents
-            = TestUtils.getField(theTopologyManager, "apiAddedSwitchEvents");
-        assertThat(apiAddedSwitchEvents, hasItem(sw));
+        List<SwitchData> apiAddedSwitchDataEntries
+            = TestUtils.getField(theTopologyManager, "apiAddedSwitchDataEntries");
+        assertThat(apiAddedSwitchDataEntries, hasItem(sw));
     }
 
     /**
@@ -640,36 +640,36 @@
     public void testAddPort() {
         setupTopologyManager();
 
-        SwitchEvent sw = new SwitchEvent(DPID_1);
+        SwitchData sw = new SwitchData(DPID_1);
         sw.createStringAttribute("foo", "bar");
 
         final PortNumber portNumber = PortNumber.uint32(2);
-        PortEvent port = new PortEvent(DPID_1, portNumber);
+        PortData port = new PortData(DPID_1, portNumber);
         port.createStringAttribute("fuzz", "buzz");
 
         TestUtils.callMethod(theTopologyManager, "addSwitch",
-                             SwitchEvent.class, sw);
+                             SwitchData.class, sw);
         TestUtils.callMethod(theTopologyManager, "addPort",
-                             PortEvent.class, port);
+                             PortData.class, port);
 
         // Check the topology structure
         BaseInternalTopology topology =
             (BaseInternalTopology) theTopologyManager.getTopology();
-        SwitchEvent swInTopo = topology.getSwitchEvent(DPID_1);
+        SwitchData swInTopo = topology.getSwitchData(DPID_1);
         assertEquals(sw, swInTopo);
         assertTrue(swInTopo.isFrozen());
         assertEquals("bar", swInTopo.getStringAttribute("foo"));
 
         final SwitchPort switchPort = new SwitchPort(DPID_1, portNumber);
-        PortEvent portInTopo = topology.getPortEvent(switchPort);
+        PortData portInTopo = topology.getPortData(switchPort);
         assertEquals(port, portInTopo);
         assertTrue(portInTopo.isFrozen());
         assertEquals("buzz", portInTopo.getStringAttribute("fuzz"));
 
         // Check the events to be fired
-        List<PortEvent> apiAddedPortEvents
-            = TestUtils.getField(theTopologyManager, "apiAddedPortEvents");
-        assertThat(apiAddedPortEvents, hasItem(port));
+        List<PortData> apiAddedPortDataEntries
+            = TestUtils.getField(theTopologyManager, "apiAddedPortDataEntries");
+        assertThat(apiAddedPortDataEntries, hasItem(port));
     }
 
     /**
@@ -680,46 +680,46 @@
     public void testRemovePortThenSwitch() {
         setupTopologyManager();
 
-        SwitchEvent sw = new SwitchEvent(DPID_1);
+        SwitchData sw = new SwitchData(DPID_1);
         sw.createStringAttribute("foo", "bar");
 
         final PortNumber portNumber = PortNumber.uint32(2);
-        PortEvent port = new PortEvent(DPID_1, portNumber);
+        PortData port = new PortData(DPID_1, portNumber);
         port.createStringAttribute("fuzz", "buzz");
 
         TestUtils.callMethod(theTopologyManager, "addSwitch",
-                             SwitchEvent.class, sw);
+                             SwitchData.class, sw);
         TestUtils.callMethod(theTopologyManager, "addPort",
-                             PortEvent.class, port);
+                             PortData.class, port);
 
         // Check the topology structure
         BaseInternalTopology topology =
             (BaseInternalTopology) theTopologyManager.getTopology();
-        SwitchEvent swInTopo = topology.getSwitchEvent(DPID_1);
+        SwitchData swInTopo = topology.getSwitchData(DPID_1);
         assertEquals(sw, swInTopo);
         assertTrue(swInTopo.isFrozen());
         assertEquals("bar", swInTopo.getStringAttribute("foo"));
 
         final SwitchPort switchPort = new SwitchPort(DPID_1, portNumber);
-        PortEvent portInTopo = topology.getPortEvent(switchPort);
+        PortData portInTopo = topology.getPortData(switchPort);
         assertEquals(port, portInTopo);
         assertTrue(portInTopo.isFrozen());
         assertEquals("buzz", portInTopo.getStringAttribute("fuzz"));
 
         // Remove in proper order
         TestUtils.callMethod(theTopologyManager, "removePort",
-                            PortEvent.class, new PortEvent(port));
+                            PortData.class, new PortData(port));
         TestUtils.callMethod(theTopologyManager, "removeSwitch",
-                            SwitchEvent.class, new SwitchEvent(sw));
+                            SwitchData.class, new SwitchData(sw));
 
 
         // Check the events to be fired
-        List<PortEvent> apiRemovedPortEvents
-            = TestUtils.getField(theTopologyManager, "apiRemovedPortEvents");
-        assertThat(apiRemovedPortEvents, hasItem(port));
-        List<SwitchEvent> apiRemovedSwitchEvents
-            = TestUtils.getField(theTopologyManager, "apiRemovedSwitchEvents");
-        assertThat(apiRemovedSwitchEvents, hasItem(sw));
+        List<PortData> apiRemovedPortDataEntries
+            = TestUtils.getField(theTopologyManager, "apiRemovedPortDataEntries");
+        assertThat(apiRemovedPortDataEntries, hasItem(port));
+        List<SwitchData> apiRemovedSwitchDataEntries
+            = TestUtils.getField(theTopologyManager, "apiRemovedSwitchDataEntries");
+        assertThat(apiRemovedSwitchDataEntries, hasItem(sw));
     }
 
     /**
@@ -730,47 +730,47 @@
     public void testRemoveSwitchWithoutPortRemoval() {
         setupTopologyManager();
 
-        SwitchEvent sw = new SwitchEvent(DPID_1);
+        SwitchData sw = new SwitchData(DPID_1);
         sw.createStringAttribute("foo", "bar");
 
         final PortNumber portNumber = PortNumber.uint32(2);
-        PortEvent port = new PortEvent(DPID_1, portNumber);
+        PortData port = new PortData(DPID_1, portNumber);
         port.createStringAttribute("fuzz", "buzz");
 
         TestUtils.callMethod(theTopologyManager, "addSwitch",
-                             SwitchEvent.class, sw);
+                             SwitchData.class, sw);
         TestUtils.callMethod(theTopologyManager, "addPort",
-                             PortEvent.class, port);
+                             PortData.class, port);
 
         // Check the topology structure
         BaseInternalTopology topology =
             (BaseInternalTopology) theTopologyManager.getTopology();
-        SwitchEvent swInTopo = topology.getSwitchEvent(DPID_1);
+        SwitchData swInTopo = topology.getSwitchData(DPID_1);
         assertEquals(sw, swInTopo);
         assertTrue(swInTopo.isFrozen());
         assertEquals("bar", swInTopo.getStringAttribute("foo"));
 
         final SwitchPort switchPort = new SwitchPort(DPID_1, portNumber);
-        PortEvent portInTopo = topology.getPortEvent(switchPort);
+        PortData portInTopo = topology.getPortData(switchPort);
         assertEquals(port, portInTopo);
         assertTrue(portInTopo.isFrozen());
         assertEquals("buzz", portInTopo.getStringAttribute("fuzz"));
 
         // Remove in in-proper order
 //        TestUtils.callMethod(theTopologyManager, "removePort",
-//                            PortEvent.class, new PortEvent(port));
+//                            PortData.class, new PortData(port));
         TestUtils.callMethod(theTopologyManager, "removeSwitch",
-                            SwitchEvent.class, new SwitchEvent(sw));
+                            SwitchData.class, new SwitchData(sw));
 
 
         // Check the events to be fired
         // The outcome should be the same as #testRemovePortThenSwitch
-        List<PortEvent> apiRemovedPortEvents
-            = TestUtils.getField(theTopologyManager, "apiRemovedPortEvents");
-        assertThat(apiRemovedPortEvents, hasItem(port));
-        List<SwitchEvent> apiRemovedSwitchEvents
-            = TestUtils.getField(theTopologyManager, "apiRemovedSwitchEvents");
-        assertThat(apiRemovedSwitchEvents, hasItem(sw));
+        List<PortData> apiRemovedPortDataEntries
+            = TestUtils.getField(theTopologyManager, "apiRemovedPortDataEntries");
+        assertThat(apiRemovedPortDataEntries, hasItem(port));
+        List<SwitchData> apiRemovedSwitchDataEntries
+            = TestUtils.getField(theTopologyManager, "apiRemovedSwitchDataEntries");
+        assertThat(apiRemovedSwitchDataEntries, hasItem(sw));
     }
 
     /**
@@ -780,73 +780,73 @@
     public void testAddLink() {
         setupTopologyManager();
 
-        SwitchEvent sw = new SwitchEvent(DPID_1);
+        SwitchData sw = new SwitchData(DPID_1);
         sw.createStringAttribute("foo", "bar");
 
         final PortNumber portNumberA = PortNumber.uint32(2);
-        PortEvent portA = new PortEvent(DPID_1, portNumberA);
+        PortData portA = new PortData(DPID_1, portNumberA);
         portA.createStringAttribute("fuzz", "buzz");
 
         final PortNumber portNumberB = PortNumber.uint32(3);
-        PortEvent portB = new PortEvent(DPID_1, portNumberB);
+        PortData portB = new PortData(DPID_1, portNumberB);
         portB.createStringAttribute("fizz", "buz");
 
-        LinkEvent linkA = new LinkEvent(portA.getSwitchPort(),
+        LinkData linkA = new LinkData(portA.getSwitchPort(),
                                         portB.getSwitchPort());
         linkA.createStringAttribute(TopologyElement.TYPE,
                                     TopologyElement.TYPE_OPTICAL_LAYER);
-        LinkEvent linkB = new LinkEvent(portB.getSwitchPort(),
+        LinkData linkB = new LinkData(portB.getSwitchPort(),
                                         portA.getSwitchPort());
         linkB.createStringAttribute(TopologyElement.TYPE,
                                     TopologyElement.TYPE_OPTICAL_LAYER);
 
         TestUtils.callMethod(theTopologyManager, "addSwitch",
-                             SwitchEvent.class, sw);
+                             SwitchData.class, sw);
         TestUtils.callMethod(theTopologyManager, "addPort",
-                             PortEvent.class, portA);
+                             PortData.class, portA);
         TestUtils.callMethod(theTopologyManager, "addPort",
-                             PortEvent.class, portB);
+                             PortData.class, portB);
         TestUtils.callMethod(theTopologyManager, "addLink",
-                             LinkEvent.class, linkA);
+                             LinkData.class, linkA);
         TestUtils.callMethod(theTopologyManager, "addLink",
-                             LinkEvent.class, linkB);
+                             LinkData.class, linkB);
 
         // Check the topology structure
         BaseInternalTopology topology =
             (BaseInternalTopology) theTopologyManager.getTopology();
-        SwitchEvent swInTopo = topology.getSwitchEvent(DPID_1);
+        SwitchData swInTopo = topology.getSwitchData(DPID_1);
         assertEquals(sw, swInTopo);
         assertTrue(swInTopo.isFrozen());
         assertEquals("bar", swInTopo.getStringAttribute("foo"));
 
         final SwitchPort switchPortA = new SwitchPort(DPID_1, portNumberA);
-        PortEvent portAInTopo = topology.getPortEvent(switchPortA);
+        PortData portAInTopo = topology.getPortData(switchPortA);
         assertEquals(portA, portAInTopo);
         assertTrue(portAInTopo.isFrozen());
         assertEquals("buzz", portAInTopo.getStringAttribute("fuzz"));
 
         final SwitchPort switchPortB = new SwitchPort(DPID_1, portNumberB);
-        PortEvent portBInTopo = topology.getPortEvent(switchPortB);
+        PortData portBInTopo = topology.getPortData(switchPortB);
         assertEquals(portB, portBInTopo);
         assertTrue(portBInTopo.isFrozen());
         assertEquals("buz", portBInTopo.getStringAttribute("fizz"));
 
-        LinkEvent linkAInTopo = topology.getLinkEvent(linkA.getLinkTuple());
+        LinkData linkAInTopo = topology.getLinkData(linkA.getLinkTuple());
         assertEquals(linkA, linkAInTopo);
         assertTrue(linkAInTopo.isFrozen());
         assertEquals(TopologyElement.TYPE_OPTICAL_LAYER,
                      linkAInTopo.getType());
 
-        LinkEvent linkBInTopo = topology.getLinkEvent(linkB.getLinkTuple());
+        LinkData linkBInTopo = topology.getLinkData(linkB.getLinkTuple());
         assertEquals(linkB, linkBInTopo);
         assertTrue(linkBInTopo.isFrozen());
         assertEquals(TopologyElement.TYPE_OPTICAL_LAYER,
                      linkBInTopo.getType());
 
         // Check the events to be fired
-        List<LinkEvent> apiAddedLinkEvents
-            = TestUtils.getField(theTopologyManager, "apiAddedLinkEvents");
-        assertThat(apiAddedLinkEvents, containsInAnyOrder(linkA, linkB));
+        List<LinkData> apiAddedLinkDataEntries
+            = TestUtils.getField(theTopologyManager, "apiAddedLinkDataEntries");
+        assertThat(apiAddedLinkDataEntries, containsInAnyOrder(linkA, linkB));
     }
 
     /**
@@ -857,115 +857,115 @@
     public void testAddLinkKickingOffHost() {
         setupTopologyManager();
 
-        SwitchEvent sw = new SwitchEvent(DPID_1);
+        SwitchData sw = new SwitchData(DPID_1);
         sw.createStringAttribute("foo", "bar");
 
         final PortNumber portNumberA = PortNumber.uint32(2);
-        PortEvent portA = new PortEvent(DPID_1, portNumberA);
+        PortData portA = new PortData(DPID_1, portNumberA);
         portA.createStringAttribute("fuzz", "buzz");
 
         final PortNumber portNumberB = PortNumber.uint32(3);
-        PortEvent portB = new PortEvent(DPID_1, portNumberB);
+        PortData portB = new PortData(DPID_1, portNumberB);
         portB.createStringAttribute("fizz", "buz");
 
         final PortNumber portNumberC = PortNumber.uint32(4);
-        PortEvent portC = new PortEvent(DPID_1, portNumberC);
+        PortData portC = new PortData(DPID_1, portNumberC);
         portC.createStringAttribute("fizz", "buz");
 
         final MACAddress macA = MACAddress.valueOf(666L);
-        HostEvent hostA = new HostEvent(macA);
+        HostData hostA = new HostData(macA);
         hostA.addAttachmentPoint(portA.getSwitchPort());
         final long timestampA = 392893200L;
         hostA.setLastSeenTime(timestampA);
 
         final MACAddress macB = MACAddress.valueOf(999L);
-        HostEvent hostB = new HostEvent(macB);
+        HostData hostB = new HostData(macB);
         hostB.addAttachmentPoint(portB.getSwitchPort());
         hostB.addAttachmentPoint(portC.getSwitchPort());
         final long timestampB = 392893201L;
         hostB.setLastSeenTime(timestampB);
 
 
-        LinkEvent linkA = new LinkEvent(portA.getSwitchPort(),
+        LinkData linkA = new LinkData(portA.getSwitchPort(),
                                         portB.getSwitchPort());
         linkA.createStringAttribute(TopologyElement.TYPE,
                                     TopologyElement.TYPE_OPTICAL_LAYER);
-        LinkEvent linkB = new LinkEvent(portB.getSwitchPort(),
+        LinkData linkB = new LinkData(portB.getSwitchPort(),
                                         portA.getSwitchPort());
         linkB.createStringAttribute(TopologyElement.TYPE,
                                     TopologyElement.TYPE_OPTICAL_LAYER);
 
         TestUtils.callMethod(theTopologyManager, "addSwitch",
-                             SwitchEvent.class, sw);
+                             SwitchData.class, sw);
         TestUtils.callMethod(theTopologyManager, "addPort",
-                             PortEvent.class, portA);
+                             PortData.class, portA);
         TestUtils.callMethod(theTopologyManager, "addPort",
-                             PortEvent.class, portB);
+                             PortData.class, portB);
         TestUtils.callMethod(theTopologyManager, "addPort",
-                             PortEvent.class, portC);
+                             PortData.class, portC);
         TestUtils.callMethod(theTopologyManager, "addHost",
-                             HostEvent.class, hostA);
+                             HostData.class, hostA);
         TestUtils.callMethod(theTopologyManager, "addHost",
-                             HostEvent.class, hostB);
+                             HostData.class, hostB);
 
         TestUtils.callMethod(theTopologyManager, "addLink",
-                             LinkEvent.class, linkA);
+                             LinkData.class, linkA);
         TestUtils.callMethod(theTopologyManager, "addLink",
-                             LinkEvent.class, linkB);
+                             LinkData.class, linkB);
 
         // Check the topology structure
         BaseInternalTopology topology =
             (BaseInternalTopology) theTopologyManager.getTopology();
-        SwitchEvent swInTopo = topology.getSwitchEvent(DPID_1);
+        SwitchData swInTopo = topology.getSwitchData(DPID_1);
         assertEquals(sw, swInTopo);
         assertTrue(swInTopo.isFrozen());
         assertEquals("bar", swInTopo.getStringAttribute("foo"));
 
         final SwitchPort switchPortA = new SwitchPort(DPID_1, portNumberA);
-        PortEvent portAInTopo = topology.getPortEvent(switchPortA);
+        PortData portAInTopo = topology.getPortData(switchPortA);
         assertEquals(portA, portAInTopo);
         assertTrue(portAInTopo.isFrozen());
         assertEquals("buzz", portAInTopo.getStringAttribute("fuzz"));
 
         final SwitchPort switchPortB = new SwitchPort(DPID_1, portNumberB);
-        PortEvent portBInTopo = topology.getPortEvent(switchPortB);
+        PortData portBInTopo = topology.getPortData(switchPortB);
         assertEquals(portB, portBInTopo);
         assertTrue(portBInTopo.isFrozen());
         assertEquals("buz", portBInTopo.getStringAttribute("fizz"));
 
         // hostA expected to be removed
-        assertNull(topology.getHostEvent(macA));
+        assertNull(topology.getHostData(macA));
         // hostB expected to be there with reduced attachment point
-        HostEvent hostBrev = new HostEvent(macB);
+        HostData hostBrev = new HostData(macB);
         hostBrev.addAttachmentPoint(portC.getSwitchPort());
         hostBrev.setLastSeenTime(timestampB);
         hostBrev.freeze();
-        assertEquals(hostBrev, topology.getHostEvent(macB));
+        assertEquals(hostBrev, topology.getHostData(macB));
 
 
-        LinkEvent linkAInTopo = topology.getLinkEvent(linkA.getLinkTuple());
+        LinkData linkAInTopo = topology.getLinkData(linkA.getLinkTuple());
         assertEquals(linkA, linkAInTopo);
         assertTrue(linkAInTopo.isFrozen());
         assertEquals(TopologyElement.TYPE_OPTICAL_LAYER,
                      linkAInTopo.getType());
 
-        LinkEvent linkBInTopo = topology.getLinkEvent(linkB.getLinkTuple());
+        LinkData linkBInTopo = topology.getLinkData(linkB.getLinkTuple());
         assertEquals(linkB, linkBInTopo);
         assertTrue(linkBInTopo.isFrozen());
         assertEquals(TopologyElement.TYPE_OPTICAL_LAYER,
                      linkBInTopo.getType());
 
         // Check the events to be fired
-        List<HostEvent> apiAddedHostEvents
-            = TestUtils.getField(theTopologyManager, "apiAddedHostEvents");
-        assertThat(apiAddedHostEvents, hasItem(hostBrev));
+        List<HostData> apiAddedHostDataEntries
+            = TestUtils.getField(theTopologyManager, "apiAddedHostDataEntries");
+        assertThat(apiAddedHostDataEntries, hasItem(hostBrev));
 
-        List<HostEvent> apiRemovedHostEvents
-            = TestUtils.getField(theTopologyManager, "apiRemovedHostEvents");
-        assertThat(apiRemovedHostEvents, hasItem(hostA));
-        List<LinkEvent> apiAddedLinkEvents
-            = TestUtils.getField(theTopologyManager, "apiAddedLinkEvents");
-        assertThat(apiAddedLinkEvents, containsInAnyOrder(linkA, linkB));
+        List<HostData> apiRemovedHostDataEntries
+            = TestUtils.getField(theTopologyManager, "apiRemovedHostDataEntries");
+        assertThat(apiRemovedHostDataEntries, hasItem(hostA));
+        List<LinkData> apiAddedLinkDataEntries
+            = TestUtils.getField(theTopologyManager, "apiAddedLinkDataEntries");
+        assertThat(apiAddedLinkDataEntries, containsInAnyOrder(linkA, linkB));
     }
 
     /**
@@ -975,65 +975,65 @@
     public void testRemoveLink() {
         setupTopologyManager();
 
-        SwitchEvent sw = new SwitchEvent(DPID_1);
+        SwitchData sw = new SwitchData(DPID_1);
         sw.createStringAttribute("foo", "bar");
 
         final PortNumber portNumberA = PortNumber.uint32(2);
-        PortEvent portA = new PortEvent(DPID_1, portNumberA);
+        PortData portA = new PortData(DPID_1, portNumberA);
         portA.createStringAttribute("fuzz", "buzz");
 
         final PortNumber portNumberB = PortNumber.uint32(3);
-        PortEvent portB = new PortEvent(DPID_1, portNumberB);
+        PortData portB = new PortData(DPID_1, portNumberB);
         portB.createStringAttribute("fizz", "buz");
 
-        LinkEvent linkA = new LinkEvent(portA.getSwitchPort(),
+        LinkData linkA = new LinkData(portA.getSwitchPort(),
                                         portB.getSwitchPort());
         linkA.createStringAttribute(TopologyElement.TYPE,
                                     TopologyElement.TYPE_OPTICAL_LAYER);
-        LinkEvent linkB = new LinkEvent(portB.getSwitchPort(),
+        LinkData linkB = new LinkData(portB.getSwitchPort(),
                                         portA.getSwitchPort());
         linkB.createStringAttribute(TopologyElement.TYPE,
                                     TopologyElement.TYPE_OPTICAL_LAYER);
 
         TestUtils.callMethod(theTopologyManager, "addSwitch",
-                             SwitchEvent.class, sw);
+                             SwitchData.class, sw);
         TestUtils.callMethod(theTopologyManager, "addPort",
-                             PortEvent.class, portA);
+                             PortData.class, portA);
         TestUtils.callMethod(theTopologyManager, "addPort",
-                             PortEvent.class, portB);
+                             PortData.class, portB);
         TestUtils.callMethod(theTopologyManager, "addLink",
-                             LinkEvent.class, linkA);
+                             LinkData.class, linkA);
         TestUtils.callMethod(theTopologyManager, "addLink",
-                             LinkEvent.class, linkB);
+                             LinkData.class, linkB);
 
         // Check the topology structure
         BaseInternalTopology topology =
             (BaseInternalTopology) theTopologyManager.getTopology();
-        SwitchEvent swInTopo = topology.getSwitchEvent(DPID_1);
+        SwitchData swInTopo = topology.getSwitchData(DPID_1);
         assertEquals(sw, swInTopo);
         assertTrue(swInTopo.isFrozen());
         assertEquals("bar", swInTopo.getStringAttribute("foo"));
 
         final SwitchPort switchPortA = new SwitchPort(DPID_1, portNumberA);
-        PortEvent portAInTopo = topology.getPortEvent(switchPortA);
+        PortData portAInTopo = topology.getPortData(switchPortA);
         assertEquals(portA, portAInTopo);
         assertTrue(portAInTopo.isFrozen());
         assertEquals("buzz", portAInTopo.getStringAttribute("fuzz"));
 
         final SwitchPort switchPortB = new SwitchPort(DPID_1, portNumberB);
-        PortEvent portBInTopo = topology.getPortEvent(switchPortB);
+        PortData portBInTopo = topology.getPortData(switchPortB);
         assertEquals(portB, portBInTopo);
         assertTrue(portBInTopo.isFrozen());
         assertEquals("buz", portBInTopo.getStringAttribute("fizz"));
 
-        LinkEvent linkAInTopo = topology.getLinkEvent(linkA.getLinkTuple());
+        LinkData linkAInTopo = topology.getLinkData(linkA.getLinkTuple());
         assertEquals(linkA, linkAInTopo);
         assertTrue(linkAInTopo.isFrozen());
         assertEquals(TopologyElement.TYPE_OPTICAL_LAYER,
                      linkAInTopo.getType());
 
 
-        LinkEvent linkBInTopo = topology.getLinkEvent(linkB.getLinkTuple());
+        LinkData linkBInTopo = topology.getLinkData(linkB.getLinkTuple());
         assertEquals(linkB, linkBInTopo);
         assertTrue(linkBInTopo.isFrozen());
         assertEquals(TopologyElement.TYPE_OPTICAL_LAYER,
@@ -1042,23 +1042,23 @@
         // Check the events to be fired
         // FIXME if link flapped (linkA in this scenario),
         //  linkA appears in both removed and added is this expected behavior?
-        List<LinkEvent> apiAddedLinkEvents
-            = TestUtils.getField(theTopologyManager, "apiAddedLinkEvents");
-        assertThat(apiAddedLinkEvents, containsInAnyOrder(linkA, linkB));
+        List<LinkData> apiAddedLinkDataEntries
+            = TestUtils.getField(theTopologyManager, "apiAddedLinkDataEntries");
+        assertThat(apiAddedLinkDataEntries, containsInAnyOrder(linkA, linkB));
 
         // Clear the events before removing the link
-        apiAddedLinkEvents.clear();
+        apiAddedLinkDataEntries.clear();
 
         // Remove the link
         TestUtils.callMethod(theTopologyManager, "removeLink",
-                             LinkEvent.class, new LinkEvent(linkA));
+                             LinkData.class, new LinkData(linkA));
 
-        LinkEvent linkANotInTopo = topology.getLinkEvent(linkA.getLinkTuple());
+        LinkData linkANotInTopo = topology.getLinkData(linkA.getLinkTuple());
         assertNull(linkANotInTopo);
 
-        List<LinkEvent> apiRemovedLinkEvents
-            = TestUtils.getField(theTopologyManager, "apiRemovedLinkEvents");
-        assertThat(apiRemovedLinkEvents, hasItem(linkA));
+        List<LinkData> apiRemovedLinkDataEntries
+            = TestUtils.getField(theTopologyManager, "apiRemovedLinkDataEntries");
+        assertThat(apiRemovedLinkDataEntries, hasItem(linkA));
     }
 
     /**
@@ -1069,102 +1069,102 @@
     public void testAddHostIgnoredByLink() {
         setupTopologyManager();
 
-        SwitchEvent sw = new SwitchEvent(DPID_1);
+        SwitchData sw = new SwitchData(DPID_1);
         sw.createStringAttribute("foo", "bar");
 
         final PortNumber portNumberA = PortNumber.uint32(2);
-        PortEvent portA = new PortEvent(DPID_1, portNumberA);
+        PortData portA = new PortData(DPID_1, portNumberA);
         portA.createStringAttribute("fuzz", "buzz");
 
         final PortNumber portNumberB = PortNumber.uint32(3);
-        PortEvent portB = new PortEvent(DPID_1, portNumberB);
+        PortData portB = new PortData(DPID_1, portNumberB);
         portB.createStringAttribute("fizz", "buz");
 
         final PortNumber portNumberC = PortNumber.uint32(4);
-        PortEvent portC = new PortEvent(DPID_1, portNumberC);
+        PortData portC = new PortData(DPID_1, portNumberC);
         portC.createStringAttribute("fizz", "buz");
 
-        LinkEvent linkA = new LinkEvent(portA.getSwitchPort(),
+        LinkData linkA = new LinkData(portA.getSwitchPort(),
                                         portB.getSwitchPort());
         linkA.createStringAttribute(TopologyElement.TYPE,
                                     TopologyElement.TYPE_OPTICAL_LAYER);
-        LinkEvent linkB = new LinkEvent(portB.getSwitchPort(),
+        LinkData linkB = new LinkData(portB.getSwitchPort(),
                                         portA.getSwitchPort());
         linkB.createStringAttribute(TopologyElement.TYPE,
                                     TopologyElement.TYPE_OPTICAL_LAYER);
 
         TestUtils.callMethod(theTopologyManager, "addSwitch",
-                             SwitchEvent.class, sw);
+                             SwitchData.class, sw);
         TestUtils.callMethod(theTopologyManager, "addPort",
-                             PortEvent.class, portA);
+                             PortData.class, portA);
         TestUtils.callMethod(theTopologyManager, "addPort",
-                             PortEvent.class, portB);
+                             PortData.class, portB);
         TestUtils.callMethod(theTopologyManager, "addPort",
-                             PortEvent.class, portC);
+                             PortData.class, portC);
         TestUtils.callMethod(theTopologyManager, "addLink",
-                             LinkEvent.class, linkA);
+                             LinkData.class, linkA);
         TestUtils.callMethod(theTopologyManager, "addLink",
-                             LinkEvent.class, linkB);
+                             LinkData.class, linkB);
 
         // Add hostA attached to a port which already has a link
         final MACAddress macA = MACAddress.valueOf(666L);
-        HostEvent hostA = new HostEvent(macA);
+        HostData hostA = new HostData(macA);
         hostA.addAttachmentPoint(portA.getSwitchPort());
         final long timestampA = 392893200L;
         hostA.setLastSeenTime(timestampA);
 
         TestUtils.callMethod(theTopologyManager, "addHost",
-                             HostEvent.class, hostA);
+                             HostData.class, hostA);
 
         // Add hostB attached to multiple ports,
         // some of them which already has a link
         final MACAddress macB = MACAddress.valueOf(999L);
-        HostEvent hostB = new HostEvent(macB);
+        HostData hostB = new HostData(macB);
         hostB.addAttachmentPoint(portB.getSwitchPort());
         hostB.addAttachmentPoint(portC.getSwitchPort());
         final long timestampB = 392893201L;
         hostB.setLastSeenTime(timestampB);
 
         TestUtils.callMethod(theTopologyManager, "addHost",
-                             HostEvent.class, hostB);
+                             HostData.class, hostB);
 
         // Check the topology structure
         BaseInternalTopology topology =
             (BaseInternalTopology) theTopologyManager.getTopology();
-        SwitchEvent swInTopo = topology.getSwitchEvent(DPID_1);
+        SwitchData swInTopo = topology.getSwitchData(DPID_1);
         assertEquals(sw, swInTopo);
         assertTrue(swInTopo.isFrozen());
         assertEquals("bar", swInTopo.getStringAttribute("foo"));
 
         final SwitchPort switchPortA = new SwitchPort(DPID_1, portNumberA);
-        PortEvent portAInTopo = topology.getPortEvent(switchPortA);
+        PortData portAInTopo = topology.getPortData(switchPortA);
         assertEquals(portA, portAInTopo);
         assertTrue(portAInTopo.isFrozen());
         assertEquals("buzz", portAInTopo.getStringAttribute("fuzz"));
 
         final SwitchPort switchPortB = new SwitchPort(DPID_1, portNumberB);
-        PortEvent portBInTopo = topology.getPortEvent(switchPortB);
+        PortData portBInTopo = topology.getPortData(switchPortB);
         assertEquals(portB, portBInTopo);
         assertTrue(portBInTopo.isFrozen());
         assertEquals("buz", portBInTopo.getStringAttribute("fizz"));
 
         // hostA expected to be completely ignored
-        assertNull(topology.getHostEvent(macA));
+        assertNull(topology.getHostData(macA));
         // hostB expected to be there with reduced attachment point
-        HostEvent hostBrev = new HostEvent(macB);
+        HostData hostBrev = new HostData(macB);
         hostBrev.addAttachmentPoint(portC.getSwitchPort());
         hostBrev.setLastSeenTime(timestampB);
         hostBrev.freeze();
-        assertEquals(hostBrev, topology.getHostEvent(macB));
+        assertEquals(hostBrev, topology.getHostData(macB));
 
 
-        LinkEvent linkAInTopo = topology.getLinkEvent(linkA.getLinkTuple());
+        LinkData linkAInTopo = topology.getLinkData(linkA.getLinkTuple());
         assertEquals(linkA, linkAInTopo);
         assertTrue(linkAInTopo.isFrozen());
         assertEquals(TopologyElement.TYPE_OPTICAL_LAYER,
                      linkAInTopo.getType());
 
-        LinkEvent linkBInTopo = topology.getLinkEvent(linkB.getLinkTuple());
+        LinkData linkBInTopo = topology.getLinkData(linkB.getLinkTuple());
         assertEquals(linkB, linkBInTopo);
         assertTrue(linkBInTopo.isFrozen());
         assertEquals(TopologyElement.TYPE_OPTICAL_LAYER,
@@ -1172,18 +1172,18 @@
 
         // Check the events to be fired
         // hostB should be added with reduced attachment points
-        List<HostEvent> apiAddedHostEvents
-            = TestUtils.getField(theTopologyManager, "apiAddedHostEvents");
-        assertThat(apiAddedHostEvents, hasItem(hostBrev));
+        List<HostData> apiAddedHostDataEntries
+            = TestUtils.getField(theTopologyManager, "apiAddedHostDataEntries");
+        assertThat(apiAddedHostDataEntries, hasItem(hostBrev));
 
         // hostA should not be ignored
-        List<HostEvent> apiRemovedHostEvents
-            = TestUtils.getField(theTopologyManager, "apiRemovedHostEvents");
-        assertThat(apiRemovedHostEvents, not(hasItem(hostA)));
+        List<HostData> apiRemovedHostDataEntries
+            = TestUtils.getField(theTopologyManager, "apiRemovedHostDataEntries");
+        assertThat(apiRemovedHostDataEntries, not(hasItem(hostA)));
 
-        List<LinkEvent> apiAddedLinkEvents
-            = TestUtils.getField(theTopologyManager, "apiAddedLinkEvents");
-        assertThat(apiAddedLinkEvents, containsInAnyOrder(linkA, linkB));
+        List<LinkData> apiAddedLinkDataEntries
+            = TestUtils.getField(theTopologyManager, "apiAddedLinkDataEntries");
+        assertThat(apiAddedLinkDataEntries, containsInAnyOrder(linkA, linkB));
     }
 
     /**
@@ -1194,97 +1194,97 @@
     public void testAddHostMove() {
         setupTopologyManager();
 
-        SwitchEvent sw = new SwitchEvent(DPID_1);
+        SwitchData sw = new SwitchData(DPID_1);
         sw.createStringAttribute("foo", "bar");
 
         final PortNumber portNumberA = PortNumber.uint32(2);
-        PortEvent portA = new PortEvent(DPID_1, portNumberA);
+        PortData portA = new PortData(DPID_1, portNumberA);
         portA.createStringAttribute("fuzz", "buzz");
 
         final PortNumber portNumberB = PortNumber.uint32(3);
-        PortEvent portB = new PortEvent(DPID_1, portNumberB);
+        PortData portB = new PortData(DPID_1, portNumberB);
         portB.createStringAttribute("fizz", "buz");
 
         final PortNumber portNumberC = PortNumber.uint32(4);
-        PortEvent portC = new PortEvent(DPID_1, portNumberC);
+        PortData portC = new PortData(DPID_1, portNumberC);
         portC.createStringAttribute("fizz", "buz");
 
         TestUtils.callMethod(theTopologyManager, "addSwitch",
-                             SwitchEvent.class, sw);
+                             SwitchData.class, sw);
         TestUtils.callMethod(theTopologyManager, "addPort",
-                             PortEvent.class, portA);
+                             PortData.class, portA);
         TestUtils.callMethod(theTopologyManager, "addPort",
-                             PortEvent.class, portB);
+                             PortData.class, portB);
         TestUtils.callMethod(theTopologyManager, "addPort",
-                             PortEvent.class, portC);
+                             PortData.class, portC);
 
         // Add hostA attached to a Port which already has a Link
         final MACAddress macA = MACAddress.valueOf(666L);
-        HostEvent hostA = new HostEvent(macA);
+        HostData hostA = new HostData(macA);
         hostA.addAttachmentPoint(portA.getSwitchPort());
         final long timestampA = 392893200L;
         hostA.setLastSeenTime(timestampA);
 
         TestUtils.callMethod(theTopologyManager, "addHost",
-                             HostEvent.class, hostA);
+                             HostData.class, hostA);
 
 
         // Check the topology structure
         BaseInternalTopology topology =
             (BaseInternalTopology) theTopologyManager.getTopology();
-        SwitchEvent swInTopo = topology.getSwitchEvent(DPID_1);
+        SwitchData swInTopo = topology.getSwitchData(DPID_1);
         assertEquals(sw, swInTopo);
         assertTrue(swInTopo.isFrozen());
         assertEquals("bar", swInTopo.getStringAttribute("foo"));
 
         final SwitchPort switchPortA = new SwitchPort(DPID_1, portNumberA);
-        PortEvent portAInTopo = topology.getPortEvent(switchPortA);
+        PortData portAInTopo = topology.getPortData(switchPortA);
         assertEquals(portA, portAInTopo);
         assertTrue(portAInTopo.isFrozen());
         assertEquals("buzz", portAInTopo.getStringAttribute("fuzz"));
 
         final SwitchPort switchPortB = new SwitchPort(DPID_1, portNumberB);
-        PortEvent portBInTopo = topology.getPortEvent(switchPortB);
+        PortData portBInTopo = topology.getPortData(switchPortB);
         assertEquals(portB, portBInTopo);
         assertTrue(portBInTopo.isFrozen());
         assertEquals("buz", portBInTopo.getStringAttribute("fizz"));
 
         // hostA expected to be there
-        assertEquals(hostA, topology.getHostEvent(macA));
+        assertEquals(hostA, topology.getHostData(macA));
         assertEquals(timestampA,
-                     topology.getHostEvent(macA).getLastSeenTime());
+                     topology.getHostData(macA).getLastSeenTime());
 
         // Check the events to be fired
         // hostA should be added
-        List<HostEvent> apiAddedHostEvents
-            = TestUtils.getField(theTopologyManager, "apiAddedHostEvents");
-        assertThat(apiAddedHostEvents, hasItem(hostA));
+        List<HostData> apiAddedHostDataEntries
+            = TestUtils.getField(theTopologyManager, "apiAddedHostDataEntries");
+        assertThat(apiAddedHostDataEntries, hasItem(hostA));
 
 
         // Clear the events before moving the Host
-        apiAddedHostEvents.clear();
+        apiAddedHostDataEntries.clear();
 
-        HostEvent hostAmoved = new HostEvent(macA);
+        HostData hostAmoved = new HostData(macA);
         hostAmoved.addAttachmentPoint(portB.getSwitchPort());
         final long timestampAmoved = 392893201L;
         hostAmoved.setLastSeenTime(timestampAmoved);
 
         TestUtils.callMethod(theTopologyManager, "addHost",
-                             HostEvent.class, hostAmoved);
+                             HostData.class, hostAmoved);
 
-        assertEquals(hostAmoved, topology.getHostEvent(macA));
+        assertEquals(hostAmoved, topology.getHostData(macA));
         assertEquals(timestampAmoved,
-                     topology.getHostEvent(macA).getLastSeenTime());
+                     topology.getHostData(macA).getLastSeenTime());
 
         // hostA expected to be there with new attachment point
-        apiAddedHostEvents
-            = TestUtils.getField(theTopologyManager, "apiAddedHostEvents");
-        assertThat(apiAddedHostEvents, hasItem(hostAmoved));
+        apiAddedHostDataEntries
+            = TestUtils.getField(theTopologyManager, "apiAddedHostDataEntries");
+        assertThat(apiAddedHostDataEntries, hasItem(hostAmoved));
 
         // hostA is updated not removed
-        List<HostEvent> apiRemovedHostEvents
-            = TestUtils.getField(theTopologyManager, "apiRemovedHostEvents");
-        assertThat(apiRemovedHostEvents, not(hasItem(hostA)));
+        List<HostData> apiRemovedHostDataEntries
+            = TestUtils.getField(theTopologyManager, "apiRemovedHostDataEntries");
+        assertThat(apiRemovedHostDataEntries, not(hasItem(hostA)));
     }
 
     /**
@@ -1331,12 +1331,12 @@
      *   events should be delivered.
      */
     @Test
-    public void testProcessSwitchEvent() {
+    public void testProcessSwitchData() {
         TopologyEvents topologyEvents;
         List<EventEntry<TopologyEvent>> events = new LinkedList<>();
         EventEntry<TopologyEvent> eventEntry;
         TopologyEvent topologyMastershipEvent;
-        TopologyEvent topologySwitchEvent;
+        TopologyEvent topologySwitchData;
 
         setupTopologyManagerWithEventHandler();
 
@@ -1348,8 +1348,8 @@
                                                     ONOS_INSTANCE_ID_1);
 
         // Prepare the Switch Event
-        SwitchEvent switchEvent = new SwitchEvent(DPID_1);
-        topologySwitchEvent = new TopologyEvent(switchEvent,
+        SwitchData switchData = new SwitchData(DPID_1);
+        topologySwitchData = new TopologyEvent(switchData,
                                                 ONOS_INSTANCE_ID_1);
 
         // Add the Mastership Event
@@ -1359,7 +1359,7 @@
 
         // Add the Switch Event
         eventEntry = new EventEntry<TopologyEvent>(EventEntry.Type.ENTRY_ADD,
-                                                   topologySwitchEvent);
+                                                   topologySwitchData);
         events.add(eventEntry);
 
         // Process the events
@@ -1371,8 +1371,8 @@
         assertNotNull(topologyEvents);
         assertThat(topologyEvents.getAddedMastershipEvents(),
                    hasItem(mastershipEvent));
-        assertThat(topologyEvents.getAddedSwitchEvents(),
-                   hasItem(switchEvent));
+        assertThat(topologyEvents.getAddedSwitchDataEntries(),
+                   hasItem(switchData));
         theTopologyListener.clear();
     }
 
@@ -1386,12 +1386,12 @@
      *   Switch Mastership Event is processed.
      */
     @Test
-    public void testProcessMisorderedSwitchEvent() {
+    public void testProcessMisorderedSwitchData() {
         TopologyEvents topologyEvents;
         List<EventEntry<TopologyEvent>> events = new LinkedList<>();
         EventEntry<TopologyEvent> eventEntry;
         TopologyEvent topologyMastershipEvent;
-        TopologyEvent topologySwitchEvent;
+        TopologyEvent topologySwitchData;
 
         setupTopologyManagerWithEventHandler();
 
@@ -1403,13 +1403,13 @@
                                                     ONOS_INSTANCE_ID_1);
 
         // Prepare the Switch Event
-        SwitchEvent switchEvent = new SwitchEvent(DPID_1);
-        topologySwitchEvent = new TopologyEvent(switchEvent,
+        SwitchData switchData = new SwitchData(DPID_1);
+        topologySwitchData = new TopologyEvent(switchData,
                                                 ONOS_INSTANCE_ID_1);
 
         // Add the Switch Event
         eventEntry = new EventEntry<TopologyEvent>(EventEntry.Type.ENTRY_ADD,
-                                                   topologySwitchEvent);
+                                                   topologySwitchData);
         events.add(eventEntry);
 
         // Process the events
@@ -1436,8 +1436,8 @@
         assertNotNull(topologyEvents);
         assertThat(topologyEvents.getAddedMastershipEvents(),
                    hasItem(mastershipEvent));
-        assertThat(topologyEvents.getAddedSwitchEvents(),
-                   hasItem(switchEvent));
+        assertThat(topologyEvents.getAddedSwitchDataEntries(),
+                   hasItem(switchData));
         theTopologyListener.clear();
     }
 
@@ -1451,12 +1451,12 @@
      *   Mastership Event should be delivered.
      */
     @Test
-    public void testProcessSwitchEventNoMastership() {
+    public void testProcessSwitchDataNoMastership() {
         TopologyEvents topologyEvents;
         List<EventEntry<TopologyEvent>> events = new LinkedList<>();
         EventEntry<TopologyEvent> eventEntry;
         TopologyEvent topologyMastershipEvent;
-        TopologyEvent topologySwitchEvent;
+        TopologyEvent topologySwitchData;
 
         setupTopologyManagerWithEventHandler();
 
@@ -1469,13 +1469,13 @@
 
         // Prepare the Switch Event
         // NOTE: The originator (ONOS_INSTANCE_ID_1) is NOT the Master
-        SwitchEvent switchEvent = new SwitchEvent(DPID_2);
-        topologySwitchEvent = new TopologyEvent(switchEvent,
+        SwitchData switchData = new SwitchData(DPID_2);
+        topologySwitchData = new TopologyEvent(switchData,
                                                 ONOS_INSTANCE_ID_1);
 
         // Add the Switch Event
         eventEntry = new EventEntry<TopologyEvent>(EventEntry.Type.ENTRY_ADD,
-                                                   topologySwitchEvent);
+                                                   topologySwitchData);
         events.add(eventEntry);
 
         // Process the events
@@ -1502,7 +1502,7 @@
         assertNotNull(topologyEvents);
         assertThat(topologyEvents.getAddedMastershipEvents(),
                    hasItem(mastershipEvent));
-        assertThat(topologyEvents.getAddedSwitchEvents(), is(empty()));
+        assertThat(topologyEvents.getAddedSwitchDataEntries(), is(empty()));
         theTopologyListener.clear();
     }
 
@@ -1527,7 +1527,7 @@
         List<EventEntry<TopologyEvent>> events = new LinkedList<>();
         EventEntry<TopologyEvent> eventEntry;
         TopologyEvent topologyMastershipEvent;
-        TopologyEvent topologySwitchEvent;
+        TopologyEvent topologySwitchData;
 
         setupTopologyManagerWithEventHandler();
 
@@ -1539,8 +1539,8 @@
                                                     ONOS_INSTANCE_ID_1);
 
         // Prepare the Switch Event from the first ONOS instance
-        SwitchEvent switchEvent = new SwitchEvent(DPID_1);
-        topologySwitchEvent = new TopologyEvent(switchEvent,
+        SwitchData switchData = new SwitchData(DPID_1);
+        topologySwitchData = new TopologyEvent(switchData,
                                                 ONOS_INSTANCE_ID_1);
 
         // Add the Mastership Event
@@ -1550,7 +1550,7 @@
 
         // Add the Switch Event
         eventEntry = new EventEntry<TopologyEvent>(EventEntry.Type.ENTRY_ADD,
-                                                   topologySwitchEvent);
+                                                   topologySwitchData);
         events.add(eventEntry);
 
         // Process the events
@@ -1562,8 +1562,8 @@
         assertNotNull(topologyEvents);
         assertThat(topologyEvents.getAddedMastershipEvents(),
                    hasItem(mastershipEvent));
-        assertThat(topologyEvents.getAddedSwitchEvents(),
-                   hasItem(switchEvent));
+        assertThat(topologyEvents.getAddedSwitchDataEntries(),
+                   hasItem(switchData));
         theTopologyListener.clear();
         events.clear();
 
@@ -1584,8 +1584,8 @@
                                                     ONOS_INSTANCE_ID_2);
 
         // Prepare the Switch Event from second ONOS instance
-        switchEvent = new SwitchEvent(DPID_1);
-        topologySwitchEvent = new TopologyEvent(switchEvent,
+        switchData = new SwitchData(DPID_1);
+        topologySwitchData = new TopologyEvent(switchData,
                                                 ONOS_INSTANCE_ID_2);
 
         // Add the Mastership Event
@@ -1595,7 +1595,7 @@
 
         // Add the Switch Event
         eventEntry = new EventEntry<TopologyEvent>(EventEntry.Type.ENTRY_ADD,
-                                                   topologySwitchEvent);
+                                                   topologySwitchData);
         events.add(eventEntry);
 
         // Process the events
@@ -1607,18 +1607,18 @@
         assertNotNull(topologyEvents);
         assertThat(topologyEvents.getAddedMastershipEvents(),
                    hasItem(mastershipEvent));
-        assertThat(topologyEvents.getAddedSwitchEvents(),
-                   hasItem(switchEvent));
+        assertThat(topologyEvents.getAddedSwitchDataEntries(),
+                   hasItem(switchData));
         theTopologyListener.clear();
         events.clear();
 
         // Prepare the REMOVE Switch Event from first ONOS instance
-        switchEvent = new SwitchEvent(DPID_1);
-        topologySwitchEvent = new TopologyEvent(switchEvent,
+        switchData = new SwitchData(DPID_1);
+        topologySwitchData = new TopologyEvent(switchData,
                                                 ONOS_INSTANCE_ID_1);
         // Add the Switch Event
         eventEntry = new EventEntry<TopologyEvent>(EventEntry.Type.ENTRY_REMOVE,
-                                                   topologySwitchEvent);
+                                                   topologySwitchData);
         events.add(eventEntry);
 
         // Process the events
@@ -1652,7 +1652,7 @@
         List<EventEntry<TopologyEvent>> events = new LinkedList<>();
         EventEntry<TopologyEvent> eventEntry;
         TopologyEvent topologyMastershipEvent;
-        TopologyEvent topologySwitchEvent;
+        TopologyEvent topologySwitchData;
 
         setupTopologyManagerWithEventHandler();
 
@@ -1670,11 +1670,11 @@
                                                     ONOS_INSTANCE_ID_1);
 
         // Prepare the Switch Event from the first ONOS instance
-        SwitchEvent switchEvent = new SwitchEvent(DPID_1);
-        switchEvent.createStringAttribute(
+        SwitchData switchData = new SwitchData(DPID_1);
+        switchData.createStringAttribute(
                 TopologyElement.ELEMENT_CONFIG_STATE,
                 ConfigState.CONFIGURED.toString());
-        topologySwitchEvent = new TopologyEvent(switchEvent,
+        topologySwitchData = new TopologyEvent(switchData,
                                                 ONOS_INSTANCE_ID_1);
 
         // Add the Mastership Event
@@ -1684,7 +1684,7 @@
 
         // Add the Switch Event
         eventEntry = new EventEntry<TopologyEvent>(EventEntry.Type.ENTRY_ADD,
-                                                   topologySwitchEvent);
+                                                   topologySwitchData);
         events.add(eventEntry);
 
         // Process the events
@@ -1696,8 +1696,8 @@
         assertNotNull(topologyEvents);
         assertThat(topologyEvents.getAddedMastershipEvents(),
                    hasItem(mastershipEvent));
-        assertThat(topologyEvents.getAddedSwitchEvents(),
-                   hasItem(switchEvent));
+        assertThat(topologyEvents.getAddedSwitchDataEntries(),
+                   hasItem(switchData));
         theTopologyListener.clear();
         events.clear();
 
@@ -1712,11 +1712,11 @@
                                                     ONOS_INSTANCE_ID_2);
 
         // Prepare the Switch Event from second ONOS instance
-        switchEvent = new SwitchEvent(DPID_1);
-        switchEvent.createStringAttribute(
+        switchData = new SwitchData(DPID_1);
+        switchData.createStringAttribute(
                 TopologyElement.ELEMENT_CONFIG_STATE,
                 ConfigState.CONFIGURED.toString());
-        topologySwitchEvent = new TopologyEvent(switchEvent,
+        topologySwitchData = new TopologyEvent(switchData,
                                                 ONOS_INSTANCE_ID_2);
 
         // Add the Mastership Event
@@ -1726,7 +1726,7 @@
 
         // Add the Switch Event
         eventEntry = new EventEntry<TopologyEvent>(EventEntry.Type.ENTRY_ADD,
-                                                   topologySwitchEvent);
+                                                   topologySwitchData);
         events.add(eventEntry);
 
         // Process the events
@@ -1738,8 +1738,8 @@
         assertNotNull(topologyEvents);
         assertThat(topologyEvents.getAddedMastershipEvents(),
                    hasItem(mastershipEvent));
-        assertThat(topologyEvents.getAddedSwitchEvents(),
-                   hasItem(switchEvent));
+        assertThat(topologyEvents.getAddedSwitchDataEntries(),
+                   hasItem(switchData));
         theTopologyListener.clear();
         events.clear();
 
@@ -1748,15 +1748,15 @@
         // NOTE: This event only is explicitly marked as NOT_CONFIGURED,
         // otherwise it will override the previous configuration events.
         //
-        switchEvent = new SwitchEvent(DPID_1);
-        switchEvent.createStringAttribute(
+        switchData = new SwitchData(DPID_1);
+        switchData.createStringAttribute(
                 TopologyElement.ELEMENT_CONFIG_STATE,
                 ConfigState.NOT_CONFIGURED.toString());
-        topologySwitchEvent = new TopologyEvent(switchEvent,
+        topologySwitchData = new TopologyEvent(switchData,
                                                 ONOS_INSTANCE_ID_1);
         // Add the Switch Event
         eventEntry = new EventEntry<TopologyEvent>(EventEntry.Type.ENTRY_REMOVE,
-                                                   topologySwitchEvent);
+                                                   topologySwitchData);
         events.add(eventEntry);
 
         // Process the events
diff --git a/src/test/java/net/onrc/onos/core/util/serializers/KryoFactoryTest.java b/src/test/java/net/onrc/onos/core/util/serializers/KryoFactoryTest.java
index 78c5f62..71f5d20 100644
--- a/src/test/java/net/onrc/onos/core/util/serializers/KryoFactoryTest.java
+++ b/src/test/java/net/onrc/onos/core/util/serializers/KryoFactoryTest.java
@@ -11,13 +11,13 @@
 import java.util.Set;
 
 import net.floodlightcontroller.util.MACAddress;
-import net.onrc.onos.core.topology.HostEvent;
-import net.onrc.onos.core.topology.LinkEvent;
-import net.onrc.onos.core.topology.PortEvent;
+import net.onrc.onos.core.topology.HostData;
+import net.onrc.onos.core.topology.LinkData;
+import net.onrc.onos.core.topology.PortData;
 import net.onrc.onos.core.topology.TopologyBatchOperation;
 import net.onrc.onos.core.topology.TopologyElement;
 import net.onrc.onos.core.topology.TopologyEvent;
-import net.onrc.onos.core.topology.SwitchEvent;
+import net.onrc.onos.core.topology.SwitchData;
 import net.onrc.onos.core.util.Dpid;
 import net.onrc.onos.core.util.OnosInstanceId;
 import net.onrc.onos.core.util.PortNumber;
@@ -275,7 +275,7 @@
 
         // To be more strict, we should be checking serialized byte[].
         { // CHECKSTYLE IGNORE THIS LINE
-            HostEvent obj = new HostEvent(MACAddress.valueOf(0x12345678));
+            HostData obj = new HostData(MACAddress.valueOf(0x12345678));
             obj.createStringAttribute(TopologyElement.TYPE,
                                       TopologyElement.TYPE_PACKET_LAYER);
             obj.addAttachmentPoint(new SwitchPort(DPID_A, PORT_NO_A));
@@ -289,7 +289,7 @@
         }
 
         { // CHECKSTYLE IGNORE THIS LINE
-            LinkEvent obj = new LinkEvent(new SwitchPort(DPID_A, PORT_NO_A),
+            LinkData obj = new LinkData(new SwitchPort(DPID_A, PORT_NO_A),
                                           new SwitchPort(DPID_B, PORT_NO_B));
             obj.createStringAttribute(TopologyElement.TYPE,
                                       TopologyElement.TYPE_PACKET_LAYER);
@@ -301,7 +301,7 @@
         }
 
         { // CHECKSTYLE IGNORE THIS LINE
-            PortEvent obj = new PortEvent(DPID_A, PORT_NO_A);
+            PortData obj = new PortData(DPID_A, PORT_NO_A);
             obj.createStringAttribute(TopologyElement.TYPE,
                                       TopologyElement.TYPE_PACKET_LAYER);
             obj.freeze();
@@ -312,7 +312,7 @@
         }
 
         { // CHECKSTYLE IGNORE THIS LINE
-            SwitchEvent obj = new SwitchEvent(DPID_A);
+            SwitchData obj = new SwitchData(DPID_A);
             obj.createStringAttribute(TopologyElement.TYPE,
                                       TopologyElement.TYPE_PACKET_LAYER);
             obj.freeze();
@@ -323,7 +323,7 @@
         }
 
         { // CHECKSTYLE IGNORE THIS LINE
-            SwitchEvent evt = new SwitchEvent(DPID_A);
+            SwitchData evt = new SwitchData(DPID_A);
             evt.createStringAttribute(TopologyElement.TYPE,
                                       TopologyElement.TYPE_PACKET_LAYER);
             evt.freeze();
@@ -332,7 +332,7 @@
 
             // using the back door to access package-scoped constructor
             Constructor<TopologyEvent> swConst
-                = TopologyEvent.class.getDeclaredConstructor(SwitchEvent.class,
+                = TopologyEvent.class.getDeclaredConstructor(SwitchData.class,
                         OnosInstanceId.class);
             swConst.setAccessible(true);
             TopologyEvent obj = swConst.newInstance(evt, onosInstanceId);
@@ -359,15 +359,15 @@
 
             // using the back door to access package-scoped constructor
             Constructor<TopologyEvent> swConst
-                = TopologyEvent.class.getDeclaredConstructor(SwitchEvent.class,
+                = TopologyEvent.class.getDeclaredConstructor(SwitchData.class,
                         OnosInstanceId.class);
             swConst.setAccessible(true);
 
             for (int i = 1; i <= 10; i++) {
                 Dpid dpid = new Dpid(i);
-                SwitchEvent switchEvent = new SwitchEvent(dpid);
+                SwitchData switchData = new SwitchData(dpid);
                 TopologyEvent topologyEvent =
-                    swConst.newInstance(switchEvent, onosInstanceId);
+                    swConst.newInstance(switchData, onosInstanceId);
                 tbo.appendAddOperation(topologyEvent);
             }
 
