diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/UiWebSocket.java b/web/gui/src/main/java/org/onosproject/ui/impl/UiWebSocket.java
index 328207d..e1d403d 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/UiWebSocket.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/UiWebSocket.java
@@ -96,6 +96,8 @@
         UiSharedTopologyModel sharedModel = directory.get(UiSharedTopologyModel.class);
         UiTopoLayoutService layoutService = directory.get(UiTopoLayoutService.class);
 
+        sharedModel.injectJsonifier(t2json);
+
         topoSession = new UiTopoSession(this, t2json, sharedModel, layoutService);
 
         // FIXME: this is temporary to prevent unhandled events being set to GUI...
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/topo/Topo2Jsonifier.java b/web/gui/src/main/java/org/onosproject/ui/impl/topo/Topo2Jsonifier.java
index ebc20fe..6234391 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/topo/Topo2Jsonifier.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/topo/Topo2Jsonifier.java
@@ -44,6 +44,7 @@
 import org.onosproject.ui.impl.topo.model.UiModelEvent;
 import org.onosproject.ui.model.topo.UiClusterMember;
 import org.onosproject.ui.model.topo.UiDevice;
+import org.onosproject.ui.model.topo.UiElement;
 import org.onosproject.ui.model.topo.UiHost;
 import org.onosproject.ui.model.topo.UiLink;
 import org.onosproject.ui.model.topo.UiNode;
@@ -82,6 +83,8 @@
     private static final String HOST = "host";
     private static final String TYPE = "type";
     private static final String SUBJECT = "subject";
