diff --git a/share/qtcreator/gdbmacros/pdumper.py b/share/qtcreator/gdbmacros/pdumper.py
index 8ca75eb3353aeb587c2df0d89d80a9ab0d4295b0..96addcc951d2b9cc6f08f9407b45bdb62a9250d2 100644
--- a/share/qtcreator/gdbmacros/pdumper.py
+++ b/share/qtcreator/gdbmacros/pdumper.py
@@ -16,7 +16,12 @@ class qdebug:
         self.typeformats = typeformats
         self.individualformats = individualformats
         self.watchers = watchers
-        self.doit()
+        if self.options == "listmodules":
+            self.handleListModules()
+        elif self.options == "listsymbols":
+            self.handleListSymbols(expanded)
+        else:
+            self.handleListVars()
 
     def put(self, value):
         sys.stdout.write(value)
@@ -90,6 +95,9 @@ class qdebug:
             return
         if str(value).startswith("<class '"):
             return
+        # FIXME: Should we?
+        if str(value).startswith("<enum-item "):
+            return
         self.put("{")
         self.putField("iname", iname)
         self.putName(name)
@@ -146,13 +154,15 @@ class qdebug:
             pass
         elif tt == "function":
             pass
+        elif str(value).startswith("<enum-item "):
+            # FIXME: Having enums always shown like this is not nice.
+            self.putValue(str(value)[11:-1])
+            self.putNumChild(0)
         else:
             v = str(value)
             p = v.find(" object at ")
             if p > 1:
                 v = "@" + v[p + 11:-1]
-            elif v.startswith("<enum-item "):
-                v = v[11:-1]
             self.putValue(v)
             if self.isExpanded(iname):
                 self.put("children=[")
@@ -177,7 +187,7 @@ class qdebug:
     def warn(self, msg):
         self.putField("warning", msg)
 
-    def doit(self):
+    def handleListVars(self):
         # Trigger error to get a backtrace.
         frame = None
         #self.warn("frame: %s" % frame)
@@ -207,3 +217,24 @@ class qdebug:
             n = n + 1
 
         sys.stdout.flush()
+
+    def handleListModules(self):
+        self.put("modules=[");
+        for name in sys.modules:
+            self.put("{")
+            self.putName(name)
+            self.putValue(sys.modules[name])
+            self.put("},")
+        self.put("]")
+        sys.stdout.flush()
+
+    def handleListSymbols(self, module):
+        #self.put("symbols=%s" % dir(sys.modules[module]))
+        self.put("symbols=[");
+        for name in sys.modules:
+            self.put("{")
+            self.putName(name)
+            #self.putValue(sys.modules[name])
+            self.put("},")
+        self.put("]")
+        sys.stdout.flush()
diff --git a/src/plugins/debugger/cdb/cdbdebugengine.cpp b/src/plugins/debugger/cdb/cdbdebugengine.cpp
index cb7bbf55d403cf96db2e265352c7b58919286185..26eb61b118f13af56bb02d7e8f438d207da57cb1 100644
--- a/src/plugins/debugger/cdb/cdbdebugengine.cpp
+++ b/src/plugins/debugger/cdb/cdbdebugengine.cpp
@@ -1183,7 +1183,7 @@ void CdbDebugEngine::loadAllSymbols()
         qDebug() << Q_FUNC_INFO;
 }
 
-QList<Symbol> CdbDebugEngine::moduleSymbols(const QString &moduleName)
+void> CdbDebugEngine::requestModuleSymbols(const QString &moduleName)
 {
     QList<Symbol> rc;
     QString errorMessage;
@@ -1199,7 +1199,7 @@ QList<Symbol> CdbDebugEngine::moduleSymbols(const QString &moduleName)
     } while (false);
     if (!success)
         warning(errorMessage);
-    return rc;
+    manager()->showModuleSymbols(moduleName, rc);
 }
 
 void CdbDebugEngine::reloadRegisters()
diff --git a/src/plugins/debugger/cdb/cdbdebugengine.h b/src/plugins/debugger/cdb/cdbdebugengine.h
index e15d5e93e13c66890c990a144db9a1a4e0e4ab48..452f8df87ff000ed52260aa87319598f98fd9548 100644
--- a/src/plugins/debugger/cdb/cdbdebugengine.h
+++ b/src/plugins/debugger/cdb/cdbdebugengine.h
@@ -95,7 +95,7 @@ public:
     virtual void reloadModules();
     virtual void loadSymbols(const QString &moduleName);
     virtual void loadAllSymbols();
