diff --git a/share/qtcreator/debugger/dumper.py b/share/qtcreator/debugger/dumper.py
index 525e75e9f4223a38c4b4d52c26d492e12f5d1337..025a39f90fc4f0c8e7b00c615cffba2dc89d0171 100644
--- a/share/qtcreator/debugger/dumper.py
+++ b/share/qtcreator/debugger/dumper.py
@@ -182,24 +182,29 @@ class Children:
         return True
 
 class PairedChildrenData:
-    def __init__(self, d, pairType):
+    def __init__(self, d, pairType, keyType, valueType):
         self.pairType = pairType
-        self.keyType = d.templateArgument(pairType, 0).unqualified()
-        self.valueType = d.templateArgument(pairType, 1)
+        self.keyType = keyType
+        self.valueType = valueType
         self.isCompact = d.isMapCompact(self.keyType, self.valueType)
-        self.childNumChild = None if self.isCompact else 2
-        self.childType = self.valueType if self.isCompact else self.pairType
+        self.childType = valueType if self.isCompact else pairType
         ns = d.qtNamespace()
         self.keyIsQString = str(self.keyType) == ns + "QString"
         self.keyIsQByteArray = str(self.keyType) == ns + "QByteArray"
 
 class PairedChildren(Children):
-    def __init__(self, d, numChild, pairType, maxNumChild = None):
+    def __init__(self, d, numChild, pairType = None, keyType = None, valueType = None, maxNumChild = None):
         self.d = d
-        d.pairData = PairedChildrenData(d, pairType)
+        if keyType is None:
+            keyType = d.templateArgument(pairType, 0).unqualified()
+        if valueType is None:
+            valueType = d.templateArgument(pairType, 1)
+        d.pairData = PairedChildrenData(d, pairType, keyType, valueType)
+
         Children.__init__(self, d, numChild,
-            d.pairData.childType, d.pairData.childNumChild,
-            maxNumChild, addrBase = None, addrStep = None)
+            d.pairData.childType,
+            maxNumChild = maxNumChild,
+            addrBase = None, addrStep = None)
 
     def __enter__(self):
         self.savedPairData = self.d.pairData if hasattr(self.d, "pairData") else None
@@ -453,8 +458,16 @@ class DumperBase:
                 self.put('key="[%d] %s",' % (index, val))
 
     def putPair(self, pair, index = -1):
-        key = pair["first"]
-        value = pair["second"]
+        try:
+            key = pair["first"]
+            value = pair["second"]
+            keyName = "first"
+            valueName = "second"
+        except:
+            key = pair["key"]
+            value = pair["value"]
+            keyName = "key"
+            valueName = "value"
         if self.pairData.isCompact:
             if self.pairData.keyIsQString:
                 self.put('key="%s",' % self.encodeString(key))
@@ -471,10 +484,12 @@ class DumperBase:
             self.putItem(value)
         else:
             self.putEmptyValue()
+            self.putNumChild(2)
+            self.putField("iname", self.currentIName)
             if self.isExpanded():
-                with Children(self, 2):
-                    self.putSubItem("first", key)
-                    self.putSubItem("second", value)
+                with Children(self):
+                    self.putSubItem(keyName, key)
+                    self.putSubItem(valueName, value)
 
     def isMapCompact(self, keyType, valueType):
         format = self.currentItemFormat()
diff --git a/share/qtcreator/debugger/qttypes.py b/share/qtcreator/debugger/qttypes.py
index 4a9256c06eaf90eae99ef01d82df4c9706b6ee47..6262f3a0b27cf77a71d25cb6610ae55d9839c066 100644
--- a/share/qtcreator/debugger/qttypes.py
+++ b/share/qtcreator/debugger/qttypes.py
@@ -907,7 +907,7 @@ def qdump__QMapNode(d, value):
             d.putSubItem("value", value["value"])
 
 
-def qdumpHelper__Qt4_QMap(d, value, forceLong):
+def qdumpHelper__Qt4_QMap(d, value):
     d_ptr = value["d"].dereference()
     e_ptr = value["e"].dereference()
     n = int(d_ptr["size"])
@@ -922,7 +922,6 @@ def qdumpHelper__Qt4_QMap(d, value, forceLong):
 
         keyType = d.templateArgument(value.type, 0)
         valueType = d.templateArgument(value.type, 1)
-        isCompact = d.isMapCompact(keyType, valueType)
 
         it = e_ptr["forward"].dereference()
 
@@ -941,30 +940,17 @@ def qdumpHelper__Qt4_QMap(d, value, forceLong):
         else:
             payloadSize = nodeType.sizeof - 2 * nodePointerType.sizeof
 
-        if isCompact:
-            innerType = valueType
-        else:
-            innerType = nodeType
-
-        with Children(d, n, childType=innerType):
+        with PairedChildren(d, n, keyType=keyType, valueType=valueType, pairType = nodeType):
             for i in xrange(n):
                 base = it.cast(d.charPtrType()) - payloadSize
                 node = base.cast(nodePointerType).dereference()
                 with SubItem(d, i):
-                    d.putField("iname", d.currentIName)
-                    if isCompact:
-                        #d.putType(valueType)
-                        if forceLong:
-                            d.putName("[%s] %s" % (i, node["key"]))
-                        else:
-                            d.putMapName(node["key"])
-                        d.putItem(node["value"])
-                    else:
-                        d.putItem(node)
+                    #d.putField("iname", d.currentIName)
+                    d.putPair(node, i)
                 it = it.dereference()["forward"].dereference()
 
 
-def qdumpHelper__Qt5_QMap(d, value, forceLong):
+def qdumpHelper__Qt5_QMap(d, value):
     d_ptr = value["d"].dereference()
     n = int(d_ptr["size"])
     d.check(0 <= n and n <= 100*1000*1000)
