diff --git a/pykd/dia/diadata.cpp b/pykd/dia/diadata.cpp
index 8757e66..e2c6e2e 100644
--- a/pykd/dia/diadata.cpp
+++ b/pykd/dia/diadata.cpp
@@ -1,5 +1,5 @@
 #include "stdafx.h"
-#include "diawrapper.h"
+#include "diasymbol.h"
 
 namespace pykd {
 
@@ -32,532 +32,49 @@ const size_t DiaSymbol::cntBasicTypeName = _countof(DiaSymbol::basicTypeName);
 
 ///////////////////////////////////////////////////////////////////////////////
 
+namespace
+{
+
+const struct DiaRegToRegRelativeAmd64 : DiaRegToRegRelativeBase
+{
+    typedef std::map<ULONG, ULONG> Base;
+    DiaRegToRegRelativeAmd64();
+} g_DiaRegToRegRelativeAmd64;
+
+DiaRegToRegRelativeAmd64::DiaRegToRegRelativeAmd64()
+{
+    (*this)[CV_AMD64_RIP] = rriInstructionPointer;
+    (*this)[CV_AMD64_RBP] = rriStackFrame;
+    (*this)[CV_AMD64_RSP] = rriStackPointer;
+}
+
+}
+
+const DiaRegToRegRelativeBase &DiaSymbol::regToRegRelativeAmd64 = g_DiaRegToRegRelativeAmd64;
+
+///////////////////////////////////////////////////////////////////////////////
+
+namespace
+{
+
+const struct DiaRegToRegRelativeI386 : DiaRegToRegRelativeBase
+{
+    typedef std::map<ULONG, ULONG> Base;
+    DiaRegToRegRelativeI386();
+} g_DiaRegToRegRelativeI386;
+
+DiaRegToRegRelativeI386::DiaRegToRegRelativeI386()
+{
+    (*this)[CV_REG_EIP] = rriInstructionPointer;
+    (*this)[CV_REG_EBP] = rriStackFrame;
+    (*this)[CV_REG_ESP] = rriStackPointer;
+}
+
+}
+
+const DiaRegToRegRelativeBase &DiaSymbol::regToRegRelativeI386 = g_DiaRegToRegRelativeI386;
+
+///////////////////////////////////////////////////////////////////////////////
+
 } //pykd namespace end
 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-//
