Formalized LinkStore in preparation for separating managers and stores.
diff --git a/core/api/src/main/java/org/onlab/onos/net/link/LinkStore.java b/core/api/src/main/java/org/onlab/onos/net/link/LinkStore.java
new file mode 100644
index 0000000..3c3c1fb
--- /dev/null
+++ b/core/api/src/main/java/org/onlab/onos/net/link/LinkStore.java
@@ -0,0 +1,90 @@
+package org.onlab.onos.net.link;
+
+import org.onlab.onos.net.ConnectPoint;
+import org.onlab.onos.net.DeviceId;
+import org.onlab.onos.net.Link;
+import org.onlab.onos.net.provider.ProviderId;
+
+import java.util.Set;
+
+/**
+ * Manages inventory of infrastructure links using whatever means are appropriate.
+ */
+public interface LinkStore {
+
+    /**
+     * Returns the number of links in the store.
+     *
+     * @return number of links
+     */
+    int getLinkCount();
+
+    /**
+     * Returns an iterable collection of all links in the inventory.
+     *
+     * @return collection of all links
+     */
+    Iterable<Link> getLinks();
+
+    /**
+     * Returns all links egressing from the specified device.
+     *
+     * @param deviceId device identifier
+     * @return set of device links
+     */
+    Set<Link> getDeviceEgressLinks(DeviceId deviceId);
+
+    /**
+     * Returns all links ingressing from the specified device.
+     *
+     * @param deviceId device identifier
+     * @return set of device links
+     */
+    Set<Link> getDeviceIngressLinks(DeviceId deviceId);
+
+    /**
+     * Returns the link between the two end-points.
+     *
+     * @param src source connection point
+     * @param dst destination connection point
+     * @return link or null if one not found between the end-points
+     */
+    Link getLink(ConnectPoint src, ConnectPoint dst);
+
+    /**
+     * Returns all links egressing from the specified connection point.
+     *
+     * @param src source connection point
+     * @return set of connection point links
+     */
+    Set<Link> getEgressLinks(ConnectPoint src);
+
+    /**
+     * Returns all links ingressing to the specified connection point.
+     *
+     * @param dst destination connection point
+     * @return set of connection point links
+     */
+    Set<Link> getIngressLinks(ConnectPoint dst);
+
+    /**
+     * Creates a new link, or updates an existing one, based on the given
+     * information.
+     *
+     * @param providerId      provider identity
+     * @param linkDescription link description
+     * @return create or update link event, or null if no change resulted
+     */
+    public LinkEvent createOrUpdateLink(ProviderId providerId,
+                                        LinkDescription linkDescription);
+
+    /**
+     * Removes the link based on the specified information.
+     *
+     * @param src link source
+     * @param dst link destination
+     * @return remove link event, or null if no change resulted
+     */
+    LinkEvent removeLink(ConnectPoint src, ConnectPoint dst);
+
+}
diff --git a/core/trivial/src/main/java/org/onlab/onos/net/trivial/link/impl/SimpleLinkManager.java b/core/trivial/src/main/java/org/onlab/onos/net/trivial/link/impl/LinkManager.java
similarity index 97%
rename from core/trivial/src/main/java/org/onlab/onos/net/trivial/link/impl/SimpleLinkManager.java
rename to core/trivial/src/main/java/org/onlab/onos/net/trivial/link/impl/LinkManager.java
index 7242642..13cb546 100644
--- a/core/trivial/src/main/java/org/onlab/onos/net/trivial/link/impl/SimpleLinkManager.java
+++ b/core/trivial/src/main/java/org/onlab/onos/net/trivial/link/impl/LinkManager.java
@@ -27,6 +27,7 @@
 import org.onlab.onos.net.link.LinkProviderRegistry;
 import org.onlab.onos.net.link.LinkProviderService;
 import org.onlab.onos.net.link.LinkService;
+import org.onlab.onos.net.link.LinkStore;
 import org.onlab.onos.net.provider.AbstractProviderRegistry;
 import org.onlab.onos.net.provider.AbstractProviderService;
 import org.slf4j.Logger;
@@ -38,7 +39,7 @@
  */
 @Component(immediate = true)
 @Service
