diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp
index 70d96bd1df06090a1659f82a03507e92bb88525d..8aa100071c51f54fbf45e8ea53eba09d280e698e 100644
--- a/src/plugins/fakevim/fakevimhandler.cpp
+++ b/src/plugins/fakevim/fakevimhandler.cpp
@@ -265,7 +265,8 @@ public:
     void shiftRegionRight(int repeat = 1);
 
     void moveToFirstNonBlankOnLine();
-    void moveToDesiredColumn();
+    void moveToTargetColumn();
+    void setTargetColumn() { m_targetColumn = leftDist(); }
     void moveToNextWord(bool simple);
     void moveToMatchingParanthesis();
     void moveToWordBoundary(bool simple, bool forward);
@@ -315,6 +316,7 @@ public:
     int m_subsubdata;
     QString m_input;
     QTextCursor m_tc;
+    QTextCursor m_oldTc; // copy from last event to check for external changes
     int m_anchor;
     QHash<int, QString> m_registers;
     int m_register;
@@ -381,7 +383,7 @@ public:
 
     // for restoring cursor position
     int m_savedYankPosition;
-    int m_desiredColumn;
+    int m_targetColumn;
 
     int m_cursorWidth;
 
@@ -390,6 +392,7 @@ public:
     bool removeAutomaticIndentation(); // true if something removed
     // number of autoindented characters
     int m_justAutoIndented;
+    void handleStartOfLine();
 
     void recordJump();
     void recordNewUndo();
@@ -418,7 +421,7 @@ FakeVimHandler::Private::Private(FakeVimHandler *parent, QWidget *widget)
     m_register = '"';
     m_gflag = false;
     m_visualMode = NoVisualMode;
-    m_desiredColumn = 0;
+    m_targetColumn = 0;
     m_moveType = MoveInclusive;
     m_anchor = 0;
     m_savedYankPosition = 0;
@@ -485,8 +488,12 @@ EventResult FakeVimHandler::Private::handleEvent(QKeyEvent *ev)
 
     // Fake "End of line"
     m_tc = EDITOR(textCursor());
-    m_tc.setVisualNavigation(true);
 
+    if (m_tc.position() != m_oldTc.position())
+        setTargetColumn();
+
+    m_tc.setVisualNavigation(true);
+    
     if (m_fakeEnd)
         moveRight();
 
@@ -511,6 +518,7 @@ EventResult FakeVimHandler::Private::handleEvent(QKeyEvent *ev)
     if (m_fakeEnd)
         moveLeft();
 
+    m_oldTc = m_tc;
     EDITOR(setTextCursor(m_tc));
     return result;
 }
@@ -654,6 +662,8 @@ void FakeVimHandler::Private::finishMovement(const QString &dotCommand)
         updateMiniBuffer();
     }
 
+    moveToTargetColumn();
+
     m_moveType = MoveInclusive;
     m_mvcount.clear();
     m_opcount.clear();
@@ -663,7 +673,6 @@ void FakeVimHandler::Private::finishMovement(const QString &dotCommand)
 
     updateSelection();
     updateMiniBuffer();
-    m_desiredColumn = leftDist();
 }
 
 void FakeVimHandler::Private::updateSelection()
@@ -984,7 +993,7 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
         m_moveType = MoveExclusive;
         finishMovement("$");
         if (submode == NoSubMode)
