diff --git a/src/plugins/coreplugin/basefilewizard.cpp b/src/plugins/coreplugin/basefilewizard.cpp
index 7a7279cfe49edc6b6a26caaf966775d64e9c02b2..e98fd2ce8c9fb9bab8174f760d5f9b87d43e328a 100644
--- a/src/plugins/coreplugin/basefilewizard.cpp
+++ b/src/plugins/coreplugin/basefilewizard.cpp
@@ -32,12 +32,13 @@
 ***************************************************************************/
 
 #include "basefilewizard.h"
+
+#include "coreconstants.h"
+#include "icore.h"
+#include "ifilewizardextension.h"
 #include "mimedatabase.h"
+#include "editormanager/editormanager.h"
 
-#include <coreplugin/editormanager/editormanager.h>
-#include <coreplugin/icore.h>
-#include <coreplugin/coreconstants.h>
-#include <coreplugin/ifilewizardextension.h>
 #include <extensionsystem/pluginmanager.h>
 #include <utils/filewizarddialog.h>
 
diff --git a/src/plugins/coreplugin/coreplugin.pro b/src/plugins/coreplugin/coreplugin.pro
index 7ba648c1619f37d0c81c0bbfa6d03f123941dec6..36f170fcf977a4814b675c5e03d66af11f7e5f98 100644
--- a/src/plugins/coreplugin/coreplugin.pro
+++ b/src/plugins/coreplugin/coreplugin.pro
@@ -167,3 +167,10 @@ RESOURCES += core.qrc \
 contains(QT_CONFIG, webkit) {
     QT += webkit
 }
+
+linux-* {
+    images.files = images/qtcreator_logo_*.png
+    images.path  = /share/pixmaps
+
+    INSTALLS += images
+}
diff --git a/src/plugins/coreplugin/editormanager/editorsplitter.cpp b/src/plugins/coreplugin/editormanager/editorsplitter.cpp
index 7e4f53f4e40390f6e01ca669c13326de2f3d5ff3..5ff9832ec02fe80203821de4e974008a4bb82434 100644
--- a/src/plugins/coreplugin/editormanager/editorsplitter.cpp
+++ b/src/plugins/coreplugin/editormanager/editorsplitter.cpp
@@ -33,15 +33,14 @@
 
 #include "editorsplitter.h"
 
+#include "coreconstants.h"
 #include "editormanager.h"
+#include "icore.h"
 #include "minisplitter.h"
 #include "openeditorswindow.h"
 #include "stackededitorgroup.h"
-
-#include <coreplugin/icore.h>
-#include <coreplugin/coreconstants.h>
-#include <coreplugin/uniqueidmanager.h>
-#include <coreplugin/actionmanager/actionmanager.h>
+#include "uniqueidmanager.h"
+#include "actionmanager/actionmanager.h"
 
 #include <utils/qtcassert.h>
 
diff --git a/src/plugins/coreplugin/filemanager.cpp b/src/plugins/coreplugin/filemanager.cpp
index c503dbd7dd827d7a7b102bb1d3a6f70d673a5f37..afafa92d75744ad6ba8094459410ef83ac5174c5 100644
--- a/src/plugins/coreplugin/filemanager.cpp
+++ b/src/plugins/coreplugin/filemanager.cpp
@@ -33,13 +33,14 @@
 
 #include "filemanager.h"
 
+#include "editormanager.h"
+#include "icore.h"
 #include "ifile.h"
+#include "iversioncontrol.h"
 #include "mainwindow.h"
+#include "mimedatabase.h"
 #include "saveitemsdialog.h"
 #include "vcsmanager.h"
-#include "editormanager.h"
-#include "mimedatabase.h"
-#include "iversioncontrol.h"
 
 #include <utils/qtcassert.h>
 
diff --git a/src/plugins/coreplugin/mainwindow.cpp b/src/plugins/coreplugin/mainwindow.cpp
index bf36602e342eb4419858e9172c20cddba5b18f05..68cea956947291da76e32452967f7a0e05553b5d 100644
--- a/src/plugins/coreplugin/mainwindow.cpp
+++ b/src/plugins/coreplugin/mainwindow.cpp
@@ -380,7 +380,7 @@ void MainWindow::registerDefaultContainers()
     menubar->appendGroup(Constants::G_WINDOW);
     menubar->appendGroup(Constants::G_HELP);
 
-    //File Menu
+    // File Menu
     ActionContainer *filemenu = am->createMenu(Constants::M_FILE);
     menubar->addMenu(filemenu, Constants::G_FILE);
     filemenu->menu()->setTitle(tr("&File"));
@@ -394,7 +394,7 @@ void MainWindow::registerDefaultContainers()
     connect(filemenu->menu(), SIGNAL(aboutToShow()), this, SLOT(aboutToShowRecentFiles()));
 
 
-    //Edit Menu
+    // Edit Menu
     ActionContainer *medit = am->createMenu(Constants::M_EDIT);
     menubar->addMenu(medit, Constants::G_EDIT);
     medit->menu()->setTitle(tr("&Edit"));
@@ -405,12 +405,12 @@ void MainWindow::registerDefaultContainers()
     medit->appendGroup(Constants::G_EDIT_FIND);
     medit->appendGroup(Constants::G_EDIT_OTHER);
 
-    //Tools Menu
+    // Tools Menu
     ActionContainer *ac = am->createMenu(Constants::M_TOOLS);
     menubar->addMenu(ac, Constants::G_TOOLS);
     ac->menu()->setTitle(tr("&Tools"));
 
-    //Window Menu
+    // Window Menu
     ActionContainer *mwindow = am->createMenu(Constants::M_WINDOW);
     menubar->addMenu(mwindow, Constants::G_WINDOW);
     mwindow->menu()->setTitle(tr("&Window"));
@@ -423,7 +423,7 @@ void MainWindow::registerDefaultContainers()
     mwindow->appendGroup(Constants::G_WINDOW_OTHER);
     mwindow->appendGroup(Constants::G_WINDOW_LIST);
 
-    //Help Menu
+    // Help Menu
     ac = am->createMenu(Constants::M_HELP);
     menubar->addMenu(ac, Constants::G_HELP);
     ac->menu()->setTitle(tr("&Help"));
diff --git a/src/plugins/coreplugin/mainwindow.h b/src/plugins/coreplugin/mainwindow.h
index e1fb1d9c6626aeb7466c66ce919881fe4c10965e..4fa8f7472c16e529836fa96a0bf5b092dfd593e3 100644
--- a/src/plugins/coreplugin/mainwindow.h
+++ b/src/plugins/coreplugin/mainwindow.h
@@ -34,7 +34,7 @@
 #ifndef MAINWINDOW_H
 #define MAINWINDOW_H
 
