diff --git a/core/api/src/test/java/org/onosproject/net/config/NetworkConfigRegistryAdapter.java b/core/api/src/test/java/org/onosproject/net/config/NetworkConfigRegistryAdapter.java
index 6201c0b..e005c9a 100644
--- a/core/api/src/test/java/org/onosproject/net/config/NetworkConfigRegistryAdapter.java
+++ b/core/api/src/test/java/org/onosproject/net/config/NetworkConfigRegistryAdapter.java
@@ -17,6 +17,8 @@
 
 import java.util.Set;
 
+import com.google.common.collect.ImmutableSet;
+
 /**
  * Test adapter for network configuration service registry.
  */
@@ -29,11 +31,11 @@
     }
 
     public Set<ConfigFactory> getConfigFactories() {
-        return null;
+        return ImmutableSet.of();
     }
 
     public <S, C extends Config<S>> Set<ConfigFactory<S, C>> getConfigFactories(Class<S> subjectClass) {
-        return null;
+        return ImmutableSet.of();
     }
 
     public <S, C extends Config<S>> ConfigFactory<S, C> getConfigFactory(Class<C> configClass) {
diff --git a/core/api/src/test/java/org/onosproject/net/config/NetworkConfigServiceAdapter.java b/core/api/src/test/java/org/onosproject/net/config/NetworkConfigServiceAdapter.java
index 562fe5c..0553a2b 100644
--- a/core/api/src/test/java/org/onosproject/net/config/NetworkConfigServiceAdapter.java
+++ b/core/api/src/test/java/org/onosproject/net/config/NetworkConfigServiceAdapter.java
@@ -16,6 +16,7 @@
 package org.onosproject.net.config;
 
 import com.fasterxml.jackson.databind.JsonNode;
+import com.google.common.collect.ImmutableSet;
 
 import java.util.Set;
 
@@ -25,7 +26,7 @@
 public class NetworkConfigServiceAdapter implements NetworkConfigService {
     @Override
     public Set<Class> getSubjectClasses() {
-        return null;
+        return ImmutableSet.of();
     }
 
     @Override
@@ -45,17 +46,17 @@
 
     @Override
     public <S> Set<S> getSubjects(Class<S> subjectClass) {
-        return null;
+        return ImmutableSet.of();
     }
 
     @Override
     public <S, C extends Config<S>> Set<S> getSubjects(Class<S> subjectClass, Class<C> configClass) {
-        return null;
+        return ImmutableSet.of();
     }
 
     @Override
     public <S> Set<? extends Config<S>> getConfigs(S subject) {
-        return null;
+        return ImmutableSet.of();
     }
 
     @Override
diff --git a/core/api/src/test/java/org/onosproject/net/link/DefaultLinkDescriptionTest.java b/core/api/src/test/java/org/onosproject/net/link/DefaultLinkDescriptionTest.java
index 90b0459..6ade7f92 100644
--- a/core/api/src/test/java/org/onosproject/net/link/DefaultLinkDescriptionTest.java
+++ b/core/api/src/test/java/org/onosproject/net/link/DefaultLinkDescriptionTest.java
@@ -16,10 +16,15 @@
 package org.onosproject.net.link;
 
 import org.junit.Test;
+import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.DefaultAnnotations;
 import org.onosproject.net.DeviceId;
+import org.onosproject.net.Link;
+import org.onosproject.net.NetTestTools;
 import org.onosproject.net.PortNumber;
 
+import com.google.common.testing.EqualsTester;
+
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 import static org.onosproject.net.DefaultLinkTest.cp;
@@ -44,7 +49,48 @@
         assertEquals("incorrect src", cp(DID1, P1), desc.src());
         assertEquals("incorrect dst", cp(DID2, P1), desc.dst());
         assertEquals("incorrect type", DIRECT, desc.type());
-        assertTrue("incorrect annotatios", desc.toString().contains("Key=Value"));
+        assertTrue("incorrect annotations", desc.toString().contains("Key=Value"));
     }
 
+    /**
+     * Tests the equals(), hashCode() and toString() methods.
+     */
+    @Test
+    public void testEquals() {
+        ConnectPoint connectPoint1 = NetTestTools.connectPoint("sw1", 1);
+        ConnectPoint connectPoint2 = NetTestTools.connectPoint("sw2", 2);
+        ConnectPoint connectPoint3 = NetTestTools.connectPoint("sw3", 3);
+
+        DefaultLinkDescription link1 =
+                new DefaultLinkDescription(connectPoint1, connectPoint2,
+                                           Link.Type.DIRECT);
+        DefaultLinkDescription sameAsLink1 =
+                new DefaultLinkDescription(connectPoint1, connectPoint2,
+                                           Link.Type.DIRECT);
+        DefaultLinkDescription link2 =
+                new DefaultLinkDescription(connectPoint1, connectPoint2,
+                                           Link.Type.INDIRECT);
+        DefaultLinkDescription link3 =
+                new DefaultLinkDescription(connectPoint1, connectPoint3,
+                                           Link.Type.DIRECT);
+        DefaultLinkDescription link4 =
+                new DefaultLinkDescription(connectPoint2, connectPoint3,
+                                           Link.Type.DIRECT);
+        DefaultLinkDescription link5 =
+                new DefaultLinkDescription(connectPoint1, connectPoint2,
+                                           Link.Type.DIRECT, false);
+        DefaultLinkDescription link6 =
+                new DefaultLinkDescription(connectPoint2, connectPoint3,
+                                           Link.Type.DIRECT, DA);
+
+        new EqualsTester()
+                .addEqualityGroup(link1, sameAsLink1)
+                .addEqualityGroup(link2)
+                .addEqualityGroup(link3)
+                .addEqualityGroup(link4)
+                .addEqualityGroup(link5)
+                .addEqualityGroup(link6)
+                .testEquals();
+
+    }
 }
