diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp
index bedd2ccb38d2773a0727c6c19d598cba954e050d..ccaed6869a8f5540570c6586a7ab77098b8f786f 100644
--- a/src/plugins/fakevim/fakevimhandler.cpp
+++ b/src/plugins/fakevim/fakevimhandler.cpp
@@ -211,6 +211,7 @@ private:
     void enterCommandMode();
     void showRedMessage(const QString &msg);
     void showBlackMessage(const QString &msg);
+    void notImplementedYet();
     void updateMiniBuffer();
     void updateSelection();
     void quit();
@@ -550,6 +551,12 @@ void FakeVimHandler::Private::showBlackMessage(const QString &msg)
     updateMiniBuffer();
 }
 
+void FakeVimHandler::Private::notImplementedYet()
+{
+    showRedMessage("Not implemented in FakeVim");
+    updateMiniBuffer();
+}
+
 bool FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
     const QString &text)
 {
@@ -1084,6 +1091,7 @@ int FakeVimHandler::Private::readLineCode(QString &cmd)
         int mark = m_marks.value(cmd.at(0).unicode());
         if (!mark) { 
             showRedMessage(tr("E20: Mark '%1' not set").arg(cmd.at(0)));
+            cmd = cmd.mid(1);
             return -1;
         }
         cmd = cmd.mid(1);
@@ -1103,8 +1111,9 @@ int FakeVimHandler::Private::readLineCode(QString &cmd)
         int pos = m_marks.value(cmd.at(0).unicode(), -1);
         //qDebug() << " MARK: " << cmd.at(0) << pos << lineForPosition(pos);
         if (pos == -1) {
-             showRedMessage(tr("E20: Mark '%1' not set").arg(cmd.at(0)));
-             return -1;
+            showRedMessage(tr("E20: Mark '%1' not set").arg(cmd.at(0)));
+            cmd = cmd.mid(1);
+            return -1;
         }
         cmd = cmd.mid(1);
         return lineForPosition(pos);
@@ -1159,11 +1168,12 @@ void FakeVimHandler::Private::handleExCommand(const QString &cmd0)
             endLine = line;
     }
 
-    //qDebug() << "RANGE: " << beginLine << endLine << cmd << cmd0;
+    //qDebug() << "RANGE: " << beginLine << endLine << cmd << cmd0 << m_marks;
 
     static QRegExp reWrite("^w!?( (.*))?$");
     static QRegExp reDelete("^d( (.*))?$");
     static QRegExp reSet("^set?( (.*))?$");
+    static QRegExp reHistory("^his(tory)?( (.*))?$");
 
     if (cmd.isEmpty()) {
         m_tc.setPosition(positionForLine(beginLine));
@@ -1247,6 +1257,7 @@ void FakeVimHandler::Private::handleExCommand(const QString &cmd0)
         recordOperation(op);
 
         enterCommandMode();
+        //qDebug() << "FILTER: " << command;
         showBlackMessage(tr("%1 lines filtered").arg(text.count('\n')));
     } else if (cmd == "red" || cmd == "redo") { // :redo
         redo();
@@ -1258,7 +1269,25 @@ 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(info);
+            emit q->extraInformationChanged(editor(), info);
+        } else {
+            notImplementedYet();
+        }
+        enterCommandMode();
+        updateMiniBuffer();
+    } else if (reHistory.indexIn(cmd) != -1) { // :history
+        QString arg = reSet.cap(3);
+        if (arg.isEmpty()) {
+            QString info;
+            info += "#  command history\n";
+            int i = 0;
+            foreach (const QString &item, m_commandHistory) {
+                ++i;
+                info += QString("%1 %2\n").arg(i, -8).arg(item);
+            }
+            emit q->extraInformationChanged(editor(), info);
+        } else {
+            notImplementedYet();
         }
         enterCommandMode();
         updateMiniBuffer();
@@ -1581,6 +1610,7 @@ void FakeVimHandler::Private::enterVisualMode(VisualMode visualMode)
 {
     m_visualMode = visualMode;
     m_marks['<'] = m_tc.position();
+    m_marks['>'] = m_tc.position();
     updateMiniBuffer();
     updateSelection();
 }
@@ -1588,7 +1618,6 @@ void FakeVimHandler::Private::enterVisualMode(VisualMode visualMode)
 void FakeVimHandler::Private::leaveVisualMode()
 {
     m_visualMode = NoVisualMode;
-    m_marks['>'] = m_tc.position();
     updateMiniBuffer();
     updateSelection();
 }
diff --git a/src/plugins/fakevim/fakevimhandler.h b/src/plugins/fakevim/fakevimhandler.h
index aeba5ace87005fbb9a88460335122ac8743aa722..bbd58781e7f88344649b7fec1b9a5445fbb117b9 100644
--- a/src/plugins/fakevim/fakevimhandler.h
+++ b/src/plugins/fakevim/fakevimhandler.h
@@ -69,8 +69,8 @@ public slots:
 signals:
     void commandBufferChanged(const QString &msg);
     void statusDataChanged(const QString &msg);
-    void extraInformationChanged(const QString &msg);
-    void quitRequested(QWidget *);
+    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);
diff --git a/src/plugins/fakevim/fakevimplugin.cpp b/src/plugins/fakevim/fakevimplugin.cpp
index a27e988f4b4fd7fe81a5b4fa980446ad38ca3801..1fed16416b6623225ed96181b44622e66bcf1413 100644
--- a/src/plugins/fakevim/fakevimplugin.cpp
+++ b/src/plugins/fakevim/fakevimplugin.cpp
@@ -114,7 +114,7 @@ private slots:
     void installHandler(QWidget *widget);
     void removeHandler(QWidget *widget);
     void showCommandBuffer(const QString &contents);
