diff --git a/core/api/src/main/java/org/onosproject/net/device/DefaultPortDescription.java b/core/api/src/main/java/org/onosproject/net/device/DefaultPortDescription.java
index ca57944..300d915 100644
--- a/core/api/src/main/java/org/onosproject/net/device/DefaultPortDescription.java
+++ b/core/api/src/main/java/org/onosproject/net/device/DefaultPortDescription.java
@@ -69,7 +69,7 @@
     }
 
     // Default constructor for serialization
-    private DefaultPortDescription() {
+    protected DefaultPortDescription() {
         this.number = null;
         this.isEnabled = false;
         this.portSpeed = DEFAULT_SPEED;
diff --git a/core/api/src/test/java/org/onosproject/net/DefaultDisjointPathTest.java b/core/api/src/test/java/org/onosproject/net/DefaultDisjointPathTest.java
new file mode 100644
index 0000000..4dd7f11
--- /dev/null
+++ b/core/api/src/test/java/org/onosproject/net/DefaultDisjointPathTest.java
@@ -0,0 +1,107 @@
+package org.onosproject.net;
+
+import java.util.List;
+
+import org.junit.Test;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.testing.EqualsTester;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.onosproject.net.NetTestTools.PID;
+
+/**
+ * Unit tests for the DefaultDisjointPathTest.
+ */
+public class DefaultDisjointPathTest {
+    private static DefaultLink link1 =
+            DefaultLink.builder()
+                    .type(Link.Type.DIRECT)
+                    .providerId(PID)
+                    .src(NetTestTools.connectPoint("dev1", 1))
+                    .dst(NetTestTools.connectPoint("dev2", 1)).build();
+
+    private static DefaultLink link2 =
+            DefaultLink.builder()
+                    .type(Link.Type.DIRECT)
+                    .providerId(PID)
+                    .src(NetTestTools.connectPoint("dev1", 1))
+                    .dst(NetTestTools.connectPoint("dev2", 1)).build();
+
+    private static DefaultLink link3 =
+            DefaultLink.builder()
+                    .type(Link.Type.DIRECT)
+                    .providerId(PID)
+                    .src(NetTestTools.connectPoint("dev2", 1))
+                    .dst(NetTestTools.connectPoint("dev3", 1)).build();
+
+    private static List<Link> links1 = ImmutableList.of(link1, link2);
+    private static DefaultPath path1 =
+            new DefaultPath(PID, links1, 1.0);
+
+    private static List<Link> links2 = ImmutableList.of(link2, link1);
+    private static DefaultPath path2 =
+            new DefaultPath(PID, links2, 2.0);
+
+    private static List<Link> links3 = ImmutableList.of(link1, link2, link3);
+    private static DefaultPath path3 =
+            new DefaultPath(PID, links3, 3.0);
+
+    private static DefaultDisjointPath disjointPath1 =
+            new DefaultDisjointPath(PID, path1, path2);
+    private static DefaultDisjointPath sameAsDisjointPath1 =
+            new DefaultDisjointPath(PID, path1, path2);
+    private static DefaultDisjointPath disjointPath2 =
+            new DefaultDisjointPath(PID, path2, path1);
+    private static DefaultDisjointPath disjointPath3 =
+            new DefaultDisjointPath(PID, path1, path3);
+    private static DefaultDisjointPath disjointPath4 =
+            new DefaultDisjointPath(PID, path1, null);
+
+
+    /**
+     * Tests construction and fetching of member data.
+     */
+    @Test
+    public void testConstruction() {
+        assertThat(disjointPath1.primary(), is(path1));
+        assertThat(disjointPath1.backup(), is(path2));
+        assertThat(disjointPath1.links(), is(links1));
+        assertThat(disjointPath1.cost(), is(1.0));
+    }
+
+    /**
+     * Tests switching to the backup path.
+     */
+    @Test
+    public void testUseBackup() {
+        disjointPath1.useBackup();
+        assertThat(disjointPath1.primary(), is(path1));
+        assertThat(disjointPath1.backup(), is(path2));
+        assertThat(disjointPath1.links(), is(links2));
+        assertThat(disjointPath1.cost(), is(2.0));
+
+        disjointPath1.useBackup();
+        assertThat(disjointPath1.links(), is(links1));
+        assertThat(disjointPath1.cost(), is(1.0));
+
+        assertThat(disjointPath4.primary(), is(path1));
+        assertThat(disjointPath4.backup(), is((DefaultDisjointPath) null));
+        disjointPath4.useBackup();
+        assertThat(disjointPath4.primary(), is(path1));
+        assertThat(disjointPath4.backup(), is((DefaultDisjointPath) null));
+    }
+
+    /**
+     * Tests equals(), hashCode(), and toString() methods.
+     */
+    @Test
+    public void testEquals() {
+        new EqualsTester()
+                .addEqualityGroup(disjointPath1, sameAsDisjointPath1, disjointPath2)
+                .addEqualityGroup(disjointPath3)
+                .addEqualityGroup(disjointPath4)
+                .testEquals();
+    }
+}
diff --git a/core/api/src/test/java/org/onosproject/net/config/basics/BasicLinkConfigTest.java b/core/api/src/test/java/org/onosproject/net/config/basics/BasicLinkConfigTest.java
new file mode 100644
index 0000000..563a6b9
--- /dev/null
+++ b/core/api/src/test/java/org/onosproject/net/config/basics/BasicLinkConfigTest.java
@@ -0,0 +1,55 @@
+package org.onosproject.net.config.basics;
+
+import java.time.Duration;
+
+import org.junit.Test;
+import org.onosproject.net.Link;
+import org.onosproject.net.LinkKey;
+import org.onosproject.net.NetTestTools;
+import org.onosproject.net.config.ConfigApplyDelegate;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.JsonNodeFactory;
+
+import static java.lang.Boolean.FALSE;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+
+/**
+ * Unit tests for the BasicLinkConfig class.
+ */
+
+public class BasicLinkConfigTest {
+    private static final long BANDWIDTH = 11;
+    private static final double METRIC = 3.0;
+    private static final Duration LATENCY =  Duration.ofNanos(5555);
+
+    /**
+     * Tests construction, setters and getters of a BasicLinkConfig object.
+     */
+    @Test
+    public void testConstruction() {
+        BasicLinkConfig config = new BasicLinkConfig();
+        ConfigApplyDelegate delegate = configApply -> { };
+        ObjectMapper mapper = new ObjectMapper();
+        LinkKey linkKey = LinkKey.linkKey(
+                NetTestTools.connectPoint("device1", 1),
+                NetTestTools.connectPoint("device2", 2));
+
+        config.init(linkKey, "KEY", JsonNodeFactory.instance.objectNode(), mapper, delegate);
+
+
+        config.bandwidth(BANDWIDTH)
+              .isDurable(FALSE)
+              .metric(METRIC)
+              .type(Link.Type.DIRECT)
+              .latency(LATENCY);
+
+        assertThat(config.bandwidth(), is(BANDWIDTH));
+        assertThat(config.isDurable(), is(FALSE));
+        assertThat(config.metric(), is(METRIC));
+        assertThat(config.type(), is(Link.Type.DIRECT));
+        assertThat(config.latency(), is(LATENCY));
+        assertThat(config.isValid(), is(true));
+    }
+}
diff --git a/core/api/src/test/java/org/onosproject/net/device/DefaultPortDescriptionTest.java b/core/api/src/test/java/org/onosproject/net/device/DefaultPortDescriptionTest.java
new file mode 100644
index 0000000..2069d6b
--- /dev/null
+++ b/core/api/src/test/java/org/onosproject/net/device/DefaultPortDescriptionTest.java
@@ -0,0 +1,63 @@
+package org.onosproject.net.device;
+
+import org.junit.Test;
+import org.onosproject.net.PortNumber;
+
+import com.google.common.testing.EqualsTester;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutableBaseClass;
+import static org.onosproject.net.Port.Type.COPPER;
+
+/**
+ * Unit tests for the DefaultPortDescription test.
+ */
+public class DefaultPortDescriptionTest {
+
+    private static PortNumber port1 = PortNumber.portNumber(1);
+    private static long portSpeed1 = 111L;
+    private static DefaultPortDescription portDescription1 =
+            new DefaultPortDescription(port1, true, COPPER, portSpeed1);
+
+    private static DefaultPortDescription sameAsPortDescription1 =
+            new DefaultPortDescription(portDescription1,
+                                       portDescription1.annotations());
+
+    private static PortNumber port2 = PortNumber.portNumber(2);
+    private static DefaultPortDescription portDescription2 =
+            new DefaultPortDescription(port2, true);
+
+    private static DefaultPortDescription portDescription3 =
+            new DefaultPortDescription();
+    /**
+     * Tests the immutability of {@link DefaultPortDescription}.
+     */
+    @Test
+    public void testImmutable() {
+        assertThatClassIsImmutableBaseClass(DefaultPortDescription.class);
+    }
+
+    /**
+     * Tests object construction and fetching of member data.
+     */
+    @Test
+    public void testConstruction() {
+        assertThat(portDescription1.portNumber(), is(port1));
+        assertThat(portDescription1.isEnabled(), is(true));
+        assertThat(portDescription1.portSpeed(), is(portSpeed1));
+        assertThat(portDescription1.type(), is(COPPER));
+    }
+
+    /**
+     * Tests equals(), hashCode(), and toString() methods.
+     */
+    @Test
+    public void testEquals() {
+        new EqualsTester()
+                .addEqualityGroup(portDescription1, sameAsPortDescription1)
+                .addEqualityGroup(portDescription2)
+                .addEqualityGroup(portDescription3)
+                .testEquals();
+    }
+}
