diff --git a/java/res/values/donottranslate.xml b/java/res/values/donottranslate.xml
index 68a8cab..9c8bd3c 100644
--- a/java/res/values/donottranslate.xml
+++ b/java/res/values/donottranslate.xml
@@ -156,22 +156,20 @@
     <string-array name="subtype_locale_exception_keys">
         <item>en_US</item>
         <item>en_GB</item>
-        <item>de_QY</item>
-        <item>zz_QY</item>
+        <item>*_QY</item>
+        <item>QY</item>
     </string-array>
     <string-array name="subtype_locale_exception_values">
         <item>English (US)</item>
         <item>English (UK)</item>
         <item>@string/subtype_generic_qwerty</item>
-        <item>@string/subtype_qwerty</item>
+        <item>QWERTY</item>
     </string-array>
 
     <!-- Generic subtype label -->
     <string name="subtype_generic">%s</string>
     <!-- Description for generic QWERTY keyboard subtype -->
     <string name="subtype_generic_qwerty">%s (QWERTY)</string>
-    <!-- Description for language agnostic QWERTY keyboard subtype -->
-    <string name="subtype_qwerty">QWERTY</string>
 
     <!-- dictionary pack package name /settings activity (for shared prefs and settings) -->
     <string name="dictionary_pack_package_name">com.google.android.inputmethod.latin.dictionarypack</string>
diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml
index 4f038e1..a22c68c 100644
--- a/java/res/values/strings.xml
+++ b/java/res/values/strings.xml
@@ -252,6 +252,8 @@
     <string name="subtype_en_GB">English (UK)</string>
     <!-- Description for English (United States) keyboard subtype [CHAR LIMIT=22] -->
     <string name="subtype_en_US">English (US)</string>
+    <!-- Description for language agnostic QWERTY keyboard subtype [CHAR LIMIT=22] -->
+    <string name="subtype_no_language_qwerty">No language (QWERTY)</string>
 
     <!-- Title of an option for usability study mode -->
     <string name="prefs_usability_study_mode">Usability study mode</string>
diff --git a/java/res/xml/method.xml b/java/res/xml/method.xml
index 7a21a85..e43fb32 100644
--- a/java/res/xml/method.xml
+++ b/java/res/xml/method.xml
@@ -312,7 +312,7 @@
             android:imeSubtypeExtraValue="AsciiCapable"
     />
     <subtype android:icon="@drawable/ic_subtype_keyboard"
-            android:label="@string/subtype_qwerty"
+            android:label="@string/subtype_no_language_qwerty"
             android:imeSubtypeLocale="zz_QY"
             android:imeSubtypeMode="keyboard"
             android:imeSubtypeExtraValue="AsciiCapable,EnabledWhenDefaultIsNotAsciiCapable"
diff --git a/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java b/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java
index e2af971..2689e6e 100644
--- a/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java
+++ b/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java
@@ -47,7 +47,7 @@
 import com.android.inputmethod.latin.R;
 import com.android.inputmethod.latin.ResearchLogger;
 import com.android.inputmethod.latin.StaticInnerHandlerWrapper;
-import com.android.inputmethod.latin.StringUtils;
+import com.android.inputmethod.latin.SubtypeLocale;
 import com.android.inputmethod.latin.SubtypeUtils;
 import com.android.inputmethod.latin.Utils;
 import com.android.inputmethod.latin.Utils.UsabilityStudyLogUtils;
@@ -926,7 +926,7 @@
         paint.setTextAlign(Align.CENTER);
         paint.setTypeface(Typeface.DEFAULT);
         // Estimate appropriate language name text size to fit in maxTextWidth.
-        String language = StringUtils.getFullDisplayName(locale, true);
+        String language = SubtypeLocale.getFullDisplayName(locale);
         int textWidth = getTextWidth(paint, language, origTextSize);
         // Assuming text width and text size are proportional to each other.
         float textSize = origTextSize * Math.min(width / textWidth, 1.0f);
@@ -938,7 +938,7 @@
 
         final boolean useShortName;
         if (useMiddleName) {
-            language = StringUtils.getMiddleDisplayLanguage(locale);
+            language = SubtypeLocale.getMiddleDisplayName(locale);
             textWidth = getTextWidth(paint, language, origTextSize);
             textSize = origTextSize * Math.min(width / textWidth, 1.0f);
             useShortName = (textSize / origTextSize < MINIMUM_SCALE_OF_LANGUAGE_NAME)
@@ -948,7 +948,7 @@
         }
 
         if (useShortName) {
-            language = StringUtils.getShortDisplayLanguage(locale);
+            language = SubtypeLocale.getShortDisplayName(locale);
             textWidth = getTextWidth(paint, language, origTextSize);
             textSize = origTextSize * Math.min(width / textWidth, 1.0f);
         }
