diff --git a/pykd/dbgcmd.cpp b/pykd/dbgcmd.cpp
index 236d7e0..bc0cd5f 100644
--- a/pykd/dbgcmd.cpp
+++ b/pykd/dbgcmd.cpp
@@ -3,96 +3,7 @@
 #include "dbgext.h"
 #include "dbgcmd.h"
 #include "dbgexcept.h"
-
-///////////////////////////////////////////////////////////////////////////////
-
-// ����� ��� ��������� ������ � ��������
-
-class OutputReader : public IDebugOutputCallbacks {
-
-public:
-
-	OutputReader( IDebugClient  *debugClient ) 
-	{
-		HRESULT   hres;
-
-		try {
-
-			m_debugClient = debugClient;
-			m_debugClient->AddRef();
-
-			hres = m_debugClient->GetOutputCallbacks( &m_previousCallback );
-			if ( FAILED( hres ) )
-			{
-				throw hres;
-			}
-
-			hres = m_debugClient->SetOutputCallbacks( this );
-			if ( FAILED( hres ) )
-			{
-				throw hres;
-			}
-
-		} catch( ... )
-		{
-			m_debugClient->Release();
-			m_debugClient = NULL;
-		}
-	}
-
-	~OutputReader() 
-	{
-		if ( m_debugClient )
-		{
-			m_debugClient->SetOutputCallbacks( m_previousCallback );
-			m_debugClient->Release();
-		}
-	}
-
-	const std::string&
-	Line() const {
-		return  m_readLine;
-	}
-
-private:
-
-	 // IUnknown.
-    STDMETHOD(QueryInterface)(
-        __in REFIID InterfaceId,
-		__out PVOID* Interface ) {
-			return E_NOINTERFACE;
-	}
-
-	STDMETHOD_(ULONG, AddRef)() {
-		return 1L;
-	}
-
-
-	STDMETHOD_(ULONG, Release)() {
-		return 0L;
-	}
-
-   STDMETHOD(Output)(
-        __in ULONG Mask,
-        __in PCSTR Text )
-   {
-		if ( Mask == DEBUG_OUTPUT_NORMAL )
-		{
-			m_readLine += std::string( Text );
-		}
-
-	   return S_OK;
-   }
-
-private:
-
-	std::string               m_readLine;
-
-	IDebugClient             *m_debugClient;
-
-	IDebugOutputCallbacks    *m_previousCallback;
-};
-
+#include "dbgcallback.h"
 
 ///////////////////////////////////////////////////////////////////////////////
 
@@ -103,12 +14,12 @@ dbgCommand( const std::string &command )
 
     try {
     
-        OutputReader    outReader(  dbgExt->client );
-    
+        OutputReader        outReader(  dbgExt->client );
+   
         hres = dbgExt->control->Execute( DEBUG_OUTCTL_THIS_CLIENT, command.c_str(), 0 );
         if ( FAILED( hres ) )
             throw  DbgException( "IDebugControl::Execute  failed" ); 
-        
+            
         return std::string( outReader.Line() );
     }    
 	catch( std::exception  &e )
@@ -123,4 +34,4 @@ dbgCommand( const std::string &command )
 	return "error"; 
 }	
 
-///////////////////////////////////////////////////////////////////////////////
\ No newline at end of file
+///////////////////////////////////////////////////////////////////////////////
diff --git a/pykd/dbgcmd.h b/pykd/dbgcmd.h
index 21969cf..24369d6 100644
--- a/pykd/dbgcmd.h
+++ b/pykd/dbgcmd.h
@@ -10,5 +10,8 @@
 std::string
 dbgCommand( const std::string &command );
 
+void
+dbgGoCommand();
+
 /////////////////////////////////////////////////////////////////////////////////
 
diff --git a/pykd/dbgext.cpp b/pykd/dbgext.cpp
index 62f7640..c71abb7 100644
--- a/pykd/dbgext.cpp
+++ b/pykd/dbgext.cpp
@@ -23,11 +23,38 @@
 #include "dbgdump.h"
 #include "dbgexcept.h"
 #include "dbgsession.h"
+#include "dbgcallback.h"
 
 /////////////////////////////////////////////////////////////////////////////////
 
+// ��������� �� ������� ���������
 DbgExt    *dbgExt = NULL;
 
+
+/////////////////////////////////////////////////////////////////////////////////
+
+class WindbgGlobalSession 
+{
+public:
+
+    WindbgGlobalSession() {
+        interactiveMode = false;
+        main = boost::python::import("__main__");
+    }
+    
+    boost::python::object
+    global() {
+        return main.attr("__dict__");
+    }
+
+private:
+   
+    boost::python::object       main;
+   
+};   
+
+WindbgGlobalSession     *windbgGlobalSession = NULL; 
+
 /////////////////////////////////////////////////////////////////////////////////
 
 BOOST_PYTHON_MODULE( pykd )
