diff --git a/src/main/java/net/floodlightcontroller/core/IOFSwitch.java b/src/main/java/net/floodlightcontroller/core/IOFSwitch.java
index 770ae5a63ad96d181945a6331ee45c7f63c3cc4f..e24973754c39c7d7db9849dc52b92885302c2cf1 100644
--- a/src/main/java/net/floodlightcontroller/core/IOFSwitch.java
+++ b/src/main/java/net/floodlightcontroller/core/IOFSwitch.java
@@ -82,7 +82,7 @@ public interface IOFSwitch {
     }
 
     public enum PortChangeType {
-        ADD, UPDATE, DELETE
+        ADD, OTHER_UPDATE, DELETE, UP, DOWN,
     }
 
     /**
@@ -269,11 +269,11 @@ public interface IOFSwitch {
     public Collection<OFPhysicalPort> getPorts();
 
     /**
-     * @param portName
+     * @param portNumber
      * @return Whether a port is enabled per latest port status message
      * (not configured down nor link down nor in spanning tree blocking state)
      */
-    public boolean portEnabled(short portName);
+    public boolean portEnabled(short portNumber);
 
     /**
      * @param portNumber
diff --git a/src/main/java/net/floodlightcontroller/core/internal/OFChannelHandler.java b/src/main/java/net/floodlightcontroller/core/internal/OFChannelHandler.java
index 6e479775464ed758a5f6f5a6145b7bf811c4e43f..744c964fc1390f97f7d8246ed72cd539a24d3bad 100644
--- a/src/main/java/net/floodlightcontroller/core/internal/OFChannelHandler.java
+++ b/src/main/java/net/floodlightcontroller/core/internal/OFChannelHandler.java
@@ -969,17 +969,31 @@ class OFChannelHandler
             short portNumber = m.getDesc().getPortNumber();
             OFPhysicalPort port = m.getDesc();
             OFPortReason reason = OFPortReason.fromReasonCode(m.getReason());
-
             PortChangeType changeType = null;
+
             switch(reason) {
                 case OFPPR_MODIFY:
+                    boolean oldEnabled =
+                        h.sw.portEnabled(port.getPortNumber());
+
                     h.sw.setPort(port);
-                    changeType = PortChangeType.UPDATE;
+                    boolean newEnabled =
+                            h.sw.portEnabled(port.getPortNumber());
+
+                    if (!oldEnabled && newEnabled)
+                        changeType = PortChangeType.UP;
+                    else if (oldEnabled && !newEnabled)
+                        changeType = PortChangeType.DOWN;
+                    else changeType = PortChangeType.OTHER_UPDATE;
+
                     log.debug("Port #{} modified for {}", portNumber, h.sw);
                     break;
                 case OFPPR_ADD:
                     h.sw.setPort(port);
-                    changeType = PortChangeType.ADD;
+                    if (h.sw.portEnabled(port.getPortNumber()))
+                        changeType = PortChangeType.UP;
+                    else
+                        changeType = PortChangeType.ADD;
                     log.debug("Port #{} added for {}", portNumber, h.sw);
                     break;
                 case OFPPR_DELETE:
diff --git a/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkDiscoveryManager.java b/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkDiscoveryManager.java
index 783760a91828b67a078bc6173122296a9958c400..ef93ec08fb34d1fbc0433af9b845a54063d8f9df 100644
--- a/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkDiscoveryManager.java
+++ b/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkDiscoveryManager.java
@@ -503,8 +503,6 @@ public class LinkDiscoveryManager implements IOFMessageListener,
                 debugCounters.updateCounter("linkdiscovery-incoming");
                 return this.handlePacketIn(sw.getId(), (OFPacketIn) msg,
                                            cntx);
-//            case PORT_STATUS:
-//                return this.handlePortStatus(sw.getId(), (OFPortStatus) msg);
             default:
                 break;
         }
@@ -1602,13 +1600,13 @@ public class LinkDiscoveryManager implements IOFMessageListener,
             IOFSwitch.PortChangeType type) {
 
         switch (type) {
-        case ADD:
+        case UP:
             processNewPort(switchId, port.getPortNumber());
             break;
-        case DELETE:
+        case DELETE: case DOWN:
             handlePortDown(switchId, port.getPortNumber());
             break;
-        case UPDATE:
+        case OTHER_UPDATE: case ADD:
             // This is something other than port add or delete.
             // Topology does not worry about this.
             // If for some reason the port features change, which
diff --git a/src/test/java/net/floodlightcontroller/core/internal/ControllerTest.java b/src/test/java/net/floodlightcontroller/core/internal/ControllerTest.java
index ff87897abd2594719185711d6d598de2d82f5994..a8be0c5222d01b1f65e6990ee9633c1a6b3d86c3 100644
--- a/src/test/java/net/floodlightcontroller/core/internal/ControllerTest.java
+++ b/src/test/java/net/floodlightcontroller/core/internal/ControllerTest.java
@@ -1971,11 +1971,11 @@ public class ControllerTest extends FloodlightTestCase {
        controller.addOFSwitchListener(listener);
        // setup switch with the new, second features reply (and thus ports)
        setupSwitchForAddSwitch(sw, dpid, desc, fr2);
-       listener.switchPortChanged(dpid, p2, PortChangeType.UPDATE);
+       listener.switchPortChanged(dpid, p2, PortChangeType.OTHER_UPDATE);
        expectLastCall().once();
        replay(listener);
        replay(sw);
-       controller.notifyPortChanged(sw, p2, PortChangeType.UPDATE);
+       controller.notifyPortChanged(sw, p2, PortChangeType.OTHER_UPDATE);
        controller.processUpdateQueueForTesting();
        verify(listener);
        verify(sw);
diff --git a/src/test/java/net/floodlightcontroller/core/internal/OFChannelHandlerTest.java b/src/test/java/net/floodlightcontroller/core/internal/OFChannelHandlerTest.java
index 62c27ac2598150580e4682d6ce4665f2eea2a4bc..5d15c008c8f579239c654d29d7d8db0ff4d7a1dc 100644
--- a/src/test/java/net/floodlightcontroller/core/internal/OFChannelHandlerTest.java
+++ b/src/test/java/net/floodlightcontroller/core/internal/OFChannelHandlerTest.java
@@ -1193,10 +1193,11 @@ public class OFChannelHandlerTest {
         expect(sw.getId()).andReturn(dpid).anyTimes();
         sw.setPort(p);
         expectLastCall().once();
+        expect(sw.portEnabled((short)1)).andReturn(true).anyTimes();
         replay(sw);
 
         reset(controller);
-        controller.notifyPortChanged(sw, p, PortChangeType.ADD);
+        controller.notifyPortChanged(sw, p, PortChangeType.UP);
         expectLastCall().once();
         sendMessageToHandlerNoControllerReset(
                Collections.<OFMessage>singletonList(ps));
@@ -1211,10 +1212,11 @@ public class OFChannelHandlerTest {
         expect(sw.getId()).andReturn(dpid).anyTimes();
         sw.setPort(p);
         expectLastCall().once();
+        expect(sw.portEnabled((short)1)).andReturn(true).anyTimes();
         replay(sw);
 
         reset(controller);
-        controller.notifyPortChanged(sw, p, PortChangeType.UPDATE);
+        controller.notifyPortChanged(sw, p, PortChangeType.OTHER_UPDATE);
         expectLastCall().once();
         sendMessageToHandlerNoControllerReset(
                Collections.<OFMessage>singletonList(ps));