diff --git a/cli/src/main/java/org/onlab/onos/cli/net/DeviceRoleCommand.java b/cli/src/main/java/org/onlab/onos/cli/net/DeviceRoleCommand.java
new file mode 100644
index 0000000..32da169
--- /dev/null
+++ b/cli/src/main/java/org/onlab/onos/cli/net/DeviceRoleCommand.java
@@ -0,0 +1,33 @@
+package org.onlab.onos.cli.net;
+
+import org.apache.karaf.shell.commands.Argument;
+import org.apache.karaf.shell.commands.Command;
+import org.onlab.onos.cli.AbstractShellCommand;
+import org.onlab.onos.net.DeviceId;
+import org.onlab.onos.net.MastershipRole;
+import org.onlab.onos.net.device.DeviceAdminService;
+
+/**
+ * Sets role of the controller node for the given infrastructure device.
+ */
+@Command(scope = "onos", name = "device-role",
+         description = "Sets role of the controller node for the given infrastructure device")
+public class DeviceRoleCommand extends AbstractShellCommand {
+
+    @Argument(index = 0, name = "uri", description = "Device ID",
+              required = true, multiValued = false)
+    String uri = null;
+
+    @Argument(index = 1, name = "role", description = "Mastership role",
+              required = true, multiValued = false)
+    String role = null;
+
+    @Override
+    protected Object doExecute() throws Exception {
+        MastershipRole mastershipRole = MastershipRole.valueOf(role.toUpperCase());
+        getService(DeviceAdminService.class).setRole(DeviceId.deviceId(uri),
+                                                     mastershipRole);
+        return null;
+    }
+
+}
diff --git a/cli/src/main/java/org/onlab/onos/cli/net/RoleCompleter.java b/cli/src/main/java/org/onlab/onos/cli/net/RoleCompleter.java
new file mode 100644
index 0000000..b540fca
--- /dev/null
+++ b/cli/src/main/java/org/onlab/onos/cli/net/RoleCompleter.java
@@ -0,0 +1,27 @@
+package org.onlab.onos.cli.net;
+
+import org.apache.karaf.shell.console.Completer;
+import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.onlab.onos.net.MastershipRole;
+
+import java.util.List;
+import java.util.SortedSet;
+
+/**
+ * Device mastership role completer.
+ */
+public class RoleCompleter implements Completer {
+    @Override
+    public int complete(String buffer, int cursor, List<String> candidates) {
+        // Delegate string completer
+        StringsCompleter delegate = new StringsCompleter();
+        SortedSet<String> strings = delegate.getStrings();
+        strings.add(MastershipRole.MASTER.toString().toLowerCase());
+        strings.add(MastershipRole.STANDBY.toString().toLowerCase());
+        strings.add(MastershipRole.NONE.toString().toLowerCase());
+
+        // 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/resources/OSGI-INF/blueprint/shell-config.xml b/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
index 7aa67be..96c494d 100644
--- a/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ b/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
@@ -16,6 +16,13 @@
                 <ref component-id="deviceIdCompleter"/>
             </completers>
         </command>
+        <command>
+            <action class="org.onlab.onos.cli.net.DeviceRoleCommand"/>
+            <completers>
+                <ref component-id="deviceIdCompleter"/>
+                <ref component-id="roleCompleter"/>
+            </completers>
+        </command>
 
         <command>
             <action class="org.onlab.onos.cli.net.LinksListCommand"/>
@@ -33,6 +40,7 @@
     </command-bundle>
 
     <bean id="deviceIdCompleter" class="org.onlab.onos.cli.net.DeviceIdCompleter"/>
+    <bean id="roleCompleter" class="org.onlab.onos.cli.net.RoleCompleter"/>
 
     <bean id="nameCompleter" class="org.onlab.onos.cli.NameCompleter"/>
 
diff --git a/net/api/src/main/java/org/onlab/onos/net/DefaultEdgeLink.java b/net/api/src/main/java/org/onlab/onos/net/DefaultEdgeLink.java
index fe2d34a..41cd045 100644
--- a/net/api/src/main/java/org/onlab/onos/net/DefaultEdgeLink.java
+++ b/net/api/src/main/java/org/onlab/onos/net/DefaultEdgeLink.java
@@ -37,7 +37,7 @@
     }
 
     @Override
-    public ConnectPoint connectPoint() {
+    public HostLocation hostLocation() {
         return hostLocation;
     }
 }
diff --git a/net/api/src/main/java/org/onlab/onos/net/DeviceId.java b/net/api/src/main/java/org/onlab/onos/net/DeviceId.java
index 19577a1..ef8c5ab 100644
--- a/net/api/src/main/java/org/onlab/onos/net/DeviceId.java
+++ b/net/api/src/main/java/org/onlab/onos/net/DeviceId.java
@@ -27,7 +27,7 @@
      * @param string device URI string
      */
     public static DeviceId deviceId(String string) {
-        return new DeviceId(URI.create(string));
+        return deviceId(URI.create(string));
     }
 
 }
