diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp
index 65333413d2014046beed9dd0e5807adab466548f..d8cbeff59e4e526896d48f55d5b641d46ada8aea 100644
--- a/src/plugins/fakevim/fakevimhandler.cpp
+++ b/src/plugins/fakevim/fakevimhandler.cpp
@@ -893,6 +893,13 @@ bool FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
         moveDown(qMax(count() - 1, 0));
         moveRight(rightDist());
         finishMovement();
+    } 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 == 'e') {
         m_moveType = MoveInclusive;
         moveToWordBoundary(false, true);
@@ -1068,6 +1075,13 @@ bool FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
         // FIXME: this is non-vim, but as Ctrl-R is taken globally
         // we have a substitute here
         redo();
+    } 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 == 'v') {
         enterVisualMode(VisualCharMode);
     } else if (key == 'V') {
@@ -1137,20 +1151,6 @@ 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();
@@ -1588,6 +1588,7 @@ void FakeVimHandler::Private::search(const QString &needle0, bool forward)
     if (EDITOR(find(needle, flags))) {
         m_tc = EDITOR(textCursor());
         m_tc.setPosition(m_tc.anchor());
+        // making this unconditional feels better, but is not "vim like"
         if (oldLine != cursorLineInDocument() - cursorLineOnScreen())
             scrollToLineInDocument(cursorLineInDocument() - linesOnScreen() / 2);
         return;
diff --git a/tests/manual/fakevim/main.cpp b/tests/manual/fakevim/main.cpp
index 2de37c1073315bc5f10696423a74782d2027e1c2..a78453528a2193f94b59966f0fc1120537e2e884 100644
--- a/tests/manual/fakevim/main.cpp
+++ b/tests/manual/fakevim/main.cpp
@@ -17,8 +17,8 @@ class Proxy : public QObject
     Q_OBJECT
 
 public:
-    Proxy(QWidget *widget, QObject *parent = 0)
-      : QObject(parent), m_widget(widget)
+    Proxy(QWidget *widget, QMainWindow *mw, QObject *parent = 0)
+      : QObject(parent), m_widget(widget), m_mainWindow(mw)
     {}
 
 public slots:
@@ -30,13 +30,35 @@ public slots:
             ed->setExtraSelections(s);
     }
 
+    void changeStatusData(const QString &info)
+    {
+        m_statusData = info;
+        updateStatusBar();
+    }
+
+    void changeStatusMessage(const QString &info)
+    {
+        m_statusMessage = info;
+        updateStatusBar();
+    }
+
     void changeExtraInformation(const QString &info)
     {
         QMessageBox::information(m_widget, "Information", info);
     }
+    
+    void updateStatusBar()
+    {
+        int slack = 80 - m_statusMessage.size() - m_statusData.size();
+        QString msg = m_statusMessage + QString(slack, QChar(' ')) + m_statusData;
+        m_mainWindow->statusBar()->showMessage(msg);
+    }
 
 private:
     QWidget *m_widget;
+    QMainWindow *m_mainWindow;
+    QString m_statusMessage;
+    QString m_statusData;
 };
 
 int main(int argc, char *argv[])
@@ -64,11 +86,11 @@ int main(int argc, char *argv[])
     //widget->resize(450, 350);
     widget->setFocus();
 
-    Proxy proxy(widget);
+    QMainWindow mw;
+    Proxy proxy(widget, &mw);
 
     FakeVimHandler handler(widget, 0);
 
-    QMainWindow mw;
     mw.setWindowTitle("Fakevim (" + title + ")");
     mw.setCentralWidget(widget);
     mw.resize(600, 650);
@@ -85,15 +107,16 @@ int main(int argc, char *argv[])
     mw.statusBar()->setFont(font);
 
     QObject::connect(&handler, SIGNAL(commandBufferChanged(QString)),
-        mw.statusBar(), SLOT(showMessage(QString)));
+        &proxy, SLOT(changeStatusMessage(QString)));
     QObject::connect(&handler, SIGNAL(quitRequested()),
         &app, SLOT(quit()));
     QObject::connect(&handler,
         SIGNAL(selectionChanged(QList<QTextEdit::ExtraSelection>)),
         &proxy, SLOT(changeSelection(QList<QTextEdit::ExtraSelection>)));
-    QObject::connect(&handler,
-        SIGNAL(extraInformationChanged(QString)),
+    QObject::connect(&handler, SIGNAL(extraInformationChanged(QString)),
         &proxy, SLOT(changeExtraInformation(QString)));
+    QObject::connect(&handler, SIGNAL(statusDataChanged(QString)),
+        &proxy, SLOT(changeStatusData(QString)));
 
     handler.setupWidget();
     if (args.size() >= 1)