diff --git a/src/main/java/net/floodlightcontroller/core/internal/Controller.java b/src/main/java/net/floodlightcontroller/core/internal/Controller.java
index a11d6793f93ad15ba919a4a98130490503233fdd..f9f44f460392d6fcfadb090af68556290461b6d1 100644
--- a/src/main/java/net/floodlightcontroller/core/internal/Controller.java
+++ b/src/main/java/net/floodlightcontroller/core/internal/Controller.java
@@ -69,6 +69,9 @@ import net.floodlightcontroller.counter.ICounterStoreService;
 import net.floodlightcontroller.debugcounter.IDebugCounterService;
 import net.floodlightcontroller.debugcounter.IDebugCounterService.CounterType;
 import net.floodlightcontroller.debugevent.IDebugEventService;
+import net.floodlightcontroller.debugevent.NullDebugEvent;
+import net.floodlightcontroller.debugevent.IDebugEventService.EventType;
+import net.floodlightcontroller.debugevent.IDebugEventService.MaxEventsRegistered;
 import net.floodlightcontroller.packet.Ethernet;
 import net.floodlightcontroller.packet.IPv4;
 import net.floodlightcontroller.perfmon.IPktInProcessingTimeService;
@@ -155,6 +158,8 @@ public class Controller implements IFloodlightProviderService,
     protected int openFlowPort = 6633;
     protected int workerThreads = 0;
 
+    // Event IDs for debug events
+    private int SWITCH_EVENT = -1;
 
     // This controller's current role that modules can use/query to decide
     // if they should operate in master or slave mode.
@@ -931,6 +936,7 @@ public class Controller implements IFloodlightProviderService,
             IOFSwitch oldSw = this.activeSwitches.put(dpid, sw);
             // Update event history
             addSwitchEvent(dpid, EvAction.SWITCH_CONNECTED, "None");
+            debugEvents.updateEvent(SWITCH_EVENT, new Object[] {sw.getId(), "connected"});
 
             if (oldSw == sw)  {
                 // Note == for object equality, not .equals for value
@@ -1110,6 +1116,7 @@ public class Controller implements IFloodlightProviderService,
             //       in switchActivated(). Should we have events on the
             //       slave as well?
             addSwitchEvent(dpid, EvAction.SWITCH_DISCONNECTED, "None");
+            debugEvents.updateEvent(SWITCH_EVENT, new Object[] {dpid, "disconnected"});
             counters.switchDisconnected.increment();
             IOFSwitch oldSw = this.activeSwitches.get(dpid);
             if (oldSw != sw) {
@@ -1361,7 +1368,6 @@ public class Controller implements IFloodlightProviderService,
             }
             evSwitch.reason = reason;
             evSwitch = evHistSwitch.put(evSwitch, actn);
-            debugEvents.flushEvents();
         }
 
     }
@@ -1773,9 +1779,6 @@ public class Controller implements IFloodlightProviderService,
         }
     }
 
-
-
-
     void switchActivated(IOFSwitch sw) {
         this.switchManager.switchActivated(sw);
     }
@@ -2239,6 +2242,23 @@ public class Controller implements IFloodlightProviderService,
             throw new FloodlightModuleException("Error while setting up sync service", e);
         }
         this.counters.createCounters(debugCounters);
+        registerControllerDebugEvents();
+    }
+
+    private void registerControllerDebugEvents() {
+        if (debugEvents == null) {
+            debugEvents = new NullDebugEvent();
+            return;
+        }
+        try {
+            SWITCH_EVENT = debugEvents.registerEvent(
+                               "controller", "switchevent", true,
+                               "Switch connected, disconnected or port changed",
+                               EventType.ALWAYS_LOG, 100,
+                               "Sw=%dpid, reason=%s", null);
+        } catch (MaxEventsRegistered e) {
+            e.printStackTrace();
+        }
     }
 
     @Override
