diff --git a/core/api/src/main/java/org/onosproject/ui/model/topo/UiClusterMember.java b/core/api/src/main/java/org/onosproject/ui/model/topo/UiClusterMember.java
index f0aae01..934559f 100644
--- a/core/api/src/main/java/org/onosproject/ui/model/topo/UiClusterMember.java
+++ b/core/api/src/main/java/org/onosproject/ui/model/topo/UiClusterMember.java
@@ -19,11 +19,6 @@
 import org.onlab.packet.IpAddress;
 import org.onosproject.cluster.ControllerNode;
 import org.onosproject.cluster.NodeId;
-import org.onosproject.net.DeviceId;
-
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
 
 import static org.onosproject.cluster.ControllerNode.State.INACTIVE;
 
@@ -36,7 +31,6 @@
     private final ControllerNode cnode;
 
     private ControllerNode.State state = INACTIVE;
-    private final Set<DeviceId> mastership = new HashSet<>();
 
     /**
      * Constructs a UI cluster member, with a reference to the parent
@@ -55,7 +49,6 @@
         return "UiClusterMember{" + cnode +
                 ", online=" + isOnline() +
                 ", ready=" + isReady() +
-                ", #devices=" + deviceCount() +
                 "}";
     }
 
@@ -83,17 +76,6 @@
     }
 
     /**
-     * Sets the collection of identities of devices for which this
-     * controller node is master.
-     *
-     * @param mastership device IDs
-     */
-    public void setMastership(Set<DeviceId> mastership) {
-        this.mastership.clear();
-        this.mastership.addAll(mastership);
-    }
-
-    /**
      * Returns the identity of the cluster member.
      *
      * @return member identifier
@@ -128,33 +110,4 @@
     public boolean isReady() {
         return state.isReady();
     }
-
-    /**
-     * Returns the number of devices for which this cluster member is master.
-     *
-     * @return number of devices for which this member is master
-     */
-    public int deviceCount() {
-        return mastership.size();
-    }
-
-    /**
-     * Returns the list of devices for which this cluster member is master.
-     *
-     * @return list of devices for which this member is master
-     */
-    public Set<DeviceId> masterOf() {
-        return Collections.unmodifiableSet(mastership);
-    }
-
-    /**
-     * Returns true if the specified device is one for which this cluster
-     * member is master.
-     *
-     * @param deviceId device ID
-     * @return true if this cluster member is master for the given device
-     */
-    public boolean masterOf(DeviceId deviceId) {
-        return mastership.contains(deviceId);
-    }
 }
diff --git a/core/api/src/main/java/org/onosproject/ui/model/topo/UiDevice.java b/core/api/src/main/java/org/onosproject/ui/model/topo/UiDevice.java
index 04eaab0..84522de 100644
--- a/core/api/src/main/java/org/onosproject/ui/model/topo/UiDevice.java
+++ b/core/api/src/main/java/org/onosproject/ui/model/topo/UiDevice.java
@@ -17,7 +17,6 @@
 package org.onosproject.ui.model.topo;
 
 import com.google.common.base.MoreObjects;
-import org.onosproject.cluster.NodeId;
 import org.onosproject.net.Device;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.region.RegionId;
@@ -31,7 +30,6 @@
     private final Device device;
 
     private RegionId regionId;
-    private NodeId masterId;
 
     /**
      * Creates a new UI device.
@@ -53,15 +51,6 @@
         this.regionId = regionId;
     }
 
-    /**
-     * Sets the ID of the controller node that holds mastership for this device.
-     *
-     * @param masterId master identifier
-     */
-    public void setMasterId(NodeId masterId) {
-        this.masterId = masterId;
-    }
-
     @Override
     public String toString() {
         return MoreObjects.toStringHelper(this)
@@ -70,10 +59,6 @@
                 .toString();
     }
 
-    //    @Override
-//    protected void destroy() {
-//    }
-
     /**
      * Returns the identity of the device.
      *
@@ -124,14 +109,4 @@
     public String type() {
         return device.type().toString().toLowerCase();
     }
-
-    /**
-     * Returns the identifier for the cluster member that has
-     * mastership over this device.
-     *
-     * @return master cluster member identifier
-     */
-    public NodeId master() {
-        return masterId;
-    }
 }
