diff --git a/src/test/java/net/onrc/onos/apps/proxyarp/ProxyArpManagerTest.java b/src/test/java/net/onrc/onos/apps/proxyarp/ProxyArpManagerTest.java
index fe64c9e..5976add 100644
--- a/src/test/java/net/onrc/onos/apps/proxyarp/ProxyArpManagerTest.java
+++ b/src/test/java/net/onrc/onos/apps/proxyarp/ProxyArpManagerTest.java
@@ -2,6 +2,7 @@
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
+
 import java.net.InetAddress;
 import java.net.UnknownHostException;
 import java.nio.ByteBuffer;
@@ -30,6 +31,8 @@
 import net.onrc.onos.core.topology.Topology;
 import net.onrc.onos.core.topology.Port;
 import net.onrc.onos.core.topology.Switch;
+import net.onrc.onos.core.util.Dpid;
+import net.onrc.onos.core.util.PortNumber;
 
 import org.easymock.EasyMock;
 import org.junit.After;
@@ -67,8 +70,8 @@
     byte[] srcByteMac, dstByteMac;
     MACAddress dstMac, srcMac, cachedMac1, cachedMac2;
     InetAddress srcIp, dstIp, cachedIp1, cachedIp2;
-    Long sw1Dpid;
-    Short sw1Inport, sw1Outport;
+    Dpid sw1Dpid;
+    PortNumber sw1Inport, sw1Outport;
     Short vlanId;
     ARP arpRequest, arpReply, rarpRequest;
     Ethernet ethArpRequest, ethArpReply, ethRarpRequest, ethArpOtherOp;
@@ -113,9 +116,9 @@
         cachedIp1 = InetAddress.getByAddress(IPv4.toIPv4AddressBytes(cachedStrIp1));
         cachedIp2 = InetAddress.getByAddress(IPv4.toIPv4AddressBytes(cachedStrIp2));
 
-        sw1Dpid = 1L;
-        sw1Inport = 1;
-        sw1Outport = 2;
+        sw1Dpid = new Dpid(1L);
+        sw1Inport = new PortNumber((short) 1);
+        sw1Outport = new PortNumber((short) 2);
         vlanId = 1;
 
         //Made tested packets
