diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp
index 46bda9ecb92fedf03a396697680e22fc17963c01..5b6dd910513d6f7a71eb2af430ec07de4fed755f 100644
--- a/src/plugins/fakevim/fakevimhandler.cpp
+++ b/src/plugins/fakevim/fakevimhandler.cpp
@@ -348,6 +348,10 @@ public:
 
     QPointer<QObject> m_extraData;
     int m_cursorWidth;
+
+    void recordJump();
+    QList<int> m_jumpListUndo;
+    QList<int> m_jumpListRedo;
 };
 
 FakeVimHandler::Private::Private(FakeVimHandler *parent, QWidget *widget)
@@ -797,6 +801,7 @@ bool FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
         m_lastSearchForward = (key == '*');
         updateMiniBuffer();
         search(needle, m_lastSearchForward);
+        recordJump();
     } else if (key == '\'') {
         m_subsubmode = TickSubSubMode;
     } else if (key == '|') {
@@ -946,6 +951,11 @@ bool FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
             moveToStartOfLine();
         else
             moveToFirstNonBlankOnLine();
+    } else if (key == control('i')) {
+        if (!m_jumpListRedo.isEmpty()) {
+            m_jumpListUndo.append(position());
+            m_tc.setPosition(m_jumpListRedo.takeLast());
+        }
     } else if (key == 'j' || key == Key_Down) {
         int savedColumn = m_desiredColumn;
         if (m_submode == NoSubMode || m_submode == ZSubMode
@@ -1001,8 +1011,10 @@ bool FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
         finishMovement();
     } else if (key == 'n') {
         search(lastSearchString(), m_lastSearchForward);
+        recordJump();
     } else if (key == 'N') {
         search(lastSearchString(), !m_lastSearchForward);
+        recordJump();
     } else if (key == 'o' || key == 'O') {
         recordBeginGroup();
         recordMove();
@@ -1018,6 +1030,11 @@ bool FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
             recordInsertText(QString(indentDist(), ' '));
         else
             recordInsertText(QString(numSpaces, ' '));
+    } else if (key == control('o')) {
+        if (!m_jumpListUndo.isEmpty()) {
+            m_jumpListRedo.append(position());
+            m_tc.setPosition(m_jumpListUndo.takeLast());
+        }
     } else if (key == 'p' || key == 'P') {
         recordBeginGroup();
         QString text = m_registers[m_register];
@@ -1298,6 +1315,7 @@ bool FakeVimHandler::Private::handleMiniBufferModes(int key, int unmodified,
             m_searchHistory.append(m_commandBuffer);
             m_lastSearchForward = (m_mode == SearchForwardMode);
             search(lastSearchString(), m_lastSearchForward);
+            recordJump();
         }
         enterCommandMode();
         updateMiniBuffer();
@@ -2106,6 +2124,13 @@ void FakeVimHandler::Private::quit()
 }
 
 
+void FakeVimHandler::Private::recordJump()
+{
+    m_jumpListUndo.append(position());
+    m_jumpListRedo.clear();
+    //qDebug() << m_jumpListUndo;
+}
+
 ///////////////////////////////////////////////////////////////////////
 //
 // FakeVimHandler