diff --git a/pykd/dbgevent.h b/pykd/dbgevent.h
new file mode 100644
index 0000000..5a577b9
--- /dev/null
+++ b/pykd/dbgevent.h
@@ -0,0 +1,129 @@
+/////////////////////////////////////////////////////////////////////////////////
+//  user-customizing debug event handler
+/////////////////////////////////////////////////////////////////////////////////
+
+#include "dbgeventcb.h"
+#include "dbgmodule.h"
+#include "pyaux.h"
+
+/////////////////////////////////////////////////////////////////////////////////
+
+class debugEvent : public DebugBaseEventCallbacks
+{
+public:
+
+    debugEvent();
+
+    virtual ~debugEvent();
+
+    virtual ULONG onBreakpoint(boost::python::dict &/*bpParameters*/) = 0;
+
+    virtual ULONG onException(boost::python::dict &/*exceptData*/) = 0;
+
+    virtual ULONG onLoadModule(const dbgModuleClass &/* module */)  = 0;
+
+    virtual ULONG onUnloadModule(const dbgModuleClass &/* module */)  = 0;
+    
+    virtual ULONG onChangeSessionStatus( ULONG status ) = 0;
+    
+    virtual ULONG onChangeDebugeeState() = 0;
+    
+private:
+
+    STDMETHOD_(ULONG, AddRef)() { return 1; }
+    STDMETHOD_(ULONG, Release)() { return 1; }
+
+    STDMETHOD(GetInterestMask)(
+        __out PULONG Mask
+    );
+
+    STDMETHOD(Breakpoint)(
+        __in PDEBUG_BREAKPOINT Bp
+    );
+
+
+    STDMETHOD(Exception)(
+        __in PEXCEPTION_RECORD64 Exception,
+        __in ULONG FirstChance
+    );
+
+    STDMETHOD(LoadModule)(
+        __in ULONG64 ImageFileHandle,
+        __in ULONG64 BaseOffset,
+        __in ULONG ModuleSize,
+        __in PCSTR ModuleName,
+        __in PCSTR ImageName,
+        __in ULONG CheckSum,
+        __in ULONG TimeDateStamp
+    );
+
+    STDMETHOD(UnloadModule)(
+        __in PCSTR ImageBaseName,
+        __in ULONG64 BaseOffset
+    );  
+
+    STDMETHOD(SessionStatus)(
+        __in ULONG  Status
+    );
+
+    STDMETHOD(ChangeDebuggeeState)(
+        __in ULONG  Flags,
+        __in ULONG64 Argument );
+
+private:
+
+    IDebugClient       *m_debugClient;
+};
+
+/////////////////////////////////////////////////////////////////////////////////
+
+class debugEventWrap : public boost::python::wrapper<debugEvent>, public debugEvent
+{
+
+public:
+
+    ULONG onBreakpoint(boost::python::dict &bpParameters) {
+        return handler<boost::python::dict &>("onBreakpoint", bpParameters);
+    }
+
+    ULONG onException(boost::python::dict &exceptData) {
+        return handler<boost::python::dict &>("onException", exceptData);
+    }
+
+    ULONG onLoadModule(const dbgModuleClass &module) {
+        return handler<const dbgModuleClass &>("onLoadModule", module );
+    }
+
+    ULONG onUnloadModule(const dbgModuleClass &module) {
+        return handler<const dbgModuleClass &>("onUnloadModule", module );
+    }
+
+    ULONG onChangeSessionStatus( ULONG status ) {
+        return handler( "onChangeSessionStatus", status );
+    }
+
+    ULONG onChangeDebugeeState() {
+        return handler( "onChangeDebugeeState" );
+    }
+
+private:
+
+    template<typename Arg1Type>
+    ULONG handler( const char* handlerName, Arg1Type  arg1 )
+    {
+        if (boost::python::override pythonHandler = get_override( handlerName ))
+            return pythonHandler(arg1);
+
+        return DEBUG_STATUS_NO_CHANGE;
+    }
+
+    ULONG handler( const char* handlerName )
+    {
+        if (boost::python::override pythonHandler = get_override( handlerName ))
+            return pythonHandler();
+
+        return DEBUG_STATUS_NO_CHANGE;
+    }
+};
+
+/////////////////////////////////////////////////////////////////////////////////