diff --git a/pykd/typeinfo.cpp b/pykd/typeinfo.cpp
index 6669385..fd887ed 100644
--- a/pykd/typeinfo.cpp
+++ b/pykd/typeinfo.cpp
@@ -218,14 +218,33 @@ BitFieldTypeInfo::BitFieldTypeInfo(  pyDia::SymbolPtr &symbol )
 
 PointerTypeInfo::PointerTypeInfo( pyDia::SymbolPtr &symbol  ) 
 {
+    pyDia::SymbolPtr pointTo = symbol->getType();
     try
     {
-        m_derefType = TypeInfo::getTypeInfo( symbol->getType() );
+        m_derefType = TypeInfo::getTypeInfo( pointTo );
     }
     catch (const SymbolException &)
     {
         m_derefType.swap( TypeInfoPtr() );
     }
+    if (!derefPossible())
+    {
+        // special cases:
+        const ULONG symTag = pointTo->getSymTag();
+        switch (symTag)
+        {
+        //  * pointer to function
+        case SymTagFunctionType:
+            m_derefName = "<function>";
+            break;
+
+        case SymTagBaseType:
+            //  * pointer to Void
+            if (btVoid == static_cast<BasicType>(pointTo->getBaseType()))
+                m_derefName = "Void";
+            break;
+        }
+    }
     m_size = (ULONG)symbol->getSize();
 }
 
@@ -295,6 +314,7 @@ std::string TypeInfo::getComplexName()
     std::string       name;
     TypeInfo          *typeInfo = this;
 
+    std::string tiName;
     do {
 
         if ( typeInfo->isArray() )
@@ -326,16 +346,24 @@ std::string TypeInfo::getComplexName()
         {
             name.insert( 0, 1, '*' );
 
-            typeInfo = dynamic_cast<PointerTypeInfo*>(typeInfo)->getDerefType().get();
+            PointerTypeInfo *ptrTypeInfo = dynamic_cast<PointerTypeInfo*>(typeInfo);
+            if (!ptrTypeInfo->derefPossible())
+            {
+                tiName = ptrTypeInfo->getDerefName();
+                break;
+            }
+
+            typeInfo = ptrTypeInfo->getDerefType().get();
 
             continue;
         }
 
+        tiName = typeInfo->getName();
         break;
 
     } while ( true );
 
-    name.insert( 0, typeInfo->getName() );
+    name.insert( 0, tiName );
 
     return name;
 }
diff --git a/pykd/typeinfo.h b/pykd/typeinfo.h
index a52f1b1..2493c9d 100644
--- a/pykd/typeinfo.h
+++ b/pykd/typeinfo.h
@@ -285,9 +285,7 @@ public:
     }
 
     virtual TypeInfoPtr deref() {
-        if (!m_derefType)
-            throw TypeException("<ptr>", "this pointer can not be dereferenced");
-        return m_derefType;
+        return getDerefType();
     }
 
     TypeInfoPtr getDerefType() {
@@ -296,11 +294,21 @@ public:
         return m_derefType;
     }
 
+    bool derefPossible() const {
+        return m_derefType;
+    }
+
+    const std::string getDerefName() const {
+        if (m_derefName.empty())
+            throw TypeException("<ptr>", "this pointer can not be dereferenced");
+        return m_derefName;
+    }
+
 private:
 
     TypeInfoPtr     m_derefType;
-
     ULONG           m_size;
+    std::string     m_derefName;
 };
 
 ///////////////////////////////////////////////////////////////////////////////////
diff --git a/test/scripts/typeinfo.py b/test/scripts/typeinfo.py
index 10bcada..c74f741 100644
--- a/test/scripts/typeinfo.py
+++ b/test/scripts/typeinfo.py
@@ -117,6 +117,8 @@ class TypeInfoTest( unittest.TestCase ):
         self.assertEqual( "listStruct1*[2]", target.module.type( "g_arrOfListStruct1" ).name())
         self.assertEqual( "Void*",  target.module.type( "g_voidPtr" ).name() )
         self.assertEqual( "Void*[3]", target.module.type( "g_arrOfVoidPtr" ).name())
+        self.assertEqual( "<function>*", target.module.type( "g_ptrToFunction" ).name())
+        self.assertEqual( "<function>*[4]", target.module.type( "g_arrOfPtrToFunc" ).name())
 
     def testUnion(self):
         ti = target.module.type("unionTest")
diff --git a/test/targetapp/targetapp.cpp b/test/targetapp/targetapp.cpp
index ff2e59a..fbbb245 100644
--- a/test/targetapp/targetapp.cpp
+++ b/test/targetapp/targetapp.cpp
@@ -170,6 +170,12 @@ void *g_arrOfVoidPtr[] = {
     g_voidPtr, g_voidPtr, g_voidPtr
 };
 
+// kd> x targetapp!g_arrOfPtrToFunc
+// xxxxxxxx`xxxxxxxx targetapp!g_arrOfPtrToFunc = <function> *[4]
+WNDPROC g_arrOfPtrToFunc[] = {
+    NULL, NULL, NULL, NULL
+};
+
 struct listStruct1 {
     int                     num;
     struct listStruct1     *next;
@@ -310,6 +316,9 @@ void FuncWithName1(int a)
     std::cout << g_unNamedStruct.m_fieldOfUnNamed;
     std::cout << g_structWithNested.m_field;
     std::cout << g_ptrToFunction;
+
+    std::cout << g_ptrToFunction;
+    std::cout << g_arrOfPtrToFunc[1];
 }
 
 ////////////////////////////////////////////////////////////////////////////////