diff --git a/java/res/xml-sw600dp/key_styles_common.xml b/java/res/xml-sw600dp/key_styles_common.xml
index 9f16d1b..dcaf450 100644
--- a/java/res/xml-sw600dp/key_styles_common.xml
+++ b/java/res/xml-sw600dp/key_styles_common.xml
@@ -137,6 +137,7 @@
         latin:styleName="toSymbolKeyStyle"
         latin:code="!code/key_switch_alpha_symbol"
         latin:keyLabel="!text/label_to_symbol_key"
+        latin:keyLabelFlags="preserveCase"
         latin:keyActionFlags="noKeyPreview"
         latin:backgroundType="functional" />
     <key-style
diff --git a/java/res/xml-sw768dp/key_styles_common.xml b/java/res/xml-sw768dp/key_styles_common.xml
index 2cae0d2..f2fb90b 100644
--- a/java/res/xml-sw768dp/key_styles_common.xml
+++ b/java/res/xml-sw768dp/key_styles_common.xml
@@ -136,7 +136,7 @@
         latin:styleName="toSymbolKeyStyle"
         latin:code="!code/key_switch_alpha_symbol"
         latin:keyLabel="!text/label_to_symbol_key"
-        latin:keyLabelFlags="fontNormal"
+        latin:keyLabelFlags="fontNormal|preserveCase"
         latin:keyActionFlags="noKeyPreview"
         latin:backgroundType="functional" />
     <key-style
diff --git a/java/res/xml/key_styles_common.xml b/java/res/xml/key_styles_common.xml
index 7981ab3..6b64985 100644
--- a/java/res/xml/key_styles_common.xml
+++ b/java/res/xml/key_styles_common.xml
@@ -165,7 +165,7 @@
                 latin:code="!code/key_switch_alpha_symbol"
                 latin:keyIcon="!icon/shortcut_for_label"
                 latin:keyLabel="!text/label_to_symbol_with_microphone_key"
-                latin:keyLabelFlags="withIconRight"
+                latin:keyLabelFlags="withIconRight|preserveCase"
                 latin:keyActionFlags="noKeyPreview"
                 latin:backgroundType="functional" />
         </case>
@@ -174,6 +174,7 @@
                 latin:styleName="toSymbolKeyStyle"
                 latin:code="!code/key_switch_alpha_symbol"
                 latin:keyLabel="!text/label_to_symbol_key"
+                latin:keyLabelFlags="preserveCase"
                 latin:keyActionFlags="noKeyPreview"
                 latin:backgroundType="functional" />
         </default>
diff --git a/java/src/com/android/inputmethod/latin/SubtypeLocale.java b/java/src/com/android/inputmethod/latin/SubtypeLocale.java
index 9f89f9e..7694b56 100644
--- a/java/src/com/android/inputmethod/latin/SubtypeLocale.java
+++ b/java/src/com/android/inputmethod/latin/SubtypeLocale.java
@@ -22,6 +22,8 @@
 import android.content.res.Resources;
 import android.view.inputmethod.InputMethodSubtype;
 
+import com.android.inputmethod.latin.LocaleUtils.RunInLocale;
+
 import java.util.HashMap;
 import java.util.Locale;
 
@@ -121,18 +123,27 @@
     //  fr    azerty F  Français
     //  fr_CA qwerty F  Français (Canada)
     //  de    qwertz F  Deutsch
-    //  zz    qwerty F  No language (QWERTY)
+    //  zz    qwerty F  No language (QWERTY)    in system locale
     //  fr    qwertz T  Français (QWERTZ)
     //  de    qwerty T  Deutsch (QWERTY)
     //  en_US azerty T  English (US) (AZERTY)
