Cleaned-up CLI commands.
diff --git a/cli/src/main/java/org/onlab/onos/cli/MastersListCommand.java b/cli/src/main/java/org/onlab/onos/cli/MastersListCommand.java
new file mode 100644
index 0000000..ee948d6
--- /dev/null
+++ b/cli/src/main/java/org/onlab/onos/cli/MastersListCommand.java
@@ -0,0 +1,40 @@
+package org.onlab.onos.cli;
+
+import com.google.common.collect.Lists;
+import org.apache.karaf.shell.commands.Command;
+import org.onlab.onos.cli.net.Comparators;
+import org.onlab.onos.cluster.ClusterService;
+import org.onlab.onos.cluster.ControllerNode;
+import org.onlab.onos.cluster.MastershipService;
+import org.onlab.onos.net.DeviceId;
+
+import java.util.Collections;
+import java.util.List;
+
+import static com.google.common.collect.Lists.newArrayList;
+
+/**
+ * Lists device mastership information.
+ */
+@Command(scope = "onos", name = "masters",
+         description = "Lists device mastership information")
+public class MastersListCommand extends AbstractShellCommand {
+
+    @Override
+    protected void execute() {
+        ClusterService service = get(ClusterService.class);
+        MastershipService mastershipService = get(MastershipService.class);
+        List<ControllerNode> nodes = newArrayList(service.getNodes());
+        Collections.sort(nodes, Comparators.NODE_COMPARATOR);
+        ControllerNode self = service.getLocalNode();
+        for (ControllerNode node : nodes) {
+            List<DeviceId> ids = Lists.newArrayList(mastershipService.getDevicesOf(node.id()));
+            Collections.sort(ids, Comparators.ELEMENT_ID_COMPARATOR);
+            print("%s: %d devices", node.id(), ids.size());
+            for (DeviceId deviceId : ids) {
+                print("  %s", deviceId);
+            }
+        }
+    }
+
+}
diff --git a/cli/src/main/java/org/onlab/onos/cli/NodeIdCompleter.java b/cli/src/main/java/org/onlab/onos/cli/NodeIdCompleter.java
new file mode 100644
index 0000000..c47189e
--- /dev/null
+++ b/cli/src/main/java/org/onlab/onos/cli/NodeIdCompleter.java
@@ -0,0 +1,33 @@
+package org.onlab.onos.cli;
+
+import org.apache.karaf.shell.console.Completer;
+import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.onlab.onos.cluster.ClusterService;
+import org.onlab.onos.cluster.ControllerNode;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.SortedSet;
+
+/**
+ * Node ID completer.
+ */
+public class NodeIdCompleter implements Completer {
+    @Override
+    public int complete(String buffer, int cursor, List<String> candidates) {
+        // Delegate string completer
+        StringsCompleter delegate = new StringsCompleter();
+
+        // Fetch our service and feed it's offerings to the string completer
+        ClusterService service = AbstractShellCommand.get(ClusterService.class);
+        Iterator<ControllerNode> it = service.getNodes().iterator();
+        SortedSet<String> strings = delegate.getStrings();
+        while (it.hasNext()) {
+            strings.add(it.next().id().toString());
+        }
+
+        // Now let the completer do the work for figuring out what to offer.
+        return delegate.complete(buffer, cursor, candidates);
+    }
+
+}
diff --git a/cli/src/main/java/org/onlab/onos/cli/NodesListCommand.java b/cli/src/main/java/org/onlab/onos/cli/NodesListCommand.java
index 1e921b4..020179e 100644
--- a/cli/src/main/java/org/onlab/onos/cli/NodesListCommand.java
+++ b/cli/src/main/java/org/onlab/onos/cli/NodesListCommand.java
@@ -1,11 +1,11 @@
 package org.onlab.onos.cli;
 
 import org.apache.karaf.shell.commands.Command;
+import org.onlab.onos.cli.net.Comparators;
 import org.onlab.onos.cluster.ClusterService;
 import org.onlab.onos.cluster.ControllerNode;
 
 import java.util.Collections;
-import java.util.Comparator;
 import java.util.List;
 
 import static com.google.common.collect.Lists.newArrayList;