diff --git a/net/api/src/main/java/org/onlab/onos/net/EdgeLink.java b/net/api/src/main/java/org/onlab/onos/net/EdgeLink.java
index 356592d3..b1d5f7f 100644
--- a/net/api/src/main/java/org/onlab/onos/net/EdgeLink.java
+++ b/net/api/src/main/java/org/onlab/onos/net/EdgeLink.java
@@ -17,8 +17,8 @@
      * Returns the connection point where the host attaches to the
      * network infrastructure.
      *
-     * @return host connection point
+     * @return host location point
      */
-    ConnectPoint connectPoint();
+    HostLocation hostLocation();
 
 }
diff --git a/net/api/src/main/java/org/onlab/onos/net/HostId.java b/net/api/src/main/java/org/onlab/onos/net/HostId.java
index a7f550b..3e274b3 100644
--- a/net/api/src/main/java/org/onlab/onos/net/HostId.java
+++ b/net/api/src/main/java/org/onlab/onos/net/HostId.java
@@ -27,7 +27,7 @@
      * @param string device URI string
      */
     public static HostId hostId(String string) {
-        return new HostId(URI.create(string));
+        return hostId(URI.create(string));
     }
 
 }
diff --git a/net/api/src/main/java/org/onlab/onos/net/topology/LinkWeight.java b/net/api/src/main/java/org/onlab/onos/net/topology/LinkWeight.java
new file mode 100644
index 0000000..89ef577
--- /dev/null
+++ b/net/api/src/main/java/org/onlab/onos/net/topology/LinkWeight.java
@@ -0,0 +1,10 @@
+package org.onlab.onos.net.topology;
+
+import org.onlab.graph.EdgeWeight;
+
+/**
+ * Entity capable of determining cost or weight of a specified topology
+ * graph edge.
+ */
+public interface LinkWeight extends EdgeWeight<TopoVertex, TopoEdge> {
+}
diff --git a/net/api/src/main/java/org/onlab/onos/net/topology/TopoEdge.java b/net/api/src/main/java/org/onlab/onos/net/topology/TopoEdge.java
new file mode 100644
index 0000000..ef94eca
--- /dev/null
+++ b/net/api/src/main/java/org/onlab/onos/net/topology/TopoEdge.java
@@ -0,0 +1,18 @@
+package org.onlab.onos.net.topology;
+
+import org.onlab.graph.Edge;
+import org.onlab.onos.net.Link;
+
+/**
+ * Represents an edge in the topology graph.
+ */
+public interface TopoEdge extends Edge<TopoVertex> {
+
+    /**
+     * Returns the associated infrastructure link.
+     *
+     * @return backing infrastructure link
+     */
+    Link link();
+
+}
diff --git a/net/api/src/main/java/org/onlab/onos/net/topology/TopoVertex.java b/net/api/src/main/java/org/onlab/onos/net/topology/TopoVertex.java
new file mode 100644
index 0000000..d5a8b95
--- /dev/null
+++ b/net/api/src/main/java/org/onlab/onos/net/topology/TopoVertex.java
@@ -0,0 +1,18 @@
+package org.onlab.onos.net.topology;
+
+import org.onlab.graph.Vertex;
+import org.onlab.onos.net.DeviceId;
+
+/**
+ * Represents a vertex in the topology graph.
+ */
+public interface TopoVertex extends Vertex {
+
+    /**
+     * Returns the associated infrastructure device identification.
+     *
+     * @return device identifier
+     */
+    DeviceId deviceId();
+
+}
diff --git a/net/api/src/main/java/org/onlab/onos/net/topology/TopologyCluster.java b/net/api/src/main/java/org/onlab/onos/net/topology/TopologyCluster.java
new file mode 100644
index 0000000..e58c784
--- /dev/null
+++ b/net/api/src/main/java/org/onlab/onos/net/topology/TopologyCluster.java
@@ -0,0 +1,10 @@
+package org.onlab.onos.net.topology;
+
+/**
+ * Representation of an SCC (strongly-connected component) in a network topology.
+ */
+public interface TopologyCluster {
+
+    // TODO: add stuff in here: id, deviceCount, linkCount
+
+}
diff --git a/net/api/src/main/java/org/onlab/onos/net/topology/TopologyService.java b/net/api/src/main/java/org/onlab/onos/net/topology/TopologyService.java
index 4e1211a..a6962a2 100644
--- a/net/api/src/main/java/org/onlab/onos/net/topology/TopologyService.java
+++ b/net/api/src/main/java/org/onlab/onos/net/topology/TopologyService.java
@@ -1,7 +1,13 @@
 package org.onlab.onos.net.topology;
 