-#include "icore.h"
+#include "core_global.h"
 
 #include <QtGui/QMainWindow>
 #include <QtCore/QMap>
@@ -61,6 +61,7 @@ class BaseView;
 class EditorManager;
 class FileManager;
 class IContext;
+class IWizard;
 class MessageManager;
 class MimeDatabase;
 class ModeManager;
@@ -103,7 +104,6 @@ public:
 
     void openFiles(const QStringList &fileNames);
 
-    //ICore
     inline ExtensionSystem::PluginManager *pluginManager() { return m_pluginManager; }
     Core::ActionManager *actionManager() const;
     Core::FileManager *fileManager() const;
diff --git a/src/plugins/coreplugin/modemanager.cpp b/src/plugins/coreplugin/modemanager.cpp
index 64006ff723609143d507643a2c9a7ba01c965ac4..05c47261f3ab4c1b81a93844d808e3b636e44857 100644
--- a/src/plugins/coreplugin/modemanager.cpp
+++ b/src/plugins/coreplugin/modemanager.cpp
@@ -35,6 +35,7 @@
 
 #include "fancytabwidget.h"
 #include "fancyactionbar.h"
+#include "icore.h"
 #include "mainwindow.h"
 
 #include <aggregation/aggregate.h>
diff --git a/src/plugins/coreplugin/navigationwidget.cpp b/src/plugins/coreplugin/navigationwidget.cpp
index 1141909aa0cf611cd26a3c32fb16f3874955d7e0..6329f70ed94cb14045fc243367e5544d6eb86d4e 100644
--- a/src/plugins/coreplugin/navigationwidget.cpp
+++ b/src/plugins/coreplugin/navigationwidget.cpp
@@ -33,12 +33,13 @@
 
 #include "navigationwidget.h"
 
-#include <coreplugin/icore.h>
-#include <coreplugin/coreconstants.h>
-#include <coreplugin/inavigationwidgetfactory.h>
-#include <coreplugin/modemanager.h>
-#include <coreplugin/uniqueidmanager.h>
-#include <coreplugin/actionmanager/actionmanager.h>
+#include "icore.h"
+#include "coreconstants.h"
+#include "inavigationwidgetfactory.h"
+#include "modemanager.h"
+#include "uniqueidmanager.h"
+#include "actionmanager/actionmanager.h"
+
 #include <extensionsystem/pluginmanager.h>
 
 #include <QtCore/QDebug>
diff --git a/src/plugins/coreplugin/outputpane.cpp b/src/plugins/coreplugin/outputpane.cpp
index d85ecd2579db29046ca7fb32472491527f7e280a..52dec2a22ff4947d95bb68ea82890a6cc4e594e8 100644
--- a/src/plugins/coreplugin/outputpane.cpp
+++ b/src/plugins/coreplugin/outputpane.cpp
@@ -33,6 +33,7 @@
 
 #include "outputpane.h"
 #include "coreconstants.h"
+#include "icore.h"
 #include "ioutputpane.h"
 #include "mainwindow.h"
 #include "modemanager.h"
@@ -55,7 +56,6 @@
 #include <QtGui/QToolBar>
 #include <QtGui/QToolButton>
 #include <QtGui/QStackedWidget>
-#include <QDebug>
 
 using namespace Core;
 using namespace Core::Internal;
diff --git a/src/plugins/coreplugin/scriptmanager/scriptmanager_p.h b/src/plugins/coreplugin/scriptmanager/scriptmanager_p.h
index 40768f0fa9bcc808e199a4291a1695d4da592865..e05778a832d84b68332b8491b4c2321ec808712c 100644
--- a/src/plugins/coreplugin/scriptmanager/scriptmanager_p.h
+++ b/src/plugins/coreplugin/scriptmanager/scriptmanager_p.h
@@ -35,13 +35,15 @@
 #define SCRIPTMANAGER_P_H
 
 #include <coreplugin/scriptmanager/scriptmanager.h>