-//#include "diawrapper.h"
-//#include "utils.h"
-//
-//namespace pyDia {
-//
-//////////////////////////////////////////////////////////////////////////////////
-//
-//#define _DEF_SYM_TAG_VAL(x) Symbol::ValueNameEntry(SymTag##x, #x)
-//const Symbol::ValueNameEntry Symbol::symTagName[SymTagMax] = {
-//    _DEF_SYM_TAG_VAL(Null),
-//    _DEF_SYM_TAG_VAL(Exe),
-//    _DEF_SYM_TAG_VAL(Compiland),
-//    _DEF_SYM_TAG_VAL(CompilandDetails),
-//    _DEF_SYM_TAG_VAL(CompilandEnv),
-//    _DEF_SYM_TAG_VAL(Function),
-//    _DEF_SYM_TAG_VAL(Block),
-//    _DEF_SYM_TAG_VAL(Data),
-//    _DEF_SYM_TAG_VAL(Annotation),
-//    _DEF_SYM_TAG_VAL(Label),
-//    _DEF_SYM_TAG_VAL(PublicSymbol),
-//    _DEF_SYM_TAG_VAL(UDT),
-//    _DEF_SYM_TAG_VAL(Enum),
-//    _DEF_SYM_TAG_VAL(FunctionType),
-//    _DEF_SYM_TAG_VAL(PointerType),
-//    _DEF_SYM_TAG_VAL(ArrayType),
-//    _DEF_SYM_TAG_VAL(BaseType),
-//    _DEF_SYM_TAG_VAL(Typedef),
-//    _DEF_SYM_TAG_VAL(BaseClass),
-//    _DEF_SYM_TAG_VAL(Friend),
-//    _DEF_SYM_TAG_VAL(FunctionArgType),
-//    _DEF_SYM_TAG_VAL(FuncDebugStart),
-//    _DEF_SYM_TAG_VAL(FuncDebugEnd),
-//    _DEF_SYM_TAG_VAL(UsingNamespace),
-//    _DEF_SYM_TAG_VAL(VTableShape),
-//    _DEF_SYM_TAG_VAL(VTable),
-//    _DEF_SYM_TAG_VAL(Custom),
-//    _DEF_SYM_TAG_VAL(Thunk),
-//    _DEF_SYM_TAG_VAL(CustomType),
-//    _DEF_SYM_TAG_VAL(ManagedType),
-//    _DEF_SYM_TAG_VAL(Dimension)
-//};
-//#undef _DEF_SYM_TAG_VAL
-//
-//////////////////////////////////////////////////////////////////////////////////
-//
-//#define _DEF_DATA_KIND_VAL(x) Symbol::ValueNameEntry(DataIs##x, #x)
-//const Symbol::ValueNameEntry Symbol::dataKindName[DataIsConstant + 1] = {
-//    _DEF_DATA_KIND_VAL(Unknown),
-//    _DEF_DATA_KIND_VAL(Local),
-//    _DEF_DATA_KIND_VAL(StaticLocal),
-//    _DEF_DATA_KIND_VAL(Param),
-//    _DEF_DATA_KIND_VAL(ObjectPtr),
-//    _DEF_DATA_KIND_VAL(FileStatic),
-//    _DEF_DATA_KIND_VAL(Global),
-//    _DEF_DATA_KIND_VAL(Member),
-//    _DEF_DATA_KIND_VAL(StaticMember),
-//    _DEF_DATA_KIND_VAL(Constant)
-//};
-//#undef _DEF_DATA_KIND_VAL
-//
-//
-//////////////////////////////////////////////////////////////////////////////////
-//
-//#define _DEF_LOC_TYPE(x)    Symbol::ValueNameEntry(LocIs##x, #x)
-//const Symbol::ValueNameEntry Symbol::locTypeName[LocTypeMax] = {
-//    _DEF_LOC_TYPE(Null),
-//    _DEF_LOC_TYPE(Static),
-//    _DEF_LOC_TYPE(TLS),
-//    _DEF_LOC_TYPE(RegRel),
-//    _DEF_LOC_TYPE(ThisRel),
-//    _DEF_LOC_TYPE(Enregistered),
-//    _DEF_LOC_TYPE(BitField),
-//    _DEF_LOC_TYPE(Slot),
-//    _DEF_LOC_TYPE(IlRel),
-//    Symbol::ValueNameEntry(LocInMetaData, "InMetaData"),
-//    _DEF_LOC_TYPE(Constant)
-//};
-//#undef _DEF_LOC_TYPE
-//
-//////////////////////////////////////////////////////////////////////////////////
-//
-//#define _DEF_BASIC_TYPE(x)  Symbol::ValueNameEntry(bt##x, #x)
-//const Symbol::ValueNameEntry Symbol::basicTypeName[] = {
-//    _DEF_BASIC_TYPE(NoType),
-//    _DEF_BASIC_TYPE(Void),
-//    _DEF_BASIC_TYPE(Char),
-//    _DEF_BASIC_TYPE(WChar),
-//    _DEF_BASIC_TYPE(Int),
-//    _DEF_BASIC_TYPE(UInt),
-//    _DEF_BASIC_TYPE(Float),
-//    _DEF_BASIC_TYPE(BCD),
-//    _DEF_BASIC_TYPE(Bool),
-//    _DEF_BASIC_TYPE(Long),
-//    _DEF_BASIC_TYPE(ULong),
-//    _DEF_BASIC_TYPE(Currency),
-//    _DEF_BASIC_TYPE(Date),
-//    _DEF_BASIC_TYPE(Variant),
-//    _DEF_BASIC_TYPE(Complex),
-//    _DEF_BASIC_TYPE(Bit),
-//    _DEF_BASIC_TYPE(BSTR),
-//    _DEF_BASIC_TYPE(Hresult)
-//};
-//#undef _DEF_BASIC_TYPE
-//
-//const size_t Symbol::cntBasicTypeName = _countof(Symbol::basicTypeName);
-//
-//std::string Symbol::getBasicTypeName( ULONG basicType )
-//{
-//    for ( size_t i = 0; i < Symbol::cntBasicTypeName; ++i )
-//    {
-//        if ( basicType == Symbol::basicTypeName[i].first )
-//            return std::string( Symbol::basicTypeName[i].second );
-//    }
-//
-//    std::stringstream   sstr;
-//
-//    sstr << "faild to find basic type with index %d" << basicType;
-//
-//    throw Exception( sstr.str() );
-//}
-//
-//////////////////////////////////////////////////////////////////////////////////
-//
-//#define _DEF_UDT_KIND(x)    Symbol::ValueNameEntry(Udt##x, #x)
-//const Symbol::ValueNameEntry Symbol::udtKindName[] = {
-//    _DEF_UDT_KIND(Struct),
-//    _DEF_UDT_KIND(Class),
-//    _DEF_UDT_KIND(Union)
-//};
-//#undef  _DEF_UDT_KIND
-//
-//const size_t Symbol::cntUdtKindName = _countof(udtKindName);
-//
-//////////////////////////////////////////////////////////////////////////////////
-//
-//#define _DEF_I386_REG(x)    Symbol::ValueNameEntry(CV_REG_##x, #x)
-//const Symbol::ValueNameEntry Symbol::i386RegName[] = {
-//    _DEF_I386_REG(AL),
-//    _DEF_I386_REG(CL),
-//    _DEF_I386_REG(DL),
-//    _DEF_I386_REG(BL),
-//    _DEF_I386_REG(AH),
-//    _DEF_I386_REG(CH),
-//    _DEF_I386_REG(DH),
-//    _DEF_I386_REG(BH),
-//    _DEF_I386_REG(AX),
-//    _DEF_I386_REG(CX),
-//    _DEF_I386_REG(DX),
-//    _DEF_I386_REG(BX),
-//    _DEF_I386_REG(SP),
-//    _DEF_I386_REG(BP),
-//    _DEF_I386_REG(SI),
-//    _DEF_I386_REG(DI),
-//    _DEF_I386_REG(EAX),
-//    _DEF_I386_REG(ECX),
-//    _DEF_I386_REG(EDX),
-//    _DEF_I386_REG(EBX),
-//    _DEF_I386_REG(ESP),
-//    _DEF_I386_REG(EBP),
-//    _DEF_I386_REG(ESI),
-//    _DEF_I386_REG(EDI),
-//    _DEF_I386_REG(ES),
-//    _DEF_I386_REG(CS),
-//    _DEF_I386_REG(SS),
-//    _DEF_I386_REG(DS),
-//    _DEF_I386_REG(FS),
-//    _DEF_I386_REG(GS),
-//    _DEF_I386_REG(IP),
-//    _DEF_I386_REG(FLAGS ),
-//    _DEF_I386_REG(EIP),
-//    _DEF_I386_REG(EFLAGS),
-//    _DEF_I386_REG(TEMP),
-//    _DEF_I386_REG(TEMPH),
-//    _DEF_I386_REG(QUOTE),
-//    _DEF_I386_REG(PCDR3),
-//    _DEF_I386_REG(PCDR4),
-//    _DEF_I386_REG(PCDR5),
-//    _DEF_I386_REG(PCDR6),
-//    _DEF_I386_REG(PCDR7),
-//    _DEF_I386_REG(CR0),
-//    _DEF_I386_REG(CR1),
-//    _DEF_I386_REG(CR2),
-//    _DEF_I386_REG(CR3),
-//    _DEF_I386_REG(CR4),
-//    _DEF_I386_REG(DR0),
-//    _DEF_I386_REG(DR1),
-//    _DEF_I386_REG(DR2),
-//    _DEF_I386_REG(DR3),
-//    _DEF_I386_REG(DR4),
-//    _DEF_I386_REG(DR5),
-//    _DEF_I386_REG(DR6),
-//    _DEF_I386_REG(DR7),
-//    _DEF_I386_REG(GDTR),
-//    _DEF_I386_REG(GDTL),
-//    _DEF_I386_REG(IDTR),
-//    _DEF_I386_REG(IDTL),
-//    _DEF_I386_REG(LDTR),
-//    _DEF_I386_REG(TR)
-//};
-//#undef  _DEF_I386_REG
-//
-//const size_t Symbol::cntI386RegName = _countof(i386RegName);
-//
-//////////////////////////////////////////////////////////////////////////////////
-//
-//#define _DEF_AMD64_REG(x)    Symbol::ValueNameEntry(CV_AMD64_##x, #x)
-//const Symbol::ValueNameEntry Symbol::amd64RegName[] = {
-//    _DEF_AMD64_REG(AL),
-//    _DEF_AMD64_REG(CL),
-//    _DEF_AMD64_REG(DL),
-//    _DEF_AMD64_REG(BL),
-//    _DEF_AMD64_REG(AH),
-//    _DEF_AMD64_REG(CH),
-//    _DEF_AMD64_REG(DH),
-//    _DEF_AMD64_REG(BH),
-//    _DEF_AMD64_REG(AX),
-//    _DEF_AMD64_REG(CX),
-//    _DEF_AMD64_REG(DX),
-//    _DEF_AMD64_REG(BX),
-//    _DEF_AMD64_REG(SP),
-//    _DEF_AMD64_REG(BP),
-//    _DEF_AMD64_REG(SI),
-//    _DEF_AMD64_REG(DI),
-//    _DEF_AMD64_REG(EAX),
-//    _DEF_AMD64_REG(ECX),
-//    _DEF_AMD64_REG(EDX),
-//    _DEF_AMD64_REG(EBX),
-//    _DEF_AMD64_REG(ESP),
-//    _DEF_AMD64_REG(EBP),
-//    _DEF_AMD64_REG(ESI),
-//    _DEF_AMD64_REG(EDI),
-//    _DEF_AMD64_REG(ES),
-//    _DEF_AMD64_REG(CS),
-//    _DEF_AMD64_REG(SS),
-//    _DEF_AMD64_REG(DS),
-//    _DEF_AMD64_REG(FS),
-//    _DEF_AMD64_REG(GS),
-//    _DEF_AMD64_REG(FLAGS),
-//    _DEF_AMD64_REG(RIP),
-//    _DEF_AMD64_REG(EFLAGS),
-//    _DEF_AMD64_REG(CR0),
-//    _DEF_AMD64_REG(CR1),
-//    _DEF_AMD64_REG(CR2),
-//    _DEF_AMD64_REG(CR3),
-//    _DEF_AMD64_REG(CR4),
-//    _DEF_AMD64_REG(CR8),
-//    _DEF_AMD64_REG(DR0),
-//    _DEF_AMD64_REG(DR1),
-//    _DEF_AMD64_REG(DR2),
-//    _DEF_AMD64_REG(DR3),
-//    _DEF_AMD64_REG(DR4),
-//    _DEF_AMD64_REG(DR5),
-//    _DEF_AMD64_REG(DR6),
-//    _DEF_AMD64_REG(DR7),
-//    _DEF_AMD64_REG(DR8),
-//    _DEF_AMD64_REG(DR9),
-//    _DEF_AMD64_REG(DR10),
-//    _DEF_AMD64_REG(DR11),
-//    _DEF_AMD64_REG(DR12),
-//    _DEF_AMD64_REG(DR13),
-//    _DEF_AMD64_REG(DR14),
-//    _DEF_AMD64_REG(DR15),
-//    _DEF_AMD64_REG(GDTR),
-//    _DEF_AMD64_REG(GDTL),
-//    _DEF_AMD64_REG(IDTR),
-//    _DEF_AMD64_REG(IDTL),
-//    _DEF_AMD64_REG(LDTR),
-//    _DEF_AMD64_REG(TR),
-//    _DEF_AMD64_REG(ST0),
-//    _DEF_AMD64_REG(ST1),
-//    _DEF_AMD64_REG(ST2),
-//    _DEF_AMD64_REG(ST3),
-//    _DEF_AMD64_REG(ST4),
-//    _DEF_AMD64_REG(ST5),
-//    _DEF_AMD64_REG(ST6),
-//    _DEF_AMD64_REG(ST7),
-//    _DEF_AMD64_REG(CTRL),
-//    _DEF_AMD64_REG(STAT),
-//    _DEF_AMD64_REG(TAG),
-//    _DEF_AMD64_REG(FPIP),
-//    _DEF_AMD64_REG(FPCS),
-//    _DEF_AMD64_REG(FPDO),
-//    _DEF_AMD64_REG(FPDS),
-//    _DEF_AMD64_REG(ISEM),
-//    _DEF_AMD64_REG(FPEIP),
-//    _DEF_AMD64_REG(FPEDO),
-//    _DEF_AMD64_REG(MM0),
-//    _DEF_AMD64_REG(MM1),
-//    _DEF_AMD64_REG(MM2),
-//    _DEF_AMD64_REG(MM3),
-//    _DEF_AMD64_REG(MM4),
-//    _DEF_AMD64_REG(MM5),
-//    _DEF_AMD64_REG(MM6),
-//    _DEF_AMD64_REG(MM7),
-//    _DEF_AMD64_REG(XMM0),
-//    _DEF_AMD64_REG(XMM1),
-//    _DEF_AMD64_REG(XMM2),
-//    _DEF_AMD64_REG(XMM3),
-//    _DEF_AMD64_REG(XMM4),
-//    _DEF_AMD64_REG(XMM5),
-//    _DEF_AMD64_REG(XMM6),
-//    _DEF_AMD64_REG(XMM7),
-//    _DEF_AMD64_REG(XMM0_0),
-//    _DEF_AMD64_REG(XMM0_1),
-//    _DEF_AMD64_REG(XMM0_2),
-//    _DEF_AMD64_REG(XMM0_3),
-//    _DEF_AMD64_REG(XMM1_0),
-//    _DEF_AMD64_REG(XMM1_1),
-//    _DEF_AMD64_REG(XMM1_2),
-//    _DEF_AMD64_REG(XMM1_3),
-//    _DEF_AMD64_REG(XMM2_0),
-//    _DEF_AMD64_REG(XMM2_1),
-//    _DEF_AMD64_REG(XMM2_2),
-//    _DEF_AMD64_REG(XMM2_3),
-//    _DEF_AMD64_REG(XMM3_0),
-//    _DEF_AMD64_REG(XMM3_1),
-//    _DEF_AMD64_REG(XMM3_2),
-//    _DEF_AMD64_REG(XMM3_3),
-//    _DEF_AMD64_REG(XMM4_0),
-//    _DEF_AMD64_REG(XMM4_1),
-//    _DEF_AMD64_REG(XMM4_2),
-//    _DEF_AMD64_REG(XMM4_3),
-//    _DEF_AMD64_REG(XMM5_0),
-//    _DEF_AMD64_REG(XMM5_1),
-//    _DEF_AMD64_REG(XMM5_2),
-//    _DEF_AMD64_REG(XMM5_3),
-//    _DEF_AMD64_REG(XMM6_0),
-//    _DEF_AMD64_REG(XMM6_1),
-//    _DEF_AMD64_REG(XMM6_2),
-//    _DEF_AMD64_REG(XMM6_3),
-//    _DEF_AMD64_REG(XMM7_0),
-//    _DEF_AMD64_REG(XMM7_1),
-//    _DEF_AMD64_REG(XMM7_2),
-//    _DEF_AMD64_REG(XMM7_3),
-//    _DEF_AMD64_REG(XMM0L),
-//    _DEF_AMD64_REG(XMM1L),
-//    _DEF_AMD64_REG(XMM2L),
-//    _DEF_AMD64_REG(XMM3L),
-//    _DEF_AMD64_REG(XMM4L),
-//    _DEF_AMD64_REG(XMM5L),
-//    _DEF_AMD64_REG(XMM6L),
-//    _DEF_AMD64_REG(XMM7L),
-//    _DEF_AMD64_REG(XMM0H),
-//    _DEF_AMD64_REG(XMM1H),
-//    _DEF_AMD64_REG(XMM2H),
-//    _DEF_AMD64_REG(XMM3H),
-//    _DEF_AMD64_REG(XMM4H),
-//    _DEF_AMD64_REG(XMM5H),
-//    _DEF_AMD64_REG(XMM6H),
-//    _DEF_AMD64_REG(XMM7H),
-//    _DEF_AMD64_REG(MXCSR),
-//    _DEF_AMD64_REG(EMM0L),
-//    _DEF_AMD64_REG(EMM1L),
-//    _DEF_AMD64_REG(EMM2L),
-//    _DEF_AMD64_REG(EMM3L),
-//    _DEF_AMD64_REG(EMM4L),
-//    _DEF_AMD64_REG(EMM5L),
-//    _DEF_AMD64_REG(EMM6L),
-//    _DEF_AMD64_REG(EMM7L),
-//    _DEF_AMD64_REG(EMM0H),
-//    _DEF_AMD64_REG(EMM1H),
-//    _DEF_AMD64_REG(EMM2H),
-//    _DEF_AMD64_REG(EMM3H),
-//    _DEF_AMD64_REG(EMM4H),
-//    _DEF_AMD64_REG(EMM5H),
-//    _DEF_AMD64_REG(EMM6H),
-//    _DEF_AMD64_REG(EMM7H),
-//    _DEF_AMD64_REG(MM00),
-//    _DEF_AMD64_REG(MM01),
-//    _DEF_AMD64_REG(MM10),
-//    _DEF_AMD64_REG(MM11),
-//    _DEF_AMD64_REG(MM20),
-//    _DEF_AMD64_REG(MM21),
-//    _DEF_AMD64_REG(MM30),
-//    _DEF_AMD64_REG(MM31),
-//    _DEF_AMD64_REG(MM40),
-//    _DEF_AMD64_REG(MM41),
-//    _DEF_AMD64_REG(MM50),
-//    _DEF_AMD64_REG(MM51),
-//    _DEF_AMD64_REG(MM60),
-//    _DEF_AMD64_REG(MM61),
-//    _DEF_AMD64_REG(MM70),
-//    _DEF_AMD64_REG(MM71),
-//    _DEF_AMD64_REG(XMM8),
-//    _DEF_AMD64_REG(XMM9),
-//    _DEF_AMD64_REG(XMM10),
-//    _DEF_AMD64_REG(XMM11),
-//    _DEF_AMD64_REG(XMM12),
-//    _DEF_AMD64_REG(XMM13),
-//    _DEF_AMD64_REG(XMM14),
-//    _DEF_AMD64_REG(XMM15),
-//    _DEF_AMD64_REG(XMM8_0),
-//    _DEF_AMD64_REG(XMM8_1),
-//    _DEF_AMD64_REG(XMM8_2),
-//    _DEF_AMD64_REG(XMM8_3),
-//    _DEF_AMD64_REG(XMM9_0),
-//    _DEF_AMD64_REG(XMM9_1),
-//    _DEF_AMD64_REG(XMM9_2),
-//    _DEF_AMD64_REG(XMM9_3),
-//    _DEF_AMD64_REG(XMM10_0),
-//    _DEF_AMD64_REG(XMM10_1),
-//    _DEF_AMD64_REG(XMM10_2),
-//    _DEF_AMD64_REG(XMM10_3),
-//    _DEF_AMD64_REG(XMM11_0),
-//    _DEF_AMD64_REG(XMM11_1),
-//    _DEF_AMD64_REG(XMM11_2),
-//    _DEF_AMD64_REG(XMM11_3),
-//    _DEF_AMD64_REG(XMM12_0),
-//    _DEF_AMD64_REG(XMM12_1),
-//    _DEF_AMD64_REG(XMM12_2),
-//    _DEF_AMD64_REG(XMM12_3),
-//    _DEF_AMD64_REG(XMM13_0),
-//    _DEF_AMD64_REG(XMM13_1),
-//    _DEF_AMD64_REG(XMM13_2),
-//    _DEF_AMD64_REG(XMM13_3),
-//    _DEF_AMD64_REG(XMM14_0),
-//    _DEF_AMD64_REG(XMM14_1),
-//    _DEF_AMD64_REG(XMM14_2),
-//    _DEF_AMD64_REG(XMM14_3),
-//    _DEF_AMD64_REG(XMM15_0),
-//    _DEF_AMD64_REG(XMM15_1),
-//    _DEF_AMD64_REG(XMM15_2),
-//    _DEF_AMD64_REG(XMM15_3),
-//    _DEF_AMD64_REG(XMM8L),
-//    _DEF_AMD64_REG(XMM9L),
-//    _DEF_AMD64_REG(XMM10L),
-//    _DEF_AMD64_REG(XMM11L),
-//    _DEF_AMD64_REG(XMM12L),
-//    _DEF_AMD64_REG(XMM13L),
-//    _DEF_AMD64_REG(XMM14L),
-//    _DEF_AMD64_REG(XMM15L),
-//    _DEF_AMD64_REG(XMM8H),
-//    _DEF_AMD64_REG(XMM9H),
-//    _DEF_AMD64_REG(XMM10H),
-//    _DEF_AMD64_REG(XMM11H),
-//    _DEF_AMD64_REG(XMM12H),
-//    _DEF_AMD64_REG(XMM13H),
-//    _DEF_AMD64_REG(XMM14H),
-//    _DEF_AMD64_REG(XMM15H),
-//    _DEF_AMD64_REG(EMM8L),
-//    _DEF_AMD64_REG(EMM9L),
-//    _DEF_AMD64_REG(EMM10L),
-//    _DEF_AMD64_REG(EMM11L),
-//    _DEF_AMD64_REG(EMM12L),
-//    _DEF_AMD64_REG(EMM13L),
-//    _DEF_AMD64_REG(EMM14L),
-//    _DEF_AMD64_REG(EMM15L),
-//    _DEF_AMD64_REG(EMM8H),
-//    _DEF_AMD64_REG(EMM9H),
-//    _DEF_AMD64_REG(EMM10H),
-//    _DEF_AMD64_REG(EMM11H),
-//    _DEF_AMD64_REG(EMM12H),
-//    _DEF_AMD64_REG(EMM13H),
-//    _DEF_AMD64_REG(EMM14H),
-//    _DEF_AMD64_REG(EMM15H),
-//    _DEF_AMD64_REG(SIL),
-//    _DEF_AMD64_REG(DIL),
-//    _DEF_AMD64_REG(BPL),
-//    _DEF_AMD64_REG(SPL),
-//    _DEF_AMD64_REG(RAX),
-//    _DEF_AMD64_REG(RBX),
-//    _DEF_AMD64_REG(RCX),
-//    _DEF_AMD64_REG(RDX),
-//    _DEF_AMD64_REG(RSI),
-//    _DEF_AMD64_REG(RDI),
-//    _DEF_AMD64_REG(RBP),
-//    _DEF_AMD64_REG(RSP),
-//    _DEF_AMD64_REG(R8),
-//    _DEF_AMD64_REG(R9),
-//    _DEF_AMD64_REG(R10),
-//    _DEF_AMD64_REG(R11),
-//    _DEF_AMD64_REG(R12),
-//    _DEF_AMD64_REG(R13),
-//    _DEF_AMD64_REG(R14),
-//    _DEF_AMD64_REG(R15),
-//    _DEF_AMD64_REG(R8B),
-//    _DEF_AMD64_REG(R9B),
-//    _DEF_AMD64_REG(R10B),
-//    _DEF_AMD64_REG(R11B),
-//    _DEF_AMD64_REG(R12B),
-//    _DEF_AMD64_REG(R13B),
-//    _DEF_AMD64_REG(R14B),
-//    _DEF_AMD64_REG(R15B),
-//    _DEF_AMD64_REG(R8W),
-//    _DEF_AMD64_REG(R9W),
-//    _DEF_AMD64_REG(R10W),
-//    _DEF_AMD64_REG(R11W),
-//    _DEF_AMD64_REG(R12W),
-//    _DEF_AMD64_REG(R13W),
-//    _DEF_AMD64_REG(R14W),
-//    _DEF_AMD64_REG(R15W),
-//    _DEF_AMD64_REG(R8D),
-//    _DEF_AMD64_REG(R9D),
-//    _DEF_AMD64_REG(R10D),
-//    _DEF_AMD64_REG(R11D),
-//    _DEF_AMD64_REG(R12D),
-//    _DEF_AMD64_REG(R13D),
-//    _DEF_AMD64_REG(R14D),
-//    _DEF_AMD64_REG(R15D)
-//};
-//#undef  _DEF_AMD64_REG
-//
-//const size_t Symbol::cntAmd64RegName= _countof(amd64RegName);
-//
-//////////////////////////////////////////////////////////////////////////////////
-//
-//}
diff --git a/pykd/dia/diadecls.h b/pykd/dia/diadecls.h
new file mode 100644
index 0000000..0e89e0a
--- /dev/null
+++ b/pykd/dia/diadecls.h
@@ -0,0 +1,25 @@
+#pragma once
+
+#include <dia2.h>
+
+#include "symengine.h"
+
+#include "dia\diaexcept.h"
+
+
+namespace pykd {
+
+//////////////////////////////////////////////////////////////////////////////
+
+typedef CComPtr< IDiaSymbol > DiaSymbolPtr;
+typedef CComPtr< IDiaEnumSymbols > DiaEnumSymbolsPtr;
+typedef CComPtr< IDiaDataSource > DiaDataSourcePtr;
+typedef CComPtr< IDiaSession > DiaSessionPtr;
+typedef CComPtr< IDiaEnumSymbolsByAddr > DiaEnumSymbolsByAddrPtr;
+typedef CComPtr< IDiaEnumLineNumbers > DiaEnumLineNumbersPtr;
+typedef CComPtr< IDiaLineNumber> DiaLineNumberPtr;
+typedef CComPtr< IDiaSourceFile > DiaSourceFilePtr;
+
+//////////////////////////////////////////////////////////////////////////////
+
+} // end pykd namespace
diff --git a/pykd/dia/diaexcept.cpp b/pykd/dia/diaexcept.cpp
new file mode 100644
index 0000000..623da98
--- /dev/null
+++ b/pykd/dia/diaexcept.cpp
@@ -0,0 +1,121 @@
+
+#include "stdafx.h"
+#include "dia\diadecls.h"
+#include "win\utils.h"
+
+namespace pykd {
+
+///////////////////////////////////////////////////////////////////////////////
+
+const std::string DiaException::descPrefix("pyDia: ");
+
+std::string DiaException::makeFullDesc(const std::string &desc, HRESULT hres, IDiaSymbol *symbol /*= NULL*/)
+{
+    std::stringstream sstream;
+    sstream << descPrefix << desc << " failed" << std::endl;
+    if (symbol)
+    {
+        BSTR bstrName = NULL;
+        HRESULT locRes = symbol->get_undecoratedName(&bstrName);
+        if (S_OK == locRes && bstrName)
+        {
+            autoBstr freeBstr(bstrName);
+            sstream << "Symbol name: \"" << autoBstr::asStr(bstrName) << "\"";
+        }
+        else
+        {
+            locRes = symbol->get_name(&bstrName);
+            if (S_OK == locRes && bstrName)
+            {
+                autoBstr freeBstr(bstrName);
+                sstream << "Symbol name: " << autoBstr::asStr(bstrName);
+            }
+            else
+            {
+                sstream << "Symbol: ";
+            }
+        }
+
+        DWORD dwValue;
+        locRes = symbol->get_relativeVirtualAddress(&dwValue);
+        if (S_OK == locRes)
+        {
+            sstream << ", RVA= 0x" << std::hex << dwValue;
+        }
+
+        locRes = symbol->get_symTag(&dwValue);
+        if (S_OK == locRes)
+        {
+            sstream << ", tag= " << std::dec << dwValue;
+        }
+
+        locRes = symbol->get_locationType(&dwValue);
+        if (S_OK == locRes)
+        {
+            sstream << ", location: " << std::dec << dwValue;
+        }
+
+        sstream << std::endl;
+    }
+    sstream << "Return value is 0x" << std::hex << hres;
+
+    switch (hres)
+    {
+#define _CASE_DIA_ERROR(x)  case E_PDB_##x: sstream << ": E_PDB_" #x << std::endl; break
+
+    _CASE_DIA_ERROR(USAGE);
+    _CASE_DIA_ERROR(OUT_OF_MEMORY);
+    _CASE_DIA_ERROR(FILE_SYSTEM);
+    _CASE_DIA_ERROR(NOT_FOUND);
+    _CASE_DIA_ERROR(INVALID_SIG);
+    _CASE_DIA_ERROR(INVALID_AGE);
+    _CASE_DIA_ERROR(PRECOMP_REQUIRED);
+    _CASE_DIA_ERROR(OUT_OF_TI);
+    _CASE_DIA_ERROR(NOT_IMPLEMENTED);
+    _CASE_DIA_ERROR(V1_PDB);
+    _CASE_DIA_ERROR(FORMAT);
+    _CASE_DIA_ERROR(LIMIT);
+    _CASE_DIA_ERROR(CORRUPT);
+    _CASE_DIA_ERROR(TI16);
+    _CASE_DIA_ERROR(ACCESS_DENIED);
+    _CASE_DIA_ERROR(ILLEGAL_TYPE_EDIT);
+    _CASE_DIA_ERROR(INVALID_EXECUTABLE);
+    _CASE_DIA_ERROR(DBG_NOT_FOUND);
+    _CASE_DIA_ERROR(NO_DEBUG_INFO);
+    _CASE_DIA_ERROR(INVALID_EXE_TIMESTAMP);
+    _CASE_DIA_ERROR(RESERVED);
+    _CASE_DIA_ERROR(DEBUG_INFO_NOT_IN_PDB);
+    _CASE_DIA_ERROR(SYMSRV_BAD_CACHE_PATH);
+    _CASE_DIA_ERROR(SYMSRV_CACHE_FULL);
+
+#undef _CASE_DIA_ERROR
+    default:
+        {
+            PCHAR errMessage = NULL;
+            FormatMessageA(
+                FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
+                NULL,
+                hres,
+                MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+                (PCHAR)&errMessage,
+                0,
+                NULL);
+            if (errMessage)
+            {
+                sstream << ": " << std::endl;
+                sstream << errMessage;
+                LocalFree(errMessage);
+            }
+            else
+            {
+                sstream << std::endl;
+            }
+        }
+    }
+
+    return sstream.str();
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+}; // pykd namespace end
diff --git a/pykd/dia/diaexcept.h b/pykd/dia/diaexcept.h
new file mode 100644
index 0000000..e65737d
--- /dev/null
+++ b/pykd/dia/diaexcept.h
@@ -0,0 +1,39 @@
+
+#pragma once
+
+#include "dbgexcept.h"
+
+namespace pykd {
+
+//////////////////////////////////////////////////////////////////////////////
+
+class DiaException : public SymbolException {
+public:
+    DiaException(const std::string &desc, HRESULT hres, IDiaSymbol *symbol = NULL)
+        : SymbolException( makeFullDesc(desc, hres, symbol) )
+        , m_hres(hres)
+    {
+    }
+
+    DiaException(const std::string &desc)
+        : SymbolException(descPrefix + desc)
+        , m_hres(S_FALSE)
+    {
+    }
+
+    HRESULT getRes() const {
+        return m_hres;
+    }
+private:
+
+    static const std::string descPrefix;
+
+    static std::string makeFullDesc(const std::string &desc, HRESULT hres, IDiaSymbol *symbol = NULL);
+
+    HRESULT m_hres;
+};
+
+////////////////////////////////////////////////////////////////////////////
+
+} // end pykd namespace
+
diff --git a/pykd/dia/diaload.cpp b/pykd/dia/diaload.cpp
index 602d88f..9d14e01 100644
--- a/pykd/dia/diaload.cpp
+++ b/pykd/dia/diaload.cpp
@@ -4,10 +4,11 @@
 
 #include "stdafx.h"
 #include "dbghelp.h"
-#include "dia/diawrapper.h"
-#include "win/utils.h"
+#include "dbgmem.h"
 #include "dbgengine.h"
-#include "diacallback.h"
+#include "win/utils.h"
+#include "dia/diasession.h"
+#include "dia/diacallback.h"
 
 //////////////////////////////////////////////////////////////////////////////////
 
@@ -217,7 +218,7 @@ protected:
 
 //////////////////////////////////////////////////////////////////////////////////
 
-SymbolSessionPtr  loadSymbolFile(const std::string &filePath, ULONGLONG loadBase )
+SymbolSessionPtr loadSymbolFile(const std::string &filePath, ULONGLONG loadBase )
 {
     diaLoad::DataFromPdb dataFromPdb(filePath);
     return diaLoad::createSession(dataFromPdb, loadBase, filePath);
diff --git a/pykd/dia/diasession.cpp b/pykd/dia/diasession.cpp
new file mode 100644
index 0000000..019babf
--- /dev/null
+++ b/pykd/dia/diasession.cpp
@@ -0,0 +1,77 @@
+
+#include "stdafx.h"
+
+#include "dbghelp.h"
+#include "dia\diasession.h"
+#include "win\utils.h"
+
+namespace pykd {
+
+//////////////////////////////////////////////////////////////////////////////
+
+SymbolPtr DiaSession::findByRva( ULONG rva, ULONG symTag, LONG* pdisplacement )
+{
+    DiaSymbolPtr child;
+    LONG displacement;
+
+    HRESULT hres = 
+        m_session->findSymbolByRVAEx(
+            rva,
+            static_cast<enum ::SymTagEnum>(symTag),
+            &child,
+            &displacement);
+
+    if (S_OK != hres)
+        throw DiaException("Call IDiaSession::findSymbolByRVAEx", hres);
+    if (!child)
+        throw DiaException("Call IDiaSession::findSymbolByRVAEx", E_UNEXPECTED);
+    if ( !pdisplacement && displacement)
+        throw DiaException("Call IDiaSession::findSymbolByRVAEx failed to find suymbol" );
+
+    if (pdisplacement)
+        *pdisplacement = displacement;
+
+    return SymbolPtr( new DiaSymbol(child, m_globalSymbol->getMachineType() ) );
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+void DiaSession::getSourceLine( ULONG64 offset, std::string &fileName, ULONG &lineNo, LONG &displacement )
+{
+    DiaEnumLineNumbersPtr  lines;
+
+    HRESULT hres = m_session->findLinesByVA( offset, 1, &lines );
+    if (S_OK != hres)
+        throw DiaException("failed to find source line");
+
+    DiaLineNumberPtr  sourceLine;
+    hres = lines->Item( 0, &sourceLine );
+    if (S_OK != hres)
+        throw DiaException("failed to find source line");
+
+    DiaSourceFilePtr  sourceFile;
+    hres = sourceLine->get_sourceFile( &sourceFile );
+    if (S_OK != hres)
+        throw DiaException("failed to find source line");
+    
+    autoBstr  fileNameBstr;
+    hres = sourceFile->get_fileName ( &fileNameBstr );
+    if (S_OK != hres)
+        throw DiaException("failed to find source line");
+    fileName = fileNameBstr.asStr();
+
+    hres = sourceLine->get_lineNumber( &lineNo );
+    if (S_OK != hres)
+        throw DiaException("failed to find source line");
+
+    ULONGLONG  va;
+    hres = sourceLine->get_virtualAddress ( &va );
+    if (S_OK != hres)
+        throw DiaException("failed to find source line");
+
+    displacement = (LONG)( (LONGLONG)offset - (LONGLONG)va );
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+}; // pykd namespace end
diff --git a/pykd/dia/diasession.h b/pykd/dia/diasession.h
new file mode 100644
index 0000000..7c2918d
--- /dev/null
+++ b/pykd/dia/diasession.h
@@ -0,0 +1,48 @@
+
+#pragma once
+
+#include "dia\diadecls.h"
+#include "dia\diasymbol.h"
+
+namespace pykd {
+
+////////////////////////////////////////////////////////////////////////////
+
+class DiaSession : public SymbolSession
+{
+public:
+
+    DiaSession( IDiaSession* session, IDiaSymbol *globalScope, const std::string symbolFile ) :
+        m_globalScope( globalScope ),
+        m_globalSymbol( DiaSymbol::fromGlobalScope( globalScope ) ),
+        m_session( session ),
+        m_symbolFileName( symbolFile )
+        {}
+
+    virtual SymbolPtr getSymbolScope() {
+        return m_globalSymbol;
+    }
+
+    virtual SymbolPtr findByRva( ULONG rva, ULONG symTag = SymTagNull, LONG* displacement = NULL );
+
+    virtual void getSourceLine( ULONG64 offset, std::string &fileName, ULONG &lineNo, LONG &displacement );
+
+    virtual std::string getSymbolFileName() {
+        return m_symbolFileName;
+    }
+
+private:
+
+    ULONG findRvaByName( const std::string &name );
+
+    DiaSymbolPtr    m_globalScope;
+    SymbolPtr       m_globalSymbol;
+    DiaSessionPtr   m_session;
+    std::string     m_symbolFileName;
+
+};
+
+////////////////////////////////////////////////////////////////////////////
+
+} // end pykd namespace
+
diff --git a/pykd/dia/diawrapper.cpp b/pykd/dia/diasymbol.cpp
similarity index 65%
rename from pykd/dia/diawrapper.cpp
rename to pykd/dia/diasymbol.cpp
index 8fa456f..bd8c0d0 100644
--- a/pykd/dia/diawrapper.cpp
+++ b/pykd/dia/diasymbol.cpp
@@ -1,152 +1,12 @@
 
 #include "stdafx.h"
+
 #include "dbghelp.h"
-#include "dia/diawrapper.h"
+#include "dia/diasymbol.h"
 #include "win/utils.h"
 
 namespace pykd {
 
-///////////////////////////////////////////////////////////////////////////////
-
-static const struct DiaRegToRegRelativeAmd64 : DiaRegToRegRelativeBase
-{
-    typedef std::map<ULONG, ULONG> Base;
-    DiaRegToRegRelativeAmd64();
-} g_DiaRegToRegRelativeAmd64;
-
-DiaRegToRegRelativeAmd64::DiaRegToRegRelativeAmd64()
-{
-    (*this)[CV_AMD64_RIP] = rriInstructionPointer;
-    (*this)[CV_AMD64_RBP] = rriStackFrame;
-    (*this)[CV_AMD64_RSP] = rriStackPointer;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-
-static const struct DiaRegToRegRelativeI386 : DiaRegToRegRelativeBase
-{
-    typedef std::map<ULONG, ULONG> Base;
-    DiaRegToRegRelativeI386();
-} g_DiaRegToRegRelativeI386;
-
-DiaRegToRegRelativeI386::DiaRegToRegRelativeI386()
-{
-    (*this)[CV_REG_EIP] = rriInstructionPointer;
-    (*this)[CV_REG_EBP] = rriStackFrame;
-    (*this)[CV_REG_ESP] = rriStackPointer;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-
-const std::string DiaException::descPrefix("pyDia: ");
-
-std::string DiaException::makeFullDesc(const std::string &desc, HRESULT hres, IDiaSymbol *symbol /*= NULL*/)
-{
-    std::stringstream sstream;
-    sstream << descPrefix << desc << " failed" << std::endl;
-    if (symbol)
-    {
-        BSTR bstrName = NULL;
-        HRESULT locRes = symbol->get_undecoratedName(&bstrName);
-        if (S_OK == locRes && bstrName)
-        {
-            autoBstr freeBstr(bstrName);
-            sstream << "Symbol name: \"" << autoBstr::asStr(bstrName) << "\"";
-        }
-        else
-        {
-            locRes = symbol->get_name(&bstrName);
-            if (S_OK == locRes && bstrName)
-            {
-                autoBstr freeBstr(bstrName);
-                sstream << "Symbol name: " << autoBstr::asStr(bstrName);
-            }
-            else
-            {
-                sstream << "Symbol: ";
-            }
-        }
-
-        DWORD dwValue;
-        locRes = symbol->get_relativeVirtualAddress(&dwValue);
-        if (S_OK == locRes)
-        {
-            sstream << ", RVA= 0x" << std::hex << dwValue;
-        }
-
-        locRes = symbol->get_symTag(&dwValue);
-        if (S_OK == locRes)
-        {
-            sstream << ", tag= " << std::dec << dwValue;
-        }
-
-        locRes = symbol->get_locationType(&dwValue);
-        if (S_OK == locRes)
-        {
-            sstream << ", location: " << std::dec << dwValue;
-        }
-
-        sstream << std::endl;
-    }
-    sstream << "Return value is 0x" << std::hex << hres;
-
-    switch (hres)
-    {
-#define _CASE_DIA_ERROR(x)  case E_PDB_##x: sstream << ": E_PDB_" #x << std::endl; break
-
-    _CASE_DIA_ERROR(USAGE);
-    _CASE_DIA_ERROR(OUT_OF_MEMORY);
-    _CASE_DIA_ERROR(FILE_SYSTEM);
-    _CASE_DIA_ERROR(NOT_FOUND);
-    _CASE_DIA_ERROR(INVALID_SIG);
-    _CASE_DIA_ERROR(INVALID_AGE);
-    _CASE_DIA_ERROR(PRECOMP_REQUIRED);
-    _CASE_DIA_ERROR(OUT_OF_TI);
-    _CASE_DIA_ERROR(NOT_IMPLEMENTED);
-    _CASE_DIA_ERROR(V1_PDB);
-    _CASE_DIA_ERROR(FORMAT);
-    _CASE_DIA_ERROR(LIMIT);
-    _CASE_DIA_ERROR(CORRUPT);
-    _CASE_DIA_ERROR(TI16);
-    _CASE_DIA_ERROR(ACCESS_DENIED);
-    _CASE_DIA_ERROR(ILLEGAL_TYPE_EDIT);
-    _CASE_DIA_ERROR(INVALID_EXECUTABLE);
-    _CASE_DIA_ERROR(DBG_NOT_FOUND);
-    _CASE_DIA_ERROR(NO_DEBUG_INFO);
-    _CASE_DIA_ERROR(INVALID_EXE_TIMESTAMP);
-    _CASE_DIA_ERROR(RESERVED);
-    _CASE_DIA_ERROR(DEBUG_INFO_NOT_IN_PDB);
-    _CASE_DIA_ERROR(SYMSRV_BAD_CACHE_PATH);
-    _CASE_DIA_ERROR(SYMSRV_CACHE_FULL);
-
-#undef _CASE_DIA_ERROR
-    default:
-        {
-            PCHAR errMessage = NULL;
-            FormatMessageA(
-                FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
-                NULL,
-                hres,
-                MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
-                (PCHAR)&errMessage,
-                0,
-                NULL);
-            if (errMessage)
-            {
-                sstream << ": " << std::endl;
-                sstream << errMessage;
-                LocalFree(errMessage);
-            }
-            else
-            {
-                sstream << std::endl;
-            }
-        }
-    }
-
-    return sstream.str();
-}
-
 ////////////////////////////////////////////////////////////////////////////////
 
 #define callSymbol(method) \
@@ -415,22 +275,22 @@ ULONG DiaSymbol::getRegRealativeId()
     switch (m_machineType)
     {
     case IMAGE_FILE_MACHINE_AMD64:
-        return getRegRealativeIdImpl(g_DiaRegToRegRelativeAmd64);
+        return getRegRealativeIdImpl(regToRegRelativeAmd64);
     case IMAGE_FILE_MACHINE_I386:
-        return getRegRealativeIdImpl(g_DiaRegToRegRelativeI386);
+        return getRegRealativeIdImpl(regToRegRelativeI386);
     }
     throw DiaException("Unsupported machine type");
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 
-ULONG DiaSymbol::getRegRealativeIdImpl(const DiaRegToRegRelativeBase &DiaRegToRegRelative)
+ULONG DiaSymbol::getRegRealativeIdImpl(const DiaRegToRegRelativeBase &regToRegRelative)
 {
     DiaRegToRegRelativeBase::const_iterator it = 
-        DiaRegToRegRelative.find(callSymbol(get_registerId));
+        regToRegRelative.find(callSymbol(get_registerId));
 
-    if (it == DiaRegToRegRelative.end())
-        throw DiaException("Cannot convert DAI register ID to relative register ID");
+    if (it == regToRegRelative.end())
+        throw DiaException("Cannot convert DIA register ID to relative register ID");
 
     return it->second;
 }
@@ -678,70 +538,5 @@ bool DiaSymbol::isVirtualBaseClass()
 
 //////////////////////////////////////////////////////////////////////////////
 
-SymbolPtr DiaSession::findByRva( ULONG rva, ULONG symTag, LONG* pdisplacement )
-{
-    DiaSymbolPtr child;
-    LONG displacement;
-
-    HRESULT hres = 
-        m_session->findSymbolByRVAEx(
-            rva,
-            static_cast<enum ::SymTagEnum>(symTag),
-            &child,
-            &displacement);
-
-    if (S_OK != hres)
-        throw DiaException("Call IDiaSession::findSymbolByRVAEx", hres);
-    if (!child)
-        throw DiaException("Call IDiaSession::findSymbolByRVAEx", E_UNEXPECTED);
-    if ( !pdisplacement && displacement)
-        throw DiaException("Call IDiaSession::findSymbolByRVAEx failed to find suymbol" );
-
-    if (pdisplacement)
-        *pdisplacement = displacement;
-
-    return SymbolPtr( new DiaSymbol(child, m_globalSymbol->getMachineType() ) );
-}
-
-///////////////////////////////////////////////////////////////////////////////
-
-void DiaSession::getSourceLine( ULONG64 offset, std::string &fileName, ULONG &lineNo, LONG &displacement )
-{
-    DiaEnumLineNumbersPtr  lines;
-
-    HRESULT hres = m_session->findLinesByVA( offset, 1, &lines );
-    if (S_OK != hres)
-        throw DiaException("failed to find source line");
-
-    DiaLineNumberPtr  sourceLine;
-    hres = lines->Item( 0, &sourceLine );
-    if (S_OK != hres)
-        throw DiaException("failed to find source line");
-
-    DiaSourceFilePtr  sourceFile;
-    hres = sourceLine->get_sourceFile( &sourceFile );
-    if (S_OK != hres)
-        throw DiaException("failed to find source line");
-    
-    autoBstr  fileNameBstr;
-    hres = sourceFile->get_fileName ( &fileNameBstr );
-    if (S_OK != hres)
-        throw DiaException("failed to find source line");
-    fileName = fileNameBstr.asStr();
-
-    hres = sourceLine->get_lineNumber( &lineNo );
-    if (S_OK != hres)
-        throw DiaException("failed to find source line");
-
-    ULONGLONG  va;
-    hres = sourceLine->get_virtualAddress ( &va );
-    if (S_OK != hres)
-        throw DiaException("failed to find source line");
-
-    displacement = (LONG)( (LONGLONG)offset - (LONGLONG)va );
-}
-
-///////////////////////////////////////////////////////////////////////////////
-
-}; // pykd nemaspace end
+}; // pykd namespace end
 
diff --git a/pykd/dia/diasymbol.h b/pykd/dia/diasymbol.h
new file mode 100644
index 0000000..b1708fc
--- /dev/null
+++ b/pykd/dia/diasymbol.h
@@ -0,0 +1,139 @@
+
+#pragma once
+
+#include "dia\diadecls.h"
+
+namespace pykd {
+
+//////////////////////////////////////////////////////////////////////////////
+
+typedef std::map<ULONG, ULONG> DiaRegToRegRelativeBase;
+
+//////////////////////////////////////////////////////////////////////////////
+
+class DiaSymbol : public Symbol {
+public:
+    DiaSymbol( DiaSymbolPtr &_symbol, DWORD machineType );
+
+    static SymbolPtr fromGlobalScope( IDiaSymbol *_symbol );
+
+    SymbolPtr getChildByName(const std::string &_name );
+
+    ULONG getRva();
+
+    SymbolPtrList findChildren(
+        ULONG symTag,
+        const std::string &name = "",
+        bool caseSensitive = FALSE
+    );
+
+    ULONGLONG getSize();
+
+    std::string getName();
+
+    SymbolPtr getType();
+
+    SymbolPtr getIndexType();
+
+    ULONG getSymTag();
+
+    ULONGLONG getVa();
+
+    ULONG getLocType();
+
+    LONG getOffset();
+
+    ULONG getCount();
+
+    void getValue( BaseTypeVariant &vtValue );
+
+    bool isBasicType();
+
+    bool isIndirectVirtualBaseClass();
+
+    bool isVirtualBaseClass();
+
+    ULONG getBaseType();
+
+    ULONG getBitPosition();
+
+    ULONG getIndexId();
+
+    ULONG getUdtKind();
+
+    ULONG getDataKind();
+
+    //ULONG getRegisterId();
+    virtual ULONG getRegRealativeId() override;
+
+    ULONG getMachineType() {
+        return m_machineType;
+    }
+
+    //SymbolPtr getChildByName(const std::string &_name);
+
+    ULONG getChildCount( ULONG symTag );
+
+    ULONG getChildCount() {
+        return getChildCount(SymTagNull);
+    }
+
+    SymbolPtr getChildByIndex(ULONG symTag, ULONG _index );
+
+    SymbolPtr getChildByIndex(ULONG _index ) {
+        return getChildByIndex( SymTagNull, _index );
+    }
+    
+    bool isConstant();
+
+    //std::string print();
+
+    //bool eq(Symbol &rhs);
+
+    int getVirtualBasePointerOffset();
+
+    ULONG getVirtualBaseDispIndex();
+
+    ULONG getVirtualBaseDispSize();
+
+    //ULONG getSection();
+
+    void setLoadAddress( ULONGLONG baseAddress );
+
+public:
+    typedef std::pair<ULONG, const char *> ValueNameEntry;
+
+    static const ValueNameEntry basicTypeName[];
+    static const size_t cntBasicTypeName;
+
+    static std::string getBasicTypeName( ULONG basicType );
+
+protected:
+    static const DiaRegToRegRelativeBase &regToRegRelativeAmd64;
+    static const DiaRegToRegRelativeBase &regToRegRelativeI386;
+    ULONG getRegRealativeIdImpl(const DiaRegToRegRelativeBase &DiaRegToRegRelative);
+
+    template <typename TRet>
+    TRet callSymbolT(
+        HRESULT(STDMETHODCALLTYPE IDiaSymbol::*method)(TRet *),
+        const char *methodName
+    )
+    {
+        TRet retValue;
+        HRESULT hres = (m_symbol->*method)(&retValue);
+        if (S_OK != hres)
+            throw DiaException(std::string("Call IDiaSymbol::") + methodName, hres, m_symbol);
+
+        return retValue;
+    }
+
+    DiaSymbolPtr m_symbol;
+
+    DWORD m_machineType;
+};
+
+
+////////////////////////////////////////////////////////////////////////////
+
+} // end pykd namespace
+
diff --git a/pykd/dia/diawrapper.h b/pykd/dia/diawrapper.h
deleted file mode 100644
index 5de817e..0000000
--- a/pykd/dia/diawrapper.h
+++ /dev/null
@@ -1,258 +0,0 @@
-
-#pragma once
-
-#include "symengine.h"
-#include "dbgexcept.h"
-
-#include <dia2.h>
-
-namespace pykd {
-
-//////////////////////////////////////////////////////////////////////////////
-
-typedef CComPtr< IDiaSymbol > DiaSymbolPtr;
-typedef CComPtr< IDiaEnumSymbols > DiaEnumSymbolsPtr;
-typedef CComPtr< IDiaDataSource > DiaDataSourcePtr;
-typedef CComPtr< IDiaSession > DiaSessionPtr;
-typedef CComPtr< IDiaEnumSymbolsByAddr > DiaEnumSymbolsByAddrPtr;
-typedef CComPtr< IDiaEnumLineNumbers > DiaEnumLineNumbersPtr;
-typedef CComPtr< IDiaLineNumber> DiaLineNumberPtr;
-typedef CComPtr< IDiaSourceFile > DiaSourceFilePtr;
-
-typedef std::map<ULONG, ULONG> DiaRegToRegRelativeBase;
-
-//////////////////////////////////////////////////////////////////////////////
-
-class DiaException : public SymbolException {
-public:
-    DiaException(const std::string &desc, HRESULT hres, IDiaSymbol *symbol = NULL)
-        : SymbolException( makeFullDesc(desc, hres, symbol) )
-        , m_hres(hres)
-    {
-    }
-
-    DiaException(const std::string &desc)
-        : SymbolException(descPrefix + desc)
-        , m_hres(S_FALSE)
-    {
-    }
-
-    HRESULT getRes() const {
-        return m_hres;
-    }
-private:
-
-    static const std::string descPrefix;
-
-    static std::string makeFullDesc(const std::string &desc, HRESULT hres, IDiaSymbol *symbol = NULL);
-
-    HRESULT m_hres;
-};
-
-////////////////////////////////////////////////////////////////////////////
-
-class DiaSymbol : public Symbol {
-public:
-    DiaSymbol( DiaSymbolPtr &_symbol, DWORD machineType );
-
-    static SymbolPtr fromGlobalScope( IDiaSymbol *_symbol );
-
-    SymbolPtr getChildByName(const std::string &_name );
-
-    ULONG getRva();
-
-    SymbolPtrList findChildren(
-        ULONG symTag,
-        const std::string &name = "",
-        bool caseSensitive = FALSE
-    );
-
-    ULONGLONG getSize();
-
-    std::string getName();
-
-    SymbolPtr getType();
-
-    SymbolPtr getIndexType();
-
-    ULONG getSymTag();
-
-    ULONGLONG getVa();
-
-    ULONG getLocType();
-
-    LONG getOffset();
-
-    ULONG getCount();
-
-    void getValue( BaseTypeVariant &vtValue );
-
-    bool isBasicType();
-
-    bool isIndirectVirtualBaseClass();
-
-    bool isVirtualBaseClass();
-
-    ULONG getBaseType();
-
-    ULONG getBitPosition();
-
-    ULONG getIndexId();
-
-    ULONG getUdtKind();
-
-    ULONG getDataKind();
-
-    //ULONG getRegisterId();
-    virtual ULONG getRegRealativeId() override;
-
-    ULONG getMachineType() {
-        return m_machineType;
-    }
-
-    //SymbolPtr getChildByName(const std::string &_name);
-
-    ULONG getChildCount( ULONG symTag );
-
-    ULONG getChildCount() {
-        return getChildCount(SymTagNull);
-    }
-
-    SymbolPtr getChildByIndex(ULONG symTag, ULONG _index );
-
-    SymbolPtr getChildByIndex(ULONG _index ) {
-        return getChildByIndex( SymTagNull, _index );
-    }
-    
-    bool isConstant();
-
-    //std::string print();
-
-    //bool eq(Symbol &rhs);
-
-    int getVirtualBasePointerOffset();
-
-    ULONG getVirtualBaseDispIndex();
-
-    ULONG getVirtualBaseDispSize();
-
-    //ULONG getSection();
-
-    void setLoadAddress( ULONGLONG baseAddress );
-
-public:
-    typedef std::pair<ULONG, const char *> ValueNameEntry;
-
-    //static const ValueNameEntry dataKindName[DataIsConstant + 1];
-
-    //static const ValueNameEntry symTagName[SymTagMax];
-
-    //static const ValueNameEntry locTypeName[LocTypeMax];
-
-    static const ValueNameEntry basicTypeName[];
-    static const size_t cntBasicTypeName;
-
-    //static const ValueNameEntry udtKindName[];
-    //static const size_t cntUdtKindName;
-
-    //static const ValueNameEntry i386RegName[];
-    //static const size_t cntI386RegName;
-
-    //static const ValueNameEntry amd64RegName[];
-    //static const size_t cntAmd64RegName;
-
-    static std::string getBasicTypeName( ULONG basicType );
-
-protected:
-
-    //// Check symbols loop
-    //class checkSymLoop
-    //{
-    //public:
-    //    checkSymLoop(checkSymLoop *prev)
-    //        : m_symSetPtr( prev ? prev->m_symSetPtr : symSetPtr(new symSet) )
-    //    {
-    //    }
-
-    //    bool check(IDiaSymbol *_symbol)
-    //    {
-    //        DWORD symIndexId = 0;
-    //        _symbol->get_symIndexId(&symIndexId);
-    //        return !m_symSetPtr->insert(symIndexId).second;
-    //    }
-
-    //private:
-    //    typedef std::set<DWORD> symSet;
-    //    typedef boost::shared_ptr<symSet> symSetPtr;
-    //    symSetPtr m_symSetPtr;
-    //};
-
-    //static std::string printImpl(
-    //    IDiaSymbol *_symbol,
-    //    DWORD machineType,
-    //    ULONG indent = 0,
-    //    checkSymLoop *checkLoopPrev = NULL,
-    //    const char *prefix = NULL
-    //);
-
-    ULONG getRegRealativeIdImpl(const DiaRegToRegRelativeBase &DiaRegToRegRelative);
-
-    template <typename TRet>
-    TRet callSymbolT(
-        HRESULT(STDMETHODCALLTYPE IDiaSymbol::*method)(TRet *),
-        const char *methodName
-    )
-    {
-        TRet retValue;
-        HRESULT hres = (m_symbol->*method)(&retValue);
-        if (S_OK != hres)
-            throw DiaException(std::string("Call IDiaSymbol::") + methodName, hres, m_symbol);
-
-        return retValue;
-    }
-
-    DiaSymbolPtr m_symbol;
-
-    DWORD m_machineType;
-};
-
-////////////////////////////////////////////////////////////////////////////
-
-class DiaSession : public SymbolSession
-{
-public:
-
-    DiaSession( IDiaSession* session, IDiaSymbol *globalScope, const std::string symbolFile ) :
-        m_globalScope( globalScope ),
-        m_globalSymbol( DiaSymbol::fromGlobalScope( globalScope ) ),
-        m_session( session ),
-        m_symbolFileName( symbolFile )
-        {}
-
-    virtual SymbolPtr getSymbolScope() {
-        return m_globalSymbol;
-    }
-
-    virtual SymbolPtr findByRva( ULONG rva, ULONG symTag = SymTagNull, LONG* displacement = NULL );
-
-    virtual void getSourceLine( ULONG64 offset, std::string &fileName, ULONG &lineNo, LONG &displacement );
-
-    virtual std::string getSymbolFileName() {
-        return m_symbolFileName;
-    }
-
-private:
-
-    ULONG findRvaByName( const std::string &name );
-
-    DiaSymbolPtr    m_globalScope;
-    SymbolPtr       m_globalSymbol;
-    DiaSessionPtr   m_session;
-    std::string     m_symbolFileName;
-
-};
-
-////////////////////////////////////////////////////////////////////////////
-
-} // end pykd namespace
-
diff --git a/pykd/pykd_2008.vcproj b/pykd/pykd_2008.vcproj
index a9afee0..db50989 100644
--- a/pykd/pykd_2008.vcproj
+++ b/pykd/pykd_2008.vcproj
@@ -625,16 +625,36 @@
 				RelativePath=".\dia\diadata.cpp"
 				>
 			</File>
+			<File
+				RelativePath=".\dia\diadecls.h"
+				>
+			</File>
+			<File
+				RelativePath=".\dia\diaexcept.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\dia\diaexcept.h"
+				>
+			</File>
 			<File
 				RelativePath=".\dia\diaload.cpp"
 				>
 			</File>
 			<File
-				RelativePath=".\dia\diawrapper.cpp"
+				RelativePath=".\dia\diasession.cpp"
 				>
 			</File>
 			<File
-				RelativePath=".\dia\diawrapper.h"
+				RelativePath=".\dia\diasession.h"
+				>
+			</File>
+			<File
+				RelativePath=".\dia\diasymbol.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\dia\diasymbol.h"
 				>
 			</File>
 			<File