diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/AltTopoViewMessageHandler.java b/web/gui/src/main/java/org/onosproject/ui/impl/AltTopoViewMessageHandler.java
new file mode 100644
index 0000000..068bfe9
--- /dev/null
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/AltTopoViewMessageHandler.java
@@ -0,0 +1,133 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.onosproject.ui.impl;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.google.common.collect.ImmutableSet;
+import org.onlab.osgi.ServiceDirectory;
+import org.onosproject.core.CoreService;
+import org.onosproject.ui.RequestHandler;
+import org.onosproject.ui.UiConnection;
+import org.onosproject.ui.UiMessageHandler;
+import org.onosproject.ui.impl.topo.TopoUiEvent;
+import org.onosproject.ui.impl.topo.TopoUiListener;
+import org.onosproject.ui.impl.topo.TopoUiModelService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Collection;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Facility for handling inbound messages from the topology view, and
+ * generating outbound messages for the same.
+ */
+public class AltTopoViewMessageHandler extends UiMessageHandler {
+
+    private static final String TOPO_START = "topoStart";
+    private static final String TOPO_STOP = "topoStop";
+
+    private final Logger log = LoggerFactory.getLogger(getClass());
+
+    protected ServiceDirectory directory;
+    protected TopoUiModelService modelService;
+
+    private TopoUiListener modelListener;
+    private String version;
+
+    private boolean topoActive = false;
+
+    @Override
+    public void init(UiConnection connection, ServiceDirectory directory) {
+        super.init(connection, directory);
+        this.directory = checkNotNull(directory, "Directory cannot be null");
+        modelService = directory.get(TopoUiModelService.class);
+
+        modelListener = new ModelListener();
+        version = getVersion();
+    }
+
+
+    private String getVersion() {
+        String ver = directory.get(CoreService.class).version().toString();
+        return ver.replace(".SNAPSHOT", "*").replaceFirst("~.*$", "");
+    }
+
+
+    @Override
+    protected Collection<RequestHandler> getHandlers() {
+        return ImmutableSet.of(
+                new TopoStart(),
+                new TopoStop()
+        );
+    }
+
+    // =====================================================================
+    // Request Handlers for (topo view) events from the UI...
+
+    private final class TopoStart extends RequestHandler {
+        private TopoStart() {
+            super(TOPO_START);
+        }
+
+        @Override
+        public void process(long sid, ObjectNode payload) {
+            topoActive = true;
+            modelService.addListener(modelListener);
+            sendMessages(modelService.getInitialState());
+            log.debug(TOPO_START);
+        }
+    }
+
+    private final class TopoStop extends RequestHandler {
+        private TopoStop() {
+            super(TOPO_STOP);
+        }
+
+        @Override
+        public void process(long sid, ObjectNode payload) {
+            topoActive = false;
+            modelService.removeListener(modelListener);
+            log.debug(TOPO_STOP);
+        }
+    }
+
+    // =====================================================================
+    // Private Helper Methods...
+
+    private void sendMessages(Collection<ObjectNode> messages) {
+        if (topoActive) {
+            UiConnection connection = connection();
+            if (connection != null) {
+                messages.forEach(connection::sendMessage);
+            }
+        }
+    }
+
+    // =====================================================================
+    // Our listener for model events so we can push changes out to the UI...
+
+    private class ModelListener implements TopoUiListener {
+        @Override
+        public void event(TopoUiEvent event) {
+            log.debug("Handle Event: {}", event);
+            // TODO: handle event
+        }
+    }
+}
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/TopologyViewMessageHandlerBase.java b/web/gui/src/main/java/org/onosproject/ui/impl/TopologyViewMessageHandlerBase.java
index 6f72dcb..9f24f39 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/TopologyViewMessageHandlerBase.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/TopologyViewMessageHandlerBase.java
@@ -101,6 +101,7 @@
 /**
  * Facility for creating messages bound for the topology viewer.
  */
