diff --git a/net/api/src/main/java/org/onlab/onos/net/DefaultDevice.java b/net/api/src/main/java/org/onlab/onos/net/DefaultDevice.java
index 8b4591c..69c10b7 100644
--- a/net/api/src/main/java/org/onlab/onos/net/DefaultDevice.java
+++ b/net/api/src/main/java/org/onlab/onos/net/DefaultDevice.java
@@ -4,7 +4,7 @@
 
 import java.util.Objects;
 
-import static com.google.common.base.Objects.toStringHelper;
+import static com.google.common.base.MoreObjects.toStringHelper;
 
 /**
  * Default infrastructure device model implementation.
diff --git a/net/api/src/main/java/org/onlab/onos/net/DefaultLink.java b/net/api/src/main/java/org/onlab/onos/net/DefaultLink.java
index b21b91c..1f7783c 100644
--- a/net/api/src/main/java/org/onlab/onos/net/DefaultLink.java
+++ b/net/api/src/main/java/org/onlab/onos/net/DefaultLink.java
@@ -1,28 +1,34 @@
 package org.onlab.onos.net;
 
-import org.onlab.onos.net.link.LinkDescription;
+import org.onlab.onos.net.provider.ProviderId;
 
 import java.util.Objects;
 
-import static com.google.common.base.Objects.toStringHelper;
+import static com.google.common.base.MoreObjects.toStringHelper;
 
 /**
  * Default infrastructure link model implementation.
  */