+    private static final String DATA = "data";
+    private static final String MEMO = "memo";
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
@@ -267,6 +270,28 @@
     }
 
     /**
+     * Creates a JSON representation of a UI element.
+     *
+     * @param element the source element
+     * @return a JSON representation of that element
+     */
+    public ObjectNode jsonUiElement(UiElement element) {
+        if (element instanceof UiNode) {
+            return json((UiNode) element);
+        }
+        if (element instanceof UiLink) {
+            return json((UiLink) element);
+        }
+
+        // TODO: UiClusterMember
+
+        // Unrecognized UiElement class
+        return objectNode()
+                .put("warning", "unknown UiElement... cannot encode")
+                .put("javaclass", element.getClass().toString());
+    }
+
+    /**
      * Creates a JSON representation of a UI model event.
      *
      * @param modelEvent the source model event
@@ -276,6 +301,8 @@
         ObjectNode payload = objectNode();
         payload.put(TYPE, enumToString(modelEvent.type()));
         payload.put(SUBJECT, modelEvent.subject().idAsString());
+        payload.set(DATA, modelEvent.data());
+        payload.put(MEMO, modelEvent.memo());
         return payload;
     }
 
@@ -408,14 +435,17 @@
     }
 
     private ObjectNode json(UiSynthLink sLink) {
-        UiLink uLink = sLink.link();
+        return json(sLink.link());
+    }
+
+    private ObjectNode json(UiLink link) {
         ObjectNode data = objectNode()
-                .put("id", uLink.idAsString())
-                .put("epA", uLink.endPointA())
-                .put("epB", uLink.endPointB())
-                .put("type", uLink.type());
-        String pA = uLink.endPortA();
-        String pB = uLink.endPortB();
+                .put("id", link.idAsString())
+                .put("epA", link.endPointA())
+                .put("epB", link.endPointB())
+                .put("type", link.type());
+        String pA = link.endPortA();
+        String pB = link.endPortB();
         if (pA != null) {
             data.put("portA", pA);
         }
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/topo/model/ModelCache.java b/web/gui/src/main/java/org/onosproject/ui/impl/topo/model/ModelCache.java
index f98ab7b..24fda23 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/topo/model/ModelCache.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/topo/model/ModelCache.java
@@ -16,6 +16,7 @@
 
 package org.onosproject.ui.impl.topo.model;
 
+import com.fasterxml.jackson.databind.node.ObjectNode;
 import org.onosproject.cluster.ControllerNode;
 import org.onosproject.cluster.NodeId;
 import org.onosproject.cluster.RoleInfo;
@@ -30,6 +31,7 @@
 import org.onosproject.net.region.Region;
 import org.onosproject.net.region.RegionId;
 import org.onosproject.ui.UiTopoLayoutService;
+import org.onosproject.ui.impl.topo.Topo2Jsonifier;
 import org.onosproject.ui.model.ServiceBundle;
 import org.onosproject.ui.model.topo.UiClusterMember;
 import org.onosproject.ui.model.topo.UiDevice;
@@ -70,6 +72,10 @@
 class ModelCache {
 
     private static final String E_NO_ELEMENT = "Tried to remove non-member {}: {}";
+    private static final String MEMO_ADDED = "added";
+    private static final String MEMO_UPDATED = "updated";
+    private static final String MEMO_REMOVED = "removed";
+    private static final String MEMO_MOVED = "moved";
 
     private static final Logger log = LoggerFactory.getLogger(ModelCache.class);
 
@@ -77,6 +83,8 @@
     private final EventDispatcher dispatcher;
     private final UiTopology uiTopology = new UiTopology();
 
+    private Topo2Jsonifier t2json;
+
     ModelCache(ServiceBundle services, EventDispatcher eventDispatcher) {
         this.services = services;
         this.dispatcher = eventDispatcher;
@@ -87,8 +95,13 @@
         return "ModelCache{" + uiTopology + "}";
     }
 
-    private void postEvent(UiModelEvent.Type type, UiElement subject) {
-        dispatcher.post(new UiModelEvent(type, subject));
+    private void postEvent(UiModelEvent.Type type, UiElement subject, String memo) {
+        ObjectNode data = t2json != null ? t2json.jsonUiElement(subject) : null;
+        dispatcher.post(new UiModelEvent(type, subject, data, memo));
+    }
+
+    void injectJsonifier(Topo2Jsonifier t2json) {
+        this.t2json = t2json;
     }
 
     void clear() {
@@ -131,13 +144,15 @@
     // invoked from UiSharedTopologyModel cluster event listener
     void addOrUpdateClusterMember(ControllerNode cnode) {
         NodeId id = cnode.id();
+        String memo = MEMO_UPDATED;
         UiClusterMember member = uiTopology.findClusterMember(id);
         if (member == null) {
             member = addNewClusterMember(cnode);
+            memo = MEMO_ADDED;
         }
         updateClusterMember(member);
 
-        postEvent(CLUSTER_MEMBER_ADDED_OR_UPDATED, member);
+        postEvent(CLUSTER_MEMBER_ADDED_OR_UPDATED, member, memo);
     }
 
     // package private for unit test access
@@ -151,7 +166,7 @@
         UiClusterMember member = uiTopology.findClusterMember(id);
         if (member != null) {
             uiTopology.remove(member);
-            postEvent(CLUSTER_MEMBER_REMOVED, member);
+            postEvent(CLUSTER_MEMBER_REMOVED, member, MEMO_REMOVED);
         } else {
             log.warn(E_NO_ELEMENT, "cluster node", id);
         }
@@ -256,13 +271,15 @@
     // invoked from UiSharedTopologyModel region listener
     void addOrUpdateRegion(Region region) {
         RegionId id = region.id();
+        String memo = MEMO_UPDATED;
         UiRegion uiRegion = uiTopology.findRegion(id);
         if (uiRegion == null) {
             uiRegion = addNewRegion(region);
+            memo = MEMO_ADDED;
         }
         updateRegion(uiRegion);
 
-        postEvent(REGION_ADDED_OR_UPDATED, uiRegion);
+        postEvent(REGION_ADDED_OR_UPDATED, uiRegion, memo);
     }
 
     // package private for unit test access
@@ -276,7 +293,7 @@
         UiRegion uiRegion = uiTopology.findRegion(id);
         if (uiRegion != null) {
             uiTopology.remove(uiRegion);
-            postEvent(REGION_REMOVED, uiRegion);
+            postEvent(REGION_REMOVED, uiRegion, MEMO_REMOVED);
         } else {
             log.warn(E_NO_ELEMENT, "region", id);
         }
@@ -313,14 +330,16 @@
     // invoked from UiSharedTopologyModel device listener
     void addOrUpdateDevice(Device device) {
         DeviceId id = device.id();
+        String memo = MEMO_UPDATED;
         UiDevice uiDevice = uiTopology.findDevice(id);
         if (uiDevice == null) {
             uiDevice = addNewDevice(device);
+            memo = MEMO_ADDED;
         } else {
             updateDevice(uiDevice);
         }
 
-        postEvent(DEVICE_ADDED_OR_UPDATED, uiDevice);
+        postEvent(DEVICE_ADDED_OR_UPDATED, uiDevice, memo);
     }
 
     // package private for unit test access
@@ -334,7 +353,7 @@
         UiDevice uiDevice = uiTopology.findDevice(id);
         if (uiDevice != null) {
             uiTopology.remove(uiDevice);
-            postEvent(DEVICE_REMOVED, uiDevice);
+            postEvent(DEVICE_REMOVED, uiDevice, MEMO_REMOVED);
         } else {
             log.warn(E_NO_ELEMENT, "device", id);
         }
@@ -378,13 +397,15 @@
     // invoked from UiSharedTopologyModel link listener
     void addOrUpdateDeviceLink(Link link) {
         UiLinkId id = uiLinkId(link);
+        String memo = MEMO_UPDATED;
         UiDeviceLink uiDeviceLink = uiTopology.findDeviceLink(id);
         if (uiDeviceLink == null) {
             uiDeviceLink = addNewDeviceLink(id);
+            memo = MEMO_ADDED;
         }
         updateDeviceLink(uiDeviceLink, link);
 
-        postEvent(LINK_ADDED_OR_UPDATED, uiDeviceLink);
+        postEvent(LINK_ADDED_OR_UPDATED, uiDeviceLink, memo);
     }
 
     // package private for unit test access
@@ -399,10 +420,10 @@
         if (uiDeviceLink != null) {
             boolean remaining = uiDeviceLink.detachBackingLink(link);
             if (remaining) {
-                postEvent(LINK_ADDED_OR_UPDATED, uiDeviceLink);
+                postEvent(LINK_ADDED_OR_UPDATED, uiDeviceLink, MEMO_UPDATED);
             } else {
                 uiTopology.remove(uiDeviceLink);
-                postEvent(LINK_REMOVED, uiDeviceLink);
+                postEvent(LINK_REMOVED, uiDeviceLink, MEMO_REMOVED);
             }
         } else {
             log.warn(E_NO_ELEMENT, "Device link", id);
@@ -474,13 +495,15 @@
     // invoked from UiSharedTopologyModel host listener
     void addOrUpdateHost(Host host) {
         HostId id = host.id();
+        String memo = MEMO_UPDATED;
         UiHost uiHost = uiTopology.findHost(id);
         if (uiHost == null) {
             uiHost = addNewHost(host);
+            memo = MEMO_ADDED;
         }
         updateHost(uiHost, host);
 
-        postEvent(HOST_ADDED_OR_UPDATED, uiHost);
+        postEvent(HOST_ADDED_OR_UPDATED, uiHost, memo);
     }
 
     // invoked from UiSharedTopologyModel host listener
@@ -488,7 +511,7 @@
         UiHost uiHost = uiTopology.findHost(prevHost.id());
         if (uiHost != null) {
             updateHost(uiHost, host);
-            postEvent(HOST_MOVED, uiHost);
+            postEvent(HOST_MOVED, uiHost, MEMO_MOVED);
         } else {
             log.warn(E_NO_ELEMENT, "host", prevHost.id());
         }
@@ -507,7 +530,7 @@
             UiEdgeLink edgeLink = uiTopology.findEdgeLink(uiHost.edgeLinkId());
             uiTopology.remove(edgeLink);
             uiTopology.remove(uiHost);
-            postEvent(HOST_REMOVED, uiHost);
+            postEvent(HOST_REMOVED, uiHost, MEMO_REMOVED);
         } else {
             log.warn(E_NO_ELEMENT, "host", id);
         }
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/topo/model/UiModelEvent.java b/web/gui/src/main/java/org/onosproject/ui/impl/topo/model/UiModelEvent.java
index 10a3523..4e2a15c 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/topo/model/UiModelEvent.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/topo/model/UiModelEvent.java
@@ -16,6 +16,7 @@
 
 package org.onosproject.ui.impl.topo.model;
 
+import com.fasterxml.jackson.databind.node.ObjectNode;
 import org.onosproject.event.AbstractEvent;
 import org.onosproject.ui.model.topo.UiElement;
 
@@ -24,10 +25,9 @@
  */
 public class UiModelEvent extends AbstractEvent<UiModelEvent.Type, UiElement> {
 
-    protected UiModelEvent(Type type, UiElement subject) {
-        super(type, subject);
-    }
-
+    /**
+     * Enumeration of event types.
+     */
     enum Type {
         CLUSTER_MEMBER_ADDED_OR_UPDATED,
         CLUSTER_MEMBER_REMOVED,
@@ -45,4 +45,42 @@
         HOST_MOVED,
         HOST_REMOVED
     }
+
+    private final ObjectNode data;
+    private final String memo;
+
+    /**
+     * Creates a UI model event. Note that the memo field can be used to
+     * pass a hint to the listener about the event.
+     *
+     * @param type    event type
+     * @param subject subject of the event
+     * @param data    data containing details of the subject
+     * @param memo    a note about the event
+     */
+    protected UiModelEvent(Type type, UiElement subject, ObjectNode data,
+                           String memo) {
+        super(type, subject);
+        this.data = data;
+        this.memo = memo;
+    }
+
+    /**
+     * Returns the data of the subject.
+     *
+     * @return the subject data
+     */
+    public ObjectNode data() {
+        return data;
+    }
+
+    /**
+     * Returns the memo.
+     *
+     * @return the memo
+     */
+    public String memo() {
+        return memo;
+    }
+
 }
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/topo/model/UiSharedTopologyModel.java b/web/gui/src/main/java/org/onosproject/ui/impl/topo/model/UiSharedTopologyModel.java
index 2a66b8e..80d134a 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/topo/model/UiSharedTopologyModel.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/topo/model/UiSharedTopologyModel.java
@@ -22,7 +22,6 @@
 import org.apache.felix.scr.annotations.Reference;
 import org.apache.felix.scr.annotations.ReferenceCardinality;
 import org.apache.felix.scr.annotations.Service;
