diff --git a/tests/auto/debugger/gdb.pro b/tests/auto/debugger/gdb.pro
index e723ab0319e5af22be0aef74368bc427d7ccf09d..d455843aa7373c6917112f0ce4c0ec1a8aaeeb95 100644
--- a/tests/auto/debugger/gdb.pro
+++ b/tests/auto/debugger/gdb.pro
@@ -1,6 +1,6 @@
 QT += testlib
 
-#QT -= gui
+QT -= gui
 
 UTILSDIR    = ../../../src/libs
 
diff --git a/tests/auto/debugger/tst_gdb.cpp b/tests/auto/debugger/tst_gdb.cpp
index c76ad364222a233f5e37b977f4171c07d52d61c5..8b8725ae09cbd4dfa86c8e50090c2302b372d1df 100644
--- a/tests/auto/debugger/tst_gdb.cpp
+++ b/tests/auto/debugger/tst_gdb.cpp
@@ -26,9 +26,10 @@ bool checkUninitialized = false;
 
 #include <QtTest/QtTest>
 
-#ifdef Q_OS_WIN
-#    include <windows.h>
-#endif
+#include <deque>
+#include <map>
+#include <set>
+#include <vector>
 
 #undef NS
 #ifdef QT_NAMESPACE
@@ -59,6 +60,8 @@ QString gdbBinary = "c:\\MinGw\\bin\\gdb.exe";
 QString gdbBinary = "./gdb";
 #endif
 
