diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index 43175e31412ec5656c20fe4b4dc04798810ddeb4..92340dcce795a6ad3b3c411453c3b0e9d284a38a 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -1388,7 +1388,7 @@ public class LatinIME extends InputMethodService
             if (mKeyboardSwitcher.getInputView().isShifted()
                     && mKeyboardSwitcher.isAlphabetMode()
                     && mComposing.length() == 0) {
-                mWord.setCapitalized(true);
+                mWord.setFirstCharCapitalized(true);
             }
             mComposing.append((char) primaryCode);
             mWord.add(primaryCode, keyCodes);
@@ -2019,7 +2019,7 @@ public class LatinIME extends InputMethodService
                     touching.word.charAt(i)
                 });
             }
-            foundWord.setCapitalized(Character.isUpperCase(touching.word.charAt(0)));
+            foundWord.setFirstCharCapitalized(Character.isUpperCase(touching.word.charAt(0)));
         }
         // Found a match, show suggestions
         if (foundWord != null || alternatives != null) {
@@ -2176,7 +2176,7 @@ public class LatinIME extends InputMethodService
     }
 
     public boolean preferCapitalization() {
-        return mWord.isCapitalized();
+        return mWord.isFirstCharCapitalized();
     }
 
     private void toggleLanguage(boolean reset, boolean next) {
diff --git a/java/src/com/android/inputmethod/latin/Suggest.java b/java/src/com/android/inputmethod/latin/Suggest.java
index 92bbe4362e99752d7bf3dc6776cea1b4d2cc5eef..3b898941fa222a39cde78d6912360ac55bcfa1cb 100755
--- a/java/src/com/android/inputmethod/latin/Suggest.java
+++ b/java/src/com/android/inputmethod/latin/Suggest.java
@@ -96,7 +96,10 @@ public class Suggest implements Dictionary.WordCallback {
     private boolean mHaveCorrection;
     private CharSequence mOriginalWord;
     private String mLowerOriginalWord;
-    private boolean mCapitalize;
+
+    // TODO: Remove these member variables by passing more context to addWord() callback method
+    private boolean mIsFirstCharCapitalized;
+    private boolean mIsAllUpperCase;
 
     private int mCorrectionMode = CORRECTION_BASIC;
 
@@ -219,7 +222,8 @@ public class Suggest implements Dictionary.WordCallback {
             boolean includeTypedWordIfValid, CharSequence prevWordForBigram) {
         LatinImeLogger.onStartSuggestion(prevWordForBigram);
         mHaveCorrection = false;
-        mCapitalize = wordComposer.isCapitalized();
+        mIsFirstCharCapitalized = wordComposer.isFirstCharCapitalized();
+        mIsAllUpperCase = wordComposer.isAllUpperCase();
         collectGarbage(mSuggestions, mPrefMaxSuggestions);
         Arrays.fill(mPriorities, 0);
         Arrays.fill(mNextLettersFrequencies, 0);
@@ -453,7 +457,9 @@ public class Suggest implements Dictionary.WordCallback {
         StringBuilder sb = poolSize > 0 ? (StringBuilder) mStringPool.remove(poolSize - 1) 
                 : new StringBuilder(getApproxMaxWordLength());
         sb.setLength(0);
-        if (mCapitalize) {
+        if (mIsAllUpperCase) {
+            sb.append(new String(word, offset, length).toUpperCase());
+        } else if (mIsFirstCharCapitalized) {
             sb.append(Character.toUpperCase(word[offset]));
             if (length > 1) {
                 sb.append(word, offset + 1, length - 1);
diff --git a/java/src/com/android/inputmethod/latin/WordComposer.java b/java/src/com/android/inputmethod/latin/WordComposer.java
index fe4c68576c28958a4c56008d32ee55e06d9b6b03..2e415b771951cea1768953f776b0ccf7fe0e5972 100644
--- a/java/src/com/android/inputmethod/latin/WordComposer.java
+++ b/java/src/com/android/inputmethod/latin/WordComposer.java
@@ -39,9 +39,9 @@ public class WordComposer {
     private boolean mAutoCapitalized;
     
     /**
-     * Whether the user chose to capitalize the word.
+     * Whether the user chose to capitalize the first char of the word.
      */
-    private boolean mIsCapitalized;
+    private boolean mIsFirstCharCapitalized;
 
     public WordComposer() {
         mCodes = new ArrayList<int[]>(12);
@@ -54,7 +54,7 @@ public class WordComposer {
         mTypedWord = new StringBuilder(copy.mTypedWord);
         mCapsCount = copy.mCapsCount;
         mAutoCapitalized = copy.mAutoCapitalized;
-        mIsCapitalized = copy.mIsCapitalized;
+        mIsFirstCharCapitalized = copy.mIsFirstCharCapitalized;
     }
 
     /**
@@ -62,7 +62,7 @@ public class WordComposer {
      */
     public void reset() {
         mCodes.clear();
-        mIsCapitalized = false;
+        mIsFirstCharCapitalized = false;
         mPreferredWord = null;
         mTypedWord.setLength(0);
         mCapsCount = 0;
@@ -138,18 +138,26 @@ public class WordComposer {
         return mTypedWord;
     }
 
-    public void setCapitalized(boolean capitalized) {
-        mIsCapitalized = capitalized;
+    public void setFirstCharCapitalized(boolean capitalized) {
+        mIsFirstCharCapitalized = capitalized;
     }
     
     /**
      * Whether or not the user typed a capital letter as the first letter in the word
      * @return capitalization preference
      */
-    public boolean isCapitalized() {
-        return mIsCapitalized;
+    public boolean isFirstCharCapitalized() {
+        return mIsFirstCharCapitalized;
     }
-    
+
+    /**
+     * Whether or not all of the user typed chars are upper case
+     * @return true if all user typed chars are upper case, false otherwise
+     */
+    public boolean isAllUpperCase() {
+        return (mCapsCount > 0) && (mCapsCount == size());
+    }
+
     /**
      * Stores the user's selected word, before it is actually committed to the text field.
      * @param preferred