diff --git a/share/qtcreator/templates/qt4project/mywidget_form.cpp b/share/qtcreator/templates/qt4project/mywidget_form.cpp
index 33b14afab8ea825fb7260ac7e23dac4e93233c7f..b7e3ae6200b06556ca1c278e38886339ba03e57e 100644
--- a/share/qtcreator/templates/qt4project/mywidget_form.cpp
+++ b/share/qtcreator/templates/qt4project/mywidget_form.cpp
@@ -2,7 +2,7 @@
 #include "%UI_HDR%"
 
 %CLASS%::%CLASS%(QWidget *parent)
-    : %BASECLASS%(parent), ui(new Ui::%CLASS%Class)
+    : %BASECLASS%(parent), ui(new Ui::%CLASS%)
 {
     ui->setupUi(this);
 }
diff --git a/share/qtcreator/templates/qt4project/mywidget_form.h b/share/qtcreator/templates/qt4project/mywidget_form.h
index fd4d3732772ef138fb1fe7177df04d992d5cdaca..7293a8b17d6384763d214374a0217de8aabb478e 100644
--- a/share/qtcreator/templates/qt4project/mywidget_form.h
+++ b/share/qtcreator/templates/qt4project/mywidget_form.h
@@ -5,7 +5,7 @@
 
 namespace Ui
 {
-    class %CLASS%Class;
+    class %CLASS%;
 }
 
 class %CLASS% : public %BASECLASS%
@@ -17,7 +17,7 @@ public:
     ~%CLASS%();
 
 private:
-    Ui::%CLASS%Class *ui;
+    Ui::%CLASS% *ui;
 };
 
 #endif // %PRE_DEF%
diff --git a/share/qtcreator/templates/qt4project/widget.ui b/share/qtcreator/templates/qt4project/widget.ui
index 91d5fa37d593d3a9e19f7b674ecf38833e637cb5..f4e94939e46edcd6e9cecf706a21a2947c3de60a 100644
--- a/share/qtcreator/templates/qt4project/widget.ui
+++ b/share/qtcreator/templates/qt4project/widget.ui
@@ -1,6 +1,6 @@
 <ui version="4.0">
  <class>%CLASS%Class</class>
- <widget class="%BASECLASS%" name="%CLASS%Class" >
+ <widget class="%BASECLASS%" name="%CLASS%" >
   <property name="geometry" >
    <rect>
     <x>0</x>
diff --git a/src/plugins/coreplugin/mainwindow.cpp b/src/plugins/coreplugin/mainwindow.cpp
index aea62962134d29867554cffb3f50fa0234052e55..5e2914df46d10bfd43b4a220146c8f019a9e2578 100644
--- a/src/plugins/coreplugin/mainwindow.cpp
+++ b/src/plugins/coreplugin/mainwindow.cpp
@@ -65,6 +65,7 @@
 #include "basefilewizard.h"
 
 #include <coreplugin/findplaceholder.h>
+#include <utils/pathchooser.h>
 #include <extensionsystem/pluginmanager.h>
 
 #include <QtCore/QDebug>
@@ -836,10 +837,10 @@ QStringList MainWindow::showNewItemDialog(const QString &title,
                                           const QString &defaultLocation)
 {
     QString defaultDir = defaultLocation;
-    if (defaultDir.isEmpty()) {
-        if (!m_coreImpl->fileManager()->currentFile().isEmpty())
-            defaultDir = QFileInfo(m_coreImpl->fileManager()->currentFile()).absolutePath();
-    }
+    if (defaultDir.isEmpty() && !m_coreImpl->fileManager()->currentFile().isEmpty())
+        defaultDir = QFileInfo(m_coreImpl->fileManager()->currentFile()).absolutePath();
+    if (defaultDir.isEmpty())
+        defaultDir = Core::Utils::PathChooser::homePath();
 
     // Scan for wizards matching the filter and pick one. Don't show
     // dialog if there is only one.
diff --git a/src/plugins/debugger/debuggermanager.cpp b/src/plugins/debugger/debuggermanager.cpp
index 79cc59c601084665030664abf25e0b8b49514ef9..27109f952e87e4296aa9857343e39ffbe57c5e20 100644
--- a/src/plugins/debugger/debuggermanager.cpp
+++ b/src/plugins/debugger/debuggermanager.cpp
@@ -262,6 +262,8 @@ 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
     //m_sourceFilesHandler = new SourceFilesHandler;
@@ -508,6 +510,16 @@ void DebuggerManager::createDockWidgets()
     m_watchDock = createDockForWidget(localsAndWatchers);
 }
 
