diff --git a/res/xml-de/kbd_qwerty.xml b/res/xml-de/kbd_qwerty.xml
index 763492db5ac688d1583e80a454de0a9e0bd27f3f..89e53efc835f89b9aff341ec6d2ae0e800381ab1 100755
--- a/res/xml-de/kbd_qwerty.xml
+++ b/res/xml-de/kbd_qwerty.xml
@@ -98,7 +98,7 @@
     <Row android:keyboardMode="@+id/mode_normal" android:rowEdgeFlags="bottom">
         <Key android:codes="-2" android:keyLabel="@string/label_symbol_key" 
                 android:popupKeyboard="@xml/kbd_popup_template"
-                android:popupCharacters=""
+                android:popupCharacters="_"
                 android:keyWidth="20%p" android:keyEdgeFlags="left"/>
         <Key android:keyLabel="," android:keyWidth="15%p" />
         <Key android:codes="32" android:keyIcon="@drawable/sym_keyboard_space" 
@@ -114,7 +114,7 @@
     <Row android:keyboardMode="@+id/mode_url" android:rowEdgeFlags="bottom">
         <Key android:codes="-2" android:keyLabel="@string/label_symbol_key" 
                 android:popupKeyboard="@xml/kbd_popup_template"
-                android:popupCharacters=""
+                android:popupCharacters="_"
                 android:keyWidth="20%p" android:keyEdgeFlags="left"/>
         <Key android:keyLabel=".com" android:keyOutputText=".com"
                 android:popupKeyboard="@xml/popup_domains"
@@ -133,7 +133,7 @@
     <Row android:keyboardMode="@+id/mode_email" android:rowEdgeFlags="bottom">
         <Key android:codes="-2" android:keyLabel="@string/label_symbol_key" 
                 android:popupKeyboard="@xml/kbd_popup_template"
-                android:popupCharacters=""
+                android:popupCharacters="_"
                 android:keyWidth="20%p" android:keyEdgeFlags="left"/>
         <Key android:keyLabel="," android:keyWidth="15%p" />
         <Key android:keyLabel="\@" android:keyWidth="15%p"/>
@@ -150,7 +150,7 @@
     <Row android:keyboardMode="@+id/mode_im" android:rowEdgeFlags="bottom">
         <Key android:codes="-2" android:keyLabel="@string/label_symbol_key" 
                 android:popupKeyboard="@xml/kbd_popup_template"
-                android:popupCharacters=""
+                android:popupCharacters="_"
                 android:keyWidth="20%p" android:keyEdgeFlags="left"/>
         <Key android:keyLabel="," android:keyWidth="15%p"/>
         <Key android:codes="32" android:keyIcon="@drawable/sym_keyboard_space" 
diff --git a/res/xml/kbd_phone.xml b/res/xml/kbd_phone.xml
index 880d9613afc9fea8238dd64d3b6869907a31f6b0..d2bcdac5229b0f1380c70f659135e0197bd03444 100755
--- a/res/xml/kbd_phone.xml
+++ b/res/xml/kbd_phone.xml
@@ -51,7 +51,7 @@
     <Row android:rowEdgeFlags="bottom">
         <Key android:codes="-2" android:keyIcon="@drawable/sym_keyboard_numalt"
                 android:popupKeyboard="@xml/kbd_popup_template"
-                android:popupCharacters=""
+                android:popupCharacters="_"
                 android:iconPreview="@drawable/sym_keyboard_feedback_numalt"/>
 
         <Key android:codes="48" android:keyIcon="@drawable/sym_keyboard_num0"/>
diff --git a/res/xml/kbd_phone_symbols.xml b/res/xml/kbd_phone_symbols.xml
index 9ce7a1a1f5ce99d380c2bb18b25f81b353179259..107f85c03b9d04263c9c733df5479ff30332578d 100755
--- a/res/xml/kbd_phone_symbols.xml
+++ b/res/xml/kbd_phone_symbols.xml
@@ -55,6 +55,8 @@
     
     <Row android:rowEdgeFlags="bottom">
         <Key android:codes="-2" android:keyLabel="@string/label_phone_key" 
+                android:popupKeyboard="@xml/kbd_popup_template"
+                android:popupCharacters="_"
                 android:keyEdgeFlags="left"/>
         <Key android:keyLabel="+"/>
         <Key android:codes="32" android:keyIcon="@drawable/sym_keyboard_space" 