-            m_desiredColumn = -1;
+            m_targetColumn = -1;
     } else if (key == ',') {
         // FIXME: use some other mechanism
         //m_passing = true;
@@ -1079,7 +1088,7 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
         int sline = cursorLineOnScreen();
         // FIXME: this should use the "scroll" option, and "count"
         moveDown(linesOnScreen() / 2);
-        moveToFirstNonBlankOnLine();
+        handleStartOfLine();
         scrollToLineInDocument(cursorLineInDocument() - sline);
         finishMovement();
     } else if (key == 'e') {
@@ -1108,8 +1117,7 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
         if (m_gflag) {
             m_gflag = false;
             m_tc.setPosition(firstPositionInLine(1), KeepAnchor);
-            if (hasConfig(ConfigStartOfLine))
-                moveToFirstNonBlankOnLine();
+            handleStartOfLine();
             finishMovement();
         } else {
             m_gflag = true;
@@ -1117,8 +1125,7 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
     } else if (key == 'G') {
         int n = m_mvcount.isEmpty() ? linesInDocument() : count();
         m_tc.setPosition(firstPositionInLine(n), KeepAnchor);
-        if (hasConfig(ConfigStartOfLine))
-            moveToFirstNonBlankOnLine();
+        handleStartOfLine();
         finishMovement();
     } else if (key == 'h' || key == Key_Left
             || key == Key_Backspace || key == control('h')) {
@@ -1126,11 +1133,12 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
         if (m_fakeEnd && m_tc.block().length() > 1)
             ++n;
         moveLeft(n);
+        setTargetColumn();
         finishMovement("h");
     } else if (key == 'H') {
         m_tc = EDITOR(cursorForPosition(QPoint(0, 0)));
         moveDown(qMax(count() - 1, 0));
-        moveToFirstNonBlankOnLine();
+        handleStartOfLine();
         finishMovement();
     } else if (key == 'i') {
         m_dotCommand = "i"; //QString("%1i").arg(count());
@@ -1152,12 +1160,9 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
             setPosition(m_jumpListRedo.takeLast());
         }
     } else if (key == 'j' || key == Key_Down) {
-        //qDebug() << "DESIRED COLUMN" << m_desiredColumn;
-        int savedColumn = m_desiredColumn;
         if (m_submode == NoSubMode || m_submode == ZSubMode
                 || m_submode == RegisterSubMode) {
             moveDown(count());
-            moveToDesiredColumn();
         } else {
             m_moveType = MoveLineWise;
             moveToStartOfLine();
@@ -1165,7 +1170,6 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
             moveDown(count() + 1);
         }
         finishMovement("j");
-        m_desiredColumn = savedColumn;
     } else if (key == 'J') {
         if (m_submode == NoSubMode) {
             for (int i = qMax(count(), 2) - 1; --i >= 0; ) {
@@ -1182,11 +1186,9 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
                 moveLeft();
         }
     } else if (key == 'k' || key == Key_Up) {
-        int savedColumn = m_desiredColumn;
         if (m_submode == NoSubMode || m_submode == ZSubMode
                 || m_submode == RegisterSubMode) {
             moveUp(count());
-            moveToDesiredColumn();
         } else {
             m_moveType = MoveLineWise;
             moveToStartOfLine();
@@ -1195,15 +1197,15 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
             moveUp(count() + 1);
         }
         finishMovement("k");
-        m_desiredColumn = savedColumn;
     } else if (key == 'l' || key == Key_Right || key == ' ') {
         m_moveType = MoveExclusive;
         moveRight(qMin(count(), rightDist()));
+        setTargetColumn();
         finishMovement("l");
     } else if (key == 'L') {
         m_tc = EDITOR(cursorForPosition(QPoint(0, EDITOR(height()))));
         moveUp(qMax(count(), 1));
-        moveToFirstNonBlankOnLine();
+        handleStartOfLine();
         finishMovement();
     } else if (key == control('l')) {
         // screen redraw. should not be needed
@@ -1211,7 +1213,7 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
         m_subsubmode = MarkSubSubMode;
     } else if (key == 'M') {
         m_tc = EDITOR(cursorForPosition(QPoint(0, EDITOR(height()) / 2)));
-        moveToFirstNonBlankOnLine();
+        handleStartOfLine();
         finishMovement();
     } else if (key == 'n') {
         search(lastSearchString(), m_lastSearchForward);
@@ -1240,7 +1242,7 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
         //qDebug() << "LINES: " << n << text << m_register;
         if (n > 0) {
             moveToStartOfLine();
-            m_desiredColumn = 0;
+            m_targetColumn = 0;
             for (int i = count(); --i >= 0; ) {
                 if (key == 'p')
                     moveDown();
@@ -1249,7 +1251,7 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
             }
             moveToFirstNonBlankOnLine();
         } else {
-            m_desiredColumn = 0;
+            m_targetColumn = 0;
             for (int i = count(); --i >= 0; ) {
                 if (key == 'p')
                     moveRight();
@@ -1295,7 +1297,7 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
         int sline = cursorLineOnScreen();
         // FIXME: this should use the "scroll" option, and "count"
         moveUp(linesOnScreen() / 2);
-        moveToFirstNonBlankOnLine();
+        handleStartOfLine();
         scrollToLineInDocument(cursorLineInDocument() - sline);
         finishMovement();
     } else if (key == 'v') {
@@ -1375,12 +1377,12 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
     } else if (key == Key_PageDown || key == control('f')) {
         moveDown(count() * (linesOnScreen() - 2) - cursorLineOnScreen());
         scrollToLineInDocument(cursorLineInDocument());
-        moveToFirstNonBlankOnLine();
+        handleStartOfLine();
         finishMovement();
     } else if (key == Key_PageUp || key == control('b')) {
         moveUp(count() * (linesOnScreen() - 2) + cursorLineOnScreen());
         scrollToLineInDocument(cursorLineInDocument() + linesOnScreen() - 2);
-        moveToFirstNonBlankOnLine();
+        handleStartOfLine();
         finishMovement();
     } else if (key == Key_Delete) {
         setAnchor();
@@ -1415,6 +1417,7 @@ EventResult FakeVimHandler::Private::handleInsertMode(int key, int,
             data += m_lastInsertion;
         }
         moveLeft(qMin(1, leftDist()));
+        setTargetColumn();
         m_dotCommand += m_lastInsertion;
         m_dotCommand += QChar(27);
         recordNewUndo();
@@ -1989,12 +1992,12 @@ void FakeVimHandler::Private::shiftRegionLeft(int repeat)
     m_dotCommand = QString("%1<<").arg(endLine - beginLine + 1);
 }
 
-void FakeVimHandler::Private::moveToDesiredColumn()
+void FakeVimHandler::Private::moveToTargetColumn()
 {
-   if (m_desiredColumn == -1 || m_tc.block().length() <= m_desiredColumn)
-       m_tc.movePosition(EndOfLine, KeepAnchor);
-   else
-       m_tc.setPosition(m_tc.block().position() + m_desiredColumn, KeepAnchor);
+    if (m_targetColumn == -1 || m_tc.block().length() <= m_targetColumn)
+        m_tc.movePosition(EndOfLine, KeepAnchor);
+    else
+        m_tc.setPosition(m_tc.block().position() + m_targetColumn, KeepAnchor);
 }
 
 static int charClass(QChar c, bool simple)
@@ -2326,6 +2329,12 @@ bool FakeVimHandler::Private::removeAutomaticIndentation()
     return true;
 }
 
+void FakeVimHandler::Private::handleStartOfLine()
+{
+    if (hasConfig(ConfigStartOfLine))
+        moveToFirstNonBlankOnLine();
+}
+
 
 ///////////////////////////////////////////////////////////////////////
 //