diff --git a/java/src/com/android/inputmethod/latin/StringUtils.java b/java/src/com/android/inputmethod/latin/StringUtils.java
index 160581c..a43b905 100644
--- a/java/src/com/android/inputmethod/latin/StringUtils.java
+++ b/java/src/com/android/inputmethod/latin/StringUtils.java
@@ -123,6 +123,23 @@
     }
 
     /**
+     * Returns true if cs contains any upper case characters.
+     *
+     * @param cs the CharSequence to check
+     * @return {@code true} if cs contains any upper case characters, {@code false} otherwise.
+     */
+    public static boolean hasUpperCase(final CharSequence cs) {
+        final int length = cs.length();
+        for (int i = 0, cp = 0; i < length; i += Character.charCount(cp)) {
+            cp = Character.codePointAt(cs, i);
+            if (Character.isUpperCase(cp)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
      * Remove duplicates from an array of strings.
      *
      * This method will always keep the first occurrence of all strings at their position
diff --git a/java/src/com/android/inputmethod/latin/Suggest.java b/java/src/com/android/inputmethod/latin/Suggest.java
index 86753e2..7cbee4f 100644
--- a/java/src/com/android/inputmethod/latin/Suggest.java
+++ b/java/src/com/android/inputmethod/latin/Suggest.java
@@ -242,13 +242,8 @@
 
         mBigramSuggestions = new ArrayList<SuggestedWordInfo>(PREF_MAX_BIGRAMS);
 
-        CharSequence lowerPrevWord = prevWordForBigram.toString().toLowerCase();
-        if (mMainDict != null && mMainDict.isValidWord(lowerPrevWord)) {
-            prevWordForBigram = lowerPrevWord;
-        }
-        for (final Dictionary dictionary : mBigramDictionaries.values()) {
-            dictionary.getBigrams(sEmptyWordComposer, prevWordForBigram, this);
-        }
+        getAllBigrams(prevWordForBigram, sEmptyWordComposer);
+
         // Nothing entered: return all bigrams for the previous word
         int insertCount = Math.min(mBigramSuggestions.size(), mPrefMaxSuggestions);
         for (int i = 0; i < insertCount; ++i) {
@@ -290,13 +285,7 @@
             mBigramSuggestions = new ArrayList<SuggestedWordInfo>(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(wordComposer, prevWordForBigram, this);
-                }
+                getAllBigrams(prevWordForBigram, wordComposer);
                 if (TextUtils.isEmpty(consideredWord)) {
                     // Nothing entered: return all bigrams for the previous word
                     int insertCount = Math.min(mBigramSuggestions.size(), mPrefMaxSuggestions);
@@ -409,6 +398,23 @@
                 false /* isObsoleteSuggestions */);
     }
 
+    /**
+     * Adds all bigram predictions for prevWord. Also checks the lower case version of prevWord if
+     * it contains any upper case characters.
+     */
+    private void getAllBigrams(final CharSequence prevWord, final WordComposer wordComposer) {
+        if (StringUtils.hasUpperCase(prevWord)) {
+            // TODO: Must pay attention to locale when changing case.
+            final CharSequence lowerPrevWord = prevWord.toString().toLowerCase();
+            for (final Dictionary dictionary : mBigramDictionaries.values()) {
+                dictionary.getBigrams(wordComposer, lowerPrevWord, this);
+            }
+        }
+        for (final Dictionary dictionary : mBigramDictionaries.values()) {
+            dictionary.getBigrams(wordComposer, prevWord, this);
+        }
+    }
+
     private static ArrayList<SuggestedWordInfo> getSuggestionsInfoListWithDebugInfo(
             final String typedWord, final ArrayList<SuggestedWordInfo> suggestions) {
         final SuggestedWordInfo typedWordInfo = suggestions.get(0);
diff --git a/tests/src/com/android/inputmethod/latin/StringUtilsTests.java b/tests/src/com/android/inputmethod/latin/StringUtilsTests.java
index 8a5a822..5db06ef 100644
--- a/tests/src/com/android/inputmethod/latin/StringUtilsTests.java
+++ b/tests/src/com/android/inputmethod/latin/StringUtilsTests.java
@@ -88,4 +88,15 @@
         assertEquals("in 5 elements at position 2,4", "key1,key3,key5",
                 StringUtils.removeFromCsvIfExists("key", "key1,key,key3,key,key5"));
     }
+
+    public void testHasUpperCase() {
+        assertTrue("single upper-case string", StringUtils.hasUpperCase("String"));
+        assertTrue("multi upper-case string", StringUtils.hasUpperCase("stRInG"));
+        assertTrue("all upper-case string", StringUtils.hasUpperCase("STRING"));
+        assertTrue("upper-case string with non-letters", StringUtils.hasUpperCase("He's"));
+
+        assertFalse("empty string", StringUtils.hasUpperCase(""));
+        assertFalse("lower-case string", StringUtils.hasUpperCase("string"));
+        assertFalse("lower-case string with non-letters", StringUtils.hasUpperCase("he's"));
+    }
 }
