diff --git a/share/qtcreator/debugger/dumper.py b/share/qtcreator/debugger/dumper.py
index a70c42165fa0c975b5386c4e6eb8843d8dbe3ca8..525e75e9f4223a38c4b4d52c26d492e12f5d1337 100644
--- a/share/qtcreator/debugger/dumper.py
+++ b/share/qtcreator/debugger/dumper.py
@@ -193,7 +193,7 @@ class PairedChildrenData:
         self.keyIsQString = str(self.keyType) == ns + "QString"
         self.keyIsQByteArray = str(self.keyType) == ns + "QByteArray"
 
-class PairedChildren:
+class PairedChildren(Children):
     def __init__(self, d, numChild, pairType, maxNumChild = None):
         self.d = d
         d.pairData = PairedChildrenData(d, pairType)
diff --git a/share/qtcreator/debugger/stdtypes.py b/share/qtcreator/debugger/stdtypes.py
index 7b109a759e61ffcf3b47d3509d6e112747f30620..5e4830540ed1c358f8324ad8e6e116073e98f949 100644
--- a/share/qtcreator/debugger/stdtypes.py
+++ b/share/qtcreator/debugger/stdtypes.py
@@ -451,21 +451,33 @@ def qdump_stringHelper(d, data, size, charSize):
 
 
 def qdump__std____1__string(d, value):
-    inner = d.childAt(d.childAt(value["__r_"]["__first_"], 0), 0)
-    size = int(inner["__size_"])
-    alloc = int(inner["__cap_"])
-    data = d.pointerValue(inner["__data_"])
+    base = d.addressOf(value)
+    firstByte = d.extractByte(base)
+    if firstByte & 1:
+        # Long/external.
+        data = d.dereference(base + 2 * d.ptrSize())
+        size = d.extractInt(base + d.ptrSize())
+    else:
+        # Short/internal.
+        size = firstByte / 2
+        data = base + 1
     qdump_stringHelper(d, data, size, 1)
     d.putType("std::string")
 
 
 def qdump__std____1__wstring(d, value):
-    inner = d.childAt(d.childAt(value["__r_"]["__first_"], 0), 0)
-    size = int(inner["__size_"]) * 4
-    alloc = int(inner["__cap_"])
-    data = d.pointerValue(inner["__data_"])
-    qdump_stringHelper(d, data, size, 4)
-    d.putType("std::wstring")
+    base = d.addressOf(value)
+    firstByte = d.extractByte(base)
+    if firstByte & 1:
+        # Long/external.
+        data = d.dereference(base + 2 * d.ptrSize())
+        size = d.extractInt(base + d.ptrSize())
+    else:
+        # Short/internal.
+        size = firstByte / 2
+        data = base + 4
+    qdump_stringHelper(d, data, size * 4, 4)
+    d.putType("std::xxwstring")
 
 
 def qdump__std__shared_ptr(d, value):
@@ -628,30 +640,16 @@ def qform__std____1__unordered_map():
     return mapForms()
 
 def qdump__std____1__unordered_map(d, value):
-    n = toInteger(value["__table_"]["__p2_"]["__first_"])
+    n = int(value["__table_"]["__p2_"]["__first_"])
     d.putItemCount(n)
     if d.isExpanded():
         node = value["__table_"]["__p1_"]["__first_"]["__next_"]
-        #pos = toInteger(value["__table_"]["__p2_"]["__first_"])
-        #with Children(d, 1):
-        #    d.putFields(value)
-        keyType = d.templateArgument(value.type, 0)
-        valueType = d.templateArgument(value.type, 1)
-        isCompact = d.isMapCompact(keyType, valueType)
-        with Children(d, n, maxNumChild=1000, childType=valueType):
-            for i in xrange(n):
-                pair = node["__value_"]
-                #d.putSubItem(i, pair)
+        pairType = node["__value_"].type
+        with PairedChildren(d, n, pairType, maxNumChild=1000):
+            for i in d.childRange():
                 with SubItem(d, i):
-                    if isCompact:
-                        d.putMapName(pair["first"], i)
-                        d.putItem(pair["second"])
-                    else:
-                        d.putEmptyValue()
-                        if d.isExpanded():
-                            with Children(d, 2):
-                                d.putSubItem("first", pair["first"])
-                                d.putSubItem("second", pair["second"])
+                    pair = node["__value_"]
+                    d.putPair(pair)
                 node = node["__next_"]
 
 def qdump__std____debug__unordered_set(d, value):
@@ -792,6 +790,15 @@ def qdump__std__basic_string(d, value):
     innerType = d.templateArgument(value.type, 0)
     qdump__std__stringHelper1(d, value, innerType.sizeof)
 
+def qdump__std____1__basic_string(d, value):
+    innerType = str(d.templateArgument(value.type, 0))
+    if innerType == "char":
+        qdump__std____1__string(d, value)
+    elif innerType == "wchar_t":
+        qdump__std____1__wstring(d, value)
+    else:
+        warn("UNKNOWN INNER TYPE %s" % innerType)
+
 def qdump__wstring(d, value):
     qdump__std__wstring(d, value)