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);
