diff --git a/pykd/dbgeventcb.cpp b/pykd/dbgeventcb.cpp
index 73d0450..837ed45 100644
--- a/pykd/dbgeventcb.cpp
+++ b/pykd/dbgeventcb.cpp
@@ -11,6 +11,7 @@
 /////////////////////////////////////////////////////////////////////////////////
 
 DbgEventCallbacks *DbgEventCallbacks::dbgEventCallbacks = NULL;
+volatile LONG DbgEventCallbacks::dbgEventCallbacksStartCount = 0;
 
 /////////////////////////////////////////////////////////////////////////////////
 
@@ -19,8 +20,11 @@ HRESULT DbgEventCallbacks::Start()
     HRESULT hres;
     try
     {
-        Stop();
-        dbgEventCallbacks = new DbgEventCallbacks;
+        if (1 == InterlockedIncrement(&dbgEventCallbacksStartCount))
+        {
+            _ASSERT(!dbgEventCallbacks);
+            dbgEventCallbacks = new DbgEventCallbacks;
+        }
         hres = S_OK;
     }
     catch (HRESULT _hres)
@@ -38,8 +42,12 @@ HRESULT DbgEventCallbacks::Start()
 
 void DbgEventCallbacks::Stop()
 {
-    if (dbgEventCallbacks)
-        dbgEventCallbacks->Deregister();
+    if (0 == InterlockedDecrement(&dbgEventCallbacksStartCount))
+    {
+        _ASSERT(dbgEventCallbacks);
+        if (dbgEventCallbacks)
+            dbgEventCallbacks->Deregister();
+    }
 }
 
 /////////////////////////////////////////////////////////////////////////////////
@@ -48,6 +56,7 @@ DbgEventCallbacks::DbgEventCallbacks()
   : m_ReferenceCount(1)
   , m_dbgClient(NULL)
   , m_dbgSymbols3(NULL)
+  , m_dbgControl(NULL)
 {
     HRESULT hres;
     try
@@ -65,6 +74,12 @@ DbgEventCallbacks::DbgEventCallbacks()
         if (FAILED(hres))
             throw hres;
 
+        hres = m_dbgClient->QueryInterface(
+            __uuidof(IDebugControl),
+            reinterpret_cast<PVOID *>(&m_dbgControl));
+        if (FAILED(hres))
+            throw hres;
+
         hres = m_dbgClient->SetEventCallbacks(this);
         if (FAILED(hres))
             throw hres;
@@ -95,6 +110,11 @@ void DbgEventCallbacks::Deregister()
         m_dbgSymbols3->Release();
         m_dbgSymbols3 = NULL;
     }
+    if (m_dbgControl)
+    {
+        m_dbgControl->Release();
+        m_dbgControl = NULL;
+    }
     if (m_dbgClient)
     {
         m_dbgClient->Release();
@@ -146,7 +166,7 @@ HRESULT DbgEventCallbacks::ChangeSymbolState(
             return doSymbolsLoaded(Argument);
 
         // f.e. is case ".reload /f image.exe", if for image.exe no symbols
-        restoreSyntheticSymbolForAllModules(m_dbgSymbols3);
+        restoreSyntheticSymbolForAllModules(m_dbgSymbols3, m_dbgControl);
         return S_OK;
     }
 
@@ -169,7 +189,7 @@ HRESULT DbgEventCallbacks::doSymbolsLoaded(
             &dbgModuleParameters);
         if (SUCCEEDED(hres))
         {
-            ModuleInfo moduleInfo(dbgModuleParameters);
+            ModuleInfo moduleInfo(dbgModuleParameters, m_dbgControl);
             restoreSyntheticSymbolForModule(moduleInfo, m_dbgSymbols3);
         }
     }
diff --git a/pykd/dbgeventcb.h b/pykd/dbgeventcb.h
index 08e4989..30836b2 100644
--- a/pykd/dbgeventcb.h
+++ b/pykd/dbgeventcb.h
@@ -45,11 +45,13 @@ private:
 
     IDebugClient *m_dbgClient;
     IDebugSymbols3 *m_dbgSymbols3;
+    IDebugControl *m_dbgControl;
 
     /////////////////////////////////////////////////////////////////////////////////
     // global singleton
 
     static DbgEventCallbacks *dbgEventCallbacks;
+    static volatile LONG dbgEventCallbacksStartCount;
 
     /////////////////////////////////////////////////////////////////////////////////
 };
diff --git a/pykd/dbgmem.cpp b/pykd/dbgmem.cpp
index 61c3305..89379ec 100644
--- a/pykd/dbgmem.cpp
+++ b/pykd/dbgmem.cpp
@@ -52,14 +52,14 @@ loadMemory( ULONG64 address, PVOID dest, ULONG length, BOOLEAN phyAddr  )
 ///////////////////////////////////////////////////////////////////////////////////
 
 ULONG64
