diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index de2ecd3..bb83ba6 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -217,12 +217,14 @@
             }
         }
 
-        // isComposing is always true
-        public void postUpdateSuggestions(final boolean isComposing) {
-            // TODO: remove this test
-            if (!isComposing) throw new RuntimeException("We are not composing a word");
+        public void postUpdateSuggestionStrip(final boolean isComposing) {
             cancelUpdateSuggestionStrip();
-            sendMessageDelayed(obtainMessage(MSG_UPDATE_SUGGESTIONS), mDelayUpdateSuggestions);
+            if (isComposing) {
+                sendMessageDelayed(obtainMessage(MSG_UPDATE_SUGGESTIONS), mDelayUpdateSuggestions);
+            } else {
+                sendMessageDelayed(obtainMessage(MSG_SET_BIGRAM_PREDICTIONS),
+                        mDelayUpdateSuggestions);
+            }
         }
 
         public void cancelUpdateSuggestionStrip() {
@@ -243,14 +245,6 @@
             removeMessages(MSG_UPDATE_SHIFT_STATE);
         }
 
-        // isComposing is always false
-        public void postUpdateBigramPredictions(final boolean isComposing) {
-            // TODO: remove this test
-            if (isComposing) throw new RuntimeException("We are composing a word");
-            cancelUpdateSuggestionStrip();
-            sendMessageDelayed(obtainMessage(MSG_SET_BIGRAM_PREDICTIONS), mDelayUpdateSuggestions);
-        }
-
         public void startDoubleSpacesTimer() {
             mDoubleSpaceTimerStart = SystemClock.uptimeMillis();
         }
@@ -1400,15 +1394,7 @@
                     mWordComposer.deleteLast();
                 }
                 mConnection.setComposingText(getTextWithUnderline(mWordComposer.getTypedWord()), 1);
-                // If we have deleted the last remaining character of a word, then we are not
-                // isComposingWord() any more.
-                if (!mWordComposer.isComposingWord()) {
-                    // Not composing word any more, so we can show bigrams.
-                    mHandler.postUpdateBigramPredictions(mWordComposer.isComposingWord());
-                } else {
-                    // Still composing a word, so we still have letters to deduce a suggestion from.
-                    mHandler.postUpdateSuggestions(mWordComposer.isComposingWord());
-                }
+                mHandler.postUpdateSuggestionStrip(mWordComposer.isComposingWord());
             } else {
                 mConnection.deleteSurroundingText(1, 0);
                 if (ProductionFlag.IS_EXPERIMENTAL) {
@@ -1551,8 +1537,6 @@
                         getCurrentAutoCapsState() != Constants.TextUtils.CAP_MODE_OFF);
             }
             mConnection.setComposingText(getTextWithUnderline(mWordComposer.getTypedWord()), 1);
-            // We just added a character, so isComposingWord() is true
-            mHandler.postUpdateSuggestions(mWordComposer.isComposingWord());
         } else {
             final boolean swapWeakSpace = maybeStripSpace(primaryCode,
                     spaceState, KeyboardActionListener.SUGGESTION_STRIP_COORDINATE == x);
@@ -1563,14 +1547,10 @@
                 swapSwapperAndSpace();
                 mSpaceState = SPACE_STATE_WEAK;
             }
-            // We may need to update predictions, if the "add to dictionary" hint was displayed
-            // for example.
+            // In case the "add to dictionary" hint was still displayed.
             if (null != mSuggestionsView) mSuggestionsView.dismissAddToDictionaryHint();
-            // Here we know we are not composing a word: if we were, then we can't come here because
-            // isComposingWord is still true; if we weren't, and we now are, then isComposingWord
-            // has been turned to true, so we can't come here either.
-            mHandler.postUpdateBigramPredictions(mWordComposer.isComposingWord());
         }
+        mHandler.postUpdateSuggestionStrip(mWordComposer.isComposingWord());
         Utils.Stats.onNonSeparator((char)primaryCode, x, y);
     }
 
@@ -1612,9 +1592,7 @@
 
             mHandler.startDoubleSpacesTimer();
             if (!mConnection.isCursorTouchingWord(mCurrentSettings)) {
-                // We know mWordComposer.isComposingWord() is false here, since if it was true,
-                // we committed the text, making it false.
-                mHandler.postUpdateBigramPredictions(mWordComposer.isComposingWord());
+                mHandler.postUpdateSuggestionStrip(mWordComposer.isComposingWord());
             }
         } else {
             if (swapWeakSpace) {
@@ -1898,10 +1876,8 @@
         if (showingAddToDictionaryHint && mIsUserDictionaryAvailable) {
             mSuggestionsView.showAddToDictionaryHint(suggestion, mCurrentSettings.mHintToSaveText);
         } else {
-            // If we're not showing the "Touch again to save", then show predictions.
-            // We just called commitChosenWord, which ensures mWordComposer#isComposingWord()
-            // returns false.
-            mHandler.postUpdateBigramPredictions(mWordComposer.isComposingWord());
+            // If we're not showing the "Touch again to save", then update the suggestion strip.
+            mHandler.postUpdateSuggestionStrip(mWordComposer.isComposingWord());
         }
     }
 
@@ -1993,8 +1969,7 @@
             ResearchLogger.latinIME_deleteSurroundingText(length);
         }
         mConnection.setComposingText(word, 1);
-        // We just set a composing word, so isComposingWord() is true
-        mHandler.postUpdateSuggestions(mWordComposer.isComposingWord());
+        mHandler.postUpdateSuggestionStrip(mWordComposer.isComposingWord());
     }
 
     private void revertCommit() {
@@ -2039,9 +2014,7 @@
         // separator.
         mLastComposedWord = LastComposedWord.NOT_A_COMPOSED_WORD;
         // We have a separator between the word and the cursor: we should show predictions.
-        // We know we are not composing a word here (there is even a test that throws an exception
-        // in debug mode in here)
-        mHandler.postUpdateBigramPredictions(mWordComposer.isComposingWord());
+        mHandler.postUpdateSuggestionStrip(mWordComposer.isComposingWord());
     }
 
     public boolean isWordSeparator(int code) {
@@ -2065,12 +2038,8 @@
         loadSettings();
         // Since we just changed languages, we should re-evaluate suggestions with whatever word
         // we are currently composing. If we are not composing anything, we may want to display
-        // predictions or punctuation signs (which is done by updateBigramPredictions anyway).
-        if (mWordComposer.isComposingWord()) {
-            mHandler.postUpdateSuggestions(mWordComposer.isComposingWord());
-        } else {
-            mHandler.postUpdateBigramPredictions(mWordComposer.isComposingWord());
-        }
+        // predictions or punctuation signs (which is done by the updateSuggestionStrip anyway).
+        mHandler.postUpdateSuggestionStrip(mWordComposer.isComposingWord());
     }
 
     // TODO: Remove this method from {@link LatinIME} and move {@link FeedbackManager} to