+import org.onlab.graph.Graph;
+import org.onlab.onos.net.ConnectPoint;
+import org.onlab.onos.net.DeviceId;
+import org.onlab.onos.net.Path;
 import org.onlab.onos.net.Topology;
 
+import java.util.Set;
+
 /**
  * Service for providing network topology information.
  */
@@ -14,13 +20,64 @@
      */
     Topology currentTopology();
 
-    // TODO: Figure out hot to best export graph traversal methods via Graph/Vertex/Edge
-    // TODO: figure out how we want this to be presented, via Topology or via TopologyService
-    // Set<TopologyCluster> getClusters(Topology topology);
-    // Set<Path> getPaths(Topology topology, DeviceId src, DeviceId dst);
-    // Set<Path> getPaths(Topology topology, DeviceId src, DeviceId dst, LinkWeight weight);
-    // boolean isInfrastructure(Topology topology, ConnectPoint connectPoint);
-    // boolean isInBroadcastTree(Topology topology, ConnectPoint connectPoint);
+    /**
+     * Returns the set of clusters in the specified topology.
+     *
+     * @param topology topology descriptor
+     * @return set of topology clusters
+     */
+    Set<TopologyCluster> getClusters(Topology topology);
+
+    /**
+     * Returns the graph view of the specified topology.
+     *
+     * @param topology topology descriptor
+     * @return topology graph view
+     */
+    Graph<TopoVertex, TopoEdge> getGraph(Topology topology);
+
+    /**
+     * Returns the set of all shortest paths, in terms of hop-count, between
+     * the specified source and destination devices.
+     *
+     * @param topology topology descriptor
+     * @param src      source device
+     * @param dst      destination device
+     * @return set of all shortest paths between the two devices
+     */
+    Set<Path> getPaths(Topology topology, DeviceId src, DeviceId dst);
+
+    /**
+     * Returns the set of all shortest paths, computed using the supplied
+     * edge-weight entity, between the specified source and destination devices.
+     *
+     * @param topology topology descriptor
+     * @param src      source device
+     * @param dst      destination device
+     * @return set of all shortest paths between the two devices
+     */
+    Set<Path> getPaths(Topology topology, DeviceId src, DeviceId dst,
+                       LinkWeight weight);
+
+    /**
+     * Indicates whether the specified connection point is part of the network
+     * infrastructure or part of network edge.
+     *
+     * @param topology     topology descriptor
+     * @param connectPoint connection point
+     * @return true of connection point is in infrastructure; false if edge
+     */
+    boolean isInfrastructure(Topology topology, ConnectPoint connectPoint);
+
+
+    /**
+     * Indicates whether the specified connection point allows broadcast.
+     *
+     * @param topology     topology descriptor
+     * @param connectPoint connection point
+     * @return true if broadcast is permissible
+     */
+    boolean isInBroadcastTree(Topology topology, ConnectPoint connectPoint);
 
     /**
      * Adds the specified topology listener.
diff --git a/net/api/src/test/java/org/onlab/onos/net/DefaultEdgeLinkTest.java b/net/api/src/test/java/org/onlab/onos/net/DefaultEdgeLinkTest.java
new file mode 100644
index 0000000..368ff16
--- /dev/null
+++ b/net/api/src/test/java/org/onlab/onos/net/DefaultEdgeLinkTest.java
@@ -0,0 +1,58 @@
+package org.onlab.onos.net;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+import org.onlab.onos.net.provider.ProviderId;
+
+import static org.junit.Assert.assertEquals;
+import static org.onlab.onos.net.DefaultLinkTest.cp;
+import static org.onlab.onos.net.DeviceId.deviceId;
+import static org.onlab.onos.net.HostId.hostId;
+import static org.onlab.onos.net.PortNumber.portNumber;
+
+/**
+ * Test of the default edge link model entity.
+ */
+public class DefaultEdgeLinkTest {
+
+    private static final ProviderId PID = new ProviderId("foo");
+    private static final DeviceId DID1 = deviceId("of:foo");
+    private static final HostId HID1 = hostId("nic:foobar");
+    private static final HostId HID2 = hostId("nic:barfoo");
+    private static final PortNumber P0 = portNumber(0);
+    private static final PortNumber P1 = portNumber(1);
+
+    @Test
+    public void testEquality() {
+        EdgeLink l1 = new DefaultEdgeLink(PID, cp(HID1, P0),
+                                          new HostLocation(DID1, P1, 123L), true);
+        EdgeLink l2 = new DefaultEdgeLink(PID, cp(HID1, P0),
+                                          new HostLocation(DID1, P1, 123L), true);
+
+        EdgeLink l3 = new DefaultEdgeLink(PID, cp(HID2, P0),
+                                          new HostLocation(DID1, P1, 123L), false);
+        EdgeLink l4 = new DefaultEdgeLink(PID, cp(HID2, P0),
+                                          new HostLocation(DID1, P1, 123L), false);
+
+        EdgeLink l5 = new DefaultEdgeLink(PID, cp(HID1, P0),
+                                          new HostLocation(DID1, P1, 123L), false);
+
+        new EqualsTester().addEqualityGroup(l1, l2)
+                .addEqualityGroup(l3, l4)
+                .addEqualityGroup(l5)
+                .testEquals();
+    }
+
+    @Test
+    public void basics() {
+        HostLocation hostLocation = new HostLocation(DID1, P1, 123L);
+        EdgeLink link = new DefaultEdgeLink(PID, cp(HID1, P0), hostLocation, false);
+        assertEquals("incorrect src", cp(HID1, P0), link.src());
+        assertEquals("incorrect dst", hostLocation, link.dst());
+        assertEquals("incorrect type", Link.Type.EDGE, link.type());
+        assertEquals("incorrect hostId", HID1, link.hostId());
+        assertEquals("incorrect connect point", hostLocation, link.hostLocation());
+        assertEquals("incorrect time", 123L, link.hostLocation().time());
+    }
+
+}
diff --git a/net/api/src/test/java/org/onlab/onos/net/DefaultLinkTest.java b/net/api/src/test/java/org/onlab/onos/net/DefaultLinkTest.java
index 37757af..ec8511e 100644
--- a/net/api/src/test/java/org/onlab/onos/net/DefaultLinkTest.java
+++ b/net/api/src/test/java/org/onlab/onos/net/DefaultLinkTest.java
@@ -21,7 +21,7 @@
     private static final PortNumber P1 = portNumber(1);
     private static final PortNumber P2 = portNumber(2);
 
