diff --git a/src/test/java/net/onrc/onos/api/flowmanager/SingleDstTreeFlowTest.java b/src/test/java/net/onrc/onos/api/flowmanager/SingleDstTreeFlowTest.java
index 1a40013..ae7b4e3 100644
--- a/src/test/java/net/onrc/onos/api/flowmanager/SingleDstTreeFlowTest.java
+++ b/src/test/java/net/onrc/onos/api/flowmanager/SingleDstTreeFlowTest.java
@@ -112,7 +112,7 @@
      */
     private List<Action> outputAction(int outputPort) {
         return Arrays.asList(
-                (Action) new OutputAction(new PortNumber((short) outputPort)));
+                (Action) new OutputAction(PortNumber.uint16((short) outputPort)));
     }
 
     /**
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 901a14e..b9285de 100644
--- a/src/test/java/net/onrc/onos/apps/proxyarp/ProxyArpManagerTest.java
+++ b/src/test/java/net/onrc/onos/apps/proxyarp/ProxyArpManagerTest.java
@@ -121,8 +121,8 @@
         cachedIp2 = InetAddress.getByAddress(IPv4.toIPv4AddressBytes(cachedStrIp2));
 
         sw1Dpid = new Dpid(1L);
-        sw1Inport = new PortNumber((short) 1);
-        sw1Outport = new PortNumber((short) 2);
+        sw1Inport = PortNumber.uint16((short) 1);
+        sw1Outport = PortNumber.uint16((short) 2);
         vlanId = 1;
 
         //Made tested packets
diff --git a/src/test/java/net/onrc/onos/core/flowprogrammer/FlowPusherTest.java b/src/test/java/net/onrc/onos/core/flowprogrammer/FlowPusherTest.java
index f84c08f..6ad1e5f 100644
--- a/src/test/java/net/onrc/onos/core/flowprogrammer/FlowPusherTest.java
+++ b/src/test/java/net/onrc/onos/core/flowprogrammer/FlowPusherTest.java
@@ -408,8 +408,8 @@
         /*
         flowEntry1.setDpid(new Dpid(DPID_TO_VERIFY));
         flowEntry1.setFlowId(new FlowId(1));
-        flowEntry1.setInPort(new PortNumber((short) 1));
-        flowEntry1.setOutPort(new PortNumber((short) 11));
+        flowEntry1.setInPort(PortNumber.uint16((short) 1));
+        flowEntry1.setOutPort(PortNumber.uint16((short) 11));
         flowEntry1.setFlowEntryId(new FlowEntryId(1));
         flowEntry1.setFlowEntryMatch(new FlowEntryMatch());
         flowEntry1.setFlowEntryActions(new FlowEntryActions());
diff --git a/src/test/java/net/onrc/onos/core/hostmanager/HostManagerTest.java b/src/test/java/net/onrc/onos/core/hostmanager/HostManagerTest.java
index 1431a24..26ceb59 100644
--- a/src/test/java/net/onrc/onos/core/hostmanager/HostManagerTest.java
+++ b/src/test/java/net/onrc/onos/core/hostmanager/HostManagerTest.java
@@ -92,7 +92,7 @@
 
         expect(datagridService.createChannel("onos.host", Long.class, Host.class))
         .andReturn(eventChannel).once();
-        expect(topology.getOutgoingLink(new Dpid(1L), new PortNumber((short) 100))).andReturn(null).anyTimes();
+        expect(topology.getOutgoingLink(new Dpid(1L), PortNumber.uint16((short) 100))).andReturn(null).anyTimes();
         expect(datagridService.addListener(
                 eq("onos.host"),
                 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 b9d2b07..a0095be 100644
--- a/src/test/java/net/onrc/onos/core/intent/ConstrainedBFSTreeTest.java
+++ b/src/test/java/net/onrc/onos/core/intent/ConstrainedBFSTreeTest.java
@@ -22,13 +22,13 @@
     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);
+    private static final PortNumber PORT_NUMBER_12 = PortNumber.uint16((short) 12);
+    private static final PortNumber PORT_NUMBER_14 = PortNumber.uint16((short) 14);
+    private static final PortNumber PORT_NUMBER_21 = PortNumber.uint16((short) 21);
+    private static final PortNumber PORT_NUMBER_23 = PortNumber.uint16((short) 23);
+    private static final PortNumber PORT_NUMBER_41 = PortNumber.uint16((short) 41);
+    private static final PortNumber PORT_NUMBER_42 = PortNumber.uint16((short) 42);
+    private static final PortNumber PORT_NUMBER_43 = PortNumber.uint16((short) 43);
 
     static final long LOCAL_PORT = 0xFFFEL;
 
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 1cadfb6..f0d7464 100644
--- a/src/test/java/net/onrc/onos/core/intent/PathIntentMapTest.java
+++ b/src/test/java/net/onrc/onos/core/intent/PathIntentMapTest.java
@@ -22,8 +22,8 @@
 import org.junit.Test;
 
 public class PathIntentMapTest {
-    private static final PortNumber PORT_NUMBER_1 = new PortNumber((short) 1);
-    private static final PortNumber PORT_NUMBER_3 = new PortNumber((short) 3);
+    private static final PortNumber PORT_NUMBER_1 = PortNumber.uint16((short) 1);
+    private static final PortNumber PORT_NUMBER_3 = PortNumber.uint16((short) 3);
     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);
@@ -55,12 +55,12 @@
         port23 = createMock(Port.class);
         port31 = createMock(Port.class);
         port41 = createMock(Port.class);
-        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();
+        expect(port11.getNumber()).andReturn(PortNumber.uint16((short) 1)).anyTimes();
+        expect(port22.getNumber()).andReturn(PortNumber.uint16((short) 2)).anyTimes();
+        expect(port21.getNumber()).andReturn(PortNumber.uint16((short) 1)).anyTimes();
+        expect(port23.getNumber()).andReturn(PortNumber.uint16((short) 3)).anyTimes();
+        expect(port31.getNumber()).andReturn(PortNumber.uint16((short) 1)).anyTimes();
+        expect(port41.getNumber()).andReturn(PortNumber.uint16((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 3149103..6ffc0f4 100644
--- a/src/test/java/net/onrc/onos/core/intent/PathIntentTest.java
+++ b/src/test/java/net/onrc/onos/core/intent/PathIntentTest.java
@@ -25,8 +25,8 @@
     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);
+    private static final PortNumber PORT_NUMBER_1 = PortNumber.uint16((short) 1);
+    private static final PortNumber PORT_NUMBER_2 = PortNumber.uint16((short) 2);
 
     @Before
     public void setUp() throws Exception {
diff --git a/src/test/java/net/onrc/onos/core/newintent/PathFlowIntentTest.java b/src/test/java/net/onrc/onos/core/newintent/PathFlowIntentTest.java
index c9da728..69c7277 100644
--- a/src/test/java/net/onrc/onos/core/newintent/PathFlowIntentTest.java
+++ b/src/test/java/net/onrc/onos/core/newintent/PathFlowIntentTest.java
@@ -21,7 +21,7 @@
     private final IntentId intentId2 = new IntentId(456);
     private final FlowId flowId1 = new FlowId(1L);
     private final PacketMatch match = new PacketMatchBuilder().build();
-    private final PortNumber port = new PortNumber((short) 1);
+    private final PortNumber port = PortNumber.uint16((short) 1);
 
     /**
      * Creates a PathFlowIntent.
diff --git a/src/test/java/net/onrc/onos/core/newintent/SingleDstTreeFlowIntentTest.java b/src/test/java/net/onrc/onos/core/newintent/SingleDstTreeFlowIntentTest.java
index 3799889..2c4b969 100644
--- a/src/test/java/net/onrc/onos/core/newintent/SingleDstTreeFlowIntentTest.java
+++ b/src/test/java/net/onrc/onos/core/newintent/SingleDstTreeFlowIntentTest.java
@@ -37,7 +37,7 @@
                 match,
                 Arrays.asList(switchPort1, switchPort2),
                 createTree(),
-                Arrays.asList((Action) new OutputAction(new PortNumber(port3))));
+                Arrays.asList((Action) new OutputAction(PortNumber.uint16(port3))));
         return new SingleDstTreeFlowIntent(intentId1, treeFlow);
     }
 
@@ -47,7 +47,7 @@
                 match,
                 Arrays.asList(switchPort1, switchPort3),
                 createTree(),
-                Arrays.asList((Action) new OutputAction(new PortNumber(port2))));
+                Arrays.asList((Action) new OutputAction(PortNumber.uint16(port2))));
         return new SingleDstTreeFlowIntent(intentId2, treeFlow);
     }
 
diff --git a/src/test/java/net/onrc/onos/core/topology/MockPacketOpticalTopology.java b/src/test/java/net/onrc/onos/core/topology/MockPacketOpticalTopology.java
index 79db75c..36b6abf 100644
--- a/src/test/java/net/onrc/onos/core/topology/MockPacketOpticalTopology.java
+++ b/src/test/java/net/onrc/onos/core/topology/MockPacketOpticalTopology.java
@@ -36,8 +36,7 @@
     @Override
     public Port addPort(Switch sw, Long portNumber) {
         PortEvent portEvent = new PortEvent(sw.getDpid(),
-                                            new PortNumber(portNumber
-                                                                   .shortValue()));
+                                    PortNumber.uint16(portNumber.shortValue()));
         portEvent.createStringAttribute(TopologyElement.TYPE,
                                         TopologyElement.TYPE_PACKET_LAYER);
         portEvent.createStringAttribute(TopologyElement.ELEMENT_TYPE,
@@ -85,8 +84,7 @@
     //todo - add t-port specific properties
     public Port addTPort(Switch sw, Long portNumber) {
         PortEvent portEvent = new PortEvent(sw.getDpid(),
-                                            new PortNumber(portNumber
-                                                                   .shortValue()));
+                                    PortNumber.uint16(portNumber.shortValue()));
         portEvent.createStringAttribute(TopologyElement.TYPE,
                                         TopologyElement.TYPE_OPTICAL_LAYER);
         portEvent.createStringAttribute(TopologyElement.ELEMENT_TYPE,
@@ -109,8 +107,7 @@
     //todo - add w-port specific properties
     public Port addWPort(Switch sw, Long portNumber) {
         PortEvent portEvent = new PortEvent(sw.getDpid(),
-                                            new PortNumber(portNumber
-                                                                   .shortValue()));
+                                    PortNumber.uint16(portNumber.shortValue()));
         portEvent.createStringAttribute(TopologyElement.TYPE,
                                         TopologyElement.TYPE_OPTICAL_LAYER);
         portEvent.createStringAttribute(TopologyElement.ELEMENT_TYPE,
@@ -146,8 +143,8 @@
 
         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());
+        final PortNumber srcPortNum = PortNumber.uint16(srcPortNo.shortValue());
+        final PortNumber dstPortNum = PortNumber.uint16(dstPortNo.shortValue());
         LinkEvent linkEvent = new LinkEvent(new SwitchPort(srcDpidObj,
                                                            srcPortNum),
                                             new SwitchPort(dstDpidObj,
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 6afffb6..05660f7 100644
--- a/src/test/java/net/onrc/onos/core/topology/MockTopology.java
+++ b/src/test/java/net/onrc/onos/core/topology/MockTopology.java
@@ -29,7 +29,7 @@
 
     public Port addPort(Switch sw, Long portNumber) {
         PortEvent port = new PortEvent(sw.getDpid(),
-                                new PortNumber(portNumber.shortValue()));
+                                PortNumber.uint16(portNumber.shortValue()));
         ((TopologyImpl) this).putPort(port);
         return this.getPort(port.getSwitchPort());
     }
@@ -149,9 +149,9 @@
     public void removeLink(Long srcDpid, Long srcPortNo, Long dstDpid,
                            Long dstPortNo) {
         this.removeLink(new Dpid(srcDpid),
-                           new PortNumber(srcPortNo.shortValue()),
+                           PortNumber.uint16(srcPortNo.shortValue()),
                            new Dpid(dstDpid),
-                           new PortNumber(dstPortNo.shortValue()));
+                           PortNumber.uint16(dstPortNo.shortValue()));
     }
 
     public void removeLink(Dpid srcDpid, PortNumber srcPortNo,
diff --git a/src/test/java/net/onrc/onos/core/util/LinkTupleTest.java b/src/test/java/net/onrc/onos/core/util/LinkTupleTest.java
index 290b136..e281404 100644
--- a/src/test/java/net/onrc/onos/core/util/LinkTupleTest.java
+++ b/src/test/java/net/onrc/onos/core/util/LinkTupleTest.java
@@ -11,9 +11,9 @@
 public class LinkTupleTest {
 
     private static final Dpid SRC_DPID = new Dpid(9);
-    private static final PortNumber SRC_PORT_NUM = new PortNumber((short) 56);
+    private static final PortNumber SRC_PORT_NUM = PortNumber.uint16((short) 56);
     private static final Dpid DST_DPID = new Dpid(12);
-    private static final PortNumber DST_PORT_NUM = new PortNumber((short) 81);
+    private static final PortNumber DST_PORT_NUM = PortNumber.uint16((short) 81);
 
     private static final SwitchPort SRC = new SwitchPort(SRC_DPID, SRC_PORT_NUM);
     private static final SwitchPort DST = new SwitchPort(DST_DPID, DST_PORT_NUM);
@@ -21,8 +21,8 @@
 
     private static final LinkTuple L1 = new LinkTuple(SRC, DST);
     private static final LinkTuple L2 = new LinkTuple(
-            new SwitchPort(new Dpid(1), new PortNumber((short) 65535)),
-            new SwitchPort(new Dpid(2), new PortNumber((short) 65534)));
+            new SwitchPort(new Dpid(1), PortNumber.uint16((short) 65535)),
+            new SwitchPort(new Dpid(2), PortNumber.uint16((short) 65534)));
 
     /**
      * Test to confirm class definition is immutable.
diff --git a/src/test/java/net/onrc/onos/core/util/PortNumberTest.java b/src/test/java/net/onrc/onos/core/util/PortNumberTest.java
index d9fbddc..fa16481 100644
--- a/src/test/java/net/onrc/onos/core/util/PortNumberTest.java
+++ b/src/test/java/net/onrc/onos/core/util/PortNumberTest.java
@@ -102,9 +102,9 @@
      */
     @Test
     public void testShortValue() {
-        assertEquals(0L, new PortNumber((short) 0).shortValue());
+        assertEquals(0L, PortNumber.uint16((short) 0).shortValue());
 
-        assertEquals(1L, new PortNumber((short) 1).shortValue());
+        assertEquals(1L, PortNumber.uint16((short) 1).shortValue());
 
         // user of #shortValue() needs to be careful
         // simply widening them will result in negative value
@@ -121,9 +121,9 @@
      */
     @Test
     public void testLongValue() {
-        assertEquals(0L, new PortNumber((short) 0).value());
+        assertEquals(0L, PortNumber.uint16((short) 0).value());
 
-        assertEquals(1L, new PortNumber((short) 1).value());
+        assertEquals(1L, PortNumber.uint16((short) 1).value());
 
         assertEquals(0xffffL, new PortNumber(PORT_NONE).value());
     }
@@ -133,9 +133,9 @@
      */
     @Test
     public void testToString() {
-        assertEquals("0", new PortNumber((short) 0).toString());
+        assertEquals("0", PortNumber.uint16((short) 0).toString());
 
-        assertEquals("1", new PortNumber((short) 1).toString());
+        assertEquals("1", PortNumber.uint16((short) 1).toString());
 
         // 0xffff in decimal
         assertEquals("65535", new PortNumber(PORT_NONE).toString());
@@ -147,11 +147,11 @@
     @Test
     public void testEqualsObject() {
         // Some trivial
-        assertTrue(new PortNumber(PORT_NONE).equals(new PortNumber((short) 0xffff)));
-        assertFalse(new PortNumber((short) 0).equals(new PortNumber((short) 1)));
+        assertTrue(new PortNumber(PORT_NONE).equals(PortNumber.uint16((short) 0xffff)));
+        assertFalse(PortNumber.uint16((short) 0).equals(PortNumber.uint16((short) 1)));
 
         // different type
-        assertFalse(new PortNumber((short) 0).equals(Short.valueOf((short) 0)));
+        assertFalse(PortNumber.uint16((short) 0).equals(Short.valueOf((short) 0)));
 
     }
 
diff --git a/src/test/java/net/onrc/onos/core/util/PortNumberUtilsTest.java b/src/test/java/net/onrc/onos/core/util/PortNumberUtilsTest.java
new file mode 100644
index 0000000..2785c70
--- /dev/null
+++ b/src/test/java/net/onrc/onos/core/util/PortNumberUtilsTest.java
@@ -0,0 +1,100 @@
+package net.onrc.onos.core.util;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+import org.projectfloodlight.openflow.protocol.OFFactories;
+import org.projectfloodlight.openflow.protocol.OFPortDesc;
+import org.projectfloodlight.openflow.protocol.OFVersion;
+import org.projectfloodlight.openflow.types.OFPort;
+
+/**
+ * Tests for {@link PortNumberUtils}.
+ */
+public class PortNumberUtilsTest {
+
+
+    /**
+     * Tests for {@link PortNumberUtils#of(OFVersion, int))}.
+     */
+    @Test
+    public void testOfOFVersionInt() {
+
+        assertEquals(PortNumber.uint32(0x1ffff),
+                PortNumberUtils.openFlow(OFVersion.OF_13, 0x1FFFF));
+
+        assertEquals(PortNumber.uint16((short) 0xabc),
+                PortNumberUtils.openFlow(OFVersion.OF_10, 0xabc));
+
+        try {
+            PortNumberUtils.openFlow(OFVersion.OF_10, 0x1FFFF);
+            fail("Should have thrown IllegalArgumentException");
+        } catch (IllegalArgumentException e) { // CHECKSTYLE IGNORE THIS LINE
+            // should throw
+        }
+    }
+
+    /**
+     * Tests for {@link PortNumberUtils#openFlow(OFPortDesc)}.
+     */
+    @Test
+    public void testOfOFPortDesc() {
+        final OFPortDesc desc10 = OFFactories.getFactory(OFVersion.OF_10)
+                .buildPortDesc()
+                .setPortNo(OFPort.of(123))
+                .build();
+
+        assertEquals(PortNumber.uint16((short) 123),
+                PortNumberUtils.openFlow(desc10));
+
+        final OFPortDesc desc13 = OFFactories.getFactory(OFVersion.OF_13)
+                .buildPortDesc()
+                .setPortNo(OFPort.of(0x1FFFF))
+                .build();
+
+        assertEquals(PortNumber.uint32(0x1FFFF),
+                PortNumberUtils.openFlow(desc13));
+    }
+
+    /**
+     * Tests for {@link PortNumberUtils#toOF10(int)}.
+     */
+    @Test
+    public void testToOF10() {
+        assertEquals((short) 0, PortNumberUtils.toOF10(0));
+        assertEquals((short) 1, PortNumberUtils.toOF10(1));
+        assertEquals((short) 0xFF00, PortNumberUtils.toOF10(0xFF00));
+        for (int i = 0xFF00 + 1; i < 0xFFf8; ++i) {
+            try {
+                PortNumberUtils.toOF10(i);
+                fail("Should have thrown IllegalArgumentException");
+            } catch (IllegalArgumentException e) { // CHECKSTYLE IGNORE THIS LINE
+                // should throw
+            }
+        }
+        assertEquals((short) 0xFFf8, PortNumberUtils.toOF10(0xFFf8));
+        assertEquals((short) 0xFFff, PortNumberUtils.toOF10(0xFFff));
+
+
+        // OFPort#getPortNumber can return int value outside OF1.0
+        // verifty that toOF10 converts them into valid OF1.0 range
+        assertEquals((short) 0xFF00,
+                PortNumberUtils.toOF10(OFPort.MAX.getPortNumber()));
+        assertEquals((short) 0xFFf8,
+                PortNumberUtils.toOF10(OFPort.IN_PORT.getPortNumber()));
+        assertEquals((short) 0xFFf9,
+                PortNumberUtils.toOF10(OFPort.TABLE.getPortNumber()));
+        assertEquals((short) 0xFFfa,
+                PortNumberUtils.toOF10(OFPort.NORMAL.getPortNumber()));
+        assertEquals((short) 0xFFfb,
+                PortNumberUtils.toOF10(OFPort.FLOOD.getPortNumber()));
+        assertEquals((short) 0xFFfc,
+                PortNumberUtils.toOF10(OFPort.ALL.getPortNumber()));
+        assertEquals((short) 0xFFfd,
+                PortNumberUtils.toOF10(OFPort.CONTROLLER.getPortNumber()));
+        assertEquals((short) 0xFFfe,
+                PortNumberUtils.toOF10(OFPort.LOCAL.getPortNumber()));
+        assertEquals((short) 0xFFff, // OFPP_NONE
+                PortNumberUtils.toOF10(OFPort.ANY.getPortNumber()));
+    }
+}
diff --git a/src/test/java/net/onrc/onos/core/util/SwitchPortTest.java b/src/test/java/net/onrc/onos/core/util/SwitchPortTest.java
index 2832dc1..af9efad 100644
--- a/src/test/java/net/onrc/onos/core/util/SwitchPortTest.java
+++ b/src/test/java/net/onrc/onos/core/util/SwitchPortTest.java
@@ -10,11 +10,11 @@
 public class SwitchPortTest {
 
     private static final Dpid DPID = new Dpid(9);
-    private static final PortNumber PORT_NUM = new PortNumber((short) 56);
+    private static final PortNumber PORT_NUM = PortNumber.uint16((short) 56);
 
     private static final SwitchPort SWP1 = new SwitchPort(DPID, PORT_NUM);
     private static final SwitchPort SWP2 = new SwitchPort(new Dpid(1),
-                                                 new PortNumber((short) 65535));
+                                                 PortNumber.uint16((short) 65535));
 
     /**
      * Tests to confirm 2-arg constructor.
diff --git a/src/test/java/net/onrc/onos/core/util/serializers/KryoFactoryTest.java b/src/test/java/net/onrc/onos/core/util/serializers/KryoFactoryTest.java
index 38a37a0..01b27ea 100644
--- a/src/test/java/net/onrc/onos/core/util/serializers/KryoFactoryTest.java
+++ b/src/test/java/net/onrc/onos/core/util/serializers/KryoFactoryTest.java
@@ -48,8 +48,8 @@
 
     private static final Dpid DPID_A = new Dpid(0x1234L);
     private static final Dpid DPID_B = new Dpid(Long.MAX_VALUE);
-    private static final PortNumber PORT_NO_A = new PortNumber((short) 42);
-    private static final PortNumber PORT_NO_B = new PortNumber((short) 65534);
+    private static final PortNumber PORT_NO_A = PortNumber.uint16((short) 42);
+    private static final PortNumber PORT_NO_B = PortNumber.uint16((short) 65534);
     private static final String ONOS_INSTANCE_NAME = "ONOS-Instance-Test";
 
     private static final double SEC_IN_NANO = 1000 * 1000 * 1000.0;