-    //  zz    azerty T  No language (AZERTY)
+    //  zz    azerty T  No language (AZERTY)    in system locale
 
     public static String getSubtypeDisplayName(InputMethodSubtype subtype, Resources res) {
         // TODO: Remove this check when InputMethodManager.getLastInputMethodSubtype is
         // fixed.
         if (!ImfUtils.checkIfSubtypeBelongsToThisIme(sContext, subtype)) return "";
         final String language = getSubtypeLocaleDisplayName(subtype.getLocale());
-        return res.getString(subtype.getNameResId(), language);
+        final int nameResId = subtype.getNameResId();
+        final RunInLocale<String> getSubtypeName = new RunInLocale<String>() {
+            @Override
+            protected String job(Resources res) {
+                return res.getString(nameResId, language);
+            }
+        };
+        final Locale locale = isNoLanguage(subtype)
+                ? res.getConfiguration().locale : getSubtypeLocale(subtype);
+        return getSubtypeName.runInLocale(res, locale);
     }
 
     public static boolean isNoLanguage(InputMethodSubtype subtype) {
diff --git a/java/src/com/android/inputmethod/latin/UserHistoryDictionary.java b/java/src/com/android/inputmethod/latin/UserHistoryDictionary.java
index 62525c2..9191aa9 100644
--- a/java/src/com/android/inputmethod/latin/UserHistoryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/UserHistoryDictionary.java
@@ -162,7 +162,7 @@
      * Return whether the passed charsequence is in the dictionary.
      */
     @Override
-    public boolean isValidWord(final CharSequence word) {
+    public synchronized boolean isValidWord(final CharSequence word) {
         // TODO: figure out what is the correct thing to do here.
         return false;
     }
diff --git a/tests/src/com/android/inputmethod/keyboard/SpacebarTextTests.java b/tests/src/com/android/inputmethod/keyboard/SpacebarTextTests.java
index 663f708..a34e0ef 100644
--- a/tests/src/com/android/inputmethod/keyboard/SpacebarTextTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/SpacebarTextTests.java
@@ -21,7 +21,6 @@
 import android.test.AndroidTestCase;
 import android.view.inputmethod.InputMethodSubtype;
 
-import com.android.inputmethod.compat.InputMethodManagerCompatWrapper;
 import com.android.inputmethod.latin.AdditionalSubtype;
 import com.android.inputmethod.latin.ImfUtils;
 import com.android.inputmethod.latin.StringUtils;
@@ -41,7 +40,6 @@
         super.setUp();
         final Context context = getContext();
         mRes = context.getResources();
-        InputMethodManagerCompatWrapper.init(context);
         SubtypeLocale.init(context);
     }
 
diff --git a/tests/src/com/android/inputmethod/latin/SubtypeLocaleTests.java b/tests/src/com/android/inputmethod/latin/SubtypeLocaleTests.java
index 5393b23..8863bcf 100644
--- a/tests/src/com/android/inputmethod/latin/SubtypeLocaleTests.java
+++ b/tests/src/com/android/inputmethod/latin/SubtypeLocaleTests.java
@@ -21,7 +21,6 @@
 import android.test.AndroidTestCase;
 import android.view.inputmethod.InputMethodSubtype;
 
-import com.android.inputmethod.compat.InputMethodManagerCompatWrapper;
 import com.android.inputmethod.latin.LocaleUtils.RunInLocale;
 
 import java.util.ArrayList;
@@ -31,14 +30,15 @@
     // Locale to subtypes list.
     private final ArrayList<InputMethodSubtype> mSubtypesList = new ArrayList<InputMethodSubtype>();
 
+    private Context mContext;
     private Resources mRes;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         final Context context = getContext();
+        mContext = context;
         mRes = context.getResources();
-        InputMethodManagerCompatWrapper.init(context);
         SubtypeLocale.init(context);
     }
 
@@ -65,13 +65,13 @@
     //  fr    azerty F  Français
     //  fr_CA qwerty F  Français (Canada)
     //  de    qwertz F  Deutsch
-    //  zz    qwerty F  No language (QWERTY)
+    //  zz    qwerty F  No language (QWERTY)    in system locale
     //  fr    qwertz T  Français (QWERTZ)
     //  de    qwerty T  Deutsch (QWERTY)
     //  en_US azerty T  English (US) (AZERTY)
-    //  zz    azerty T  No language (AZERTY)
+    //  zz    azerty T  No language (AZERTY)    in system locale
 