-import org.onlab.util.Tools;
 import org.onosproject.cluster.ClusterEvent;
 import org.onosproject.cluster.ClusterEventListener;
 import org.onosproject.cluster.ClusterService;
@@ -61,6 +60,7 @@
 import org.onosproject.net.statistic.StatisticService;
 import org.onosproject.net.topology.TopologyService;
 import org.onosproject.ui.UiTopoLayoutService;
+import org.onosproject.ui.impl.topo.Topo2Jsonifier;
 import org.onosproject.ui.impl.topo.UiTopoSession;
 import org.onosproject.ui.model.ServiceBundle;
 import org.onosproject.ui.model.topo.UiClusterMember;
@@ -75,7 +75,9 @@
 import java.util.List;
 import java.util.Set;
 import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
+
+import static java.util.concurrent.Executors.newSingleThreadExecutor;
+import static org.onlab.util.Tools.groupedThreads;
 
 /**
  * Service that creates and maintains the UI-model of the network topology.
@@ -143,7 +145,7 @@
     @Activate
     protected void activate() {
         cache = new ModelCache(new DefaultServiceBundle(), eventDispatcher);
-        eventHandler = Executors.newSingleThreadExecutor(Tools.groupedThreads("onos/ui/topo", "event-handler", log));
+        eventHandler = newSingleThreadExecutor(groupedThreads("onos/ui/topo", "event-handler", log));
 
         eventDispatcher.addSink(UiModelEvent.class, listenerRegistry);
 
@@ -182,6 +184,17 @@
         log.info("Stopped");
     }
 
+    /**
+     * Injects an instance of the JSON-ifier (which has been bound to the
+     * services (link, host, device, ...)) to be passed on to the Model Cache,
+     * for use in forming UiModelEvent payloads.
+     *
+     * @param t2json JSONifier
+     */
+    public void injectJsonifier(Topo2Jsonifier t2json) {
+        cache.injectJsonifier(t2json);
+    }
+
 
     /**
      * Registers a UI topology session with the topology model.
