diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp
index a56fad81d510e603d9818a3d95362aa446b1426d..c438a9ac2651b63e4c57660f3c5158578a051051 100644
--- a/src/plugins/fakevim/fakevimhandler.cpp
+++ b/src/plugins/fakevim/fakevimhandler.cpp
@@ -40,10 +40,6 @@
 // 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.
 
-#include <coreplugin/filemanager.h>
-#include <coreplugin/icore.h>
-#include <texteditor/basetexteditor.h>
-
 //#include <indenter.h>
 
 #include <QtCore/QDebug>
@@ -1200,18 +1196,11 @@ void FakeVimHandler::Private::handleExCommand(const QString &cmd0)
         bool exists = file.exists();
         if (exists && !forced && !noArgs) {
             showRedMessage(tr("File '%1' exists (add ! to override)").arg(fileName));
-        } else if (m_currentFile || file.open(QIODevice::ReadWrite)) {
-            if(m_currentFile) {
-                m_core->fileManager()->blockFileChange(m_currentFile);
-                m_currentFile->save(fileName);
-                m_core->fileManager()->unblockFileChange(m_currentFile);
-            } else {
-                QTextCursor tc = selectRange(beginLine, endLine);
-                qDebug() << "ANCHOR: " << tc.position() << tc.anchor()
-                    << tc.selection().toPlainText();
-                { QTextStream ts(&file); ts << tc.selection().toPlainText(); }
-                file.close();
-            }
+        } else if (file.open(QIODevice::ReadWrite)) {
+            QTextCursor tc = selectRange(beginLine, endLine);
+            QString contents = tc.selection().toPlainText();
+            emit q->writeFile(fileName, contents);
+            // check by reading back
             file.open(QIODevice::ReadOnly);
             QByteArray ba = file.readAll();
             showBlackMessage(tr("\"%1\" %2 %3L, %4C written")
@@ -1741,11 +1730,6 @@ void FakeVimHandler::Private::setWidget(QWidget *ob)
 {
     m_textedit = qobject_cast<QTextEdit *>(ob);
     m_plaintextedit = qobject_cast<QPlainTextEdit *>(ob);
-    TextEditor::BaseTextEditor* editor = qobject_cast<TextEditor::BaseTextEditor*>(ob);
-    if (editor) {
-        m_currentFile = editor->file();
-        m_currentFileName = m_currentFile->fileName();
-    }
 }
 
 ///////////////////////////////////////////////////////////////////////
@@ -1834,3 +1818,8 @@ void FakeVimHandler::quit()
 {
     d->quit();
 }
+
+void FakeVimHandler::setCurrentFileName(const QString &fileName)
+{
+   d->m_currentFileName = fileName;
+}
diff --git a/src/plugins/fakevim/fakevimhandler.h b/src/plugins/fakevim/fakevimhandler.h
index 08df6d21b12a526f307b34346e3517cd2c662673..aeba5ace87005fbb9a88460335122ac8743aa722 100644
--- a/src/plugins/fakevim/fakevimhandler.h
+++ b/src/plugins/fakevim/fakevimhandler.h
@@ -58,6 +58,7 @@ public slots:
     // 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;
@@ -72,6 +73,7 @@ signals:
     void quitRequested(QWidget *);
     void selectionChanged(QWidget *widget,
         const QList<QTextEdit::ExtraSelection> &selection);
+    void writeFile(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 0a06fe7c112700e3fc54a8b108b10c25218d0c85..e809eaae481c185575ae5148daf7297a3a648d3c 100644
--- a/src/plugins/fakevim/fakevimplugin.cpp
+++ b/src/plugins/fakevim/fakevimplugin.cpp
@@ -39,7 +39,9 @@
 #include <coreplugin/actionmanager/actionmanager.h>
 #include <coreplugin/coreconstants.h>
 #include <coreplugin/editormanager/editormanager.h>
+#include <coreplugin/filemanager.h>
 #include <coreplugin/icore.h>
+#include <coreplugin/ifile.h>
 #include <coreplugin/messagemanager.h>
 #include <coreplugin/modemanager.h>
 #include <coreplugin/uniqueidmanager.h>
@@ -117,12 +119,14 @@ private slots:
     void editorAboutToClose(Core::IEditor *);
     void changeSelection(QWidget *widget,
         const QList<QTextEdit::ExtraSelection> &selections);
+    void writeFile(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
@@ -134,6 +138,7 @@ FakeVimPluginPrivate::FakeVimPluginPrivate(FakeVimPlugin *plugin)
     m_handler = 0;
     m_installHandlerAction = 0;
     m_core = 0;
+    m_currentFile = 0;
 }
 
 FakeVimPluginPrivate::~FakeVimPluginPrivate()
@@ -206,6 +211,12 @@ void FakeVimPluginPrivate::installHandler(QWidget *widget)
         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());
+    }
 
     BaseTextEditor *bt = qobject_cast<BaseTextEditor *>(widget);
     if (bt) {
@@ -225,12 +236,30 @@ void FakeVimPluginPrivate::installHandler(QWidget *widget)
     }
 }
 
+void FakeVimPluginPrivate::writeFile(const QString &fileName,
+    const QString &contents)
+{
+    if (m_currentFile && fileName == m_currentFile->fileName()) {
+        // handle that as a special case for nicer interation with
+        // Creator 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();
+    }
+}
+
 void FakeVimPluginPrivate::removeHandler(QWidget *widget)
 {
     Q_UNUSED(widget);
     m_handler->removeWidget(widget);
     Core::EditorManager::instance()->hideEditorInfoBar(
         QLatin1String(Constants::MINI_BUFFER));
+    m_currentFile = 0;
 }
 
 void FakeVimPluginPrivate::editorOpened(Core::IEditor *editor)