diff --git a/src/main/java/net/onrc/onos/core/topology/HostEvent.java b/src/main/java/net/onrc/onos/core/topology/HostEvent.java
index 33f8db8..86d1751 100644
--- a/src/main/java/net/onrc/onos/core/topology/HostEvent.java
+++ b/src/main/java/net/onrc/onos/core/topology/HostEvent.java
@@ -109,11 +109,13 @@
         this.lastSeenTime = lastSeenTime;
     }
 
-    /**
-     * Gets the event origin DPID.
-     *
-     * @return the event origin DPID.
-     */
+    // Assuming mac is unique cluster-wide
+    public static ByteBuffer getHostID(final byte[] mac) {
+        return (ByteBuffer) ByteBuffer.allocate(2 + mac.length)
+                .putChar('H').put(mac).flip();
+    }
+
+    @Override
     public Dpid getOriginDpid() {
         // TODO: Eventually, we should return a collection of Dpid values
         for (SwitchPort sp : attachmentPoints) {
@@ -123,56 +125,38 @@
     }
 
     @Override
-    public String toString() {
-        return "[HostEvent " + mac + " attachmentPoints:" + attachmentPoints + "]";
+    public ByteBuffer getIDasByteBuffer() {
+        return getHostID(mac.toBytes());
     }
 
     @Override
     public int hashCode() {
-        final int prime = 31;
-        int result = super.hashCode();
-        result = prime * result
-                + ((attachmentPoints == null) ? 0 : attachmentPoints.hashCode());
-        result = prime * result + ((mac == null) ? 0 : mac.hashCode());
-        return result;
+        return 31 * super.hashCode() + Objects.hash(attachmentPoints, mac);
     }
 
     @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
+    public boolean equals(Object o) {
+        if (this == o) {
             return true;
         }
 
-        if (obj == null) {
+        if (o == null || getClass() != o.getClass()) {
             return false;
         }
 
-        if (getClass() != obj.getClass()) {
+        // Compare attributes
+        if (!super.equals(o)) {
             return false;
         }
 
-        if (!super.equals(obj)) {
-            return false;
-        }
-
-        HostEvent other = (HostEvent) obj;
-
+        HostEvent other = (HostEvent) o;
         // XXX lastSeenTime excluded from Equality condition, is it OK?
         return Objects.equals(mac, other.mac) &&
                 Objects.equals(this.attachmentPoints, other.attachmentPoints);
     }
 
-    // Assuming mac is unique cluster-wide
-    public static ByteBuffer getHostID(final byte[] mac) {
-        return (ByteBuffer) ByteBuffer.allocate(2 + mac.length)
-                .putChar('H').put(mac).flip();
-    }
-
-    public byte[] getID() {
-        return getHostID(mac.toBytes()).array();
-    }
-
-    public ByteBuffer getIDasByteBuffer() {
-        return getHostID(mac.toBytes());
+    @Override
+    public String toString() {
+        return "[HostEvent " + mac + " attachmentPoints:" + attachmentPoints + "]";
     }
 }
diff --git a/src/main/java/net/onrc/onos/core/topology/ITopologyElement.java b/src/main/java/net/onrc/onos/core/topology/ITopologyElement.java
index 277c957..3664d98 100644
--- a/src/main/java/net/onrc/onos/core/topology/ITopologyElement.java
+++ b/src/main/java/net/onrc/onos/core/topology/ITopologyElement.java
@@ -27,6 +27,4 @@
      * @return  AdminStatus
      */
     public AdminStatus getStatus();
-
-
 }
diff --git a/src/main/java/net/onrc/onos/core/topology/LinkEvent.java b/src/main/java/net/onrc/onos/core/topology/LinkEvent.java
index 807dcaf..bc5aa93 100644
--- a/src/main/java/net/onrc/onos/core/topology/LinkEvent.java
+++ b/src/main/java/net/onrc/onos/core/topology/LinkEvent.java
@@ -122,20 +122,6 @@
         this.capacity = capacity;
     }
 
-    /**
-     * Gets the event origin DPID.
-     *
-     * @return the event origin DPID.
-     */
-    public Dpid getOriginDpid() {
-        return this.id.getDst().getDpid();
-    }
-
-    @Override
-    public String toString() {
-        return "[LinkEvent " + getSrc() + "->" + getDst() + "]";
-    }
-
     public static final int LINKID_BYTES = 2 + PortEvent.PORTID_BYTES * 2;
 
     public static ByteBuffer getLinkID(Dpid srcDpid, PortNumber srcPortNo,
@@ -152,10 +138,12 @@
                 .put(PortEvent.getPortID(dstDpid, dstPortNo)).flip();
     }
 
-    public byte[] getID() {
-        return getIDasByteBuffer().array();
+    @Override
+    public Dpid getOriginDpid() {
+        return this.id.getDst().getDpid();
     }
 
+    @Override
     public ByteBuffer getIDasByteBuffer() {
         return getLinkID(getSrc().getDpid(), getSrc().getPortNumber(),
                 getDst().getDpid(), getDst().getPortNumber());
@@ -163,32 +151,30 @@
 
     @Override
     public int hashCode() {
-        final int prime = 31;
-        int result = super.hashCode();
-        result = prime * result + Objects.hashCode(id);
-        return result;
+        return 31 * super.hashCode() + Objects.hashCode(id);
     }
 
     @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
+    public boolean equals(Object o) {
+        if (this == o) {
             return true;
         }
 
-        if (obj == null) {
+        if (o == null || getClass() != o.getClass()) {
             return false;
         }
 
-        if (getClass() != obj.getClass()) {
-            return false;
-        }
-        LinkEvent other = (LinkEvent) obj;
-
-        // compare attributes
-        if (!super.equals(obj)) {
+        // Compare attributes
+        if (!super.equals(o)) {
             return false;
         }
 
+        LinkEvent other = (LinkEvent) o;
         return Objects.equals(this.id, other.id);
     }
+
+    @Override
+    public String toString() {
+        return "[LinkEvent " + getSrc() + "->" + getDst() + "]";
+    }
 }
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 589174d..1d54a52 100644
--- a/src/main/java/net/onrc/onos/core/topology/MastershipEvent.java
+++ b/src/main/java/net/onrc/onos/core/topology/MastershipEvent.java
@@ -89,28 +89,16 @@
         return role;
     }
 
-    /**
-     * Gets the event origin DPID.
-     *
-     * @return the event origin DPID.
-     */
+    @Override
     public Dpid getOriginDpid() {
         return this.dpid;
     }
 
     @Override
-    public String toString() {
-        return "[MastershipEvent " + getDpid() + "@" + getOnosInstanceId() +
-            "->" + getRole() + "]";
-    }
-
-    public byte[] getID() {
-        String keyStr = "M" + getDpid() + "@" + getOnosInstanceId();
-        return keyStr.getBytes(StandardCharsets.UTF_8);
-    }
-
     public ByteBuffer getIDasByteBuffer() {
-        ByteBuffer buf = ByteBuffer.wrap(getID());
+        String keyStr = "M" + getDpid() + "@" + getOnosInstanceId();
+        byte[] id = keyStr.getBytes(StandardCharsets.UTF_8);
+        ByteBuffer buf = ByteBuffer.wrap(id);
         return buf;
     }
 
@@ -124,30 +112,32 @@
      * MastershipEvent objects are equal if they have same DPID and same
      * ONOS Instance ID.
      *
-     * @param obj another object to compare to this
-     * @return true if equal, false otherwise false.
+     * @param o another object to compare to this.
+     * @return true if equal, false otherwise.
      */
     @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
+    public boolean equals(Object o) {
+        if (this == o) {
             return true;
         }
 
-        if (obj == null) {
+        if (o == null || getClass() != o.getClass()) {
             return false;
         }
 
-        if (getClass() != obj.getClass()) {
+        // Compare attributes
+        if (!super.equals(o)) {
             return false;
         }
 
-        // compare attributes
-        if (!super.equals(obj)) {
-            return false;
-        }
+        MastershipEvent other = (MastershipEvent) o;
+        return Objects.equals(dpid, other.dpid) &&
+            Objects.equals(onosInstanceId, other.onosInstanceId);
+    }
 
-        MastershipEvent other = (MastershipEvent) obj;
-        return dpid.equals(other.dpid) &&
-            onosInstanceId.equals(other.onosInstanceId);
+    @Override
+    public String toString() {
+        return "[MastershipEvent " + getDpid() + "@" + getOnosInstanceId() +
+            "->" + getRole() + "]";
     }
 }
diff --git a/src/main/java/net/onrc/onos/core/topology/PortEvent.java b/src/main/java/net/onrc/onos/core/topology/PortEvent.java
index 9907a19..b4b0b1b 100644
--- a/src/main/java/net/onrc/onos/core/topology/PortEvent.java
+++ b/src/main/java/net/onrc/onos/core/topology/PortEvent.java
@@ -95,48 +95,6 @@
         return id.getPortNumber();
     }
 
-    /**
-     * Gets the event origin DPID.
-     *
-     * @return the event origin DPID.
-     */
-    public Dpid getOriginDpid() {
-        return this.id.getDpid();
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-
-        if (o == null) {
-            return false;
-        }
-
-        if (getClass() != o.getClass()) {
-            return false;
-        }
-        PortEvent other = (PortEvent) o;
-
-        // compare attributes
-        if (!super.equals(o)) {
-            return false;
-        }
-
-        return Objects.equals(this.id, other.id);
-    }
-
-    @Override
-    public int hashCode() {
-        return 31 * super.hashCode() + Objects.hashCode(id);
-    }
-
-    @Override
-    public String toString() {
-        return "[PortEvent " + getDpid() + "@" + getPortNumber() + "]";
-    }
-
     public static final int PORTID_BYTES = SwitchEvent.SWITCHID_BYTES + 2 + 8;
 
     public static ByteBuffer getPortID(Dpid dpid, PortNumber number) {
@@ -157,11 +115,42 @@
                 .putChar('P').putLong(number).flip();
     }
 
-    public byte[] getID() {
-        return getIDasByteBuffer().array();
+    @Override
+    public Dpid getOriginDpid() {
+        return this.id.getDpid();
     }
 
+    @Override
     public ByteBuffer getIDasByteBuffer() {
         return getPortID(getDpid(), getPortNumber());
     }
+
+    @Override
+    public int hashCode() {
+        return 31 * super.hashCode() + Objects.hashCode(id);
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+
+        // Compare attributes
+        if (!super.equals(o)) {
+            return false;
+        }
+
+        PortEvent other = (PortEvent) o;
+        return Objects.equals(this.id, other.id);
+    }
+
+    @Override
+    public String toString() {
+        return "[PortEvent " + getDpid() + "@" + getPortNumber() + "]";
+    }
 }
diff --git a/src/main/java/net/onrc/onos/core/topology/SwitchEvent.java b/src/main/java/net/onrc/onos/core/topology/SwitchEvent.java
index 47f8e81..ad078c6 100644
--- a/src/main/java/net/onrc/onos/core/topology/SwitchEvent.java
+++ b/src/main/java/net/onrc/onos/core/topology/SwitchEvent.java
@@ -56,48 +56,6 @@
         return dpid;
     }
 
-    /**
-     * Gets the event origin DPID.
-     *
-     * @return the event origin DPID.
-     */
-    public Dpid getOriginDpid() {
-        return this.dpid;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-
-        if (o == null) {
-            return false;
-        }
-
-        if (getClass() != o.getClass()) {
-            return false;
-        }
-        SwitchEvent other = (SwitchEvent) o;
-
-        // compare attributes
-        if (!super.equals(o)) {
-            return false;
-        }
-
-        return Objects.equals(this.dpid, other.dpid);
-    }
-
-    @Override
-    public int hashCode() {
-        return 31 * super.hashCode() + Objects.hashCode(dpid);
-    }
-
-    @Override
-    public String toString() {
-        return "[SwitchEvent " + dpid + "]";
-    }
-
     public static final int SWITCHID_BYTES = 2 + 8;
 
     public static ByteBuffer getSwitchID(Dpid dpid) {
@@ -112,11 +70,42 @@
                 .putChar('S').putLong(dpid).flip();
     }
 
-    public byte[] getID() {
-        return getSwitchID(dpid.value()).array();
+    @Override
+    public Dpid getOriginDpid() {
+        return this.dpid;
     }
 
+    @Override
     public ByteBuffer getIDasByteBuffer() {
         return getSwitchID(dpid.value());
     }
+
+    @Override
+    public int hashCode() {
+        return 31 * super.hashCode() + Objects.hashCode(dpid);
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+
+        // Compare attributes
+        if (!super.equals(o)) {
+            return false;
+        }
+
+        SwitchEvent other = (SwitchEvent) o;
+        return Objects.equals(this.dpid, other.dpid);
+    }
+
+    @Override
+    public String toString() {
+        return "[SwitchEvent " + dpid + "]";
+    }
 }
diff --git a/src/main/java/net/onrc/onos/core/topology/TopologyElement.java b/src/main/java/net/onrc/onos/core/topology/TopologyElement.java
index 81ecb1f..52304f4 100644
--- a/src/main/java/net/onrc/onos/core/topology/TopologyElement.java
+++ b/src/main/java/net/onrc/onos/core/topology/TopologyElement.java
@@ -1,5 +1,6 @@
 package net.onrc.onos.core.topology;
 
+import java.nio.ByteBuffer;
 import java.util.Collections;
 import java.util.Map;
 import java.util.Objects;
@@ -8,6 +9,8 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
+import net.onrc.onos.core.util.Dpid;
+
 /**
  * Base class for Topology Elements.
  * <p/>
@@ -17,7 +20,7 @@
  * @param <T> Sub-class' type.
  *      (Required to define a method returning itself's type)
  */
-public class TopologyElement<T extends TopologyElement<T>>
+public abstract class TopologyElement<T extends TopologyElement<T>>
         implements ITopologyElement, StringAttributes, UpdateStringAttributes {
 
     // TODO: Where should the attribute names be defined?
@@ -208,4 +211,18 @@
     public AdminStatus getStatus() {
         return AdminStatus.valueOf(getStringAttribute(ELEMENT_ADMIN_STATUS));
     }
+
+    /**
+     * Gets the topology event origin DPID.
+     *
+     * @return the topology event origin DPID.
+     */
+    abstract Dpid getOriginDpid();
+
+    /**
+     * Gets the topology event ID as a ByteBuffer.
+     *
+     * @return the topology event ID as a ByteBuffer.
+     */
+    abstract ByteBuffer getIDasByteBuffer();
 }
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 a36d221..a71bbf7 100644
--- a/src/main/java/net/onrc/onos/core/topology/TopologyEvent.java
+++ b/src/main/java/net/onrc/onos/core/topology/TopologyEvent.java
@@ -20,24 +20,30 @@
  * are finalized.
  */
 public final class TopologyEvent implements BatchOperationTarget {
-    private final MastershipEvent mastershipEvent; // Set for Mastership event
-    private final SwitchEvent switchEvent;      // Set for Switch event
-    private final PortEvent portEvent;          // Set for Port event
-    private final LinkEvent linkEvent;          // Set for Link event
-    private final HostEvent hostEvent;          // Set for Host event
+    private final Type eventType;
+    private final TopologyElement<?> event;
     private final OnosInstanceId onosInstanceId;   // The ONOS Instance ID
 
     /**
+     * The topology event type.
+     */
+    public enum Type {
+        MASTERSHIP,
+        SWITCH,
+        PORT,
+        LINK,
+        HOST,
+        NOOP,                   // TODO: temporary type; should be removed
+    }
+
+    /**
      * Default constructor for serializer.
      */
     @Deprecated
     protected TopologyEvent() {
-        mastershipEvent = null;
-        switchEvent = null;
-        portEvent = null;
-        linkEvent = null;
-        hostEvent = null;
-        onosInstanceId = null;
+        this.eventType = Type.NOOP;
+        this.event = null;
+        this.onosInstanceId = null;
     }
 
     /**
@@ -46,11 +52,8 @@
      * @param onosInstanceId the ONOS Instance ID that originates the event.
      */
     protected TopologyEvent(OnosInstanceId onosInstanceId) {
-        mastershipEvent = null;
-        switchEvent = null;
-        portEvent = null;
-        linkEvent = null;
-        hostEvent = null;
+        this.eventType = Type.NOOP;
+        this.event = null;
         this.onosInstanceId = checkNotNull(onosInstanceId);
     }
 
@@ -62,11 +65,8 @@
      */
     TopologyEvent(MastershipEvent mastershipEvent,
                   OnosInstanceId onosInstanceId) {
-        this.mastershipEvent = checkNotNull(mastershipEvent);
-        this.switchEvent = null;
-        this.portEvent = null;
-        this.linkEvent = null;
-        this.hostEvent = null;
+        this.eventType = Type.MASTERSHIP;
+        this.event = checkNotNull(mastershipEvent);
         this.onosInstanceId = checkNotNull(onosInstanceId);
     }
 
@@ -77,11 +77,8 @@
      * @param onosInstanceId the ONOS Instance ID that originates the event.
      */
     TopologyEvent(SwitchEvent switchEvent, OnosInstanceId onosInstanceId) {
-        this.mastershipEvent = null;
-        this.switchEvent = checkNotNull(switchEvent);
-        this.portEvent = null;
-        this.linkEvent = null;
-        this.hostEvent = null;
+        this.eventType = Type.SWITCH;
+        this.event = checkNotNull(switchEvent);
         this.onosInstanceId = checkNotNull(onosInstanceId);
     }
 
@@ -92,11 +89,8 @@
      * @param onosInstanceId the ONOS Instance ID that originates the event.
      */
     TopologyEvent(PortEvent portEvent, OnosInstanceId onosInstanceId) {
-        this.mastershipEvent = null;
-        this.switchEvent = null;
-        this.portEvent = checkNotNull(portEvent);
-        this.linkEvent = null;
-        this.hostEvent = null;
+        this.eventType = Type.PORT;
+        this.event = checkNotNull(portEvent);
         this.onosInstanceId = checkNotNull(onosInstanceId);
     }
 
@@ -107,11 +101,8 @@
      * @param onosInstanceId the ONOS Instance ID that originates the event.
      */
     TopologyEvent(LinkEvent linkEvent, OnosInstanceId onosInstanceId) {
-        this.mastershipEvent = null;
-        this.switchEvent = null;
-        this.portEvent = null;
-        this.linkEvent = checkNotNull(linkEvent);
-        this.hostEvent = null;
+        this.eventType = Type.LINK;
+        this.event = checkNotNull(linkEvent);
         this.onosInstanceId = checkNotNull(onosInstanceId);
     }
 
@@ -122,20 +113,30 @@
      * @param onosInstanceId the ONOS Instance ID that originates the event.
      */
     TopologyEvent(HostEvent hostEvent, OnosInstanceId onosInstanceId) {
-        this.mastershipEvent = null;
-        this.switchEvent = null;
-        this.portEvent = null;
-        this.linkEvent = null;
-        this.hostEvent = checkNotNull(hostEvent);
+        this.eventType = Type.HOST;
+        this.event = checkNotNull(hostEvent);
         this.onosInstanceId = checkNotNull(onosInstanceId);
     }
 
     /**
+     * Gets the Topology Event type.
+     *
+     * @return the Topology Event type.
+     */
+    TopologyEvent.Type getEventType() {
+        return this.eventType;
+    }
+
+    /**
      * Gets the Mastership event.
      *
      * @return the Mastership event.
      */
     public MastershipEvent getMastershipEvent() {
+        if (eventType != Type.MASTERSHIP) {
+            return null;
+        }
+        MastershipEvent mastershipEvent = (MastershipEvent) event;
         return mastershipEvent;
     }
 
@@ -145,6 +146,10 @@
      * @return the Switch event.
      */
     public SwitchEvent getSwitchEvent() {
+        if (eventType != Type.SWITCH) {
+            return null;
+        }
+        SwitchEvent switchEvent = (SwitchEvent) event;
         return switchEvent;
     }
 
@@ -154,6 +159,10 @@
      * @return the Port event.
      */
     public PortEvent getPortEvent() {
+        if (eventType != Type.PORT) {
+            return null;
+        }
+        PortEvent portEvent = (PortEvent) event;
         return portEvent;
     }
 
@@ -163,6 +172,10 @@
      * @return the Link event.
      */
     public LinkEvent getLinkEvent() {
+        if (eventType != Type.LINK) {
+            return null;
+        }
+        LinkEvent linkEvent = (LinkEvent) event;
         return linkEvent;
     }
 
@@ -172,6 +185,10 @@
      * @return the Host event.
      */
     public HostEvent getHostEvent() {
+        if (eventType != Type.HOST) {
+            return null;
+        }
+        HostEvent hostEvent = (HostEvent) event;
         return hostEvent;
     }
 
@@ -185,30 +202,6 @@
     }
 
     /**
-     * Gets the event origin DPID.
-     *
-     * @return the event origin DPID.
-     */
-    public Dpid getOriginDpid() {
-        if (mastershipEvent != null) {
-            return mastershipEvent.getOriginDpid();
-        }
-        if (switchEvent != null) {
-            return switchEvent.getOriginDpid();
-        }
-        if (portEvent != null) {
-            return portEvent.getOriginDpid();
-        }
-        if (linkEvent != null) {
-            return linkEvent.getOriginDpid();
-        }
-        if (hostEvent != null) {
-            return hostEvent.getOriginDpid();
-        }
-        return null;
-    }
-
-    /**
      * Tests whether the event origin DPID equals the specified DPID.
      *
      * @param dpid the DPID to compare against.
@@ -218,108 +211,23 @@
         return dpid.equals(getOriginDpid());
     }
 
+    public Dpid getOriginDpid() {
+        if (eventType == Type.NOOP) {
+            return null;
+        }
+        return event.getOriginDpid();
+    }
+
     /**
      * Returns the config state of the topology element.
      *
      * @return the config state of the topology element.
      */
     public ConfigState getConfigState() {
-        if (mastershipEvent != null) {
-            return mastershipEvent.getConfigState();
+        if (eventType == Type.NOOP) {
+            return ConfigState.NOT_CONFIGURED;  // Default: not configured
         }
-        if (switchEvent != null) {
-            return switchEvent.getConfigState();
-        }
-        if (portEvent != null) {
-            return portEvent.getConfigState();
-        }
-        if (linkEvent != null) {
-            return linkEvent.getConfigState();
-        }
-        if (hostEvent != null) {
-            return hostEvent.getConfigState();
-        }
-        return ConfigState.NOT_CONFIGURED;      // Default: not configured
-    }
-
-    /**
-     * Checks if all events contained are equal.
-     *
-     * @param obj TopologyEvent to compare against
-     */
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-
-        if (obj == null) {
-            return false;
-        }
-
-        if (getClass() != obj.getClass()) {
-            return false;
-        }
-
-        TopologyEvent other = (TopologyEvent) obj;
-        return Objects.equals(mastershipEvent, other.mastershipEvent) &&
-            Objects.equals(switchEvent, other.switchEvent) &&
-            Objects.equals(portEvent, other.portEvent) &&
-            Objects.equals(linkEvent, other.linkEvent) &&
-            Objects.equals(hostEvent, other.hostEvent) &&
-            Objects.equals(onosInstanceId, other.onosInstanceId);
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(mastershipEvent, switchEvent, portEvent,
-                            linkEvent, hostEvent, onosInstanceId);
-    }
-
-    /**
-     * Gets the string representation of the event.
-     *
-     * @return the string representation of the event.
-     */
-    @Override
-    public String toString() {
-        String eventStr = null;
-
-        //
-        // Get the Event string
-        //
-        stringLabel: {
-            if (mastershipEvent != null) {
-                eventStr = mastershipEvent.toString();
-                break stringLabel;
-            }
-            if (switchEvent != null) {
-                eventStr = switchEvent.toString();
-                break stringLabel;
-            }
-            if (portEvent != null) {
-                eventStr = portEvent.toString();
-                break stringLabel;
-            }
-            if (linkEvent != null) {
-                eventStr = linkEvent.toString();
-                break stringLabel;
-            }
-            if (hostEvent != null) {
-                eventStr = hostEvent.toString();
-                break stringLabel;
-            }
-            // Test whether this is NO-OP event
-            if (onosInstanceId != null) {
-                eventStr = "NO-OP";
-                break stringLabel;
-            }
-            // No event found
-            return "[Unknown TopologyEvent]";
-        }
-
-        return "[TopologyEvent " + eventStr + " from " +
-            onosInstanceId.toString() + "]";
+        return event.getConfigState();
     }
 
     /**
@@ -331,46 +239,17 @@
         return getIDasByteBuffer().array();
     }
 
-    /**
-     * Gets the Topology event ID as a ByteBuffer.
-     *
-     * @return the Topology event ID as a ByteBuffer.
-     */
     public ByteBuffer getIDasByteBuffer() {
         ByteBuffer eventId = null;
 
         //
         // Get the Event ID
         //
-        idLabel: {
-            if (mastershipEvent != null) {
-                eventId = mastershipEvent.getIDasByteBuffer();
-                break idLabel;
-            }
-            if (switchEvent != null) {
-                eventId = switchEvent.getIDasByteBuffer();
-                break idLabel;
-            }
-            if (portEvent != null) {
-                eventId = portEvent.getIDasByteBuffer();
-                break idLabel;
-            }
-            if (linkEvent != null) {
-                eventId = linkEvent.getIDasByteBuffer();
-                break idLabel;
-            }
-            if (hostEvent != null) {
-                eventId = hostEvent.getIDasByteBuffer();
-                break idLabel;
-            }
-            // Test whether this is NO-OP event
-            if (onosInstanceId != null) {
-                String id = "NO-OP";
-                eventId = ByteBuffer.wrap(id.getBytes(StandardCharsets.UTF_8));
-                break idLabel;
-            }
-            // No event found
-            throw new IllegalStateException("Invalid TopologyEvent ID");
+        if (eventType == Type.NOOP) {
+            String id = "NO-OP";
+            eventId = ByteBuffer.wrap(id.getBytes(StandardCharsets.UTF_8));
+        } else {
+            eventId = event.getIDasByteBuffer();
         }
 
         //
@@ -388,4 +267,40 @@
         buf.flip();
         return buf;
     }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+
+        TopologyEvent other = (TopologyEvent) o;
+        return Objects.equals(eventType, other.eventType) &&
+            Objects.equals(event, other.event) &&
+            Objects.equals(onosInstanceId, other.onosInstanceId);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(eventType, event, onosInstanceId);
+    }
+
+    @Override
+    public String toString() {
+        String eventStr = null;
+
+        //
+        // Get the Event string
+        //
+        if (eventType == Type.NOOP) {
+            eventStr = "NO-OP";
+        } else {
+            eventStr = event.toString();
+        }
+        return "[TopologyEvent " + eventStr + " from " +
+            onosInstanceId.toString() + "]";
+    }
 }
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 b6c2c86..1280cf4 100644
--- a/src/main/java/net/onrc/onos/core/topology/TopologyManager.java
+++ b/src/main/java/net/onrc/onos/core/topology/TopologyManager.java
@@ -953,7 +953,7 @@
 
             // Cleanup the Host Event from the local cache
             // TODO: The implementation below is probably wrong
-            ByteBuffer id = ByteBuffer.wrap(hostEvent.getID());
+            ByteBuffer id = hostEvent.getIDasByteBuffer();
             for (SwitchPort swp : hostEvent.getAttachmentPoints()) {
                 Map<ByteBuffer, HostEvent> oldHostEvents =
                         discoveredAddedHostEvents.get(swp.getDpid());
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 e48b01b..18e0767 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
@@ -176,6 +176,7 @@
         kryo.register(TopologyBatchOperation.Operator.class);
         kryo.register(TopologyElement.class);
         kryo.register(TopologyEvent.class);
+        kryo.register(TopologyEvent.Type.class);
 
         // Intent-related classes
         kryo.register(Path.class);