-public class DefaultLink implements LinkDescription {
+public class DefaultLink extends AbstractModel implements Link {
 
-    private ConnectPoint src;
-    private ConnectPoint dst;
+    private final ConnectPoint src;
+    private final ConnectPoint dst;
+    private final Type type;
 
     /**
      * Creates a link description using the supplied information.
      *
-     * @param src link source
-     * @param dst link destination
+     * @param providerId provider identity
+     * @param src        link source
+     * @param dst        link destination
+     * @param type       link type
      */
-    public DefaultLink(ConnectPoint src, ConnectPoint dst) {
+    public DefaultLink(ProviderId providerId, ConnectPoint src, ConnectPoint dst,
+                       Type type) {
+        super(providerId);
         this.src = src;
         this.dst = dst;
+        this.type = type;
     }
 
     @Override
@@ -35,18 +41,23 @@
         return dst;
     }
 
+    @Override
+    public Type type() {
+        return type;
+    }
 
     @Override
     public int hashCode() {
-        return Objects.hash(src, dst);
+        return Objects.hash(src, dst, type);
     }
 
     @Override
     public boolean equals(Object obj) {
-        if (obj instanceof DefaultDevice) {
+        if (obj instanceof DefaultLink) {
             final DefaultLink other = (DefaultLink) obj;
             return Objects.equals(this.src, other.src) &&
-                    Objects.equals(this.dst, other.dst);
+                    Objects.equals(this.dst, other.dst) &&
+                    Objects.equals(this.type, other.type);
         }
         return false;
     }
@@ -56,6 +67,7 @@
         return toStringHelper(this)
                 .add("src", src)
                 .add("dst", dst)
+                .add("type", type)
                 .toString();
     }
 
diff --git a/net/api/src/main/java/org/onlab/onos/net/DefaultPort.java b/net/api/src/main/java/org/onlab/onos/net/DefaultPort.java
index 56a2979..378cc37 100644
--- a/net/api/src/main/java/org/onlab/onos/net/DefaultPort.java
+++ b/net/api/src/main/java/org/onlab/onos/net/DefaultPort.java
@@ -2,7 +2,7 @@
 
 import java.util.Objects;
 
-import static com.google.common.base.Objects.toStringHelper;
+import static com.google.common.base.MoreObjects.toStringHelper;
 
 /**
  * Default port implementation.
diff --git a/net/api/src/main/java/org/onlab/onos/net/ElementId.java b/net/api/src/main/java/org/onlab/onos/net/ElementId.java
index 9f7dffb..73e1f29 100644
--- a/net/api/src/main/java/org/onlab/onos/net/ElementId.java
+++ b/net/api/src/main/java/org/onlab/onos/net/ElementId.java
@@ -3,7 +3,7 @@
 import java.net.URI;
 import java.util.Objects;
 
-import static com.google.common.base.Objects.toStringHelper;
+import static com.google.common.base.MoreObjects.toStringHelper;
 
 /**
  * Immutable representation of a network element identity.
diff --git a/net/api/src/main/java/org/onlab/onos/net/Link.java b/net/api/src/main/java/org/onlab/onos/net/Link.java
index e0f46b5..0f4275e 100644
--- a/net/api/src/main/java/org/onlab/onos/net/Link.java
+++ b/net/api/src/main/java/org/onlab/onos/net/Link.java
@@ -37,6 +37,13 @@
      */
     ConnectPoint dst();
 
+    /**
+     * Returns the link type.
+     *
+     * @return link type
+     */
+    Type type();
+
     // LinkInfo info(); // Additional link information / decorations
 
 }
diff --git a/net/api/src/main/java/org/onlab/onos/net/device/DefaultDeviceDescription.java b/net/api/src/main/java/org/onlab/onos/net/device/DefaultDeviceDescription.java
index 3d340b2..833625d 100644
--- a/net/api/src/main/java/org/onlab/onos/net/device/DefaultDeviceDescription.java
+++ b/net/api/src/main/java/org/onlab/onos/net/device/DefaultDeviceDescription.java
@@ -2,7 +2,7 @@
 
 import java.net.URI;
 
-import static com.google.common.base.Objects.toStringHelper;
+import static com.google.common.base.MoreObjects.toStringHelper;
 import static com.google.common.base.Preconditions.checkNotNull;
 import static org.onlab.onos.net.Device.Type;
 
diff --git a/net/api/src/main/java/org/onlab/onos/net/link/DefaultLinkDescription.java b/net/api/src/main/java/org/onlab/onos/net/link/DefaultLinkDescription.java
index 3ed7225..952c1dc 100644
--- a/net/api/src/main/java/org/onlab/onos/net/link/DefaultLinkDescription.java
+++ b/net/api/src/main/java/org/onlab/onos/net/link/DefaultLinkDescription.java
@@ -1,24 +1,28 @@
 package org.onlab.onos.net.link;
 
 import org.onlab.onos.net.ConnectPoint;
+import org.onlab.onos.net.Link;
 
 /**
  * Default implementation of immutable link description entity.
  */
 public class DefaultLinkDescription implements LinkDescription {
 
-    private ConnectPoint src;
-    private ConnectPoint dst;
+    private final ConnectPoint src;
+    private final ConnectPoint dst;
+    private final Link.Type type;
 
     /**
      * Creates a link description using the supplied information.
      *
-     * @param src link source
-     * @param dst link destination
+     * @param src  link source
+     * @param dst  link destination
+     * @param type link type
      */
-    public DefaultLinkDescription(ConnectPoint src, ConnectPoint dst) {
+    public DefaultLinkDescription(ConnectPoint src, ConnectPoint dst, Link.Type type) {
         this.src = src;
         this.dst = dst;
+        this.type = type;
     }
 
     @Override
@@ -31,4 +35,9 @@
         return dst;
     }
 
+    @Override
+    public Link.Type type() {
+        return null;
+    }
+
 }
diff --git a/net/api/src/main/java/org/onlab/onos/net/link/LinkAdminService.java b/net/api/src/main/java/org/onlab/onos/net/link/LinkAdminService.java
new file mode 100644
index 0000000..228b3c9
--- /dev/null
+++ b/net/api/src/main/java/org/onlab/onos/net/link/LinkAdminService.java
@@ -0,0 +1,27 @@
+package org.onlab.onos.net.link;
+
+import org.onlab.onos.net.ConnectPoint;
+import org.onlab.onos.net.DeviceId;
+
+/**
+ * Service for administering the inventory of infrastructure links.
+ */
+public interface LinkAdminService {
+
+    /**
+     * Removes all infrastructure links leading to and from the
+     * specified connection point.
+     *
+     * @param connectPoint connection point
+     */
+    void removeLinks(ConnectPoint connectPoint);
+
+    /**
+     * Removes all infrastructure links leading to and from the
+     * specified device.
+     *
+     * @param deviceId device identifier
+     */
+    void removeLinks(DeviceId deviceId);
+
+}
diff --git a/net/api/src/main/java/org/onlab/onos/net/link/LinkDescription.java b/net/api/src/main/java/org/onlab/onos/net/link/LinkDescription.java
index 83af07c..b1be82c 100644
--- a/net/api/src/main/java/org/onlab/onos/net/link/LinkDescription.java
+++ b/net/api/src/main/java/org/onlab/onos/net/link/LinkDescription.java
@@ -1,6 +1,7 @@
 package org.onlab.onos.net.link;
 
 import org.onlab.onos.net.ConnectPoint;
+import org.onlab.onos.net.Link;
 
 /**
  * Describes an infrastructure link.
@@ -21,5 +22,13 @@
      */
     ConnectPoint dst();
 
+    /**
+     * Returns the link type.
+     *
+     * @return link type
+     */
+    Link.Type type();
+
+
     // Add further link attributes
 }
