diff --git a/pykd-0.3-2013.sln b/pykd-0.3-2013.sln
index d6975e3..b9e471d 100644
--- a/pykd-0.3-2013.sln
+++ b/pykd-0.3-2013.sln
@@ -45,6 +45,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{D1F122
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "targetapp", "kdlibcpp\tests\targetapp\targetapp_vc120.vcxproj", "{0E4CC688-F2F5-499F-9C07-0F2CAEE0D3EF}"
 EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pykd_bootstrapper", "pykd_bootstrapper\pykd_bootstrapper_vc120.vcxproj", "{CA0252CE-EF81-4DD8-A96F-A0E0E3644B7B}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug_2.7|Any CPU = Debug_2.7|Any CPU
@@ -222,6 +224,34 @@ Global
 		{0E4CC688-F2F5-499F-9C07-0F2CAEE0D3EF}.Release|Win32.Build.0 = Release|Win32
 		{0E4CC688-F2F5-499F-9C07-0F2CAEE0D3EF}.Release|x64.ActiveCfg = Release|x64
 		{0E4CC688-F2F5-499F-9C07-0F2CAEE0D3EF}.Release|x64.Build.0 = Release|x64
+		{CA0252CE-EF81-4DD8-A96F-A0E0E3644B7B}.Debug_2.7|Any CPU.ActiveCfg = Debug_2.7|Win32
+		{CA0252CE-EF81-4DD8-A96F-A0E0E3644B7B}.Debug_2.7|Mixed Platforms.ActiveCfg = Debug_2.7|Win32
+		{CA0252CE-EF81-4DD8-A96F-A0E0E3644B7B}.Debug_2.7|Mixed Platforms.Build.0 = Debug_2.7|Win32
+		{CA0252CE-EF81-4DD8-A96F-A0E0E3644B7B}.Debug_2.7|Win32.ActiveCfg = Debug_2.7|Win32
+		{CA0252CE-EF81-4DD8-A96F-A0E0E3644B7B}.Debug_2.7|Win32.Build.0 = Debug_2.7|Win32
+		{CA0252CE-EF81-4DD8-A96F-A0E0E3644B7B}.Debug_2.7|x64.ActiveCfg = Debug_2.7|x64
+		{CA0252CE-EF81-4DD8-A96F-A0E0E3644B7B}.Debug_2.7|x64.Build.0 = Debug_2.7|x64
+		{CA0252CE-EF81-4DD8-A96F-A0E0E3644B7B}.Debug|Any CPU.ActiveCfg = Debug_2.7|Win32
+		{CA0252CE-EF81-4DD8-A96F-A0E0E3644B7B}.Debug|Mixed Platforms.ActiveCfg = Debug_2.7|Win32
+		{CA0252CE-EF81-4DD8-A96F-A0E0E3644B7B}.Debug|Mixed Platforms.Build.0 = Debug_2.7|Win32
+		{CA0252CE-EF81-4DD8-A96F-A0E0E3644B7B}.Debug|Win32.ActiveCfg = Debug_2.7|Win32
+		{CA0252CE-EF81-4DD8-A96F-A0E0E3644B7B}.Debug|Win32.Build.0 = Debug_2.7|Win32
+		{CA0252CE-EF81-4DD8-A96F-A0E0E3644B7B}.Debug|x64.ActiveCfg = Debug_2.7|x64
+		{CA0252CE-EF81-4DD8-A96F-A0E0E3644B7B}.Debug|x64.Build.0 = Debug_2.7|x64
+		{CA0252CE-EF81-4DD8-A96F-A0E0E3644B7B}.Release_2.7|Any CPU.ActiveCfg = Release_2.7|Win32
+		{CA0252CE-EF81-4DD8-A96F-A0E0E3644B7B}.Release_2.7|Mixed Platforms.ActiveCfg = Release_2.7|Win32
+		{CA0252CE-EF81-4DD8-A96F-A0E0E3644B7B}.Release_2.7|Mixed Platforms.Build.0 = Release_2.7|Win32
+		{CA0252CE-EF81-4DD8-A96F-A0E0E3644B7B}.Release_2.7|Win32.ActiveCfg = Release_2.7|Win32
+		{CA0252CE-EF81-4DD8-A96F-A0E0E3644B7B}.Release_2.7|Win32.Build.0 = Release_2.7|Win32
+		{CA0252CE-EF81-4DD8-A96F-A0E0E3644B7B}.Release_2.7|x64.ActiveCfg = Debug_2.7|x64
+		{CA0252CE-EF81-4DD8-A96F-A0E0E3644B7B}.Release_2.7|x64.Build.0 = Debug_2.7|x64
+		{CA0252CE-EF81-4DD8-A96F-A0E0E3644B7B}.Release|Any CPU.ActiveCfg = Release_2.7|Win32
+		{CA0252CE-EF81-4DD8-A96F-A0E0E3644B7B}.Release|Mixed Platforms.ActiveCfg = Release_2.7|Win32
+		{CA0252CE-EF81-4DD8-A96F-A0E0E3644B7B}.Release|Mixed Platforms.Build.0 = Release_2.7|Win32
+		{CA0252CE-EF81-4DD8-A96F-A0E0E3644B7B}.Release|Win32.ActiveCfg = Release_2.7|Win32
+		{CA0252CE-EF81-4DD8-A96F-A0E0E3644B7B}.Release|Win32.Build.0 = Release_2.7|Win32
+		{CA0252CE-EF81-4DD8-A96F-A0E0E3644B7B}.Release|x64.ActiveCfg = Release_2.7|x64
+		{CA0252CE-EF81-4DD8-A96F-A0E0E3644B7B}.Release|x64.Build.0 = Release_2.7|x64
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
diff --git a/pykd/pykd_vc120.vcxproj b/pykd/pykd_vc120.vcxproj
index c94a038..75d2284 100644
--- a/pykd/pykd_vc120.vcxproj
+++ b/pykd/pykd_vc120.vcxproj
@@ -75,19 +75,23 @@
     <LinkIncremental>true</LinkIncremental>
     <TargetExt>.pyd</TargetExt>
     <PostBuildEventUseInBuild>true</PostBuildEventUseInBuild>
+    <TargetName>$(ProjectName)</TargetName>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug_2.7|x64'">
     <LinkIncremental>true</LinkIncremental>
     <TargetExt>.pyd</TargetExt>
     <PostBuildEventUseInBuild>true</PostBuildEventUseInBuild>
+    <TargetName>$(ProjectName)</TargetName>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release_2.7|Win32'">
     <LinkIncremental>false</LinkIncremental>
     <TargetExt>.pyd</TargetExt>
+    <TargetName>$(ProjectName)</TargetName>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release_2.7|x64'">
     <LinkIncremental>false</LinkIncremental>
     <TargetExt>.pyd</TargetExt>
+    <TargetName>$(ProjectName)</TargetName>
   </PropertyGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug_2.7|Win32'">
     <ClCompile>
diff --git a/pykd_bootstrapper/dllmain.cpp b/pykd_bootstrapper/dllmain.cpp
new file mode 100644
index 0000000..8a4edd3
--- /dev/null
+++ b/pykd_bootstrapper/dllmain.cpp
@@ -0,0 +1,19 @@
+// dllmain.cpp : Defines the entry point for the DLL application.
+#include "stdafx.h"
+
+BOOL APIENTRY DllMain( HMODULE hModule,
+                       DWORD  ul_reason_for_call,
+                       LPVOID lpReserved
+					 )
+{
+	switch (ul_reason_for_call)
+	{
+	case DLL_PROCESS_ATTACH:
+	case DLL_THREAD_ATTACH:
+	case DLL_THREAD_DETACH:
+	case DLL_PROCESS_DETACH:
+		break;
+	}
+	return TRUE;
+}
+
diff --git a/pykd_bootstrapper/export.def b/pykd_bootstrapper/export.def
new file mode 100644
index 0000000..49bb1e9
--- /dev/null
+++ b/pykd_bootstrapper/export.def
@@ -0,0 +1,4 @@
+EXPORTS
+	DebugExtensionInitialize
+	DebugExtensionUninitialize
+	py
diff --git a/pykd_bootstrapper/packages.pykd_bootstrapper_vc120.config b/pykd_bootstrapper/packages.pykd_bootstrapper_vc120.config
new file mode 100644
index 0000000..26eab34
--- /dev/null
+++ b/pykd_bootstrapper/packages.pykd_bootstrapper_vc120.config
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="boost" version="1.57.0.0" targetFramework="Native" />
+  <package id="Python27" version="2.7.6" targetFramework="Native" />
+  <package id="boost_python" version="1.57.0.0" targetFramework="Native" />
+</packages>
\ No newline at end of file
diff --git a/pykd_bootstrapper/pykd_bootstrapper_vc120.vcxproj b/pykd_bootstrapper/pykd_bootstrapper_vc120.vcxproj
new file mode 100644
index 0000000..49e44c1
--- /dev/null
+++ b/pykd_bootstrapper/pykd_bootstrapper_vc120.vcxproj
@@ -0,0 +1,220 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup Label="ProjectConfigurations">
+    <ProjectConfiguration Include="Debug_2.7|Win32">
+      <Configuration>Debug_2.7</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Debug_2.7|x64">
+      <Configuration>Debug_2.7</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release_2.7|Win32">
+      <Configuration>Release_2.7</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release_2.7|x64">
+      <Configuration>Release_2.7</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+  </ItemGroup>
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{CA0252CE-EF81-4DD8-A96F-A0E0E3644B7B}</ProjectGuid>
+    <Keyword>Win32Proj</Keyword>
+    <RootNamespace>pykd_bootstrapper</RootNamespace>
+    <ProjectName>pykd_ext</ProjectName>
+    <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>
+    <RestorePackages>true</RestorePackages>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug_2.7|Win32'" Label="Configuration">
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <PlatformToolset>v120</PlatformToolset>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug_2.7|x64'" Label="Configuration">
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <PlatformToolset>v120</PlatformToolset>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release_2.7|Win32'" Label="Configuration">
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <PlatformToolset>v120</PlatformToolset>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release_2.7|x64'" Label="Configuration">
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <PlatformToolset>v120</PlatformToolset>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ImportGroup Label="ExtensionSettings">
+  </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug_2.7|Win32'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug_2.7|x64'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release_2.7|Win32'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release_2.7|x64'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <PropertyGroup Label="UserMacros">
+    <NuGetPackageImportStamp>7f4aed3e</NuGetPackageImportStamp>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug_2.7|Win32'">
+    <LinkIncremental>true</LinkIncremental>
+    <TargetName>pykd</TargetName>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug_2.7|x64'">
+    <LinkIncremental>true</LinkIncremental>
+    <TargetName>pykd</TargetName>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release_2.7|Win32'">
+    <LinkIncremental>false</LinkIncremental>
+    <TargetName>pykd</TargetName>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release_2.7|x64'">
+    <LinkIncremental>false</LinkIncremental>
+    <TargetName>pykd</TargetName>
+  </PropertyGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug_2.7|Win32'">
+    <ClCompile>
+      <PrecompiledHeader>Use</PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>Disabled</Optimization>
+      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;PYKD_BOOTSTRAPPER_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <SDLCheck>true</SDLCheck>
+      <AdditionalIncludeDirectories>$(ProjectDir)..\kdlibcpp\include;</AdditionalIncludeDirectories>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <ModuleDefinitionFile>export.def</ModuleDefinitionFile>
+      <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug_2.7|x64'">
+    <ClCompile>
+      <PrecompiledHeader>Use</PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>Disabled</Optimization>
+      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;PYKD_BOOTSTRAPPER_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <SDLCheck>true</SDLCheck>
+      <AdditionalIncludeDirectories>$(ProjectDir)..\kdlibcpp\include;</AdditionalIncludeDirectories>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <ModuleDefinitionFile>export.def</ModuleDefinitionFile>
+      <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release_2.7|Win32'">
+    <ClCompile>
+      <WarningLevel>Level3</WarningLevel>
+      <PrecompiledHeader>Use</PrecompiledHeader>
+      <Optimization>MaxSpeed</Optimization>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;PYKD_BOOTSTRAPPER_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <SDLCheck>true</SDLCheck>
+      <AdditionalIncludeDirectories>$(ProjectDir)..\kdlibcpp\include;</AdditionalIncludeDirectories>
+      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <OptimizeReferences>true</OptimizeReferences>
+      <ModuleDefinitionFile>export.def</ModuleDefinitionFile>
+      <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release_2.7|x64'">
+    <ClCompile>
+      <WarningLevel>Level3</WarningLevel>
+      <PrecompiledHeader>Use</PrecompiledHeader>
+      <Optimization>MaxSpeed</Optimization>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;PYKD_BOOTSTRAPPER_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <SDLCheck>true</SDLCheck>
+      <AdditionalIncludeDirectories>$(ProjectDir)..\kdlibcpp\include;</AdditionalIncludeDirectories>
+      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <OptimizeReferences>true</OptimizeReferences>
+      <ModuleDefinitionFile>export.def</ModuleDefinitionFile>
+      <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemGroup>
+    <Text Include="ReadMe.txt" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="stdafx.h" />
+    <ClInclude Include="targetver.h" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="dllmain.cpp">
+      <CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Debug_2.7|Win32'">false</CompileAsManaged>
+      <CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Debug_2.7|x64'">false</CompileAsManaged>
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug_2.7|Win32'">
+      </PrecompiledHeader>
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug_2.7|x64'">
+      </PrecompiledHeader>
+      <CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Release_2.7|Win32'">false</CompileAsManaged>
+      <CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Release_2.7|x64'">false</CompileAsManaged>
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release_2.7|Win32'">
+      </PrecompiledHeader>
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release_2.7|x64'">
+      </PrecompiledHeader>
+    </ClCompile>
+    <ClCompile Include="stdafx.cpp">
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug_2.7|Win32'">Create</PrecompiledHeader>
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug_2.7|x64'">Create</PrecompiledHeader>
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release_2.7|Win32'">Create</PrecompiledHeader>
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release_2.7|x64'">Create</PrecompiledHeader>
+    </ClCompile>
+    <ClCompile Include="windbgext.cpp" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="export.def" />
+    <None Include="packages.config" />
+    <None Include="packages.pykd_bootstrapper_vc120.config" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\kdlibcpp\source\kdlib_vc120.vcxproj">
+      <Project>{3e9c538f-f060-4e86-ab7d-d44439615b63}</Project>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+  <ImportGroup Label="ExtensionTargets">
+    <Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
+    <Import Project="..\packages\boost.1.57.0.0\build\native\boost.targets" Condition="Exists('..\packages\boost.1.57.0.0\build\native\boost.targets')" />
+    <Import Project="..\packages\Python27.2.7.6\build\python27.targets" Condition="Exists('..\packages\Python27.2.7.6\build\python27.targets')" />
+    <Import Project="..\packages\boost_python.1.57.0.0\build\native\boost_python.targets" Condition="Exists('..\packages\boost_python.1.57.0.0\build\native\boost_python.targets')" />
+  </ImportGroup>
+  <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
+    <PropertyGroup>
+      <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
+    </PropertyGroup>
+    <Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
+    <Error Condition="!Exists('..\packages\boost.1.57.0.0\build\native\boost.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\boost.1.57.0.0\build\native\boost.targets'))" />
+    <Error Condition="!Exists('..\packages\Python27.2.7.6\build\python27.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Python27.2.7.6\build\python27.targets'))" />
+    <Error Condition="!Exists('..\packages\boost_python.1.57.0.0\build\native\boost_python.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\boost_python.1.57.0.0\build\native\boost_python.targets'))" />
+  </Target>
+</Project>
\ No newline at end of file
diff --git a/pykd_bootstrapper/pykd_bootstrapper_vc120.vcxproj.filters b/pykd_bootstrapper/pykd_bootstrapper_vc120.vcxproj.filters
new file mode 100644
index 0000000..f1936f5
--- /dev/null
+++ b/pykd_bootstrapper/pykd_bootstrapper_vc120.vcxproj.filters
@@ -0,0 +1,130 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup>
+    <Filter Include="Source Files">
+      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+    </Filter>
+    <Filter Include="Header Files">
+      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+      <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
+    </Filter>
+    <Filter Include="Resource Files">
+      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
+      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
+    </Filter>
+  </ItemGroup>
+  <ItemGroup>
+    <Text Include="ReadMe.txt" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="stdafx.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="targetver.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="stdafx.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="dllmain.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="windbgext.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\converter\boost_python.converter.arg_to_python_base.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\converter\boost_python.converter.builtin_converters.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\converter\boost_python.converter.from_python.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\converter\boost_python.converter.registry.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\converter\boost_python.converter.type_id.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\object\boost_python.object.class.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\object\boost_python.object.enum.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\object\boost_python.object.function.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\object\boost_python.object.function_doc_signature.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\object\boost_python.object.inheritance.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\object\boost_python.object.iterator.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\object\boost_python.object.life_support.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\object\boost_python.object.pickle_support.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\object\boost_python.object.stl_iterator.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\boost_python.dict.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\boost_python.errors.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\boost_python.exec.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\boost_python.import.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\boost_python.list.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\boost_python.long.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\boost_python.module.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\boost_python.numeric.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\boost_python.object_operators.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\boost_python.object_protocol.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\boost_python.slice.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\boost_python.str.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\boost_python.tuple.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\boost_python.wrapper.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="export.def">
+      <Filter>Source Files</Filter>
+    </None>
+    <None Include="packages.pykd_bootstrapper_vc120.config" />
+    <None Include="packages.config" />
+  </ItemGroup>
+</Project>
\ No newline at end of file
diff --git a/pykd_bootstrapper/stdafx.cpp b/pykd_bootstrapper/stdafx.cpp
new file mode 100644
index 0000000..75c83a9
--- /dev/null
+++ b/pykd_bootstrapper/stdafx.cpp
@@ -0,0 +1,8 @@
+// stdafx.cpp : source file that includes just the standard includes
+// pykd_bootstrapper.pch will be the pre-compiled header
+// stdafx.obj will contain the pre-compiled type information
+
+#include "stdafx.h"
+
+// TODO: reference any additional headers you need in STDAFX.H
+// and not in this file
diff --git a/pykd_bootstrapper/stdafx.h b/pykd_bootstrapper/stdafx.h
new file mode 100644
index 0000000..677e68a
--- /dev/null
+++ b/pykd_bootstrapper/stdafx.h
@@ -0,0 +1,16 @@
+// stdafx.h : include file for standard system include files,
+// or project specific include files that are used frequently, but
+// are changed infrequently
+//
+
+#pragma once
+
+#include "targetver.h"
+
+#define WIN32_LEAN_AND_MEAN             // Exclude rarely-used stuff from Windows headers
+// Windows Header Files:
+#include <windows.h>
+
+
+
+// TODO: reference additional headers your program requires here
diff --git a/pykd_bootstrapper/targetver.h b/pykd_bootstrapper/targetver.h
new file mode 100644
index 0000000..90e767b
--- /dev/null
+++ b/pykd_bootstrapper/targetver.h
@@ -0,0 +1,8 @@
+#pragma once
+
+// Including SDKDDKVer.h defines the highest available Windows platform.
+
+// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and
+// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h.
+
+#include <SDKDDKVer.h>
diff --git a/pykd_bootstrapper/windbgext.cpp b/pykd_bootstrapper/windbgext.cpp
new file mode 100644
index 0000000..e5c91e9
--- /dev/null
+++ b/pykd_bootstrapper/windbgext.cpp
@@ -0,0 +1,459 @@
+#include "stdafx.h"
+
+#include <boost/python.hpp>
+
+namespace python = boost::python;
+
+#include "kdlib/windbg.h"
+
+using namespace kdlib;
+
+///////////////////////////////////////////////////////////////////////////////
+
+class PykdBootsTrapper: public windbg::WindbgExtension
+{
+public:
+
+    KDLIB_EXT_COMMAND_METHOD(py);
+
+    virtual void setUp();
+
+    virtual void tearDown();
+
+private:
+
+    void startConsole();
+
+    void printUsage();
+    
+    void printException();
+
+    std::string getScriptFileName(const std::string &scriptName);
+
+    std::string findScript(const std::string &fullFileName);
+
+    PyThreadState  *m_pyState;
+
+};
+
+///////////////////////////////////////////////////////////////////////////////
+
+class AutoRestorePyState
+{
+public:
+
+    AutoRestorePyState()
+    {
+        m_state = PyEval_SaveThread();
+    }
+
+    explicit AutoRestorePyState(PyThreadState **state)
+    {
+        *state = PyEval_SaveThread();
+        m_state = *state;
+    }
+
+    ~AutoRestorePyState()
+    {
+        PyEval_RestoreThread(m_state);
+    }
+
+private:
+
+    PyThreadState*    m_state;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+
+class DbgOut : public  windbg::WindbgOut
+{
+public:
+
+    virtual void write(const std::wstring& str) {
+        AutoRestorePyState  pystate;
+        windbg::WindbgOut::write(str);
+    }
+
+    virtual void writedml(const std::wstring& str) {
+        AutoRestorePyState  pystate;
+        windbg::WindbgOut::writedml(str);
+    }
+
+    void flush() {
+    }
+
+    std::wstring encoding() {
+        return L"ascii";
+    }
+};
+
+///////////////////////////////////////////////////////////////////////////////
+
+class DbgIn : public windbg::WindbgIn
+{
+public:
+
+    std::wstring readline() {
+        AutoRestorePyState  pystate;
+        return kdlib::windbg::WindbgIn::readline();
+    }
+
+    std::wstring encoding() {
+        return L"ascii";
+    }
+};
+
+///////////////////////////////////////////////////////////////////////////////
+
+class InterruptWatch : public windbg::InterruptWatch
+{
+    virtual bool onInterrupt()
+    {
+        HANDLE  quitEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
+        PyGILState_STATE state = PyGILState_Ensure();
+        Py_AddPendingCall(&quit, (void*)quitEvent);
+        PyGILState_Release(state);
+        WaitForSingleObject(quitEvent, INFINITE);
+        CloseHandle(quitEvent);
+        return true;
+    }
+
+    static int quit(void *context)
+    {
+        HANDLE   quitEvent = (HANDLE)context;
+        kdlib::eprintln(L"User Interrupt: CTRL+BREAK");
+        PyErr_SetString(PyExc_SystemExit, "CTRL+BREAK");
+        SetEvent(quitEvent);
+        return -1;
+    }
+};
+
+///////////////////////////////////////////////////////////////////////////////
+
+KDLIB_WINDBG_EXTENSION_INIT(PykdBootsTrapper);
+
+KDLIB_EXT_COMMAND_METHOD_IMPL(PykdBootsTrapper, py)
+{
+    ArgsList   args = getArgs();
+
+    bool  global = false;
+    bool  local = false;
+    bool  clean = false;
+
+    ArgsList::iterator  foundArg;
+
+    if (!args.empty())
+    {
+        if (args[0] == "-h" || args[0] == "--help")
+        {
+            printUsage();
+            return;
+        }
+        else
+            if (args[0] == "-g" || args[0] == "--global")
+            {
+                global = true;
+                args.erase(args.begin());
+            }
+            else
+                if (args[0] == "-l" || args[0] == "--local")
+                {
+                    local = true;
+                    args.erase(args.begin());
+                }
+    }
+
+    PyThreadState   *localState = NULL;
+    PyThreadState   *globalState = NULL;
+
+    PyEval_RestoreThread(m_pyState);
+
+    std::string  scriptFileName;
+    if (args.size() > 0)
+    {
+        scriptFileName = getScriptFileName(args[0]);
+
+        if (scriptFileName.empty())
+        {
+            kdlib::eprintln(L"script file not found");
+            return;
+        }
+
+        global = !(global || local) ? false : global; //set local by default
+    }
+    else
+    {
+        global = !(global || local) ? true : global; //set global by default
+    }
+
+    if (!global)
+    {
+        globalState = PyThreadState_Swap(NULL);
+
+        Py_NewInterpreter();
+
+        localState = PyThreadState_Get();
+
+        python::object       sys = python::import("sys");
+
+        sys.attr("stdout") = python::object(::DbgOut());
+        sys.attr("stderr") = python::object(::DbgOut());
+        sys.attr("stdin") = python::object(::DbgIn());
+    }
+
+    if (args.size() == 0)
+    {
+        startConsole();
+    }
+    else
+    {
+        std::string  scriptFileName = getScriptFileName(args[0]);
+
+        // �������������� ����������� ���������
+        char  **pythonArgs = new char*[args.size()];
+
+        pythonArgs[0] = const_cast<char*>(scriptFileName.c_str());
+
+        for (size_t i = 1; i < args.size(); ++i)
+            pythonArgs[i] = const_cast<char*>(args[i].c_str());
+
+        PySys_SetArgv((int)args.size(), pythonArgs);
+
+        delete[]  pythonArgs;
+
+        // �������� ������ � ����������� ���� ( ����� ��� ������ exec_file )
+        python::object  main = python::import("__main__");
+
+        python::object  global(main.attr("__dict__"));
+
+        try {
+            InterruptWatch  interruptWatch;
+
+            python::exec_file(scriptFileName.c_str(), global);
+        }
+        catch (python::error_already_set const &)
+        {
+            printException();
+        }
+    }
+
+    if (!global)
+    {
+        PyInterpreterState  *interpreter = localState->interp;
+
+        while (interpreter->tstate_head != NULL)
+        {
+            PyThreadState   *threadState = (PyThreadState*)(interpreter->tstate_head);
+
+            PyThreadState_Clear(threadState);
+
+            PyThreadState_Swap(NULL);
+
+            PyThreadState_Delete(threadState);
+        }
+
+        PyInterpreterState_Clear(interpreter);
+
+        PyInterpreterState_Delete(interpreter);
+
+        PyThreadState_Swap(globalState);
+    }
+
+    m_pyState = PyEval_SaveThread();
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+void PykdBootsTrapper::setUp()
+{
+    WindbgExtension::setUp();
+
+    PyEval_InitThreads();
+
+    Py_Initialize();
+
+    python::object  main = boost::python::import("__main__");
+
+    python::object  main_namespace = main.attr("__dict__");
+
+    python::object  pykd = python::import("pykd");
+
+    // ������ ������ from pykd import *
+    python::dict     pykd_namespace(pykd.attr("__dict__"));
+
+    python::list     iterkeys(pykd_namespace.iterkeys());
+
+    for (int i = 0; i < boost::python::len(iterkeys); i++)
+    {
+        std::string     key = boost::python::extract<std::string>(iterkeys[i]);
+
+        main_namespace[key] = pykd_namespace[key];
+    }
+
+    // Python debug output console helper classes
+    python::class_<::DbgOut>("dout", "dout", python::no_init)
+        .def("write", &::DbgOut::write)
+        .def("flush", &::DbgOut::flush)
+        .add_property("encoding", &::DbgOut::encoding);
+
+    python::class_<::DbgIn>("din", "din", python::no_init)
+        .def("readline", &::DbgIn::readline)
+        .add_property("encoding", &::DbgIn::encoding);
+
+    python::object       sys = python::import("sys");
+
+    sys.attr("stdout") = python::object(::DbgOut());
+    sys.attr("stderr") = python::object(::DbgOut());
+    sys.attr("stdin") = python::object(::DbgIn());
+
+    m_pyState = PyEval_SaveThread();
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+void PykdBootsTrapper::tearDown()
+{
+    PyEval_RestoreThread(m_pyState);
+
+    Py_Finalize();
+
+    WindbgExtension::tearDown();
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+void PykdBootsTrapper::startConsole()
+{
+
+    // �������� ������ � ����������� ���� ( ����� ��� ������ exec_file )
+    python::object       main = python::import("__main__");
+
+    python::object       global(main.attr("__dict__"));
+
+    try {
+        InterruptWatch  interruptWatch;
+
+        python::exec("__import__('code').InteractiveConsole(__import__('__main__').__dict__).interact()\n", global);
+    }
+    catch (python::error_already_set const &)
+    {
+        printException();
+    }
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+void PykdBootsTrapper::printUsage()
+{
+    kdlib::dprintln(L"usage: !py [options] [file]");
+    kdlib::dprintln(L"Options:");
+    kdlib::dprintln(L"-g --global  : run code in the common namespace");
+    kdlib::dprintln(L"-l --local   : run code in the isolate namespace");
+}
+
+//////////////////////////////////////////////////////////////////////////////
+
+std::string PykdBootsTrapper::getScriptFileName(const std::string &scriptName)
+{
+    std::string scriptFileName = findScript(scriptName);
+
+    if (scriptFileName.empty())
+    {
+        std::string scriptNameLow;
+        scriptNameLow.resize(scriptName.size());
+        std::transform(
+            scriptName.begin(),
+            scriptName.end(),
+            scriptNameLow.begin(),
+            ::tolower);
+        if (scriptNameLow.rfind(".py") != (scriptNameLow.length() - 3))
+            scriptFileName = findScript(scriptName + ".py");
+    }
+
+    return scriptFileName;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+std::string PykdBootsTrapper::findScript(const std::string &fullFileName)
+{
+    if (GetFileAttributesA(fullFileName.c_str()) != INVALID_FILE_ATTRIBUTES)
+        return fullFileName;
+
+    python::object  sys = python::import("sys");
+
+    python::list  pathList(sys.attr("path"));
+
+    python::ssize_t  n = python::len(pathList);
+
+    for (python::ssize_t i = 0; i < n; i++)
+    {
+        std::string  path = boost::python::extract<std::string>(pathList[i]);
+
+        DWORD bufSize = SearchPathA(
+            path.c_str(),
+            fullFileName.c_str(),
+            NULL,
+            0,
+            NULL,
+            NULL);
+
+        if (bufSize > 0)
+        {
+            bufSize += 1;
+            std::vector<char> fullFileNameCStr(bufSize);
+            char *partFileNameCStr = NULL;
+
+            bufSize = SearchPathA(
+                path.c_str(),
+                fullFileName.c_str(),
+                NULL,
+                bufSize,
+                &fullFileNameCStr[0],
+                &partFileNameCStr);
+
+            if (bufSize > 0)
+            {
+                return std::string(&fullFileNameCStr[0]);
+            }
+        }
+    }
+
+    return "";
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+
+void PykdBootsTrapper::printException()
+{
+    // ������ � �������
+    PyObject  *errtype = NULL, *errvalue = NULL, *traceback = NULL;
+
+    PyErr_Fetch(&errtype, &errvalue, &traceback);
+
+    PyErr_NormalizeException(&errtype, &errvalue, &traceback);
+
+    if (errtype == PyExc_SystemExit)
+        return;
+
+    python::object  tracebackModule = python::import("traceback");
+
+    std::wstringstream  sstr;
+
+    python::object   lst =
+        python::object(tracebackModule.attr("format_exception"))(
+        python::handle<>(errtype),
+        python::handle<>(python::allow_null(errvalue)),
+        python::handle<>(python::allow_null(traceback)));
+
+    sstr << std::endl << std::endl;
+
+    for (long i = 0; i < python::len(lst); ++i)
+        sstr << std::wstring(python::extract<std::wstring>(lst[i])) << std::endl;
+
+    kdlib::eprintln(sstr.str());
+}
+
+///////////////////////////////////////////////////////////////////////////////
+