diff --git a/src/main/java/net/onrc/onos/apps/forwarding/Forwarding.java b/src/main/java/net/onrc/onos/apps/forwarding/Forwarding.java
index 7c229b6..127b2c0 100644
--- a/src/main/java/net/onrc/onos/apps/forwarding/Forwarding.java
+++ b/src/main/java/net/onrc/onos/apps/forwarding/Forwarding.java
@@ -397,6 +397,7 @@
 
                     boolean isflowEntryForThisSwitch = false;
                     net.onrc.onos.core.intent.Path path = pathIntent.getPath();
+                    // FIXME should switch to PortNumber, etc.
                     long outPort = -1;
 
                     if (spfIntent.getDstSwitchDpid() == sw.getDpid().value()) {
@@ -430,7 +431,7 @@
 
                         log.debug("Sending packet out from sw {}, outport{}", sw.getDpid(), outPort);
                         packetService.sendPacket(eth, new SwitchPort(
-                                sw.getDpid(), new PortNumber((short) outPort)));
+                                sw.getDpid(), PortNumber.uint16((short) outPort)));
                     }
                 } else {
                     // Flow path has not yet been installed to switches so save the
diff --git a/src/main/java/net/onrc/onos/apps/sdnip/Interface.java b/src/main/java/net/onrc/onos/apps/sdnip/Interface.java
index 463cac8..4052e81 100644
--- a/src/main/java/net/onrc/onos/apps/sdnip/Interface.java
+++ b/src/main/java/net/onrc/onos/apps/sdnip/Interface.java
@@ -73,7 +73,7 @@
     public SwitchPort getSwitchPort() {
         //TODO SwitchPort, Dpid and Port are mutable, but they could probably
         //be made immutable which would prevent the need to copy
-        return new SwitchPort(new Dpid(dpid), new PortNumber(port));
+        return new SwitchPort(new Dpid(dpid), PortNumber.uint16(port));
     }
 
     /**
diff --git a/src/main/java/net/onrc/onos/apps/sdnip/SdnIp.java b/src/main/java/net/onrc/onos/apps/sdnip/SdnIp.java
index e39f404..d6713d5 100644
--- a/src/main/java/net/onrc/onos/apps/sdnip/SdnIp.java
+++ b/src/main/java/net/onrc/onos/apps/sdnip/SdnIp.java
@@ -203,7 +203,7 @@
 
             bgpdAttachmentPoint = new SwitchPort(
                     new Dpid(config.getBgpdAttachmentDpid()),
-                    new PortNumber(config.getBgpdAttachmentPort()));
+                    PortNumber.uint16(config.getBgpdAttachmentPort()));
 
             bgpdMacAddress = config.getBgpdMacAddress();
             vlan = config.getVlan();
diff --git a/src/main/java/net/onrc/onos/core/hostmanager/HostManager.java b/src/main/java/net/onrc/onos/core/hostmanager/HostManager.java
index 9f6373d..a5e3bd9 100644
--- a/src/main/java/net/onrc/onos/core/hostmanager/HostManager.java
+++ b/src/main/java/net/onrc/onos/core/hostmanager/HostManager.java
@@ -29,6 +29,7 @@
 import net.onrc.onos.core.topology.Topology;
 import net.onrc.onos.core.util.Dpid;
 import net.onrc.onos.core.util.PortNumber;
+import net.onrc.onos.core.util.PortNumberUtils;
 
 import org.projectfloodlight.openflow.protocol.OFMessage;
 import org.projectfloodlight.openflow.protocol.OFPacketIn;
@@ -121,11 +122,13 @@
     protected Command processPacketIn(IOFSwitch sw, OFPacketIn pi, Ethernet eth,
             short inport) {
         if (log.isTraceEnabled()) {
-            log.trace("Receive PACKET_IN swId {}, portId {}", sw.getId(), pi.getInPort());
+            log.trace("Receive PACKET_IN swId {}, portId {}", sw.getId(), inport);
         }
 
         final Dpid dpid = new Dpid(sw.getId());
-        final PortNumber portNum = new PortNumber(inport);
+        // FIXME method signature needs to be fixed. losing port number precision
+        final PortNumber portNum = PortNumberUtils
+                            .openFlow(sw.getOFVersion(), inport);
 
         Host srcHost =
                 getSourceHostFromPacket(eth, dpid.value(), portNum.value());
diff --git a/src/main/java/net/onrc/onos/core/packetservice/BroadcastPacketOutNotification.java b/src/main/java/net/onrc/onos/core/packetservice/BroadcastPacketOutNotification.java
index 8a9c065..4f96302 100644
--- a/src/main/java/net/onrc/onos/core/packetservice/BroadcastPacketOutNotification.java
+++ b/src/main/java/net/onrc/onos/core/packetservice/BroadcastPacketOutNotification.java
@@ -92,7 +92,7 @@
             topology.acquireReadLock();
             try {
                 globalPort = topology.getPort(new Dpid(entry.getKey()),
-                    new PortNumber(entry.getValue()));
+                    PortNumber.uint16(entry.getValue()));
             } finally {
                 topology.releaseReadLock();
             }
diff --git a/src/main/java/net/onrc/onos/core/packetservice/PacketModule.java b/src/main/java/net/onrc/onos/core/packetservice/PacketModule.java
index 35aca3a..61fa735 100644
--- a/src/main/java/net/onrc/onos/core/packetservice/PacketModule.java
+++ b/src/main/java/net/onrc/onos/core/packetservice/PacketModule.java
@@ -157,6 +157,7 @@
 
         Ethernet eth = IFloodlightProviderService.bcStore.
                 get(cntx, IFloodlightProviderService.CONTEXT_PI_PAYLOAD);
+        // FIXME losing port number precision
         short inport = (short) cntx.getStorage()
                 .get(IFloodlightProviderService.CONTEXT_PI_INPORT);
 
@@ -165,7 +166,7 @@
         try {
             topology.acquireReadLock();
             Dpid dpid = new Dpid(sw.getId());
-            PortNumber p = new PortNumber(inport);
+            PortNumber p = PortNumber.uint16(inport);
             topologySwitch = topology.getSwitch(dpid);
             inPort = topology.getPort(dpid, p);
         } finally {
diff --git a/src/main/java/net/onrc/onos/core/topology/TopologyPublisher.java b/src/main/java/net/onrc/onos/core/topology/TopologyPublisher.java
index 2863523..7675aae 100644
--- a/src/main/java/net/onrc/onos/core/topology/TopologyPublisher.java
+++ b/src/main/java/net/onrc/onos/core/topology/TopologyPublisher.java
@@ -21,7 +21,6 @@
 import net.floodlightcontroller.core.module.IFloodlightService;
 import net.floodlightcontroller.core.util.SingletonTask;
 import net.floodlightcontroller.threadpool.IThreadPoolService;
-
 import net.onrc.onos.core.datagrid.IDatagridService;
 import net.onrc.onos.core.datagrid.IEventChannel;
 import net.onrc.onos.core.hostmanager.Host;
@@ -35,7 +34,7 @@
 import net.onrc.onos.core.registry.RegistryException;
 import net.onrc.onos.core.util.Dpid;
 import net.onrc.onos.core.util.OnosInstanceId;
-import net.onrc.onos.core.util.PortNumber;
+import net.onrc.onos.core.util.PortNumberUtils;
 import net.onrc.onos.core.util.SwitchPort;
 
 import org.apache.commons.lang3.concurrent.ConcurrentUtils;
@@ -260,7 +259,7 @@
         List<PortEvent> portEvents = new ArrayList<PortEvent>();
         for (OFPortDesc port : sw.getPorts()) {
             PortEvent portEvent = new PortEvent(dpid,
-                    new PortNumber(port.getPortNo().getShortPortNumber()));
+                                                PortNumberUtils.openFlow(port));
             // FIXME should be merging, with existing attrs, etc..
             // TODO define attr name as constant somewhere.
             // TODO populate appropriate attributes.
@@ -349,8 +348,8 @@
      */
     private void switchPortAdded(long switchId, OFPortDesc port) {
         final Dpid dpid = new Dpid(switchId);
-        PortEvent portEvent = new PortEvent(dpid,
-                new PortNumber(port.getPortNo().getShortPortNumber()));
+        final PortEvent portEvent = new PortEvent(dpid,
+                                        PortNumberUtils.openFlow(port));
         // FIXME should be merging, with existing attrs, etc..
         // TODO define attr name as constant somewhere.
         // TODO populate appropriate attributes.
@@ -371,8 +370,8 @@
     private void switchPortRemoved(long switchId, OFPortDesc port) {
         final Dpid dpid = new Dpid(switchId);
 
-        PortEvent portEvent = new PortEvent(dpid, new PortNumber(
-                port.getPortNo().getShortPortNumber()));
+        final PortEvent portEvent = new PortEvent(dpid,
+                                        PortNumberUtils.openFlow(port));
         // FIXME should be merging, with existing attrs, etc..
         // TODO define attr name as constant somewhere.
         // TODO populate appropriate attributes.
diff --git a/src/main/java/net/onrc/onos/core/util/PortNumber.java b/src/main/java/net/onrc/onos/core/util/PortNumber.java
index 0320a42..a9b42b0 100644
--- a/src/main/java/net/onrc/onos/core/util/PortNumber.java
+++ b/src/main/java/net/onrc/onos/core/util/PortNumber.java
@@ -35,7 +35,7 @@
      *
      * @param value the value to use.
      */
-    public PortNumber(short value) {
+    protected PortNumber(short value) {
         this.value = (int) shortToUnsignedLong(value);
     }
 
diff --git a/src/main/java/net/onrc/onos/core/util/PortNumberUtils.java b/src/main/java/net/onrc/onos/core/util/PortNumberUtils.java
new file mode 100644
index 0000000..38051ff
--- /dev/null
+++ b/src/main/java/net/onrc/onos/core/util/PortNumberUtils.java
@@ -0,0 +1,74 @@
+package net.onrc.onos.core.util;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import org.projectfloodlight.openflow.protocol.OFPortDesc;
+import org.projectfloodlight.openflow.protocol.OFVersion;
+import org.projectfloodlight.openflow.types.OFPort;
+
+/**
+ * {@link PortNumber} related utilities.
+ */
+public final class PortNumberUtils {
+
+    /**
+     * Gets {@link PortNumber} for specified port.
+     *
+     * @param ofVersion OF version to use translating {@code portNumber}
+     * @param portNumber treated as uint16 if {@link OFVersion#OF_10}
+     *                  uint32 otherwise
+     * @return {@link PortNumber}
+     */
+    public static PortNumber openFlow(OFVersion ofVersion, int portNumber) {
+        if (ofVersion == OFVersion.OF_10) {
+            return PortNumber.uint16(toOF10(portNumber));
+        } else {
+            return PortNumber.uint32(portNumber);
+        }
+    }
+
+    /**
+     * Gets {@link PortNumber} for specified port.
+     *
+     * @param desc {@link OFPortDesc}
+     * @return {@link PortNumber}
+     */
+    public static PortNumber openFlow(final OFPortDesc desc) {
+        if (checkNotNull(desc).getVersion() == OFVersion.OF_10) {
+            return PortNumber.uint16(desc.getPortNo().getShortPortNumber());
+        } else {
+            return PortNumber.uint32(desc.getPortNo().getPortNumber());
+        }
+    }
+
+    /**
+     * Validate OF1.0 port number.
+     *
+     * @param of10PortNumber 0F1.0 port number or {@link OFPort#getPortNumber()}
+     * @return OF1.0 port number
+     * @throws IllegalArgumentException if out of valid OF1.0 range
+     */
+    public static short toOF10(final int of10PortNumber) {
+        try {
+            // if the input was from OFPort#getPortNumber()
+            // some named/reserved port number to OF1.0 constants.
+            return OFPort.ofInt(of10PortNumber).getShortPortNumber();
+        } catch (IllegalArgumentException e) {
+            // OFPort#getShortPortNumber will rejects OF1.0 special ports
+            if (0xFFf8 <= of10PortNumber && of10PortNumber <= 0xFFff) {
+                // allow OF1.0 Fake output "ports" to pass
+                return (short) (0xFFFF & of10PortNumber);
+            } else if (0xFF00 == of10PortNumber) {
+                // allow OFPP_MAX
+                return (short) (0xFFFF & of10PortNumber);
+            }
+            throw e;
+        }
+    }
+
+    /**
+     * Avoid instantiation.
+     */
+    private PortNumberUtils() {}
+
+}