-#include <coreplugin/icore.h>
 
 #include <QtCore/QObject>
 #include <QtCore/QList>
 #include <QtScript/QScriptEngine>
 
 namespace Core {
+
+class ICore;
+
 namespace Internal {
 
 class ScriptManagerPrivate : public Core::ScriptManager
diff --git a/src/plugins/cppeditor/cppeditor.cpp b/src/plugins/cppeditor/cppeditor.cpp
index 87d229d6f4e57f58a6c350bef2b4240c1cd629a2..b370faea1bb626a110c666102dbe4e4b7db9eda8 100644
--- a/src/plugins/cppeditor/cppeditor.cpp
+++ b/src/plugins/cppeditor/cppeditor.cpp
@@ -440,9 +440,9 @@ void CPPEditor::switchDeclarationDefinition()
         return;
 
     Function *f = lastSymbol->asFunction();
-    if (! f) {
+    if (!f) {
         Scope *fs = lastSymbol->scope();
-        if (! fs->isFunctionScope())
+        if (!fs->isFunctionScope())
             fs = fs->enclosingFunctionScope();
         if (fs)
             f = fs->owner()->asFunction();
diff --git a/src/plugins/designer/formeditorw.cpp b/src/plugins/designer/formeditorw.cpp
index da8374091d5f17e6506570b6a7f122e725524287..58de33f2753e997c9f159ec4d0cf5c13e2170a4c 100644
--- a/src/plugins/designer/formeditorw.cpp
+++ b/src/plugins/designer/formeditorw.cpp
@@ -40,6 +40,7 @@
 #include "workbenchintegration.h"
 
 #include <coreplugin/coreconstants.h>
+#include <coreplugin/icore.h>
 #include <coreplugin/uniqueidmanager.h>
 #include <coreplugin/actionmanager/actionmanager.h>
 #include <coreplugin/editormanager/editormanager.h>
diff --git a/src/plugins/designer/settingspage.h b/src/plugins/designer/settingspage.h
index 8ad707dd76937a6acd5d37cc7b429f9bfb59e26b..bba91cd5de6b11fd21149973a3163d572f69e4e8 100644
--- a/src/plugins/designer/settingspage.h
+++ b/src/plugins/designer/settingspage.h
@@ -34,7 +34,6 @@
 #ifndef DESIGNER_SETTINGSPAGE_H
 #define DESIGNER_SETTINGSPAGE_H
 
-#include <coreplugin/icore.h>
 #include <coreplugin/dialogs/ioptionspage.h>
 
 QT_BEGIN_NAMESPACE
diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp
index 9236b8930bbfe8a5f9e4f9f581ccaac50f3168a2..b8ae84ba4e6ef44ff1896788cba83e2abb656568 100644
--- a/src/plugins/fakevim/fakevimhandler.cpp
+++ b/src/plugins/fakevim/fakevimhandler.cpp
@@ -45,6 +45,7 @@
 #include <QtCore/QDebug>
 #include <QtCore/QFile>
 #include <QtCore/QObject>
+#include <QtCore/QPointer>
 #include <QtCore/QProcess>
 #include <QtCore/QRegExp>
 #include <QtCore/QTextStream>
@@ -157,6 +158,13 @@ QDebug &operator<<(QDebug &ts, const EditOperation &op)
     return ts;
 }
 
+QDebug &operator<<(QDebug &ts, const QList<QTextEdit::ExtraSelection> &sels)
+{
+    foreach (QTextEdit::ExtraSelection sel, sels) 
+        ts << "SEL: " << sel.cursor.anchor() << sel.cursor.position(); 
+    return ts;
+}
+        
 int lineCount(const QString &text)
 {
     //return text.count(QChar(ParagraphSeparator));
@@ -166,11 +174,14 @@ int lineCount(const QString &text)
 class FakeVimHandler::Private
 {
 public:
-    Private(FakeVimHandler *parent);
+    Private(FakeVimHandler *parent, QWidget *widget);
 
     bool handleEvent(QKeyEvent *ev);
     void handleExCommand(const QString &cmd);
 
+    void setupWidget();
+    void restoreWidget();
+
 private:
     friend class FakeVimHandler;
     static int shift(int key) { return key + 32; }
@@ -238,7 +249,6 @@ private:
     int readLineCode(QString &cmd);
     void selectRange(int beginLine, int endLine);
 
-    void setWidget(QWidget *ob);
     void enterInsertMode();
     void enterCommandMode();
     void showRedMessage(const QString &msg);
@@ -328,12 +338,17 @@ public:
     // for restoring cursor position
     int m_savedYankPosition;
     int m_desiredColumn;
+
+    QPointer<QObject> m_extraData;
 };
 
-FakeVimHandler::Private::Private(FakeVimHandler *parent)
+FakeVimHandler::Private::Private(FakeVimHandler *parent, QWidget *widget)
 {
     q = parent;
 
+    m_textedit = qobject_cast<QTextEdit *>(widget);
+    m_plaintextedit = qobject_cast<QPlainTextEdit *>(widget);
+
     m_mode = CommandMode;
     m_submode = NoSubMode;
     m_subsubmode = NoSubSubMode;
@@ -341,8 +356,6 @@ FakeVimHandler::Private::Private(FakeVimHandler *parent)
     m_lastSearchForward = true;
     m_register = '"';
     m_gflag = false;
-    m_textedit = 0;
-    m_plaintextedit = 0;
     m_visualMode = NoVisualMode;
     m_desiredColumn = 0;
     m_moveType = MoveInclusive;
@@ -403,6 +416,37 @@ bool FakeVimHandler::Private::handleEvent(QKeyEvent *ev)
     return handled;
 }
 
+void FakeVimHandler::Private::setupWidget()
+{
+    enterCommandMode();
+    if (m_textedit) {
+        m_textedit->installEventFilter(q);
+        //m_textedit->setCursorWidth(QFontMetrics(ed->font()).width(QChar('x')));
+        m_textedit->setLineWrapMode(QTextEdit::NoWrap);
+        m_wasReadOnly = m_textedit->isReadOnly();
+    } else if (m_plaintextedit) {
+        m_plaintextedit->installEventFilter(q);
+        //plaintextedit->setCursorWidth(QFontMetrics(ed->font()).width(QChar('x')));
+        m_plaintextedit->setLineWrapMode(QPlainTextEdit::NoWrap);
+        m_wasReadOnly = m_plaintextedit->isReadOnly();
+    }
+    showBlackMessage("vi emulation mode.");
+    updateMiniBuffer();
+}
+
+void FakeVimHandler::Private::restoreWidget()
+{
+    //showBlackMessage(QString());
+    //updateMiniBuffer();
+    if (m_textedit) {
+        m_textedit->removeEventFilter(q);
+        m_textedit->setReadOnly(m_wasReadOnly);
+    } else if (m_plaintextedit) {
+        m_plaintextedit->removeEventFilter(q);
+        m_plaintextedit->setReadOnly(m_wasReadOnly);
+    }
+}
+
 bool FakeVimHandler::Private::handleKey(int key, int unmodified, const QString &text)
 {
     //qDebug() << "KEY: " << key << text << "POS: " << m_tc.position();
@@ -419,6 +463,7 @@ bool FakeVimHandler::Private::handleKey(int key, int unmodified, const QString &
 
 void FakeVimHandler::Private::finishMovement(const QString &dotCommand)
 {
+    //qDebug() << "ANCHOR: " << m_anchor;
     if (m_submode == FilterSubMode) {
         int beginLine = lineForPosition(anchor());
         int endLine = lineForPosition(position());
@@ -443,6 +488,8 @@ void FakeVimHandler::Private::finishMovement(const QString &dotCommand)
         m_mode = InsertMode;
         m_submode = NoSubMode;
     } else if (m_submode == DeleteSubMode) {
+        if (m_moveType == MoveInclusive)
+            moveRight(); // correct 
         if (!dotCommand.isEmpty())
             m_dotCommand = "d" + dotCommand;
         m_registers[m_register] = recordRemoveSelectedText();
@@ -467,10 +514,8 @@ void FakeVimHandler::Private::finishMovement(const QString &dotCommand)
         m_tc.setPosition(startBlock.position());
         moveToFirstNonBlankOnLine();
         m_submode = NoSubMode;
-    } else if (m_moveType == MoveExclusive) {
-        moveLeft(); // correct 
-        m_moveType = MoveInclusive;
     }
+    m_moveType = MoveInclusive;
     m_mvcount.clear();
     m_opcount.clear();
     m_gflag = false;
@@ -489,10 +534,13 @@ void FakeVimHandler::Private::updateSelection()
         QTextEdit::ExtraSelection sel;
         sel.cursor = m_tc;
         sel.format = m_tc.blockCharFormat();
-        //sel.format.setFontWeight(QFont::Bold);
-        //sel.format.setFontUnderline(true);
+#if 0
+        sel.format.setFontWeight(QFont::Bold);
+        sel.format.setFontUnderline(true);
+#else
         sel.format.setForeground(Qt::white);
         sel.format.setBackground(Qt::black);
+#endif
         int cursorPos = m_tc.position();
         int anchorPos = m_marks['<'];
         //qDebug() << "POS: " << cursorPos << " ANCHOR: " << anchorPos;
@@ -529,7 +577,8 @@ void FakeVimHandler::Private::updateSelection()
             }
         }
     }
-    emit q->selectionChanged(editor(), selections);
+    //qDebug() << "SELECTION: " << selections;
+    emit q->selectionChanged(selections);
 }
 
 void FakeVimHandler::Private::updateMiniBuffer()
@@ -770,9 +819,11 @@ bool FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
         recordBeginGroup();
         m_lastInsertion.clear();
     } else if (key == 'b') {
+        m_moveType = MoveExclusive;
         moveToWordBoundary(false, false);
         finishMovement();
     } else if (key == 'B') {
+        m_moveType = MoveExclusive;
         moveToWordBoundary(true, false);
         finishMovement();
     } else if (key == 'c') {
@@ -795,7 +846,7 @@ bool FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
         m_mvcount.clear();
         m_submode = DeleteSubMode;
     } else if (key == 'd') {
-        setAnchor();
+        //setAnchor();
         leaveVisualMode();
         int beginLine = lineForPosition(m_marks['<']);
         int endLine = lineForPosition(m_marks['>']);
@@ -809,10 +860,11 @@ bool FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
         moveRight(rightDist());
         finishMovement();
     } else if (key == 'e') {
+        m_moveType = MoveInclusive;
         moveToWordBoundary(false, true);
-        m_moveType = MoveExclusive;
         finishMovement();
     } else if (key == 'E') {
+        m_moveType = MoveInclusive;
         moveToWordBoundary(true, true);
         finishMovement();
     } else if (key == 'f' || key == 'F') {
@@ -1036,6 +1088,20 @@ bool FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
         }
         recordInsertText(str);
         recordEndGroup();
+    } else if (key == control('d')) {
+        int sline = cursorLineOnScreen();
+        // FIXME: this should use the "scroll" option, and "count"
+        moveDown(linesOnScreen() / 2);
+        moveToFirstNonBlankOnLine();
+        scrollToLineInDocument(cursorLineInDocument() - sline);
+        finishMovement();
+    } else if (key == control('u')) {
+        int sline = cursorLineOnScreen();
+        // FIXME: this should use the "scroll" option, and "count"
+        moveUp(linesOnScreen() / 2);
+        moveToFirstNonBlankOnLine();
+        scrollToLineInDocument(cursorLineInDocument() - sline);
+        finishMovement();
     } else if (key == Key_PageDown || key == control('f')) {
         moveDown(count() * (linesOnScreen() - 2));
         finishMovement();
@@ -1271,12 +1337,12 @@ int FakeVimHandler::Private::readLineCode(QString &cmd)
 
 void FakeVimHandler::Private::selectRange(int beginLine, int endLine)
 {
-    m_tc.setPosition(positionForLine(beginLine), MoveAnchor);
+    m_anchor = positionForLine(beginLine);
     if (endLine == linesInDocument()) {
-        m_tc.setPosition(positionForLine(endLine), KeepAnchor);
-        m_tc.movePosition(EndOfLine, KeepAnchor);
+        m_tc.setPosition(positionForLine(endLine), MoveAnchor);
+        m_tc.movePosition(EndOfLine, MoveAnchor);
     } else {
-        m_tc.setPosition(positionForLine(endLine + 1), KeepAnchor);
+        m_tc.setPosition(positionForLine(endLine + 1), MoveAnchor);
     }
 }
 
@@ -1329,21 +1395,38 @@ void FakeVimHandler::Private::handleExCommand(const QString &cmd0)
             beginLine = 0;
         if (endLine == -1)
             endLine = linesInDocument();
-        //qDebug() << "LINES: " << beginLine << endLine;
+        qDebug() << "LINES: " << beginLine << endLine;
         bool forced = cmd.startsWith("w!");
         QString fileName = reWrite.cap(2);
         if (fileName.isEmpty())
             fileName = m_currentFileName;
-        QFile file(fileName);
-        bool exists = file.exists();
+        QFile file1(fileName);
+        bool exists = file1.exists();
         if (exists && !forced && !noArgs) {
             showRedMessage(tr("File '%1' exists (add ! to override)").arg(fileName));
-        } else if (file.open(QIODevice::ReadWrite)) {
+        } else if (file1.open(QIODevice::ReadWrite)) {
+            file1.close();
             selectRange(beginLine, endLine);
-            emit q->writeFile(fileName, selectedText());
-            // check by reading back
-            file.open(QIODevice::ReadOnly);
-            QByteArray ba = file.readAll();
+            QString contents = selectedText(); 
+            qDebug() << "LINES: " << beginLine << endLine;
+            bool handled = false;
+            emit q->writeFileRequested(&handled, fileName, contents);
+            // nobody cared, so act ourselves
+            if (!handled) {
+                //qDebug() << "HANDLING MANUAL SAVE TO " << fileName;
+                QFile::remove(fileName);
+                QFile file2(fileName);
+                if (file2.open(QIODevice::ReadWrite)) {
+                    QTextStream ts(&file2);
+                    ts << contents;
+                } else {
+                    showRedMessage(tr("Cannot open file '%1' for writing").arg(fileName));
+                }
+            }
+            // check result by reading back
+            QFile file3(fileName);
+            file3.open(QIODevice::ReadOnly);
+            QByteArray ba = file3.readAll();
             showBlackMessage(tr("\"%1\" %2 %3L, %4C written")
                 .arg(fileName).arg(exists ? " " : " [New] ")
                 .arg(ba.count('\n')).arg(ba.size()));
@@ -1401,7 +1484,7 @@ void FakeVimHandler::Private::handleExCommand(const QString &cmd0)
             QString info;
             foreach (const QString &key, m_config.keys())
                 info += key + ": " + m_config.value(key) + "\n";
-            emit q->extraInformationChanged(editor(), info);
+            emit q->extraInformationChanged(info);
         } else {
             notImplementedYet();
         }
@@ -1417,7 +1500,7 @@ void FakeVimHandler::Private::handleExCommand(const QString &cmd0)
                 ++i;
                 info += QString("%1 %2\n").arg(i, -8).arg(item);
             }
-            emit q->extraInformationChanged(editor(), info);
+            emit q->extraInformationChanged(info);
         } else {
             notImplementedYet();
         }