diff --git a/src/main/java/net/floodlightcontroller/core/internal/OFChannelHandler.java b/src/main/java/net/floodlightcontroller/core/internal/OFChannelHandler.java
index 169e539c22b11aa68fdcc3b6dd86cc93404e7ccb..2c47dacf5f10883dcd0fb0e92bb005bb23c8ae6f 100644
--- a/src/main/java/net/floodlightcontroller/core/internal/OFChannelHandler.java
+++ b/src/main/java/net/floodlightcontroller/core/internal/OFChannelHandler.java
@@ -1360,7 +1360,7 @@ class OFChannelHandler
     public void channelIdle(ChannelHandlerContext ctx, IdleStateEvent e)
             throws Exception {
         OFMessage m = BasicFactory.getInstance().getMessage(OFType.ECHO_REQUEST);
-        e.getChannel().write(m);
+        e.getChannel().write(Collections.singletonList(m));
     }
 
     @Override
diff --git a/src/main/java/net/floodlightcontroller/debugevent/DebugEvent.java b/src/main/java/net/floodlightcontroller/debugevent/DebugEvent.java
index 1595380ce1eec77b370c0c7b3d49fb2144a01e2b..1a43b970c13c0e7e3e8feea2dadf9eaa0c652787 100644
--- a/src/main/java/net/floodlightcontroller/debugevent/DebugEvent.java
+++ b/src/main/java/net/floodlightcontroller/debugevent/DebugEvent.java
@@ -269,7 +269,7 @@ public class DebugEvent implements IFloodlightModule, IDebugEventService {
             }
             le.nextIndex++;
 