-    virtual QList<Symbol> moduleSymbols(const QString &moduleName);
+    virtual void requestModuleSymbols(const QString &moduleName);
 
     virtual void reloadRegisters();
     virtual void reloadSourceFiles();
diff --git a/src/plugins/debugger/debuggermanager.cpp b/src/plugins/debugger/debuggermanager.cpp
index c6bf0494bd1c7d514bb8979e706324b3219b9c10..ac645e19c3f1765632b93e26fbbd39d6a1124751 100644
--- a/src/plugins/debugger/debuggermanager.cpp
+++ b/src/plugins/debugger/debuggermanager.cpp
@@ -98,6 +98,7 @@
 #include <QtGui/QTextCursor>
 #include <QtGui/QToolButton>
 #include <QtGui/QToolTip>
+#include <QtGui/QTreeWidget>
 
 #define DEBUG_STATE 1
 #ifdef DEBUG_STATE
@@ -460,8 +461,6 @@ void DebuggerManager::init()
         this, SLOT(loadAllSymbols()));
     connect(modulesView, SIGNAL(fileOpenRequested(QString)),
         this, SLOT(fileOpen(QString)));
-    connect(modulesView, SIGNAL(newDockRequested(QWidget*)),
-        this, SLOT(createNewDock(QWidget*)));
 
     // Source Files
     //d->m_sourceFilesHandler = new SourceFilesHandler;
@@ -1214,10 +1213,31 @@ void DebuggerManager::loadSymbols(const QString &module)
     d->m_engine->loadSymbols(module);
 }
 
-QList<Symbol> DebuggerManager::moduleSymbols(const QString &moduleName)
+void DebuggerManager::requestModuleSymbols(const QString &moduleName)
 {
-    QTC_ASSERT(d->m_engine, return QList<Symbol>());
-    return d->m_engine->moduleSymbols(moduleName);
+    QTC_ASSERT(d->m_engine, return);
+    d->m_engine->requestModuleSymbols(moduleName);
+}
+
+void DebuggerManager::showModuleSymbols(const QString &moduleName,
+    const QList<Symbol> &symbols)
+{ 
+    QTC_ASSERT(d->m_engine, return);
+    QTreeWidget *w = new QTreeWidget;
+    w->setColumnCount(3);
+    w->setRootIsDecorated(false);
+    w->setAlternatingRowColors(true);
+    w->setSortingEnabled(true);
+    w->setHeaderLabels(QStringList() << tr("Symbol") << tr("Address") << tr("Code"));
+    w->setWindowTitle(tr("Symbols in \"%1\"").arg(moduleName));
+    foreach (const Symbol &s, symbols) {
+        QTreeWidgetItem *it = new QTreeWidgetItem;
+        it->setData(0, Qt::DisplayRole, s.name);
+        it->setData(1, Qt::DisplayRole, s.address);
+        it->setData(2, Qt::DisplayRole, s.state);
+        w->addTopLevelItem(it);
+    }
+    createNewDock(w);
 }
 
 void DebuggerManager::executeStep()
diff --git a/src/plugins/debugger/debuggermanager.h b/src/plugins/debugger/debuggermanager.h
index e3793ed5e1c8591711fc514580b8a68a2a738fd4..9c2ee51f8765c7933196058efca66a52b2e9b969 100644
--- a/src/plugins/debugger/debuggermanager.h
+++ b/src/plugins/debugger/debuggermanager.h
@@ -329,7 +329,9 @@ private:
 public:
     // stuff in this block should be made private by moving it to
     // one of the interfaces
-    QList<Internal::Symbol> moduleSymbols(const QString &moduleName);
+    void requestModuleSymbols(const QString &moduleName);
+    void showModuleSymbols(const QString &moduleName,
+        const QList<Internal::Symbol> &symbols);
 
 signals:
     void debuggingFinished();
diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp
index 17ac63a1705524b35e2d356d0531df65aae3925b..58f01e7318b901096bb50c992d99bfa8abe0f37d 100644
--- a/src/plugins/debugger/gdb/gdbengine.cpp
+++ b/src/plugins/debugger/gdb/gdbengine.cpp
@@ -2587,7 +2587,7 @@ void GdbEngine::loadAllSymbols()
     reloadModulesInternal();
 }
 