+void nothing() {}
+
 class Foo
 {
 public:
@@ -69,6 +72,7 @@ public:
     ~Foo()
     {
     } 
+
     void doit()
     {
         static QObject ob;
@@ -106,7 +110,8 @@ private:
 
 typedef QList<QByteArray> QByteArrayList;
 
-struct Int3 {
+struct Int3
+{
     Int3(int base = 0) { i1 = 42 + base; i2 = 43 + base; i3 = 44 + base; }
     int i1, i2, i3;
 };
@@ -121,7 +126,13 @@ bool operator==(const Int3 &a, const Int3 &b)
     return a.i1 == b.i1 && a.i2 == b.i2 && a.i3 == b.i3;
 }
 
-struct QString3 {
+bool operator<(const Int3 &a, const Int3 &b)
+{
+    return a.i1 < b.i1;
+}
+
+struct QString3
+{
     QString3() { s1 = "a"; s2 = "b"; s3 = "c"; }
     QString s1, s2, s3;
 };
@@ -183,11 +194,18 @@ private slots:
     void dump_array();
     void dump_misc();
     void dump_typedef();
+    void dump_std_deque();
     void dump_std_list();
-    void dump_std_vector();
+    void dump_std_map_int_int();
+    void dump_std_map_string_string();
+    void dump_std_set_Int3();
+    void dump_std_set_int();
     void dump_std_string();
+    void dump_std_vector();
     void dump_std_wstring();
     void dump_Foo();
+    void dump_QAbstractItemModel();
+    void dump_QAbstractItemAndModelIndex();
     void dump_QByteArray();
     void dump_QChar();
     void dump_QHash_int_int();
@@ -226,13 +244,10 @@ private slots:
 public slots:
     void dumperCompatibility();
 #if 0
-    void dump_QAbstractItemAndModelIndex();
-    void dump_QAbstractItemModel();
     void dump_QDateTime();
     void dump_QDir();
     void dump_QFile();
     void dump_QFileInfo();
-    void dump_QHashNode();
     void dump_QLinkedList();
     void dump_QLocale();
     void dump_QPixmap();
@@ -240,7 +255,6 @@ public slots:
 
 private:
 #if 0
-    void dump_QAbstractItemHelper(QModelIndex &index);
     void dump_QAbstractItemModelHelper(QAbstractItemModel &m);
     void dump_QDateTimeHelper(const QDateTime &d);
     void dump_QFileHelper(const QString &name, bool exists);
@@ -897,156 +911,137 @@ void tst_Gdb::dump_QAbstractItemHelper(QModelIndex &index)
     expected.append("]");
     testDumper(expected, &index, NS"QAbstractItem", true, indexSpecValue);
 }
+#endif
 
-void tst_Gdb::dump_QAbstractItemAndModelIndex()
+class PseudoTreeItemModel : public QAbstractItemModel
 {
-    class PseudoTreeItemModel : public QAbstractItemModel
+public:
+    PseudoTreeItemModel() : QAbstractItemModel(), parent1(0),
+        parent1Child(1), parent2(10), parent2Child1(11), parent2Child2(12)
+    {}
+
+    int columnCount(const QModelIndex &parent = QModelIndex()) const
     {
-    public:
-        PseudoTreeItemModel() : QAbstractItemModel(), parent1(0),
-            parent1Child(1), parent2(10), parent2Child1(11), parent2Child2(12)
-        {}
-
-        int columnCount(const QModelIndex &parent = QModelIndex()) const
-        {
-            Q_UNUSED(parent);
-            return 1;
-        }
+        Q_UNUSED(parent);
+        return 1;
+    }
 
-        QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const
-        {
-            return !index.isValid() || role != Qt::DisplayRole ?
-                    QVariant() : *static_cast<int *>(index.internalPointer());
-        }
+    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const
+    {
+        return !index.isValid() || role != Qt::DisplayRole ?
+                QVariant() : *static_cast<int *>(index.internalPointer());
+    }
 
-        QModelIndex index(int row, int column,
-                          const QModelIndex & parent = QModelIndex()) const
-        {
-            QModelIndex index;
-            if (column == 0) {
-                if (!parent.isValid()) {
-                    if (row == 0)
-                        index = createIndex(row, column, &parent1);
-                    else if (row == 1)
-                        index = createIndex(row, column, &parent2);
-                } else if (parent.internalPointer() == &parent1 && row == 0) {
-                    index = createIndex(row, column, &parent1Child);
-                } else if (parent.internalPointer() == &parent2) {
-                    index = createIndex(row, column,
-                                row == 0 ? &parent2Child1 : &parent2Child2);
-                }
+    QModelIndex index(int row, int column,
+                      const QModelIndex & parent = QModelIndex()) const
+    {
+        QModelIndex index;
+        if (column == 0) {
+            if (!parent.isValid()) {
+                if (row == 0)
+                    index = createIndex(row, column, &parent1);
+                else if (row == 1)
+                    index = createIndex(row, column, &parent2);
+            } else if (parent.internalPointer() == &parent1 && row == 0) {
+                index = createIndex(row, column, &parent1Child);
+            } else if (parent.internalPointer() == &parent2) {
+                index = createIndex(row, column,
+                            row == 0 ? &parent2Child1 : &parent2Child2);
             }
-            return index;
         }
+        return index;
+    }
 
-        QModelIndex parent(const QModelIndex & index) const
-        {
-            QModelIndex parent;
-            if (index.isValid()) {
-                if (index.internalPointer() == &parent1Child)
-                    parent = createIndex(0, 0, &parent1);
-                else if (index.internalPointer() == &parent2Child1 ||
-                         index.internalPointer() == &parent2Child2)
-                    parent = createIndex(1, 0, &parent2);
-            }
-            return parent;
+    QModelIndex parent(const QModelIndex & index) const
+    {
+        QModelIndex parent;
+        if (index.isValid()) {
+            if (index.internalPointer() == &parent1Child)
+                parent = createIndex(0, 0, &parent1);
+            else if (index.internalPointer() == &parent2Child1 ||
+                     index.internalPointer() == &parent2Child2)
+                parent = createIndex(1, 0, &parent2);
         }
+        return parent;
+    }
 
-        int rowCount(const QModelIndex &parent = QModelIndex()) const
-        {
-            int rowCount;
-            if (!parent.isValid() || parent.internalPointer() == &parent2)
-                rowCount = 2;
-            else if (parent.internalPointer() == &parent1)
-                rowCount = 1;
-            else
-                rowCount = 0;
-            return rowCount;
-        }
+    int rowCount(const QModelIndex &parent = QModelIndex()) const
+    {
+        int rowCount;
+        if (!parent.isValid() || parent.internalPointer() == &parent2)
+            rowCount = 2;
+        else if (parent.internalPointer() == &parent1)
+            rowCount = 1;
+        else
+            rowCount = 0;
+        return rowCount;
+    }
+
+private:
+    mutable int parent1;
+    mutable int parent1Child;
+    mutable int parent2;
+    mutable int parent2Child1;
+    mutable int parent2Child2;
+};
 
-    private:
-        mutable int parent1;
-        mutable int parent1Child;
-        mutable int parent2;
-        mutable int parent2Child1;
-        mutable int parent2Child2;
-    };
 
-    PseudoTreeItemModel m2;
-
-    // Case 1: ModelIndex with no children.
-    QStringListModel m(QStringList() << "item1" << "item2" << "item3");
-    QModelIndex index = m.index(2, 0);
-
-    testDumper(QByteArray("type='$T',value='(2, 0)',numchild='5',children=["
-        "{name='row',value='2',type='int',numchild='0'},"
-        "{name='column',value='0',type='int',numchild='0'},"
-        "{name='parent',value='<invalid>',exp='(('$T'*)$A)->parent()',"
-            "type='$T',numchild='1'},"
-        "{name='internalId',%},"
-        "{name='model',value='%',type='"NS"QAbstractItemModel*',"
-            "numchild='1'}]")
-         << generateQStringSpec(N(index.internalId()))
-         << ptrToBa(&m),
-        &index, NS"QModelIndex", true);
-
-    // Case 2: ModelIndex with one child.
-    QModelIndex index2 = m2.index(0, 0);
-    dump_QAbstractItemHelper(index2);
-
-    qDebug() << "FIXME: invalid indices should not have children";
-    testDumper(QByteArray("type='$T',value='(0, 0)',numchild='5',children=["
-        "{name='row',value='0',type='int',numchild='0'},"
-        "{name='column',value='0',type='int',numchild='0'},"
-        "{name='parent',value='<invalid>',exp='(('$T'*)$A)->parent()',"
-            "type='$T',numchild='1'},"
-        "{name='internalId',%},"
-        "{name='model',value='%',type='"NS"QAbstractItemModel*',"
-            "numchild='1'}]")
-         << generateQStringSpec(N(index2.internalId()))
-         << ptrToBa(&m2),
-        &index2, NS"QModelIndex", true);
-
-
-    // Case 3: ModelIndex with two children.
-    QModelIndex index3 = m2.index(1, 0);
-    dump_QAbstractItemHelper(index3);
-
-    testDumper(QByteArray("type='$T',value='(1, 0)',numchild='5',children=["
-        "{name='row',value='1',type='int',numchild='0'},"
-        "{name='column',value='0',type='int',numchild='0'},"
-        "{name='parent',value='<invalid>',exp='(('$T'*)$A)->parent()',"
-            "type='$T',numchild='1'},"
-        "{name='internalId',%},"
-        "{name='model',value='%',type='"NS"QAbstractItemModel*',"
-            "numchild='1'}]")
-         << generateQStringSpec(N(index3.internalId()))
-         << ptrToBa(&m2),
-        &index3, NS"QModelIndex", true);
-
-
-    // Case 4: ModelIndex with a parent.
-    index = m2.index(0, 0, index3);
-    testDumper(QByteArray("type='$T',value='(0, 0)',numchild='5',children=["
-        "{name='row',value='0',type='int',numchild='0'},"
-        "{name='column',value='0',type='int',numchild='0'},"
-        "{name='parent',value='(1, 0)',exp='(('$T'*)$A)->parent()',"
-            "type='$T',numchild='1'},"
-        "{name='internalId',%},"
-        "{name='model',value='%',type='"NS"QAbstractItemModel*',"
-            "numchild='1'}]")
-         << generateQStringSpec(N(index.internalId()))
-         << ptrToBa(&m2),
-        &index, NS"QModelIndex", true);
-
-
-    // Case 5: Empty ModelIndex
-    QModelIndex index4;
-    testDumper("type='$T',value='<invalid>',numchild='0'",
-        &index4, NS"QModelIndex", true);
-}
-
-void tst_Gdb::dump_QAbstractItemModelHelper(QAbstractItemModel &m)
+//    /* A */ QStringListModel m(QStringList() << "item1" << "item2" << "item3");
+//    /* B */ index = m.index(2, 0);
+void dump_QAbstractItemAndModelIndex()
+{
+    /* A */ PseudoTreeItemModel m2; QModelIndex index;
+    /* C */ index = m2.index(0, 0);
+    /* D */ index = m2.index(1, 0);
+    /* E */ index = m2.index(0, 0, index);
+    /* F */ (void) index.row();
+}
+
+void tst_Gdb::dump_QAbstractItemAndModelIndex()
+{
+    prepare("dump_QAbstractItemAndModelIndex");
+    if (checkUninitialized)
+        run("A", "");
+    next();
+    run("C", "{iname='local.m2',name='m2',type='PseudoTreeItemModel',"
+            "value='{...}',numchild='6'},"
+        "{iname='local.index',name='index',type='"NS"QModelIndex',"
+            "value='(invalid)',numchild='0'}",
+        "local.index");
+    next();
+    run("D", "{iname='local.m2',name='m2',type='PseudoTreeItemModel',"
+           "value='{...}',numchild='6'},"
+        "{iname='local.index',name='index',type='"NS"QModelIndex',"
+          "value='(0, 0)',numchild='5',children=["
+            "{name='row',value='0',type='int',numchild='0'},"
+            "{name='column',value='0',type='int',numchild='0'},"
+            "{name='parent',type='"NS"QModelIndex',value='(invalid)',numchild='0'},"
+            "{name='model',value='-',type='"NS"QAbstractItemModel*',numchild='1'}]}",
+        "local.index");
+    next();
+    run("E", "{iname='local.m2',name='m2',type='PseudoTreeItemModel',"
+           "value='{...}',numchild='6'},"
+        "{iname='local.index',name='index',type='"NS"QModelIndex',"
+          "value='(1, 0)',numchild='5',children=["
+            "{name='row',value='1',type='int',numchild='0'},"
+            "{name='column',value='0',type='int',numchild='0'},"
+            "{name='parent',type='"NS"QModelIndex',value='(invalid)',numchild='0'},"
+            "{name='model',value='-',type='"NS"QAbstractItemModel*',numchild='1'}]}",
+        "local.index");
+    next();
+    run("F", "{iname='local.m2',name='m2',type='PseudoTreeItemModel',"
+           "value='{...}',numchild='6'},"
+        "{iname='local.index',name='index',type='"NS"QModelIndex',"
+          "value='(0, 0)',numchild='5',children=["
+            "{name='row',value='0',type='int',numchild='0'},"
+            "{name='column',value='0',type='int',numchild='0'},"
+            "{name='parent',type='"NS"QModelIndex',value='(1, 0)',numchild='5'},"
+            "{name='model',value='-',type='"NS"QAbstractItemModel*',numchild='1'}]}",
+        "local.index");
+}
+
+/*
+QByteArray dump_QAbstractItemModelHelper(QAbstractItemModel &m)
 {
     QByteArray address = ptrToBa(&m);
     QByteArray expected = QByteArray("tiname='iname',"
@@ -1076,43 +1071,53 @@ void tst_Gdb::dump_QAbstractItemModelHelper(QAbstractItemModel &m)
         }
     }
     expected.append("]");
-    testDumper(expected, &m, NS"QAbstractItemModel", true);
+    return expected;
+}
+*/
+
+#ifdef QT_GUI_LIB
+QStandardItem item1("Item (0,0)");
+QStandardItem item2("Item (0,1)");
+QStandardItem item3("Item (1,0)");
+QStandardItem item4("Item (1,1)");
+#endif
+
+void dump_QAbstractItemModel()
+{
+    #ifdef QT_GUI_LIB
+    /* A */ QStringList strList;
+            strList << "String 1";
+            QStringListModel model1(strList);
+            QStandardItemModel model2(0, 2); 
+    /* B */ model1.setStringList(strList);
+    /* C */ strList << "String 2";
+    /* D */ model1.setStringList(strList);
+    /* E */ model2.appendRow(QList<QStandardItem *>() << &item1 << &item2);
+    /* F */ model2.appendRow(QList<QStandardItem *>() << &item3 << &item4);
+    /* G */ (void) (model1.rowCount() + model2.rowCount() + item1.row()
+                + item2.row() + item3.row() + item4.row() + strList.size());
+    #endif
 }
 
 void tst_Gdb::dump_QAbstractItemModel()
 {
-    // Case 1: No rows, one column.
-    QStringList strList;
-    QStringListModel model(strList);
-    dump_QAbstractItemModelHelper(model);
-
-    // Case 2: One row, one column.
-    strList << "String 1";
-    model.setStringList(strList);
-    dump_QAbstractItemModelHelper(model);
-
-    // Case 3: Two rows, one column.
-    strList << "String 2";
-    model.setStringList(strList);
-    dump_QAbstractItemModelHelper(model);
-
-    // Case 4: No rows, two columns.
-    QStandardItemModel model2(0, 2);
-    dump_QAbstractItemModelHelper(model2);
-
-    // Case 5: One row, two columns.
-    QStandardItem item1("Item (0,0)");
-    QStandardItem item2("(Item (0,1)");
-    model2.appendRow(QList<QStandardItem *>() << &item1 << &item2);
-    dump_QAbstractItemModelHelper(model2);
-
-    // Case 6: Two rows, two columns
-    QStandardItem item3("Item (1,0");
-    QStandardItem item4("Item (1,1)");
-    model2.appendRow(QList<QStandardItem *>() << &item3 << &item4);
-    dump_QAbstractItemModelHelper(model);
+    #ifdef QT_GUI_LIB
+    /* A */ QStringList strList;
+    QString template_ = 
+        "{iname='local.strList',name='strList',type='"NS"QStringList',"
+            "value='<%1 items>',numchild='%1'},"
+        "{iname='local.model1',name='model1',type='"NS"QStringListModel',"
+            "value='{...}',numchild='3'},"
+        "{iname='local.model2',name='model2',type='"NS"QStandardItemModel',"
+            "value='{...}',numchild='2'}";
+
+    prepare("dump_QAbstractItemModel");
+    if (checkUninitialized)
+        run("A", template_.arg("1").toAscii());
+    next(4);
+    run("B", template_.arg("1").toAscii());
+    #endif
 }
-#endif
 
 void dump_QByteArray()
 {
@@ -1898,7 +1903,7 @@ void dump_QObject()
     /* B */ QObject ob;
     /* D */ ob.setObjectName("An Object");
     /* E */ QObject::connect(&ob, SIGNAL(destroyed()), qApp, SLOT(quit()));
-//    /* F */ QObject::disconnect(&ob, SIGNAL(destroyed()), qApp, SLOT(quit()));
+    /* F */ QObject::disconnect(&ob, SIGNAL(destroyed()), qApp, SLOT(quit()));
     /* G */ ob.setObjectName("A renamed Object");
     /* H */ (void) 0; }
 
@@ -1920,7 +1925,7 @@ void tst_Gdb::dump_QObject()
             "numchild='0'}");
     next(4);
     
-    run("F","{iname='local.ob',name='ob',type='"NS"QObject',valueencoded='7',"
+    run("G","{iname='local.ob',name='ob',type='"NS"QObject',valueencoded='7',"
       "value='41006e0020004f0062006a00650063007400',numchild='4',children=["
         "{name='parent',type='"NS"QObject *',"
             "value='0x0',numchild='0'},"
@@ -3216,6 +3221,39 @@ void tst_Gdb::dump_QWeakPointer_2() {}
 #endif
 
 
+///////////////////////////// std::deque<int> //////////////////////////////
+
+void dump_std_deque()
+{
+    /* A */ std::deque<int> deque;
+    /* B */ deque.push_back(45);
+    /* C */ deque.push_back(46);
+    /* D */ deque.push_back(47);
+    /* E */ (void) 0;
+}
+
+void tst_Gdb::dump_std_deque()
+{
+    prepare("dump_std_deque");
+    if (checkUninitialized)
+        run("A","{iname='local.deque',name='deque',"
+            "numchild='0'}");
+    next();
+    run("B", "{iname='local.deque',name='deque',"
+            "type='std::deque<int, std::allocator<int> >',"
+            "value='<0 items>',numchild='0',children=[]}",
+            "local.deque");
+    next(3);
+    run("E", "{iname='local.deque',name='deque',"
+            "type='std::deque<int, std::allocator<int> >',"
+            "value='<3 items>',numchild='3',"
+            "childtype='int',childnumchild='0',children=["
+                "{value='45'},{value='46'},{value='47'}]}",
+            "local.deque");
+    // FIXME: Try large container
+}
+
+
 ///////////////////////////// std::list<int> //////////////////////////////
 
 void dump_std_list()
@@ -3260,6 +3298,150 @@ void tst_Gdb::dump_std_list()
             "local.list");
 }
 
+ 
+///////////////////////////// std::map<int, int> //////////////////////////////
+
+void dump_std_map_int_int()
+{
+    /* A */ std::map<int, int> h;
+    /* B */ h[12] = 34;
+    /* C */ h[14] = 54;
+    /* D */ (void) 0;
+}
+
+void tst_Gdb::dump_std_map_int_int()
+{
+    QByteArray type = "std::map<int, int, std::less<int>, "
+        "std::allocator<std::pair<int const, int> > >";
+
+    prepare("dump_std_map_int_int");
+    if (checkUninitialized)
+        run("A","{iname='local.h',name='h',"
+            "type='" + type + "',value='<not in scope>',"
+            "numchild='0'}");
+    next();
+    run("B","{iname='local.h',name='h',"
+            "type='" + type + "',value='<0 items>',"
+            "numchild='0'}");
+    next(2);
+    run("D","{iname='local.h',name='h',"
+            "type='" + type + "',value='<2 items>',"
+            "numchild='2'}");
+    run("D","{iname='local.h',name='h',"
+            "type='" + type + "',value='<2 items>',"
+            "numchild='2',childtype='int',childnumchild='0',"
+            "children=[{name='12',value='34'},{name='14',value='54'}]}",
+            "local.h,local.h.0,local.h.1");
+}
+
+
+//////////////////////// std::map<std::string, std::string> ////////////////////////
+
+void dump_std_map_string_string()
+{
+    /* A */ std::map<std::string, std::string> m;
+    /* B */ m["hello"] = "world";
+    /* C */ m["foo"] = "bar";
+    /* D */ (void) 0;
+}
+
+void tst_Gdb::dump_std_map_string_string()
+{
+    QByteArray strType =
+        "std::basic_string<char, std::char_traits<char>, std::allocator<char> >";
+    QByteArray pairType = 
+        + "std::pair<" + strType + " const, " + strType + " >";
+    QByteArray type = "std::map<" + strType + ", " + strType + ", "
+        + "std::less<" + strType + " >, "
+        + "std::allocator<" + pairType + " > >";
+
+    prepare("dump_std_map_string_string");
+    if (checkUninitialized)
+        run("A","{iname='local.m',name='m',"
+            "type='" + type + "',value='<not in scope>',"
+            "numchild='0'}");
+    next();
+    run("B","{iname='local.m',name='m',"
+            "type='" + type + "',value='<0 items>',"
+            "numchild='0'}");
+    next();
+    next();
+    run("D","{iname='local.m',name='m',"
+            "type='" + type + "',value='<2 items>',"
+            "numchild='2'}");
+    run("D","{iname='local.m',name='m',type='" + type + "',"
+            "value='<2 items>',numchild='2',childtype='" + pairType + "',"
+            "childnumchild='2',children=["
+              "{value=' ',children=["
+                 "{name='first',type='const " + strType + "',"
+                    "type='std::string',"
+                    "valueencoded='6',value='666f6f',numchild='0'},"
+                 "{name='second',type='" + strType + "',"
+                    "type='std::string',"
+                    "valueencoded='6',value='626172',numchild='0'}]},"
+              "{value=' ',children=["
+                 "{name='first',type='const " + strType + "',"
+                    "type='std::string',"
+                    "valueencoded='6',value='68656c6c6f',numchild='0'},"
+                 "{name='second',type='" + strType + "',"
+                    "type='std::string',"
+                    "valueencoded='6',value='776f726c64',numchild='0'}]}"
+            "]}",
+            "local.m,local.m.0,local.m.1");
+}
+
+
+///////////////////////////// std::set<int> ///////////////////////////////////
+
+void dump_std_set_int()
+{
+    /* A */ std::set<int> h;
+    /* B */ h.insert(42);
+    /* C */ h.insert(44);
+    /* D */ (void) 0;
+}
+
+void tst_Gdb::dump_std_set_int()
+{
+    QByteArray setType = "std::set<int, std::less<int>, std::allocator<int> >";
+    prepare("dump_std_set_int");
+    if (checkUninitialized)
+        run("A","{iname='local.h',name='h',"
+            "type='" + setType + "',value='<not in scope>',"
+            "numchild='0'}");
+    next(3);
+    run("D","{iname='local.h',name='h',"
+            "type='" + setType + "',value='<2 items>',numchild='2',"
+            "childtype='int',childnumchild='0',children=["
+            "{value='42'},{value='44'}]}", "local.h");
+}
+
+
+///////////////////////////// QSet<Int3> ///////////////////////////////////
+
+void dump_std_set_Int3()
+{
+    /* A */ std::set<Int3> h;
+    /* B */ h.insert(Int3(42));
+    /* C */ h.insert(Int3(44));
+    /* D */ (void) 0; }
+
+void tst_Gdb::dump_std_set_Int3()
+{
+    QByteArray setType = "std::set<Int3, std::less<Int3>, std::allocator<Int3> >";
+    prepare("dump_std_set_Int3");
+    if (checkUninitialized)
+        run("A","{iname='local.h',name='h',"
+            "type='" + setType + "',value='<not in scope>',"
+            "numchild='0'}");
+    next(3);
+    run("D","{iname='local.h',name='h',"
+            "type='" + setType + "',value='<2 items>',numchild='2',"
+            "childtype='Int3',children=["
+            "{value='{...}',numchild='3'},{value='{...}',numchild='3'}]}", "local.h");
+}
+
+
 
 ///////////////////////////// std::string //////////////////////////////////
 
@@ -3328,26 +3510,28 @@ void dump_std_vector()
 
 void tst_Gdb::dump_std_vector()
 {
-    #define LIST "std::list<int, std::allocator<int> >"
-    #define VECTOR "std::vector<"LIST"*, std::allocator<"LIST"*> >"
+    QByteArray listType = "std::list<int, std::allocator<int> >";
+    QByteArray vectorType = "std::vector<" + listType + "*, "
+        "std::allocator<" + listType + "*> >";
 
     prepare("dump_std_vector");
     if (checkUninitialized)
         run("A","{iname='local.vector',name='vector',"
             "numchild='0'}");
     next(2);
-    run("B","{iname='local.vector',name='vector',type='"VECTOR"',"
+    run("B","{iname='local.vector',name='vector',type='" + vectorType + "',"
             "value='<0 items>',numchild='0'},"
-        "{iname='local.list',name='list',type='"LIST"',"
+        "{iname='local.list',name='list',type='" + listType + "',"
             "value='<0 items>',numchild='0'}");
     next(3);
-    run("E","{iname='local.vector',name='vector',type='"VECTOR"',"
-            "value='<2 items>',numchild='2',childtype='"LIST" *',"
+    run("E","{iname='local.vector',name='vector',type='" + vectorType + "',"
+            "value='<2 items>',numchild='2',childtype='" + listType + " *',"
             "childnumchild='1',children=["
-                "{type='"LIST"',value='<1 items>',numchild='1',childtype='int',"
+                "{type='" + listType + "',value='<1 items>',"
+                    "childtype='int',"
                     "childnumchild='0',children=[{value='45'}]},"
                 "{value='<null>',numchild='0'}]},"
-            "{iname='local.list',name='list',type='"LIST"',"
+            "{iname='local.list',name='list',type='" + listType + "',"
                 "value='<1 items>',numchild='1'}",
         "local.vector,local.vector.0");
 }
@@ -3379,13 +3563,20 @@ int main(int argc, char *argv[])
     if (argc == 2 && QByteArray(argv[1]) == "debug") {
         dump_array_char();
         dump_array_int();
+        dump_std_deque();
         dump_std_list();
+        dump_std_map_int_int();
+        dump_std_map_string_string();
+        dump_std_set_Int3();
+        dump_std_set_int();
         dump_std_vector();
         dump_std_string();
         dump_std_wstring();
         dump_Foo();
         dump_misc();
         dump_typedef();
+        dump_QAbstractItemModel();
+        dump_QAbstractItemAndModelIndex();
         dump_QByteArray();
         dump_QChar();
         dump_QHash_int_int();