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 140e4c7..d73f80f 100644
--- a/src/main/java/net/onrc/onos/core/topology/LinkEvent.java
+++ b/src/main/java/net/onrc/onos/core/topology/LinkEvent.java
@@ -1,34 +1,65 @@
 package net.onrc.onos.core.topology;
 
 import java.nio.ByteBuffer;
+import java.util.Objects;
 
 import net.onrc.onos.core.topology.web.serializers.LinkEventSerializer;
 import net.onrc.onos.core.util.Dpid;
 import net.onrc.onos.core.util.PortNumber;
 import net.onrc.onos.core.util.SwitchPort;
 
+import org.apache.commons.lang.Validate;
 import org.codehaus.jackson.map.annotate.JsonSerialize;
 
 /**
  * Self-contained Link event Object.
  * <p/>
- * TODO: We probably want common base class/interface for Self-Contained Event Object.
+ * TODO: Rename to match what it is. (Switch/Port/Link/Device)Snapshot?
+ * FIXME: Current implementation directly use this object as
+ *        Replication message, but should be sending update operation info.
  */
 
 @JsonSerialize(using = LinkEventSerializer.class)
-public class LinkEvent {
-    protected final SwitchPort src;
-    protected final SwitchPort dst;
+public class LinkEvent extends TopologyElement<LinkEvent> {
+
+    private final SwitchPort src;
+    private final SwitchPort dst;
+    // TODO add LastSeenTime, Capacity if appropriate
 
     /**
      * Default constructor for Serializer to use.
      */
     @Deprecated
-    public LinkEvent() {
+    protected LinkEvent() {
         src = null;
         dst = null;
     }
 
+    /**
+     * Creates the Link object.
+     *
+     * @param src source SwitchPort
+     * @param dst destination SwitchPort
+     */
+    public LinkEvent(SwitchPort src, SwitchPort dst) {
+        Validate.notNull(src);
+        Validate.notNull(dst);
+
+        this.src = src;
+        this.dst = dst;
+    }
+
+    /**
+     * Create an unfrozen copy of given Object.
+     *
+     * @param original to make copy of.
+     */
+    public LinkEvent(LinkEvent original) {
+        super(original);
+        this.src = original.src;
+        this.dst = original.dst;
+    }
+
     public LinkEvent(Long srcDpid, Long srcPortNo, Long dstDpid,
                      Long dstPortNo) {
         src = new SwitchPort(srcDpid, srcPortNo);
@@ -42,16 +73,34 @@
                 link.getDstPort().getNumber());
     }
 
+    /**
+     * Creates the Link object.
+     *
+     * @param srcDpid source switch DPID
+     * @param srcPortNo source port number
+     * @param dstDpid destination switch DPID
+     * @param dstPortNo destination port number
+     */
     public LinkEvent(Dpid srcDpid, PortNumber srcPortNo,
                      Dpid dstDpid, PortNumber dstPortNo) {
         src = new SwitchPort(srcDpid, srcPortNo);
         dst = new SwitchPort(dstDpid, dstPortNo);
     }
 
+    /**
+     * Gets the source SwitchPort.
+     *
+     * @return source SwitchPort.
+     */
     public SwitchPort getSrc() {
         return src;
     }
 
+    /**
+     * Gets the destination SwitchPort.
+     *
+     * @return destination SwitchPort.
+     */
     public SwitchPort getDst() {
         return dst;
     }
@@ -71,7 +120,8 @@
 
     public static ByteBuffer getLinkID(Long srcDpid, Long srcPortNo,
                                        Long dstDpid, Long dstPortNo) {
-        return (ByteBuffer) ByteBuffer.allocate(LinkEvent.LINKID_BYTES).putChar('L')
+        return (ByteBuffer) ByteBuffer.allocate(LinkEvent.LINKID_BYTES)
+                .putChar('L')
                 .put(PortEvent.getPortID(srcDpid, srcPortNo))
                 .put(PortEvent.getPortID(dstDpid, dstPortNo)).flip();
     }
@@ -88,7 +138,7 @@
     @Override
     public int hashCode() {
         final int prime = 31;
-        int result = 1;
+        int result = super.hashCode();
         result = prime * result + ((dst == null) ? 0 : dst.hashCode());
         result = prime * result + ((src == null) ? 0 : src.hashCode());
         return result;
@@ -99,27 +149,22 @@
         if (this == obj) {
             return true;
         }
+
         if (obj == null) {
             return false;
         }
+
         if (getClass() != obj.getClass()) {
             return false;
         }
         LinkEvent other = (LinkEvent) obj;
-        if (dst == null) {
-            if (other.dst != null) {
-                return false;
-            }
-        } else if (!dst.equals(other.dst)) {
+
+        // compare attributes
+        if (!super.equals(obj)) {
             return false;
         }
-        if (src == null) {
-            if (other.src != null) {
-                return false;
-            }
-        } else if (!src.equals(other.src)) {
-            return false;
-        }
-        return true;
+
+        return Objects.equals(this.src, other.src) &&
+                Objects.equals(this.dst, other.dst);
     }
 }
