diff --git a/pykd/typeinfo.cpp b/pykd/typeinfo.cpp
index 00ab5e2..c72644e 100644
--- a/pykd/typeinfo.cpp
+++ b/pykd/typeinfo.cpp
@@ -160,7 +160,8 @@ PointerTypeInfo::PointerTypeInfo( pyDia::SymbolPtr &symScope, const std::string
 
 std::string PointerTypeInfo::getName()
 {
-    return m_derefType->getName() + '*';
+    //return m_derefType->getName() + '*';
+    return getComplexName();
 }
 
 /////////////////////////////////////////////////////////////////////////////////////
@@ -190,11 +191,12 @@ ArrayTypeInfo::ArrayTypeInfo( pyDia::SymbolPtr &symScope, const std::string &sym
 
 std::string ArrayTypeInfo::getName()
 {
-    std::stringstream       sstr;
+    //std::stringstream       sstr;
 
-    sstr  << m_derefType->getName() << '[' << m_count << ']';
+    //sstr  << m_derefType->getName() << '[' << m_count << ']';
 
-    return sstr.str();
+    //return sstr.str();
+    return getComplexName();
 }
 
 /////////////////////////////////////////////////////////////////////////////////////
@@ -206,4 +208,56 @@ ULONG ArrayTypeInfo::getSize()
 
 /////////////////////////////////////////////////////////////////////////////////////
 
+std::string TypeInfo::getComplexName()
+{
+    std::string       name;
+    TypeInfo          *typeInfo = this;
+
+    do {
+
+        if ( typeInfo->isArray() )
+        {
+            std::vector<ULONG>  indices;
+
+            do {
+                indices.push_back( typeInfo->getCount() );
+            }
+            while( ( typeInfo = dynamic_cast<ArrayTypeInfo*>(typeInfo)->getDerefType().get() )->isArray() );
+
+            if ( !name.empty() )
+            {
+                name.insert( 0, 1, '(' );    
+                name.insert( name.size(), 1, ')' );
+            }
+
+            std::stringstream       sstr;
+
+            for ( std::vector<ULONG>::iterator  it = indices.begin(); it != indices.end(); ++it )
+                sstr << '[' << *it << ']';
+
+            name += sstr.str();
+
+            continue;
+        }
+        else
+        if ( typeInfo->isPointer() )
+        {
+            name.insert( 0, 1, '*' );
+
+            typeInfo = dynamic_cast<PointerTypeInfo*>(typeInfo)->getDerefType().get();
+
+            continue;
+        }
+
+        break;
+
+    } while ( true );
+
+    name.insert( 0, typeInfo->getName() );
+
+    return name;
+}
+
+/////////////////////////////////////////////////////////////////////////////////////
+
 }; // end namespace pykd
\ No newline at end of file
diff --git a/pykd/typeinfo.h b/pykd/typeinfo.h
index 8a50055..539b0a6 100644
--- a/pykd/typeinfo.h
+++ b/pykd/typeinfo.h
@@ -71,6 +71,8 @@ public:
 
 protected:
 
+    std::string getComplexName();
+
     ULONG   m_offset;
 };
 
@@ -194,6 +196,11 @@ public:
         return true;
     }
 
+    TypeInfoPtr getDerefType() {
+        return m_derefType;
+    }
+
+
 private:
     
     TypeInfoPtr     m_derefType;
@@ -231,6 +238,11 @@ public:
         return m_derefType;
     }
 
+    TypeInfoPtr getDerefType() {
+        return m_derefType;
+    }
+
+
 
 private:
 
@@ -241,66 +253,4 @@ private:
 
 ///////////////////////////////////////////////////////////////////////////////////
 
-
-
-
-
-
-
-
-//
-//class TypeInfo {
-//
-//public:
-//
-//    TypeInfo( pyDia::GlobalScopePtr &diaScope, const std::string &symName );
-//
-//    TypeInfo( pyDia::SymbolPtr  &diaType ) :
-//        m_offset( 0 ),
-//        m_dia( diaType )
-//        {}
-//
-//    TypeInfo
-//    getField( const std::string &fieldName ) {
-//        pyDia::SymbolPtr  field = m_dia->getChildByName( fieldName );
-//        TypeInfo ti( field->getType() );
-//        ti.m_offset = field->getOffset();
-//        return ti;
-//    }
-//
-//    std::string 
-//    getName();
-//
-//    ULONG
-//    getOffset() {
-//        return m_offset;
-//    }
-//
-//    ULONG
-//    getSize() {
-//        return (ULONG)m_dia->getSize();
-//    }  
-//
-//    bool
-//    isBasicType();
-//
-//    bool
-//    isArrayType();
-//
-//    bool
-//    isPointer();
-//
-//    bool
-//    isUserDefined();
-//  
-//private:
-//
-//    pyDia::SymbolPtr    m_dia;
-//
-//    ULONG               m_offset;
-//
-//};
-
-///////////////////////////////////////////////////////////////////////////////////
-
 }; // namespace pykd
