diff --git a/core/trivial/src/test/java/org/onlab/onos/net/trivial/topology/impl/DefaultTopologyProviderTest.java b/core/trivial/src/test/java/org/onlab/onos/net/trivial/topology/impl/DefaultTopologyProviderTest.java
deleted file mode 100644
index a4cf5b5..0000000
--- a/core/trivial/src/test/java/org/onlab/onos/net/trivial/topology/impl/DefaultTopologyProviderTest.java
+++ /dev/null
@@ -1,162 +0,0 @@
-package org.onlab.onos.net.trivial.topology.impl;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.onlab.onos.event.Event;
-import org.onlab.onos.event.impl.TestEventDispatcher;
-import org.onlab.onos.net.Device;
-import org.onlab.onos.net.Link;
-import org.onlab.onos.net.device.DeviceEvent;
-import org.onlab.onos.net.link.LinkEvent;
-import org.onlab.onos.net.provider.AbstractProviderService;
-import org.onlab.onos.net.provider.ProviderId;
-import org.onlab.onos.net.topology.GraphDescription;
-import org.onlab.onos.net.topology.TopologyProvider;
-import org.onlab.onos.net.topology.TopologyProviderRegistry;
-import org.onlab.onos.net.topology.TopologyProviderService;
-import org.onlab.onos.net.trivial.device.impl.DeviceManager;
-import org.onlab.onos.net.trivial.link.impl.LinkManager;
-
-import java.util.List;
-import java.util.Set;
-
-import static com.google.common.collect.ImmutableSet.of;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.onlab.junit.TestTools.assertAfter;
-import static org.onlab.onos.net.device.DeviceEvent.Type.DEVICE_ADDED;
-import static org.onlab.onos.net.link.LinkEvent.Type.LINK_ADDED;
-import static org.onlab.onos.net.trivial.topology.impl.TopologyManagerTest.device;
-import static org.onlab.onos.net.trivial.topology.impl.TopologyManagerTest.link;
-
-/**
- * Test of the default topology provider implementation.
- */
-public class DefaultTopologyProviderTest {
-
-    private DefaultTopologyProvider provider = new DefaultTopologyProvider();
-    private TestTopoRegistry topologyService = new TestTopoRegistry();
-    private TestDeviceService deviceService = new TestDeviceService();
-    private TestLinkService linkService = new TestLinkService();
-    private TestTopoProviderService providerService;
-
-    @Before
-    public void setUp() {
-        provider.deviceService = deviceService;
-        provider.linkService = linkService;
-        provider.providerRegistry = topologyService;
-        provider.activate();
-    }
-
-    @After
-    public void tearDown() {
-        provider.deactivate();
-        provider.providerRegistry = null;
-        provider.deviceService = null;
-        provider.linkService = null;
-    }
-
-    private void validateSubmission() {
-        assertNotNull("registration expected", providerService);
-        assertEquals("incorrect provider", provider, providerService.provider());
-        assertNotNull("topo change should be submitted", providerService.graphDesc);
-        assertEquals("incorrect vertex count", 6, providerService.graphDesc.vertexes().size());
-        assertEquals("incorrect edge count", 10, providerService.graphDesc.edges().size());
-    }
-
-    @Test
-    public void basics() {
-        assertAfter(100, new Runnable() {
-            @Override
-            public void run() {
-                validateSubmission();
-            }
-        });
-    }
-
-    @Test
-    public void eventDriven() {
-        assertAfter(100, new Runnable() {
-            @Override
-            public void run() {
-                validateSubmission();
-                deviceService.post(new DeviceEvent(DEVICE_ADDED, device("z"), null));
-                linkService.post(new LinkEvent(LINK_ADDED, link("z", 1, "a", 4)));
-                validateSubmission();
-            }
-        });
-    }
-
-
-    private class TestTopoRegistry implements TopologyProviderRegistry {
-
-        @Override
-        public TopologyProviderService register(TopologyProvider provider) {
-            providerService = new TestTopoProviderService(provider);
-            return providerService;
-        }
-
-        @Override
-        public void unregister(TopologyProvider provider) {
-        }
-
-        @Override
-        public Set<ProviderId> getProviders() {
-            return null;
-        }
-    }
-
-    private class TestTopoProviderService
-            extends AbstractProviderService<TopologyProvider>
-            implements TopologyProviderService {
-        GraphDescription graphDesc;
-
-        protected TestTopoProviderService(TopologyProvider provider) {
-            super(provider);
-        }
-
-        @Override
-        public void topologyChanged(GraphDescription graphDescription, List<Event> reasons) {
-            graphDesc = graphDescription;
-        }
-    }
-
-    private class TestDeviceService extends DeviceManager {
-        TestDeviceService() {
-            eventDispatcher = new TestEventDispatcher();
-            eventDispatcher.addSink(DeviceEvent.class, listenerRegistry);
-        }
-
-        @Override
-        public Iterable<Device> getDevices() {
-            return of(device("a"), device("b"),
-                      device("c"), device("d"),
-                      device("e"), device("f"));
-        }
-
-        void post(DeviceEvent event) {
-            eventDispatcher.post(event);
-        }
-    }
-
-    private class TestLinkService extends LinkManager {
-        TestLinkService() {
-            eventDispatcher = new TestEventDispatcher();
-            eventDispatcher.addSink(LinkEvent.class, listenerRegistry);
-        }
-
-        @Override
-        public Iterable<Link> getLinks() {
-            return of(link("a", 1, "b", 1), link("b", 1, "a", 1),
-                      link("b", 2, "c", 1), link("c", 1, "b", 2),
-                      link("c", 2, "d", 1), link("d", 1, "c", 2),
-                      link("d", 2, "a", 2), link("a", 2, "d", 2),
-                      link("e", 1, "f", 1), link("f", 1, "e", 1));
-        }
-
-        void post(LinkEvent event) {
-            eventDispatcher.post(event);
-        }
-    }
-}
\ No newline at end of file
diff --git a/core/trivial/src/test/java/org/onlab/onos/net/trivial/topology/impl/DefaultTopologyTest.java b/core/trivial/src/test/java/org/onlab/onos/net/trivial/topology/impl/DefaultTopologyTest.java
index 3051dc3..d239304 100644
--- a/core/trivial/src/test/java/org/onlab/onos/net/trivial/topology/impl/DefaultTopologyTest.java
+++ b/core/trivial/src/test/java/org/onlab/onos/net/trivial/topology/impl/DefaultTopologyTest.java
@@ -3,6 +3,8 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.onlab.onos.net.ConnectPoint;
+import org.onlab.onos.net.DefaultDevice;
+import org.onlab.onos.net.DefaultLink;
 import org.onlab.onos.net.Device;
 import org.onlab.onos.net.DeviceId;
 import org.onlab.onos.net.Link;