-QList<Symbol> GdbEngine::moduleSymbols(const QString &moduleName)
+void GdbEngine::requestModuleSymbols(const QString &moduleName)
 {
     QList<Symbol> rc;
     bool success = false;
@@ -2618,7 +2618,7 @@ QList<Symbol> GdbEngine::moduleSymbols(const QString &moduleName)
     } while (false);
     if (!success)
         qWarning("moduleSymbols: %s\n", qPrintable(errorMessage));
-    return rc;
+    manager()->showModuleSymbols(moduleName, rc);
 }
 
 void GdbEngine::reloadModules()
diff --git a/src/plugins/debugger/gdb/gdbengine.h b/src/plugins/debugger/gdb/gdbengine.h
index b5950703f39fc93a2864b1454cb1d1f779dab8c4..b51c5ec3204f626a93874b7ca1bd016f427df78c 100644
--- a/src/plugins/debugger/gdb/gdbengine.h
+++ b/src/plugins/debugger/gdb/gdbengine.h
@@ -358,7 +358,7 @@ private: ////////// View & Data Stuff //////////
     //
     virtual void loadSymbols(const QString &moduleName);
     virtual void loadAllSymbols();
-    virtual QList<Symbol> moduleSymbols(const QString &moduleName);
+    virtual void requestModuleSymbols(const QString &moduleName);
     virtual void reloadModules();
     void reloadModulesInternal();
     void handleModulesList(const GdbResponse &response);
diff --git a/src/plugins/debugger/idebuggerengine.h b/src/plugins/debugger/idebuggerengine.h
index f093376325397069ee98c06ecaa20368dcf06988..b78824719051e228d7c9a606b66f175b9e19d7da 100644
--- a/src/plugins/debugger/idebuggerengine.h
+++ b/src/plugins/debugger/idebuggerengine.h
@@ -105,7 +105,7 @@ public:
     virtual void reloadModules() = 0;
     virtual void loadSymbols(const QString &moduleName) = 0;
     virtual void loadAllSymbols() = 0;
-    virtual QList<Symbol> moduleSymbols(const QString &moduleName) = 0;
+    virtual void requestModuleSymbols(const QString &moduleName) = 0;
 
     virtual void reloadRegisters() = 0;
 
diff --git a/src/plugins/debugger/moduleshandler.cpp b/src/plugins/debugger/moduleshandler.cpp
index dc7c1ac0c751bc2a96b56c2c30bb8538c256eacf..ea01954600f22c429e99d65a7ff31471ecc131e8 100644
--- a/src/plugins/debugger/moduleshandler.cpp
+++ b/src/plugins/debugger/moduleshandler.cpp
@@ -62,7 +62,7 @@ public:
 
     // QAbstractItemModel
     int columnCount(const QModelIndex &parent) const
-        { return parent.isValid() ? 0 : 4; }
+        { return parent.isValid() ? 0 : 5; }
     int rowCount(const QModelIndex &parent) const
         { return parent.isValid() ? 0 : m_modules.size(); }
     QModelIndex parent(const QModelIndex &) const { return QModelIndex(); }
