diff --git a/share/qtcreator/gdbmacros/dumper.py b/share/qtcreator/gdbmacros/dumper.py
index ea771f839ac6a896aa9f9283678ff6b0684af642..e7d8853e4efb32f52c954d05ed05cc7625bee2ad 100644
--- a/share/qtcreator/gdbmacros/dumper.py
+++ b/share/qtcreator/gdbmacros/dumper.py
@@ -1,7 +1,4 @@
 from __future__ import with_statement
-#Note: Keep name-type-value-numchild-extra order
-
-#return
 
 import sys
 import gdb
@@ -9,6 +6,7 @@ import base64
 import __builtin__
 import os
 
+
 # Fails on Windows.
 try:
     import curses.ascii
@@ -128,6 +126,9 @@ def lookupType(typestring):
         typeCache[typestring] = type
     return type
 
+def cleanType(type):
+    return lookupType(str(type))
+
 def cleanAddress(addr):
     if addr is None:
         return "<no address>"
@@ -240,9 +241,9 @@ class SubItem:
             if len(type) > 0 and type != self.d.currentChildType:
                 self.d.put('type="%s",' % type) # str(type.unqualified()) ?
             if not self.d.currentValueEncoding is None:
-                self.d.putField("valueencoded", self.d.currentValueEncoding)
+                self.d.put('valueencoded="%d",' % self.d.currentValueEncoding)
             if not self.d.currentValue is None:
-                self.d.putField("value", self.d.currentValue)
+                self.d.put('value="%s",' % self.d.currentValue)
         except:
             pass
         self.d.put('},')
@@ -423,6 +424,8 @@ def listOfLocals(varList):
     hasBlock = 'block' in __builtin__.dir(frame)
 
     items = []
+    #warn("HAS BLOCK: %s" % hasBlock);
+    #warn("IS GOOD GDB: %s" % isGoodGdb());
     if hasBlock and isGoodGdb():
         #warn("IS GOOD: %s " % varList)
         try:
@@ -783,8 +786,8 @@ def encodeString(value):
         p += 1
     return s
 
-def stripTypedefs(typeobj):
-    type = typeobj
+def stripTypedefs(type):
+    type = type.unqualified()
     while type.code == gdb.TYPE_CODE_TYPEDEF:
         type = type.strip_typedefs().unqualified()
     return type
@@ -820,6 +823,50 @@ class Item:
         self.name = name
 
 
+#######################################################################
+#
+# SetupCommand
+#
+#######################################################################
+
+# This is a mapping from 'type name' to 'display alternatives'.
+
+qqDumpers = {}
+qqFormats = {}
+
+
+class SetupCommand(gdb.Command):
+    """Setup Creator Pretty Printing"""
+
+    def __init__(self):
+        super(SetupCommand, self).__init__("bbsetup", gdb.COMMAND_OBSCURE)
+
+    def invoke(self, args, from_tty):
+        module = sys.modules[__name__]
+        for key, value in module.__dict__.items():
+            if key.startswith("qdump__"):
+                name = key[7:]
+                qqDumpers[name] = value
+                qqFormats[name] = qqFormats.get(name, "");
+            elif key.startswith("qform__"):
+                name = key[7:]
+                formats = ""
+                try:
+                    formats = value()
+                except:
+                    pass
+                qqFormats[name] = formats
+        result = "dumpers=["
+        # Too early: ns = qtNamespace()
+        for key, value in qqFormats.items():
+            result += '{type="%s",formats="%s"},' % (key, value)
+        result += ']'
+        #result += '],namespace="%s"' % ns
+        print(result)
+
+SetupCommand()
+
+
 #######################################################################
 #
 # FrameCommand
@@ -827,7 +874,7 @@ class Item:
 #######################################################################
 
 class FrameCommand(gdb.Command):
-    """Do fancy stuff. Usage bb --verbose expandedINames"""
+    """Do fancy stuff."""
 
     def __init__(self):
         super(FrameCommand, self).__init__("bb", gdb.COMMAND_OBSCURE)
@@ -1109,15 +1156,16 @@ class Dumper:
     def childRange(self):
         return xrange(qmin(self.currentMaxNumChilds, self.currentNumChilds))
 
-    # convenience
+    # Convenience function.
     def putItemCount(self, count):
-        self.put('value="<%s items>",' % count)
+        # This needs to override the default value, so don't use 'put' directly.
+        self.putValue('<%s items>' % count)
 
     def putEllipsis(self):
         self.put('{name="<incomplete>",value="",type="",numchild="0"},')
 
     def putType(self, type, priority = 0):
-        # higher priority values override lower ones 
+        # Higher priority values override lower ones.
         if priority >= self.currentTypePriority:
             self.currentType = type
             self.currentTypePriority = priority
@@ -1131,7 +1179,7 @@ class Dumper:
             self.put('numchild="%s",' % numchild)
 
     def putValue(self, value, encoding = None, priority = 0):
-        # higher priority values override lower ones 
+        # Higher priority values override lower ones.
         if priority >= self.currentValuePriority:
             self.currentValue = value
             self.currentValuePriority = priority
@@ -1267,9 +1315,6 @@ class Dumper:
                 value = item.value
                 type = value.type
 
-        if type.code == gdb.TYPE_CODE_TYPEDEF:
-            type = type.target()
-
         typedefStrippedType = stripTypedefs(type);
         nsStrippedType = self.stripNamespaceFromType(
             typedefStrippedType).replace("::", "__")
@@ -1423,8 +1468,8 @@ class Dumper:
                     charptr = lookupType("unsigned char").pointer()
                     addr1 = (baseptr+1).cast(charptr)
                     addr0 = baseptr.cast(charptr)
-                    self.putField("addrbase" % cleanAddress(addr0))
-                    self.putField("addrstep" % (addr1 - addr0))
+                    self.put('addrbase="%s",' % cleanAddress(addr0))
+                    self.put('addrstep="%s",' % (addr1 - addr0))
 
                 innerType = None
                 if len(fields) == 1 and fields[0].name is None:
@@ -1468,7 +1513,7 @@ class Dumper:
                         item.iname, "@%d" % baseNumber, field.name)
                     baseNumber += 1
                     with SubItem(self):
-                        self.putField("iname", child.iname)
+                        self.put('iname="%s",' % child.iname)
                         self.putItemHelper(child)
                 elif len(field.name) == 0:
                     # Anonymous union. We need a dummy name to distinguish