-addr64( ULONG64  addr )
+addr64Ex( ULONG64  addr, IDebugControl *control )
 {
     HRESULT     hres;
 
     try {
 
         ULONG   processorMode;
-        hres = dbgExt->control->GetActualProcessorType( &processorMode );
+        hres = control->GetActualProcessorType( &processorMode );
         if ( FAILED( hres ) )
             throw DbgException( "IDebugControl::GetEffectiveProcessorType  failed" );       
         
@@ -91,6 +91,13 @@ addr64( ULONG64  addr )
 
 ///////////////////////////////////////////////////////////////////////////////////
 
+ULONG64 addr64( ULONG64 addr )
+{
+    return addr64Ex(addr, dbgExt->control);
+}
+
+///////////////////////////////////////////////////////////////////////////////////
+
 bool
 compareMemory( ULONG64 addr1, ULONG64 addr2, ULONG length, BOOLEAN phyAddr  )
 {
diff --git a/pykd/dbgmem.h b/pykd/dbgmem.h
index 6d1e40b..0312ffa 100644
--- a/pykd/dbgmem.h
+++ b/pykd/dbgmem.h
@@ -79,6 +79,9 @@ loadWStrToBuffer( ULONG64 address, PWCHAR buffer, ULONG  bufferLen );
 bool
 compareMemory( ULONG64 addr1, ULONG64 addr2, ULONG length, BOOLEAN phyAddr = FALSE );
 
+ULONG64
+addr64Ex( ULONG64  addr, IDebugControl *control );
+
 ULONG64
 addr64( ULONG64  addr );
 
diff --git a/pykd/dbgmodule.h b/pykd/dbgmodule.h
index a3c8b7d..e1d3e90 100644
--- a/pykd/dbgmodule.h
+++ b/pykd/dbgmodule.h
@@ -27,15 +27,17 @@ struct ModuleInfo
     {
     }
     ModuleInfo(
-        const IMAGEHLP_MODULEW64 &dbgImageHelperInfo
+        const IMAGEHLP_MODULEW64 &dbgImageHelperInfo,
+        IDebugControl *control = dbgExt->control
     ) : m_base(addr64(dbgImageHelperInfo.BaseOfImage))
       , m_timeDataStamp(dbgImageHelperInfo.TimeDateStamp)
       , m_checkSumm(dbgImageHelperInfo.CheckSum)
     {
     }
     ModuleInfo(
-        const DEBUG_MODULE_PARAMETERS &dbgModuleParameters
-    ) : m_base(addr64(dbgModuleParameters.Base))
+        const DEBUG_MODULE_PARAMETERS &dbgModuleParameters,
+        IDebugControl *control = dbgExt->control
+    ) : m_base(addr64Ex(dbgModuleParameters.Base, control))
       , m_timeDataStamp(dbgModuleParameters.TimeDateStamp)
       , m_checkSumm(dbgModuleParameters.Checksum)
     {
diff --git a/pykd/dbgsynsym.cpp b/pykd/dbgsynsym.cpp
index 3bdb269..baa273a 100644
--- a/pykd/dbgsynsym.cpp
+++ b/pykd/dbgsynsym.cpp
@@ -615,7 +615,8 @@ void restoreSyntheticSymbolForModule(
 /////////////////////////////////////////////////////////////////////////////////
 
 void restoreSyntheticSymbolForAllModules(
-    IDebugSymbols3 *symbols3
+    IDebugSymbols3 *symbols3,
+    IDebugControl *control
 )
 {
     try
@@ -642,7 +643,7 @@ void restoreSyntheticSymbolForAllModules(
             {
                 for (ULONG i = 0; i < arrModules.size(); ++i)
                 {
-                    ModuleInfo moduleInfo(arrModules[i]);
+                    ModuleInfo moduleInfo(arrModules[i], control);
                     restoreSyntheticSymbolForModuleNoLock(moduleInfo, symbols3);
                 }
             }
diff --git a/pykd/dbgsynsym.h b/pykd/dbgsynsym.h
index 4708d6d..d04e5af 100644
--- a/pykd/dbgsynsym.h
+++ b/pykd/dbgsynsym.h
@@ -54,7 +54,8 @@ void restoreSyntheticSymbolForModule(
 );
 
 void restoreSyntheticSymbolForAllModules(
-    IDebugSymbols3 *symbols3
+    IDebugSymbols3 *symbols3,
+    IDebugControl *control
 );
 
 /////////////////////////////////////////////////////////////////////////////////