-    public void testPredefinedSubtypes() {
+    public void testPredefinedSubtypesInEnglish() {
         final Context context = getContext();
         final InputMethodSubtype EN_US = ImfUtils.findSubtypeByLocaleAndKeyboardLayoutSet(
                 context, Locale.US.toString(), "qwerty");
@@ -93,21 +93,28 @@
         assertEquals("de   ", "qwertz", SubtypeLocale.getKeyboardLayoutSetName(DE));
         assertEquals("zz   ", "qwerty", SubtypeLocale.getKeyboardLayoutSetName(ZZ));
 
-        assertEquals("en_US", "English (US)",
-                SubtypeLocale.getSubtypeDisplayName(EN_US, mRes));
-        assertEquals("en_GB", "English (UK)",
-                SubtypeLocale.getSubtypeDisplayName(EN_GB, mRes));
-        assertEquals("fr   ", "Français",
-                SubtypeLocale.getSubtypeDisplayName(FR, mRes));
-        assertEquals("fr_CA", "Français (Canada)",
-                SubtypeLocale.getSubtypeDisplayName(FR_CA, mRes));
-        assertEquals("de   ", "Deutsch",
-                SubtypeLocale.getSubtypeDisplayName(DE, mRes));
-        assertEquals("zz   ", "No language (QWERTY)",
-                SubtypeLocale.getSubtypeDisplayName(ZZ, mRes));
+        final RunInLocale<Void> tests = new RunInLocale<Void>() {
+            @Override
+            protected Void job(Resources res) {
+                assertEquals("en_US", "English (US)",
+                        SubtypeLocale.getSubtypeDisplayName(EN_US, res));
+                assertEquals("en_GB", "English (UK)",
+                        SubtypeLocale.getSubtypeDisplayName(EN_GB, res));
+                assertEquals("fr   ", "Français",
+                        SubtypeLocale.getSubtypeDisplayName(FR, res));
+                assertEquals("fr_CA", "Français (Canada)",
+                        SubtypeLocale.getSubtypeDisplayName(FR_CA, res));
+                assertEquals("de   ", "Deutsch",
+                        SubtypeLocale.getSubtypeDisplayName(DE, res));
+                assertEquals("zz   ", "No language (QWERTY)",
+                        SubtypeLocale.getSubtypeDisplayName(ZZ, res));
+                return null;
+            }
+        };
+        tests.runInLocale(mRes, Locale.ENGLISH);
     }
 
-    public void testAdditionalSubtype() {
+    public void testAdditionalSubtypesInEnglish() {
         final InputMethodSubtype DE_QWERTY = AdditionalSubtype.createAdditionalSubtype(
                 Locale.GERMAN.toString(), "qwerty", null);
         final InputMethodSubtype FR_QWERTZ = AdditionalSubtype.createAdditionalSubtype(
@@ -117,32 +124,87 @@
         final InputMethodSubtype ZZ_AZERTY = AdditionalSubtype.createAdditionalSubtype(
                 SubtypeLocale.NO_LANGUAGE, "azerty", null);
 
-        assertEquals("fr qwertz",    "Français (QWERTZ)",
-                SubtypeLocale.getSubtypeDisplayName(FR_QWERTZ, mRes));
-        assertEquals("de qwerty",    "Deutsch (QWERTY)",
-                SubtypeLocale.getSubtypeDisplayName(DE_QWERTY, mRes));
-        assertEquals("en_US azerty", "English (US) (AZERTY)",
-                SubtypeLocale.getSubtypeDisplayName(US_AZERTY, mRes));
-        assertEquals("zz azerty",    "No language (AZERTY)",
-                SubtypeLocale.getSubtypeDisplayName(ZZ_AZERTY, mRes));
-    }
-
-    public void testNoLanguageInFrench() {
-        final Context context = getContext();
-        final InputMethodSubtype ZZ = ImfUtils.findSubtypeByLocaleAndKeyboardLayoutSet(
-                context, SubtypeLocale.NO_LANGUAGE, "qwerty");
-        final InputMethodSubtype ZZ_AZERTY = AdditionalSubtype.createAdditionalSubtype(
-                SubtypeLocale.NO_LANGUAGE, "azerty", null);
+        ImfUtils.setAdditionalInputMethodSubtypes(mContext, new InputMethodSubtype[] {
+                DE_QWERTY, FR_QWERTZ, US_AZERTY, ZZ_AZERTY
+        });
 
         final RunInLocale<Void> tests = new RunInLocale<Void>() {
             @Override
             protected Void job(Resources res) {
-                assertEquals("zz   ", "qwerty", SubtypeLocale.getKeyboardLayoutSetName(ZZ));
-                assertEquals("zz   ", "azerty", SubtypeLocale.getKeyboardLayoutSetName(ZZ_AZERTY));
+                assertEquals("fr qwertz",    "Français (QWERTZ)",
+                        SubtypeLocale.getSubtypeDisplayName(FR_QWERTZ, res));
+                assertEquals("de qwerty",    "Deutsch (QWERTY)",
+                        SubtypeLocale.getSubtypeDisplayName(DE_QWERTY, res));
+                assertEquals("en_US azerty", "English (US) (AZERTY)",
+                        SubtypeLocale.getSubtypeDisplayName(US_AZERTY, res));
+                assertEquals("zz azerty",    "No language (AZERTY)",
+                        SubtypeLocale.getSubtypeDisplayName(ZZ_AZERTY, res));
+                return null;
+            }
+        };
+        tests.runInLocale(mRes, Locale.ENGLISH);
+    }
 
-                assertEquals("zz   ",     "Pas de langue (QWERTY)",
+    public void testPredefinedSubtypesInFrench() {
+        final Context context = getContext();
+        final InputMethodSubtype EN_US = ImfUtils.findSubtypeByLocaleAndKeyboardLayoutSet(
+                context, Locale.US.toString(), "qwerty");
+        final InputMethodSubtype EN_GB = ImfUtils.findSubtypeByLocaleAndKeyboardLayoutSet(
+                context, Locale.UK.toString(), "qwerty");
+        final InputMethodSubtype FR = ImfUtils.findSubtypeByLocaleAndKeyboardLayoutSet(
+                context, Locale.FRENCH.toString(), "azerty");
+        final InputMethodSubtype FR_CA = ImfUtils.findSubtypeByLocaleAndKeyboardLayoutSet(
+                context, Locale.CANADA_FRENCH.toString(), "qwerty");
+        final InputMethodSubtype DE = ImfUtils.findSubtypeByLocaleAndKeyboardLayoutSet(
+                context, Locale.GERMAN.toString(), "qwertz");
+        final InputMethodSubtype ZZ = ImfUtils.findSubtypeByLocaleAndKeyboardLayoutSet(
+                context, SubtypeLocale.NO_LANGUAGE, "qwerty");
+
+        final RunInLocale<Void> tests = new RunInLocale<Void>() {
+            @Override
+            protected Void job(Resources res) {
+                assertEquals("en_US", "English (US)",
+                        SubtypeLocale.getSubtypeDisplayName(EN_US, res));
+                assertEquals("en_GB", "English (UK)",
+                        SubtypeLocale.getSubtypeDisplayName(EN_GB, res));
+                assertEquals("fr   ", "Français",
+                        SubtypeLocale.getSubtypeDisplayName(FR, res));
+                assertEquals("fr_CA", "Français (Canada)",
+                        SubtypeLocale.getSubtypeDisplayName(FR_CA, res));
+                assertEquals("de   ", "Deutsch",
+                        SubtypeLocale.getSubtypeDisplayName(DE, res));
+                assertEquals("zz   ", "Pas de langue (QWERTY)",
                         SubtypeLocale.getSubtypeDisplayName(ZZ, res));
-                assertEquals("zz azerty", "Pas de langue (AZERTY)",
+                return null;
+            }
+        };
+        tests.runInLocale(mRes, Locale.FRENCH);
+    }
+
+    public void testAdditionalSubtypesInFrench() {
+        final InputMethodSubtype DE_QWERTY = AdditionalSubtype.createAdditionalSubtype(
+                Locale.GERMAN.toString(), "qwerty", null);
+        final InputMethodSubtype FR_QWERTZ = AdditionalSubtype.createAdditionalSubtype(
+                Locale.FRENCH.toString(), "qwertz", null);
+        final InputMethodSubtype US_AZERTY = AdditionalSubtype.createAdditionalSubtype(
+                Locale.US.toString(), "azerty", null);
+        final InputMethodSubtype ZZ_AZERTY = AdditionalSubtype.createAdditionalSubtype(
+                SubtypeLocale.NO_LANGUAGE, "azerty", null);
+
+        ImfUtils.setAdditionalInputMethodSubtypes(mContext, new InputMethodSubtype[] {
+                DE_QWERTY, FR_QWERTZ, US_AZERTY, ZZ_AZERTY
+        });
+
+        final RunInLocale<Void> tests = new RunInLocale<Void>() {
+            @Override
+            protected Void job(Resources res) {
+                assertEquals("fr qwertz",    "Français (QWERTZ)",
+                        SubtypeLocale.getSubtypeDisplayName(FR_QWERTZ, res));
+                assertEquals("de qwerty",    "Deutsch (QWERTY)",
+                        SubtypeLocale.getSubtypeDisplayName(DE_QWERTY, res));
+                assertEquals("en_US azerty", "English (US) (AZERTY)",
+                        SubtypeLocale.getSubtypeDisplayName(US_AZERTY, res));
+                assertEquals("zz azerty",    "Aucune langue (AZERTY)",
                         SubtypeLocale.getSubtypeDisplayName(ZZ_AZERTY, res));
                 return null;
             }
