diff --git a/share/qtcreator/gdbmacros/gdbmacros.cpp b/share/qtcreator/gdbmacros/gdbmacros.cpp
index d39fd8ddb49ab68284c360393b67efc2b3e23db8..eca4db27ec3c96d120a026fa4aba1cfd0b8863f4 100644
--- a/share/qtcreator/gdbmacros/gdbmacros.cpp
+++ b/share/qtcreator/gdbmacros/gdbmacros.cpp
@@ -309,11 +309,7 @@ static bool isSimpleType(const char *type)
     return false;
 }
 
-static bool isShortKey(const char *type)
-{
-    return isSimpleType(type) || isEqual(type, NS"QString");
-}
-
+#if 0
 static bool isStringType(const char *type)
 {
     return isEqual(type, NS"QString")
@@ -322,6 +318,7 @@ static bool isStringType(const char *type)
         || isEqual(type, "std::wstring")
         || isEqual(type, "wstring");
 }
+#endif
 
 static bool isMovableType(const char *type)
 {
@@ -1098,16 +1095,14 @@ static void qDumpQHash(QDumper &d)
         if (n > 1000)
             n = 1000;
         bool isSimpleKey = isSimpleType(keyType);
-        bool isStringKey = isStringType(keyType);
         bool isSimpleValue = isSimpleType(valueType);
         bool opt = isOptimizedIntKey(keyType);
         int keyOffset = hashOffset(opt, true, keySize, valueSize);
         int valueOffset = hashOffset(opt, false, keySize, valueSize);
 
         P(d, "extra", "isSimpleKey: " << isSimpleKey
-            << " isStringKey: " << isStringKey
             << " isSimpleValue: " << isSimpleValue
-            << " valueType: '" << valueType << "'"
+            << " valueType: '" << isSimpleValue
             << " keySize: " << keyOffset << " valueOffset: " << valueOffset
             << " opt: " << opt);
 
@@ -1145,15 +1140,18 @@ static void qDumpQHashNode(QDumper &d)
     const char *keyType   = d.templateParameters[0];
     const char *valueType = d.templateParameters[1];
 
-    P(d, "value", "");
+    unsigned keySize = d.extraInt[0];
+    unsigned valueSize = d.extraInt[1];
+    bool opt = isOptimizedIntKey(keyType);
+    int keyOffset = hashOffset(opt, true, keySize, valueSize);
+    int valueOffset = hashOffset(opt, false, keySize, valueSize);
+    if (isSimpleType(valueType)) 
+        qDumpInnerValueHelper(d, valueType, addOffset(h, valueOffset));
+    else
+        P(d, "value", "");
+
     P(d, "numchild", 2);
     if (d.dumpChildren) {
-        unsigned keySize = d.extraInt[0];
-        unsigned valueSize = d.extraInt[1];
-        bool opt = isOptimizedIntKey(keyType);
-        int keyOffset = hashOffset(opt, true, keySize, valueSize);
-        int valueOffset = hashOffset(opt, false, keySize, valueSize);
-
         // there is a hash specialization in cast the key are integers or shorts
         d << ",children=[";
         d.beginHash();
@@ -1411,8 +1409,8 @@ static void qDumpQMap(QDumper &d)
         unsigned mapnodesize = d.extraInt[2];
         unsigned valueOff = d.extraInt[3];
 
-        bool isSimpleKey = isShortKey(keyType);
-        bool isSimpleValue = isShortKey(valueType);
+        bool isSimpleKey = isSimpleType(keyType);
+        bool isSimpleValue = isSimpleType(valueType);
         // both negative:
         int keyOffset = 2 * sizeof(void*) - int(mapnodesize);
         int valueOffset = 2 * sizeof(void*) - int(mapnodesize) + valueOff;
@@ -1429,12 +1427,9 @@ static void qDumpQMap(QDumper &d)
         while (node != end) {
             d.beginHash();
                 P(d, "name", i);
-                if (isSimpleKey) {
-                    P(d, "type", valueType);
-                    qDumpInnerValueHelper(d, keyType, addOffset(node, keyOffset), "key");
-                    if (isSimpleValue)
-                        qDumpInnerValueHelper(d, valueType, addOffset(node, valueOffset));
-
+                qDumpInnerValueHelper(d, keyType, addOffset(node, keyOffset), "key");
+                qDumpInnerValueHelper(d, valueType, addOffset(node, valueOffset));
+                if (isSimpleKey && isSimpleValue) {
                     P(d, "type", valueType);
                     P(d, "addr", addOffset(node, valueOffset));
                 } else {
@@ -2208,39 +2203,36 @@ static void qDumpStdMap(QDumper &d)
     // (#4, "std::allocator<std::pair<key, value> >")
     // as it is there, and, equally importantly, in an order that
     // gdb accepts when fed with it.
-    char *pairType = (char *)(d.templateParameters[3]) + 16;
+    char *pairType = (char *)(d.templateParameters[3]) + 15;
     pairType[strlen(pairType) - 2] = 0;
     P(d, "pairtype", pairType);
     
     if (d.dumpChildren) {
         bool isSimpleKey = isSimpleType(keyType);
-        bool isStringKey = isStringType(keyType);
-        bool isSimpleValue = isShortKey(valueType);
+        bool isSimpleValue = isSimpleType(valueType);
         int valueOffset = d.extraInt[2];
 
+        P(d, "extra", "isSimpleKey: " << isSimpleKey
+            << " isSimpleValue: " << isSimpleValue
+            << " valueType: '" << valueType
+            << " valueOffset: " << valueOffset);
+
         d << ",children=[";
         it = map.begin();
         for (int i = 0; i < 1000 && it != map.end(); ++i, ++it) {
-            const void *node = it.operator->();
-            if (isSimpleKey) {
-                d.beginHash();
-                P(d, "type", valueType);
+            d.beginHash();
+                const void *node = it.operator->();
                 P(d, "name", i);
                 qDumpInnerValueHelper(d, keyType, node, "key");
-                P(d, "nameisindex", "1");
-                if (isSimpleValue)
-                    qDumpInnerValueHelper(d, valueType, addOffset(node, valueOffset));
-                P(d, "addr", addOffset(node, valueOffset));
-                d.endHash();
-            } else {
-                d.beginHash();
-                P(d, "name", i);
-                if (isStringKey)
-                    qDumpInnerValueHelper(d, keyType, node, "key");
-                P(d, "addr", it.operator->());
-                P(d, "type", pairType);
-                d.endHash();
-            }
+                qDumpInnerValueHelper(d, valueType, addOffset(node, valueOffset));
+                if (isSimpleKey && isSimpleValue) {
+                    P(d, "type", valueType);
+                    P(d, "addr", addOffset(node, valueOffset));
+                } else {
+                    P(d, "addr", node);
+                    P(d, "type", pairType);
+                }
+            d.endHash();
         }
         if (it != map.end())
             d.putEllipsis();
diff --git a/src/plugins/debugger/gdbengine.cpp b/src/plugins/debugger/gdbengine.cpp
index aab7dc1025e0ca1edb503fcee20ea845ea0365d5..fa2d2bacbe4320aaa3e6b16d57fbf163ea123d65 100644
--- a/src/plugins/debugger/gdbengine.cpp
+++ b/src/plugins/debugger/gdbengine.cpp
@@ -2854,7 +2854,7 @@ static bool extractTemplate(const QString &type, QString *tmplate, QString *inne
     *tmplate = tmplate->trimmed();
     *tmplate = tmplate->remove("<>");
     *inner = inner->trimmed();
-    //qDebug() << "EXTRACT TEMPLATE: " << *tmplate << *inner;
+    //qDebug() << "EXTRACT TEMPLATE: " << *tmplate << *inner << " FROM " << type;
     return !inner->isEmpty();
 }