diff --git a/res/xml/kbd_qwerty.xml b/res/xml/kbd_qwerty.xml
index fb8c574e4d0259dbf11b3e79d9d3e7103c6ee704..8d64d3e52a604bc667f0af715d59218a7b972f0f 100755
--- a/res/xml/kbd_qwerty.xml
+++ b/res/xml/kbd_qwerty.xml
@@ -109,7 +109,7 @@
     <Row android:keyboardMode="@+id/mode_normal" android:rowEdgeFlags="bottom">
         <Key android:codes="-2" android:keyLabel="@string/label_symbol_key" 
                 android:popupKeyboard="@xml/kbd_popup_template"
-                android:popupCharacters=""
+                android:popupCharacters="_"
                 android:keyWidth="20%p" android:keyEdgeFlags="left"/>
         <Key android:keyLabel="," android:keyWidth="15%p" />
         <Key android:codes="32" android:keyIcon="@drawable/sym_keyboard_space" 
@@ -125,7 +125,7 @@
     <Row android:keyboardMode="@+id/mode_url" android:rowEdgeFlags="bottom">
         <Key android:codes="-2" android:keyLabel="@string/label_symbol_key" 
                 android:popupKeyboard="@xml/kbd_popup_template"
-                android:popupCharacters=""
+                android:popupCharacters="_"
                 android:keyWidth="20%p" android:keyEdgeFlags="left"/>
         <Key android:keyLabel=".com" android:keyOutputText=".com"
                 android:popupKeyboard="@xml/popup_domains"
@@ -144,7 +144,7 @@
     <Row android:keyboardMode="@+id/mode_email" android:rowEdgeFlags="bottom">
         <Key android:codes="-2" android:keyLabel="@string/label_symbol_key" 
                 android:popupKeyboard="@xml/kbd_popup_template"
-                android:popupCharacters=""
+                android:popupCharacters="_"
                 android:keyWidth="20%p" android:keyEdgeFlags="left"/>
         <Key android:keyLabel="," android:keyWidth="15%p" />
         <Key android:keyLabel="\@" android:keyWidth="15%p"/>
@@ -161,7 +161,7 @@
     <Row android:keyboardMode="@+id/mode_im" android:rowEdgeFlags="bottom">
         <Key android:codes="-2" android:keyLabel="@string/label_symbol_key" 
                 android:popupKeyboard="@xml/kbd_popup_template"
-                android:popupCharacters=""
+                android:popupCharacters="_"
                 android:keyWidth="20%p" android:keyEdgeFlags="left"/>
         <Key android:keyLabel="," android:keyWidth="15%p"/>
         <Key android:codes="32" android:keyIcon="@drawable/sym_keyboard_space" 
@@ -174,4 +174,4 @@
                 android:keyWidth="20%p" android:keyEdgeFlags="right"/>
     </Row>
 </Keyboard>
-    
\ No newline at end of file
+    
diff --git a/res/xml/kbd_symbols.xml b/res/xml/kbd_symbols.xml
index 2a150397b0f7faaab3017d434c9721f362e962ea..ecdf7513742546376131dc47705d92d2e8f6c35c 100755
--- a/res/xml/kbd_symbols.xml
+++ b/res/xml/kbd_symbols.xml
@@ -121,7 +121,7 @@
     <Row  android:rowEdgeFlags="bottom">
         <Key android:codes="-2" android:keyLabel="@string/label_alpha_key" 
                 android:popupKeyboard="@xml/kbd_popup_template"
-                android:popupCharacters=""
+                android:popupCharacters="_"
                 android:keyWidth="20%p" android:keyEdgeFlags="left"/>
         <Key android:keyLabel="," android:keyWidth="15%p" 
                 android:popupKeyboard="@xml/kbd_popup_template"
diff --git a/res/xml/kbd_symbols_shift.xml b/res/xml/kbd_symbols_shift.xml
index 6a472a412f3811abe6240ef759582dcd4c787637..fee845ecd233541b9c1f4cb2c7f6b8b491ba35f4 100755
--- a/res/xml/kbd_symbols_shift.xml
+++ b/res/xml/kbd_symbols_shift.xml
@@ -79,7 +79,7 @@
     <Row android:rowEdgeFlags="bottom">
         <Key android:codes="-2" android:keyLabel="@string/label_alpha_key" android:keyWidth="20%p"
                 android:popupKeyboard="@xml/kbd_popup_template"
-                android:popupCharacters=""
+                android:popupCharacters="_"
                 android:keyEdgeFlags="left"/>
         <Key android:keyLabel="„" android:keyWidth="15%p" />
         <Key android:codes="32" android:keyIcon="@drawable/sym_keyboard_space" android:keyWidth="30%p" 