+@Deprecated
 public abstract class TopologyViewMessageHandlerBase extends UiMessageHandler {
 
     protected static final Logger log =
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/UiExtensionManager.java b/web/gui/src/main/java/org/onosproject/ui/impl/UiExtensionManager.java
index a09ae58..b4a5999 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/UiExtensionManager.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/UiExtensionManager.java
@@ -78,6 +78,7 @@
         UiMessageHandlerFactory messageHandlerFactory =
                 () -> ImmutableList.of(
                         new TopologyViewMessageHandler(),
+//                        new AltTopoViewMessageHandler(),
                         new DeviceViewMessageHandler(),
                         new LinkViewMessageHandler(),
                         new HostViewMessageHandler(),
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/topo/MetaDb.java b/web/gui/src/main/java/org/onosproject/ui/impl/topo/MetaDb.java
new file mode 100644
index 0000000..f890137
--- /dev/null
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/topo/MetaDb.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.onosproject.ui.impl.topo;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * A database of meta information stored for topology objects.
+ */
+// package private
+class MetaDb {
+
+    private static Map<String, ObjectNode> metaCache = new ConcurrentHashMap<>();
+
+    /**
+     * Adds meta UI information about the specified object to the given payload.
+     *
+     * @param id object identifier
+     * @param payload payload to which the info should be added
+     */
+    public void addMetaUi(String id, ObjectNode payload) {
+        ObjectNode meta = metaCache.get(id);
+        if (meta != null) {
+            payload.set("metaUi", meta);
+        }
+    }
+}
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/topo/TopoMessageFactory.java b/web/gui/src/main/java/org/onosproject/ui/impl/topo/TopoMessageFactory.java
new file mode 100644
index 0000000..59af263
--- /dev/null
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/topo/TopoMessageFactory.java
@@ -0,0 +1,337 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.onosproject.ui.impl.topo;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.onlab.packet.IpAddress;
+import org.onosproject.cluster.ClusterEvent;
+import org.onosproject.cluster.ClusterService;
+import org.onosproject.cluster.ControllerNode;
+import org.onosproject.cluster.NodeId;
+import org.onosproject.mastership.MastershipService;
+import org.onosproject.net.Annotated;
+import org.onosproject.net.AnnotationKeys;
+import org.onosproject.net.Annotations;
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.DefaultEdgeLink;
+import org.onosproject.net.Device;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.EdgeLink;
+import org.onosproject.net.Host;
+import org.onosproject.net.HostId;
+import org.onosproject.net.HostLocation;
+import org.onosproject.net.Link;
+import org.onosproject.net.PortNumber;
+import org.onosproject.net.device.DeviceEvent;
+import org.onosproject.net.device.DeviceService;
+import org.onosproject.net.host.HostEvent;
+import org.onosproject.net.host.HostService;
+import org.onosproject.net.link.LinkEvent;
+import org.onosproject.net.link.LinkService;
+import org.onosproject.net.provider.ProviderId;
+import org.onosproject.ui.JsonUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+import static com.google.common.base.Strings.isNullOrEmpty;
+import static org.onosproject.cluster.ControllerNode.State.ACTIVE;
+import static org.onosproject.net.PortNumber.portNumber;
+
+/**
+ * Facility for generating messages in {@link ObjectNode} form from
+ * ONOS model events.
+ */
+// package private
+class TopoMessageFactory {
+
+    private static final ProviderId PROVIDER_ID =
+            new ProviderId("core", "org.onosproject.core", true);
+    private static final String COMPACT = "%s/%s-%s/%s";
+    private static final PortNumber PORT_ZERO = portNumber(0);
+
+    private static final Map<Enum<?>, String> LOOKUP = new HashMap<>();
+
+    static {
+        LOOKUP.put(ClusterEvent.Type.INSTANCE_ADDED, "addInstance");
+        LOOKUP.put(ClusterEvent.Type.INSTANCE_REMOVED, "removeInstance");
+        LOOKUP.put(DeviceEvent.Type.DEVICE_ADDED, "addDevice");
+        LOOKUP.put(DeviceEvent.Type.DEVICE_UPDATED, "updateDevice");
+        LOOKUP.put(DeviceEvent.Type.DEVICE_REMOVED, "removeDevice");
+        LOOKUP.put(LinkEvent.Type.LINK_ADDED, "addLink");
+        LOOKUP.put(LinkEvent.Type.LINK_UPDATED, "updateLink");
+        LOOKUP.put(LinkEvent.Type.LINK_REMOVED, "removeLink");
+        LOOKUP.put(HostEvent.Type.HOST_ADDED, "addHost");
+        LOOKUP.put(HostEvent.Type.HOST_UPDATED, "updateHost");
+        LOOKUP.put(HostEvent.Type.HOST_REMOVED, "removeHost");
+    }
+
+    private static final ObjectMapper MAPPER = new ObjectMapper();
+
+    private final Logger log = LoggerFactory.getLogger(getClass());
+
+    private MetaDb metaDb;
+
+    private ClusterService clusterService;
+    private DeviceService deviceService;
+    private LinkService linkService;
+    private HostService hostService;
+    private MastershipService mastershipService;
+
+
+    // ===================================================================
+    // Private helper methods
+
+    private ObjectNode objectNode() {
+        return MAPPER.createObjectNode();
+    }
+
+    private ArrayNode arrayNode() {
+        return MAPPER.createArrayNode();
+    }
+
+    private String toLc(Object o) {
+        return o.toString().toLowerCase();
+    }
+
+    // Event type to message type lookup (with fallback).
+    private String messageTypeLookup(Enum<?> type, String fallback) {
+        String msgType = LOOKUP.get(type);
+        return msgType == null ? fallback : msgType;
+    }
+
+    // Returns the name of the master node for the specified device ID.
+    private String master(DeviceId deviceId) {
+        NodeId master = mastershipService.getMasterFor(deviceId);
+        return master != null ? master.toString() : "";
+    }
+
+    // Produces JSON structure from annotations.
+    private ObjectNode props(Annotations annotations) {
+        ObjectNode props = objectNode();
+        if (annotations != null) {
+            for (String key : annotations.keys()) {
+                props.put(key, annotations.value(key));
+            }
+        }
+        return props;
+    }
+
+    // Adds a geo location JSON to the specified payload object.
+    private void addGeoLocation(Annotated annotated, ObjectNode payload) {
+        Annotations annot = annotated.annotations();
+        if (annot == null) {
+            return;
+        }
+
+        String slat = annot.value(AnnotationKeys.LATITUDE);
+        String slng = annot.value(AnnotationKeys.LONGITUDE);
+        try {
+            if (!isNullOrEmpty(slat) && !isNullOrEmpty(slng)) {
+                double lat = Double.parseDouble(slat);
+                double lng = Double.parseDouble(slng);
+                ObjectNode loc = objectNode()
+                        .put("type", "latlng")
+                        .put("lat", lat)
+                        .put("lng", lng);
+                payload.set("location", loc);
+            }
+        } catch (NumberFormatException e) {
+            log.warn("Invalid geo data latitude={}; longitude={}", slat, slng);
+        }
+    }
+
+    // Produces compact string representation of a link.
+    private String compactLinkString(Link link) {
+        return String.format(COMPACT, link.src().elementId(), link.src().port(),
+                             link.dst().elementId(), link.dst().port());
+    }
+
+    // Generates an edge link from the specified host location.
+    private EdgeLink edgeLink(Host host, boolean isIngress) {
+        ConnectPoint cp = new ConnectPoint(host.id(), PORT_ZERO);
+        return new DefaultEdgeLink(PROVIDER_ID, cp, host.location(), isIngress);
+    }
+
+    // Encodes the specified host location into a JSON object.
+    private ObjectNode hostConnect(HostLocation loc) {
+        return objectNode()
+                .put("device", loc.deviceId().toString())
+                .put("port", loc.port().toLong());
+    }
+
+    // Returns the first IP address from the specified set.
+    private String firstIp(Set<IpAddress> addresses) {
+        Iterator<IpAddress> it = addresses.iterator();
+        return it.hasNext() ? it.next().toString() : "unknown";
+    }
+
+    // Returns a JSON array of the specified strings.
+    private ArrayNode labels(String... labels) {
+        ArrayNode array = arrayNode();
+        for (String label : labels) {
+            array.add(label);
+        }
+        return array;
+    }
+
+    // ===================================================================
+    // API for generating messages
+
+    /**
+     * Injects service references so that the message compilation methods
+     * can do required lookups when needed.
+     *
+     * @param meta meta DB
+     * @param cs cluster service
+     * @param ds device service
+     * @param ls link service
+     * @param hs host service
+     * @param ms mastership service
+     */
+    public void injectServices(MetaDb meta, ClusterService cs, DeviceService ds,
+                               LinkService ls, HostService hs,
+                               MastershipService ms) {
+        metaDb = meta;
+        clusterService = cs;
+        deviceService = ds;
+        linkService = ls;
+        hostService = hs;
+        mastershipService = ms;
+    }
+
+    /**
+     * Transforms a cluster event into an object-node-based message.
+     *
+     * @param ev cluster event
+     * @return marshaled event message
+     */
+    public ObjectNode instanceMessage(ClusterEvent ev) {
+        ControllerNode node = ev.subject();
+        NodeId nid = node.id();
+        String id = nid.toString();
+        String ip = node.ip().toString();
+        int switchCount = mastershipService.getDevicesOf(nid).size();
+
+        ObjectNode payload = objectNode()
+                .put("id", id)
+                .put("ip", ip)
+                .put("online", clusterService.getState(nid) == ACTIVE)
+                .put("uiAttached", node.equals(clusterService.getLocalNode()))
+                .put("switches", switchCount);
+
+        ArrayNode labels = arrayNode().add(id).add(ip);
+
+        payload.set("labels", labels);
+        metaDb.addMetaUi(id, payload);
+
+        String msgType = messageTypeLookup(ev.type(), "addInstance");
+        return JsonUtils.envelope(msgType, payload);
+    }
+
+    /**
+     * Transforms a device event into an object-node-based message.
+     *
+     * @param ev device event
+     * @return marshaled event message
+     */
+    public ObjectNode deviceMessage(DeviceEvent ev) {
+        Device device = ev.subject();
+        DeviceId did = device.id();
+        String id = did.toString();
+
+        ObjectNode payload = objectNode()
+                .put("id", id)
+                .put("type", toLc(device.type()))
+                .put("online", deviceService.isAvailable(did))
+                .put("master", master(did));
+
+        Annotations annot = device.annotations();
+        String name = annot.value(AnnotationKeys.NAME);
+        String friendly = isNullOrEmpty(name) ? id : name;
+        payload.set("labels", labels("", friendly, id));
+        payload.set("props", props(annot));
+
+        addGeoLocation(device, payload);
+        metaDb.addMetaUi(id, payload);
+
+        String msgType = messageTypeLookup(ev.type(), "updateDevice");
+        return JsonUtils.envelope(msgType, payload);
+    }
+
+    /**
+     * Transforms a link event into an object-node-based message.
+     *
+     * @param ev link event
+     * @return marshaled event message
+     */
+    public ObjectNode linkMessage(LinkEvent ev) {
+        Link link = ev.subject();
+        ObjectNode payload = objectNode()
+                .put("id", compactLinkString(link))
+                .put("type", toLc(link.type()))
+                .put("online", link.state() == Link.State.ACTIVE)
+                .put("linkWidth", 1.2)
+                .put("src", link.src().deviceId().toString())
+                .put("srcPort", link.src().port().toString())
+                .put("dst", link.dst().deviceId().toString())
+                .put("dstPort", link.dst().port().toString());
+
+        String msgType = messageTypeLookup(ev.type(), "updateLink");
+        return JsonUtils.envelope(msgType, payload);
+    }
+
+    /**
+     * Transforms a host event into an object-node-based message.
+     *
+     * @param ev host event
+     * @return marshaled event message
+     */
+    public ObjectNode hostMessage(HostEvent ev) {
+        Host host = ev.subject();
+        HostId hid = host.id();
+        String id = hid.toString();
+        Annotations annot = host.annotations();
+
+        String hostType = annot.value(AnnotationKeys.TYPE);
+
+        ObjectNode payload = objectNode()
+                .put("id", id)
+                .put("type", isNullOrEmpty(hostType) ? "endstation" : hostType)
+                .put("ingress", compactLinkString(edgeLink(host, true)))
+                .put("egress", compactLinkString(edgeLink(host, false)));
+
+        // TODO: make cp an array of connect point objects (multi-homed)
+        payload.set("cp", hostConnect(host.location()));
+        String ipStr = firstIp(host.ipAddresses());
+        String macStr = host.mac().toString();
+        payload.set("labels", labels(ipStr, macStr));
+        payload.set("props", props(annot));
+        addGeoLocation(host, payload);
+        metaDb.addMetaUi(id, payload);
+
+        String mstType = messageTypeLookup(ev.type(), "updateHost");
+        return JsonUtils.envelope(mstType, payload);
+    }
+}
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/topo/TopoUiEvent.java b/web/gui/src/main/java/org/onosproject/ui/impl/topo/TopoUiEvent.java
new file mode 100644
index 0000000..32ff62b
--- /dev/null
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/topo/TopoUiEvent.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.onosproject.ui.impl.topo;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.onosproject.event.AbstractEvent;
+
+/**
+ * Describes Topology UI Model events.
+ */
+public class TopoUiEvent extends AbstractEvent<TopoUiEvent.Type, ObjectNode> {
+
+    /**
+     * Type of Topology UI Model events.
+     */
+    public enum Type {
+        INSTANCE_ADDED,
+        INSTANCE_REMOVED,
+        DEVICE_ADDED,
+        DEVICE_UPDATED,
+        DEVICE_REMOVED,
+        LINK_ADDED,
+        LINK_UPDATED,
+        LINK_REMOVED,
+        HOST_ADDED,
+        HOST_UPDATED,
+        HOST_REMOVED
+    }
+
+
+    protected TopoUiEvent(Type type, ObjectNode subject) {
+        super(type, subject);
+    }
+
+    protected TopoUiEvent(Type type, ObjectNode subject, long time) {
+        super(type, subject, time);
+    }
+
+}
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/topo/TopoUiListener.java b/web/gui/src/main/java/org/onosproject/ui/impl/topo/TopoUiListener.java
new file mode 100644
index 0000000..df49954
--- /dev/null
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/topo/TopoUiListener.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.onosproject.ui.impl.topo;
+
+import org.onosproject.event.EventListener;
+
+/**
+ * Defines a listener of Topology UI Model events.
+ */
+public interface TopoUiListener extends EventListener<TopoUiEvent> {
+
+}
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/topo/TopoUiModelManager.java b/web/gui/src/main/java/org/onosproject/ui/impl/topo/TopoUiModelManager.java
new file mode 100644
index 0000000..95e8430
--- /dev/null
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/topo/TopoUiModelManager.java
@@ -0,0 +1,206 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.onosproject.ui.impl.topo;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.apache.felix.scr.annotations.Service;
+import org.onosproject.cluster.ClusterEvent;
+import org.onosproject.cluster.ClusterService;
+import org.onosproject.cluster.ControllerNode;
+import org.onosproject.event.AbstractListenerRegistry;
+import org.onosproject.event.EventDeliveryService;
+import org.onosproject.mastership.MastershipService;
+import org.onosproject.net.Device;
+import org.onosproject.net.Host;
+import org.onosproject.net.Link;
+import org.onosproject.net.device.DeviceEvent;
+import org.onosproject.net.device.DeviceService;
+import org.onosproject.net.host.HostEvent;
+import org.onosproject.net.host.HostService;
+import org.onosproject.net.link.LinkEvent;
+import org.onosproject.net.link.LinkService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+import static org.onosproject.cluster.ClusterEvent.Type.INSTANCE_ADDED;
+import static org.onosproject.net.device.DeviceEvent.Type.DEVICE_ADDED;
+import static org.onosproject.net.host.HostEvent.Type.HOST_ADDED;
+import static org.onosproject.net.link.LinkEvent.Type.LINK_ADDED;
+
+
+/**
+ * Maintains a UI-centric model of the topology, as inferred from interactions
+ * with the different (device, host, link, ...) services. Will serve up this
+ * model to anyone who cares to {@link TopoUiListener listen}.
+ */
+@Component(immediate = true)
+@Service
+public class TopoUiModelManager implements TopoUiModelService {
+
+    private final Logger log = LoggerFactory.getLogger(getClass());
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected ClusterService clusterService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected DeviceService deviceService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected LinkService linkService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected HostService hostService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected MastershipService mastershipService;
+
+
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected EventDeliveryService eventDispatcher;
+
+
+    private AbstractListenerRegistry<TopoUiEvent, TopoUiListener>
+            listenerRegistry = new AbstractListenerRegistry<>();
+
+
+    private final TopoMessageFactory messageFactory = new TopoMessageFactory();
+    private final MetaDb metaDb = new MetaDb();
+
+
+    @Activate
+    public void activate() {
+        eventDispatcher.addSink(TopoUiEvent.class, listenerRegistry);
+        messageFactory.injectServices(
+                metaDb,
+                clusterService,
+                deviceService,
+                linkService,
+                hostService,
+                mastershipService
+        );
+        log.info("Started");
+    }
+
+    @Deactivate
+    public void deactivate() {
+        eventDispatcher.removeSink(TopoUiEvent.class);
+        log.info("Stopped");
+    }
+
+    @Override
+    public void addListener(TopoUiListener listener) {
+        listenerRegistry.addListener(listener);
+    }
+
+    @Override
+    public void removeListener(TopoUiListener listener) {
+        listenerRegistry.removeListener(listener);
+    }
+
+    @Override
+    public List<ObjectNode> getInitialState() {
+        List<ObjectNode> results = new ArrayList<>();
+        addInstances(results);
+        addDevices(results);
+        addLinks(results);
+        addHosts(results);
+        return results;
+    }
+
+    // =====================================================================
+
+    private static final Comparator<? super ControllerNode> NODE_COMPARATOR =
+            (o1, o2) -> o1.id().toString().compareTo(o2.id().toString());
+
+    // =====================================================================
+
+    private void addInstances(List<ObjectNode> results) {
+        List<ControllerNode> nodes = new ArrayList<>(clusterService.getNodes());
+        Collections.sort(nodes, NODE_COMPARATOR);
+        for (ControllerNode node : nodes) {
+            ClusterEvent ev = new ClusterEvent(INSTANCE_ADDED, node);
+            results.add(messageFactory.instanceMessage(ev));
+        }
+    }
+
+    private void addDevices(List<ObjectNode> results) {
+        // Send optical first, others later -- for layered rendering
+        List<DeviceEvent> deferred = new ArrayList<>();
+
+        for (Device device : deviceService.getDevices()) {
+            DeviceEvent ev = new DeviceEvent(DEVICE_ADDED, device);
+            if (device.type() == Device.Type.ROADM) {
+                results.add(messageFactory.deviceMessage(ev));
+            } else {
+                deferred.add(ev);
+            }
+        }
+
+        for (DeviceEvent ev : deferred) {
+            results.add(messageFactory.deviceMessage(ev));
+        }
+    }
+
+    private void addLinks(List<ObjectNode> results) {
+        // Send optical first, others later -- for layered rendering
+        List<LinkEvent> deferred = new ArrayList<>();
+
+        for (Link link : linkService.getLinks()) {
+            LinkEvent ev = new LinkEvent(LINK_ADDED, link);
+            if (link.type() == Link.Type.OPTICAL) {
+                results.add(messageFactory.linkMessage(ev));
+            } else {
+                deferred.add(ev);
+            }
+        }
+
+        for (LinkEvent ev : deferred) {
+            results.add(messageFactory.linkMessage(ev));
+        }
+    }
+
+    private void addHosts(List<ObjectNode> results) {
+        for (Host host : hostService.getHosts()) {
+            HostEvent ev = new HostEvent(HOST_ADDED, host);
+            results.add(messageFactory.hostMessage(ev));
+        }
+    }
+
+    // =====================================================================
+
+    private void post(TopoUiEvent event) {
+        if (event != null) {
+            eventDispatcher.post(event);
+        }
+    }
+
+    // NOTE: session-independent state only
+    // private inner classes to listen to device/host/link events
+    // TODO..
+}
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/topo/TopoUiModelService.java b/web/gui/src/main/java/org/onosproject/ui/impl/topo/TopoUiModelService.java
new file mode 100644
index 0000000..7bbbbe8
--- /dev/null
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/topo/TopoUiModelService.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.onosproject.ui.impl.topo;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
+import java.util.List;
+
+/**t
+ * Defines the API for the Topology UI Model.
+ */
+public interface TopoUiModelService {
+
+    /**
+     * Registers the specified listener for Topology UI Model events.
+     *
+     * @param listener the listener
+     */
+    void addListener(TopoUiListener listener);
+
+    /**
+     * Unregister the specified listener.
+     *
+     * @param listener the listener
+     */
+    void removeListener(TopoUiListener listener);
+
+
+    /**
+     * Returns events describing the current state of the model.
+     * <p>
+     * These will be in the form of "addInstance", "addDevice", "addLink",
+     * and "addHost" events, as appropriate.
+     *
+     * @return initial state events
+     */
+    List<ObjectNode> getInitialState();
+
+}