@@ -1566,8 +1649,7 @@ void FakeVimHandler::Private::moveToWordBoundary(bool simple, bool forward)
     int n = forward ? lastPositionInDocument() - 1 : 0;
     int lastClass = -1;
     while (true) {
-        forward ? moveRight() : moveLeft();
-        QChar c = doc->characterAt(m_tc.position());
+        QChar c = doc->characterAt(m_tc.position() + (forward ? 1 : -1));
         int thisClass = charClass(c, simple);
         if (thisClass != lastClass && lastClass != 0)
             --repeat;
@@ -1576,6 +1658,7 @@ void FakeVimHandler::Private::moveToWordBoundary(bool simple, bool forward)
         lastClass = thisClass;
         if (m_tc.position() == n)
             break;
+        forward ? moveRight() : moveLeft();
     }
 }
 
@@ -1752,6 +1835,7 @@ int FakeVimHandler::Private::lineForPosition(int pos) const
 
 void FakeVimHandler::Private::enterVisualMode(VisualMode visualMode)
 {
+    setAnchor();
     m_visualMode = visualMode;
     m_marks['<'] = m_tc.position();
     m_marks['>'] = m_tc.position();
@@ -1942,16 +2026,10 @@ void FakeVimHandler::Private::enterCommandMode()
 
 void FakeVimHandler::Private::quit()
 {
-    showBlackMessage(QString());
     EDITOR(setOverwriteMode(false));
-    q->quitRequested(editor());
+    q->quitRequested();
 }
 
-void FakeVimHandler::Private::setWidget(QWidget *ob)
-{
-    m_textedit = qobject_cast<QTextEdit *>(ob);
-    m_plaintextedit = qobject_cast<QPlainTextEdit *>(ob);
-}
 
 ///////////////////////////////////////////////////////////////////////
 //
@@ -1959,12 +2037,13 @@ void FakeVimHandler::Private::setWidget(QWidget *ob)
 //
 ///////////////////////////////////////////////////////////////////////
 
-FakeVimHandler::FakeVimHandler(QObject *parent)
-    : QObject(parent), d(new Private(this))
+FakeVimHandler::FakeVimHandler(QWidget *widget, QObject *parent)
+    : QObject(parent), d(new Private(this, widget))
 {}
 
 FakeVimHandler::~FakeVimHandler()
 {
+    qDebug() << "DELETING HANDLER" << this;
     delete d;
 }
 
@@ -1993,40 +2072,18 @@ bool FakeVimHandler::eventFilter(QObject *ob, QEvent *ev)
     return QObject::eventFilter(ob, ev);
 }
 