diff --git a/src/com/android/inputmethod/latin/LatinIME.java b/src/com/android/inputmethod/latin/LatinIME.java
index eec78a167e077e7e71578022050263c690a115f3..3dfdc5f1fb749c5c0abd9c3d9f65cfcc7be8951d 100644
--- a/src/com/android/inputmethod/latin/LatinIME.java
+++ b/src/com/android/inputmethod/latin/LatinIME.java
@@ -71,6 +71,7 @@ public class LatinIME extends InputMethodService
 
     private static final int MSG_UPDATE_SUGGESTIONS = 0;
     private static final int MSG_START_TUTORIAL = 1;
+    private static final int MSG_UPDATE_SHIFT_STATE = 2;
     
     // How many continuous deletes at which to start deleting at a higher speed.
     private static final int DELETE_ACCELERATE_AT = 20;
@@ -153,6 +154,9 @@ public class LatinIME extends InputMethodService
                         }
                     }
                     break;
+                case MSG_UPDATE_SHIFT_STATE:
+                    updateShiftKeyState(getCurrentInputEditorInfo());
+                    break;
             }
         }
     };
@@ -321,7 +325,7 @@ public class LatinIME extends InputMethodService
         }
         mPredictionOn = mPredictionOn && mCorrectionMode > 0;
         checkTutorial(attribute.privateImeOptions);
-        if (TRACE) Debug.startMethodTracing("latinime");
+        if (TRACE) Debug.startMethodTracing("/data/trace/latinime");
     }
 
     @Override
@@ -622,7 +626,8 @@ public class LatinIME extends InputMethodService
         } else {
             deleteChar = true;
         }
-        updateShiftKeyState(getCurrentInputEditorInfo());
+        mHandler.removeMessages(MSG_UPDATE_SHIFT_STATE);
+        mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_UPDATE_SHIFT_STATE), 300);
         TextEntryState.backspace();
         if (TextEntryState.getState() == TextEntryState.STATE_UNDO_COMMIT) {
             revertLastWord(deleteChar);
@@ -772,7 +777,9 @@ public class LatinIME extends InputMethodService
         if (mCorrectionMode == Suggest.CORRECTION_FULL) {
             correctionAvailable |= typedWordValid;
         }
-        
+        // Don't auto-correct words with multiple capital letter
+        correctionAvailable &= !mWord.isMostlyCaps();
+
         mCandidateView.setSuggestions(stringList, false, typedWordValid, correctionAvailable); 
         if (stringList.size() > 0) {
             if (correctionAvailable && !typedWordValid && stringList.size() > 1) {
diff --git a/src/com/android/inputmethod/latin/WordComposer.java b/src/com/android/inputmethod/latin/WordComposer.java
index c950a7f18510327167e1633af596c24204c7de72..6679fca76a8e08af1cc2d171c3d2b47dc2812d52 100644
--- a/src/com/android/inputmethod/latin/WordComposer.java
+++ b/src/com/android/inputmethod/latin/WordComposer.java
@@ -34,6 +34,8 @@ public class WordComposer {
     private String mPreferredWord;
     
     private StringBuilder mTypedWord;
+
+    private int mCapsCount;
     
     /**
      * Whether the user chose to capitalize the word.
@@ -53,6 +55,7 @@ public class WordComposer {
         mIsCapitalized = false;
         mPreferredWord = null;
         mTypedWord.setLength(0);
+        mCapsCount = 0;
     }
 
     /**
@@ -80,6 +83,7 @@ public class WordComposer {
     public void add(int primaryCode, int[] codes) {
         mTypedWord.append((char) primaryCode);
         mCodes.add(codes);
+        if (Character.isUpperCase((char) primaryCode)) mCapsCount++;
     }
 
     /**
@@ -87,7 +91,10 @@ public class WordComposer {
      */
     public void deleteLast() {
         mCodes.remove(mCodes.size() - 1);
-        mTypedWord.deleteCharAt(mTypedWord.length() - 1);
+        final int lastPos = mTypedWord.length() - 1;
+        char last = mTypedWord.charAt(lastPos);
+        mTypedWord.deleteCharAt(lastPos);
+        if (Character.isUpperCase(last)) mCapsCount--;
     }
 
     /**
@@ -138,4 +145,11 @@ public class WordComposer {
     public CharSequence getPreferredWord() {
         return mPreferredWord != null ? mPreferredWord : getTypedWord();
     }
+
+    /**
+     * Returns true if more than one character is upper case, otherwise returns false.
+     */
+    public boolean isMostlyCaps() {
+        return mCapsCount > 1;
+    }
 }