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 2469f99..d784439 100644
--- a/src/main/java/net/onrc/onos/core/intent/PathIntentMap.java
+++ b/src/main/java/net/onrc/onos/core/intent/PathIntentMap.java
@@ -8,6 +8,7 @@
 import net.onrc.onos.core.topology.Link;
 import net.onrc.onos.core.topology.LinkEvent;
 import net.onrc.onos.core.util.Dpid;
+import net.onrc.onos.core.util.LinkTuple;
 import net.onrc.onos.core.util.PortNumber;
 import net.onrc.onos.core.util.SwitchPort;
 
@@ -97,13 +98,13 @@
     /**
      * Retrieve all intents that use a particular link.
      *
-     * @param linkEvent the link to look up
+     * @param linkTuple the link tuple to look up
      * @return a collection of PathIntents that use the link
      */
-    public Collection<PathIntent> getIntentsByLink(LinkEvent linkEvent) {
+    public Collection<PathIntent> getIntentsByLink(LinkTuple linkTuple) {
         return getIntentsByPort(
-                linkEvent.getSrc().getDpid(),
-                linkEvent.getSrc().getPortNumber());
+                linkTuple.getSrc().getDpid(),
+                linkTuple.getSrc().getPortNumber());
     }
 
     /**
@@ -152,9 +153,8 @@
             return null;
         }
         Double bandwidth = link.getCapacity();
-        LinkEvent linkEvent = new LinkEvent(link);
         if (!bandwidth.isInfinite()) {
-            for (PathIntent intent : getIntentsByLink(linkEvent)) {
+            for (PathIntent intent : getIntentsByLink(link.getLinkTuple())) {
                 Double intentBandwidth = intent.getBandwidth();
                 if (intentBandwidth == null || intentBandwidth.isInfinite() || intentBandwidth.isNaN()) {
                     continue;
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 740a33c..12d85d6 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
@@ -870,7 +870,7 @@
                    topologyEvents.getRemovedPortEvents().size() > 0) {
             p.log("begin_getIntentsByLink");
             for (LinkEvent linkEvent : topologyEvents.getRemovedLinkEvents()) {
-                affectedPaths.addAll(pathIntents.getIntentsByLink(linkEvent));
+                affectedPaths.addAll(pathIntents.getIntentsByLink(linkEvent.getLinkTuple()));
             }
             p.log("end_getIntentsByLink");
 
diff --git a/src/main/java/net/onrc/onos/core/topology/Host.java b/src/main/java/net/onrc/onos/core/topology/Host.java
index 05849c5..4e0c2e4 100644
--- a/src/main/java/net/onrc/onos/core/topology/Host.java
+++ b/src/main/java/net/onrc/onos/core/topology/Host.java
@@ -33,7 +33,7 @@
     public Iterable<Port> getAttachmentPoints();
 
     /**
-     * Gest the Host last seen time.
+     * Gets the Host last seen time.
      * <p/>
      *
      * @return the Host last seen time. (UTC in ms)
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 ebaf688..1c64939 100644
--- a/src/main/java/net/onrc/onos/core/topology/HostEvent.java
+++ b/src/main/java/net/onrc/onos/core/topology/HostEvent.java
@@ -11,6 +11,7 @@
 import net.onrc.onos.core.topology.web.serializers.HostEventSerializer;
 import net.onrc.onos.core.util.SwitchPort;
 
+import static com.google.common.base.Preconditions.checkNotNull;
 import org.codehaus.jackson.map.annotate.JsonSerialize;
 
 /**
@@ -42,11 +43,13 @@
         mac = null;
     }
 
+    /**
+     * Creates the Host object.
+     *
+     * @param mac the MAC address to identify the host
+     */
     public HostEvent(MACAddress mac) {
-        if (mac == null) {
-            throw new IllegalArgumentException("Host mac cannot be null");
-        }
-        this.mac = mac;
+        this.mac = checkNotNull(mac);
         this.attachmentPoints = new LinkedList<>();
     }
 
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 289e1e0..7370be0 100644
--- a/src/main/java/net/onrc/onos/core/topology/HostImpl.java
+++ b/src/main/java/net/onrc/onos/core/topology/HostImpl.java
@@ -3,7 +3,7 @@
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.commons.lang.Validate;
+import static com.google.common.base.Preconditions.checkNotNull;
 
 import net.floodlightcontroller.util.MACAddress;
 import net.onrc.onos.core.util.SwitchPort;