diff --git a/core/api/src/test/java/org/onosproject/net/link/LinkProviderRegistryAdapter.java b/core/api/src/test/java/org/onosproject/net/link/LinkProviderRegistryAdapter.java
new file mode 100644
index 0000000..00cb58b
--- /dev/null
+++ b/core/api/src/test/java/org/onosproject/net/link/LinkProviderRegistryAdapter.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2016 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.net.link;
+
+import java.util.Set;
+
+import org.onosproject.net.provider.ProviderId;
+
+import com.google.common.collect.ImmutableSet;
+
+/**
+ * Testing adapter for the LinkProviderRegistry API.
+ */
+public class LinkProviderRegistryAdapter implements LinkProviderRegistry {
+
+    LinkProviderServiceAdapter providerService = null;
+
+    @Override
+    public LinkProviderService register(LinkProvider provider) {
+        providerService = new LinkProviderServiceAdapter(provider);
+        return providerService;
+    }
+
+    @Override
+    public void unregister(LinkProvider provider) {
+    }
+
+    @Override
+    public Set<ProviderId> getProviders() {
+        return ImmutableSet.of(providerService.provider().id());
+    }
+
+    public LinkProviderServiceAdapter registeredProvider() {
+        return providerService;
+    }
+}
diff --git a/core/api/src/test/java/org/onosproject/net/link/LinkProviderServiceAdapter.java b/core/api/src/test/java/org/onosproject/net/link/LinkProviderServiceAdapter.java
new file mode 100644
index 0000000..7e37fae
--- /dev/null
+++ b/core/api/src/test/java/org/onosproject/net/link/LinkProviderServiceAdapter.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2016 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.net.link;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.LinkKey;
+import org.onosproject.net.provider.AbstractProviderService;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+
+public class LinkProviderServiceAdapter
+        extends AbstractProviderService<LinkProvider>
+        implements LinkProviderService {
+
+    List<DeviceId> vanishedDpid = Lists.newLinkedList();
+    List<Long> vanishedPort = Lists.newLinkedList();
+    Map<DeviceId, DeviceId> discoveredLinks = Maps.newHashMap();
+    Map<LinkKey, LinkDescription> discoveredLinkDescriptions = new HashMap<>();
+
+    protected LinkProviderServiceAdapter(LinkProvider provider) {
+        super(provider);
+    }
+
+    @Override
+    public void linkDetected(LinkDescription linkDescription) {
+        LinkKey key = LinkKey.linkKey(linkDescription.src(), linkDescription.dst());
+        discoveredLinkDescriptions.put(key, linkDescription);
+        DeviceId sDid = linkDescription.src().deviceId();
+        DeviceId dDid = linkDescription.dst().deviceId();
+        discoveredLinks.put(sDid, dDid);
+    }
+
+    @Override
+    public void linkVanished(LinkDescription linkDescription) {
+        LinkKey key = LinkKey.linkKey(linkDescription.src(), linkDescription.dst());
+        discoveredLinkDescriptions.remove(key);
+    }
+
+    @Override
+    public void linksVanished(ConnectPoint connectPoint) {
+        vanishedPort.add(connectPoint.port().toLong());
+
+    }
+
+    @Override
+    public void linksVanished(DeviceId deviceId) {
+        vanishedDpid.add(deviceId);
+    }
+
+    public List<DeviceId> vanishedDpid() {
+        return vanishedDpid;
+    }
+
+    public List<Long> vanishedPort() {
+        return vanishedPort;
+    }
+
+    public Map<DeviceId, DeviceId> discoveredLinks() {
+        return discoveredLinks;
+    }
+
+    public Map<LinkKey, LinkDescription> discoveredLinkDescriptions() {
+        return discoveredLinkDescriptions;
+    }
+}
