diff --git a/src/main/java/net/floodlightcontroller/devicemanager/internal/DeviceManagerImpl.java b/src/main/java/net/floodlightcontroller/devicemanager/internal/DeviceManagerImpl.java
index 459f77c942edc69b3c36a614cb30985618ef02b6..2945e83afb3dc1095eab63d3a92730af9733f4f3 100755
--- a/src/main/java/net/floodlightcontroller/devicemanager/internal/DeviceManagerImpl.java
+++ b/src/main/java/net/floodlightcontroller/devicemanager/internal/DeviceManagerImpl.java
@@ -623,6 +623,7 @@ public class DeviceManagerImpl implements IDeviceManagerService, IOFMessageListe
     protected static Logger log = 
             LoggerFactory.getLogger(DeviceManagerImpl.class);
 
+    protected boolean topoChanged = false;
     protected Set<IDeviceManagerAware> deviceManagerAware;
     protected LinkedList<Update> updates;
     protected ReentrantReadWriteLock lock;
@@ -817,6 +818,19 @@ public class DeviceManagerImpl implements IDeviceManagerService, IOFMessageListe
     public Command processPacketInMessage(IOFSwitch sw, OFPacketIn pi, 
                                           FloodlightContext cntx) {
 
+        /**
+         * DeviceManager's internal structure needs to be cleaned up upon
+         * topology change.
+         * Make sure it is done before processing more packetIns.
+         */
+        while (topoChanged) {
+            try {
+                this.devMgrMaps.wait();
+            } catch (InterruptedException e) {
+                log.error ("DeviceManagerImpl: Interrupt exception: {}", e);
+            }
+        }
+
         Ethernet eth = IFloodlightProviderService.bcStore.get(
                     cntx, IFloodlightProviderService.CONTEXT_PI_PAYLOAD);
         /** If a broadcast or multicast packetIn comes from a port that's not allowed by higher
@@ -1575,7 +1589,9 @@ public class DeviceManagerImpl implements IDeviceManagerService, IOFMessageListe
      */
     @Override
     public void topologyChanged() {
-        deviceUpdateTask.reschedule(10, TimeUnit.MILLISECONDS);
+        // Halt packetIn processing to handle topoChange event.
+        topoChanged = true;
+        deviceUpdateTask.reschedule(1, TimeUnit.MILLISECONDS);
     }
 
     protected boolean isNewer(DeviceAttachmentPoint dap1,
@@ -2148,6 +2164,8 @@ public class DeviceManagerImpl implements IDeviceManagerService, IOFMessageListe
                         "Floodlight exiting");
                 System.exit(1);
             }
+            devMgrMaps.notify();
+            topoChanged = false;
         }
     }