-    void showExtraInformation(const QString &msg);
+    void showExtraInformation(QWidget *, const QString &msg);
     void editorOpened(Core::IEditor *);
     void editorAboutToClose(Core::IEditor *);
     void changeSelection(QWidget *widget,
@@ -200,8 +200,8 @@ void FakeVimPluginPrivate::installHandler()
 
 void FakeVimPluginPrivate::installHandler(QWidget *widget)
 {
-    connect(m_handler, SIGNAL(extraInformationChanged(QString)),
-        this, SLOT(showExtraInformation(QString)));
+    connect(m_handler, SIGNAL(extraInformationChanged(QWidget *, QString)),
+        this, SLOT(showExtraInformation(QWidget *, QString)));
     connect(m_handler, SIGNAL(commandBufferChanged(QString)),
         this, SLOT(showCommandBuffer(QString)));
     connect(m_handler, SIGNAL(quitRequested(QWidget *)),
@@ -281,9 +281,9 @@ void FakeVimPluginPrivate::showCommandBuffer(const QString &contents)
         tr("Quit FakeVim"), m_handler, SLOT(quit()));
 }
 
-void FakeVimPluginPrivate::showExtraInformation(const QString &text)
+void FakeVimPluginPrivate::showExtraInformation(QWidget *widget, const QString &text)
 {
-    QMessageBox::information(0, tr("FakeVim Information"), text);
+    QMessageBox::information(widget, tr("FakeVim Information"), text);
 }
 
 void FakeVimPluginPrivate::changeSelection(QWidget *widget,
diff --git a/tests/manual/fakevim/main.cpp b/tests/manual/fakevim/main.cpp
index c668601e78dd108d6ba20ef4a9668496050de1cb..dfa1350e5597ade677abf0aa7557788708c2c282 100644
--- a/tests/manual/fakevim/main.cpp
+++ b/tests/manual/fakevim/main.cpp
@@ -5,6 +5,7 @@
 
 #include <QtGui/QApplication>
 #include <QtGui/QMainWindow>
+#include <QtGui/QMessageBox>
 #include <QtGui/QPlainTextEdit>
 #include <QtGui/QStatusBar>
 #include <QtGui/QTextEdit>
@@ -16,7 +17,7 @@ class Proxy : public QObject
     Q_OBJECT
 
 public:
-    Proxy(QWidget *widget) : QObject(0), m_widget(widget) {}
+    Proxy() : QObject(0) {}
 
 public slots:
     void changeSelection(QWidget *w, const QList<QTextEdit::ExtraSelection> &s)
@@ -26,8 +27,11 @@ public slots:
         else if (QTextEdit *ed = qobject_cast<QTextEdit *>(w))
             ed->setExtraSelections(s);
     }
-private:
-    QWidget *m_widget; 
+
+    void changeExtraInformation(QWidget *w, const QString &info)
+    {
+        QMessageBox::information(w, "Information", info);
+    }
 };
 
 int main(int argc, char *argv[])
@@ -50,7 +54,7 @@ int main(int argc, char *argv[])
     widget->resize(450, 350);
     widget->setFocus();
 
-    Proxy proxy(widget);
+    Proxy proxy;
 
 
     FakeVimHandler handler;
@@ -78,6 +82,9 @@ int main(int argc, char *argv[])
     QObject::connect(&handler,
         SIGNAL(selectionChanged(QWidget*,QList<QTextEdit::ExtraSelection>)),
         &proxy, SLOT(changeSelection(QWidget*,QList<QTextEdit::ExtraSelection>)));
+    QObject::connect(&handler,
+        SIGNAL(extraInformationChanged(QWidget*,QString)),
+        &proxy, SLOT(changeExtraInformation(QWidget*,QString)));
 
     handler.addWidget(widget);
     if (args.size() >= 1)