+void DebuggerManager::createNewDock(QWidget *widget)
+{
+    QDockWidget *dockWidget = new QDockWidget(widget->windowTitle(), m_mainWindow);
+    dockWidget->setObjectName(widget->windowTitle());
+    dockWidget->setFeatures(QDockWidget::DockWidgetClosable);
+    dockWidget->setWidget(widget);
+    m_mainWindow->addDockWidget(Qt::TopDockWidgetArea, dockWidget);
+    dockWidget->show();
+}
+
 QDockWidget *DebuggerManager::createDockForWidget(QWidget *widget)
 {
     QDockWidget *dockWidget = new QDockWidget(widget->windowTitle(), m_mainWindow);
diff --git a/src/plugins/debugger/debuggermanager.h b/src/plugins/debugger/debuggermanager.h
index af89e332b45895dddcc503605142b985c42ad566..d5c463eea2d04b92531013386abe6c54451306a9 100644
--- a/src/plugins/debugger/debuggermanager.h
+++ b/src/plugins/debugger/debuggermanager.h
@@ -294,6 +294,7 @@ private slots:
     void showDebuggerOutput(const QString &prefix, const QString &msg);
     void showDebuggerInput(const QString &prefix, const QString &msg);
     void showApplicationOutput(const QString &data);
+    void showWidgetInDock(QWidget *dock);
 
     void reloadDisassembler();
     void disassemblerDockToggled(bool on);
@@ -402,6 +403,7 @@ private:
     void init();
     void setDebuggerType(DebuggerType type);
     QDockWidget *createDockForWidget(QWidget *widget);
+    Q_SLOT void createNewDock(QWidget *widget);
 
     void shutdown();
 
diff --git a/src/plugins/debugger/gdbengine.cpp b/src/plugins/debugger/gdbengine.cpp
index 0c339d0e2e7d5448029e04e1fc2c8eac41a8f924..0280ce6ede2011e5b677838d827ca1c124fdcfb9 100644
--- a/src/plugins/debugger/gdbengine.cpp
+++ b/src/plugins/debugger/gdbengine.cpp
@@ -2428,6 +2428,8 @@ void GdbEngine::handleModulesList(const GdbResultRecord &record)
 {
     QList<Module> modules;
     if (record.resultClass == GdbResultDone) {
+        // that's console-based output, likely Linux or Windows,
+        // but we can avoid the #ifdef here
         QString data = record.data.findChild("consolestreamoutput").data();
         QTextStream ts(&data, QIODevice::ReadOnly);
         while (!ts.atEnd()) {
@@ -2442,6 +2444,21 @@ void GdbEngine::handleModulesList(const GdbResultRecord &record)
             module.symbolsRead = (symbolsRead == "Yes");
             modules.append(module);
         }
+        if (modules.isEmpty()) {
+            // Mac has^done,shlib-info={num="1",name="dyld",kind="-",
+            // dyld-addr="0x8fe00000",reason="dyld",requested-state="Y",
+            // state="Y",path="/usr/lib/dyld",description="/usr/lib/dyld",
+            // loaded_addr="0x8fe00000",slide="0x0",prefix="__dyld_"},
+            // shlib-info={...}...
+            foreach (const GdbMi &item, record.data.children()) {
+                Module module;
+                module.moduleName = item.findChild("path").data();
+                module.symbolsRead = (item.findChild("state").data() == "Y");
+                module.startAddress = item.findChild("loaded_addr").data();
+                module.endAddress = "<unknown>";
+                modules.append(module);
+            }
+        }
     }
     qq->modulesHandler()->setModules(modules);
 }
diff --git a/src/plugins/debugger/moduleswindow.cpp b/src/plugins/debugger/moduleswindow.cpp
index c8e7e41625e755d86d1b63d2a870f0f2d4a70fb8..c580cfd1815dd586b6500b1442de976a2b5f2494 100644
--- a/src/plugins/debugger/moduleswindow.cpp
+++ b/src/plugins/debugger/moduleswindow.cpp
@@ -30,13 +30,23 @@
 #include "moduleswindow.h"
 #include "moduleshandler.h" // for model roles
 
-#include <QAction>
-#include <QDebug>
-#include <QHeaderView>
-#include <QMenu>
-#include <QResizeEvent>
-#include <QToolButton>
+#include <QtCore/QDebug>
+#include <QtCore/QProcess>
+#include <QtCore/QRegExp>
 
+#include <QtGui/QAction>
+#include <QtGui/QHeaderView>
+#include <QtGui/QMenu>
+#include <QtGui/QResizeEvent>
+#include <QtGui/QToolButton>
+#include <QtGui/QTreeWidget>
+
+
+///////////////////////////////////////////////////////////////////////////
+//
+// ModulesWindow
+//
+///////////////////////////////////////////////////////////////////////////
 
 using Debugger::Internal::ModulesWindow;
 
@@ -93,20 +103,28 @@ void ModulesWindow::contextMenuEvent(QContextMenuEvent *ev)
     QAction *act4 = new QAction(tr("Load symbols for all modules"), &menu);
     QAction *act5 = 0;
     QAction *act6 = 0;
+    QAction *act7 = 0;
     if (name.isEmpty()) {
         act5 = new QAction(tr("Load symbols for module"), &menu);
         act6 = new QAction(tr("Edit file"), &menu);
+        act7 = new QAction(tr("Show symbols"), &menu);
     } else {
         act5 = new QAction(tr("Load symbols for module \"%1\"").arg(name), &menu);
         act6 = new QAction(tr("Edit file \"%1\"").arg(name), &menu);
+        act7 = new QAction(tr("Show symbols in file \"%1\"").arg(name), &menu);
     }
     act5->setDisabled(name.isEmpty());
     act6->setDisabled(name.isEmpty());
+    act7->setDisabled(name.isEmpty());
+    #ifndef Q_OS_LINUX
+    act7->setDisabled(true)l
+    #endif
 
     menu.addAction(act0);
     menu.addAction(act4);
     menu.addAction(act5);
     menu.addAction(act6);
+    menu.addAction(act7);
     menu.addSeparator();
     menu.addAction(act1);
     menu.addAction(act2);
@@ -127,6 +145,8 @@ void ModulesWindow::contextMenuEvent(QContextMenuEvent *ev)
         emit loadSymbolsRequested(name);
     else if (act == act6)
         emit fileOpenRequested(name);
+    else if (act == act7)
+        showSymbols(name);
 }
 
 void ModulesWindow::resizeColumnsToContents()