diff --git a/net/api/src/main/java/org/onlab/onos/net/link/LinkProviderService.java b/net/api/src/main/java/org/onlab/onos/net/link/LinkProviderService.java
index 7969022..7019660 100644
--- a/net/api/src/main/java/org/onlab/onos/net/link/LinkProviderService.java
+++ b/net/api/src/main/java/org/onlab/onos/net/link/LinkProviderService.java
@@ -1,5 +1,7 @@
 package org.onlab.onos.net.link;
 
+import org.onlab.onos.net.ConnectPoint;
+import org.onlab.onos.net.DeviceId;
 import org.onlab.onos.net.provider.ProviderService;
 
 /**
@@ -21,4 +23,20 @@
      */
     void linkVanished(LinkDescription linkDescription);
 
+    /**
+     * Signals that infrastructure links associated with the specified
+     * connect point have vanished.
+     *
+     * @param connectPoint connect point
+     */
+    void linksVanished(ConnectPoint connectPoint);
+
+    /**
+     * Signals that infrastructure links associated with the specified
+     * device have vanished.
+     *
+     * @param deviceId device identifier
+     */
+    void linksVanished(DeviceId deviceId);
+
 }
diff --git a/net/api/src/main/java/org/onlab/onos/net/link/LinkService.java b/net/api/src/main/java/org/onlab/onos/net/link/LinkService.java
index fadecdb..77afb7a 100644
--- a/net/api/src/main/java/org/onlab/onos/net/link/LinkService.java
+++ b/net/api/src/main/java/org/onlab/onos/net/link/LinkService.java
@@ -1,5 +1,6 @@
 package org.onlab.onos.net.link;
 
+import org.onlab.onos.net.ConnectPoint;
 import org.onlab.onos.net.DeviceId;
 import org.onlab.onos.net.Link;
 