diff --git a/java/src/com/android/inputmethod/latin/StringUtils.java b/java/src/com/android/inputmethod/latin/StringUtils.java
index 7b34cae..7000e46 100644
--- a/java/src/com/android/inputmethod/latin/StringUtils.java
+++ b/java/src/com/android/inputmethod/latin/StringUtils.java
@@ -22,7 +22,6 @@
 import com.android.inputmethod.keyboard.Keyboard;
 
 import java.util.ArrayList;
-import java.util.Locale;
 
 public class StringUtils {
     private StringUtils() {
@@ -150,41 +149,4 @@
             i++;
         }
     }
-
-    public static String getFullDisplayName(Locale locale, boolean returnsNameInThisLocale) {
-        if (returnsNameInThisLocale) {
-            return toTitleCase(SubtypeLocale.getFullDisplayName(locale), locale);
-        } else {
-            return toTitleCase(locale.getDisplayName(), locale);
-        }
-    }
-
-    public static String getDisplayLanguage(Locale locale) {
-        return toTitleCase(SubtypeLocale.getFullDisplayName(locale), locale);
-    }
-
-    public static String getMiddleDisplayLanguage(Locale locale) {
-        return toTitleCase((LocaleUtils.constructLocaleFromString(
-                locale.getLanguage()).getDisplayLanguage(locale)), locale);
-    }
-
-    public static String getShortDisplayLanguage(Locale locale) {
-        return toTitleCase(locale.getLanguage(), locale);
-    }
-
-    public static String toTitleCase(String s, Locale locale) {
-        if (s.length() <= 1) {
-            // TODO: is this really correct? Shouldn't this be s.toUpperCase()?
-            return s;
-        }
-        // TODO: fix the bugs below
-        // - This does not work for Greek, because it returns upper case instead of title case.
-        // - It does not work for Serbian, because it fails to account for the "lj" character,
-        // which should be "Lj" in title case and "LJ" in upper case.
-        // - It does not work for Dutch, because it fails to account for the "ij" digraph, which
-        // are two different characters but both should be capitalized as "IJ" as if they were
-        // a single letter.
-        // - It also does not work with unicode surrogate code points.
-        return s.toUpperCase(locale).charAt(0) + s.substring(1);
-    }
 }
diff --git a/java/src/com/android/inputmethod/latin/SubtypeLocale.java b/java/src/com/android/inputmethod/latin/SubtypeLocale.java
index 66c13bd..40051a7 100644
--- a/java/src/com/android/inputmethod/latin/SubtypeLocale.java
+++ b/java/src/com/android/inputmethod/latin/SubtypeLocale.java
@@ -22,6 +22,13 @@
 import java.util.Locale;
 
 public class SubtypeLocale {
+    // Special language code to represent "no language".
+    /* package for test */ static final String NO_LANGUAGE = "zz";
+    // Special country code to represent "QWERTY".
+    /* package for test */ static final String QWERTY = "QY";
+
+    public static final Locale LOCALE_NO_LANGUAGE_QWERTY = new Locale(NO_LANGUAGE, QWERTY);
+
     private static String[] sExceptionKeys;
     private static String[] sExceptionValues;
 
@@ -35,18 +42,82 @@
         sExceptionValues = res.getStringArray(R.array.subtype_locale_exception_values);
     }
 