@@ -10,6 +12,7 @@
 import org.onlab.onos.net.PortNumber;
 import org.onlab.onos.net.provider.ProviderId;
 import org.onlab.onos.net.topology.ClusterId;
+import org.onlab.onos.net.topology.DefaultGraphDescription;
 import org.onlab.onos.net.topology.GraphDescription;
 import org.onlab.onos.net.topology.LinkWeight;
 import org.onlab.onos.net.topology.TopologyCluster;
@@ -21,8 +24,6 @@
 import static org.junit.Assert.*;
 import static org.onlab.onos.net.DeviceId.deviceId;
 import static org.onlab.onos.net.PortNumber.portNumber;
-import static org.onlab.onos.net.trivial.topology.impl.TopologyManagerTest.device;
-import static org.onlab.onos.net.trivial.topology.impl.TopologyManagerTest.link;
 
 /**
  * Test of the default topology implementation.
@@ -108,4 +109,22 @@
         assertFalse("cluster should not contain D5", devs.contains(D5));
     }
 
+    // Short-hand for creating a link.
+    public static Link link(String src, int sp, String dst, int dp) {
+        return new DefaultLink(PID, new ConnectPoint(did(src), portNumber(sp)),
+                               new ConnectPoint(did(dst), portNumber(dp)),
+                               Link.Type.DIRECT);
+    }
+
+    // Crates a new device with the specified id
+    public static Device device(String id) {
+        return new DefaultDevice(PID, did(id), Device.Type.SWITCH,
+                                 "mfg", "1.0", "1.1", "1234");
+    }
+
+    // Short-hand for producing a device id from a string
+    public static DeviceId did(String id) {
+        return deviceId("of:" + id);
+    }
+
 }
diff --git a/core/trivial/src/test/java/org/onlab/onos/net/trivial/topology/impl/TopologyManagerTest.java b/core/trivial/src/test/java/org/onlab/onos/net/trivial/topology/impl/TopologyManagerTest.java
deleted file mode 100644
index 06a37fc..0000000
--- a/core/trivial/src/test/java/org/onlab/onos/net/trivial/topology/impl/TopologyManagerTest.java
+++ /dev/null
@@ -1,228 +0,0 @@
-package org.onlab.onos.net.trivial.topology.impl;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.onlab.onos.event.Event;
-import org.onlab.onos.event.impl.TestEventDispatcher;
-import org.onlab.onos.net.ConnectPoint;
-import org.onlab.onos.net.DefaultDevice;
-import org.onlab.onos.net.DefaultLink;
-import org.onlab.onos.net.Device;
-import org.onlab.onos.net.DeviceId;
-import org.onlab.onos.net.Link;
-import org.onlab.onos.net.Path;
-import org.onlab.onos.net.provider.AbstractProvider;
-import org.onlab.onos.net.provider.ProviderId;
-import org.onlab.onos.net.topology.GraphDescription;
-import org.onlab.onos.net.topology.LinkWeight;
-import org.onlab.onos.net.topology.Topology;
-import org.onlab.onos.net.topology.TopologyCluster;
-import org.onlab.onos.net.topology.TopologyEdge;
-import org.onlab.onos.net.topology.TopologyEvent;
-import org.onlab.onos.net.topology.TopologyGraph;
-import org.onlab.onos.net.topology.TopologyListener;
-import org.onlab.onos.net.topology.TopologyProvider;
-import org.onlab.onos.net.topology.TopologyProviderRegistry;
-import org.onlab.onos.net.topology.TopologyProviderService;
-import org.onlab.onos.net.topology.TopologyService;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
-
-import static com.google.common.collect.ImmutableSet.of;
-import static org.junit.Assert.*;
-import static org.onlab.onos.net.DeviceId.deviceId;
-import static org.onlab.onos.net.PortNumber.portNumber;
-import static org.onlab.onos.net.topology.ClusterId.clusterId;
-import static org.onlab.onos.net.topology.TopologyEvent.Type.TOPOLOGY_CHANGED;
-
-/**
- * Test of the topology subsystem.
- */
-public class TopologyManagerTest {
-
-    private static final ProviderId PID = new ProviderId("of", "foo");
-
-    private TopologyManager mgr;
-
-    protected TopologyService service;
-    protected TopologyProviderRegistry registry;
-    protected TopologyProviderService providerService;
-    protected TestProvider provider;
-    protected TestListener listener = new TestListener();
-
-    @Before
-    public void setUp() {
-        mgr = new TopologyManager();
-        service = mgr;
-        registry = mgr;
-
-        mgr.store = new SimpleTopologyStore();
-        mgr.eventDispatcher = new TestEventDispatcher();
-        mgr.activate();
-
-        service.addListener(listener);
-
-        provider = new TestProvider();
-        providerService = registry.register(provider);
-
-        assertTrue("provider should be registered",
-                   registry.getProviders().contains(provider.id()));
-    }
-
-    @After
-    public void tearDown() {
-        mgr.deactivate();
-        service.removeListener(listener);
-    }
-
-    @Test
-    public void basics() {
-        Topology topology = service.currentTopology();
-        assertNull("no topo expected", topology);
-        submitTopologyGraph();
-        validateEvents(TOPOLOGY_CHANGED);
-        topology = service.currentTopology();
-        assertTrue("should be latest", service.isLatest(topology));
-
-        submitTopologyGraph();
-        validateEvents(TOPOLOGY_CHANGED);
-        assertFalse("should be latest", service.isLatest(topology));
-    }
-
-    private void submitTopologyGraph() {
-        Set<Device> devices = of(device("a"), device("b"),
-                                 device("c"), device("d"),
-                                 device("e"), device("f"));
-        Set<Link> links = of(link("a", 1, "b", 1), link("b", 1, "a", 1),
-                             link("b", 2, "c", 1), link("c", 1, "b", 2),
-                             link("c", 2, "d", 1), link("d", 1, "c", 2),
-                             link("d", 2, "a", 2), link("a", 2, "d", 2),
-                             link("e", 1, "f", 1), link("f", 1, "e", 1));
-        GraphDescription data = new DefaultGraphDescription(4321L, devices, links);
-        providerService.topologyChanged(data, null);
-    }
-
-    @Test
-    public void clusters() {
-        submitTopologyGraph();
-        Topology topology = service.currentTopology();
-        assertNotNull("topo expected", topology);
-        assertEquals("wrong cluster count", 2, topology.clusterCount());
-        assertEquals("wrong device count", 6, topology.deviceCount());
-        assertEquals("wrong link count", 10, topology.linkCount());
-        assertEquals("wrong path count", 18, topology.pathCount());
-
-        assertEquals("wrong cluster count", 2, service.getClusters(topology).size());
-
-        TopologyCluster cluster = service.getCluster(topology, clusterId(0));
-        assertEquals("wrong device count", 4, cluster.deviceCount());
-        assertEquals("wrong device count", 4, service.getClusterDevices(topology, cluster).size());
-        assertEquals("wrong link count", 8, cluster.linkCount());
-        assertEquals("wrong link count", 8, service.getClusterLinks(topology, cluster).size());
-    }
-
-    @Test
-    public void structure() {
-        submitTopologyGraph();
-        Topology topology = service.currentTopology();
-
-        assertTrue("should be infrastructure point",
-                   service.isInfrastructure(topology, new ConnectPoint(did("a"), portNumber(1))));
-        assertFalse("should not be infrastructure point",
-                    service.isInfrastructure(topology, new ConnectPoint(did("a"), portNumber(3))));
-
-        // One of these cannot be a broadcast point... or we have a loop...
-        assertFalse("should not be broadcast point",
-                    service.isBroadcastPoint(topology, new ConnectPoint(did("a"), portNumber(1))) &&
-                            service.isBroadcastPoint(topology, new ConnectPoint(did("b"), portNumber(1))) &&
-                            service.isBroadcastPoint(topology, new ConnectPoint(did("c"), portNumber(1))) &&
-                            service.isBroadcastPoint(topology, new ConnectPoint(did("d"), portNumber(1))));
-        assertTrue("should be broadcast point",
-                   service.isBroadcastPoint(topology, new ConnectPoint(did("a"), portNumber(3))));
-    }
-
-    @Test
-    public void graph() {
-        submitTopologyGraph();
-        Topology topology = service.currentTopology();
-        TopologyGraph graph = service.getGraph(topology);
-        assertEquals("wrong vertex count", 6, graph.getVertexes().size());
-        assertEquals("wrong edge count", 10, graph.getEdges().size());
-    }
-
-    @Test
-    public void precomputedPath() {
-        submitTopologyGraph();
-        Topology topology = service.currentTopology();
-        Set<Path> paths = service.getPaths(topology, did("a"), did("c"));
-        assertEquals("wrong path count", 2, paths.size());
-        Path path = paths.iterator().next();
-        assertEquals("wrong path length", 2, path.links().size());
-        assertEquals("wrong path cost", 2, path.cost(), 0.01);
-    }
-
-    @Test
-    public void onDemandPath() {
-        submitTopologyGraph();
-        Topology topology = service.currentTopology();
-        LinkWeight weight = new LinkWeight() {
-            @Override
-            public double weight(TopologyEdge edge) {
-                return 3.3;
-            }
-        };
-
-        Set<Path> paths = service.getPaths(topology, did("a"), did("c"), weight);
-        assertEquals("wrong path count", 2, paths.size());
-        Path path = paths.iterator().next();
-        assertEquals("wrong path length", 2, path.links().size());
-        assertEquals("wrong path cost", 6.6, path.cost(), 0.01);
-    }
-
-    // Short-hand for creating a link.
-    static Link link(String src, int sp, String dst, int dp) {
-        return new DefaultLink(PID, new ConnectPoint(did(src), portNumber(sp)),
-                               new ConnectPoint(did(dst), portNumber(dp)),
-                               Link.Type.DIRECT);
-    }
-
-    // Crates a new device with the specified id
-    static Device device(String id) {
-        return new DefaultDevice(PID, did(id), Device.Type.SWITCH,
-                                 "mfg", "1.0", "1.1", "1234");
-    }
-
-    // Short-hand for producing a device id from a string
-    static DeviceId did(String id) {
-        return deviceId("of:" + id);
-    }
-
-    protected void validateEvents(Enum... types) {
-        int i = 0;
-        assertEquals("wrong events received", types.length, listener.events.size());
-        for (Event event : listener.events) {
-            assertEquals("incorrect event type", types[i], event.type());
-            i++;
-        }
-        listener.events.clear();
-    }
-
-    private class TestProvider extends AbstractProvider implements TopologyProvider {
-        public TestProvider() {
-            super(PID);
-        }
-    }
-
-    private static class TestListener implements TopologyListener {
-        final List<TopologyEvent> events = new ArrayList<>();
-
-        @Override
-        public void event(TopologyEvent event) {
-            events.add(event);
-        }
-    }
-
-}
\ No newline at end of file