@@ -11,6 +12,13 @@
 public interface LinkService {
 
     /**
+     * Returns the count of all known infrastructure links.
+     *
+     * @return number of infrastructure links
+     */
+    int getLinkCount();
+
+    /**
      * Returns a collection of all known infrastructure links.
      *
      * @return all infrastructure links
@@ -43,6 +51,43 @@
     Set<Link> getDeviceInressLinks(DeviceId deviceId);
 
     /**
+     * Returns set of all infrastructure links leading to and from the
+     * specified connection point.
+     *
+     * @param connectPoint connection point
+     * @return set of links
+     */
+    Set<Link> getLinks(ConnectPoint connectPoint);
+
+    /**
+     * Returns set of all infrastructure links leading from the specified
+     * connection point.
+     *
+     * @param connectPoint connection point
+     * @return set of device egress links
+     */
+    Set<Link> getEgressLinks(ConnectPoint connectPoint);
+
+    /**
+     * Returns set of all infrastructure links leading to the specified
+     * connection point.
+     *
+     * @param connectPoint connection point
+     * @return set of device ingress links
+     */
+    Set<Link> getInressLinks(ConnectPoint connectPoint);
+
+    /**
+     * Returns set of all infrastructure links between the specified source
+     * and destination connection points.
+     *
+     * @param src source connection point
+     * @param dst destination connection point
+     * @return set of links
+     */
+    Set<Link> getLinks(ConnectPoint src, ConnectPoint dst);
+
+    /**
      * Adds the specified link listener.
      *
      * @param listener link listener
diff --git a/net/api/src/main/java/org/onlab/onos/net/provider/ProviderId.java b/net/api/src/main/java/org/onlab/onos/net/provider/ProviderId.java
index 3af20ad..a945354 100644
--- a/net/api/src/main/java/org/onlab/onos/net/provider/ProviderId.java
+++ b/net/api/src/main/java/org/onlab/onos/net/provider/ProviderId.java
@@ -2,7 +2,7 @@
 
 import java.util.Objects;
 
-import static com.google.common.base.Objects.toStringHelper;
+import static com.google.common.base.MoreObjects.toStringHelper;
 
 /**
  * Notion of provider identity.
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 b8f5788..cfe25f7 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
@@ -152,6 +152,7 @@
         public void deviceConnected(DeviceId deviceId, DeviceDescription deviceDescription) {
             checkNotNull(deviceId, DEVICE_ID_NULL);
             checkNotNull(deviceDescription, DEVICE_DESCRIPTION_NULL);
+            checkValidity();
             log.info("Device {} connected", deviceId);
             DeviceEvent event = store.createOrUpdateDevice(provider().id(),
                                                            deviceId, deviceDescription);
@@ -161,6 +162,7 @@
         @Override
         public void deviceDisconnected(DeviceId deviceId) {
             checkNotNull(deviceId, DEVICE_ID_NULL);
+            checkValidity();
             log.info("Device {} disconnected", deviceId);
             DeviceEvent event = store.markOffline(deviceId);
             post(event);
@@ -170,6 +172,7 @@
         public void updatePorts(DeviceId deviceId, List<PortDescription> portDescriptions) {
             checkNotNull(deviceId, DEVICE_ID_NULL);
             checkNotNull(portDescriptions, "Port descriptions list cannot be null");
+            checkValidity();
             log.info("Device {} ports updated", deviceId);
             List<DeviceEvent> events = store.updatePorts(deviceId, portDescriptions);
             for (DeviceEvent event : events) {
@@ -181,13 +184,14 @@
         public void portStatusChanged(DeviceId deviceId, PortDescription portDescription) {
             checkNotNull(deviceId, DEVICE_ID_NULL);
             checkNotNull(portDescription, PORT_DESCRIPTION_NULL);
+            checkValidity();
             log.info("Device {} port status changed", deviceId);
             DeviceEvent event = store.updatePortStatus(deviceId, portDescription);
             post(event);
         }
     }
 
-    // Posts the specified event to a local event dispatcher
+    // Posts the specified event to the local event dispatcher.
     private void post(DeviceEvent event) {
         if (event != null && eventDispatcher != null) {
             eventDispatcher.post(event);
diff --git a/net/core/trivial/src/main/java/org/onlab/onos/net/trivial/impl/SimpleDeviceStore.java b/net/core/trivial/src/main/java/org/onlab/onos/net/trivial/impl/SimpleDeviceStore.java
index dd63469..3c05aba 100644
--- a/net/core/trivial/src/main/java/org/onlab/onos/net/trivial/impl/SimpleDeviceStore.java
+++ b/net/core/trivial/src/main/java/org/onlab/onos/net/trivial/impl/SimpleDeviceStore.java
@@ -45,7 +45,7 @@
      *
      * @return number of devices
      */
-    public int getDeviceCount() {
+    int getDeviceCount() {
         return devices.size();
     }
 
diff --git a/net/core/trivial/src/main/java/org/onlab/onos/net/trivial/impl/SimpleLinkManager.java b/net/core/trivial/src/main/java/org/onlab/onos/net/trivial/impl/SimpleLinkManager.java
index b5d8cc4..1c7306f 100644
--- a/net/core/trivial/src/main/java/org/onlab/onos/net/trivial/impl/SimpleLinkManager.java
+++ b/net/core/trivial/src/main/java/org/onlab/onos/net/trivial/impl/SimpleLinkManager.java
@@ -1,5 +1,6 @@
 package org.onlab.onos.net.trivial.impl;
 
+import com.google.common.collect.Sets;
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Deactivate;
@@ -8,16 +9,24 @@
 import org.apache.felix.scr.annotations.Service;
 import org.onlab.onos.event.AbstractListenerRegistry;
 import org.onlab.onos.event.EventDeliveryService;
+import org.onlab.onos.net.ConnectPoint;
+import org.onlab.onos.net.DeviceId;
+import org.onlab.onos.net.Link;
+import org.onlab.onos.net.link.LinkAdminService;
 import org.onlab.onos.net.link.LinkDescription;
 import org.onlab.onos.net.link.LinkEvent;
 import org.onlab.onos.net.link.LinkListener;
 import org.onlab.onos.net.link.LinkProvider;
 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.provider.AbstractProviderRegistry;
 import org.onlab.onos.net.provider.AbstractProviderService;
 import org.slf4j.Logger;
 
+import java.util.Set;
+
+import static com.google.common.base.Preconditions.checkNotNull;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
@@ -27,7 +36,11 @@
 @Service
 public class SimpleLinkManager
         extends AbstractProviderRegistry<LinkProvider, LinkProviderService>
-        implements LinkProviderRegistry {
+        implements LinkService, LinkAdminService, LinkProviderRegistry {
+
+    private static final String DEVICE_ID_NULL = "Device ID cannot be null";
+    private static final String LINK_DESC_NULL = "Link description cannot be null";
+    private static final String CONNECT_POINT_NULL = "Connection point cannot be null";
 
     private final Logger log = getLogger(getClass());
 
@@ -56,6 +69,82 @@
         return new InternalLinkProviderService(provider);
     }
 
+    @Override
+    public int getLinkCount() {
+        return store.getLinkCount();
+    }
+
+    @Override
+    public Iterable<Link> getLinks() {
+        return store.getLinks();
+    }
+
+    @Override
+    public Set<Link> getDeviceLinks(DeviceId deviceId) {
+        checkNotNull(deviceId, DEVICE_ID_NULL);
+        return Sets.union(store.getDeviceEgressLinks(deviceId),
+                          store.getDeviceIngressLinks(deviceId));
+    }
+
+    @Override
+    public Set<Link> getDeviceEgressLinks(DeviceId deviceId) {
+        checkNotNull(deviceId, DEVICE_ID_NULL);
+        return store.getDeviceEgressLinks(deviceId);
+    }
+
+    @Override
+    public Set<Link> getDeviceInressLinks(DeviceId deviceId) {
+        checkNotNull(deviceId, DEVICE_ID_NULL);
+        return store.getDeviceIngressLinks(deviceId);
+    }
+
+    @Override
+    public Set<Link> getLinks(ConnectPoint connectPoint) {
+        checkNotNull(connectPoint, CONNECT_POINT_NULL);
+        return Sets.union(store.getEgressLinks(connectPoint),
+                          store.getIngressLinks(connectPoint));
+    }
+
+    @Override
+    public Set<Link> getEgressLinks(ConnectPoint connectPoint) {
+        checkNotNull(connectPoint, CONNECT_POINT_NULL);
+        return store.getEgressLinks(connectPoint);
+    }
+
+    @Override
+    public Set<Link> getInressLinks(ConnectPoint connectPoint) {
+        checkNotNull(connectPoint, CONNECT_POINT_NULL);
+        return store.getIngressLinks(connectPoint);
+    }
+
+    @Override
+    public Set<Link> getLinks(ConnectPoint src, ConnectPoint dst) {
+        checkNotNull(src, CONNECT_POINT_NULL);
+        checkNotNull(dst, CONNECT_POINT_NULL);
+        return Sets.intersection(store.getEgressLinks(src),
+                                 store.getIngressLinks(dst));
+    }
+
+    @Override
+    public void removeLinks(ConnectPoint connectPoint) {
+        removeLinks(getLinks(connectPoint));
+    }
+
+    @Override
+    public void removeLinks(DeviceId deviceId) {
+        removeLinks(getDeviceLinks(deviceId));
+    }
+
+    @Override
+    public void addListener(LinkListener listener) {
+        listenerRegistry.addListener(listener);
+    }
+
+    @Override
+    public void removeListener(LinkListener listener) {
+        listenerRegistry.removeListener(listener);
+    }
+
     // Personalized link provider service issued to the supplied provider.
     private class InternalLinkProviderService extends AbstractProviderService<LinkProvider>
             implements LinkProviderService {
@@ -66,12 +155,54 @@
 
         @Override
         public void linkDetected(LinkDescription linkDescription) {
+            checkNotNull(linkDescription, LINK_DESC_NULL);
+            checkValidity();
             log.info("Link {} detected", linkDescription);
+            LinkEvent event = store.createOrUpdateLink(provider().id(),
+                                                       linkDescription);
+            post(event);
         }
 
         @Override
         public void linkVanished(LinkDescription linkDescription) {
+            checkNotNull(linkDescription, LINK_DESC_NULL);
+            checkValidity();
             log.info("Link {} vanished", linkDescription);
+            LinkEvent event = store.removeLink(linkDescription.src(),
+                                               linkDescription.dst());
+            post(event);
+        }
+
+        @Override
+        public void linksVanished(ConnectPoint connectPoint) {
+            checkNotNull(connectPoint, "Connect point cannot be null");
+            checkValidity();
+            log.info("Link for connection point {} vanished", connectPoint);
+            removeLinks(getLinks(connectPoint));
+        }
+
+        @Override
+        public void linksVanished(DeviceId deviceId) {
+            checkNotNull(deviceId, DEVICE_ID_NULL);
+            checkValidity();
+            log.info("Link for device {} vanished", deviceId);
+            removeLinks(getDeviceLinks(deviceId));
         }
     }
+
+    // Removes all links in the specified set and emits appropriate events.
+    private void removeLinks(Set<Link> links) {
+        for (Link link : links) {
+            LinkEvent event = store.removeLink(link.src(), link.dst());
+            post(event);
+        }
+    }
+
+    // Posts the specified event to the local event dispatcher.
+    private void post(LinkEvent event) {
+        if (event != null && eventDispatcher != null) {
+            eventDispatcher.post(event);
+        }
+    }
+
 }
diff --git a/net/core/trivial/src/main/java/org/onlab/onos/net/trivial/impl/SimpleLinkStore.java b/net/core/trivial/src/main/java/org/onlab/onos/net/trivial/impl/SimpleLinkStore.java
index 8b6a53d..c1d6273 100644
--- a/net/core/trivial/src/main/java/org/onlab/onos/net/trivial/impl/SimpleLinkStore.java
+++ b/net/core/trivial/src/main/java/org/onlab/onos/net/trivial/impl/SimpleLinkStore.java
@@ -1,8 +1,184 @@
 package org.onlab.onos.net.trivial.impl;
 
+import com.google.common.collect.HashMultimap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Multimap;
+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.provider.ProviderId;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+
 /**
  * Manages inventory of infrastructure links using trivial in-memory link
  * implementation.
  */
-public class SimpleLinkStore {
+class SimpleLinkStore {
+
+    // Link inventory
+    private final Map<LinkKey, DefaultLink> links = new ConcurrentHashMap<>();
+
+    // Egress and ingress link sets
+    private final Multimap<DeviceId, Link> srcLinks = HashMultimap.create();
+    private final Multimap<DeviceId, Link> dstLinks = HashMultimap.create();
+
+    private static final Set<Link> EMPTY = ImmutableSet.copyOf(new Link[]{});
+
+    /**
+     * Returns the number of links in the store.
+     *
+     * @return number of links
+     */
+    int getLinkCount() {
+        return links.size();
+    }
+
+    /**
+     * Returns an iterable collection of all links in the inventory.
+     *
+     * @return collection of all links
+     */
+    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) {
+        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) {
+        return ImmutableSet.copyOf(dstLinks.get(deviceId));
+    }
+
+    /**
+     * 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) {
+        Set<Link> egress = new HashSet<>();
+        for (Link link : srcLinks.get(src.deviceId())) {
+            if (link.src().equals(src)) {
+                egress.add(link);
+            }
+        }
+        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) {
+        Set<Link> ingress = new HashSet<>();
+        for (Link link : dstLinks.get(dst.deviceId())) {
+            if (link.src().equals(dst)) {
+                ingress.add(link);
+            }
+        }
+        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
+     */
+    public LinkEvent createOrUpdateLink(ProviderId providerId,
+                                        LinkDescription linkDescription) {
+        LinkKey key = new LinkKey(linkDescription.src(), linkDescription.dst());
+        DefaultLink link = links.get(key);
+        if (link == null) {
+            return createLink(providerId, key, linkDescription);
+        }
+        return updateLink(link, linkDescription);
+    }
+
+    // Creates and stores the link and returns the appropriate event.
+    private LinkEvent createLink(ProviderId providerId, LinkKey key,
+                                 LinkDescription linkDescription) {
+        DefaultLink link = new DefaultLink(providerId, key.src, key.dst,
+                                           linkDescription.type());
+        synchronized (this) {
+            links.put(key, link);
+            srcLinks.put(link.src().deviceId(), link);
+            dstLinks.put(link.dst().deviceId(), link);
+        }
+        return new LinkEvent(LinkEvent.Type.LINK_ADDED, link);
+    }
+
+    // Updates, if necessary the specified link and returns the appropriate event.
+    private LinkEvent updateLink(DefaultLink link, LinkDescription linkDescription) {
+        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) {
+        synchronized (this) {
+            Link link = links.remove(new LinkKey(src, dst));
+            srcLinks.remove(link.src().deviceId(), link);
+            dstLinks.remove(link.dst().deviceId(), link);
+            return link == null ? null : new LinkEvent(LinkEvent.Type.LINK_REMOVED, link);
+        }
+    }
+
+    // Auxiliary key to track links.
+    private class LinkKey {
+        final ConnectPoint src;
+        final ConnectPoint dst;
+
+        LinkKey(ConnectPoint src, ConnectPoint dst) {
+            this.src = src;
+            this.dst = dst;
+        }
+
+        @Override
+        public int hashCode() {
+            return Objects.hash(src, dst);
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+            if (obj instanceof LinkKey) {
+                final LinkKey other = (LinkKey) obj;
+                return Objects.equals(this.src, other.src) &&
+                        Objects.equals(this.dst, other.dst);
+            }
+            return false;
+        }
+    }
 }
diff --git a/pom.xml b/pom.xml
index 4f0dd3c..28b3fff 100644
--- a/pom.xml
+++ b/pom.xml
@@ -58,13 +58,13 @@
             <dependency>
                 <groupId>com.google.guava</groupId>
                 <artifactId>guava</artifactId>
-                <version>17.0</version>
+                <version>18.0</version>
             </dependency>
 
             <dependency>
                 <groupId>com.google.guava</groupId>
                 <artifactId>guava-testlib</artifactId>
-                <version>17.0</version>
+                <version>18.0</version>
                 <scope>test</scope>
             </dependency>
 
diff --git a/utils/misc/src/main/java/org/onlab/graph/AbstractEdge.java b/utils/misc/src/main/java/org/onlab/graph/AbstractEdge.java
index 7ee86f4..163a147 100644
--- a/utils/misc/src/main/java/org/onlab/graph/AbstractEdge.java
+++ b/utils/misc/src/main/java/org/onlab/graph/AbstractEdge.java
@@ -2,6 +2,7 @@
 
 import java.util.Objects;
 
+import static com.google.common.base.MoreObjects.toStringHelper;
 import static com.google.common.base.Preconditions.checkNotNull;
 
 /**
@@ -49,7 +50,7 @@
 
     @Override
     public String toString() {
-        return com.google.common.base.Objects.toStringHelper(this)
+        return toStringHelper(this)
                 .add("src", src)
                 .add("dst", dst)
                 .toString();
diff --git a/utils/misc/src/main/java/org/onlab/graph/AdjacencyListsGraph.java b/utils/misc/src/main/java/org/onlab/graph/AdjacencyListsGraph.java
index e1e0524..07dc70b 100644
--- a/utils/misc/src/main/java/org/onlab/graph/AdjacencyListsGraph.java
+++ b/utils/misc/src/main/java/org/onlab/graph/AdjacencyListsGraph.java
@@ -6,6 +6,7 @@
 import java.util.Objects;
 import java.util.Set;
 
+import static com.google.common.base.MoreObjects.toStringHelper;
 import static com.google.common.base.Preconditions.checkNotNull;
 
 /**
@@ -94,7 +95,7 @@
 
     @Override
     public String toString() {
-        return com.google.common.base.Objects.toStringHelper(this)
+        return toStringHelper(this)
                 .add("vertexes", vertexes)
                 .add("edges", edges)
                 .toString();
diff --git a/utils/misc/src/main/java/org/onlab/graph/DefaultMutablePath.java b/utils/misc/src/main/java/org/onlab/graph/DefaultMutablePath.java
index be7ad18..401e9e9 100644
--- a/utils/misc/src/main/java/org/onlab/graph/DefaultMutablePath.java
+++ b/utils/misc/src/main/java/org/onlab/graph/DefaultMutablePath.java
@@ -6,6 +6,7 @@
 import java.util.List;
 import java.util.Objects;
 
+import static com.google.common.base.MoreObjects.toStringHelper;
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
 
@@ -91,7 +92,7 @@
 
     @Override
     public String toString() {
-        return com.google.common.base.Objects.toStringHelper(this)
+        return toStringHelper(this)
                 .add("src", src())
                 .add("dst", dst())
                 .add("cost", cost)
diff --git a/utils/misc/src/main/java/org/onlab/graph/DefaultPath.java b/utils/misc/src/main/java/org/onlab/graph/DefaultPath.java
index d7fc9e8a..a43dd0f 100644
--- a/utils/misc/src/main/java/org/onlab/graph/DefaultPath.java
+++ b/utils/misc/src/main/java/org/onlab/graph/DefaultPath.java
@@ -6,6 +6,7 @@
 import java.util.List;
 import java.util.Objects;
 
+import static com.google.common.base.MoreObjects.toStringHelper;
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
 
@@ -56,7 +57,7 @@
 
     @Override
     public String toString() {
-        return com.google.common.base.Objects.toStringHelper(this)
+        return toStringHelper(this)
                 .add("src", src)
                 .add("dst", dst)
                 .add("cost", cost)
diff --git a/utils/misc/src/main/java/org/onlab/graph/Heap.java b/utils/misc/src/main/java/org/onlab/graph/Heap.java
index 21eeb85..ecc4759 100644
--- a/utils/misc/src/main/java/org/onlab/graph/Heap.java
+++ b/utils/misc/src/main/java/org/onlab/graph/Heap.java
@@ -7,6 +7,7 @@
 import java.util.List;
 import java.util.Objects;
 
+import static com.google.common.base.MoreObjects.toStringHelper;
 import static com.google.common.base.Preconditions.checkNotNull;
 
 /**
@@ -181,7 +182,7 @@
 
     @Override
     public String toString() {
-        return com.google.common.base.Objects.toStringHelper(this)
+        return toStringHelper(this)
                 .add("data", data)
                 .add("comparator", comparator)
                 .toString();
diff --git a/utils/misc/src/test/java/org/onlab/graph/TestEdge.java b/utils/misc/src/test/java/org/onlab/graph/TestEdge.java
index 225690c..0accab3 100644
--- a/utils/misc/src/test/java/org/onlab/graph/TestEdge.java
+++ b/utils/misc/src/test/java/org/onlab/graph/TestEdge.java
@@ -2,7 +2,7 @@
 
 import java.util.Objects;
 
-import static com.google.common.base.Objects.toStringHelper;
+import static com.google.common.base.MoreObjects.toStringHelper;
 
 /**
  * Test edge.