-    public static ConnectPoint cp(DeviceId id, PortNumber pn) {
+    public static ConnectPoint cp(ElementId id, PortNumber pn) {
         return new ConnectPoint(id, pn);
     }
 
diff --git a/net/api/src/test/java/org/onlab/onos/net/DefaultPortTest.java b/net/api/src/test/java/org/onlab/onos/net/DefaultPortTest.java
new file mode 100644
index 0000000..e9d3da6
--- /dev/null
+++ b/net/api/src/test/java/org/onlab/onos/net/DefaultPortTest.java
@@ -0,0 +1,47 @@
+package org.onlab.onos.net;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+import org.onlab.onos.net.provider.ProviderId;
+
+import static org.junit.Assert.assertEquals;
+import static org.onlab.onos.net.Device.Type.SWITCH;
+import static org.onlab.onos.net.DeviceId.deviceId;
+import static org.onlab.onos.net.PortNumber.portNumber;
+
+/**
+ * Test of the default port model entity.
+ */
+public class DefaultPortTest {
+
+    private static final ProviderId PID = new ProviderId("foo");
+    private static final DeviceId DID1 = deviceId("of:foo");
+    private static final DeviceId DID2 = deviceId("of:bar");
+    private static final PortNumber P1 = portNumber(1);
+    private static final PortNumber P2 = portNumber(2);
+
+    @Test
+    public void testEquality() {
+        Device device = new DefaultDevice(PID, DID1, SWITCH, "m", "h", "s", "n");
+        Port p1 = new DefaultPort(device, portNumber(1), true);
+        Port p2 = new DefaultPort(device, portNumber(1), true);
+        Port p3 = new DefaultPort(device, portNumber(2), true);
+        Port p4 = new DefaultPort(device, portNumber(2), true);
+        Port p5 = new DefaultPort(device, portNumber(1), false);
+
+        new EqualsTester().addEqualityGroup(p1, p2)
+                .addEqualityGroup(p3, p4)
+                .addEqualityGroup(p5)
+                .testEquals();
+    }
+
+    @Test
+    public void basics() {
+        Device device = new DefaultDevice(PID, DID1, SWITCH, "m", "h", "s", "n");
+        Port port = new DefaultPort(device, portNumber(1), true);
+        assertEquals("incorrect element", device, port.element());
+        assertEquals("incorrect number", portNumber(1), port.number());
+        assertEquals("incorrect state", true, port.isEnabled());
+    }
+
+}
diff --git a/net/api/src/test/java/org/onlab/onos/net/HostIdTest.java b/net/api/src/test/java/org/onlab/onos/net/HostIdTest.java
new file mode 100644
index 0000000..3adcabc
--- /dev/null
+++ b/net/api/src/test/java/org/onlab/onos/net/HostIdTest.java
@@ -0,0 +1,22 @@
+package org.onlab.onos.net;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+
+import static org.onlab.onos.net.HostId.hostId;
+
+/**
+ * Test of the host identifier.
+ */
+public class HostIdTest extends ElementIdTest {
+
+    @Test
+    public void basics() {
+        new EqualsTester()
+                .addEqualityGroup(hostId("nic:foo"),
+                                  hostId("nic:foo"))
+                .addEqualityGroup(hostId("nic:bar"))
+                .testEquals();
+    }
+
+}
diff --git a/net/core/trivial/src/main/java/org/onlab/onos/net/trivial/impl/SimpleDeviceManager.java b/net/core/trivial/src/main/java/org/onlab/onos/net/trivial/impl/SimpleDeviceManager.java
index ac84e7b..29c119d 100644
--- a/net/core/trivial/src/main/java/org/onlab/onos/net/trivial/impl/SimpleDeviceManager.java
+++ b/net/core/trivial/src/main/java/org/onlab/onos/net/trivial/impl/SimpleDeviceManager.java
@@ -27,11 +27,8 @@
 import org.slf4j.Logger;
 
 import java.util.List;
-import java.util.concurrent.ExecutorService;
 
 import static com.google.common.base.Preconditions.checkNotNull;
-import static java.util.concurrent.Executors.newSingleThreadExecutor;
-import static org.onlab.util.Tools.namedThreads;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
@@ -56,9 +53,6 @@
 
     private final SimpleDeviceStore store = new SimpleDeviceStore();
 
-    private final ExecutorService executor =
-            newSingleThreadExecutor(namedThreads("onos-device-%d"));
-
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected EventDeliveryService eventDispatcher;
 
@@ -168,11 +162,12 @@
             log.info("Device {} connected", deviceId);
             DeviceEvent event = store.createOrUpdateDevice(provider().id(),
                                                            deviceId, deviceDescription);
-            post(event);
 
             // If there was a change of any kind, trigger role selection process.
             if (event != null) {
-                triggerRoleSelection(event.subject(), provider());
+                Device device = event.subject();
+                provider().roleChanged(device, store.getRole(device.id()));
+                post(event);
             }
         }
 