-void FakeVimHandler::addWidget(QWidget *widget)
+void FakeVimHandler::setupWidget()
 {
-    widget->installEventFilter(this);
-    d->setWidget(widget);
-    d->enterCommandMode();
-    if (QTextEdit *ed = qobject_cast<QTextEdit *>(widget)) {
-        //ed->setCursorWidth(QFontMetrics(ed->font()).width(QChar('x')));
-        ed->setLineWrapMode(QTextEdit::NoWrap);
-        d->m_wasReadOnly = ed->isReadOnly();
-    } else if (QPlainTextEdit *ed = qobject_cast<QPlainTextEdit *>(widget)) {
-        //ed->setCursorWidth(QFontMetrics(ed->font()).width(QChar('x')));
-        ed->setLineWrapMode(QPlainTextEdit::NoWrap);
-        d->m_wasReadOnly = ed->isReadOnly();
-    }
-    d->showBlackMessage("vi emulation mode.");
-    d->updateMiniBuffer();
+    d->setupWidget();
 }
 
-void FakeVimHandler::removeWidget(QWidget *widget)
+void FakeVimHandler::restoreWidget()
 {
-    d->setWidget(widget);
-    d->showBlackMessage(QString());
-    d->updateMiniBuffer();
-    widget->removeEventFilter(this);
-    if (QTextEdit *ed = qobject_cast<QTextEdit *>(widget)) {
-        ed->setReadOnly(d->m_wasReadOnly);
-    } else if (QPlainTextEdit *ed = qobject_cast<QPlainTextEdit *>(widget)) {
-        ed->setReadOnly(d->m_wasReadOnly);
-    }
+    d->restoreWidget();
 }
 
-void FakeVimHandler::handleCommand(QWidget *widget, const QString &cmd)
+void FakeVimHandler::handleCommand(const QString &cmd)
 {
-    d->setWidget(widget);
     d->handleExCommand(cmd);
 }
 
@@ -2044,3 +2101,19 @@ void FakeVimHandler::setCurrentFileName(const QString &fileName)
 {
    d->m_currentFileName = fileName;
 }
+
+QWidget *FakeVimHandler::widget()
+{
+    return d->editor();
+}
+
+void FakeVimHandler::setExtraData(QObject *data)
+{
+    d->m_extraData = data;
+}
+
+QObject *FakeVimHandler::extraData() const
+{
+    return d->m_extraData;
+}
+
diff --git a/src/plugins/fakevim/fakevimhandler.h b/src/plugins/fakevim/fakevimhandler.h
index bbd58781e7f88344649b7fec1b9a5445fbb117b9..a083f346dd4d25ddd629c5c26b01b7aeab8287fe 100644
--- a/src/plugins/fakevim/fakevimhandler.h
+++ b/src/plugins/fakevim/fakevimhandler.h
@@ -50,30 +50,35 @@ class FakeVimHandler : public QObject
     Q_OBJECT
 
 public:
-    FakeVimHandler(QObject *parent = 0);
+    FakeVimHandler(QWidget *widget, QObject *parent = 0);
     ~FakeVimHandler();
 
+    QWidget *widget();
+
+    void setExtraData(QObject *data);
+    QObject *extraData() const;
+
 public slots:
-    // The same handler can be installed on several widgets
-    // FIXME: good idea?
-    void addWidget(QWidget *widget);
-    void removeWidget(QWidget *widget);
     void setCurrentFileName(const QString &fileName);
 
     // This executes an "ex" style command taking context
-    // information from \p widget;
-    void handleCommand(QWidget *widget, const QString &cmd);
-    void quit();
+    // information from widget;
+    void handleCommand(const QString &cmd);
     void setConfigValue(const QString &key, const QString &value);
+    void quit();
+
+    // Convenience
+    void setupWidget();
+    void restoreWidget();
 
 signals:
     void commandBufferChanged(const QString &msg);
     void statusDataChanged(const QString &msg);
-    void extraInformationChanged(QWidget *widget, const QString &msg);
-    void quitRequested(QWidget *widget);
-    void selectionChanged(QWidget *widget,
-        const QList<QTextEdit::ExtraSelection> &selection);
-    void writeFile(const QString &fileName, const QString &contents);
+    void extraInformationChanged(const QString &msg);
+    void quitRequested();
+    void selectionChanged(const QList<QTextEdit::ExtraSelection> &selection);
+    void writeFileRequested(bool *handled,
+        const QString &fileName, const QString &contents);
 
 private:
     bool eventFilter(QObject *ob, QEvent *ev);
diff --git a/src/plugins/fakevim/fakevimplugin.cpp b/src/plugins/fakevim/fakevimplugin.cpp
index a00e3878e8e795b825649b3c7e95ac03b14a4037..0b35c4fb8151ef5ff842072fc58bf93bf77c7cef 100644
--- a/src/plugins/fakevim/fakevimplugin.cpp
+++ b/src/plugins/fakevim/fakevimplugin.cpp
@@ -106,27 +106,26 @@ public:
     ~FakeVimPluginPrivate();
     friend class FakeVimPlugin;
 
-    bool initialize(const QStringList &arguments, QString *error_message);
+    bool initialize();
     void shutdown();
 
 private slots:
-    void installHandler();
-    void installHandler(QWidget *widget);
-    void removeHandler(QWidget *widget);
-    void showCommandBuffer(const QString &contents);
-    void showExtraInformation(QWidget *, const QString &msg);
     void editorOpened(Core::IEditor *);
     void editorAboutToClose(Core::IEditor *);
-    void changeSelection(QWidget *widget,
-        const QList<QTextEdit::ExtraSelection> &selections);
-    void writeFile(const QString &fileName, const QString &contents);
+
+    void installHandler();
+    void installHandler(Core::IEditor *editor);
+    void removeHandler();
+
+    void showCommandBuffer(const QString &contents);
+    void showExtraInformation(const QString &msg);
+    void changeSelection(const QList<QTextEdit::ExtraSelection> &selections);
+    void writeFile(bool *handled, const QString &fileName, const QString &contents);
 
 private:
     FakeVimPlugin *q;
-    FakeVimHandler *m_handler;
     QAction *m_installHandlerAction; 
     Core::ICore *m_core;
-    Core::IFile *m_currentFile;
 };
 
 } // namespace Internal
@@ -135,10 +134,8 @@ private:
 FakeVimPluginPrivate::FakeVimPluginPrivate(FakeVimPlugin *plugin)
 {       
     q = plugin;
-    m_handler = 0;
     m_installHandlerAction = 0;
     m_core = 0;
-    m_currentFile = 0;
 }
 
 FakeVimPluginPrivate::~FakeVimPluginPrivate()
@@ -147,17 +144,10 @@ FakeVimPluginPrivate::~FakeVimPluginPrivate()
 
 void FakeVimPluginPrivate::shutdown()
 {
-    delete m_handler;
-    m_handler = 0;
 }
 