@@ -154,3 +174,32 @@ void ModulesWindow::setModel(QAbstractItemModel *model)
     setAlwaysResizeColumnsToContents(true);
 }
     
+void ModulesWindow::showSymbols(const QString &name)
+{
+    if (name.isEmpty())
+        return;
+    QProcess proc;
+    proc.start("nm", QStringList() << "-D" << name);
+    proc.waitForFinished();
+    QTreeWidget *w = new QTreeWidget;
+    w->setColumnCount(3);
+    w->setRootIsDecorated(false);
+    w->setAlternatingRowColors(true);
+    //w->header()->hide();
+    w->setHeaderLabels(QStringList() << tr("Address") << tr("Code") << tr("Symbol"));
+    w->setWindowTitle(tr("Symbols in \"%1\"").arg(name));
+    QString contents = QString::fromLocal8Bit(proc.readAllStandardOutput());
+    QRegExp re("([0-9a-f]+)?\\s+([^\\s]+)\\s+([^\\s]+)");
+    foreach (QString line, contents.split('\n')) {
+        if (re.indexIn(line) != -1) {
+            QTreeWidgetItem *it = new QTreeWidgetItem;
+            it->setData(0, Qt::DisplayRole, re.cap(1));
+            it->setData(1, Qt::DisplayRole, re.cap(2));
+            it->setData(2, Qt::DisplayRole, re.cap(3));
+            w->addTopLevelItem(it);
+        } else {
+            qDebug() << "UNHANDLED LINE" << line;
+        }
+    }
+    emit newDockRequested(w);
+}
diff --git a/src/plugins/debugger/moduleswindow.h b/src/plugins/debugger/moduleswindow.h
index a2686141961787c5d22157a999768cd933b74be6..36377fb58eeb657f5c742020391627a8be70ff0a 100644
--- a/src/plugins/debugger/moduleswindow.h
+++ b/src/plugins/debugger/moduleswindow.h
@@ -48,11 +48,13 @@ signals:
     void loadSymbolsRequested(const QString &modulesName);
     void loadAllSymbolsRequested();
     void fileOpenRequested(QString);
+    void newDockRequested(QWidget *w);
 
 public slots:
     void resizeColumnsToContents();
     void setAlwaysResizeColumnsToContents(bool on);
     void moduleActivated(const QModelIndex &);
+    void showSymbols(const QString &name);
 
 private:
     void resizeEvent(QResizeEvent *ev);
diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp
index 073ddc000ec0d02e6a7954be57daba577f2e4c99..329fe456a6c7214587f3680f062b16461294e9ff 100644
--- a/src/plugins/fakevim/fakevimhandler.cpp
+++ b/src/plugins/fakevim/fakevimhandler.cpp
@@ -294,6 +294,8 @@ private:
     void updateSelection();
     void quit();
     QWidget *editor() const;
+    QChar characterAtCursor() const
+        { return m_tc.document()->characterAt(m_tc.position()); }
 
 public:
     QTextEdit *m_textedit;
@@ -1146,6 +1148,8 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
             for (int i = qMax(count(), 2) - 1; --i >= 0; ) {
                 moveToEndOfLine();
                 recordRemoveNextChar();
+                while (characterAtCursor() == ' ')
+                    recordRemoveNextChar();
                 if (!m_gflag)
                     recordInsertText(" ");
             }
@@ -1999,12 +2003,10 @@ void FakeVimHandler::Private::moveToNextWord(bool simple)
 {
     // FIXME: 'w' should stop on empty lines, too
     int repeat = count();
-    QTextDocument *doc = m_tc.document();
     int n = lastPositionInDocument() - 1;
-    QChar c = doc->characterAt(m_tc.position());
-    int lastClass = charClass(c, simple);
+    int lastClass = charClass(characterAtCursor(), simple);
     while (true) {
-        c = doc->characterAt(m_tc.position());
+        QChar c = characterAtCursor();
         int thisClass = charClass(c, simple);
         if (thisClass != lastClass && thisClass != 0)
             --repeat;