diff --git a/core/api/src/main/java/org/onosproject/ui/model/topo/UiHost.java b/core/api/src/main/java/org/onosproject/ui/model/topo/UiHost.java
index e80836a..8c5107e 100644
--- a/core/api/src/main/java/org/onosproject/ui/model/topo/UiHost.java
+++ b/core/api/src/main/java/org/onosproject/ui/model/topo/UiHost.java
@@ -106,12 +106,30 @@
     }
 
     /**
-     * Identifier for the edge link between this host and the device to which
-     * it is connected.
+     * Returns the identifier for the edge link between this host and
+     * the device to which it is connected.
      *
      * @return edge link identifier
      */
     public UiLinkId edgeLinkId() {
-        return null;
+        return edgeLinkId;
+    }
+
+    /**
+     * Returns the identifier of the device to which the host is connected.
+     *
+     * @return device identifier
+     */
+    public DeviceId locationDevice() {
+        return locDevice;
+    }
+
+    /**
+     * Returns the port number of the device to which the host is connected.
+     *
+     * @return port number
+     */
+    public PortNumber locationPort() {
+        return locPort;
     }
 }
diff --git a/web/gui/src/test/java/org/onosproject/ui/impl/topo/model/AbstractTopoModelTest.java b/web/gui/src/test/java/org/onosproject/ui/impl/topo/model/AbstractTopoModelTest.java
index 9fad51c..75a405e 100644
--- a/web/gui/src/test/java/org/onosproject/ui/impl/topo/model/AbstractTopoModelTest.java
+++ b/web/gui/src/test/java/org/onosproject/ui/impl/topo/model/AbstractTopoModelTest.java
@@ -525,49 +525,60 @@
     }
 
 