@@ -25,8 +25,7 @@
      */
     HostImpl(TopologyInternal topology, MACAddress mac) {
         super(topology);
-        Validate.notNull(mac);
-        this.id = mac;
+        this.id = checkNotNull(mac);
     }
 
     @Override
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 00b4b90..f7ae6d3 100644
--- a/src/main/java/net/onrc/onos/core/topology/LinkEvent.java
+++ b/src/main/java/net/onrc/onos/core/topology/LinkEvent.java
@@ -9,7 +9,7 @@
 import net.onrc.onos.core.util.PortNumber;
 import net.onrc.onos.core.util.SwitchPort;
 
-import org.apache.commons.lang.Validate;
+import static com.google.common.base.Preconditions.checkNotNull;
 import org.codehaus.jackson.map.annotate.JsonSerialize;
 
 /**
@@ -42,9 +42,7 @@
      * @param id link tuple to identify this link
      */
     public LinkEvent(LinkTuple id) {
-        Validate.notNull(id);
-
-        this.id = id;
+        this.id = checkNotNull(id);
     }
 
     /**
@@ -74,19 +72,6 @@
     }
 
     /**
-     * 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) {
-        this(new LinkTuple(srcDpid, srcPortNo, dstDpid, dstPortNo));
-    }
-
-    /**
      * Gets a {@link LinkTuple} that identifies this link.
      *
      * @return a LinkTuple representing the Port
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 5886c8e..ee60d2d 100644
--- a/src/main/java/net/onrc/onos/core/topology/LinkImpl.java
+++ b/src/main/java/net/onrc/onos/core/topology/LinkImpl.java
@@ -4,7 +4,7 @@
 
 import net.onrc.onos.core.util.LinkTuple;
 
-import org.apache.commons.lang.Validate;
+import static com.google.common.base.Preconditions.checkNotNull;
 
 /**
  * Handler to Link object stored in In-memory Topology snapshot.
@@ -23,8 +23,7 @@
      */
     LinkImpl(TopologyInternal topology, LinkTuple linkTuple) {
         super(topology);
-        Validate.notNull(linkTuple);
-        this.id = linkTuple;
+        this.id = checkNotNull(linkTuple);
     }
 
     @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 5668e2f..8106a39 100644
--- a/src/main/java/net/onrc/onos/core/topology/MastershipEvent.java
+++ b/src/main/java/net/onrc/onos/core/topology/MastershipEvent.java
@@ -9,7 +9,7 @@
 import net.onrc.onos.core.util.Dpid;
 import net.onrc.onos.core.util.OnosInstanceId;
 
-import org.apache.commons.lang.Validate;
+import static com.google.common.base.Preconditions.checkNotNull;
 import org.codehaus.jackson.map.annotate.JsonSerialize;
 
 /**
@@ -45,11 +45,8 @@
      */
     public MastershipEvent(Dpid dpid, OnosInstanceId onosInstanceId,
                            Role role) {
-        Validate.notNull(dpid);
-        Validate.notNull(onosInstanceId);
-
-        this.dpid = dpid;
-        this.onosInstanceId = onosInstanceId;
+        this.dpid = checkNotNull(dpid);
+        this.onosInstanceId = checkNotNull(onosInstanceId);
         this.role = role;
     }
 
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 305f4aa..0fa5a7e 100644
--- a/src/main/java/net/onrc/onos/core/topology/PortEvent.java
+++ b/src/main/java/net/onrc/onos/core/topology/PortEvent.java
@@ -5,7 +5,7 @@
 import net.onrc.onos.core.util.PortNumber;
 import net.onrc.onos.core.util.SwitchPort;
 