@@ -978,36 +964,21 @@ def qdumpHelper__Qt5_QMap(d, value, forceLong):
 
         keyType = d.templateArgument(value.type, 0)
         valueType = d.templateArgument(value.type, 1)
-        isCompact = d.isMapCompact(keyType, valueType)
         # Note: Keeping the spacing in the type lookup
         # below is important for LLDB.
         needle = str(d_ptr.type).replace("QMapData", "QMapNode", 1)
         nodeType = d.lookupType(needle)
 
-        if isCompact:
-            innerType = valueType
-        else:
-            innerType = nodeType
-
-
-        def helper(d, node, nodeType, isCompact, forceLong, i, n):
+        def helper(d, node, nodeType, i):
             left = node["left"]
             if not d.isNull(left):
-                i = helper(d, left.dereference(), nodeType, isCompact, forceLong, i, n)
+                i = helper(d, left.dereference(), nodeType, i)
                 if i >= n:
                     return i
 
             nodex = node.cast(nodeType)
             with SubItem(d, i):
-                d.putField("iname", d.currentIName)
-                if isCompact:
-                    if forceLong:
-                        d.putName("[%s] %s" % (i, nodex["key"]))
-                    else:
-                        d.putMapName(nodex["key"])
-                    d.putItem(nodex["value"])
-                else:
-                    qdump__QMapNode(d, nodex)
+                d.putPair(nodex, i)
 
             i += 1
             if i >= n:
@@ -1015,33 +986,29 @@ def qdumpHelper__Qt5_QMap(d, value, forceLong):
 
             right = node["right"]
             if not d.isNull(right):
-                i = helper(d, right.dereference(), nodeType, isCompact, forceLong, i, n)
+                i = helper(d, right.dereference(), nodeType, i)
 
             return i
 
-        with Children(d, n, childType=innerType):
+        with PairedChildren(d, n, keyType=keyType, valueType=valueType, pairType = nodeType):
             node = d_ptr["header"]
-            helper(d, node, nodeType, isCompact, forceLong, 0, n)
-
-
+            helper(d, node, nodeType, 0)
 
-def qdumpHelper__QMap(d, value, forceLong):
-    if d.fieldAt(value["d"].dereference().type, 0).name == "backward":
-        qdumpHelper__Qt4_QMap(d, value, forceLong)
-    else:
-        qdumpHelper__Qt5_QMap(d, value, forceLong)
 
 def qform__QMap():
     return mapForms()
 
 def qdump__QMap(d, value):
-    qdumpHelper__QMap(d, value, False)
+    if d.fieldAt(value["d"].dereference().type, 0).name == "backward":
+        qdumpHelper__Qt4_QMap(d, value)
+    else:
+        qdumpHelper__Qt5_QMap(d, value)
 
 def qform__QMultiMap():
     return mapForms()
 
 def qdump__QMultiMap(d, value):
-    qdumpHelper__QMap(d, value, True)
+    qdump__QMap(d, value)
 
 
 def extractCString(table, offset):
diff --git a/share/qtcreator/debugger/stdtypes.py b/share/qtcreator/debugger/stdtypes.py
index c36292a72191bb3ffad8718bb84d2c98ccffa7b6..ecad055ee62f2fc91b949aa01564c648d6af5109 100644
--- a/share/qtcreator/debugger/stdtypes.py
+++ b/share/qtcreator/debugger/stdtypes.py
@@ -194,7 +194,7 @@ def qdump__std__map(d, value):
     if d.isExpanded():
         pairType = d.templateArgument(d.templateArgument(value.type, 3), 0)
         pairPointer = pairType.pointer()
-        with PairedChildren(d, size, pairType, maxNumChild=1000):
+        with PairedChildren(d, size, pairType=pairType, maxNumChild=1000):
             node = impl["_M_header"]["_M_left"]
             for i in d.childRange():
                 with SubItem(d, i):
@@ -644,8 +644,7 @@ def qdump__std____1__unordered_map(d, value):
     d.putItemCount(size)
     if d.isExpanded():
         node = value["__table_"]["__p1_"]["__first_"]["__next_"]
-        pairType = node["__value_"].type
-        with PairedChildren(d, size, pairType, maxNumChild=1000):
+        with PairedChildren(d, size, pairType=node["__value_"].type, maxNumChild=1000):
             for i in d.childRange():
                 with SubItem(d, i):
                     d.putPair(node["__value_"], i)
diff --git a/tests/auto/debugger/tst_dumpers.cpp b/tests/auto/debugger/tst_dumpers.cpp
index e568a0239513306ef603fef81b5c59406209b2fa..ff3c39b646ed4553bd3ee1ded75f3a18ed1225ae 100644
--- a/tests/auto/debugger/tst_dumpers.cpp
+++ b/tests/auto/debugger/tst_dumpers.cpp
@@ -2080,12 +2080,12 @@ void tst_Dumpers::dumper_data()
    QTest::newRow("QMapUIntFloat")
            << Data("#include <QMap>\n",
                    "QMap<uint, float> map;\n"
-                   "map[11] = 11.0;\n"
-                   "map[22] = 22.0;\n")
+                   "map[11] = 31.0;\n"
+                   "map[22] = 32.0;\n")
               % CoreProfile()
               % Check("map", "<2 items>", "@QMap<unsigned int, float>")
-              % Check("map.0", "[11]", "11", "float")
-              % Check("map.1", "[22]", "22", "float");
+              % Check("map.0", "[0] 11", FloatValue("31.0"), "float")
+              % Check("map.1", "[1] 22", FloatValue("32.0"), "float");
 
    QTest::newRow("QMapStringFloat")
            << Data("#include <QMap>\n"