diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp
index b59cbc42130d7ac809711422d5545f15425d5e21..f6e9d7597087933bfe46bd44ca885dbac9c98f62 100644
--- a/src/plugins/fakevim/fakevimhandler.cpp
+++ b/src/plugins/fakevim/fakevimhandler.cpp
@@ -1749,9 +1749,6 @@ QWidget *FakeVimHandler::Private::editor() const
 
 void FakeVimHandler::Private::undo()
 {
-#if 0
-    EDITOR(undo());
-#else
     if (m_undoStack.isEmpty()) {
         showBlackMessage(tr("Already at oldest change"));
     } else {
@@ -1764,7 +1761,7 @@ void FakeVimHandler::Private::undo()
             m_tc.setPosition(op.position, MoveAnchor);
             if (!op.to.isEmpty()) {
                 m_tc.setPosition(op.position + op.to.size(), KeepAnchor);
-                m_tc.deleteChar();
+                m_tc.removeSelectedText();
             }
             if (!op.from.isEmpty())
                 m_tc.insertText(op.from);
@@ -1773,14 +1770,10 @@ void FakeVimHandler::Private::undo()
         m_redoStack.push(op);
         showBlackMessage(QString());
     }
-#endif
 }
 
 void FakeVimHandler::Private::redo()
 {
-#if 0
-    EDITOR(redo());
-#else
     if (m_redoStack.isEmpty()) {
         showBlackMessage(tr("Already at newest change"));
     } else {
@@ -1793,7 +1786,7 @@ void FakeVimHandler::Private::redo()
             m_tc.setPosition(op.position, MoveAnchor);
             if (!op.from.isEmpty()) {
                 m_tc.setPosition(op.position + op.from.size(), KeepAnchor);
-                m_tc.deleteChar();
+                m_tc.removeSelectedText();
             }
             if (!op.to.isEmpty())
                 m_tc.insertText(op.to);
@@ -1802,7 +1795,6 @@ void FakeVimHandler::Private::redo()
         m_undoStack.push(op);
         showBlackMessage(QString());
     }
-#endif
 }
 
 void FakeVimHandler::Private::recordBeginGroup()
@@ -1816,6 +1808,10 @@ void FakeVimHandler::Private::recordBeginGroup()
 
 void FakeVimHandler::Private::recordEndGroup()
 {
+    if (m_undoGroupStack.isEmpty()) {
+        qWarning("fakevim: undo groups not balanced.\n");
+        return;
+    }
     EditOperation op;
     op.itemCount = m_undoStack.size() - m_undoGroupStack.pop();
     //qDebug() << "POP " << op.itemCount << m_undoStack;
@@ -1835,7 +1831,7 @@ QString FakeVimHandler::Private::recordRemoveSelectedText()
     op.from = m_tc.selection().toPlainText();
     //qDebug() << "OP: " << op;
     recordOperation(op);
-    m_tc.deleteChar();
+    m_tc.removeSelectedText();
     return op.from;
 }
 
@@ -1904,6 +1900,7 @@ void FakeVimHandler::Private::enterInsertMode()
     EDITOR(setOverwriteMode(false));
     m_mode = InsertMode;
     m_lastInsertion.clear();
+    recordBeginGroup();
 }
 
 void FakeVimHandler::Private::enterCommandMode()