@@ -94,6 +121,8 @@ DebugExtensionInitialize(
        
     Py_Initialize();
     
+    windbgGlobalSession = new WindbgGlobalSession();
+    
     dbgSessionStarted = true;                
     
     return S_OK; 
@@ -104,6 +133,9 @@ VOID
 CALLBACK
 DebugExtensionUninitialize()
 {
+    delete windbgGlobalSession;
+    windbgGlobalSession = NULL;
+
     Py_Finalize();  
 }
 
@@ -215,3 +247,104 @@ py( PDEBUG_CLIENT4 client, PCSTR args)
 
 /////////////////////////////////////////////////////////////////////////////////  
 
+HRESULT 
+CALLBACK
+pycmd( PDEBUG_CLIENT4 client, PCSTR args )
+{
+    try {
+    
+        DbgExt      ext = { 0 };
+    
+        SetupDebugEngine( client, &ext );  
+        dbgExt = &ext;   
+        
+        if ( !std::string( args ).empty() )
+        {
+            try {
+                boost::python::exec( args, windbgGlobalSession->global(), windbgGlobalSession->global() );
+            }                
+            catch( boost::python::error_already_set const & )
+            {
+                // ������ � �������
+                PyObject    *errtype = NULL, *errvalue = NULL, *traceback = NULL;
+                
+                PyErr_Fetch( &errtype, &errvalue, &traceback );
+                
+                if(errvalue != NULL) 
+                {
+                    PyObject *s = PyObject_Str(errvalue);
+                    
+                    DbgPrint::dprintln( PyString_AS_STRING( s ) );
+
+                    Py_DECREF(s);
+                }
+
+                Py_XDECREF(errvalue);
+                Py_XDECREF(errtype);
+                Py_XDECREF(traceback);        
+            }  
+        }
+        else
+        {
+            char        str[100];
+            ULONG       inputSize;
+            bool        stopInput = false;
+            
+            do {
+            
+                std::string     output;
+                
+                dbgExt->control->Output( DEBUG_OUTPUT_NORMAL, ">>>" );
+                    
+                do {    
+                                
+                    OutputReader        outputReader( dbgExt->client );                    
+                    
+                    HRESULT   hres = dbgExt->control->Input( str, sizeof(str), &inputSize );
+                
+                    if ( FAILED( hres ) || std::string( str ) == "" )
+                    {
+                       stopInput = true;
+                       break;
+                    }                       
+                    
+                } while( FALSE );                    
+                
+                if ( !stopInput )
+                    try {
+                        boost::python::exec( str, windbgGlobalSession->global(), windbgGlobalSession->global() );
+                    }
+                    catch( boost::python::error_already_set const & )
+                    {
+                        // ������ � �������
+                        PyObject    *errtype = NULL, *errvalue = NULL, *traceback = NULL;
+                        
+                        PyErr_Fetch( &errtype, &errvalue, &traceback );
+                        
+                        if(errvalue != NULL) 
+                        {
+                            PyObject *s = PyObject_Str(errvalue);
+                            
+                            DbgPrint::dprintln( PyString_AS_STRING( s ) );
+
+                            Py_DECREF(s);
+                        }
+
+                        Py_XDECREF(errvalue);
+                        Py_XDECREF(errtype);
+                        Py_XDECREF(traceback);        
+                    }  
+                    
+            } while( !stopInput );                                
+        }
+    }
+  
+    catch(...)
+    {           
+    }     
+    
+    return S_OK;          
+            
+}
+
+/////////////////////////////////////////////////////////////////////////////////  
diff --git a/pykd/dbgext.h b/pykd/dbgext.h
index 4923453..8188ff9 100644
--- a/pykd/dbgext.h
+++ b/pykd/dbgext.h
@@ -16,8 +16,6 @@ struct DbgExt {
     IDebugSymbols3      *symbols3;   
     
     IDebugDataSpaces    *dataSpaces;
-    
-    
 };
 
 extern DbgExt    *dbgExt;
diff --git a/pykd/pykd.def b/pykd/pykd.def
index 53386c2..327eb31 100644
--- a/pykd/pykd.def
+++ b/pykd/pykd.def
@@ -3,4 +3,5 @@ EXPORTS
 	DebugExtensionUninitialize
 
 	info
-	py
\ No newline at end of file
+	py
+	pycmd
\ No newline at end of file
diff --git a/pykd/pykd.vcproj b/pykd/pykd.vcproj
index 63edf08..47e8e3a 100644
--- a/pykd/pykd.vcproj
+++ b/pykd/pykd.vcproj
@@ -445,6 +445,10 @@
 			Filter="h;hpp;hxx;hm;inl;inc;xsd"
 			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
 			>
+			<File
+				RelativePath=".\dbgcallback.h"
+				>
+			</File>
 			<File
 				RelativePath=".\dbgcmd.h"
 				>