-            if (le.nextIndex >= le.maxCapacity) {
+            if (le.nextIndex >= le.maxCapacity || le.flushNow) {
                 // flush this buffer now
                 DebugEventHistory de = allEvents[eventId];
                 if (de.einfo.enabled) {
diff --git a/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkDiscoveryManager.java b/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkDiscoveryManager.java
index 2b7d72debf64a86f68fb5ca047c74a04a5e069b4..d9f111171897a66bbffaeb825e6cac75878fe303 100644
--- a/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkDiscoveryManager.java
+++ b/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkDiscoveryManager.java
@@ -145,7 +145,6 @@ public class LinkDiscoveryManager implements IOFMessageListener,
 
     // Event Ids for debug events
     private int LINK_EVENT = -1;
-    private int SWITCH_EVENT = -1;
 
     protected IFloodlightProviderService floodlightProvider;
     protected IStorageSourceService storageSource;
@@ -1648,9 +1647,6 @@ public class LinkDiscoveryManager implements IOFMessageListener,
 
     @Override
     public void switchRemoved(long sw) {
-        // Update event history - TODO move to controller.java
-        debugEvents.updateEvent(SWITCH_EVENT, new Object[] {sw, "disconnected"});
-
         List<Link> eraseList = new ArrayList<Link>();
         lock.writeLock().lock();
         try {
@@ -1690,8 +1686,6 @@ public class LinkDiscoveryManager implements IOFMessageListener,
                 processNewPort(sw.getId(), p);
             }
         }
-        // Update event history - TODO move to controller.java
-        debugEvents.updateEvent(SWITCH_EVENT, new Object[] {sw.getId(), "connected"});
         LDUpdate update = new LDUpdate(sw.getId(), null,
                                        UpdateOperation.SWITCH_UPDATED);
         updates.add(update);
@@ -2177,12 +2171,6 @@ public class LinkDiscoveryManager implements IOFMessageListener,
             return;
         }
         try {
-            SWITCH_EVENT = debugEvents.registerEvent(
-                               getName(), "switchevent", true,
-                               "Switch connected, disconnected or port changed",
-                               EventType.ALWAYS_LOG, 100,
-                               "Sw=%dpid, reason=%s", null);
-
             LINK_EVENT = debugEvents.registerEvent(
                                getName(), "linkevent", false,
                                "Direct OpenFlow links discovered or timed-out",
diff --git a/src/test/java/net/floodlightcontroller/debugevent/DebugEventTest.java b/src/test/java/net/floodlightcontroller/debugevent/DebugEventTest.java
index 67d18288f43adde2a44b982cbaaf2ce8da24ce4f..d5fbedb9550046a6efcb7b34d301120d387fc0f7 100644
--- a/src/test/java/net/floodlightcontroller/debugevent/DebugEventTest.java
+++ b/src/test/java/net/floodlightcontroller/debugevent/DebugEventTest.java
@@ -25,30 +25,50 @@ public class DebugEventTest extends FloodlightTestCase {
     @Test
     public void testRegisterAndUpdateEvent() {
         assertEquals(0, debugEvent.currentEvents.size());
-        int eventId = -1;
+        int eventId1 = -1, eventId2 = -1 ;
         try {
-            eventId = debugEvent.registerEvent("dbgevtest", "switchevent", true,
+            eventId1 = debugEvent.registerEvent("dbgevtest", "switchevent", true,
                                                "switchtest", EventType.ALWAYS_LOG,
                                                100, "Sw=%dpid, reason=%s", null);
+            eventId2 = debugEvent.registerEvent("dbgevtest", "pktinevent", false,
+                                               "pktintest", EventType.ALWAYS_LOG,
+                                               100, "Sw=%d, reason=%s", null);
         } catch (MaxEventsRegistered e) {
             e.printStackTrace();
         }
 
-        assertEquals(1, debugEvent.currentEvents.size());
-        assertEquals(eventId, debugEvent.moduleEvents.get("dbgevtest").
+        assertEquals(2, debugEvent.currentEvents.size());
+        assertEquals(eventId1, debugEvent.moduleEvents.get("dbgevtest").
                                              get("switchevent").intValue());
+        assertEquals(eventId2, debugEvent.moduleEvents.get("dbgevtest").
+                     get("pktinevent").intValue());
         assertEquals(true, debugEvent.containsModName("dbgevtest"));
         assertEquals(true, debugEvent.containsMEName("dbgevtest-switchevent"));
+        assertEquals(true, debugEvent.containsMEName("dbgevtest-pktinevent"));
+
+        assertEquals(0, DebugEvent.allEvents[eventId1].eventBuffer.size());
+        assertEquals(0, DebugEvent.allEvents[eventId2].eventBuffer.size());
+
+        // update is immediately flushed to global store
+        debugEvent.updateEvent(eventId1, new Object[] {1L, "connected"});
+        assertEquals(1, DebugEvent.allEvents[eventId1].eventBuffer.size());
+
+        // update is flushed only when flush is explicity called
+        debugEvent.updateEvent(eventId2, new Object[] {1L, "switch sent pkt-in"});
+        assertEquals(0, DebugEvent.allEvents[eventId2].eventBuffer.size());
 
-        assertEquals(0, DebugEvent.allEvents[eventId].eventBuffer.size());
-        debugEvent.updateEvent(eventId, new Object[] {1L, "connected"});
-        assertEquals(0, DebugEvent.allEvents[eventId].eventBuffer.size());
         debugEvent.flushEvents();
-        assertEquals(1, DebugEvent.allEvents[eventId].eventBuffer.size());
+        assertEquals(1, DebugEvent.allEvents[eventId1].eventBuffer.size());
+        assertEquals(1, DebugEvent.allEvents[eventId2].eventBuffer.size());
 
         DebugEventInfo de = debugEvent.getSingleEventHistory("dbgevtest-switchevent");
         assertEquals(1, de.events.size());
         assertEquals(true, de.events.get(0)
                          .contains("Sw=00:00:00:00:00:00:00:01, reason=connected"));
+
+        DebugEventInfo de2 = debugEvent.getSingleEventHistory("dbgevtest-pktinevent");
+        assertEquals(1, de2.events.size());
+        assertEquals(true, de2.events.get(0)
+                     .contains("Sw=1, reason=switch sent pkt-in"));
     }
 }