diff --git a/share/qtcreator/gdbmacros/gdbmacros.cpp b/share/qtcreator/gdbmacros/gdbmacros.cpp
index e688fa3fa285b1e3eaee5dd7d08f43b3b29b7391..06c1e1ae1cf2f51a609b8f17a83c8732dec85bbe 100644
--- a/share/qtcreator/gdbmacros/gdbmacros.cpp
+++ b/share/qtcreator/gdbmacros/gdbmacros.cpp
@@ -202,11 +202,12 @@ QT_END_NAMESPACE
 #endif // PRIVATE_OBJECT_ALLOWED
 
 
-// this can be mangled typenames of nested templates, each char-by-char
-// comma-separated integer list
-static char qDumpInBuffer[10000];
-static char qDumpOutBuffer[100000];
-//static char qDumpSize[20];
+// This can be mangled typenames of nested templates, each char-by-char
+// comma-separated integer list...
+Q_DECL_EXPORT char qDumpInBuffer[10000];
+
+// The output buffer.
+Q_DECL_EXPORT char qDumpOutBuffer[100000];
 
 namespace {
 
@@ -2524,7 +2525,7 @@ static void handleProtocolVersion2and3(QDumper & d)
 
 
 extern "C" Q_DECL_EXPORT
-void qDumpObjectData440(
+void *qDumpObjectData440(
     int protocolVersion,
     int token,
     void *data,
@@ -2629,4 +2630,5 @@ void qDumpObjectData440(
     else {
         qDebug() << "Unsupported protocol version" << protocolVersion;
     }
+    return qDumpOutBuffer;
 }
diff --git a/src/plugins/coreplugin/filemanager.cpp b/src/plugins/coreplugin/filemanager.cpp
index b996ed50407337bd9bc830a4dbbf64f410875203..a13c72accc3147fcd12d987b484bc6a8dc1aea4d 100644
--- a/src/plugins/coreplugin/filemanager.cpp
+++ b/src/plugins/coreplugin/filemanager.cpp
@@ -453,7 +453,7 @@ void FileManager::changedFile(const QString &file)
     foreach (IFile *fileinterface, managedFiles(file))
         m_changedFiles << fileinterface;
     if (wasempty && !m_changedFiles.isEmpty()) {
-        QTimer::singleShot (200, this, SLOT(checkForReload()));
+        QTimer::singleShot(200, this, SLOT(checkForReload()));
     }
 }
 
diff --git a/src/plugins/coreplugin/mainwindow.cpp b/src/plugins/coreplugin/mainwindow.cpp
index 543111816b1588c25f40c785279d7bf66cba5c7e..446b7544bb3dc4381f316ccbed50459aceeff4fc 100644
--- a/src/plugins/coreplugin/mainwindow.cpp
+++ b/src/plugins/coreplugin/mainwindow.cpp
@@ -1070,11 +1070,14 @@ static const char *settingsGroup = "MainWindow";
 static const char *geometryKey = "Geometry";
 static const char *colorKey = "Color";
 static const char *maxKey = "Maximized";
+static const char *fullScreenKey = "FullScreen";
 
 void MainWindow::readSettings()
 {
     m_settings->beginGroup(QLatin1String(settingsGroup));
+
     StyleHelper::setBaseColor(m_settings->value(QLatin1String(colorKey)).value<QColor>());
+
     const QVariant geom = m_settings->value(QLatin1String(geometryKey));
     if (geom.isValid()) {
         setGeometry(geom.toRect());
@@ -1083,8 +1086,10 @@ void MainWindow::readSettings()
     }
     if (m_settings->value(QLatin1String(maxKey), false).toBool())
         setWindowState(Qt::WindowMaximized);
+    setFullScreen(m_settings->value(QLatin1String(fullScreenKey), false).toBool());
 
     m_settings->endGroup();
+
     m_editorManager->readSettings(m_settings);
     m_navigationWidget->restoreSettings(m_settings);
     m_rightPaneWidget->readSettings(m_settings);
@@ -1093,14 +1098,18 @@ void MainWindow::readSettings()
 void MainWindow::writeSettings()
 {
     m_settings->beginGroup(QLatin1String(settingsGroup));
-    m_settings->setValue(colorKey, StyleHelper::baseColor());
-    const QString maxSettingsKey = QLatin1String(maxKey);
-    if (windowState() & Qt::WindowMaximized) {
-        m_settings->setValue(maxSettingsKey, true);
+
+    m_settings->setValue(QLatin1String(colorKey), StyleHelper::baseColor());
+
+    if (windowState() & (Qt::WindowMaximized | Qt::WindowFullScreen)) {
+        m_settings->setValue(QLatin1String(maxKey), (bool) (windowState() & Qt::WindowMaximized));
+        m_settings->setValue(QLatin1String(fullScreenKey), (bool) (windowState() & Qt::WindowFullScreen));
     } else {
-        m_settings->setValue(maxSettingsKey, false);
+        m_settings->setValue(QLatin1String(maxKey), false);
+        m_settings->setValue(QLatin1String(fullScreenKey), false);
         m_settings->setValue(QLatin1String(geometryKey), geometry());
     }
+
     m_settings->endGroup();
 
     m_fileManager->saveRecentFiles();
@@ -1209,7 +1218,7 @@ QPrinter *MainWindow::printer() const
 {
     if (!m_printer)
         m_printer = new QPrinter(QPrinter::HighResolution);
-    return  m_printer;
+    return m_printer;
 }
 
 void MainWindow::setFullScreen(bool on)
diff --git a/src/plugins/debugger/debuggeractions.cpp b/src/plugins/debugger/debuggeractions.cpp
index 43dc44ce7a1ee388f7b866c6fb7cb170dc511436..d0a620c16d24888a2fc979e6c135ea903f48f2fa 100644
--- a/src/plugins/debugger/debuggeractions.cpp
+++ b/src/plugins/debugger/debuggeractions.cpp
@@ -158,7 +158,7 @@ DebuggerSettings *DebuggerSettings::instance()
     instance->insertItem(UseDebuggingHelpers, item);
     item->setDefaultValue(true);
     item->setSettingsKey("DebugMode", "UseDebuggingHelper");
-    item->setText(tr("Use Debugging Helper"));
+    item->setText(tr("Use debugging helper"));
     item->setCheckable(true);
     item->setDefaultValue(true);
 
diff --git a/src/plugins/debugger/gdbengine.cpp b/src/plugins/debugger/gdbengine.cpp
index 317189581026934db4489132bc7c0c2f532b42af..391890c40ebc7d6beb7502b3ef4d607487cfab57 100644
--- a/src/plugins/debugger/gdbengine.cpp
+++ b/src/plugins/debugger/gdbengine.cpp
@@ -103,6 +103,7 @@ enum GdbCommandType
     GdbQuerySources,
     GdbAsyncOutput2,
     GdbStart,
+    GdbExit,
     GdbAttached,
     GdbStubAttached,
     GdbExecRun,
@@ -755,6 +756,9 @@ void GdbEngine::handleResult(const GdbResultRecord & record, int type,
         case GdbInfoThreads:
             handleInfoThreads(record);
             break;
+        case GdbExit:
+            handleExit(record);
+            break;
 
         case GdbShowVersion:
             handleShowVersion(record);
@@ -1167,7 +1171,7 @@ void GdbEngine::handleAsyncOutput(const GdbMi &data)
                 + data.findChild("signal-name").toString();
         }
         q->showStatusMessage(msg);
-        sendCommand("-gdb-exit");
+        sendCommand("-gdb-exit", GdbExit);
         return;
     }
 
@@ -1525,7 +1529,7 @@ void GdbEngine::exitDebugger()
             sendCommand("detach");
         else
             sendCommand("kill");
-        sendCommand("-gdb-exit");
+        sendCommand("-gdb-exit", GdbExit);
         // 20s can easily happen when loading webkit debug information
         m_gdbProc.waitForFinished(20000);
         if (m_gdbProc.state() != QProcess::Running) {
@@ -1797,6 +1801,12 @@ void GdbEngine::handleAttach()
     qq->reloadRegisters();
 }
 
+void GdbEngine::handleExit(const GdbResultRecord &response)
+{
+    Q_UNUSED(response);
+    q->showStatusMessage(tr("Debugger exited."));
+}
+
 void GdbEngine::stepExec()
 {
     setTokenBarrier();
@@ -2210,6 +2220,11 @@ void GdbEngine::extractDataFromInfoBreak(const QString &output, BreakpointData *
     // within namespaces.
     // Sometimes the path is relative too.
 
+    // 2    breakpoint     keep y   <MULTIPLE> 0x0040168e
+    // 2.1    y     0x0040168e in MainWindow::MainWindow(QWidget*) at mainwindow.cpp:7
+    // 2.2    y     0x00401792 in MainWindow::MainWindow(QWidget*) at mainwindow.cpp:7
+
+    // tested in ../../../tests/auto/debugger/
     QRegExp re("MULTIPLE.*(0x[0-9a-f]+) in (.*)\\s+at (.*):([\\d]+)([^\\d]|$)");
     re.setMinimal(true);
 
@@ -2218,6 +2233,10 @@ void GdbEngine::extractDataFromInfoBreak(const QString &output, BreakpointData *
         data->bpFuncName = re.cap(2).trimmed();
         data->bpLineNumber = re.cap(4);
         QString full = fullName(re.cap(3));
+        if (full.isEmpty()) {
+            qDebug() << "NO FULL NAME KNOWN FOR" << re.cap(3);
+            full = re.cap(3); // FIXME: wrong, but prevents recursion
+        }
         data->markerLineNumber = data->bpLineNumber.toInt();
         data->markerFileName = full;
         data->bpFileName = full;
@@ -3400,14 +3419,15 @@ void GdbEngine::handleQueryDebuggingHelper(const GdbResultRecord &record)
         m_availableSimpleDebuggingHelpers.append(item.data());
     if (m_availableSimpleDebuggingHelpers.isEmpty()) {
         m_debuggingHelperState = DebuggingHelperUnavailable;
-        QMessageBox::warning(q->mainWindow(),
-            tr("Cannot find special data dumpers"),
-            tr("The debugged binary does not contain information needed for "
-                    "nice display of Qt data types.\n\n"
-                    "You might want to try including the file\n\n"
-                    ".../share/qtcreator/gdbmacros/gdbmacros.cpp\n\n"
-                    "into your project directly.")
-                );
+        q->showStatusMessage(tr("Debugging helpers not found."));
+        //QMessageBox::warning(q->mainWindow(),
+        //    tr("Cannot find special data dumpers"),
+        //    tr("The debugged binary does not contain information needed for "
+        //            "nice display of Qt data types.\n\n"
+        //            "You might want to try including the file\n\n"
+        //            ".../share/qtcreator/gdbmacros/gdbmacros.cpp\n\n"
+        //            "into your project directly.")
+        //        );
     } else {
         m_debuggingHelperState = DebuggingHelperAvailable;
         q->showStatusMessage(tr("%1 custom dumpers found.")
@@ -4151,10 +4171,10 @@ void GdbEngine::tryLoadDebuggingHelpers()
     QString flag = QString::number(RTLD_NOW);
     sendCommand("sharedlibrary libc"); // for malloc
     sendCommand("sharedlibrary libdl"); // for dlopen
-    sendCommand("call (void)dlopen(\"" + lib + "\", " + flag + ")",
+    sendCommand("call (void*)dlopen(\"" + lib + "\", " + flag + ")",
         WatchDebuggingHelperSetup);
     // some older systems like CentOS 4.6 prefer this:
-    sendCommand("call (void)__dlopen(\"" + lib + "\", " + flag + ")",
+    sendCommand("call (void*)__dlopen(\"" + lib + "\", " + flag + ")",
         WatchDebuggingHelperSetup);
     sendCommand("sharedlibrary " + dotEscape(lib));
 #endif
diff --git a/src/plugins/debugger/gdbengine.h b/src/plugins/debugger/gdbengine.h
index aebb5da6373ad95f508c4a944fe4adf162330988..44afa4e73a1c1adfe8b7d46361cf688401bcb87d 100644
--- a/src/plugins/debugger/gdbengine.h
+++ b/src/plugins/debugger/gdbengine.h
@@ -199,6 +199,7 @@ private:
     void handleQueryPwd(const GdbResultRecord &response);
     void handleQuerySources(const GdbResultRecord &response);
     void handleTargetCore(const GdbResultRecord &response);
+    void handleExit(const GdbResultRecord &response);
     void debugMessage(const QString &msg);
     QString dumperLibraryName() const;
 
diff --git a/src/plugins/debugger/watchhandler.cpp b/src/plugins/debugger/watchhandler.cpp
index 42e42f5f0b6dbfbdbf9058128287fce22a3d7ab0..eea64c4bca088be0696558955f8689780691e217 100644
--- a/src/plugins/debugger/watchhandler.cpp
+++ b/src/plugins/debugger/watchhandler.cpp
@@ -932,7 +932,6 @@ QString WatchHandler::watcherName(const QString &exp)
 void WatchHandler::watchExpression(const QString &exp)
 {
     // FIXME: 'exp' can contain illegal characters
-    //MODEL_DEBUG("WATCH: " << exp);
     m_watchers[exp] = watcherCounter++;
     WatchData data;
     data.exp = exp;
diff --git a/src/plugins/debugger/watchwindow.cpp b/src/plugins/debugger/watchwindow.cpp
index f6e2fd01cb831ffe6efd1398af0ca399fddfc5ec..71ac3bb1e6ca47b297da0b22fe59c1ec1ec08d02 100644
--- a/src/plugins/debugger/watchwindow.cpp
+++ b/src/plugins/debugger/watchwindow.cpp
@@ -96,7 +96,7 @@ public:
         } else if (index.column() == 0) {
             // the watcher name column
             theDebuggerAction(RemoveWatchExpression)->trigger(exp);
-            theDebuggerAction(WatchExpression)->trigger(lineEdit->text());
+            theDebuggerAction(WatchExpression)->trigger(value);
         }
     }
 
@@ -175,8 +175,6 @@ void WatchWindow::contextMenuEvent(QContextMenuEvent *ev)
     QModelIndex idx = indexAt(ev->pos());
     QModelIndex mi0 = idx.sibling(idx.row(), 0);
     QString exp = model()->data(mi0).toString();
-    QModelIndex mi1 = idx.sibling(idx.row(), 0);
-    QString value = model()->data(mi1).toString();
 
     menu.addSeparator();
     int type = (m_type == LocalsType) ? WatchExpression : RemoveWatchExpression;
diff --git a/src/plugins/fakevim/README b/src/plugins/fakevim/README
new file mode 100644
index 0000000000000000000000000000000000000000..f901e5984a0c141854bf2b4735e076f66023fd8e
--- /dev/null
+++ b/src/plugins/fakevim/README
@@ -0,0 +1,14 @@
+
+
+fakevim is based on eventFilters installed on a QTextEdit or a QPlainTextEdit.
+It basically catches all keystrokes and modifies some internal state that
+make the resulting text in the editor look like it was using vim.
+
+There are only a few files in here:
+
+  fakevimplugin.{h,cpp}  - interaction with the rest of Creator
+  fakevimactions.{h,cpp} - settings
+  fakevimhandler.{h,cpp} - the "real" event
+
+There are some more hints for developers in fakevimhandler.cpp
+
diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp
index 50385d9c6ac572d57f6b9aa29278f936e723a922..e18599d70727ce18101da23738fb1d064b03a7ca 100644
--- a/src/plugins/fakevim/fakevimhandler.cpp
+++ b/src/plugins/fakevim/fakevimhandler.cpp
@@ -29,28 +29,33 @@
 
 #include "fakevimhandler.h"
 
-// Please do not add any direct dependencies to other Qt Creator code  here.
-// Instead emit signals and let the FakeVimPlugin channel the information to
-// Qt Creator. The idea is to keep this file here in a "clean" state that
-// allows easy reuse with any QTextEdit or QPlainTextEdit derived class.
-
-
-// Some conventions:
 //
-// Use 1 based line numbers and 0 based column numbers. Even though
-// the 1 based line are not nice it matches vim's and QTextEdit's 'line'
-// concepts.
+// ATTENTION:
+//
+// 1 Please do not add any direct dependencies to other Qt Creator code here.
+//   Instead emit signals and let the FakeVimPlugin channel the information to
+//   Qt Creator. The idea is to keep this file here in a "clean" state that
+//   allows easy reuse with any QTextEdit or QPlainTextEdit derived class.
+//
+// 2 There are a few auto tests located in ../../../tests/auto/fakevim.
+//   Commands that are covered there are marked as "// tested" below.
+//
+// 3 Some conventions:
 //
-// Do not pass QTextCursor etc around unless really needed. Convert
-// early to  line/column.
+//   Use 1 based line numbers and 0 based column numbers. Even though
+//   the 1 based line are not nice it matches vim's and QTextEdit's 'line'
+//   concepts.
 //
-// There is always a "current" cursor (m_tc). A current "region of interest"
-// spans between m_anchor (== anchor()) and  m_tc.position() (== position())
-// The value of m_tc.anchor() is not used.
+//   Do not pass QTextCursor etc around unless really needed. Convert
+//   early to  line/column.
+//
+//   There is always a "current" cursor (m_tc). A current "region of interest"
+//   spans between m_anchor (== anchor()) and  m_tc.position() (== position())
+//   The value of m_tc.anchor() is not used.
+// 
 
 #include <utils/qtcassert.h>
 
-
 #include <QtCore/QDebug>
 #include <QtCore/QFile>
 #include <QtCore/QObject>
@@ -278,7 +283,7 @@ public:
     typedef QTextCursor::MoveOperation MoveOperation;
     typedef QTextCursor::MoveMode MoveMode;
     void moveToEndOfDocument() { m_tc.movePosition(EndOfDocument, MoveAnchor); }
-    void moveToStartOfLine() { m_tc.movePosition(StartOfLine, MoveAnchor); }
+    void moveToStartOfLine();
     void moveToEndOfLine();
     void moveUp(int n = 1) { moveDown(-n); }
     void moveDown(int n = 1); // { m_tc.movePosition(Down, MoveAnchor, n); }
@@ -353,6 +358,8 @@ public:
 
     // extra data for '.'
     void replay(const QString &text, int count);
+    void setDotCommand(const QString &cmd) { m_dotCommand = cmd; }
+    void setDotCommand(const QString &cmd, int n) { m_dotCommand = cmd.arg(n); }
     QString m_dotCommand;
     bool m_inReplay; // true if we are executing a '.'
 
@@ -613,8 +620,9 @@ void FakeVimHandler::Private::moveDown(int n)
     m_tc.movePosition(Down, MoveAnchor, n);
 #else
     const int col = m_tc.position() - m_tc.block().position();
-    const int line = m_tc.block().blockNumber();
-    const QTextBlock &block = m_tc.document()->findBlockByNumber(line + n);
+    const int lastLine = m_tc.document()->lastBlock().blockNumber();
+    const int targetLine = qMax(0, qMin(lastLine, m_tc.block().blockNumber() + n));
+    const QTextBlock &block = m_tc.document()->findBlockByNumber(targetLine);
     const int pos = block.position();
     setPosition(pos + qMin(block.length() - 1, col));
     moveToTargetColumn();
@@ -632,6 +640,17 @@ void FakeVimHandler::Private::moveToEndOfLine()
 #endif
 }
 
+void FakeVimHandler::Private::moveToStartOfLine()
+{
+#if 0
+    // does not work for "hidden" documents like in the autotests
+    m_tc.movePosition(StartOfLine, MoveAnchor);
+#else
+    const QTextBlock &block = m_tc.block();
+    setPosition(block.position());
+#endif
+}
+
 void FakeVimHandler::Private::finishMovement(const QString &dotCommand)
 {
     //qDebug() << "ANCHOR: " << position() << anchor();
@@ -656,7 +675,7 @@ void FakeVimHandler::Private::finishMovement(const QString &dotCommand)
         if (anchor() >= position())
            m_anchor++;
         if (!dotCommand.isEmpty())
-            m_dotCommand = "c" + dotCommand;
+            setDotCommand("c" + dotCommand);
         QString text = removeSelectedText();
         //qDebug() << "CHANGING TO INSERT MODE" << text;
         m_registers[m_register] = text;
@@ -668,7 +687,7 @@ void FakeVimHandler::Private::finishMovement(const QString &dotCommand)
         if (anchor() >= position())
            m_anchor++;
         if (!dotCommand.isEmpty())
-            m_dotCommand = "d" + dotCommand;
+            setDotCommand("d" + dotCommand);
         m_registers[m_register] = removeSelectedText();
         m_submode = NoSubMode;
         if (atEndOfLine())
@@ -694,8 +713,6 @@ void FakeVimHandler::Private::finishMovement(const QString &dotCommand)
         updateMiniBuffer();
     }
 
-    moveToTargetColumn();
-
     m_moveType = MoveInclusive;
     m_mvcount.clear();
     m_opcount.clear();
@@ -847,13 +864,19 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
     } else if (m_submode == RegisterSubMode) {
         m_register = key;
         m_submode = NoSubMode;
-    } else if (m_submode == ChangeSubMode && key == 'c') {
-        moveToStartOfLine();
+    } else if (m_submode == ChangeSubMode && key == 'c') { // tested
+        moveDown(count() - 1);
+        moveToEndOfLine();
+        moveLeft();
         setAnchor();
-        moveDown(count());
+        moveToStartOfLine();
+        setTargetColumn();
+        moveUp(count() - 1);
         m_moveType = MoveLineWise;
-        finishMovement("c");
-    } else if (m_submode == DeleteSubMode && key == 'd') {
+        m_lastInsertion.clear();
+        setDotCommand("%1cc", count());
+        finishMovement();
+    } else if (m_submode == DeleteSubMode && key == 'd') { // tested
         moveToStartOfLine();
         setAnchor();
         moveDown(count());
@@ -869,19 +892,19 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
         setAnchor();
         moveDown(count() - 1);
         m_moveType = MoveLineWise;
-        m_dotCommand = QString("%1<<").arg(count());
+        setDotCommand("%1<<", count());
         finishMovement();
     } else if (m_submode == ShiftRightSubMode && key == '>') {
         setAnchor();
         moveDown(count() - 1);
         m_moveType = MoveLineWise;
-        m_dotCommand = QString("%1>>").arg(count());
+        setDotCommand("%1>>", count());
         finishMovement();
     } else if (m_submode == IndentSubMode && key == '=') {
         setAnchor();
         moveDown(count() - 1);
         m_moveType = MoveLineWise;
-        m_dotCommand = QString("%1>>").arg(count());
+        setDotCommand("%1>>", count());
         finishMovement();
     } else if (m_submode == ZSubMode) {
         //qDebug() << "Z_MODE " << cursorLineInDocument() << linesOnScreen();
@@ -928,7 +951,7 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
             m_tc.insertText(QString(count(), text.at(0)));
             m_moveType = MoveExclusive;
             m_submode = NoSubMode;
-            m_dotCommand = QString("%1r%2").arg(count()).arg(text);
+            setDotCommand("%1r" + text, count());
             finishMovement();
         } else {
             m_submode = NoSubMode;
@@ -1125,7 +1148,7 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
         handleStartOfLine();
         scrollToLineInDocument(cursorLineInDocument() - sline);
         finishMovement();
-    } else if (key == 'e') {
+    } else if (key == 'e') { // tested
         m_moveType = MoveInclusive;
         moveToWordBoundary(false, true);
         finishMovement();
@@ -1175,13 +1198,13 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
         handleStartOfLine();
         finishMovement();
     } else if (key == 'i') {
-        m_dotCommand = "i"; //QString("%1i").arg(count());
+        setDotCommand("i"); // setDotCommand("%1i", count());
         enterInsertMode();
         updateMiniBuffer();
         if (atEndOfLine())
             moveLeft();
     } else if (key == 'I') {
-        m_dotCommand = "I"; //QString("%1I").arg(count());
+        setDotCommand("I"); // setDotCommand("%1I", count());
         enterInsertMode();
         if (m_gflag)
             moveToStartOfLine();
@@ -1256,7 +1279,7 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
         search(lastSearchString(), !m_lastSearchForward);
         recordJump();
     } else if (key == 'o' || key == 'O') {
-        m_dotCommand = QString("%1o").arg(count());
+        setDotCommand("%1o", count());
         enterInsertMode();
         moveToFirstNonBlankOnLine();
         if (key == 'O')
@@ -1293,18 +1316,18 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
                 moveLeft();
             }
         }
-        m_dotCommand = QString("%1p").arg(count());
+        setDotCommand("%1p", count());
         finishMovement();
     } else if (key == 'r') {
         m_submode = ReplaceSubMode;
-        m_dotCommand = "r";
+        setDotCommand("r");
     } else if (key == 'R') {
         // FIXME: right now we repeat the insertion count() times,
         // but not the deletion
         m_lastInsertion.clear();
         m_mode = InsertMode;
         m_submode = ReplaceSubMode;
-        m_dotCommand = "R";
+        setDotCommand("R");
     } else if (key == control('r')) {
         redo();
     } else if (key == 's') {
@@ -1313,7 +1336,7 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
         setAnchor();
         moveRight(qMin(count(), rightDist()));
         m_registers[m_register] = removeSelectedText();
-        m_dotCommand = "s"; //QString("%1s").arg(count());
+        setDotCommand("s"); // setDotCommand("%1s", count());
         m_opcount.clear();
         m_mvcount.clear();
         enterInsertMode();
@@ -1340,7 +1363,7 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
         enterVisualMode(VisualLineMode);
     } else if (key == control('v')) {
         enterVisualMode(VisualBlockMode);
-    } else if (key == 'w') {
+    } else if (key == 'w') { // tested
         // Special case: "cw" and "cW" work the same as "ce" and "cE" if the
         // cursor is on a non-blank.
         if (m_submode == ChangeSubMode) {
@@ -1369,7 +1392,7 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
         setAnchor();
         m_submode = DeleteSubMode;
         moveRight(qMin(count(), rightDist()));
-        m_dotCommand = QString("%1x").arg(count());
+        setDotCommand("%1x", count());
         finishMovement();
     } else if (key == 'X') {
         if (leftDist() > 0) {
@@ -1957,16 +1980,16 @@ void FakeVimHandler::Private::highlightMatches(const QString &needle0)
 
 void FakeVimHandler::Private::moveToFirstNonBlankOnLine()
 {
-    QTextBlock block = m_tc.block();
     QTextDocument *doc = m_tc.document();
-    m_tc.movePosition(StartOfLine, KeepAnchor);
-    int firstPos = m_tc.position();
+    const QTextBlock &block = m_tc.block();
+    int firstPos = block.position();
     for (int i = firstPos, n = firstPos + block.length(); i < n; ++i) {
         if (!doc->characterAt(i).isSpace()) {
-            m_tc.setPosition(i, KeepAnchor);
+            setPosition(i);
             return;
         }
     }
+    setPosition(block.position());
 }
 
 void FakeVimHandler::Private::indentRegion(QChar typedChar)
@@ -1978,7 +2001,7 @@ void FakeVimHandler::Private::indentRegion(QChar typedChar)
         qSwap(beginLine, endLine);
     int amount = 0;
     emit q->indentRegion(&amount, beginLine, endLine, typedChar);
-    m_dotCommand = QString("%1==").arg(endLine - beginLine + 1);
+    setDotCommand("%1==", endLine - beginLine + 1);
 }
 
 void FakeVimHandler::Private::shiftRegionRight(int repeat)
@@ -2000,7 +2023,7 @@ void FakeVimHandler::Private::shiftRegionRight(int repeat)
 
     setPosition(firstPos);
     moveToFirstNonBlankOnLine();
-    m_dotCommand = QString("%1>>").arg(endLine - beginLine + 1);
+    setDotCommand("%1>>", endLine - beginLine + 1);
 }
 
 void FakeVimHandler::Private::shiftRegionLeft(int repeat)
@@ -2037,17 +2060,20 @@ void FakeVimHandler::Private::shiftRegionLeft(int repeat)
 
     setPosition(firstPos);
     moveToFirstNonBlankOnLine();
-    m_dotCommand = QString("%1<<").arg(endLine - beginLine + 1);
+    setDotCommand("%1<<", endLine - beginLine + 1);
 }
 
 void FakeVimHandler::Private::moveToTargetColumn()
 {
-    if (m_targetColumn == -1 || m_tc.block().length() <= m_targetColumn) {
-        const QTextBlock &block = m_tc.block();
+    const QTextBlock &block = m_tc.block();
+    int col = m_tc.position() - m_tc.block().position();
+    if (col == m_targetColumn)
+        return;
+    //qDebug() << "CORRECTING COLUMN FROM: " << col << "TO" << m_targetColumn;
+    if (m_targetColumn == -1 || m_tc.block().length() <= m_targetColumn)
         m_tc.setPosition(block.position() + block.length() - 1, KeepAnchor);
-    } else {
+    else
         m_tc.setPosition(m_tc.block().position() + m_targetColumn, KeepAnchor);
-    }
 }
 
 /* if simple is given:
@@ -2075,7 +2101,7 @@ void FakeVimHandler::Private::moveToWordBoundary(bool simple, bool forward)
     int lastClass = -1;
     while (true) {
         QChar c = doc->characterAt(m_tc.position() + (forward ? 1 : -1));
-        qDebug() << "EXAMINING: " << c << " AT " << position();
+        //qDebug() << "EXAMINING: " << c << " AT " << position();
         int thisClass = charClass(c, simple);
         if (thisClass != lastClass && lastClass != 0)
             --repeat;
@@ -2319,6 +2345,7 @@ QString FakeVimHandler::Private::removeSelectedText()
     m_tc.setPosition(pos, KeepAnchor);
     QString from = m_tc.selection().toPlainText();
     m_tc.removeSelectedText();
+    setAnchor();
     return from;
 }
 
diff --git a/src/plugins/qt4projectmanager/showbuildlog.ui b/src/plugins/qt4projectmanager/showbuildlog.ui
index 98c61b360e7d1b59c27b4bdc748d742365c5bee0..5b31a76861cae86015ba20b776c6d28ebabebce4 100644
--- a/src/plugins/qt4projectmanager/showbuildlog.ui
+++ b/src/plugins/qt4projectmanager/showbuildlog.ui
@@ -11,7 +11,7 @@
    </rect>
   </property>
   <property name="windowTitle">
-   <string>Dialog</string>
+   <string>Debugging Helper Build Log</string>
   </property>
   <layout class="QVBoxLayout" name="verticalLayout">
    <item>
diff --git a/src/plugins/texteditor/basetextdocument.cpp b/src/plugins/texteditor/basetextdocument.cpp
index 7106b03550eae43ee4b19fbcbe8e24641f9bdd5f..665dd5617aa72dcc61c2c067545eae7ce6f3947c 100755
--- a/src/plugins/texteditor/basetextdocument.cpp
+++ b/src/plugins/texteditor/basetextdocument.cpp
@@ -47,7 +47,11 @@
 
 using namespace TextEditor;
 
+#if defined (Q_OS_WIN)
+QT_BEGIN_NAMESPACE
 extern Q_CORE_EXPORT int qt_ntfs_permission_lookup;
+QT_END_NAMESPACE
+#endif
 
 #if defined (Q_OS_WIN)
 # define NATIVE_LINE_TERMINATOR CRLFLineTerminator
@@ -145,14 +149,14 @@ bool BaseTextDocument::isReadOnly() const
 
     const QFileInfo fi(m_fileName);
 
-#ifdef Q_OS_WIN32
+#ifdef Q_OS_WIN
     // Check for permissions on NTFS file systems
     qt_ntfs_permission_lookup++;
 #endif
 
     const bool ro = !fi.isWritable();
 
-#ifdef Q_OS_WIN32
+#ifdef Q_OS_WIN
     qt_ntfs_permission_lookup--;
 #endif
     return ro;
@@ -171,10 +175,7 @@ bool BaseTextDocument::open(const QString &fileName)
         m_fileName = fi.absoluteFilePath();
 
         QFile file(fileName);
-        if (!file.exists())
-            return false;
-
-        if (!file.open(QIODevice::ReadWrite) && !file.open(QIODevice::ReadOnly))
+        if (!file.open(QIODevice::ReadOnly))
             return false;
 
         title = fi.fileName();
diff --git a/src/shared/proparser/profileevaluator.cpp b/src/shared/proparser/profileevaluator.cpp
index 19041d7bb77cb884663dfa89704630e98abb2d5e..1313f7c0306a6cf32f48d98fda9d309a5cc8c3d6 100644
--- a/src/shared/proparser/profileevaluator.cpp
+++ b/src/shared/proparser/profileevaluator.cpp
@@ -151,6 +151,8 @@ public:
     QString m_pendingComment;
     bool m_syntaxError;
     bool m_contNextLine;
+    bool m_inQuote;
+    int m_parens;
 
     /////////////// Evaluating pro file contents
 
@@ -251,6 +253,8 @@ bool ProFileEvaluator::Private::read(ProFile *pro)
     // Parser state
     m_block = 0;
     m_commentItem = 0;
+    m_inQuote = false;
+    m_parens = 0;
     m_contNextLine = false;
     m_syntaxError = false;
     m_lineNo = 1;
@@ -274,71 +278,83 @@ bool ProFileEvaluator::Private::parseLine(const QString &line0)
     if (m_blockstack.isEmpty())
         return false;
 
-    ushort quote = 0;
-    int parens = 0;
-    bool contNextLine = false;
+    int parens = m_parens;
+    bool inQuote = m_inQuote;
+    bool escaped = false;
     QString line = line0.simplified();
 
     for (int i = 0; !m_syntaxError && i < line.length(); ++i) {
         ushort c = line.at(i).unicode();
-        if (quote && c == quote)
-            quote = 0;
-        else if (c == '(')
-            ++parens;
-        else if (c == ')')
-            --parens;
-        else if (c == '"' && (i == 0 || line.at(i - 1).unicode() != '\\'))
-            quote = c;
-        else if (!parens && !quote) {
-            if (c == '#') {
-                insertComment(line.mid(i + 1));
-                contNextLine = m_contNextLine;
-                break;
-            }
-            if (c == '\\' && i >= line.count() - 1) {
-                updateItem();
-                contNextLine = true;
-                continue;
-            }
-            if (m_block && (m_block->blockKind() & ProBlock::VariableKind)) {
-                if (c == ' ')
-                    updateItem();
-                else
-                    m_proitem += c;
-                continue;
-            }
-            if (c == ':') {
-                enterScope(false);
-                continue;
-            }
-            if (c == '{') {
-                enterScope(true);
-                continue;
-            }
-            if (c == '}') {
-                leaveScope();
+        if (c == '#') { // Yep - no escaping possible
+            insertComment(line.mid(i + 1));
+            escaped = m_contNextLine;
+            break;
+        }
+        if (!escaped) {
+            if (c == '\\') {
+                escaped = true;
+                m_proitem += c;
                 continue;
-            }
-            if (c == '=') {
-                insertVariable(line, &i);
+            } else if (c == '"') {
+                inQuote = !inQuote;
+                m_proitem += c;
                 continue;
             }
-            if (c == '|' || c == '!') {
-                insertOperator(c);
-                continue;
+        } else {
+            escaped = false;
+        }
+        if (!inQuote) {
+            if (c == '(') {
+                ++parens;
+            } else if (c == ')') {
+                --parens;
+            } else if (!parens) {
+                if (m_block && (m_block->blockKind() & ProBlock::VariableKind)) {
+                    if (c == ' ')
+                        updateItem();
+                    else
+                        m_proitem += c;
+                    continue;
+                }
+                if (c == ':') {
+                    enterScope(false);
+                    continue;
+                }
+                if (c == '{') {
+                    enterScope(true);
+                    continue;
+                }
+                if (c == '}') {
+                    leaveScope();
+                    continue;
+                }
+                if (c == '=') {
+                    insertVariable(line, &i);
+                    continue;
+                }
+                if (c == '|' || c == '!') {
+                    insertOperator(c);
+                    continue;
+                }
             }
         }
 
         m_proitem += c;
     }
-    m_contNextLine = contNextLine;
-
-    if (!m_syntaxError) {
-        updateItem();
-        if (!m_contNextLine)
-            finalizeBlock();
+    m_inQuote = inQuote;
+    m_parens = parens;
+    m_contNextLine = escaped;
+    if (escaped) {
+        m_proitem.chop(1);
+        return true;
+    } else {
+        if (!m_syntaxError) {
+            updateItem();
+            if (!m_contNextLine)
+                finalizeBlock();
+        }
+        return !m_syntaxError;
     }
-    return !m_syntaxError;
 }
 
 void ProFileEvaluator::Private::finalizeBlock()
@@ -357,6 +373,9 @@ void ProFileEvaluator::Private::insertVariable(const QString &line, int *i)
 {
     ProVariable::VariableOperator opkind;
 
+    if (m_proitem.isEmpty()) // Line starting with '=', like a conflict marker
+        return;
+
     switch (m_proitem.at(m_proitem.length() - 1).unicode()) {
         case '+':
             m_proitem.chop(1);
@@ -636,11 +655,11 @@ bool ProFileEvaluator::Private::visitBeginProFile(ProFile * pro)
             evaluateFile(mkspecDirectory + QLatin1String("/default/qmake.conf"), &ok);
             evaluateFile(mkspecDirectory + QLatin1String("/features/default_pre.prf"), &ok);
 
-            QStringList tmp = m_valuemap.value("CONFIG");
+            QStringList tmp = m_valuemap.value(QLatin1String("CONFIG"));
             tmp.append(m_addUserConfigCmdArgs);
             foreach(const QString &remove, m_removeUserConfigCmdArgs)
                 tmp.removeAll(remove);
-            m_valuemap.insert("CONFIG", tmp);
+            m_valuemap.insert(QLatin1String("CONFIG"), tmp);
             m_cumulative = cumulative;
         }
 
@@ -2021,7 +2040,13 @@ ProFile *ProFileEvaluator::parsedProFile(const QString &fileName)
 {
     QFileInfo fi(fileName);
     if (fi.exists()) {
-        ProFile *pro = new ProFile(fi.absoluteFilePath());
+        QString fn = QDir::cleanPath(fi.absoluteFilePath());
+        foreach (const ProFile *pf, d->m_profileStack)
+            if (pf->fileName() == fn) {
+                errorMessage(d->format("circular inclusion of %1").arg(fn));
+                return 0;
+            }
+        ProFile *pro = new ProFile(fn);
         if (d->read(pro))
             return pro;
         delete pro;
diff --git a/src/tools/qpatch/files-to-patch-linux b/src/tools/qpatch/files-to-patch-linux
index 8fa0394d0b319e7ff0520f01ed2e2d682bf85fdd..da166075843ea60c10c916dd63d7c66aa41e3459 100644
--- a/src/tools/qpatch/files-to-patch-linux
+++ b/src/tools/qpatch/files-to-patch-linux
@@ -235,26 +235,26 @@ examples/xml/xmlstreamlint/xmlstreamlint
 examples/xmlpatterns/filetree/filetree
 examples/xmlpatterns/qobjectxmlmodel/qobjectxmlmodel
 examples/xmlpatterns/recipes/recipes
-lib/libQt3Support.so.4.5.0
-lib/libQtAssistantClient.so.4.5.0
-lib/libQtCLucene.so.4.5.0
-lib/libQtCore.so.4.5.0
-lib/libQtDBus.so.4.5.0
-lib/libQtDesigner.so.4.5.0
-lib/libQtDesignerComponents.so.4.5.0
-lib/libQtGui.so.4.5.0
-lib/libQtHelp.so.4.5.0
-lib/libQtNetwork.so.4.5.0
-lib/libQtOpenGL.so.4.5.0
-lib/libQtScript.so.4.5.0
-lib/libQtScriptTools.so.4.5.0
-lib/libQtSql.so.4.5.0
-lib/libQtSvg.so.4.5.0
-lib/libQtTest.so.4.5.0
+lib/libQt3Support.so.4.5.1
+lib/libQtAssistantClient.so.4.5.1
+lib/libQtCLucene.so.4.5.1
+lib/libQtCore.so.4.5.1
+lib/libQtDBus.so.4.5.1
+lib/libQtDesigner.so.4.5.1
+lib/libQtDesignerComponents.so.4.5.1
+lib/libQtGui.so.4.5.1
+lib/libQtHelp.so.4.5.1
+lib/libQtNetwork.so.4.5.1
+lib/libQtOpenGL.so.4.5.1
+lib/libQtScript.so.4.5.1
+lib/libQtScriptTools.so.4.5.1
+lib/libQtSql.so.4.5.1
+lib/libQtSvg.so.4.5.1
+lib/libQtTest.so.4.5.1
 lib/libQtUiTools.a
-lib/libQtWebKit.so.4.5.0
-lib/libQtXml.so.4.5.0
-lib/libQtXmlPatterns.so.4.5.0
+lib/libQtWebKit.so.4.5.1
+lib/libQtXml.so.4.5.1
+lib/libQtXmlPatterns.so.4.5.1
 plugins/accessible/libqtaccessiblecompatwidgets.so
 plugins/accessible/libqtaccessiblewidgets.so
 plugins/codecs/libqcncodecs.so
diff --git a/tests/auto/debugger/main.cpp b/tests/auto/debugger/main.cpp
index 13ece24e546c4eb56a9530658c3736f5cd4d88c6..4e7eeeeb61fa34ae6daa528a1f968890c98a6869 100644
--- a/tests/auto/debugger/main.cpp
+++ b/tests/auto/debugger/main.cpp
@@ -79,6 +79,9 @@ private slots:
     void mi10() { testMi(test10); }
     void mi11() { testMi(test11); }
     void mi12() { testMi(test12); }
+
+    void infoBreak();
+
     void runQtc();
 
 public slots:
@@ -100,6 +103,41 @@ static QByteArray stripped(QByteArray ba)
     return ba;
 }
 
+
+void tst_Debugger::infoBreak()
+{
+    // This tests the regular expression used in GdbEngine::extractDataFromInfoBreak 
+    // to discover breakpoints in constructors.
+
+    // Copied from gdbengine.cpp:
+
+    QRegExp re("MULTIPLE.*(0x[0-9a-f]+) in (.*)\\s+at (.*):([\\d]+)([^\\d]|$)");
+    re.setMinimal(true);
+
+    QCOMPARE(re.indexIn(
+        "2       breakpoint     keep y   <MULTIPLE> 0x0040168e\n"
+        "2.1                         y     0x0040168e "
+            "in MainWindow::MainWindow(QWidget*) at mainwindow.cpp:7\n"
+        "2.2                         y     0x00401792 "
+            "in MainWindow::MainWindow(QWidget*) at mainwindow.cpp:7\n"), 33);
+    QCOMPARE(re.cap(1), QString("0x0040168e"));
+    QCOMPARE(re.cap(2).trimmed(), QString("MainWindow::MainWindow(QWidget*)"));
+    QCOMPARE(re.cap(3), QString("mainwindow.cpp"));
+    QCOMPARE(re.cap(4), QString("7"));
+
+
+    QCOMPARE(re.indexIn(
+        "Num     Type           Disp Enb Address            What"
+        "4       breakpoint     keep y   <MULTIPLE>         0x00000000004066ad"
+        "4.1                         y     0x00000000004066ad in CTorTester"
+        " at /main/tests/manual/gdbdebugger/simple/app.cpp:124"), 88);
+
+    QCOMPARE(re.cap(1), QString("0x00000000004066ad"));
+    QCOMPARE(re.cap(2).trimmed(), QString("CTorTester"));
+    QCOMPARE(re.cap(3), QString("/main/tests/manual/gdbdebugger/simple/app.cpp"));
+    QCOMPARE(re.cap(4), QString("124"));
+}
+
 void tst_Debugger::readStandardOutput()
 {
     qDebug() << "qtcreator-out: " << stripped(m_proc.readAllStandardOutput());
diff --git a/tests/auto/fakevim/main.cpp b/tests/auto/fakevim/main.cpp
index a1ac3be78265bab1bb126840b88fa96b29401907..fd5b06f0931b6c168e60a07cff90df3796e260f8 100644
--- a/tests/auto/fakevim/main.cpp
+++ b/tests/auto/fakevim/main.cpp
@@ -55,13 +55,17 @@ public slots:
     void changeExtraInformation(const QString &info) { m_infoMessage = info; }
     
 private slots:
-    void commandDollar();
-    void commandDown();
-    void commandLeft();
-    void commandRight();
-    void commandI();
-    void commandUp();
-    void commandW();
+    // command mode
+    void command_cc();
+    void command_dd();
+    void command_dollar();
+    void command_down();
+    void command_e();
+    void command_i();
+    void command_left();
+    void command_right();
+    void command_up();
+    void command_w();
 
 private:
     void setup();    
@@ -73,6 +77,9 @@ private:
         const char* file, int line);
     QString insertCursor(const QString &needle0);
 
+    QString lmid(int i, int n = -1) const
+        { return QStringList(l.mid(i, n)).join("\n"); }
+
     QTextEdit *m_textedit;
     QPlainTextEdit *m_plaintextedit;
     FakeVimHandler *m_handler;
@@ -82,6 +89,8 @@ private:
     QString m_statusData;
     QString m_infoMessage;
 
+    // the individual lines
+    static const QStringList l; // identifier intentionally kept short
     static const QString lines;
     static const QString escape;
 };
@@ -100,8 +109,11 @@ const QString tst_FakeVim::lines =
     "    return app.exec();\n"
     "}\n";
 
+const QStringList tst_FakeVim::l = tst_FakeVim::lines.split('\n');
+
 const QString tst_FakeVim::escape = QChar(27);
 
+
 tst_FakeVim::tst_FakeVim(bool usePlainTextEdit)
 {
     if (usePlainTextEdit) {
@@ -170,16 +182,16 @@ bool tst_FakeVim::checkContentsHelper(QString want, const char* file, int line)
     QStringList wantlist = want.split('\n');
     QStringList gotlist = got.split('\n');
     if (!QTest::qCompare(gotlist.size(), wantlist.size(), "", "", file, line)) {
-        qDebug() << "WANT: " << want;
-        qDebug() << "GOT: " << got;
+        qDebug() << "0 WANT: " << want;
+        qDebug() << "0 GOT: " << got;
         return false;
     }
     for (int i = 0; i < wantlist.size() && i < gotlist.size(); ++i) {
         QString g = QString("line %1: %2").arg(i + 1).arg(gotlist.at(i));
         QString w = QString("line %1: %2").arg(i + 1).arg(wantlist.at(i));
         if (!QTest::qCompare(g, w, "", "", file, line)) {
-            qDebug() << "WANT: " << want;
-            qDebug() << "GOT: " << got;
+            qDebug() << "1 WANT: " << want;
+            qDebug() << "1 GOT: " << got;
             return false;
         }
     }
@@ -222,11 +234,78 @@ QString tst_FakeVim::insertCursor(const QString &needle0)
     needle.remove('@');
     QString lines0 = lines;
     int pos = lines0.indexOf(needle);
+    if (pos == -1)
+        qDebug() << "Cannot find: \n----\n" + needle + "\n----\n";
     lines0.replace(pos, needle.size(), needle0);
     return lines0;
 }
 
-void tst_FakeVim::commandI()
+
+//////////////////////////////////////////////////////////////////////////
+//
+// Command mode
+//
+//////////////////////////////////////////////////////////////////////////
+
+void tst_FakeVim::command_cc()
+{
+    setup();
+    move("j",                "@" + l[1]);
+    check("ccabc" + escape,  l[0] + "\nab@c\n" + lmid(2));
+    check("ccabc" + escape,  l[0] + "\nab@c\n" + lmid(2));
+    check(".",               l[0] + "\nab@c\n" + lmid(2));
+    check("j",               l[0] + "\nabc\n#i@nclude <QtGui>\n" + lmid(3));
+    check("3ccxyz" + escape, l[0] + "\nabc\nxy@z\n" + lmid(5));
+}
+
+void tst_FakeVim::command_dd()
+{
+    setup();
+    move("j",    "@" + l[1]);
+    check("dd",  l[0] + "\n@" + lmid(2));
+    check(".",   l[0] + "\n@" + lmid(3));
+    check("3dd", l[0] + "\n@" + lmid(6));
+}
+
+void tst_FakeVim::command_dollar()
+{
+    setup();
+    move("j$", "<QtCore>@");
+    move("j$", "<QtGui>@");
+    move("2j", ")@");
+}
+
+void tst_FakeVim::command_down()
+{
+    setup();
+    move("j",  "@" + l[1]);
+    move("3j", "@int main");
+    move("4j", "@    return app.exec()");
+}
+
+void tst_FakeVim::command_e()
+{
+    setup();
+    move("e",  "@#include <QtCore");
+    move("e",  "#includ@e <QtCore");
+    move("e",  "#include @<QtCore");
+    move("3e", "@#include <QtGui");
+    move("e",  "#includ@e <QtGui");
+    move("e",  "#include @<QtGui");
+    move("e",  "#include <QtGu@i");
+    move("4e", "int main@(int argc, char *argv[])");
+    move("e",  "int main(in@t argc, char *argv[])");
+    move("e",  "int main(int arg@c, char *argv[])");
+    move("e",  "int main(int argc@, char *argv[])");
+    move("e",  "int main(int argc, cha@r *argv[])");
+    move("e",  "int main(int argc, char @*argv[])");
+    move("e",  "int main(int argc, char *arg@v[])");
+    move("e",  "int main(int argc, char *argv[]@)");
+    move("e",  "@{");
+    move("10k","@\n"); // home.
+}
+
+void tst_FakeVim::command_i()
 {
     setup();
 
@@ -255,31 +334,18 @@ return;
     check("u", "@" + lines);
 }
 
-void tst_FakeVim::commandDollar()
+void tst_FakeVim::command_left()
 {
     setup();
-    move("j$", "<QtCore>@");
-    move("j$", "<QtGui>@");
-    move("2j", ")@");
-}
-
-void tst_FakeVim::commandDown()
-{
-    setup();
-    move("j",  "@#include <QtCore");
-    move("3j", "@int main");
-    move("4j", "@    return app.exec()");
-}
-
-void tst_FakeVim::commandUp()
-{
-    setup();
-    move("j", "@#include <QtCore");
-    move("3j", "@int main");
-    move("4j", "@    return app.exec()");
+    move("4j",  "@int main");
+    move("h",   "@int main"); // no move over left border
+    move("$",   "argv[])@");
+    move("h",   "argv[]@)");
+    move("3h",  "arg@v[])");
+    move("50h", "@int main");
 }
 
-void tst_FakeVim::commandRight()
+void tst_FakeVim::command_right()
 {
     setup();
     move("4j", "@int main");
@@ -288,27 +354,35 @@ void tst_FakeVim::commandRight()
     move("50l", "argv[])@");
 }
 
-void tst_FakeVim::commandLeft()
+void tst_FakeVim::command_up()
 {
     setup();
-    move("4j",  "@int main");
-    move("h",   "@int main"); // no move over left border
-    move("$",   "argv[])@");
-    move("h",   "argv[]@)");
-    move("3h",  "arg@v[])");
-    move("50h", "@int main");
+    move("j", "@#include <QtCore");
+    move("3j", "@int main");
+    move("4j", "@    return app.exec()");
 }
 
-void tst_FakeVim::commandW()
+void tst_FakeVim::command_w()
 {
     setup();
-    move("w", "@#include <QtCore");
-    move("w", "#@include <QtCore");
-    move("w", "#include @<QtCore");
-    move("3w", "@#include <QtGui");
+    move("w",   "@#include <QtCore");
+    move("w",   "#@include <QtCore");
+    move("w",   "#include @<QtCore");
+    move("3w",  "@#include <QtGui");
+    move("w",   "#@include <QtGui");
+    move("w",   "#include @<QtGui");
+    move("w",   "#include <@QtGui");
+    move("4w",  "int main@(int argc, char *argv[])");
+    move("w",   "int main(@int argc, char *argv[])");
+    move("w",   "int main(int @argc, char *argv[])");
+    move("w",   "int main(int argc@, char *argv[])");
+    move("w",   "int main(int argc, @char *argv[])");
+    move("w",   "int main(int argc, char @*argv[])");
+    move("w",   "int main(int argc, char *@argv[])");
+    move("w",   "int main(int argc, char *argv@[])");
+    move("w",   "@{");
 }
 
-
 /*
 #include <QtCore>
 #include <QtGui>
@@ -321,6 +395,14 @@ int main(int argc, char *argv[])
 }
 */
 
+
+
+//////////////////////////////////////////////////////////////////////////
+//
+// Main
+//
+//////////////////////////////////////////////////////////////////////////
+
 int main(int argc, char *argv[]) \
 {
     int res = 0;
diff --git a/tests/manual/gdbdebugger/simple/app.cpp b/tests/manual/gdbdebugger/simple/app.cpp
index 427cbf452fee6153b115b781928db7b21a6d356d..76b35c9ce770cee14546a10ef5a342ae6eaebc36 100644
--- a/tests/manual/gdbdebugger/simple/app.cpp
+++ b/tests/manual/gdbdebugger/simple/app.cpp
@@ -87,6 +87,12 @@ public:
         b = 2 + s + t;
         a += 1;
     }
+
+    ~Foo()
+    {
+        a = 5;
+    }
+
     void doit()
     {
         static QObject ob;