diff --git a/core/api/src/test/java/org/onosproject/ui/model/topo/UiClusterMemberTest.java b/core/api/src/test/java/org/onosproject/ui/model/topo/UiClusterMemberTest.java
index e7c75a8..f29e8dd 100644
--- a/core/api/src/test/java/org/onosproject/ui/model/topo/UiClusterMemberTest.java
+++ b/core/api/src/test/java/org/onosproject/ui/model/topo/UiClusterMemberTest.java
@@ -55,6 +55,5 @@
         assertEquals("wrong IP", NODE_IP, member.ip());
         assertEquals("unex. online", false, member.isOnline());
         assertEquals("unex. ready", false, member.isReady());
-        assertEquals("unex. device count", 0, member.deviceCount());
     }
 }
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 323ccee..15332d4 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
@@ -30,6 +30,7 @@
 import org.onosproject.net.Annotated;
 import org.onosproject.net.Annotations;
 import org.onosproject.net.Device;
+import org.onosproject.net.DeviceId;
 import org.onosproject.net.Host;
 import org.onosproject.net.device.DeviceService;
 import org.onosproject.net.flow.FlowRuleService;
@@ -162,13 +163,14 @@
     }
 
     private ObjectNode json(UiClusterMember member, boolean isUiAttached) {
+        int switchCount = mastershipService.getDevicesOf(member.id()).size();
         return objectNode()
                 .put("id", member.id().toString())
                 .put("ip", member.ip().toString())
                 .put("online", member.isOnline())
                 .put("ready", member.isReady())
                 .put("uiAttached", isUiAttached)
-                .put("switches", member.deviceCount());
+                .put("switches", switchCount);
     }
 
     /**
@@ -261,6 +263,11 @@
         return result;
     }
 
+    // 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() : "";
+    }
 
     private ObjectNode json(UiNode node) {
         if (node instanceof UiRegion) {
@@ -281,7 +288,7 @@
                 .put("nodeType", DEVICE)
                 .put("type", device.type())
                 .put("online", deviceService.isAvailable(device.id()))
-                .put("master", nullIsEmpty(device.master()))
+                .put("master", master(device.id()))
                 .put("layer", device.layer());
 
         Device d = device.backingDevice();
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 cbb82b8..f98ab7b 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
@@ -119,9 +119,6 @@
     private void updateClusterMember(UiClusterMember member) {
         ControllerNode.State state = services.cluster().getState(member.id());
         member.setState(state);
-        member.setMastership(services.mastership().getDevicesOf(member.id()));
-        // NOTE: 'UI-attached' is session-based data, not global, so will
-        //       be set elsewhere
     }
 
     private void loadClusterMembers() {
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 d7ec3b6..e8c2d3b 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
@@ -39,7 +39,6 @@
 import java.util.Iterator;
 
 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;
@@ -157,24 +156,8 @@
         // see AbstractUiImplTest Mock Environment for expected values...
         assertEquals("wrong id str", C1, member.idAsString());
         assertEquals("wrong id", nodeId(C1), member.id());
-        assertEquals("wrong dev count", 3, member.deviceCount());
         assertEquals("not online", true, member.isOnline());
         assertEquals("not ready", true, member.isReady());
-
-        assertMasterOf(member, DEVID_1, DEVID_2, DEVID_3);
-        assertNotMasterOf(member, DEVID_4, DEVID_6, DEVID_9);
-    }
-
-    private void assertMasterOf(UiClusterMember member, DeviceId... ids) {
-        for (DeviceId id : ids) {
-            assertTrue("not master of " + id, member.masterOf(id));
-        }
-    }
-
-    private void assertNotMasterOf(UiClusterMember member, DeviceId... ids) {
-        for (DeviceId id : ids) {
-            assertFalse("? master of " + id, member.masterOf(id));
-        }
     }
 
 
