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 fc30f12..b44f32b 100644
--- a/src/main/java/net/onrc/onos/apps/forwarding/Forwarding.java
+++ b/src/main/java/net/onrc/onos/apps/forwarding/Forwarding.java
@@ -422,7 +422,7 @@
                         if (le.getSrc().getDpid().equals(sw.getDpid())) {
                             log.trace("The packet-in sw dpid {} is on the path.", sw.getDpid());
                             isflowEntryForThisSwitch = true;
-                            outPort = le.getSrc().getNumber().value();
+                            outPort = le.getSrc().getPortNumber().value();
                             break;
                         }
                     }
@@ -527,7 +527,7 @@
             outPort = (short) spfIntent.getDstPortNumber();
             log.debug("Path is empty. Maybe devices on the same switch. outPort {}", outPort);
         } else {
-            outPort = graphPath.get(0).getSrc().getNumber().value();
+            outPort = graphPath.get(0).getSrc().getPortNumber().value();
             log.debug("path{}, outPort {}", graphPath, outPort);
         }
 
diff --git a/src/main/java/net/onrc/onos/core/intent/PathIntentMap.java b/src/main/java/net/onrc/onos/core/intent/PathIntentMap.java
index 7b93acc..2469f99 100644
--- a/src/main/java/net/onrc/onos/core/intent/PathIntentMap.java
+++ b/src/main/java/net/onrc/onos/core/intent/PathIntentMap.java
@@ -35,7 +35,7 @@
      */
     private HashSet<PathIntent> get(SwitchPort swPort) {
         Dpid dpid = swPort.getDpid();
-        PortNumber port = swPort.getNumber();
+        PortNumber port = swPort.getPortNumber();
         HashMap<PortNumber, HashSet<PathIntent>> portToIntents = intents.get(dpid);
         if (portToIntents == null) {
             portToIntents = new HashMap<>();
@@ -103,7 +103,7 @@
     public Collection<PathIntent> getIntentsByLink(LinkEvent linkEvent) {
         return getIntentsByPort(
                 linkEvent.getSrc().getDpid(),
-                linkEvent.getSrc().getNumber());
+                linkEvent.getSrc().getPortNumber());
     }
 
     /**
diff --git a/src/main/java/net/onrc/onos/core/intent/runtime/PathCalcRuntimeModule.java b/src/main/java/net/onrc/onos/core/intent/runtime/PathCalcRuntimeModule.java
index d41296b..94f3b28 100644
--- a/src/main/java/net/onrc/onos/core/intent/runtime/PathCalcRuntimeModule.java
+++ b/src/main/java/net/onrc/onos/core/intent/runtime/PathCalcRuntimeModule.java
@@ -664,8 +664,8 @@
         boolean rerouteAll = false;
         for (LinkEvent le : addedLinkEvents) {
             LinkEvent rev = new LinkEvent(le.getDst().getDpid(),
-                    le.getDst().getNumber(), le.getSrc().getDpid(),
-                    le.getSrc().getNumber());
+                    le.getDst().getPortNumber(), le.getSrc().getDpid(),
+                    le.getSrc().getPortNumber());
             if (unmatchedLinkEvents.contains(rev)) {
                 rerouteAll = true;
                 unmatchedLinkEvents.remove(rev);
@@ -704,7 +704,7 @@
             for (PortEvent portEvent : removedPortEvents) {
                 affectedPaths.addAll(pathIntents.getIntentsByPort(
                         portEvent.getDpid(),
-                        portEvent.getNumber()));
+                        portEvent.getPortNumber()));
             }
             p.log("end_getIntentsByPort");
 
diff --git a/src/main/java/net/onrc/onos/core/intent/runtime/PlanCalcRuntime.java b/src/main/java/net/onrc/onos/core/intent/runtime/PlanCalcRuntime.java
index c47c832..07f7bec 100644
--- a/src/main/java/net/onrc/onos/core/intent/runtime/PlanCalcRuntime.java
+++ b/src/main/java/net/onrc/onos/core/intent/runtime/PlanCalcRuntime.java
@@ -119,7 +119,7 @@
             List<FlowEntry> entries = new ArrayList<>();
             for (LinkEvent linkEvent : intent.getPath()) {
                 long sw = linkEvent.getSrc().getDpid().value();
-                dstPort = linkEvent.getSrc().getNumber().value();
+                dstPort = linkEvent.getSrc().getPortNumber().value();
                 FlowEntry fe = new FlowEntry(sw, srcPort, dstPort, srcMac, dstMac,
                                              srcIP, dstIP, i.operator);
                 if (sw != firstSrcSw) {
@@ -134,7 +134,7 @@
                     fe.setFlowEntryId(cookieId);
                 }
                 entries.add(fe);
-                srcPort = linkEvent.getDst().getNumber().value();
+                srcPort = linkEvent.getDst().getPortNumber().value();
             }
             if (lastDstSw >= 0 && lastDstPort >= 0) {
                 long sw = lastDstSw;
diff --git a/src/main/java/net/onrc/onos/core/intent/runtime/web/ShortestPathResource.java b/src/main/java/net/onrc/onos/core/intent/runtime/web/ShortestPathResource.java
index 58f9b2d..69e55d0 100644
--- a/src/main/java/net/onrc/onos/core/intent/runtime/web/ShortestPathResource.java
+++ b/src/main/java/net/onrc/onos/core/intent/runtime/web/ShortestPathResource.java
@@ -66,9 +66,9 @@
             for (LinkEvent linkEvent : path) {
                 Link link = topology.getLink(
                         linkEvent.getSrc().getDpid(),
-                        linkEvent.getSrc().getNumber(),
+                        linkEvent.getSrc().getPortNumber(),
                         linkEvent.getDst().getDpid(),
-                        linkEvent.getDst().getNumber());
+                        linkEvent.getDst().getPortNumber());
                 if (link == null) {
                     return null;
                 }
diff --git a/src/main/java/net/onrc/onos/core/topology/LinkEvent.java b/src/main/java/net/onrc/onos/core/topology/LinkEvent.java
index f72a429..140e4c7 100644
--- a/src/main/java/net/onrc/onos/core/topology/LinkEvent.java
+++ b/src/main/java/net/onrc/onos/core/topology/LinkEvent.java
@@ -81,8 +81,8 @@
     }
 
     public ByteBuffer getIDasByteBuffer() {
-        return getLinkID(src.getDpid(), src.getNumber(),
-                dst.getDpid(), dst.getNumber());
+        return getLinkID(src.getDpid(), src.getPortNumber(),
+                dst.getDpid(), dst.getPortNumber());
     }
 
     @Override
diff --git a/src/main/java/net/onrc/onos/core/topology/PortEvent.java b/src/main/java/net/onrc/onos/core/topology/PortEvent.java
index 8d3c945..114b3ef 100644
--- a/src/main/java/net/onrc/onos/core/topology/PortEvent.java
+++ b/src/main/java/net/onrc/onos/core/topology/PortEvent.java
@@ -43,8 +43,8 @@
         return id.getDpid();
     }
 
-    public PortNumber getNumber() {
-        return id.getNumber();
+    public PortNumber getPortNumber() {
+        return id.getPortNumber();
     }
 
     @Override
@@ -68,7 +68,7 @@
 
     @Override
     public String toString() {
-        return "[PortEvent 0x" + getDpid() + "@" + getNumber() + "]";
+        return "[PortEvent 0x" + getDpid() + "@" + getPortNumber() + "]";
     }
 
     public static final int PORTID_BYTES = SwitchEvent.SWITCHID_BYTES + 2 + 8;
@@ -95,7 +95,7 @@
     }
 
     public ByteBuffer getIDasByteBuffer() {
-        return getPortID(getDpid(), getNumber());
+        return getPortID(getDpid(), getPortNumber());
     }
 
 }
diff --git a/src/main/java/net/onrc/onos/core/topology/TopologyDatastore.java b/src/main/java/net/onrc/onos/core/topology/TopologyDatastore.java
index 171e87f..79afc77 100644
--- a/src/main/java/net/onrc/onos/core/topology/TopologyDatastore.java
+++ b/src/main/java/net/onrc/onos/core/topology/TopologyDatastore.java
@@ -47,7 +47,7 @@
         groupOp.add(rcSwitch.forceCreateOp(client));
 
         for (PortEvent portEvent : portEvents) {
-            KVPort rcPort = new KVPort(sw.getDpid(), portEvent.getNumber());
+            KVPort rcPort = new KVPort(sw.getDpid(), portEvent.getPortNumber());
             rcPort.setStatus(KVPort.STATUS.ACTIVE);
 
             groupOp.add(rcPort.forceCreateOp(client));
@@ -87,7 +87,7 @@
         groupOp.add(rcSwitch.forceCreateOp(client));
 
         for (PortEvent portEvent : portEvents) {
-            KVPort rcPort = new KVPort(sw.getDpid(), portEvent.getNumber());
+            KVPort rcPort = new KVPort(sw.getDpid(), portEvent.getPortNumber());
             rcPort.setStatus(KVPort.STATUS.INACTIVE);
 
             groupOp.add(rcPort.forceCreateOp(client));
@@ -107,7 +107,7 @@
     public boolean addPort(PortEvent port) {
         log.debug("Adding port {}", port);
 
-        KVPort rcPort = new KVPort(port.getDpid(), port.getNumber());
+        KVPort rcPort = new KVPort(port.getDpid(), port.getPortNumber());
         rcPort.setStatus(KVPort.STATUS.ACTIVE);
         rcPort.forceCreate();
         // TODO add description into KVPort
@@ -125,7 +125,7 @@
     public boolean deactivatePort(PortEvent port) {
         log.debug("Deactivating port {}", port);
 
-        KVPort rcPort = new KVPort(port.getDpid(), port.getNumber());
+        KVPort rcPort = new KVPort(port.getDpid(), port.getPortNumber());
         rcPort.setStatus(STATUS.INACTIVE);
 
         rcPort.forceCreate();
@@ -143,9 +143,9 @@
         log.debug("Adding link {}", link);
 
         KVLink rcLink = new KVLink(link.getSrc().getDpid(),
-                link.getSrc().getNumber(),
+                link.getSrc().getPortNumber(),
                 link.getDst().getDpid(),
-                link.getDst().getNumber());
+                link.getDst().getPortNumber());
 
         // XXX This method is called only by discovery,
         // which means what we are trying to write currently is the truth
@@ -161,8 +161,8 @@
     public boolean removeLink(LinkEvent linkEvent) {
         log.debug("Removing link {}", linkEvent);
 
-        KVLink rcLink = new KVLink(linkEvent.getSrc().getDpid(), linkEvent.getSrc().getNumber(),
-                linkEvent.getDst().getDpid(), linkEvent.getDst().getNumber());
+        KVLink rcLink = new KVLink(linkEvent.getSrc().getDpid(), linkEvent.getSrc().getPortNumber(),
+                linkEvent.getDst().getDpid(), linkEvent.getDst().getPortNumber());
         rcLink.forceDelete();
 
         return true;
@@ -180,7 +180,7 @@
         KVDevice rcDevice = new KVDevice(device.getMac().toBytes());
 
         for (SwitchPort sp : device.getAttachmentPoints()) {
-            byte[] portId = KVPort.getPortID(sp.getDpid(), sp.getNumber());
+            byte[] portId = KVPort.getPortID(sp.getDpid(), sp.getPortNumber());
             rcDevice.addPortId(portId);
         }
 
diff --git a/src/main/java/net/onrc/onos/core/topology/TopologyManager.java b/src/main/java/net/onrc/onos/core/topology/TopologyManager.java
index 190500f..8302ff3 100644
--- a/src/main/java/net/onrc/onos/core/topology/TopologyManager.java
+++ b/src/main/java/net/onrc/onos/core/topology/TopologyManager.java
@@ -896,9 +896,9 @@
         }
         SwitchImpl switchImpl = getSwitchImpl(sw);
 
-        Port port = sw.getPort(portEvent.getNumber());
+        Port port = sw.getPort(portEvent.getPortNumber());
         if (port == null) {
-            port = new PortImpl(topology, sw, portEvent.getNumber());
+            port = new PortImpl(topology, sw, portEvent.getPortNumber());
             switchImpl.addPort(port);
         } else {
             // TODO: Update the port attributes
@@ -921,7 +921,7 @@
             return;
         }
 
-        Port port = sw.getPort(portEvent.getNumber());
+        Port port = sw.getPort(portEvent.getPortNumber());
         if (port == null) {
             log.warn("Port {} already removed, ignoring", portEvent);
             return;
@@ -980,9 +980,9 @@
     @GuardedBy("topology.writeLock")
     private void addLink(LinkEvent linkEvent) {
         Port srcPort = topology.getPort(linkEvent.getSrc().getDpid(),
-                linkEvent.getSrc().getNumber());
+                linkEvent.getSrc().getPortNumber());
         Port dstPort = topology.getPort(linkEvent.getDst().getDpid(),
-                linkEvent.getDst().getNumber());
+                linkEvent.getDst().getPortNumber());
         if ((srcPort == null) || (dstPort == null)) {
             log.debug("{} reordered because {} port is null", linkEvent,
                     (srcPort == null) ? "src" : "dst");
@@ -1037,7 +1037,7 @@
     @GuardedBy("topology.writeLock")
     private void removeLink(LinkEvent linkEvent) {
         Port srcPort = topology.getPort(linkEvent.getSrc().getDpid(),
-                linkEvent.getSrc().getNumber());
+                linkEvent.getSrc().getPortNumber());
         if (srcPort == null) {
             log.warn("Src Port for Link {} already removed, ignoring",
                     linkEvent);
@@ -1045,7 +1045,7 @@
         }
 
         Port dstPort = topology.getPort(linkEvent.getDst().getDpid(),
-                linkEvent.getDst().getNumber());
+                linkEvent.getDst().getPortNumber());
         if (dstPort == null) {
             log.warn("Dst Port for Link {} already removed, ignoring",
                     linkEvent);
@@ -1098,7 +1098,7 @@
         boolean attachmentFound = false;
         for (SwitchPort swp : deviceEvent.getAttachmentPoints()) {
             // Attached Ports must exist
-            Port port = topology.getPort(swp.getDpid(), swp.getNumber());
+            Port port = topology.getPort(swp.getDpid(), swp.getPortNumber());
             if (port == null) {
                 // Reordered event: delay the event in local cache
                 ByteBuffer id = deviceEvent.getIDasByteBuffer();
@@ -1151,7 +1151,7 @@
         // Process each attachment point
         for (SwitchPort swp : deviceEvent.getAttachmentPoints()) {
             // Attached Ports must exist
-            Port port = topology.getPort(swp.getDpid(), swp.getNumber());
+            Port port = topology.getPort(swp.getDpid(), swp.getPortNumber());
             if (port == null) {
                 log.warn("Port for the attachment point {} did not exist. skipping attachment point mutation", swp);
                 continue;
diff --git a/src/main/java/net/onrc/onos/core/util/SwitchPort.java b/src/main/java/net/onrc/onos/core/util/SwitchPort.java
index c2079a0..b9e1964 100644
--- a/src/main/java/net/onrc/onos/core/util/SwitchPort.java
+++ b/src/main/java/net/onrc/onos/core/util/SwitchPort.java
@@ -82,11 +82,11 @@
     }
 
     /**
-     * Get the port value of the Switch-Port.
+     * Get the port number of the Switch-Port.
      *
-     * @return the port value of the Switch-Port.
+     * @return the port number of the Switch-Port.
      */
-    public PortNumber getNumber() {
+    public PortNumber getPortNumber() {
         return port;
     }
 
diff --git a/src/main/java/net/onrc/onos/core/util/serializers/SwitchPortSerializer.java b/src/main/java/net/onrc/onos/core/util/serializers/SwitchPortSerializer.java
index 4ec491b..22a6679 100644
--- a/src/main/java/net/onrc/onos/core/util/serializers/SwitchPortSerializer.java
+++ b/src/main/java/net/onrc/onos/core/util/serializers/SwitchPortSerializer.java
@@ -37,7 +37,7 @@
         jsonGenerator.writeStringField("dpid",
                                        switchPort.getDpid().toString());
         jsonGenerator.writeStringField("portNumber",
-                                       switchPort.getNumber().toString());
+                                       switchPort.getPortNumber().toString());
 
         jsonGenerator.writeEndObject();
     }
