diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp
index 15d663a5b66b5a053c7015acc64da0013313d76d..68fe14027851f64cef7e816a6d34cb392bc84ba1 100644
--- a/src/plugins/fakevim/fakevimhandler.cpp
+++ b/src/plugins/fakevim/fakevimhandler.cpp
@@ -286,11 +286,11 @@ public:
     void recordInsert(int position, const QString &data);
     void recordRemove(int position, const QString &data);
     void recordRemove(int position, int length);
-    void recordMove(int position, int nestedCount);
 
     void recordRemoveNextChar();
     void recordInsertText(const QString &data);
     QString recordRemoveSelectedText();
+    void recordMove();
     void recordBeginGroup();
     void recordEndGroup();
     int anchor() const { return m_anchor; }
@@ -928,19 +928,27 @@ bool FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
         //qDebug() << "REGISTERS: " << m_registers << "MOVE: " << m_moveType;
         //qDebug() << "LINES: " << n << text << m_register;
         if (n > 0) {
+            recordMove();
             moveToStartOfLine();
-            if (key == 'p')
-                moveDown();
-            recordInsertText(text);
-            moveUp(n);
+            m_desiredColumn = 0;
+            for (int i = count(); --i >= 0; ) {
+                if (key == 'p')
+                    moveDown();
+                recordInsertText(text);
+                moveUp(n);
+            }
         } else {
-            if (key == 'p')
-                moveRight();
-            recordInsertText(text);
-            moveLeft();
+            m_desiredColumn = 0;
+            for (int i = count(); --i >= 0; ) {
+                if (key == 'p')
+                    moveRight();
+                recordInsertText(text);
+                moveLeft();
+            }
         }
         recordEndGroup();
-        m_dotCommand = "p";
+        m_dotCommand = QString("%1p").arg(count());
+        finishMovement();
     } else if (key == 'r') {
         m_submode = ReplaceSubMode;
         m_dotCommand = "r";
@@ -1868,8 +1876,19 @@ void FakeVimHandler::Private::recordInsertText(const QString &data)
     m_tc.insertText(data);
 }
 
+void FakeVimHandler::Private::recordMove()
+{
+    EditOperation op;
+    op.position = m_tc.position();
+    m_undoStack.push(op);
+    m_redoStack.clear();
+    //qDebug() << "MOVE: " << op;
+    //qDebug() << "\nSTACK: " << m_undoStack;
+}
+
 void FakeVimHandler::Private::recordOperation(const EditOperation &op)
 {
+    //qDebug() << "OP: " << op;
     // No need to record operations that actually do not change anything.
     if (op.from.isEmpty() && op.to.isEmpty() && op.itemCount == 0)
         return;
@@ -1878,14 +1897,7 @@ void FakeVimHandler::Private::recordOperation(const EditOperation &op)
         return;
     m_undoStack.push(op);
     m_redoStack.clear();
-}
-
-void FakeVimHandler::Private::recordMove(int position, int nestedCount)
-{
-    EditOperation op;
-    op.position = position;
-    op.itemCount = nestedCount;
-    recordOperation(op);
+    //qDebug() << "\nSTACK: " << m_undoStack;
 }
 
 void FakeVimHandler::Private::recordInsert(int position, const QString &data)