diff --git a/src/plugins/fakevim/handler.cpp b/src/plugins/fakevim/handler.cpp
index 9807f867132614f3b7b856a3401a3f07d595ffda..22f78b44bbf252d8659f46a60c510919a71261a1 100644
--- a/src/plugins/fakevim/handler.cpp
+++ b/src/plugins/fakevim/handler.cpp
@@ -68,6 +68,7 @@ using namespace FakeVim::Internal;
 ///////////////////////////////////////////////////////////////////////
 
 #define EDITOR(s) (m_textedit ? m_textedit->s : m_plaintextedit->s)
+#define THE_EDITOR (m_textedit ? (QWidget*)m_textedit : (QWidget*)m_plaintextedit)
 
 const int ParagraphSeparator = 0x00002029;
 
@@ -482,6 +483,12 @@ void FakeVimHandler::Private::handleCommandMode(int key, const QString &text)
         search(lastSearchString(), m_lastSearchForward);
     } else if (key == 'N') {
         search(lastSearchString(), !m_lastSearchForward);
+    } else if (key == 'o') {
+        m_mode = InsertMode;
+        m_lastInsertion.clear();
+        //m_tc.beginEditBlock();  // FIXME: unusable due to drawing errors
+        m_tc.movePosition(EndOfLine, MoveAnchor);
+        m_tc.insertText("\n");
     } else if (key == 'p') {
         QString text = m_registers[m_register];
         int n = text.count(QChar(ParagraphSeparator));
@@ -732,10 +739,7 @@ void FakeVimHandler::Private::handleCommand(const QString &cmd0)
             ->findBlockByNumber(beginLine - 1).position());
         showMessage(QString());
     } else if (cmd == "q!" || cmd == "q") {
-        if (m_textedit)
-            q->quitRequested(m_textedit);
-        else
-            q->quitRequested(m_plaintextedit);
+        q->quitRequested(THE_EDITOR);
         showMessage(QString());
     } else if (reWrite.indexIn(cmd) != -1) {
         bool forced = cmd.startsWith("w!");