diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index 094ccd77f608a78133aeedb68edfee3826205e3c..47d51c5866f2f1051e151cbb512df226eeb4aed4 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -1747,7 +1747,9 @@ public final class LatinIME extends InputMethodService implements KeyboardAction
                         ResearchLogger.getInstance().uncommitCurrentLogUnit(
                                 word, false /* dumpCurrentLogUnit */);
                     }
+                    final String rejectedSuggestion = mWordComposer.getTypedWord();
                     mWordComposer.reset();
+                    mWordComposer.setRejectedBatchModeSuggestion(rejectedSuggestion);
                 } else {
                     mWordComposer.deleteLast();
                 }
diff --git a/java/src/com/android/inputmethod/latin/Suggest.java b/java/src/com/android/inputmethod/latin/Suggest.java
index 6464bd0d789bac9a29463021aa79623ab4ac49a8..5abadf3dca931310fe5317bfc8bb634c00c2431e 100644
--- a/java/src/com/android/inputmethod/latin/Suggest.java
+++ b/java/src/com/android/inputmethod/latin/Suggest.java
@@ -334,6 +334,11 @@ public final class Suggest {
             }
         }
 
+        if (suggestionsContainer.size() > 1 && TextUtils.equals(suggestionsContainer.get(0).mWord,
+                wordComposer.getRejectedBatchModeSuggestion())) {
+            final SuggestedWordInfo rejected = suggestionsContainer.remove(0);
+            suggestionsContainer.add(1, rejected);
+        }
         SuggestedWordInfo.removeDups(suggestionsContainer);
         // In the batch input mode, the most relevant suggested word should act as a "typed word"
         // (typedWordValid=true), not as an "auto correct word" (willAutoCorrect=false).
diff --git a/java/src/com/android/inputmethod/latin/WordComposer.java b/java/src/com/android/inputmethod/latin/WordComposer.java
index 1af12428db4937f28515497fa1d612f56ba65b5d..098e8ac7bd9eefb78381540167d78bc7889c1352 100644
--- a/java/src/com/android/inputmethod/latin/WordComposer.java
+++ b/java/src/com/android/inputmethod/latin/WordComposer.java
@@ -42,6 +42,13 @@ public final class WordComposer {
     private String mAutoCorrection;
     private boolean mIsResumed;
     private boolean mIsBatchMode;
+    // A memory of the last rejected batch mode suggestion, if any. This goes like this: the user
+    // gestures a word, is displeased with the results and hits backspace, then gestures again.
+    // At the very least we should avoid re-suggesting the same thing, and to do that we memorize
+    // the rejected suggestion in this variable.
+    // TODO: this should be done in a comprehensive way by the User History feature instead of
+    // as an ad-hockery here.
+    private String mRejectedBatchModeSuggestion;
 
     // Cache these values for performance
     private int mCapsCount;
@@ -64,6 +71,7 @@ public final class WordComposer {
         mIsResumed = false;
         mIsBatchMode = false;
         mCursorPositionWithinWord = 0;
+        mRejectedBatchModeSuggestion = null;
         refreshSize();
     }
 
@@ -79,6 +87,7 @@ public final class WordComposer {
         mIsResumed = source.mIsResumed;
         mIsBatchMode = source.mIsBatchMode;
         mCursorPositionWithinWord = source.mCursorPositionWithinWord;
+        mRejectedBatchModeSuggestion = source.mRejectedBatchModeSuggestion;
         refreshSize();
     }
 
@@ -95,6 +104,7 @@ public final class WordComposer {
         mIsResumed = false;
         mIsBatchMode = false;
         mCursorPositionWithinWord = 0;
+        mRejectedBatchModeSuggestion = null;
         refreshSize();
     }
 
@@ -384,6 +394,7 @@ public final class WordComposer {
         mAutoCorrection = null;
         mCursorPositionWithinWord = 0;
         mIsResumed = false;
+        mRejectedBatchModeSuggestion = null;
         return lastComposedWord;
     }
 
@@ -396,10 +407,19 @@ public final class WordComposer {
         mCapitalizedMode = lastComposedWord.mCapitalizedMode;
         mAutoCorrection = null; // This will be filled by the next call to updateSuggestion.
         mCursorPositionWithinWord = mCodePointSize;
+        mRejectedBatchModeSuggestion = null;
         mIsResumed = true;
     }
 
     public boolean isBatchMode() {
         return mIsBatchMode;
     }
+
+    public void setRejectedBatchModeSuggestion(final String rejectedSuggestion) {
+        mRejectedBatchModeSuggestion = rejectedSuggestion;
+    }
+
+    public String getRejectedBatchModeSuggestion() {
+        return mRejectedBatchModeSuggestion;
+    }
 }