diff --git a/share/qtcreator/debugger/lldbbridge.py b/share/qtcreator/debugger/lldbbridge.py
index 6a381f9f81a327ed168e5f9e6844024cfd6162ca..24fada5172e6d4a4483ab7bd0bff5ca6fb38c0c0 100644
--- a/share/qtcreator/debugger/lldbbridge.py
+++ b/share/qtcreator/debugger/lldbbridge.py
@@ -286,7 +286,6 @@ class Dumper(DumperBase):
         self.isShuttingDown_ = False
         self.isInterrupting_ = False
         self.dummyValue = None
-        self.types_ = {}
         self.breakpointsToCheck = set([])
 
     def enterSubItem(self, item):
@@ -612,26 +611,39 @@ class Dumper(DumperBase):
 
     def lookupType(self, name):
         #self.warn("LOOKUP TYPE NAME: %s" % name)
-        if name.endswith('*'):
-            typeobj = self.lookupType(name[:-1].strip())
-            return typeobj.GetPointerType() if type.IsValid() else None
         typeobj = self.target.FindFirstType(name)
-        #self.warn("LOOKUP RESULT: %s" % typeobj.name)
-        #self.warn("LOOKUP VALID: %s" % typeobj.IsValid())
         if typeobj.IsValid():
             return typeobj
-        try:
-            if len(self.types_) == 0:
-                for i in xrange(self.target.GetNumModules()):
-                    module = self.target.GetModuleAtIndex(i)
-                    # SBModule.GetType is new somewhere after early 300.x
-                    # So this may fail.
-                    for t in module.GetTypes():
-                        n = self.canonicalTypeName(t.GetName())
-                        self.types_[n] = t
-            return self.types_.get(self.canonicalTypeName(name))
-        except:
-            pass
+        typeobj = self.target.FindFirstType(name + '*')
+        if typeobj.IsValid():
+            return typeob.GetPointeeType()
+        typeobj = self.target.FindFirstType(name + '&')
+        if typeobj.IsValid():
+            return typeob.GetReferencedType()
+        if name.endswith('*'):
+            typeobj = self.target.FindFirstType(name[:-1].strip())
+            if typeobj.IsValid():
+                return typeobj.GetPointerType()
+        #self.warn("LOOKUP RESULT: %s" % typeobj.name)
+        #self.warn("LOOKUP VALID: %s" % typeobj.IsValid())
+        needle = self.canonicalTypeName(name)
+        #self.warn("NEEDLE: %s " % needle)
+        for i in xrange(self.target.GetNumModules()):
+            module = self.target.GetModuleAtIndex(i)
+            # SBModule.GetType is new somewhere after early 300.x
+            # So this may fail.
+            for t in module.GetTypes():
+                n = self.canonicalTypeName(t.GetName())
+                if n == needle:
+                    #self.warn("FOUND TYPE DIRECT 2: %s " % t)
+                    return t
+                if n == needle + '*':
+                    #self.warn("FOUND TYPE BY POINTER 2: %s " % t.GetPointeeType())
+                    return t.GetPointeeType()
+                if n == needle + '&':
+                    #self.warn("FOUND TYPE BY REFERENCE 2: %s " % t)
+                    return t.GetDereferencedType()
+        #self.warn("NOT FOUND: %s " % needle)
         return None
 
     def setupInferior(self, args):
diff --git a/share/qtcreator/debugger/stdtypes.py b/share/qtcreator/debugger/stdtypes.py
index 362e9caa55e45d8d3f59aa400f5f458725411615..e7ed0ff2c859b5a7371d81642d4bc89825696358 100644
--- a/share/qtcreator/debugger/stdtypes.py
+++ b/share/qtcreator/debugger/stdtypes.py
@@ -281,15 +281,15 @@ def qdump__std__multimap(d, value):
     return qdump__std__map(d, value)
 
 def stdTreeIteratorHelper(d, value):
-    node = value["_M_node"].dereference()
+    node = value["_M_node"]
     d.putNumChild(1)
     d.putEmptyValue()
     if d.isExpanded():
-        nodeTypeName = str(value.type).replace("_Rb_tree_iterator", "_Rb_tree_node", 1)
-        nodeTypeName = nodeTypeName.replace("_Rb_tree_const_iterator", "_Rb_tree_node", 1)
-        nodeType = d.lookupType(nodeTypeName)
-        data = node.cast(nodeType)["_M_value_field"]
         with Children(d):
+            nodeTypeName = str(value.type).replace("_Rb_tree_iterator", "_Rb_tree_node", 1)
+            nodeTypeName = nodeTypeName.replace("_Rb_tree_const_iterator", "_Rb_tree_node", 1)
+            nodeType = d.lookupType(nodeTypeName + '*')
+            data = node.cast(nodeType).dereference()["_M_value_field"]
             first = d.childWithName(data, "first")
             if first:
                 d.putSubItem("first", first)