diff --git a/java/src/com/android/inputmethod/latin/RichInputConnection.java b/java/src/com/android/inputmethod/latin/RichInputConnection.java
index 4d174ddb845058350d00ee44d55e0849428fd415..7cf64a3bc497b0086fe2578b5978e6f5674ce79b 100644
--- a/java/src/com/android/inputmethod/latin/RichInputConnection.java
+++ b/java/src/com/android/inputmethod/latin/RichInputConnection.java
@@ -685,6 +685,10 @@ public final class RichInputConnection {
                 && !settingsValues.isWordConnector(codePointBeforeCursor)) {
             return true;
         }
+        return isCursorFollowedByWordCharacter(settingsValues);
+    }
+
+    public boolean isCursorFollowedByWordCharacter(final SettingsValues settingsValues) {
         final CharSequence after = getTextAfterCursor(1, 0);
         if (!TextUtils.isEmpty(after) && !settingsValues.isWordSeparator(after.charAt(0))
                 && !settingsValues.isWordConnector(after.charAt(0))) {
diff --git a/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java b/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java
index e0adacd0cd04a6b52b73a1de413285f4ebd02e14..968129a9628463dfddb638b6aef1b7531a207361 100644
--- a/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java
+++ b/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java
@@ -813,7 +813,8 @@ public final class InputLogic {
                 }
             }
             if (settingsValues.isSuggestionStripVisible()
-                    && settingsValues.mSpacingAndPunctuations.mCurrentLanguageHasSpaces) {
+                    && settingsValues.mSpacingAndPunctuations.mCurrentLanguageHasSpaces
+                    && !mConnection.isCursorFollowedByWordCharacter(settingsValues)) {
                 restartSuggestionsOnWordTouchedByCursor(settingsValues,
                         deleteCountAtStart - mDeleteCount /* offset */,
                         true /* includeResumedWordInSuggestions */, keyboardSwitcher);
@@ -1114,11 +1115,19 @@ public final class InputLogic {
                 keyboardSwitcher.getKeyboard());
         mWordComposer.setCursorPositionWithinWord(
                 typedWord.codePointCount(0, numberOfCharsInWordBeforeCursor));
-        // TODO: Change these two lines to setComposingRegion(cursorPosition,
+        // TODO: Change these lines to setComposingRegion(cursorPosition,
         //         cursorPosition + range.getNumberOfCharsInWordAfterCursor());
-        mConnection.deleteSurroundingText(numberOfCharsInWordBeforeCursor,
-              typedWord.length() - numberOfCharsInWordBeforeCursor);
-        mConnection.setComposingText(typedWord, 1);
+        if (0 != offset) {
+            // Backspace was pressed. We are at the end of a word, and we don't know the cursor
+            // position for sure, so use relative methods.
+            mConnection.deleteSurroundingText(numberOfCharsInWordBeforeCursor, 0);
+            mConnection.setComposingText(typedWord, 1);
+        } else {
+            // This is recorrection. The cursor position is reasonably reliable, and the cursor
+            // may be in the middle of a word so use setComposingRegion.
+            mConnection.setComposingRegion(expectedCursorPosition - numberOfCharsInWordBeforeCursor,
+                expectedCursorPosition + range.getNumberOfCharsInWordAfterCursor());
+        }
         if (suggestions.isEmpty()) {
             // We come here if there weren't any suggestion spans on this word. We will try to
             // compute suggestions for it instead.