@@ -85,6 +85,7 @@ QVariant ModulesModel::headerData(int section,
     if (orientation == Qt::Horizontal && role == Qt::DisplayRole) {
         static QString headers[] = {
             tr("Module name") + "        ",
+            tr("Module path") + "        ",
             tr("Symbols read") + "        ",
             tr("Start address") + "        ",
             tr("End address") + "        "
@@ -112,13 +113,17 @@ QVariant ModulesModel::data(const QModelIndex &index, int role) const
             break;
         case 1:
             if (role == Qt::DisplayRole)
-                return module.symbolsRead ? "yes" : "no";
+                return module.modulePath;
             break;
         case 2:
             if (role == Qt::DisplayRole)
-                return module.startAddress;
+                return module.symbolsRead ? "yes" : "no";
             break;
         case 3:
+            if (role == Qt::DisplayRole)
+                return module.startAddress;
+            break;
+        case 4:
             if (role == Qt::DisplayRole)
                 return module.endAddress;
             break;
diff --git a/src/plugins/debugger/moduleshandler.h b/src/plugins/debugger/moduleshandler.h
index 249d6ca242e01b2449882ca82df9cea2c093886b..2d9f15db23a90b2aabaac3a164ae0ff565837ae0 100644
--- a/src/plugins/debugger/moduleshandler.h
+++ b/src/plugins/debugger/moduleshandler.h
@@ -78,6 +78,7 @@ public:
 
 public:
     QString moduleName;
+    QString modulePath;
     bool symbolsRead;
     QString startAddress;
     QString endAddress;
diff --git a/src/plugins/debugger/moduleswindow.cpp b/src/plugins/debugger/moduleswindow.cpp
index 4144f82563f1f80f499a609411eeacf6d508cf96..df427bafb805b149dd3d24de75acdc58c15691e4 100644
--- a/src/plugins/debugger/moduleswindow.cpp
+++ b/src/plugins/debugger/moduleswindow.cpp
@@ -175,6 +175,7 @@ void ModulesWindow::resizeColumnsToContents()
     resizeColumnToContents(0);
     resizeColumnToContents(1);
     resizeColumnToContents(2);
+    resizeColumnToContents(3);
 }
 
 void ModulesWindow::setAlwaysResizeColumnsToContents(bool on)
@@ -186,6 +187,7 @@ void ModulesWindow::setAlwaysResizeColumnsToContents(bool on)
     header()->setResizeMode(1, mode);
     header()->setResizeMode(2, mode);
     header()->setResizeMode(3, mode);
+    header()->setResizeMode(4, mode);
     //setColumnHidden(3, true);
 }
 
@@ -197,27 +199,8 @@ void ModulesWindow::setModel(QAbstractItemModel *model)
 
 void ModulesWindow::showSymbols(const QString &name)
 {
-    if (name.isEmpty())
-        return;
-    QApplication::setOverrideCursor(Qt::WaitCursor);
-    const QList<Symbol> symbols = m_debuggerManager->moduleSymbols(name);
-    QApplication::restoreOverrideCursor();
-    if (symbols.empty())
-        return;
-    QTreeWidget *w = new QTreeWidget;
-    w->setColumnCount(3);
-    w->setRootIsDecorated(false);
-    w->setAlternatingRowColors(true);
-    w->setHeaderLabels(QStringList() << tr("Address") << tr("Code") << tr("Symbol"));
-    w->setWindowTitle(tr("Symbols in \"%1\"").arg(name));
-    foreach (const Symbol &s, symbols) {
-        QTreeWidgetItem *it = new QTreeWidgetItem;
-        it->setData(0, Qt::DisplayRole, s.address);
-        it->setData(1, Qt::DisplayRole, s.state);
-        it->setData(2, Qt::DisplayRole, s.name);
-        w->addTopLevelItem(it);
-    }
-    emit newDockRequested(w);
+    if (!name.isEmpty())
+        m_debuggerManager->requestModuleSymbols(name);
 }
 
 } // namespace Internal
diff --git a/src/plugins/debugger/pdb/pdbengine.cpp b/src/plugins/debugger/pdb/pdbengine.cpp
index 0fa670239e44480e4d02c3af92438bf63864bab3..49eb20a4ba92d7ce7d10756926e29bdda02f3998 100644
--- a/src/plugins/debugger/pdb/pdbengine.cpp
+++ b/src/plugins/debugger/pdb/pdbengine.cpp
@@ -394,13 +394,52 @@ void PdbEngine::loadAllSymbols()
 
 void PdbEngine::reloadModules()
 {
+    postCommand("qdebug('listmodules')", CB(handleListModules));
+}
+
+void PdbEngine::handleListModules(const PdbResponse &response)
+{
+    GdbMi out;
+    out.fromString(response.data.trimmed());
+    QList<Module> modules;
+    foreach (const GdbMi &item, out.children()) {
+        Module module;
+        module.moduleName = _(item.findChild("name").data());
+        QString path = _(item.findChild("value").data());
+        int pos = path.indexOf(_("' from '"));
+        if (pos != -1) {
+            path = path.mid(pos + 8);
+            if (path.size() >= 2)
+                path.chop(2);
+        } else if (path.startsWith(_("<module '"))
+                && path.endsWith(_("' (built-in)>"))) {
+            path = _("(builtin)");
+        }
+        module.modulePath = path;
+        modules.append(module);
+    }
+    manager()->modulesHandler()->setModules(modules);
 }
 
