diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp
index ccaed6869a8f5540570c6586a7ab77098b8f786f..92c38397332c65b08d5cfc74e0ccf5989da35421 100644
--- a/src/plugins/fakevim/fakevimhandler.cpp
+++ b/src/plugins/fakevim/fakevimhandler.cpp
@@ -48,6 +48,7 @@
 #include <QtCore/QProcess>
 #include <QtCore/QRegExp>
 #include <QtCore/QTextStream>
+#include <QtCore/QtAlgorithms>
 #include <QtCore/QStack>
 
 #include <QtGui/QApplication>
@@ -416,7 +417,7 @@ void FakeVimHandler::Private::finishMovement(const QString &dotCommand)
         int start = m_tc.selectionStart();
         int end = m_tc.selectionEnd();
         if (start > end)
-            std::swap(start, end);
+            qSwap(start, end);
         QTextBlock startBlock = doc->findBlock(start);
         indentRegion(doc->findBlock(start), doc->findBlock(end).next());
         m_tc.setPosition(startBlock.position());
@@ -596,7 +597,7 @@ bool FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
             moveToFirstNonBlankOnLine();
             finishMovement();
         } else {
-            qDebug() << "Ignored z + " << key << text;
+            qDebug() << "IGNORED Z_MODE " << key << text;
         }
         m_submode = NoSubMode;
     } else if (m_subsubmode == FtSubSubMode) {
@@ -640,6 +641,14 @@ bool FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
         updateMiniBuffer();
     } else if (key == '`') {
         m_subsubmode = BackTickSubSubMode;
+    } else if (key == '#' || key == '*') {
+        // FIXME: That's not proper vim behaviour
+        m_tc.select(QTextCursor::WordUnderCursor);
+        QString needle = "\\<" + m_tc.selection().toPlainText() + "\\>";
+        m_searchHistory.append(needle);
+        m_lastSearchForward = (key == '*');
+        updateMiniBuffer();
+        search(needle, m_lastSearchForward);
     } else if (key == '\'') {
         m_subsubmode = TickSubSubMode;
     } else if (key == '|') {
@@ -918,7 +927,7 @@ bool FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
         if (m_visualMode != NoVisualMode)
             leaveVisualMode();
     } else {
-        qDebug() << "Ignored in command mode: " << key << text;
+        qDebug() << "IGNORED IN COMMAND MODE: " << key << text;
         if (text.isEmpty())
             handled = false;
     }
@@ -1296,13 +1305,22 @@ void FakeVimHandler::Private::handleExCommand(const QString &cmd0)
     }
 }
 
-void FakeVimHandler::Private::search(const QString &needle, bool forward)
+void FakeVimHandler::Private::search(const QString &needle0, bool forward)
 {
-    //qDebug() << "NEEDLE " << needle << "BACKWARDS" << backwards;
+    showBlackMessage("?/"[m_lastSearchForward ^ forward] + needle0);
     QTextCursor orig = m_tc;
     QTextDocument::FindFlags flags = QTextDocument::FindCaseSensitively;
     if (!forward)
-        flags = QTextDocument::FindBackward;
+        flags |= QTextDocument::FindBackward;
+
+    // FIXME: Rough mapping of a common case
+    QString needle = needle0;
+    if (needle.startsWith("\\<") && needle.endsWith("\\>"))
+        flags |= QTextDocument::FindWholeWords;
+    needle.replace("\\<", ""); // start of word
+    needle.replace("\\>", ""); // end of word
+
+    qDebug() << "NEEDLE " << needle0 << needle << "FORWARD" << forward << flags;
 
     if (forward)
         m_tc.movePosition(Right, MoveAnchor, 1);
@@ -1311,7 +1329,8 @@ void FakeVimHandler::Private::search(const QString &needle, bool forward)
     if (EDITOR(find(needle, flags))) {
         m_tc = EDITOR(textCursor());
         // the qMax seems to be needed for QPlainTextEdit only
-        m_tc.movePosition(Left, MoveAnchor, qMax(1, needle.size() - 1));
+        //m_tc.movePosition(Left, MoveAnchor, qMax(1, needle.size() - 1));
+        m_tc.setPosition(m_tc.anchor());
         return;
     }
 
@@ -1320,7 +1339,8 @@ void FakeVimHandler::Private::search(const QString &needle, bool forward)
     if (EDITOR(find(needle, flags))) {
         m_tc = EDITOR(textCursor());
         // the qMax seems to be needed for QPlainTextEdit only
-        m_tc.movePosition(Left, MoveAnchor, qMax(1, needle.size() - 1));
+        //m_tc.movePosition(Left, MoveAnchor, qMax(1, needle.size() - 1));
+        m_tc.setPosition(m_tc.anchor());
         if (forward)
             showRedMessage("search hit BOTTOM, continuing at TOP");
         else