-public class SimpleLinkManager
+public class LinkManager
         extends AbstractProviderRegistry<LinkProvider, LinkProviderService>
         implements LinkService, LinkAdminService, LinkProviderRegistry {
 
@@ -51,10 +52,12 @@
     protected final AbstractListenerRegistry<LinkEvent, LinkListener>
             listenerRegistry = new AbstractListenerRegistry<>();
 
-    private final SimpleLinkStore store = new SimpleLinkStore();
     private final DeviceListener deviceListener = new InnerDeviceListener();
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected LinkStore store;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected DeviceService deviceService;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
diff --git a/core/trivial/src/main/java/org/onlab/onos/net/trivial/link/impl/SimpleLinkStore.java b/core/trivial/src/main/java/org/onlab/onos/net/trivial/link/impl/SimpleLinkStore.java
index 2ba7a30..1dd724c 100644
--- a/core/trivial/src/main/java/org/onlab/onos/net/trivial/link/impl/SimpleLinkStore.java
+++ b/core/trivial/src/main/java/org/onlab/onos/net/trivial/link/impl/SimpleLinkStore.java
@@ -3,12 +3,15 @@
 import com.google.common.collect.HashMultimap;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Multimap;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Service;
 import org.onlab.onos.net.ConnectPoint;
 import org.onlab.onos.net.DefaultLink;
 import org.onlab.onos.net.DeviceId;
 import org.onlab.onos.net.Link;
 import org.onlab.onos.net.link.LinkDescription;
 import org.onlab.onos.net.link.LinkEvent;
+import org.onlab.onos.net.link.LinkStore;
 import org.onlab.onos.net.provider.ProviderId;
 
 import java.util.Collections;
@@ -20,15 +23,15 @@
 
 import static org.onlab.onos.net.Link.Type.DIRECT;
 import static org.onlab.onos.net.Link.Type.INDIRECT;
-import static org.onlab.onos.net.link.LinkEvent.Type.LINK_ADDED;
-import static org.onlab.onos.net.link.LinkEvent.Type.LINK_REMOVED;
-import static org.onlab.onos.net.link.LinkEvent.Type.LINK_UPDATED;
+import static org.onlab.onos.net.link.LinkEvent.Type.*;
 
 /**
  * Manages inventory of infrastructure links using trivial in-memory structures
  * implementation.
  */
-class SimpleLinkStore {
+@Component(immediate = true)
+@Service
+public class SimpleLinkStore implements LinkStore {
 
     // Link inventory
     private final Map<LinkKey, DefaultLink> links = new ConcurrentHashMap<>();
@@ -39,62 +42,33 @@
 
     private static final Set<Link> EMPTY = ImmutableSet.copyOf(new Link[]{});
 
-    /**
-     * Returns the number of links in the store.
-     *
-     * @return number of links
-     */
-    int getLinkCount() {
+    @Override
+    public int getLinkCount() {
         return links.size();
     }
 
-    /**
-     * Returns an iterable collection of all links in the inventory.
-     *
-     * @return collection of all links
-     */
-    Iterable<Link> getLinks() {
+    @Override
+    public Iterable<Link> getLinks() {
         return Collections.unmodifiableSet(new HashSet<Link>(links.values()));
     }
 
-    /**
-     * Returns all links egressing from the specified device.
-     *
-     * @param deviceId device identifier
-     * @return set of device links
-     */
-    Set<Link> getDeviceEgressLinks(DeviceId deviceId) {
+    @Override
+    public Set<Link> getDeviceEgressLinks(DeviceId deviceId) {
         return ImmutableSet.copyOf(srcLinks.get(deviceId));
     }
 
-    /**
-     * Returns all links ingressing from the specified device.
-     *
-     * @param deviceId device identifier
-     * @return set of device links
-     */
-    Set<Link> getDeviceIngressLinks(DeviceId deviceId) {
+    @Override
+    public Set<Link> getDeviceIngressLinks(DeviceId deviceId) {
         return ImmutableSet.copyOf(dstLinks.get(deviceId));
     }
 
-    /**
-     * Returns the link between the two end-points.
-     *
-     * @param src source connection point
-     * @param dst destination connection point
-     * @return link or null if one not found between the end-points
-     */
-    Link getLink(ConnectPoint src, ConnectPoint dst) {
+    @Override
+    public Link getLink(ConnectPoint src, ConnectPoint dst) {
         return links.get(new LinkKey(src, dst));
     }
 
-    /**
-     * Returns all links egressing from the specified connection point.
-     *
-     * @param src source connection point
-     * @return set of connection point links
-     */
-    Set<Link> getEgressLinks(ConnectPoint src) {
+    @Override
+    public Set<Link> getEgressLinks(ConnectPoint src) {
         Set<Link> egress = new HashSet<>();
         for (Link link : srcLinks.get(src.deviceId())) {
             if (link.src().equals(src)) {
@@ -104,13 +78,8 @@
         return egress;
     }
 
-    /**
-     * Returns all links ingressing to the specified connection point.
-     *
-     * @param dst destination connection point
-     * @return set of connection point links
-     */
-    Set<Link> getIngressLinks(ConnectPoint dst) {
+    @Override
+    public Set<Link> getIngressLinks(ConnectPoint dst) {
         Set<Link> ingress = new HashSet<>();
         for (Link link : dstLinks.get(dst.deviceId())) {
             if (link.dst().equals(dst)) {
@@ -120,14 +89,7 @@
         return ingress;
     }
 
-    /**
-     * Creates a new link, or updates an existing one, based on the given
-     * information.
-     *
-     * @param providerId      provider identity
-     * @param linkDescription link description
-     * @return create or update link event, or null if no change resulted
-     */
+    @Override
     public LinkEvent createOrUpdateLink(ProviderId providerId,
                                         LinkDescription linkDescription) {
         LinkKey key = new LinkKey(linkDescription.src(), linkDescription.dst());
@@ -171,14 +133,8 @@
         return null;
     }
 
-    /**
-     * Removes the link based on the specified information.
-     *
-     * @param src link source
-     * @param dst link destination
-     * @return remove link event, or null if no change resulted
-     */
-    LinkEvent removeLink(ConnectPoint src, ConnectPoint dst) {
+    @Override
+    public LinkEvent removeLink(ConnectPoint src, ConnectPoint dst) {
         synchronized (this) {
             Link link = links.remove(new LinkKey(src, dst));
             if (link != null) {
diff --git a/core/trivial/src/test/java/org/onlab/onos/net/trivial/link/impl/SimpleLinkManagerTest.java b/core/trivial/src/test/java/org/onlab/onos/net/trivial/link/impl/LinkManagerTest.java
similarity index 98%
rename from core/trivial/src/test/java/org/onlab/onos/net/trivial/link/impl/SimpleLinkManagerTest.java
rename to core/trivial/src/test/java/org/onlab/onos/net/trivial/link/impl/LinkManagerTest.java
index 131af14..f7aeb08 100644
--- a/core/trivial/src/test/java/org/onlab/onos/net/trivial/link/impl/SimpleLinkManagerTest.java
+++ b/core/trivial/src/test/java/org/onlab/onos/net/trivial/link/impl/LinkManagerTest.java
@@ -38,7 +38,7 @@
 /**
  * Test codifying the link service & link provider service contracts.
  */
-public class SimpleLinkManagerTest {
+public class LinkManagerTest {
 
     private static final ProviderId PID = new ProviderId("of", "foo");
     private static final DeviceId DID1 = deviceId("of:foo");
@@ -50,7 +50,7 @@
     private static final PortNumber P3 = PortNumber.portNumber(3);
 
 
-    private SimpleLinkManager mgr;
+    private LinkManager mgr;
 
     protected LinkService service;
     protected LinkAdminService admin;
@@ -61,10 +61,11 @@
 
     @Before
     public void setUp() {
-        mgr = new SimpleLinkManager();
+        mgr = new LinkManager();
         service = mgr;
         admin = mgr;
         registry = mgr;
+        mgr.store = new SimpleLinkStore();
         mgr.eventDispatcher = new TestEventDispatcher();
         mgr.deviceService = new DeviceManager();
         mgr.activate();
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
index 858841f..0ef4e63 100644
--- 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
@@ -16,7 +16,7 @@
 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.SimpleLinkManager;
+import org.onlab.onos.net.trivial.link.impl.LinkManager;
 
 import java.util.List;
 import java.util.Set;
@@ -140,7 +140,7 @@
         }
     }
 
-    private class TestLinkService extends SimpleLinkManager {
+    private class TestLinkService extends LinkManager {
         TestLinkService() {
             eventDispatcher = new TestEventDispatcher();
             eventDispatcher.addSink(LinkEvent.class, listenerRegistry);