diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp
index 035fdb6792846d9cbbec5558aae1836fbde3e6a5..52eb88e9164caa64e43137c32da799c05d7d53b1 100644
--- a/src/plugins/fakevim/fakevimhandler.cpp
+++ b/src/plugins/fakevim/fakevimhandler.cpp
@@ -794,7 +794,10 @@ void FakeVimHandler::Private::updateMiniBuffer()
             msg = "-- VISUAL BLOCK --";
         }
     } else if (m_mode == InsertMode) {
-        msg = "-- INSERT --";
+        if (m_submode == ReplaceSubMode)
+            msg = "-- REPLACE --";
+        else
+            msg = "-- INSERT --";
     } else {
         if (m_mode == SearchForwardMode)
             msg += '/';
@@ -1200,7 +1203,7 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
         moveDown(qMax(count() - 1, 0));
         handleStartOfLine();
         finishMovement();
-    } else if (key == 'i') {
+    } else if (key == 'i' || key == Key_Insert) {
         setDotCommand("i"); // setDotCommand("%1i", count());
         enterInsertMode();
         updateMiniBuffer();
@@ -1484,6 +1487,16 @@ EventResult FakeVimHandler::Private::handleInsertMode(int key, int,
         m_dotCommand += QChar(27);
         recordNewUndo();
         enterCommandMode();
+    } else if (key == Key_Insert) {
+        if (m_submode == ReplaceSubMode) {
+            EDITOR(setCursorWidth(m_cursorWidth));
+            EDITOR(setOverwriteMode(false));
+            m_submode = NoSubMode;
+        } else {
+            EDITOR(setCursorWidth(m_cursorWidth));
+            EDITOR(setOverwriteMode(true));
+            m_submode = ReplaceSubMode;
+        }
     } else if (key == Key_Left) {
         moveLeft(count());
         m_lastInsertion.clear();