diff --git a/src/plugins/fakevim/fakevim_test.cpp b/src/plugins/fakevim/fakevim_test.cpp
index ae2a7a31c3520791f9b0a362720e6c1b5ad33160..0cabd226acd4ca1e921f508dbd8d8ae421432f0d 100644
--- a/src/plugins/fakevim/fakevim_test.cpp
+++ b/src/plugins/fakevim/fakevim_test.cpp
@@ -786,6 +786,21 @@ void FakeVimPlugin::test_vim_delete()
     KEYS("\"xd$", X "" N "def");
     KEYS("\"xp", "ab" X "c" N "def");
     KEYS("2\"xp", "abcabcab" X "c" N "def");
+
+    /* QTCREATORBUG-9289 */
+    data.setText("abc" N "def");
+    KEYS("$" "dw", "a" X "b" N "def");
+    KEYS("dw", X "a" N "def");
+    KEYS("dw", X "" N "def");
+    KEYS("dw", X "def");
+
+    data.setText("abc" N "def ghi");
+    KEYS("2dw", X "ghi");
+
+    data.setText("abc" N X "" N "def");
+    KEYS("dw", "abc" N X "def");
+    KEYS("k$" "dw", "a" X "b" N "def");
+    KEYS("j$h" "dw", "ab" N X "d");
 }
 
 void FakeVimPlugin::test_vim_delete_inner_word()
diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp
index b288d73f8a0658c423a03a8b89a2598c6360fe1d..7bebc74ddc0cde412415a1b7fe467e6558c498d6 100644
--- a/src/plugins/fakevim/fakevimhandler.cpp
+++ b/src/plugins/fakevim/fakevimhandler.cpp
@@ -1505,7 +1505,7 @@ public:
     bool atBlockStart() const { return m_cursor.atBlockStart(); }
     bool atBlockEnd() const { return m_cursor.atBlockEnd(); }
     bool atEndOfLine() const { return atBlockEnd() && block().length() > 1; }
-    bool atDocumentEnd() const { return position() >= lastPositionInDocument(); }
+    bool atDocumentEnd() const { return position() >= lastPositionInDocument(true); }
     bool atDocumentStart() const { return m_cursor.atStart(); }
 
     bool atEmptyLine(const QTextCursor &tc = QTextCursor()) const;
@@ -3507,6 +3507,11 @@ bool FakeVimHandler::Private::handleMovement(const Input &input)
             m_movetype = MoveInclusive;
         } else {
             moveToNextWordStart(count, simple, true);
+            // Command 'dw' deletes to the next word on the same line or to end of line.
+            if (m_submode == DeleteSubMode && count == 1) {
+                const QTextBlock currentBlock = document()->findBlock(anchor());
+                setPosition(qMin(position(), currentBlock.position() + currentBlock.length()));
+            }
             m_movetype = MoveExclusive;
         }
         setTargetColumn();