-QList<Symbol> PdbEngine::moduleSymbols(const QString & /*moduleName*/)
+void PdbEngine::requestModuleSymbols(const QString &moduleName)
 {
-    return QList<Symbol>();
+    postCommand("qdebug('listsymbols','" + moduleName.toLatin1() + "')",
+        CB(handleListSymbols), moduleName);
 }
 
+void PdbEngine::handleListSymbols(const PdbResponse &response)
+{
+    GdbMi out;
+    out.fromString(response.data.trimmed());
+    QList<Symbol> symbols;
+    QString moduleName = response.cookie.toString();
+    foreach (const GdbMi &item, out.children()) {
+        Symbol symbol;
+        symbol.name = _(item.findChild("name").data());
+        symbols.append(symbol);
+    }
+    manager()->showModuleSymbols(moduleName, symbols);
+}
 
 //////////////////////////////////////////////////////////////////////
 //
@@ -771,6 +810,11 @@ void PdbEngine::debugMessage(const QString &msg)
     showDebuggerOutput(LogDebug, msg);
 }
 
+unsigned PdbEngine::debuggerCapabilities() const
+{
+    return ReloadModuleCapability;
+}
+
 IDebuggerEngine *createPdbEngine(DebuggerManager *manager)
 {
     return new PdbEngine(manager);
diff --git a/src/plugins/debugger/pdb/pdbengine.h b/src/plugins/debugger/pdb/pdbengine.h
index 2b1f9d12ffdfa5046cc3790ef27d3635eab7f874..9262b6a6fc48928577700e815e57f6a5adf7a3bf 100644
--- a/src/plugins/debugger/pdb/pdbengine.h
+++ b/src/plugins/debugger/pdb/pdbengine.h
@@ -94,7 +94,7 @@ private:
 
     void loadSymbols(const QString &moduleName);
     void loadAllSymbols();
-    virtual QList<Symbol> moduleSymbols(const QString &moduleName);
+    void requestModuleSymbols(const QString &moduleName);
     void reloadModules();
     void reloadRegisters() {}
     void reloadSourceFiles() {}
@@ -107,6 +107,7 @@ private:
 private:
     void debugMessage(const QString &msg);
     QString errorMessage(QProcess::ProcessError error) const;
+    unsigned debuggerCapabilities() const;
 
     Q_SLOT void handlePdbFinished(int, QProcess::ExitStatus status);
     Q_SLOT void handlePdbError(QProcess::ProcessError error);
@@ -135,6 +136,8 @@ private:
     void handleStop(const PdbResponse &response);
     void handleBacktrace(const PdbResponse &response);
     void handleListLocals(const PdbResponse &response);
+    void handleListModules(const PdbResponse &response);
+    void handleListSymbols(const PdbResponse &response);
     void handleLoadDumper(const PdbResponse &response);
     void handleBreakInsert(const PdbResponse &response);
 
diff --git a/src/plugins/debugger/script/scriptengine.cpp b/src/plugins/debugger/script/scriptengine.cpp
index 8b0566a999db7d79631ece0ce1d66eb8692d659a..3185c10d978b8eba211e22706c489a5c5b5e923e 100644
--- a/src/plugins/debugger/script/scriptengine.cpp
+++ b/src/plugins/debugger/script/scriptengine.cpp
@@ -448,9 +448,8 @@ void ScriptEngine::reloadModules()
 {
 }
 
-QList<Symbol> ScriptEngine::moduleSymbols(const QString & /*moduleName*/)
+void ScriptEngine::requestModuleSymbols(const QString & /*moduleName*/)
 {
-    return QList<Symbol>();
 }
 
 
diff --git a/src/plugins/debugger/script/scriptengine.h b/src/plugins/debugger/script/scriptengine.h
index 22d28edaa697a07768ed09ec2d82ebc172c8e25a..e320c46c09f37d81a2cc6c9125b7a6deae2daa61 100644
--- a/src/plugins/debugger/script/scriptengine.h
+++ b/src/plugins/debugger/script/scriptengine.h
@@ -93,7 +93,7 @@ private:
 
     void loadSymbols(const QString &moduleName);
     void loadAllSymbols();
-    virtual QList<Symbol> moduleSymbols(const QString &moduleName);
+    void requestModuleSymbols(const QString &moduleName);
     void reloadModules();
     void reloadRegisters() {}
     void reloadSourceFiles() {}