diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp
index c8cf6b908296523b40971b3fc21f2cf6c7c9e317..d690a3452cd952e32a804985cbbbf0b4ef07e2f4 100644
--- a/src/plugins/fakevim/fakevimhandler.cpp
+++ b/src/plugins/fakevim/fakevimhandler.cpp
@@ -1178,7 +1178,7 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
         m_passing = !m_passing;
         updateMiniBuffer();
     } else if (key == '.') {
-        //qDebug() << "REPEATING" << quoteUnprintable(m_dotCommand);
+        //qDebug() << "REPEATING" << quoteUnprintable(m_dotCommand) << count();
         QString savedCommand = m_dotCommand;
         m_dotCommand.clear();
         replay(savedCommand, count());
@@ -1366,6 +1366,8 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
         }
         finishMovement("j");
     } else if (key == 'J') {
+        setDotCommand("%1J", count());
+        beginEditBlock();
         if (m_submode == NoSubMode) {
             for (int i = qMax(count(), 2) - 1; --i >= 0; ) {
                 moveToEndOfLine();
@@ -1380,6 +1382,8 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
             if (!m_gflag)
                 moveLeft();
         }
+        endEditBlock();
+        finishMovement();
     } else if (key == 'k' || key == Key_Up) {
         if (m_submode == NoSubMode || m_submode == ZSubMode
                 || m_submode == CapitalZSubMode || m_submode == RegisterSubMode) {
diff --git a/tests/auto/fakevim/main.cpp b/tests/auto/fakevim/main.cpp
index d3e71f5032bc8682aad4aa6f94c2d571d1fc684a..5c692fc5eaf169bf6e40b793fdcf1b78f9efcc9f 100644
--- a/tests/auto/fakevim/main.cpp
+++ b/tests/auto/fakevim/main.cpp
@@ -56,26 +56,27 @@ public slots:
     
 private slots:
     // command mode
+    void command_Cxx_down_dot();
+    void command_Gyyp();
+    void command_J();
+    void command_Yp();
     void command_cc();
     void command_cw();
-    void command_dw();
     void command_dd();
     void command_dd_2();
+    void command_dfx_down();
     void command_dollar();
     void command_down();
-    void command_dfx_down();
-    void command_Cxx_down_dot();
+    void command_dw();
     void command_e();
     void command_i();
     void command_left();
+    void command_ma_yank();
     void command_r();
     void command_right();
     void command_up();
     void command_w();
     void command_yyp();
-    void command_Yp();
-    void command_Gyyp();
-    void command_ma_yank();
 
     // special tests
     void test_i_cw_i();
@@ -525,6 +526,21 @@ return; // FIXME: not in sync with Gui behaviour?
     check("iaa" + escape,    l[0] + "\nxya@ay" + lmid(1));
 }
 
+void tst_FakeVim::command_J()
+{
+    setup();
+    move("4j4l",   "int @main");
+    
+    check("J", lmid(0, 5) + "@ " + lmid(5));
+    check("u", lmid(0, 4) + "\nint @main(int argc, char *argv[])\n" + lmid(5));  
+    checkEx("redo", lmid(0, 5) + "@ " + lmid(5));
+
+return; // FIXME: not in sync with Gui behaviour?
+    check("3J", lmid(0, 5) + " " + lmid(5, 1) + "@" + lmid(6).mid(3));
+    check("u", lmid(0, 4) + "\nint @main(int argc, char *argv[])\n" + lmid(5));  
+    checkEx("redo", lmid(0, 5) + "@ " + lmid(5));
+}
+
 
 /*