-bool FakeVimPluginPrivate::initialize(const QStringList &arguments, QString *error_message)
+bool FakeVimPluginPrivate::initialize()
 {
-    Q_UNUSED(arguments);
-    Q_UNUSED(error_message);
-
-    m_handler = new FakeVimHandler;
-
     m_core = Core::ICore::instance();
     QTC_ASSERT(m_core, return false);
 
@@ -195,102 +185,114 @@ bool FakeVimPluginPrivate::initialize(const QStringList &arguments, QString *err
 void FakeVimPluginPrivate::installHandler()
 {
     if (Core::IEditor *editor = m_core->editorManager()->currentEditor())
-        installHandler(editor->widget());
+        installHandler(editor);
 }
 
-void FakeVimPluginPrivate::installHandler(QWidget *widget)
+void FakeVimPluginPrivate::installHandler(Core::IEditor *editor)
 {
-    connect(m_handler, SIGNAL(extraInformationChanged(QWidget *, QString)),
-        this, SLOT(showExtraInformation(QWidget *, QString)));
-    connect(m_handler, SIGNAL(commandBufferChanged(QString)),
+    QWidget *widget = editor->widget();
+    
+    FakeVimHandler *handler = new FakeVimHandler(widget, this);
+
+    connect(handler, SIGNAL(extraInformationChanged(QString)),
+        this, SLOT(showExtraInformation(QString)));
+    connect(handler, SIGNAL(commandBufferChanged(QString)),
         this, SLOT(showCommandBuffer(QString)));
-    connect(m_handler, SIGNAL(quitRequested(QWidget *)),
-        this, SLOT(removeHandler(QWidget *)));
-    connect(m_handler,
-        SIGNAL(selectionChanged(QWidget*,QList<QTextEdit::ExtraSelection>)),
-        this, SLOT(changeSelection(QWidget*,QList<QTextEdit::ExtraSelection>)));
-
-    m_handler->addWidget(widget);
-    TextEditor::BaseTextEditor* editor =
-        qobject_cast<TextEditor::BaseTextEditor*>(widget);
-    if (editor) {
-        m_currentFile = editor->file();
-        m_handler->setCurrentFileName(editor->file()->fileName());
-    }
+    connect(handler, SIGNAL(quitRequested()),
+        this, SLOT(removeHandler()), Qt::QueuedConnection);
+    connect(handler, SIGNAL(writeFileRequested(bool*,QString,QString)),
+        this, SLOT(writeFile(bool*,QString,QString)));
+    connect(handler, SIGNAL(selectionChanged(QList<QTextEdit::ExtraSelection>)),
+        this, SLOT(changeSelection(QList<QTextEdit::ExtraSelection>)));
 
-    BaseTextEditor *bt = qobject_cast<BaseTextEditor *>(widget);
-    if (bt) {
+    handler->setupWidget();
+    handler->setExtraData(editor);
+
+    if (BaseTextEditor *bt = qobject_cast<BaseTextEditor *>(widget)) {
         using namespace TextEditor;
         using namespace FakeVim::Constants;
+        handler->setCurrentFileName(editor->file()->fileName());
         TabSettings settings = bt->tabSettings();
-        m_handler->setConfigValue(ConfigTabStop,
+        handler->setConfigValue(ConfigTabStop,
             QString::number(settings.m_tabSize));
-        m_handler->setConfigValue(ConfigShiftWidth,
+        handler->setConfigValue(ConfigShiftWidth,
             QString::number(settings.m_indentSize));
-        m_handler->setConfigValue(ConfigExpandTab,
+        handler->setConfigValue(ConfigExpandTab,
             settings.m_spacesForTabs ? ConfigOn : ConfigOff);
-        m_handler->setConfigValue(ConfigSmartTab,
+        handler->setConfigValue(ConfigSmartTab,
             settings.m_smartBackspace ? ConfigOn : ConfigOff); 
-        m_handler->setConfigValue(ConfigAutoIndent,
+        handler->setConfigValue(ConfigAutoIndent,
             settings.m_autoIndent ? ConfigOn : ConfigOff); 
     }
 }
 
-void FakeVimPluginPrivate::writeFile(const QString &fileName,
-    const QString &contents)
+void FakeVimPluginPrivate::writeFile(bool *handled,
+    const QString &fileName, const QString &contents)
 {
-    if (m_currentFile && fileName == m_currentFile->fileName()) {
+    //qDebug() << "HANDLING WRITE FILE" << fileName << sender();
+    FakeVimHandler *handler = qobject_cast<FakeVimHandler *>(sender());
+    if (!handler)
+        return;
+
+    Core::IEditor *editor = qobject_cast<Core::IEditor *>(handler->extraData());
+    if (editor && editor->file()->fileName() == fileName) {
+        //qDebug() << "HANDLING CORE SAVE";
         // Handle that as a special case for nicer interaction with core
-        m_core->fileManager()->blockFileChange(m_currentFile);
-        m_currentFile->save(fileName);
-        m_core->fileManager()->unblockFileChange(m_currentFile);
-    } else {
-        QFile file(fileName);
-        file.open(QIODevice::ReadWrite);
-        { QTextStream ts(&file); ts << contents; }
-        file.close();
-    }
+        Core::IFile *file = editor->file();
+        m_core->fileManager()->blockFileChange(file);
+        file->save(fileName);
+        m_core->fileManager()->unblockFileChange(file);
+        *handled = true;
+    } 
 }
 
-void FakeVimPluginPrivate::removeHandler(QWidget *widget)
+void FakeVimPluginPrivate::removeHandler()
 {
-    Q_UNUSED(widget);
-    m_handler->removeWidget(widget);
+    if (FakeVimHandler *handler = qobject_cast<FakeVimHandler *>(sender())) {
+        handler->restoreWidget();
+        handler->deleteLater();
+    }
     Core::EditorManager::instance()->hideEditorInfoBar(
         QLatin1String(Constants::MINI_BUFFER));
-    m_currentFile = 0;
 }
 
 void FakeVimPluginPrivate::editorOpened(Core::IEditor *editor)
 {
     Q_UNUSED(editor);
     //qDebug() << "OPENING: " << editor << editor->widget();
-    //installHandler(editor->widget()); 
+    //installHandler(editor);
 }
 
 void FakeVimPluginPrivate::editorAboutToClose(Core::IEditor *editor)
 {
-    //qDebug() << "CLOSING: " << editor << editor->widget();
-    removeHandler(editor->widget()); 
+    Q_UNUSED(editor);
+    //qDebug() << "CLOSING: " << editor;
 }
 
 void FakeVimPluginPrivate::showCommandBuffer(const QString &contents)
 {
-    Core::EditorManager::instance()->showEditorInfoBar( 
-        QLatin1String(Constants::MINI_BUFFER), contents,
-        tr("Quit FakeVim"), m_handler, SLOT(quit()));
+    //qDebug() << "SHOW COMMAND BUFFER" << contents;
+    FakeVimHandler *handler = qobject_cast<FakeVimHandler *>(sender());
+    if (handler) {
+        Core::EditorManager::instance()->showEditorInfoBar( 
+            QLatin1String(Constants::MINI_BUFFER), contents,
+            tr("Quit FakeVim"), handler, SLOT(quit()));
+    }
 }
 
-void FakeVimPluginPrivate::showExtraInformation(QWidget *widget, const QString &text)
+void FakeVimPluginPrivate::showExtraInformation(const QString &text)
 {
-    QMessageBox::information(widget, tr("FakeVim Information"), text);
+    FakeVimHandler *handler = qobject_cast<FakeVimHandler *>(sender());
+    if (handler)
+        QMessageBox::information(handler->widget(), tr("FakeVim Information"), text);
 }
 
-void FakeVimPluginPrivate::changeSelection(QWidget *widget,
-    const QList<QTextEdit::ExtraSelection> &selection)
+void FakeVimPluginPrivate::changeSelection
+    (const QList<QTextEdit::ExtraSelection> &selection)
 {
-    if (BaseTextEditor *bt = qobject_cast<BaseTextEditor *>(widget))
-        bt->setExtraSelections(BaseTextEditor::FakeVimSelection, selection);
+    if (FakeVimHandler *handler = qobject_cast<FakeVimHandler *>(sender()))
+        if (BaseTextEditor *bt = qobject_cast<BaseTextEditor *>(handler->widget()))
+            bt->setExtraSelections(BaseTextEditor::FakeVimSelection, selection);
 }
 
 
@@ -309,9 +311,11 @@ FakeVimPlugin::~FakeVimPlugin()
     delete d;
 }
 
-bool FakeVimPlugin::initialize(const QStringList &arguments, QString *error_message)
+bool FakeVimPlugin::initialize(const QStringList &arguments, QString *errorMessage)
 {
-    return d->initialize(arguments, error_message);
+    Q_UNUSED(arguments);
+    Q_UNUSED(errorMessage);
+    return d->initialize();
 }
 
 void FakeVimPlugin::shutdown()
diff --git a/src/plugins/projectexplorer/buildmanager.cpp b/src/plugins/projectexplorer/buildmanager.cpp
index a7e7286a30f6b18acfa823a3a9d98be333737107..d5a1911a3349840b57ff9ca3843cef746cb5879b 100644
--- a/src/plugins/projectexplorer/buildmanager.cpp
+++ b/src/plugins/projectexplorer/buildmanager.cpp
@@ -40,6 +40,7 @@
 #include "projectexplorer.h"
 #include "taskwindow.h"
 
+#include <coreplugin/icore.h>
 #include <coreplugin/progressmanager/progressmanager.h>
 #include <coreplugin/progressmanager/futureprogress.h>
 #include <extensionsystem/pluginmanager.h>
diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp
index 69b642bc4259f013b2408a54e9dc1d6df627b0bb..a9d4e2fc20819f5a271e0a7742ebb29d7c018c71 100644
--- a/src/plugins/projectexplorer/projectexplorer.cpp
+++ b/src/plugins/projectexplorer/projectexplorer.cpp
@@ -62,9 +62,10 @@
 
 #include <coreplugin/basemode.h>
 #include <coreplugin/coreconstants.h>
+#include <coreplugin/filemanager.h>
+#include <coreplugin/icore.h>
 #include <coreplugin/mainwindow.h>
 #include <coreplugin/mimedatabase.h>
-#include <coreplugin/filemanager.h>
 #include <coreplugin/modemanager.h>
 #include <coreplugin/uniqueidmanager.h>
 #include <coreplugin/actionmanager/actionmanager.h>
diff --git a/src/plugins/projectexplorer/taskwindow.cpp b/src/plugins/projectexplorer/taskwindow.cpp
index 0091c82f2d490b57a335e04c625e759171abfba8..9bc28fda44c1447da8070caa843931646f91477c 100644
--- a/src/plugins/projectexplorer/taskwindow.cpp
+++ b/src/plugins/projectexplorer/taskwindow.cpp
@@ -37,6 +37,7 @@
 #include <coreplugin/actionmanager/actionmanager.h>
 #include <coreplugin/editormanager/editormanager.h>
 #include <coreplugin/coreconstants.h>
+#include <coreplugin/icore.h>
 #include <coreplugin/uniqueidmanager.h>
 #include <extensionsystem/pluginmanager.h>
 #include <texteditor/itexteditor.h>
diff --git a/src/plugins/projectexplorer/taskwindow.h b/src/plugins/projectexplorer/taskwindow.h
index 269f6e3ce6201c8bed8c565631b957bde756a7d9..0f2db145e367a6be16642b772116e0d398a56e6e 100644
--- a/src/plugins/projectexplorer/taskwindow.h
+++ b/src/plugins/projectexplorer/taskwindow.h
@@ -38,7 +38,6 @@
 
 #include <coreplugin/ioutputpane.h>
 #include <coreplugin/icontext.h>
-#include <coreplugin/icore.h>
 
 #include <QtGui/QTreeWidget>
 #include <QtGui/QStyledItemDelegate>
diff --git a/src/plugins/qt4projectmanager/qt4buildconfigwidget.cpp b/src/plugins/qt4projectmanager/qt4buildconfigwidget.cpp
index 46d5b106f5cf41bfad75b01cd39b06dc8b39e218..d473e1dc75cf320daa96ebb5a3295ce4349f436e 100644
--- a/src/plugins/qt4projectmanager/qt4buildconfigwidget.cpp
+++ b/src/plugins/qt4projectmanager/qt4buildconfigwidget.cpp
@@ -40,6 +40,7 @@
 #include "qt4projectmanager.h"
 #include "ui_qt4buildconfigwidget.h"
 
+#include <coreplugin/icore.h>
 #include <coreplugin/mainwindow.h>
 
 #include <QtGui/QFileDialog>
diff --git a/src/plugins/quickopen/filesystemfilter.h b/src/plugins/quickopen/filesystemfilter.h
index c935b9fb2c37b8db579df9197ba841258e01dccf..ef7aebd41f49e732c99e660286ff4d009910e5cc 100644
--- a/src/plugins/quickopen/filesystemfilter.h
+++ b/src/plugins/quickopen/filesystemfilter.h
@@ -37,7 +37,6 @@
 #include "iquickopenfilter.h"
 #include "ui_filesystemfilter.h"
 
-#include <coreplugin/icore.h>
 #include <coreplugin/editormanager/editormanager.h>
 
 #include <QtCore/QString>
diff --git a/src/plugins/quickopen/quickopenplugin.cpp b/src/plugins/quickopen/quickopenplugin.cpp
index 0abebe3a88f7528c7d763a9c2f2f879d9463a7cf..aab8bf739bec660f9ce33234601663ed074abb6c 100644
--- a/src/plugins/quickopen/quickopenplugin.cpp
+++ b/src/plugins/quickopen/quickopenplugin.cpp
@@ -47,9 +47,10 @@
 
 #include <coreplugin/baseview.h>
 #include <coreplugin/coreconstants.h>
+#include <coreplugin/icore.h>
 #include <coreplugin/uniqueidmanager.h>
-#include <coreplugin/progressmanager/progressmanager.h>
 #include <coreplugin/actionmanager/actionmanager.h>
+#include <coreplugin/progressmanager/progressmanager.h>
 #include <extensionsystem/pluginmanager.h>
 #include <qtconcurrent/QtConcurrentTools>
 
diff --git a/src/plugins/quickopen/settingspage.h b/src/plugins/quickopen/settingspage.h
index ddd1d5e28880fc14a293da9ca6c51bbccb204222..9bd0971a049b3791c3b1655c11cdd6db72c6adf4 100644
--- a/src/plugins/quickopen/settingspage.h
+++ b/src/plugins/quickopen/settingspage.h
@@ -41,7 +41,6 @@
 #include <QtCore/QHash>
 
 #include <coreplugin/dialogs/ioptionspage.h>
-#include <coreplugin/icore.h>
 
 QT_BEGIN_NAMESPACE
 class QListWidgetItem;
diff --git a/tests/manual/fakevim/main.cpp b/tests/manual/fakevim/main.cpp
index dfa1350e5597ade677abf0aa7557788708c2c282..9400fcf998f0b5bc6183b8f00305bdd04a449ef5 100644
--- a/tests/manual/fakevim/main.cpp
+++ b/tests/manual/fakevim/main.cpp
@@ -17,21 +17,26 @@ class Proxy : public QObject
     Q_OBJECT
 
 public:
-    Proxy() : QObject(0) {}
+    Proxy(QWidget *widget, QObject *parent = 0)
+      : QObject(parent), m_widget(widget)
+    {}
 
 public slots:
-    void changeSelection(QWidget *w, const QList<QTextEdit::ExtraSelection> &s)
+    void changeSelection(const QList<QTextEdit::ExtraSelection> &s)
     {
-        if (QPlainTextEdit *ed = qobject_cast<QPlainTextEdit *>(w))
+        if (QPlainTextEdit *ed = qobject_cast<QPlainTextEdit *>(m_widget))
             ed->setExtraSelections(s);
-        else if (QTextEdit *ed = qobject_cast<QTextEdit *>(w))
+        else if (QTextEdit *ed = qobject_cast<QTextEdit *>(m_widget))
             ed->setExtraSelections(s);
     }
 
-    void changeExtraInformation(QWidget *w, const QString &info)
+    void changeExtraInformation(const QString &info)
     {
-        QMessageBox::information(w, "Information", info);
+        QMessageBox::information(m_widget, "Information", info);
     }
+
+private:
+    QWidget *m_widget;
 };
 
 int main(int argc, char *argv[])
@@ -51,13 +56,13 @@ int main(int argc, char *argv[])
         widget = new QTextEdit;
         title = "TextEdit";
     }
+    widget->setObjectName("Editor");
     widget->resize(450, 350);
     widget->setFocus();
 
-    Proxy proxy;
-
+    Proxy proxy(widget);
 
-    FakeVimHandler handler;
+    FakeVimHandler handler(widget, 0);
 
     QMainWindow mw;
     mw.setWindowTitle("Fakevim (" + title + ")");
@@ -77,18 +82,18 @@ int main(int argc, char *argv[])
 
     QObject::connect(&handler, SIGNAL(commandBufferChanged(QString)),
         mw.statusBar(), SLOT(showMessage(QString)));
-    QObject::connect(&handler, SIGNAL(quitRequested(QWidget *)),
+    QObject::connect(&handler, SIGNAL(quitRequested()),
         &app, SLOT(quit()));
     QObject::connect(&handler,
-        SIGNAL(selectionChanged(QWidget*,QList<QTextEdit::ExtraSelection>)),
-        &proxy, SLOT(changeSelection(QWidget*,QList<QTextEdit::ExtraSelection>)));
+        SIGNAL(selectionChanged(QList<QTextEdit::ExtraSelection>)),
+        &proxy, SLOT(changeSelection(QList<QTextEdit::ExtraSelection>)));
     QObject::connect(&handler,
-        SIGNAL(extraInformationChanged(QWidget*,QString)),
-        &proxy, SLOT(changeExtraInformation(QWidget*,QString)));
+        SIGNAL(extraInformationChanged(QString)),
+        &proxy, SLOT(changeExtraInformation(QString)));
 
-    handler.addWidget(widget);
+    handler.setupWidget();
     if (args.size() >= 1)
-        handler.handleCommand(widget, "r " + args.at(0));
+        handler.handleCommand("r " + args.at(0));
 
     return app.exec();
 }