+    /**
+     * Creates a default host connected at the given edge device and port. Note
+     * that an identifying hex character ("a" - "f") should be supplied. This
+     * will be included in the MAC address of the host (and equivalent value
+     * as last byte in IP address).
+     *
+     * @param device  edge device
+     * @param port    port number
+     * @param hexChar identifying hex character
+     * @return host connected at that location
+     */
+    protected static Host createHost(Device device, int port, String hexChar) {
+        DeviceId deviceId = device.id();
+        String devNum = deviceId.toString().substring(1);
+
+        MacAddress mac = MacAddress.valueOf(HOST_MAC_PREFIX + devNum + hexChar);
+        HostId hostId = hostId(String.format("%s/-1", mac));
+
+        int ipByte = Integer.valueOf(hexChar, 16);
+        if (ipByte < 10 || ipByte > 15) {
+            throw new IllegalArgumentException("hexChar must be a-f");
+        }
+        HostLocation loc = new HostLocation(deviceId, portNumber(port), 0);
+
+        IpAddress ip = ip("10." + devNum + ".0." + ipByte);
+
+        return new DefaultHost(ProviderId.NONE, hostId, mac, VlanId.NONE,
+                loc, ImmutableSet.of(ip));
+    }
+
+    /**
+     * Creates a pair of hosts connected to the specified device.
+     *
+     * @param d edge device
+     * @return pair of hosts
+     */
+    protected static List<Host> createHostPair(Device d) {
+        List<Host> hosts = new ArrayList<>();
+        hosts.add(createHost(d, 101, "a"));
+        hosts.add(createHost(d, 102, "b"));
+        return hosts;
+    }
+
     private static class MockHostService extends HostServiceAdapter {
         private final Map<HostId, Host> hosts = new HashMap<>();
 
         MockHostService() {
             for (Device d : ALL_DEVS) {
-                // two hosts per device
-                createHosts(hosts, d);
+                for (Host h : createHostPair(d)) {
+                    hosts.put(h.id(), h);
+                }
             }
         }
 
-        private void createHosts(Map<HostId, Host> hosts, Device d) {
-            DeviceId deviceId = d.id();
-            String devNum = deviceId.toString().substring(1);
-
-            String ha = devNum + "a";
-            String hb = devNum + "b";
-
-            MacAddress macA = MacAddress.valueOf(HOST_MAC_PREFIX + ha);
-            MacAddress macB = MacAddress.valueOf(HOST_MAC_PREFIX + hb);
-
-            HostId hostA = hostId(String.format("%s/-1", macA));
-            HostId hostB = hostId(String.format("%s/-1", macB));
-
-            PortNumber portA = portNumber(101);
-            PortNumber portB = portNumber(102);
-
-            HostLocation locA = new HostLocation(deviceId, portA, 0);
-            HostLocation locB = new HostLocation(deviceId, portB, 0);
-
-            IpAddress ipA = ip("10." + devNum + ".0.1");
-            IpAddress ipB = ip("10." + devNum + ".0.2");
-
-            Host host = new DefaultHost(ProviderId.NONE,
-                    hostA, macA, VlanId.NONE, locA,
-                    ImmutableSet.of(ipA));
-            hosts.put(hostA, host);
-
-            host = new DefaultHost(ProviderId.NONE,
-                    hostB, macB, VlanId.NONE, locB,
-                    ImmutableSet.of(ipB));
-            hosts.put(hostB, host);
-        }
-
         @Override
         public int getHostCount() {
             return hosts.size();
diff --git a/web/gui/src/test/java/org/onosproject/ui/impl/topo/model/ModelCacheTest.java b/web/gui/src/test/java/org/onosproject/ui/impl/topo/model/ModelCacheTest.java
index 5ab7343..4d409dc 100644
--- a/web/gui/src/test/java/org/onosproject/ui/impl/topo/model/ModelCacheTest.java
+++ b/web/gui/src/test/java/org/onosproject/ui/impl/topo/model/ModelCacheTest.java
@@ -22,12 +22,15 @@
 import org.onosproject.event.EventDispatcher;
 import org.onosproject.net.Device;
 import org.onosproject.net.DeviceId;
+import org.onosproject.net.Host;
+import org.onosproject.net.HostId;
 import org.onosproject.net.Link;
 import org.onosproject.net.region.Region;
 import org.onosproject.ui.impl.topo.model.UiModelEvent.Type;
 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.UiLinkId;
 import org.onosproject.ui.model.topo.UiRegion;
@@ -38,8 +41,10 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 import static org.onosproject.cluster.NodeId.nodeId;
+import static org.onosproject.net.PortNumber.portNumber;
 import static org.onosproject.ui.model.topo.UiLinkId.uiLinkId;
 
 /**
@@ -305,6 +310,88 @@
         assertEquals("unex # links", 0, cache.linkCount());
     }
 
+    private void assertHostLinkCounts(int nHosts, int nLinks) {
+        assertEquals("unex # hosts", nHosts, cache.hostCount());
+        assertEquals("unex # links", nLinks, cache.linkCount());
+    }
+
+    private void assertLocation(HostId hid, DeviceId expDev, int expPort) {
+        UiHost h = cache.accessHost(hid);
+        assertEquals("unex device", expDev, h.locationDevice());
+        assertEquals("unex port", portNumber(expPort), h.locationPort());
+    }
+
+    @Test
+    public void addHosts() {
+        title("addHosts");
+
+        assertHostLinkCounts(0, 0);
+        Host hostA = createHost(DEV_1, 101, "a");
+        Host hostB = createHost(DEV_1, 102, "b");
+
+        // add a host
+        cache.addOrUpdateHost(hostA);
+        dispatcher.assertLast(Type.HOST_ADDED_OR_UPDATED, hostA.id().toString());
+        dispatcher.assertEventCount(1);
+        assertHostLinkCounts(1, 1);
+        assertLocation(hostA.id(), DEVID_1, 101);
+
+        // add a second host
+        cache.addOrUpdateHost(hostB);
+        dispatcher.assertLast(Type.HOST_ADDED_OR_UPDATED, hostB.id().toString());
+        dispatcher.assertEventCount(2);
+        assertHostLinkCounts(2, 2);
+        assertLocation(hostB.id(), DEVID_1, 102);
+
+        // update the first host
+        cache.addOrUpdateHost(hostA);
+        dispatcher.assertLast(Type.HOST_ADDED_OR_UPDATED, hostA.id().toString());
+        dispatcher.assertEventCount(3);
+        assertHostLinkCounts(2, 2);
+        assertLocation(hostA.id(), DEVID_1, 101);
+
+        print(cache.dumpString());
+
+        // remove the second host
+        cache.removeHost(hostB);
+        dispatcher.assertLast(Type.HOST_REMOVED, hostB.id().toString());
+        dispatcher.assertEventCount(4);
+        assertHostLinkCounts(1, 1);
+        assertNull("still host B?", cache.accessHost(hostB.id()));
+
+        print(cache.dumpString());
+
+        // first, verify where host A is currently residing
+        assertLocation(hostA.id(), DEVID_1, 101);
+
+        // now let's move hostA to a different port
+        Host movedHost = createHost(DEV_1, 200, "a");
+        print(hostA);
+        print(movedHost);
+
+        cache.moveHost(movedHost, hostA);
+        dispatcher.assertLast(Type.HOST_MOVED, hostA.id().toString());
+        dispatcher.assertEventCount(5);
+        assertHostLinkCounts(1, 1);
+
+        assertLocation(hostA.id(), DEVID_1, 200);
+
+        print(cache.dumpString());
+
+        // finally, let's move the host to a different device and port
+        Host movedAgain = createHost(DEV_8, 800, "a");
+
+        cache.moveHost(movedAgain, movedHost);
+        dispatcher.assertLast(Type.HOST_MOVED, hostA.id().toString());
+        dispatcher.assertEventCount(6);
+        assertHostLinkCounts(1, 1);
+
+        assertLocation(hostA.id(), DEVID_8, 800);
+
+        print(cache.dumpString());
+    }
+
+
     @Test
     public void load() {
         title("load");