@@ -20,19 +20,11 @@
     private static final String FMT =
             "id=%s, ip=%s, state=%s %s";
 
-    protected static final Comparator<ControllerNode> ID_COMPARATOR =
-            new Comparator<ControllerNode>() {
-        @Override
-        public int compare(ControllerNode ci1, ControllerNode ci2) {
-            return ci1.id().toString().compareTo(ci2.id().toString());
-        }
-    };
-
     @Override
     protected void execute() {
         ClusterService service = get(ClusterService.class);
         List<ControllerNode> nodes = newArrayList(service.getNodes());
-        Collections.sort(nodes, ID_COMPARATOR);
+        Collections.sort(nodes, Comparators.NODE_COMPARATOR);
         ControllerNode self = service.getLocalNode();
         for (ControllerNode node : nodes) {
             print(FMT, node.id(), node.ip(),
diff --git a/cli/src/main/java/org/onlab/onos/cli/net/ClusterDevicesCommand.java b/cli/src/main/java/org/onlab/onos/cli/net/ClusterDevicesCommand.java
index f0217de..9c68244 100644
--- a/cli/src/main/java/org/onlab/onos/cli/net/ClusterDevicesCommand.java
+++ b/cli/src/main/java/org/onlab/onos/cli/net/ClusterDevicesCommand.java
@@ -7,7 +7,6 @@
 import org.onlab.onos.net.topology.TopologyCluster;
 
 import java.util.Collections;
-import java.util.Comparator;
 import java.util.List;
 
 import static org.onlab.onos.net.topology.ClusterId.clusterId;
@@ -23,13 +22,6 @@
               required = false, multiValued = false)
     String id = null;
 
-    protected static final Comparator<DeviceId> ID_COMPARATOR = new Comparator<DeviceId>() {
-        @Override
-        public int compare(DeviceId id1, DeviceId id2) {
-            return id1.uri().toString().compareTo(id2.uri().toString());
-        }
-    };
-
     @Override
     protected void execute() {
         int cid = Integer.parseInt(id);
@@ -39,7 +31,7 @@
             error("No such cluster %s", cid);
         } else {
             List<DeviceId> ids = Lists.newArrayList(service.getClusterDevices(topology, cluster));
-            Collections.sort(ids, ID_COMPARATOR);
+            Collections.sort(ids, Comparators.ELEMENT_ID_COMPARATOR);
             for (DeviceId deviceId : ids) {
                 print("%s", deviceId);
             }
diff --git a/cli/src/main/java/org/onlab/onos/cli/net/ClustersListCommand.java b/cli/src/main/java/org/onlab/onos/cli/net/ClustersListCommand.java
index fe67348..d2d452f 100644
--- a/cli/src/main/java/org/onlab/onos/cli/net/ClustersListCommand.java
+++ b/cli/src/main/java/org/onlab/onos/cli/net/ClustersListCommand.java
@@ -5,7 +5,6 @@
 import org.onlab.onos.net.topology.TopologyCluster;
 
 import java.util.Collections;
-import java.util.Comparator;
 import java.util.List;
 
 /**
@@ -18,19 +17,11 @@
     private static final String FMT =
             "id=%d, devices=%d, links=%d";
 
-    protected static final Comparator<TopologyCluster> ID_COMPARATOR =
-            new Comparator<TopologyCluster>() {
-                @Override
-                public int compare(TopologyCluster c1, TopologyCluster c2) {
-                    return c1.id().index() - c2.id().index();
-                }
-            };
-
     @Override
     protected void execute() {
         init();
         List<TopologyCluster> clusters = Lists.newArrayList(service.getClusters(topology));
-        Collections.sort(clusters, ID_COMPARATOR);
+        Collections.sort(clusters, Comparators.CLUSTER_COMPARATOR);
 
         for (TopologyCluster cluster : clusters) {
             print(FMT, cluster.id().index(), cluster.deviceCount(), cluster.linkCount());
diff --git a/cli/src/main/java/org/onlab/onos/cli/net/Comparators.java b/cli/src/main/java/org/onlab/onos/cli/net/Comparators.java
new file mode 100644
index 0000000..3bb1e4d
--- /dev/null
+++ b/cli/src/main/java/org/onlab/onos/cli/net/Comparators.java
@@ -0,0 +1,64 @@
+package org.onlab.onos.cli.net;
+
+import org.onlab.onos.cluster.ControllerNode;
+import org.onlab.onos.net.Element;
+import org.onlab.onos.net.ElementId;
+import org.onlab.onos.net.Port;
+import org.onlab.onos.net.flow.FlowRule;
+import org.onlab.onos.net.topology.TopologyCluster;
+
+import java.util.Comparator;
+
+/**
+ * Various comparators.
+ */
+public final class Comparators {
+
+    // Ban construction
+    private Comparators() {
+    }
+
+    public static final Comparator<ElementId> ELEMENT_ID_COMPARATOR = new Comparator<ElementId>() {
+        @Override
+        public int compare(ElementId id1, ElementId id2) {
+            return id1.uri().toString().compareTo(id2.uri().toString());
+        }
+    };
+
+    public static final Comparator<Element> ELEMENT_COMPARATOR = new Comparator<Element>() {
+        @Override
+        public int compare(Element e1, Element e2) {
+            return e1.id().uri().toString().compareTo(e2.id().uri().toString());
+        }
+    };
+
+    public static final Comparator<FlowRule> FLOW_RULE_COMPARATOR = new Comparator<FlowRule>() {
+        @Override
+        public int compare(FlowRule f1, FlowRule f2) {
+            return Long.valueOf(f1.id().value()).compareTo(f2.id().value());
+        }
+    };
+
+    public static final Comparator<Port> PORT_COMPARATOR = new Comparator<Port>() {
+        @Override
+        public int compare(Port p1, Port p2) {
+            long delta = p1.number().toLong() - p2.number().toLong();
+            return delta == 0 ? 0 : (delta < 0 ? -1 : +1);
+        }
+    };
+
+    public static final Comparator<TopologyCluster> CLUSTER_COMPARATOR = new Comparator<TopologyCluster>() {
+        @Override
+        public int compare(TopologyCluster c1, TopologyCluster c2) {
+            return c1.id().index() - c2.id().index();
+        }
+    };
+
+    public static final Comparator<ControllerNode> NODE_COMPARATOR = new Comparator<ControllerNode>() {
+        @Override
+        public int compare(ControllerNode ci1, ControllerNode ci2) {
+            return ci1.id().toString().compareTo(ci2.id().toString());
+        }
+    };
+
+}
diff --git a/cli/src/main/java/org/onlab/onos/cli/net/DevicePortsListCommand.java b/cli/src/main/java/org/onlab/onos/cli/net/DevicePortsListCommand.java
index e62fe56..1382896 100644
--- a/cli/src/main/java/org/onlab/onos/cli/net/DevicePortsListCommand.java
+++ b/cli/src/main/java/org/onlab/onos/cli/net/DevicePortsListCommand.java
@@ -8,7 +8,6 @@
 
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.Comparator;
 import java.util.List;
 
 import static org.onlab.onos.net.DeviceId.deviceId;
@@ -26,14 +25,6 @@
               required = false, multiValued = false)
     String uri = null;
 
-    private static final Comparator<Port> PORT_COMPARATOR = new Comparator<Port>() {
-        @Override
-        public int compare(Port p1, Port p2) {
-            long delta = p1.number().toLong() - p2.number().toLong();
-            return delta == 0 ? 0 : (delta < 0 ? -1 : +1);
-        }
-    };
-
     @Override
     protected void execute() {
         DeviceService service = get(DeviceService.class);
@@ -55,7 +46,7 @@
     protected void printDevice(DeviceService service, Device device) {
         super.printDevice(service, device);
         List<Port> ports = new ArrayList<>(service.getPorts(device.id()));
-        Collections.sort(ports, PORT_COMPARATOR);
+        Collections.sort(ports, Comparators.PORT_COMPARATOR);
         for (Port port : ports) {
             print(FMT, port.number(), port.isEnabled() ? "enabled" : "disabled");
         }
diff --git a/cli/src/main/java/org/onlab/onos/cli/net/DevicesListCommand.java b/cli/src/main/java/org/onlab/onos/cli/net/DevicesListCommand.java
index be102f2..6ecb482 100644
--- a/cli/src/main/java/org/onlab/onos/cli/net/DevicesListCommand.java
+++ b/cli/src/main/java/org/onlab/onos/cli/net/DevicesListCommand.java
@@ -6,7 +6,6 @@
 import org.onlab.onos.net.device.DeviceService;
 
 import java.util.Collections;
-import java.util.Comparator;
 import java.util.List;
 
 import static com.google.common.collect.Lists.newArrayList;
@@ -21,13 +20,6 @@
     private static final String FMT =
             "id=%s, available=%s, role=%s, type=%s, mfr=%s, hw=%s, sw=%s, serial=%s";
 
-    protected static final Comparator<Device> ID_COMPARATOR = new Comparator<Device>() {
-        @Override
-        public int compare(Device d1, Device d2) {
-            return d1.id().uri().toString().compareTo(d2.id().uri().toString());
-        }
-    };
-
     @Override
     protected void execute() {
         DeviceService service = get(DeviceService.class);
@@ -44,7 +36,7 @@
      */
     protected List<Device> getSortedDevices(DeviceService service) {
         List<Device> devices = newArrayList(service.getDevices());
-        Collections.sort(devices, ID_COMPARATOR);
+        Collections.sort(devices, Comparators.ELEMENT_COMPARATOR);
         return devices;
     }
 
diff --git a/cli/src/main/java/org/onlab/onos/cli/net/FlowsListCommand.java b/cli/src/main/java/org/onlab/onos/cli/net/FlowsListCommand.java
index c2ca416..da43255 100644
--- a/cli/src/main/java/org/onlab/onos/cli/net/FlowsListCommand.java
+++ b/cli/src/main/java/org/onlab/onos/cli/net/FlowsListCommand.java
@@ -1,12 +1,6 @@
 package org.onlab.onos.cli.net;
 
-import static com.google.common.collect.Lists.newArrayList;
-
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Map;
-
+import com.google.common.collect.Maps;
 import org.apache.karaf.shell.commands.Command;
 import org.onlab.onos.cli.AbstractShellCommand;
 import org.onlab.onos.net.Device;
@@ -14,7 +8,11 @@
 import org.onlab.onos.net.flow.FlowRule;
 import org.onlab.onos.net.flow.FlowRuleService;
 
-import com.google.common.collect.Maps;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import static com.google.common.collect.Lists.newArrayList;
 
 /**
  * Lists all currently-known hosts.
@@ -26,13 +24,6 @@
     private static final String FMT =
             "   id=%s, selector=%s, treatment=%s, state=%s";
 
-    protected static final Comparator<FlowRule> ID_COMPARATOR = new Comparator<FlowRule>() {
-        @Override
-        public int compare(FlowRule f1, FlowRule f2) {
-            return Long.valueOf(f1.id().value()).compareTo(f2.id().value());
-        }
-    };
-
     @Override
     protected void execute() {
         DeviceService deviceService = get(DeviceService.class);
@@ -43,7 +34,6 @@
         }
     }
 
-
     /**
      * Returns the list of devices sorted using the device ID URIs.
      *
@@ -55,7 +45,7 @@
         List<FlowRule> rules;
         for (Device d : deviceService.getDevices()) {
             rules = newArrayList(service.getFlowEntries(d.id()));
-            Collections.sort(rules, ID_COMPARATOR);
+            Collections.sort(rules, Comparators.FLOW_RULE_COMPARATOR);
             flows.put(d, rules);
         }
         return flows;
diff --git a/cli/src/main/java/org/onlab/onos/cli/net/HostIdCompleter.java b/cli/src/main/java/org/onlab/onos/cli/net/HostIdCompleter.java
index 6da2d82..72c6a41 100644
--- a/cli/src/main/java/org/onlab/onos/cli/net/HostIdCompleter.java
+++ b/cli/src/main/java/org/onlab/onos/cli/net/HostIdCompleter.java
@@ -1,15 +1,15 @@
 package org.onlab.onos.cli.net;
 
-import java.util.Iterator;
-import java.util.List;
-import java.util.SortedSet;
-
 import org.apache.karaf.shell.console.Completer;
 import org.apache.karaf.shell.console.completer.StringsCompleter;
 import org.onlab.onos.cli.AbstractShellCommand;
 import org.onlab.onos.net.Host;
 import org.onlab.onos.net.host.HostService;
 
+import java.util.Iterator;
+import java.util.List;
+import java.util.SortedSet;
+
 public class HostIdCompleter implements Completer {
 
     @Override
diff --git a/cli/src/main/java/org/onlab/onos/cli/net/HostsListCommand.java b/cli/src/main/java/org/onlab/onos/cli/net/HostsListCommand.java
index 29919a8..4e1f16b 100644
--- a/cli/src/main/java/org/onlab/onos/cli/net/HostsListCommand.java
+++ b/cli/src/main/java/org/onlab/onos/cli/net/HostsListCommand.java
@@ -1,16 +1,15 @@
 package org.onlab.onos.cli.net;
 
-import static com.google.common.collect.Lists.newArrayList;
-
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-
 import org.apache.karaf.shell.commands.Command;
 import org.onlab.onos.cli.AbstractShellCommand;
 import org.onlab.onos.net.Host;
 import org.onlab.onos.net.host.HostService;
 
+import java.util.Collections;
+import java.util.List;
+
+import static com.google.common.collect.Lists.newArrayList;
+
 /**
  * Lists all currently-known hosts.
  */
@@ -21,13 +20,6 @@
     private static final String FMT =
             "id=%s, mac=%s, location=%s/%s, vlan=%s, ip(s)=%s";
 
-    protected static final Comparator<Host> ID_COMPARATOR = new Comparator<Host>() {
-        @Override
-        public int compare(Host h1, Host h2) {
-            return h1.id().uri().toString().compareTo(h2.id().uri().toString());
-        }
-    };
-
     @Override
     protected void execute() {
         HostService service = get(HostService.class);
@@ -44,7 +36,7 @@
      */
     protected List<Host> getSortedHosts(HostService service) {
         List<Host> hosts = newArrayList(service.getHosts());
-        Collections.sort(hosts, ID_COMPARATOR);
+        Collections.sort(hosts, Comparators.ELEMENT_COMPARATOR);
         return hosts;
     }
 
diff --git a/cli/src/main/java/org/onlab/onos/cli/net/LinksListCommand.java b/cli/src/main/java/org/onlab/onos/cli/net/LinksListCommand.java
index 4361bd7..f5226b1 100644
--- a/cli/src/main/java/org/onlab/onos/cli/net/LinksListCommand.java
+++ b/cli/src/main/java/org/onlab/onos/cli/net/LinksListCommand.java
@@ -41,7 +41,6 @@
     public static String linkString(Link link) {
         return String.format(FMT, link.src().deviceId(), link.src().port(),
                              link.dst().deviceId(), link.dst().port(), link.type());
-
     }
 
     /**
diff --git a/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
index 419ed16..5284477 100644
--- a/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ b/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
@@ -5,8 +5,12 @@
             <action class="org.onlab.onos.cli.NodesListCommand"/>
         </command>
         <command>
-            <action class="org.onlab.onos.cli.net.FlowsListCommand"/>
+            <action class="org.onlab.onos.cli.MastersListCommand"/>
+            <completers>
+                <ref component-id="clusterIdCompleter"/>
+            </completers>
         </command>
+
         <command>
             <action class="org.onlab.onos.cli.net.DevicesListCommand"/>
         </command>
@@ -67,10 +71,15 @@
         </command>
 
         <command>
+            <action class="org.onlab.onos.cli.net.FlowsListCommand"/>
+        </command>
+
+        <command>
             <action class="org.onlab.onos.cli.net.WipeOutCommand"/>
         </command>
     </command-bundle>
 
+    <bean id="nodeIdCompleter" class="org.onlab.onos.cli.NodeIdCompleter"/>
     <bean id="deviceIdCompleter" class="org.onlab.onos.cli.net.DeviceIdCompleter"/>
     <bean id="clusterIdCompleter" class="org.onlab.onos.cli.net.ClusterIdCompleter"/>
     <bean id="roleCompleter" class="org.onlab.onos.cli.net.RoleCompleter"/>