-import org.apache.commons.lang.Validate;
+import static com.google.common.base.Preconditions.checkNotNull;
 import org.codehaus.jackson.map.annotate.JsonSerialize;
 
 import java.nio.ByteBuffer;
@@ -45,8 +45,7 @@
      * @param switchPort SwitchPort to identify this port
      */
     public PortEvent(SwitchPort switchPort) {
-        Validate.notNull(switchPort);
-        this.id = switchPort;
+        this.id = checkNotNull(switchPort);
     }
 
     /**
@@ -132,8 +131,8 @@
     public static final int PORTID_BYTES = SwitchEvent.SWITCHID_BYTES + 2 + 8;
 
     public static ByteBuffer getPortID(Dpid dpid, PortNumber number) {
-        Validate.notNull(dpid);
-        Validate.notNull(number);
+        checkNotNull(dpid);
+        checkNotNull(number);
         return getPortID(dpid.value(), number.value());
     }
 
@@ -156,5 +155,4 @@
     public ByteBuffer getIDasByteBuffer() {
         return getPortID(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 3f4cdfb..5067049 100644
--- a/src/main/java/net/onrc/onos/core/topology/PortImpl.java
+++ b/src/main/java/net/onrc/onos/core/topology/PortImpl.java
@@ -3,7 +3,7 @@
 import java.util.Collection;
 import java.util.Map;
 
-import org.apache.commons.lang.Validate;
+import static com.google.common.base.Preconditions.checkNotNull;
 
 import net.onrc.onos.core.util.Dpid;
 import net.onrc.onos.core.util.PortNumber;
@@ -26,8 +26,7 @@
      */
     PortImpl(TopologyInternal topology, SwitchPort switchPort) {
         super(topology);
-        Validate.notNull(switchPort);
-        this.id = switchPort;
+        this.id = checkNotNull(switchPort);
     }
 
     /**
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 fdc4b84..f724fae 100644
--- a/src/main/java/net/onrc/onos/core/topology/SwitchEvent.java
+++ b/src/main/java/net/onrc/onos/core/topology/SwitchEvent.java
@@ -6,8 +6,8 @@
 import java.nio.ByteBuffer;
 import java.util.Objects;
 
+import static com.google.common.base.Preconditions.checkNotNull;
 import org.codehaus.jackson.map.annotate.JsonSerialize;
-import org.apache.commons.lang.Validate;
 
 /**
  * Self-contained Switch Object.
@@ -34,8 +34,7 @@
      * @param dpid Dpid to identify this switch
      */
     public SwitchEvent(Dpid dpid) {
-        Validate.notNull(dpid);
-        this.dpid = dpid;
+        this.dpid = checkNotNull(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 e0e02d5..29df7b8 100644
--- a/src/main/java/net/onrc/onos/core/topology/SwitchImpl.java
+++ b/src/main/java/net/onrc/onos/core/topology/SwitchImpl.java
@@ -11,7 +11,7 @@
 import net.onrc.onos.core.util.Dpid;
 import net.onrc.onos.core.util.PortNumber;
 
-import org.apache.commons.lang.Validate;
+import static com.google.common.base.Preconditions.checkNotNull;
 
 /**
  * Handler to Switch object stored in In-memory Topology snapshot.
@@ -31,8 +31,7 @@
      */
     SwitchImpl(TopologyInternal topology, Dpid dpid) {
         super(topology);
-        Validate.notNull(dpid);
-        this.id = dpid;
+        this.id = checkNotNull(dpid);
     }
 
     @Override
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 bb32958..f169456 100644
--- a/src/main/java/net/onrc/onos/core/topology/TopologyElement.java
+++ b/src/main/java/net/onrc/onos/core/topology/TopologyElement.java
@@ -6,7 +6,7 @@
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 
-import org.apache.commons.lang.Validate;
+import static com.google.common.base.Preconditions.checkNotNull;
 
 /**
  * Base class for Topology Elements.
@@ -150,7 +150,7 @@
         if (isFrozen) {
             throw new IllegalStateException("Tried to modify frozen object: " + this);
         }
-        Validate.notNull(value, "attribute value cannot be null");
+        checkNotNull(value, "attribute value cannot be null");
 
         return this.stringAttributes.putIfAbsent(attr, value) == null;
     }
@@ -160,7 +160,7 @@
         if (isFrozen) {
             throw new IllegalStateException("Tried to modify frozen object: " + this);
         }
-        Validate.notNull(value, "attribute value cannot be null");
+        checkNotNull(value, "attribute value cannot be null");
 
         return this.stringAttributes.replace(attr, oldValue, value);
     }
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 cdae99c..df38b5e 100644
--- a/src/main/java/net/onrc/onos/core/topology/TopologyEvent.java
+++ b/src/main/java/net/onrc/onos/core/topology/TopologyEvent.java
@@ -2,6 +2,9 @@
 
 import java.util.Objects;
 
+import net.onrc.onos.core.util.OnosInstanceId;
+
+import static com.google.common.base.Preconditions.checkNotNull;
 
 /**
  * Self-contained Topology event Object
@@ -9,63 +12,149 @@
  * TODO: For now the topology event contains one of the following events:
  * Switch, Port, Link, Host, Switch Mastership. In the future it will contain
  * multiple events in a single transaction.
+ * TODO: This class should become immutable after its internals and usage
+ * are finalized.
  */
-public class TopologyEvent {
-    SwitchEvent switchEvent = null;             // Set for Switch event
-    PortEvent portEvent = null;                 // Set for Port event
-    LinkEvent linkEvent = null;                 // Set for Link event
-    HostEvent hostEvent = null;                 // Set for Host event
-    MastershipEvent mastershipEvent = null;     // Set for Mastership event
+public final class TopologyEvent {
+    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 MastershipEvent mastershipEvent; // Set for Mastership event
+    private final OnosInstanceId onosInstanceId;   // The ONOS Instance ID
 
     /**
-     * Default constructor.
+     * Default constructor for serializer.
      */
-    public TopologyEvent() {
+    @Deprecated
+    protected TopologyEvent() {
+        switchEvent = null;
+        portEvent = null;
+        linkEvent = null;
+        hostEvent = null;
+        mastershipEvent = null;
+        onosInstanceId = null;
     }
 
     /**
      * Constructor for given Switch event.
      *
      * @param switchEvent the Switch event to use.
+     * @param onosInstanceId the ONOS Instance ID that originates the event.
      */
-    TopologyEvent(SwitchEvent switchEvent) {
-        this.switchEvent = switchEvent;
+    TopologyEvent(SwitchEvent switchEvent, OnosInstanceId onosInstanceId) {
+        this.switchEvent = checkNotNull(switchEvent);
+        this.portEvent = null;
+        this.linkEvent = null;
+        this.hostEvent = null;
+        this.mastershipEvent = null;
+        this.onosInstanceId = checkNotNull(onosInstanceId);
     }
 
     /**
      * Constructor for given Port event.
      *
      * @param portEvent the Port event to use.
+     * @param onosInstanceId the ONOS Instance ID that originates the event.
      */
-    TopologyEvent(PortEvent portEvent) {
-        this.portEvent = portEvent;
+    TopologyEvent(PortEvent portEvent, OnosInstanceId onosInstanceId) {
+        this.switchEvent = null;
+        this.portEvent = checkNotNull(portEvent);
+        this.linkEvent = null;
+        this.hostEvent = null;
+        this.mastershipEvent = null;
+        this.onosInstanceId = checkNotNull(onosInstanceId);
     }
 
     /**
      * Constructor for given Link event.
      *
      * @param linkEvent the Link event to use.
+     * @param onosInstanceId the ONOS Instance ID that originates the event.
      */
-    TopologyEvent(LinkEvent linkEvent) {
-        this.linkEvent = linkEvent;
+    TopologyEvent(LinkEvent linkEvent, OnosInstanceId onosInstanceId) {
+        this.switchEvent = null;
+        this.portEvent = null;
+        this.linkEvent = checkNotNull(linkEvent);
+        this.hostEvent = null;
+        this.mastershipEvent = null;
+        this.onosInstanceId = checkNotNull(onosInstanceId);
     }
 
     /**
      * Constructor for given Host event.
      *
      * @param hostEvent the Host event to use.
+     * @param onosInstanceId the ONOS Instance ID that originates the event.
      */
-    TopologyEvent(HostEvent hostEvent) {
-        this.hostEvent = hostEvent;
+    TopologyEvent(HostEvent hostEvent, OnosInstanceId onosInstanceId) {
+        this.switchEvent = null;
+        this.portEvent = null;
+        this.linkEvent = null;
+        this.hostEvent = checkNotNull(hostEvent);
+        this.mastershipEvent = null;
+        this.onosInstanceId = checkNotNull(onosInstanceId);
     }
 
     /**
      * Constructor for given Switch Mastership event.
      *
      * @param mastershipEvent the Switch Mastership event to use.
+     * @param onosInstanceId the ONOS Instance ID that originates the event.
      */
-    TopologyEvent(MastershipEvent mastershipEvent) {
-        this.mastershipEvent = mastershipEvent;
+    TopologyEvent(MastershipEvent mastershipEvent,
+                  OnosInstanceId onosInstanceId) {
+        this.switchEvent = null;
+        this.portEvent = null;
+        this.linkEvent = null;
+        this.hostEvent = null;
+        this.mastershipEvent = checkNotNull(mastershipEvent);
+        this.onosInstanceId = checkNotNull(onosInstanceId);
+    }
+
+    /**
+     * Gets the Switch event.
+     *
+     * @return the Switch event.
+     */
+    public SwitchEvent getSwitchEvent() {
+        return switchEvent;
+    }
+
+    /**
+     * Gets the Port event.
+     *
+     * @return the Port event.
+     */
+    public PortEvent getPortEvent() {
+        return portEvent;
+    }
+
+    /**
+     * Gets the Link event.
+     *
+     * @return the Link event.
+     */
+    public LinkEvent getLinkEvent() {
+        return linkEvent;
+    }
+
+    /**
+     * Gets the Host event.
+     *
+     * @return the Host event.
+     */
+    public HostEvent getHostEvent() {
+        return hostEvent;
+    }
+
+    /**
+     * Gets the Mastership event.
+     *
+     * @return the Mastership event.
+     */
+    public MastershipEvent getMastershipEvent() {
+        return mastershipEvent;
     }
 
     /**
@@ -88,6 +177,7 @@
         }
 
         TopologyEvent other = (TopologyEvent) obj;
+        // TODO: For now the onosInstanceId is not used
         return Objects.equals(switchEvent, other.switchEvent) &&
                 Objects.equals(portEvent, other.portEvent) &&
                 Objects.equals(linkEvent, other.linkEvent) &&
@@ -97,6 +187,7 @@
 
     @Override
     public int hashCode() {
+        // TODO: For now the onosInstanceId is not used
         return Objects.hash(switchEvent, portEvent, linkEvent, hostEvent,
                             mastershipEvent);
     }
@@ -108,6 +199,7 @@
      */
     @Override
     public String toString() {
+        // TODO: For now the onosInstanceId is not used
         if (switchEvent != null) {
             return switchEvent.toString();
         }
@@ -132,6 +224,7 @@
      * @return the Topology event ID.
      */
     public byte[] getID() {
+        // TODO: For now the onosInstanceId is not used
         if (switchEvent != null) {
             return switchEvent.getID();
         }
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 e733c68..10fa6be 100644
--- a/src/main/java/net/onrc/onos/core/topology/TopologyManager.java
+++ b/src/main/java/net/onrc/onos/core/topology/TopologyManager.java
@@ -273,11 +273,11 @@
             //
             for (EventEntry<TopologyEvent> event : events) {
                 TopologyEvent topologyEvent = event.eventData();
-                SwitchEvent switchEvent = topologyEvent.switchEvent;
-                PortEvent portEvent = topologyEvent.portEvent;
-                LinkEvent linkEvent = topologyEvent.linkEvent;
-                HostEvent hostEvent = topologyEvent.hostEvent;
-                MastershipEvent mastershipEvent = topologyEvent.mastershipEvent;
+                SwitchEvent switchEvent = topologyEvent.getSwitchEvent();
+                PortEvent portEvent = topologyEvent.getPortEvent();
+                LinkEvent linkEvent = topologyEvent.getLinkEvent();
+                HostEvent hostEvent = topologyEvent.getHostEvent();
+                MastershipEvent mastershipEvent = topologyEvent.getMastershipEvent();
 
                 //
                 // Extract the events
@@ -625,13 +625,17 @@
         if (datastore.addSwitch(switchEvent, portEvents)) {
             log.debug("Sending add switch: {}", switchEvent);
             // Send out notification
-            TopologyEvent topologyEvent = new TopologyEvent(switchEvent);
+            TopologyEvent topologyEvent =
+                new TopologyEvent(switchEvent,
+                                  registryService.getOnosInstanceId());
             eventChannel.addEntry(topologyEvent.getID(), topologyEvent);
 
             // Send out notification for each port
             for (PortEvent portEvent : portEvents) {
                 log.debug("Sending add port: {}", portEvent);
-                topologyEvent = new TopologyEvent(portEvent);
+                topologyEvent =
+                    new TopologyEvent(portEvent,
+                                      registryService.getOnosInstanceId());
                 eventChannel.addEntry(topologyEvent.getID(), topologyEvent);
             }
 
@@ -737,7 +741,9 @@
         if (datastore.addPort(portEvent)) {
             log.debug("Sending add port: {}", portEvent);
             // Send out notification
-            TopologyEvent topologyEvent = new TopologyEvent(portEvent);
+            TopologyEvent topologyEvent =
+                new TopologyEvent(portEvent,
+                                  registryService.getOnosInstanceId());
             eventChannel.addEntry(topologyEvent.getID(), topologyEvent);
 
             // Store the new Port Event in the local cache
@@ -817,7 +823,9 @@
         if (datastore.addLink(linkEvent)) {
             log.debug("Sending add link: {}", linkEvent);
             // Send out notification
-            TopologyEvent topologyEvent = new TopologyEvent(linkEvent);
+            TopologyEvent topologyEvent =
+                new TopologyEvent(linkEvent,
+                                  registryService.getOnosInstanceId());
             eventChannel.addEntry(topologyEvent.getID(), topologyEvent);
 
             // Store the new Link Event in the local cache
@@ -864,7 +872,9 @@
     public void putHostDiscoveryEvent(HostEvent hostEvent) {
         if (datastore.addHost(hostEvent)) {
             // Send out notification
-            TopologyEvent topologyEvent = new TopologyEvent(hostEvent);
+            TopologyEvent topologyEvent =
+                new TopologyEvent(hostEvent,
+                                  registryService.getOnosInstanceId());
             eventChannel.addEntry(topologyEvent.getID(), topologyEvent);
             log.debug("Put the host info into the cache of the topology. mac {}", hostEvent.getMac());
 
@@ -921,7 +931,9 @@
     @Override
     public void putSwitchMastershipEvent(MastershipEvent mastershipEvent) {
         // Send out notification
-        TopologyEvent topologyEvent = new TopologyEvent(mastershipEvent);
+        TopologyEvent topologyEvent =
+            new TopologyEvent(mastershipEvent,
+                              registryService.getOnosInstanceId());
         eventChannel.addEntry(topologyEvent.getID(), topologyEvent);
     }
 
@@ -1363,8 +1375,15 @@
                 continue;
             }
 
+            //
+            // TODO: Using the local ONOS Instance ID below is incorrect.
+            // Currently, this code is not used, and it might go away in the
+            // future.
+            //
             SwitchEvent switchEvent = new SwitchEvent(new Dpid(sw.getDpid()));
-            TopologyEvent topologyEvent = new TopologyEvent(switchEvent);
+            TopologyEvent topologyEvent =
+                new TopologyEvent(switchEvent,
+                                  registryService.getOnosInstanceId());
             EventEntry<TopologyEvent> eventEntry =
                     new EventEntry<TopologyEvent>(EventEntry.Type.ENTRY_ADD,
                             topologyEvent);
@@ -1377,30 +1396,49 @@
                 continue;
             }
 
-            PortEvent portEvent = new PortEvent(
-                    new Dpid(p.getDpid()),
-                    new PortNumber(p.getNumber().shortValue()));
-            TopologyEvent topologyEvent = new TopologyEvent(portEvent);
+            //
+            // TODO: Using the local ONOS Instance ID below is incorrect.
+            // Currently, this code is not used, and it might go away in the
+            // future.
+            //
+            PortEvent portEvent =
+                new PortEvent(new Dpid(p.getDpid()),
+                              new PortNumber(p.getNumber().shortValue()));
+            TopologyEvent topologyEvent =
+                new TopologyEvent(portEvent,
+                                  registryService.getOnosInstanceId());
             EventEntry<TopologyEvent> eventEntry =
                     new EventEntry<TopologyEvent>(EventEntry.Type.ENTRY_ADD,
                             topologyEvent);
             collection.add(eventEntry);
         }
 
-         for (KVDevice d : KVDevice.getAllDevices()) {
-              HostEvent devEvent = new HostEvent(MACAddress.valueOf(d.getMac()));
-              for (byte[] portId : d.getAllPortIds()) {
-                  devEvent.addAttachmentPoint(
-                          new SwitchPort(KVPort.getDpidFromKey(portId),
-                                  KVPort.getNumberFromKey(portId)));
-              }
-         }
+        for (KVDevice d : KVDevice.getAllDevices()) {
+            //
+            // TODO: Using the local ONOS Instance ID below is incorrect.
+            // Currently, this code is not used, and it might go away in the
+            // future.
+            //
+            HostEvent devEvent = new HostEvent(MACAddress.valueOf(d.getMac()));
+            for (byte[] portId : d.getAllPortIds()) {
+                devEvent.addAttachmentPoint(
+                        new SwitchPort(KVPort.getDpidFromKey(portId),
+                        KVPort.getNumberFromKey(portId)));
+            }
+        }
 
         for (KVLink l : KVLink.getAllLinks()) {
+            //
+            // TODO: Using the local ONOS Instance ID below is incorrect.
+            // Currently, this code is not used, and it might go away in the
+            // future.
+            //
             LinkEvent linkEvent = new LinkEvent(
-                    new SwitchPort(l.getSrc().dpid, l.getSrc().number),
-                    new SwitchPort(l.getDst().dpid, l.getDst().number));
-            TopologyEvent topologyEvent = new TopologyEvent(linkEvent);
+                        new SwitchPort(l.getSrc().dpid, l.getSrc().number),
+                        new SwitchPort(l.getDst().dpid, l.getDst().number));
+            TopologyEvent topologyEvent =
+                new TopologyEvent(linkEvent,
+                                  registryService.getOnosInstanceId());
             EventEntry<TopologyEvent> eventEntry =
                     new EventEntry<TopologyEvent>(EventEntry.Type.ENTRY_ADD,
                             topologyEvent);
diff --git a/src/main/java/net/onrc/onos/core/topology/TopologyObject.java b/src/main/java/net/onrc/onos/core/topology/TopologyObject.java
index 445c2d8..b83c99b 100644
--- a/src/main/java/net/onrc/onos/core/topology/TopologyObject.java
+++ b/src/main/java/net/onrc/onos/core/topology/TopologyObject.java
@@ -1,6 +1,6 @@
 package net.onrc.onos.core.topology;
 
-import org.apache.commons.lang.Validate;
+import static com.google.common.base.Preconditions.checkNotNull;
 
 
 /**
@@ -28,8 +28,7 @@
      * @param topology Topology instance this object belongs to
      */
     protected TopologyObject(TopologyInternal topology) {
-        Validate.notNull(topology);
-        this.topology = topology;
+        this.topology = checkNotNull(topology);
     }
 
     // TODO Add method to replace topology snapshot