-    public static String getFullDisplayName(Locale locale) {
-        final String localeCode = locale.toString();
+    private static String lookupExceptionalLocale(String key) {
         for (int index = 0; index < sExceptionKeys.length; index++) {
-            if (sExceptionKeys[index].equals(localeCode)) {
-                final String value = sExceptionValues[index];
-                if (value.indexOf("%s") >= 0) {
-                    final String languageName = locale.getDisplayLanguage(locale);
-                    return String.format(value, languageName);
-                }
-                return value;
+            if (sExceptionKeys[index].equals(key)) {
+                return sExceptionValues[index];
             }
         }
-        return locale.getDisplayName(locale);
+        return null;
+    }
+
+    // Get Locale's full display name in its locale.
+    // For example:
+    // "fr_CH" is converted to "Français (Suisse)".
+    // "de_QY" is converted to "Deutsche (QWERTY)". (Any locale that has country code "QY")
+    // "zz_QY" is converted to "QWERTY". (The language code "zz" means "No language", thus just
+    // ends up with the keyboard layout name.)
+    public static String getFullDisplayName(Locale locale) {
+        final String key;
+        if (locale.getLanguage().equals(NO_LANGUAGE)) {
+            key = locale.getCountry();
+        } else if (locale.getCountry().equals(QWERTY)) {
+            key = "*_" + QWERTY;
+        } else {
+            key = locale.toString();
+        }
+        final String value = lookupExceptionalLocale(key);
+        if (value == null) {
+            return toTitleCase(locale.getDisplayName(locale), locale);
+        }
+        if (value.indexOf("%s") >= 0) {
+            final String languageName = toTitleCase(locale.getDisplayLanguage(locale), locale);
+            return String.format(value, languageName);
+        }
+        return value;
+    }
+
+    // Get Locale's middle display name in its locale.
+    // For example:
+    // "fr_CH" is converted to "Français".
+    // "de_QY" is converted to "Deutsche". (Any locale that has country code "QY")
+    // "zz_QY" is converted to "QWERTY". (The language code "zz" means "No language", thus just
+    // ends up with the keyboard layout name.)
+    public static String getMiddleDisplayName(Locale locale) {
+        if (NO_LANGUAGE.equals(locale.getLanguage())) {
+            return lookupExceptionalLocale(locale.getCountry());
+        } else {
+            return toTitleCase(locale.getDisplayLanguage(locale), locale);
+        }
+    }
+
+    // Get Locale's short display name in its locale.
+    // For example:
+    // "fr_CH" is converted to "Fr".
+    // "de_QY" is converted to "De". (Any locale that has country code "QY")
+    // "zz_QY" is converter to "QY". (The language code "zz" means "No language", thus just ends
+    // up with the keyboard layout name.)
+    public static String getShortDisplayName(Locale locale) {
+        if (NO_LANGUAGE.equals(locale.getLanguage())) {
+            return locale.getCountry();
+        } else {
+            return toTitleCase(locale.getLanguage(), locale);
+        }
+    }
+
+    public static String toTitleCase(String s, Locale locale) {
+        if (s.length() <= 1) {
+            // TODO: is this really correct? Shouldn't this be s.toUpperCase()?
+            return s;
+        }
+        // TODO: fix the bugs below
+        // - This does not work for Greek, because it returns upper case instead of title case.
+        // - It does not work for Serbian, because it fails to account for the "lj" character,
+        // which should be "Lj" in title case and "LJ" in upper case.
+        // - It does not work for Dutch, because it fails to account for the "ij" digraph, which
+        // are two different characters but both should be capitalized as "IJ" as if they were
+        // a single letter.
+        // - It also does not work with unicode surrogate code points.
+        return s.toUpperCase(locale).charAt(0) + s.substring(1);
     }
 }
diff --git a/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java b/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java
index e353644..c2dafcf 100644
--- a/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java
+++ b/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java
@@ -420,10 +420,6 @@
         return KEYBOARD_MODE.equals(getCurrentSubtypeMode());
     }
 
-    public String getInputLanguageName() {
-        return StringUtils.getDisplayLanguage(getInputLocale());
-    }
-
     /////////////////////////////
     // Other utility functions //
     /////////////////////////////
diff --git a/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java b/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java
index 7b13e40..cd01bb1 100644
--- a/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java
+++ b/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java
@@ -37,6 +37,7 @@
 import com.android.inputmethod.latin.LocaleUtils;
 import com.android.inputmethod.latin.R;
 import com.android.inputmethod.latin.StringUtils;
+import com.android.inputmethod.latin.SubtypeLocale;
 import com.android.inputmethod.latin.SynchronouslyLoadedContactsDictionary;
 import com.android.inputmethod.latin.SynchronouslyLoadedUserDictionary;
 import com.android.inputmethod.latin.WhitelistDictionary;
@@ -325,8 +326,8 @@
                 } else if (CAPITALIZE_FIRST == capitalizeType) {
                     for (int i = 0; i < mSuggestions.size(); ++i) {
                         // Likewise
-                        mSuggestions.set(i, StringUtils.toTitleCase(mSuggestions.get(i).toString(),
-                                locale));
+                        mSuggestions.set(i, SubtypeLocale.toTitleCase(
+                                mSuggestions.get(i).toString(), locale));
                     }
                 }
                 // This returns a String[], while toArray() returns an Object[] which cannot be cast
