diff --git a/src/plugins/fakevim/fakevim_test.cpp b/src/plugins/fakevim/fakevim_test.cpp
index f04ee3b20efb60044c2afa7870cd3e2c40af2a01..03dabb6f26af45895c2ac38ccb28a942817bdf58 100644
--- a/src/plugins/fakevim/fakevim_test.cpp
+++ b/src/plugins/fakevim/fakevim_test.cpp
@@ -1607,6 +1607,14 @@ void FakeVimPlugin::test_vim_letter_case()
     // upper- and lower-case
     data.setText("abc DEF");
     KEYS("~", "A" X "bc DEF");
+    INTEGRITY(false);
+    KEYS("4~", "ABC d" X "EF");
+    INTEGRITY(false);
+
+    data.setText("abc DEF" N "ghi");
+    KEYS("l9~", "aBC de" X "f" N "ghi");
+    KEYS(".", "aBC de" X "F" N "ghi");
+    KEYS("h.", "aBC dE" X "f" N "ghi");
 
     data.setText("abc DEF");
     KEYS("lv3l~", "a" X "BC dEF");
diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp
index e061d76e7debf48989084b918e427d5f37568e9d..b37747a3d755859bb203949c52875934b68c0ef3 100644
--- a/src/plugins/fakevim/fakevimhandler.cpp
+++ b/src/plugins/fakevim/fakevimhandler.cpp
@@ -3838,19 +3838,22 @@ bool FakeVimHandler::Private::handleNoSubMode(const Input &input)
             else if (input.is('U'))
                 m_submode = UpCaseSubMode;
         } else {
-            if (!atEndOfLine()) {
-                beginEditBlock();
-                setAnchor();
-                moveRight(qMin(count(), rightDist()));
-                if (input.is('~'))
-                    invertCase(currentRange());
-                else if (input.is('u'))
-                    downCase(currentRange());
-                else if (input.is('U'))
-                    upCase(currentRange());
-                setDotCommand(QString::fromLatin1("%1%2").arg(count()).arg(input.raw()));
-                endEditBlock();
+            beginEditBlock();
+            if (atEndOfLine())
+                moveLeft();
+            setAnchor();
+            moveRight(qMin(count(), rightDist()));
+            if (input.is('~')) {
+                const int pos = position();
+                invertCase(currentRange());
+                setPosition(pos);
+            } else if (input.is('u')) {
+                downCase(currentRange());
+            } else if (input.is('U')) {
+                upCase(currentRange());
             }
+            setDotCommand(QString::fromLatin1("%1%2").arg(count()).arg(input.raw()));
+            endEditBlock();
         }
     } else if (input.isKey(Key_Delete)) {
         setAnchor();
@@ -7533,6 +7536,7 @@ void FakeVimHandler::setTextCursorPosition(int position)
         d->setPosition(pos);
     else
         d->setAnchorAndPosition(pos, pos);
+    d->m_fakeEnd = false;
     d->setTargetColumn();
 }