@@ -210,22 +205,6 @@
         }
     }
 
-    /**
-     * Triggers asynchronous role selection.
-     *
-     * @param device   device
-     * @param provider device provider
-     */
-    private void triggerRoleSelection(final Device device,
-                                      final DeviceProvider provider) {
-        executor.execute(new Runnable() {
-            @Override
-            public void run() {
-                provider.roleChanged(device, store.getRole(device.id()));
-            }
-        });
-    }
-
     // Posts the specified event to the local event dispatcher.
     private void post(DeviceEvent event) {
         if (event != null && eventDispatcher != null) {
diff --git a/net/core/trivial/src/test/java/org/onlab/onos/net/trivial/impl/SimpleDeviceManagerTest.java b/net/core/trivial/src/test/java/org/onlab/onos/net/trivial/impl/SimpleDeviceManagerTest.java
index 5bc60c0..bcece2d 100644
--- a/net/core/trivial/src/test/java/org/onlab/onos/net/trivial/impl/SimpleDeviceManagerTest.java
+++ b/net/core/trivial/src/test/java/org/onlab/onos/net/trivial/impl/SimpleDeviceManagerTest.java
@@ -143,7 +143,7 @@
     }
 
     @Test
-    public void setRole() {
+    public void setRole() throws InterruptedException {
         connectDevice(DID1, SW1);
         admin.setRole(DID1, MastershipRole.STANDBY);
         validateEvents(DEVICE_ADDED, DEVICE_MASTERSHIP_CHANGED);