diff --git a/test/scripts/pykdtest.py b/test/scripts/pykdtest.py
index 8220b5d..5b78d8d 100644
--- a/test/scripts/pykdtest.py
+++ b/test/scripts/pykdtest.py
@@ -56,9 +56,10 @@ if __name__ == "__main__":
     target.module.reload();
     
     suite = getTestSuite()
+    #suite = getTestSuite( "typeinfo.TypeInfoTest.testCreateBySymbol" )
     #suite = getTestSuite( "intbase.IntBaseTest.testLongConvert" )
     #suite = getTestSuite( "typedvar.TypedVarTest.testStruct" )    
    
     unittest.TextTestRunner(stream=sys.stdout, verbosity=2).run( suite )
 
-    a = raw_input("\npress return\n")
\ No newline at end of file
+    a = raw_input("\npress return\n")
diff --git a/test/scripts/typeinfo.py b/test/scripts/typeinfo.py
index a300bc3..b04dbde 100644
--- a/test/scripts/typeinfo.py
+++ b/test/scripts/typeinfo.py
@@ -15,9 +15,20 @@ class TypeInfoTest( unittest.TestCase ):
 
     def testCreateByName( self ):
         """ creating typeInfo by the type name """
-        #self.assertEqual( "structTest", target.module.type( "structTest" ).name() )
-        #self.assertEqual( "structTest**", target.module.type( "structTest**" ).name() )
+        self.assertEqual( "structTest", target.module.type( "structTest" ).name() )
+        self.assertEqual( "structTest**", target.module.type( "structTest**" ).name() )
         self.assertEqual( "Int4B[2][3]", target.module.type("Int4B[2][3]").name() )
+        
+        
+    def testCreateBySymbol(self):
+        """ creating typeInfo by the symbol name """
+        self.assertEqual( "structTest[2]", target.module.type("g_testArray").name() )
+        self.assertEqual( "Int4B[2][3]", target.module.type("intMatrix").name() )
+        self.assertEqual( "structTest*", target.module.type("g_structTestPtr").name() )
+        self.assertEqual( "structTest**", target.module.type("g_structTestPtrPtr").name() )
+        self.assertEqual( "Char*[2]", target.module.type("strArray").name() )
+        self.assertEqual( "Char*(*)[2]", target.module.type("ptrStrArray").name() )
+        self.assertEqual( "Int4B(*[4])[2][3]", target.module.type("arrIntMatrixPtrs").name() )
 
     def testGetField( self ):
         """ get field of the complex type """
@@ -42,19 +53,6 @@ class TypeInfoTest( unittest.TestCase ):
         self.assertEqual( "Int4B", ti1.m_childField.name() )
         self.assertEqual( "structTest", ti1.m_childField3.name() )
         self.assertEqual( "structTest", target.module.type("g_structTest").name() )
-
-    def testPtrName( self ):
-        self.assertEqual( "structTest*", target.module.type("g_structTestPtr").name() )
-        self.assertEqual( "structTest**", target.module.type("g_structTestPtrPtr").name() )        
-        self.assertEqual( "structTest**", target.module.type("structTest**").name() )        
-
-    def testArrayName( self ):
-        self.assertEqual( "structTest[2]", target.module.type("g_testArray").name() )
-        self.assertEqual( "Int4B[2][3]", target.module.type("intMatrix").name() )
-        self.assertEqual( "Char*[2]", target.module.type("strArray").name() )
-        self.assertEqual( "Int4B[2][3]*",target.module.type("ptrIntMatrix").name() )
-        self.assertEqual( "Char*[2]*", target.module.type("ptrStrArray").name() )   
-        self.assertEqual( "Int4B[2][3]",  target.module.type("Int[2][3]").name() )
         
     def testOffset( self ):
         ti1 = target.module.type( "structTest" )