diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index 2ddb53f..439f125 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -2034,12 +2034,16 @@
             return;
         }
 
-        final CharSequence prevWord = EditingUtils.getThisWord(getCurrentInputConnection(),
-                mSettingsValues.mWordSeparators);
-        SuggestedWords.Builder builder = mSuggest.getBigramPredictionWordBuilder(prevWord,
-                mCorrectionMode);
+        final SuggestedWords.Builder builder;
+        if (mCorrectionMode == Suggest.CORRECTION_FULL_BIGRAM) {
+            final CharSequence prevWord = EditingUtils.getThisWord(getCurrentInputConnection(),
+                    mSettingsValues.mWordSeparators);
+            builder = mSuggest.getBigramPredictionWordBuilder(prevWord);
+        } else {
+            builder = null;
+        }
 
-        if (builder.size() > 0) {
+        if (null == builder || builder.size() > 0) {
             // Explicitly supply an empty typed word (the no-second-arg version of
             // showSuggestions will retrieve the word near the cursor, we don't want that here)
             showSuggestions(builder.build(), "");
diff --git a/java/src/com/android/inputmethod/latin/Suggest.java b/java/src/com/android/inputmethod/latin/Suggest.java
index 1150161..b8ec5ff 100644
--- a/java/src/com/android/inputmethod/latin/Suggest.java
+++ b/java/src/com/android/inputmethod/latin/Suggest.java
@@ -261,8 +261,7 @@
     }
 
     private static final WordComposer sEmptyWordComposer = new WordComposer();
-    public SuggestedWords.Builder getBigramPredictionWordBuilder(CharSequence prevWordForBigram,
-            final int correctionMode) {
+    public SuggestedWords.Builder getBigramPredictionWordBuilder(CharSequence prevWordForBigram) {
         LatinImeLogger.onStartSuggestion(prevWordForBigram);
         mIsFirstCharCapitalized = false;
         mIsAllUpperCase = false;
@@ -274,26 +273,23 @@
         LatinImeLogger.onAddSuggestedWord("", Suggest.DIC_USER_TYPED, Dictionary.UNIGRAM);
         mConsideredWord = "";
 
-        // Note that if correctionMode != CORRECTION_FULL_BIGRAM, we'll always return the
-        // same empty SuggestedWords.Builder, which has size() == 0
-        if (correctionMode == CORRECTION_FULL_BIGRAM) {
-            // At first character typed, search only the bigrams
-            Arrays.fill(mBigramScores, 0);
-            collectGarbage(mBigramSuggestions, PREF_MAX_BIGRAMS);
+        Arrays.fill(mBigramScores, 0);
+        collectGarbage(mBigramSuggestions, PREF_MAX_BIGRAMS);
 
-            if (!TextUtils.isEmpty(prevWordForBigram)) {
-                CharSequence lowerPrevWord = prevWordForBigram.toString().toLowerCase();
-                if (mMainDict != null && mMainDict.isValidWord(lowerPrevWord)) {
-                    prevWordForBigram = lowerPrevWord;
-                }
-                for (final Dictionary dictionary : mBigramDictionaries.values()) {
-                    dictionary.getBigrams(sEmptyWordComposer, prevWordForBigram, this);
-                }
-                // Nothing entered: return all bigrams for the previous word
-                int insertCount = Math.min(mBigramSuggestions.size(), mPrefMaxSuggestions);
-                for (int i = 0; i < insertCount; ++i) {
-                    addBigramToSuggestions(mBigramSuggestions.get(i));
-                }
+        // Note that if prevWordForBigram is empty, we'll always return the same empty
+        // SuggestedWords.Builder
+        if (!TextUtils.isEmpty(prevWordForBigram)) {
+            CharSequence lowerPrevWord = prevWordForBigram.toString().toLowerCase();
+            if (mMainDict != null && mMainDict.isValidWord(lowerPrevWord)) {
+                prevWordForBigram = lowerPrevWord;
+            }
+            for (final Dictionary dictionary : mBigramDictionaries.values()) {
+                dictionary.getBigrams(sEmptyWordComposer, prevWordForBigram, this);
+            }
+            // Nothing entered: return all bigrams for the previous word
+            int insertCount = Math.min(mBigramSuggestions.size(), mPrefMaxSuggestions);
+            for (int i = 0; i < insertCount; ++i) {
+                addBigramToSuggestions(mBigramSuggestions.get(i));
             }
         }
 