@@ -223,8 +226,8 @@
     }
 
     private void prepareExpectForGeneral() {
-        EasyMock.expect(inPort1.getNumber()).andReturn((long) sw1Inport).anyTimes();
-        EasyMock.expect(outPort1.getNumber()).andReturn((long) sw1Outport).anyTimes();
+        EasyMock.expect(inPort1.getNumber()).andReturn(sw1Inport).anyTimes();
+        EasyMock.expect(outPort1.getNumber()).andReturn(sw1Outport).anyTimes();
         EasyMock.expect(outPort1.getOutgoingLink()).andReturn(null).anyTimes();
         EasyMock.expect(outPort1.getIncomingLink()).andReturn(null).anyTimes();
         EasyMock.expect(outPort1.getSwitch()).andReturn(sw1).anyTimes();
diff --git a/src/test/java/net/onrc/onos/core/devicemanager/OnosDeviceManagerTest.java b/src/test/java/net/onrc/onos/core/devicemanager/OnosDeviceManagerTest.java
index 22900cc..39e739f 100644
--- a/src/test/java/net/onrc/onos/core/devicemanager/OnosDeviceManagerTest.java
+++ b/src/test/java/net/onrc/onos/core/devicemanager/OnosDeviceManagerTest.java
@@ -32,6 +32,8 @@
 import net.onrc.onos.core.topology.ITopologyListener;
 import net.onrc.onos.core.topology.ITopologyService;
 import net.onrc.onos.core.topology.MockTopology;
+import net.onrc.onos.core.util.Dpid;
+import net.onrc.onos.core.util.PortNumber;
 
 import org.easymock.EasyMock;
 import org.junit.After;
@@ -83,7 +85,7 @@
 
         expect(datagridService.createChannel("onos.device", Long.class, OnosDevice.class))
         .andReturn(eventChannel).once();
-        expect(topology.getOutgoingLink(1L, 100L)).andReturn(null).anyTimes();
+        expect(topology.getOutgoingLink(new Dpid(1L), new PortNumber((short) 100))).andReturn(null).anyTimes();
         expect(datagridService.addListener(
                 eq("onos.device"),
                 anyObject(IEventChannelListener.class),
diff --git a/src/test/java/net/onrc/onos/core/intent/ConstrainedBFSTreeTest.java b/src/test/java/net/onrc/onos/core/intent/ConstrainedBFSTreeTest.java
index 9a3aaa2..b9d2b07 100644
--- a/src/test/java/net/onrc/onos/core/intent/ConstrainedBFSTreeTest.java
+++ b/src/test/java/net/onrc/onos/core/intent/ConstrainedBFSTreeTest.java
@@ -6,6 +6,8 @@
 import net.onrc.onos.core.intent.IntentOperation.Operator;
 import net.onrc.onos.core.topology.LinkEvent;
 import net.onrc.onos.core.topology.MockTopology;
+import net.onrc.onos.core.util.Dpid;
+import net.onrc.onos.core.util.PortNumber;
 
 import org.junit.After;
 import org.junit.Before;
@@ -15,6 +17,19 @@
  * Unit tests for ConstrainedBFSTree class.
  */
 public class ConstrainedBFSTreeTest {
+    private static final Dpid DPID_1 = new Dpid(1L);
+    private static final Dpid DPID_2 = new Dpid(2L);
+    private static final Dpid DPID_3 = new Dpid(3L);
+    private static final Dpid DPID_4 = new Dpid(4L);
+
+    private static final PortNumber PORT_NUMBER_12 = new PortNumber((short) 12);
+    private static final PortNumber PORT_NUMBER_14 = new PortNumber((short) 14);
+    private static final PortNumber PORT_NUMBER_21 = new PortNumber((short) 21);
+    private static final PortNumber PORT_NUMBER_23 = new PortNumber((short) 23);
+    private static final PortNumber PORT_NUMBER_41 = new PortNumber((short) 41);
+    private static final PortNumber PORT_NUMBER_42 = new PortNumber((short) 42);
+    private static final PortNumber PORT_NUMBER_43 = new PortNumber((short) 43);
+
     static final long LOCAL_PORT = 0xFFFEL;
 
     @Before
@@ -29,7 +44,7 @@
     public void testCreate() {
         MockTopology topology = new MockTopology();
         topology.createSampleTopology1();
-        ConstrainedBFSTree tree = new ConstrainedBFSTree(topology.getSwitch(1L));
+        ConstrainedBFSTree tree = new ConstrainedBFSTree(topology.getSwitch(DPID_1));
         assertNotNull(tree);
     }
 
@@ -38,7 +53,7 @@
         MockTopology topology = new MockTopology();
         topology.createSampleTopology1();
         PathIntentMap intents = new PathIntentMap();
-        ConstrainedBFSTree tree = new ConstrainedBFSTree(topology.getSwitch(1L), intents, 1000.0);
+        ConstrainedBFSTree tree = new ConstrainedBFSTree(topology.getSwitch(DPID_1), intents, 1000.0);
         assertNotNull(tree);
     }
 
@@ -46,56 +61,56 @@
     public void testGetPath() {
         MockTopology topology = new MockTopology();
         topology.createSampleTopology1();
-        ConstrainedBFSTree tree = new ConstrainedBFSTree(topology.getSwitch(1L));
-        Path path11 = tree.getPath(topology.getSwitch(1L));
-        Path path12 = tree.getPath(topology.getSwitch(2L));
-        Path path13 = tree.getPath(topology.getSwitch(3L));
-        Path path14 = tree.getPath(topology.getSwitch(4L));
+        ConstrainedBFSTree tree = new ConstrainedBFSTree(topology.getSwitch(DPID_1));
+        Path path11 = tree.getPath(topology.getSwitch(DPID_1));
+        Path path12 = tree.getPath(topology.getSwitch(DPID_2));
+        Path path13 = tree.getPath(topology.getSwitch(DPID_3));
+        Path path14 = tree.getPath(topology.getSwitch(DPID_4));
 
         assertNotNull(path11);
         assertEquals(0, path11.size());
 
         assertNotNull(path12);
         assertEquals(1, path12.size());
-        assertEquals(new LinkEvent(topology.getOutgoingLink(1L, 12L)), path12.get(0));
+        assertEquals(new LinkEvent(topology.getOutgoingLink(DPID_1, PORT_NUMBER_12)), path12.get(0));
 
         assertNotNull(path13);
         assertEquals(2, path13.size());
-        if (path13.get(0).getDst().getDpid() == 2L) {
-            assertEquals(new LinkEvent(topology.getOutgoingLink(1L, 12L)), path13.get(0));
-            assertEquals(new LinkEvent(topology.getOutgoingLink(2L, 23L)), path13.get(1));
+        if (path13.get(0).getDst().getDpid().value() == 2L) {
+            assertEquals(new LinkEvent(topology.getOutgoingLink(DPID_1, PORT_NUMBER_12)), path13.get(0));
+            assertEquals(new LinkEvent(topology.getOutgoingLink(DPID_2, PORT_NUMBER_23)), path13.get(1));
         } else {
-            assertEquals(new LinkEvent(topology.getOutgoingLink(1L, 14L)), path13.get(0));
-            assertEquals(new LinkEvent(topology.getOutgoingLink(4L, 43L)), path13.get(1));
+            assertEquals(new LinkEvent(topology.getOutgoingLink(DPID_1, PORT_NUMBER_14)), path13.get(0));
+            assertEquals(new LinkEvent(topology.getOutgoingLink(DPID_4, PORT_NUMBER_43)), path13.get(1));
         }
 
         assertNotNull(path14);
         assertEquals(1, path14.size());
-        assertEquals(new LinkEvent(topology.getOutgoingLink(1L, 14L)), path14.get(0));
+        assertEquals(new LinkEvent(topology.getOutgoingLink(DPID_1, PORT_NUMBER_14)), path14.get(0));
     }
 
     @Test
     public void testGetPathNull() {
         MockTopology topology = new MockTopology();
         topology.createSampleTopology1();
-        topology.removeLink(1L, 12L, 2L, 21L);
-        topology.removeLink(1L, 14L, 4L, 41L);
+        topology.removeLink(DPID_1, PORT_NUMBER_12, DPID_2, PORT_NUMBER_21);
+        topology.removeLink(DPID_1, PORT_NUMBER_14, DPID_4, PORT_NUMBER_41);
         // now, there is no path from switch 1, but to switch1
 
-        ConstrainedBFSTree tree1 = new ConstrainedBFSTree(topology.getSwitch(1L));
-        Path path12 = tree1.getPath(topology.getSwitch(2L));
-        Path path13 = tree1.getPath(topology.getSwitch(3L));
-        Path path14 = tree1.getPath(topology.getSwitch(4L));
+        ConstrainedBFSTree tree1 = new ConstrainedBFSTree(topology.getSwitch(DPID_1));
+        Path path12 = tree1.getPath(topology.getSwitch(DPID_2));
+        Path path13 = tree1.getPath(topology.getSwitch(DPID_3));
+        Path path14 = tree1.getPath(topology.getSwitch(DPID_4));
 
-        ConstrainedBFSTree tree2 = new ConstrainedBFSTree(topology.getSwitch(2L));
-        Path path21 = tree2.getPath(topology.getSwitch(1L));
+        ConstrainedBFSTree tree2 = new ConstrainedBFSTree(topology.getSwitch(DPID_2));
+        Path path21 = tree2.getPath(topology.getSwitch(DPID_1));
 
         assertNull(path12);
         assertNull(path13);
         assertNull(path14);
         assertNotNull(path21);
         assertEquals(1, path21.size());
-        assertEquals(new LinkEvent(topology.getOutgoingLink(2L, 21L)), path21.get(0));
+        assertEquals(new LinkEvent(topology.getOutgoingLink(DPID_2, PORT_NUMBER_21)), path21.get(0));
     }
 
     @Test
@@ -112,33 +127,33 @@
                 "2", 1L, LOCAL_PORT, 0x333L, 2L, LOCAL_PORT, 0x444L, 600.0);
 
         // calculate path of the intent1
-        ConstrainedBFSTree tree = new ConstrainedBFSTree(topology.getSwitch(1L), intents, 600.0);
-        Path path1 = tree.getPath(topology.getSwitch(2L));
+        ConstrainedBFSTree tree = new ConstrainedBFSTree(topology.getSwitch(DPID_1), intents, 600.0);
+        Path path1 = tree.getPath(topology.getSwitch(DPID_2));
 
         assertNotNull(path1);
         assertEquals(1, path1.size());
-        assertEquals(new LinkEvent(topology.getOutgoingLink(1L, 12L)), path1.get(0));
+        assertEquals(new LinkEvent(topology.getOutgoingLink(DPID_1, PORT_NUMBER_12)), path1.get(0));
 
         PathIntent pathIntent1 = new PathIntent("pi1", path1, 600.0, intent1);
         intentOps.add(Operator.ADD, pathIntent1);
         intents.executeOperations(intentOps);
 
         // calculate path of the intent2
-        tree = new ConstrainedBFSTree(topology.getSwitch(1L), intents, 600.0);
-        Path path2 = tree.getPath(topology.getSwitch(2L));
+        tree = new ConstrainedBFSTree(topology.getSwitch(DPID_1), intents, 600.0);
+        Path path2 = tree.getPath(topology.getSwitch(DPID_2));
 
         assertNotNull(path2);
         assertEquals(2, path2.size());
-        assertEquals(new LinkEvent(topology.getOutgoingLink(1L, 14L)), path2.get(0));
-        assertEquals(new LinkEvent(topology.getOutgoingLink(4L, 42L)), path2.get(1));
+        assertEquals(new LinkEvent(topology.getOutgoingLink(DPID_1, PORT_NUMBER_14)), path2.get(0));
+        assertEquals(new LinkEvent(topology.getOutgoingLink(DPID_4, PORT_NUMBER_42)), path2.get(1));
 
         PathIntent pathIntent2 = new PathIntent("pi2", path2, 600.0, intent2);
         intentOps.add(Operator.ADD, pathIntent2);
         intents.executeOperations(intentOps);
 
         // calculate path of the intent3
-        tree = new ConstrainedBFSTree(topology.getSwitch(1L), intents, 600.0);
-        Path path3 = tree.getPath(topology.getSwitch(2L));
+        tree = new ConstrainedBFSTree(topology.getSwitch(DPID_1), intents, 600.0);
+        Path path3 = tree.getPath(topology.getSwitch(DPID_2));
 
         assertNull(path3);
     }
diff --git a/src/test/java/net/onrc/onos/core/intent/PathIntentMapTest.java b/src/test/java/net/onrc/onos/core/intent/PathIntentMapTest.java
index 2f3cac4..69b0fc2 100644
--- a/src/test/java/net/onrc/onos/core/intent/PathIntentMapTest.java
+++ b/src/test/java/net/onrc/onos/core/intent/PathIntentMapTest.java
@@ -13,6 +13,8 @@
 import net.onrc.onos.core.topology.LinkEvent;
 import net.onrc.onos.core.topology.Port;
 import net.onrc.onos.core.topology.Switch;
+import net.onrc.onos.core.util.Dpid;
+import net.onrc.onos.core.util.PortNumber;
 
 import org.junit.After;
 import org.junit.Before;
@@ -31,10 +33,10 @@
         sw2 = createMock(Switch.class);
         sw3 = createMock(Switch.class);
         sw4 = createMock(Switch.class);
-        expect(sw1.getDpid()).andReturn(1L).anyTimes();
-        expect(sw2.getDpid()).andReturn(2L).anyTimes();
-        expect(sw3.getDpid()).andReturn(3L).anyTimes();
-        expect(sw4.getDpid()).andReturn(4L).anyTimes();
+        expect(sw1.getDpid()).andReturn(new Dpid(1L)).anyTimes();
+        expect(sw2.getDpid()).andReturn(new Dpid(2L)).anyTimes();
+        expect(sw3.getDpid()).andReturn(new Dpid(3L)).anyTimes();
+        expect(sw4.getDpid()).andReturn(new Dpid(4L)).anyTimes();
         replay(sw1);
         replay(sw2);
         replay(sw3);
@@ -46,12 +48,12 @@
         port23 = createMock(Port.class);
         port31 = createMock(Port.class);
         port41 = createMock(Port.class);
-        expect(port11.getNumber()).andReturn(1L).anyTimes();
-        expect(port22.getNumber()).andReturn(2L).anyTimes();
-        expect(port21.getNumber()).andReturn(1L).anyTimes();
-        expect(port23.getNumber()).andReturn(3L).anyTimes();
-        expect(port31.getNumber()).andReturn(1L).anyTimes();
-        expect(port41.getNumber()).andReturn(1L).anyTimes();
+        expect(port11.getNumber()).andReturn(new PortNumber((short) 1)).anyTimes();
+        expect(port22.getNumber()).andReturn(new PortNumber((short) 2)).anyTimes();
+        expect(port21.getNumber()).andReturn(new PortNumber((short) 1)).anyTimes();
+        expect(port23.getNumber()).andReturn(new PortNumber((short) 3)).anyTimes();
+        expect(port31.getNumber()).andReturn(new PortNumber((short) 1)).anyTimes();
+        expect(port41.getNumber()).andReturn(new PortNumber((short) 1)).anyTimes();
         replay(port11);
         replay(port22);
         replay(port21);
diff --git a/src/test/java/net/onrc/onos/core/intent/PathIntentTest.java b/src/test/java/net/onrc/onos/core/intent/PathIntentTest.java
index 43ce79f..1b9e482 100644
--- a/src/test/java/net/onrc/onos/core/intent/PathIntentTest.java
+++ b/src/test/java/net/onrc/onos/core/intent/PathIntentTest.java
@@ -2,6 +2,8 @@
 
 import static org.junit.Assert.assertEquals;
 import net.onrc.onos.core.topology.LinkEvent;
+import net.onrc.onos.core.util.Dpid;
+import net.onrc.onos.core.util.PortNumber;
 import net.onrc.onos.core.util.serializers.KryoFactory;
 
 import org.junit.After;
@@ -16,6 +18,15 @@
  * Unit tests for PathIntent.
  */
 public class PathIntentTest {
+
+    private static final Dpid DPID_1 = new Dpid(1L);
+    private static final Dpid DPID_2 = new Dpid(2L);
+    private static final Dpid DPID_3 = new Dpid(3L);
+    private static final Dpid DPID_4 = new Dpid(4L);
+
+    private static final PortNumber PORT_NUMBER_1 = new PortNumber((short) 1);
+    private static final PortNumber PORT_NUMBER_2 = new PortNumber((short) 2);
+
     @Before
     public void setUp() throws Exception {
     }
@@ -68,20 +79,20 @@
         assertEquals("11", pathIntent2.getId());
         Path path2 = pathIntent2.getPath();
 
-        assertEquals(Long.valueOf(1L), path2.get(0).getSrc().getDpid());
-        assertEquals(Long.valueOf(1L), path2.get(0).getSrc().getNumber());
-        assertEquals(Long.valueOf(2L), path2.get(0).getDst().getDpid());
-        assertEquals(Long.valueOf(2L), path2.get(0).getDst().getNumber());
+        assertEquals(DPID_1, path2.get(0).getSrc().getDpid());
+        assertEquals(PORT_NUMBER_1, path2.get(0).getSrc().getNumber());
+        assertEquals(DPID_2, path2.get(0).getDst().getDpid());
+        assertEquals(PORT_NUMBER_2, path2.get(0).getDst().getNumber());
 
-        assertEquals(Long.valueOf(2L), path2.get(1).getSrc().getDpid());
-        assertEquals(Long.valueOf(1L), path2.get(1).getSrc().getNumber());
-        assertEquals(Long.valueOf(3L), path2.get(1).getDst().getDpid());
-        assertEquals(Long.valueOf(2L), path2.get(1).getDst().getNumber());
+        assertEquals(DPID_2, path2.get(1).getSrc().getDpid());
+        assertEquals(PORT_NUMBER_1, path2.get(1).getSrc().getNumber());
+        assertEquals(DPID_3, path2.get(1).getDst().getDpid());
+        assertEquals(PORT_NUMBER_2, path2.get(1).getDst().getNumber());
 
-        assertEquals(Long.valueOf(3L), path2.get(2).getSrc().getDpid());
-        assertEquals(Long.valueOf(1L), path2.get(2).getSrc().getNumber());
-        assertEquals(Long.valueOf(4L), path2.get(2).getDst().getDpid());
-        assertEquals(Long.valueOf(2L), path2.get(2).getDst().getNumber());
+        assertEquals(DPID_3, path2.get(2).getSrc().getDpid());
+        assertEquals(PORT_NUMBER_1, path2.get(2).getSrc().getNumber());
+        assertEquals(DPID_4, path2.get(2).getDst().getDpid());
+        assertEquals(PORT_NUMBER_2, path2.get(2).getDst().getNumber());
 
         assertEquals(123.45, pathIntent2.getBandwidth(), 0.0);
 
diff --git a/src/test/java/net/onrc/onos/core/topology/MockTopology.java b/src/test/java/net/onrc/onos/core/topology/MockTopology.java
index 888779a..80f309c 100644
--- a/src/test/java/net/onrc/onos/core/topology/MockTopology.java
+++ b/src/test/java/net/onrc/onos/core/topology/MockTopology.java
@@ -1,6 +1,8 @@
 package net.onrc.onos.core.topology;
 
 import net.floodlightcontroller.util.MACAddress;
+import net.onrc.onos.core.util.Dpid;
+import net.onrc.onos.core.util.PortNumber;
 
 /**
  * A mock class of Topology.
@@ -25,8 +27,16 @@
 
     public Link[] addBidirectionalLinks(Long srcDpid, Long srcPortNo, Long dstDpid, Long dstPortNo) {
         Link[] links = new Link[2];
-        links[0] = new LinkImpl(this, getPort(srcDpid, srcPortNo), getPort(dstDpid, dstPortNo));
-        links[1] = new LinkImpl(this, getPort(dstDpid, dstPortNo), getPort(srcDpid, srcPortNo));
+        final Dpid srcDpidObj = new Dpid(srcDpid);
+        final Dpid dstDpidObj = new Dpid(dstDpid);
+        final PortNumber srcPortNum = new PortNumber(srcPortNo.shortValue());
+        final PortNumber dstPortNum = new PortNumber(dstPortNo.shortValue());
+        links[0] = new LinkImpl(this,
+                getPort(srcDpidObj, srcPortNum),
+                getPort(dstDpidObj, dstPortNum));
+        links[1] = new LinkImpl(this,
+                getPort(dstDpidObj, dstPortNum),
+                getPort(srcDpidObj, srcPortNum));
 
         putLink(links[0]);
         putLink(links[1]);
@@ -135,6 +145,14 @@
     }
 
     public void removeLink(Long srcDpid, Long srcPortNo, Long dstDpid, Long dstPortNo) {
-        removeLink(getLink(srcDpid, srcPortNo, dstDpid, dstPortNo));
+        removeLink(getLink(new Dpid(srcDpid),
+                           new PortNumber(srcPortNo.shortValue()),
+                           new Dpid(dstDpid),
+                           new PortNumber(dstPortNo.shortValue())));
+    }
+
+    public void removeLink(Dpid srcDpid, PortNumber srcPortNo,
+                           Dpid dstDpid, PortNumber dstPortNo) {
+        super.removeLink(getLink(srcDpid, srcPortNo, dstDpid, dstPortNo));
     }
 }
diff --git a/src/test/java/net/onrc/onos/core/topology/TopologyImplTest.java b/src/test/java/net/onrc/onos/core/topology/TopologyImplTest.java
index 2501425..cc7ac9c 100644
--- a/src/test/java/net/onrc/onos/core/topology/TopologyImplTest.java
+++ b/src/test/java/net/onrc/onos/core/topology/TopologyImplTest.java
@@ -1,14 +1,13 @@
 package net.onrc.onos.core.topology;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.*;
+import static org.hamcrest.Matchers.*;
 
 import java.util.Iterator;
 
 import net.floodlightcontroller.util.MACAddress;
+import net.onrc.onos.core.util.Dpid;
+import net.onrc.onos.core.util.PortNumber;
 
 import org.junit.After;
 import org.junit.Before;
@@ -26,7 +25,9 @@
     private TopologyImpl testTopology;
     private static final Long SWITCH_HOST_PORT = 1L;
     private static final Long SWITCH_PORT_1 = 2L;
+    private static final PortNumber PORT_NUMBER_1 = new PortNumber(SWITCH_PORT_1.shortValue());
     private static final Long SWITCH_PORT_2 = 3L;
+    private static final PortNumber PORT_NUMBER_2 = new PortNumber(SWITCH_PORT_2.shortValue());
 
     // Set the test network size, it should be larger than 3
     private static final long TEST_SWITCH_NUM = 100L;
@@ -53,12 +54,12 @@
         // Create one bidirectional link b/w two switches to construct a ring topology
         for (long switchID = 1; switchID <= TEST_SWITCH_NUM; switchID++) {
             LinkImpl testLinkEast = new LinkImpl(testTopology,
-                    testTopology.getPort(switchID, SWITCH_PORT_2),
-                    testTopology.getPort(switchID % TEST_SWITCH_NUM + 1, SWITCH_PORT_1)
+                    testTopology.getPort(new Dpid(switchID), PORT_NUMBER_2),
+                    testTopology.getPort(new Dpid(switchID % TEST_SWITCH_NUM + 1), PORT_NUMBER_1)
                     );
             LinkImpl testLinkWest = new LinkImpl(testTopology,
-                    testTopology.getPort(switchID % TEST_SWITCH_NUM + 1, SWITCH_PORT_1),
-                    testTopology.getPort(switchID, SWITCH_PORT_2)
+                    testTopology.getPort(new Dpid(switchID % TEST_SWITCH_NUM + 1), PORT_NUMBER_1),
+                    testTopology.getPort(new Dpid(switchID), PORT_NUMBER_2)
                     );
             testTopology.putLink(testLinkEast);
             testTopology.putLink(testLinkWest);
@@ -76,17 +77,18 @@
     @Test
     public void testGetSwitch() {
         // Verify the switch is in the graphDB
-        assertNotNull(testTopology.getSwitch(TEST_SWITCH_NUM - 1));
+        assertNotNull(testTopology.getSwitch(new Dpid(TEST_SWITCH_NUM - 1)));
 
         // Verify there is no such switch in the graphDB
-        assertNull(testTopology.getSwitch(TEST_SWITCH_NUM + 1));
-        long swID = 0;
+        assertNull(testTopology.getSwitch(new Dpid(TEST_SWITCH_NUM + 1)));
         long index = 0;
         Iterator<Switch> itr =  testTopology.getSwitches().iterator();
         while (itr.hasNext()) {
             index++;
-            swID = itr.next().getDpid();
-            assertTrue(swID >= 1 && swID <= TEST_SWITCH_NUM);
+            Dpid swID = itr.next().getDpid();
+            assertThat(swID.value(),
+                    is(both(greaterThanOrEqualTo(1L))
+                       .and(lessThanOrEqualTo(TEST_SWITCH_NUM))));
         }
 
         // Verify the total number of switches
@@ -98,13 +100,14 @@
      */
     @Test
     public void testGetPort() {
+        PortNumber bogusPortNum = new PortNumber((short) (SWITCH_PORT_2 + 1));
         for (long switchID = 1; switchID <= TEST_SWITCH_NUM; switchID++) {
             // Verify ports are in the graphDB
-            assertNotNull(testTopology.getSwitch(switchID).getPort(SWITCH_PORT_1));
-            assertNotNull(testTopology.getSwitch(switchID).getPort(SWITCH_PORT_2));
+            assertNotNull(testTopology.getSwitch(new Dpid(switchID)).getPort(PORT_NUMBER_1));
+            assertNotNull(testTopology.getSwitch(new Dpid(switchID)).getPort(PORT_NUMBER_2));
 
             // Verify there is no such port in the graphDB
-            assertNull(testTopology.getSwitch(switchID).getPort(SWITCH_PORT_2 + 1));
+            assertNull(testTopology.getSwitch(new Dpid(switchID)).getPort(bogusPortNum));
         }
     }
 
@@ -113,11 +116,11 @@
      */
     @Test
     public void testGetLink() {
-        long sw1ID = 1L;
-        long sw2ID = 3L;
+        Dpid sw1ID = new Dpid(1L);
+        Dpid sw3ID = new Dpid(3L);
 
         // Verify there is no such link b/w these two switches
-        assertNull((testTopology.getSwitch(sw1ID)).getLinkToNeighbor(sw2ID));
+        assertNull((testTopology.getSwitch(sw1ID)).getLinkToNeighbor(sw3ID));
         long index = 0;
         Iterator<Link> itr = testTopology.getLinks().iterator();
         while (itr.hasNext()) {
@@ -125,11 +128,12 @@
             Link objectLink = itr.next();
             Switch srcSw = (objectLink.getSrcSwitch());
             Switch dstSw = (objectLink.getDstSwitch());
-            if (srcSw.getDpid() < TEST_SWITCH_NUM && dstSw.getDpid() < TEST_SWITCH_NUM) {
-                // Verify the link relationship
-                assertTrue((srcSw.getDpid() == dstSw.getDpid() - 1
-                        || (srcSw.getDpid() == dstSw.getDpid() + 1)));
-            }
+
+            // confirm link is forming a link
+            final long smallerDpid = Math.min(srcSw.getDpid().value(), dstSw.getDpid().value());
+            final long largerDpid = Math.max(srcSw.getDpid().value(), dstSw.getDpid().value());
+            assertThat(largerDpid - smallerDpid,
+                is(either(equalTo(1L)).or(equalTo(TEST_SWITCH_NUM - 1))));
         }
 
         // Verify the total number of links
@@ -141,12 +145,13 @@
      */
     @Test
     public void testGetOutgoingLink() {
+        PortNumber bogusPortNum = new PortNumber((short) (SWITCH_PORT_2 + 1));
         for (long switchID = 1; switchID <= TEST_SWITCH_NUM; switchID++) {
-            assertNotNull(testTopology.getOutgoingLink(switchID, SWITCH_PORT_1));
-            assertNotNull(testTopology.getOutgoingLink(switchID, SWITCH_PORT_2));
+            assertNotNull(testTopology.getOutgoingLink(new Dpid(switchID), PORT_NUMBER_1));
+            assertNotNull(testTopology.getOutgoingLink(new Dpid(switchID), PORT_NUMBER_2));
 
             // Verify there is no such link in the graphDB
-            assertNull(testTopology.getOutgoingLink(switchID, SWITCH_PORT_1 + 2));
+            assertNull(testTopology.getOutgoingLink(new Dpid(switchID), bogusPortNum));
         }
     }
 
@@ -155,13 +160,17 @@
      */
     @Test
     public void testGetIncomingLink() {
+        PortNumber bogusPortNum = new PortNumber((short) (SWITCH_PORT_2 + 1));
         for (long switchID = 1; switchID <= TEST_SWITCH_NUM; switchID++) {
             // Verify the links are in the graphDB
-            assertNotNull(testTopology.getIncomingLink(switchID, SWITCH_PORT_1));
-            assertNotNull(testTopology.getIncomingLink(switchID, SWITCH_PORT_2));
+            assertNotNull(testTopology.getIncomingLink(
+                                           new Dpid(switchID), PORT_NUMBER_1));
+            assertNotNull(testTopology.getIncomingLink(
+                                           new Dpid(switchID), PORT_NUMBER_2));
 
             // Verify there is no such link in the graphDB
-            assertNull(testTopology.getIncomingLink(switchID, SWITCH_PORT_1 + 2));
+            assertNull(testTopology.getIncomingLink(
+                                        new Dpid(switchID), bogusPortNum));
         }
     }
 
@@ -213,7 +222,8 @@
             testTopology.removeLink(objectLink);
 
             // Verify the link was removed successfully
-            assertNull(testTopology.getLink(srcSw.getDpid(), srcPort.getNumber(),
+            assertNull(testTopology.getLink(
+                    srcSw.getDpid(), srcPort.getNumber(),
                     dstSw.getDpid(), dstPort.getNumber()));
         }
 
@@ -227,14 +237,14 @@
     @Test
     public void testRemoveSwitch() {
         for (long switchID = 1; switchID <= TEST_SWITCH_NUM; switchID++) {
-            Iterator<Device> itr = testTopology.getSwitch(switchID).getDevices().iterator();
+            Iterator<Device> itr = testTopology.getSwitch(new Dpid(switchID)).getDevices().iterator();
             while (itr.hasNext()) {
                 testTopology.removeDevice((Device) itr);
             }
             testTopology.removeSwitch(switchID);
 
             // Verify the switch has been removed from the graphDB successfully
-            assertNull(testTopology.getSwitch(switchID));
+            assertNull(testTopology.getSwitch(new Dpid(switchID)));
         }
 
         // Verify all switches have been removed successfully
