diff --git a/java/res/values/attrs.xml b/java/res/values/attrs.xml
index 5557dde1eb0a17ad1b152f1ae0f44f3be1d0aa4b..b159f08ced1bade301e6f78c48e683f1983c38cb 100644
--- a/java/res/values/attrs.xml
+++ b/java/res/values/attrs.xml
@@ -16,6 +16,8 @@
 
 <resources>
     <declare-styleable name="KeyboardTheme">
+        <!-- Keyboard style -->
+        <attr name="keyboardStyle" format="reference" />
         <!-- KeyboardView style -->
         <attr name="keyboardViewStyle" format="reference" />
         <attr name="keyPreviewStyle" format="reference" />
@@ -113,6 +115,8 @@
         <attr name="verticalGap" format="dimension|fraction" />
         <!-- Popup keyboard layout template -->
         <attr name="popupKeyboardTemplate" format="reference" />
+        <!-- Popup hint icon -->
+        <attr name="popupHintIcon" format="reference" />
         <!-- Locale of the keyboard layout -->
         <attr name="keyboardLocale" format="string" />
     </declare-styleable>
@@ -146,10 +150,11 @@
         <!-- The key label option -->
         <attr name="keyLabelOption" format="integer">
             <!-- This should be aligned with KeyboardView.KEY_LABEL_OPTION_* -->
-            <flag name="alignLeft" value="1" />
-            <flag name="alignRight" value="2" />
-            <flag name="alignBottom" value="8" />
-            <flag name="fontNormal" value="16" />
+            <flag name="alignLeft" value="0x01" />
+            <flag name="alignRight" value="0x02" />
+            <flag name="alignBottom" value="0x08" />
+            <flag name="fontNormal" value="0x10" />
+            <flag name="popupHint" value="0x20" />
         </attr>
         <!-- The unicode that this key generates in manual temporary upper case mode. -->
         <attr name="manualTemporaryUpperCaseCode" format="integer" />
@@ -200,9 +205,9 @@
         </attr>
         <attr name="webInput" format="boolean" />
         <attr name="passwordInput" format="boolean" />
-        <attr name="hasSettingsKey" format="string" />
-        <attr name="voiceKeyEnabled" format="string" />
-        <attr name="hasVoiceKey" format="string" />
+        <attr name="hasSettingsKey" format="boolean" />
+        <attr name="voiceKeyEnabled" format="boolean" />
+        <attr name="hasVoiceKey" format="boolean" />
         <attr name="imeAction" format="enum">
             <!-- This should be aligned with EditorInfo.IME_ACTION_* -->
             <enum name="actionUnspecified" value="0" />
diff --git a/java/res/values/styles.xml b/java/res/values/styles.xml
index 7cb4593fa0809b8ecfc9287b4ca297545f7267a3..60ed34a0623dd2073234bc1b8bb1453a845050ca 100644
--- a/java/res/values/styles.xml
+++ b/java/res/values/styles.xml
@@ -16,6 +16,9 @@
 
 <resources>
     <!-- Theme "Basic" -->
+    <style name="Keyboard" >
+        <item name="popupHintIcon">@drawable/hint_popup</item>
+    </style>
     <style name="KeyboardView">
         <item name="android:background">@drawable/keyboard_background</item>
         <item name="keyBackground">@drawable/btn_keyboard_key</item>
@@ -89,6 +92,9 @@
         <item name="android:background">@null</item>
     </style>
     <!-- Theme "Honeycomb" -->
+    <style name="Keyboard.Honeycomb" parent="Keyboard" >
+        <item name="popupHintIcon">@drawable/hint_popup_holo</item>
+    </style>
     <style name="KeyboardView.Honeycomb" parent="KeyboardView">
         <item name="android:background">@drawable/keyboard_background_holo</item>
         <item name="keyBackground">@drawable/btn_keyboard_key_honeycomb</item>
@@ -111,13 +117,13 @@
         <item name="android:paddingLeft">@dimen/mini_keyboard_horizontal_padding_holo</item>
         <item name="android:paddingRight">@dimen/mini_keyboard_horizontal_padding_holo</item>
     </style>
-    <style name="SuggestionsStripBackgroundStyle.Holo">
+    <style name="SuggestionsStripBackgroundStyle.Honeycomb">
         <item name="android:background">@drawable/keyboard_suggest_strip_holo</item>
     </style>
-    <style name="SuggestionBackgroundStyle.Holo">
+    <style name="SuggestionBackgroundStyle.Honeycomb">
         <item name="android:background">@drawable/btn_candidate_holo</item>
     </style>
-    <style name="SuggestionPreviewBackgroundStyle.Holo">
+    <style name="SuggestionPreviewBackgroundStyle.Honeycomb">
         <item name="android:background">@drawable/keyboard_popup_panel_background_holo</item>
     </style>
     <style name="PopupMiniKeyboardAnimation">
diff --git a/java/res/values/themes.xml b/java/res/values/themes.xml
index 5315a9a90607e7eed71d1744b008a521848c37f2..1382dfe653a9fd2228d3973c217e587feb78d51d 100644
--- a/java/res/values/themes.xml
+++ b/java/res/values/themes.xml
@@ -16,6 +16,7 @@
 
 <resources>
     <style name="KeyboardTheme" parent="android:Theme">
+        <item name="keyboardStyle">@style/Keyboard</item>
         <item name="keyboardViewStyle">@style/KeyboardView</item>
         <item name="keyPreviewStyle">@style/KeyPreviewStyle</item>
         <item name="popupMiniKeyboardViewStyle">@style/PopupMiniKeyboardView</item>
@@ -25,6 +26,7 @@
         <item name="suggestionPreviewBackgroundStyle">@style/SuggestionPreviewBackgroundStyle</item>
     </style>
     <style name="KeyboardTheme.HighContrast" parent="android:Theme">
+        <item name="keyboardStyle">@style/Keyboard</item>
         <item name="keyboardViewStyle">@style/KeyboardView.HighContrast</item>
         <item name="keyPreviewStyle">@style/KeyPreviewStyle</item>
         <item name="popupMiniKeyboardViewStyle">@style/PopupMiniKeyboardView</item>
@@ -33,6 +35,7 @@
         <item name="suggestionBackgroundStyle">@style/SuggestionBackgroundStyle</item>
     </style>
     <style name="KeyboardTheme.Stone" parent="android:Theme.Light">
+        <item name="keyboardStyle">@style/Keyboard</item>
         <item name="keyboardViewStyle">@style/KeyboardView.Stone</item>
         <item name="keyPreviewStyle">@style/KeyPreviewStyle</item>
         <item name="popupMiniKeyboardViewStyle">@style/PopupMiniKeyboardView.Stone</item>
@@ -41,6 +44,7 @@
         <item name="suggestionBackgroundStyle">@style/SuggestionBackgroundStyle</item>
     </style>
     <style name="KeyboardTheme.Stone.Bold" parent="android:Theme.Light">
+        <item name="keyboardStyle">@style/Keyboard</item>
         <item name="keyboardViewStyle">@style/KeyboardView.Stone.Bold</item>
         <item name="keyPreviewStyle">@style/KeyPreviewStyle</item>
         <item name="popupMiniKeyboardViewStyle">@style/PopupMiniKeyboardView.Stone</item>
@@ -49,6 +53,7 @@
         <item name="suggestionBackgroundStyle">@style/SuggestionBackgroundStyle</item>
     </style>
     <style name="KeyboardTheme.Gingerbread" parent="android:Theme.Black">
+        <item name="keyboardStyle">@style/Keyboard</item>
         <item name="keyboardViewStyle">@style/KeyboardView.Gingerbread</item>
         <item name="keyPreviewStyle">@style/KeyPreviewStyle</item>
         <item name="popupMiniKeyboardViewStyle">@style/PopupMiniKeyboardView.Gingerbread</item>
@@ -57,11 +62,12 @@
         <item name="suggestionBackgroundStyle">@style/SuggestionBackgroundStyle</item>
     </style>
     <style name="KeyboardTheme.Honeycomb" parent="android:Theme.Holo">
+        <item name="keyboardStyle">@style/Keyboard.Honeycomb</item>
         <item name="keyboardViewStyle">@style/KeyboardView.Honeycomb</item>
         <item name="keyPreviewStyle">@style/KeyPreviewStyle.Honeycomb</item>
         <item name="popupMiniKeyboardViewStyle">@style/PopupMiniKeyboardView.Honeycomb</item>
         <item name="popupMiniKeyboardPanelStyle">@style/PopupMiniKeyboardPanelStyle.Honeycomb</item>
-        <item name="suggestionsStripBackgroundStyle">@style/SuggestionsStripBackgroundStyle.Holo</item>
-        <item name="suggestionBackgroundStyle">@style/SuggestionBackgroundStyle.Holo</item>
+        <item name="suggestionsStripBackgroundStyle">@style/SuggestionsStripBackgroundStyle.Honeycomb</item>
+        <item name="suggestionBackgroundStyle">@style/SuggestionBackgroundStyle.Honeycomb</item>
     </style>
 </resources>
diff --git a/java/res/xml-sw600dp/kbd_key_styles.xml b/java/res/xml-sw600dp/kbd_key_styles.xml
index a98ffe6792942b7e1c9c6198458b328be2254b71..a3888791045e7dfaed3ff9750c5fab69e9d585b8 100644
--- a/java/res/xml-sw600dp/kbd_key_styles.xml
+++ b/java/res/xml-sw600dp/kbd_key_styles.xml
@@ -75,7 +75,7 @@
                 latin:styleName="smileyKeyStyle"
                 latin:keyLabel=":-)"
                 latin:keyOutputText=":-) "
-                latin:keyHintIcon="@drawable/hint_popup_holo"
+                latin:keyLabelOption="popupHint"
                 latin:popupCharacters="@string/alternates_for_smiley"
                 latin:maxPopupKeyboardColumn="5" />
             <switch>
@@ -87,7 +87,7 @@
                         latin:code="@integer/key_shortcut"
                         latin:keyIcon="@drawable/sym_keyboard_voice_holo"
                         latin:iconPreview="@drawable/sym_keyboard_feedback_mic"
-                        latin:keyHintIcon="@drawable/hint_popup_holo"
+                        latin:keyLabelOption="popupHint"
                         latin:popupCharacters="\@drawable/sym_keyboard_settings|\@integer/key_settings"
                         latin:parentStyle="functionalKeyStyle" />
                 </case>
@@ -137,7 +137,7 @@
                 latin:styleName="smileyKeyStyle"
                 latin:keyLabel=":-)"
                 latin:keyOutputText=":-) "
-                latin:keyHintIcon="@drawable/hint_popup_holo"
+                latin:keyLabelOption="popupHint"
                 latin:popupCharacters="@string/alternates_for_smiley"
                 latin:maxPopupKeyboardColumn="5" />
             <switch>
@@ -149,7 +149,7 @@
                         latin:code="@integer/key_shortcut"
                         latin:keyIcon="@drawable/sym_bkeyboard_mic"
                         latin:iconPreview="@drawable/sym_keyboard_feedback_mic"
-                        latin:keyHintIcon="@drawable/hint_popup_holo"
+                        latin:keyLabelOption="popupHint"
                         latin:popupCharacters="\@drawable/sym_keyboard_settings|\@integer/key_settings"
                         latin:parentStyle="functionalKeyStyle" />
                 </case>
@@ -192,9 +192,8 @@
     <key-style
         latin:styleName="comKeyStyle"
         latin:keyLabel="@string/keylabel_for_popular_domain"
-        latin:keyLabelOption="fontNormal"
+        latin:keyLabelOption="fontNormal|popupHint"
         latin:keyOutputText="@string/keylabel_for_popular_domain"
-        latin:keyHintIcon="@drawable/hint_popup_holo"
         latin:popupCharacters="@string/alternates_for_popular_domain" />
     <switch>
         <case
diff --git a/java/res/xml-sw768dp/kbd_key_styles.xml b/java/res/xml-sw768dp/kbd_key_styles.xml
index 57eaccbae3cb97a7145bf757d3dbf88639136a1c..4388e89599b48773a71541c0a7b56c77b6e40a8a 100644
--- a/java/res/xml-sw768dp/kbd_key_styles.xml
+++ b/java/res/xml-sw768dp/kbd_key_styles.xml
@@ -62,7 +62,7 @@
                 latin:styleName="smileyKeyStyle"
                 latin:keyLabel=":-)"
                 latin:keyOutputText=":-) "
-                latin:keyHintIcon="@drawable/hint_popup_holo"
+                latin:keyLabelOption="popupHint"
                 latin:popupCharacters="@string/alternates_for_smiley"
                 latin:maxPopupKeyboardColumn="5" />
             <key-style
@@ -116,7 +116,7 @@
                 latin:styleName="smileyKeyStyle"
                 latin:keyLabel=":-)"
                 latin:keyOutputText=":-) "
-                latin:keyHintIcon="@drawable/hint_popup_holo"
+                latin:keyLabelOption="popupHint"
                 latin:popupCharacters="@string/alternates_for_smiley"
                 latin:maxPopupKeyboardColumn="5" />
             <key-style
@@ -161,9 +161,8 @@
     <key-style
         latin:styleName="comKeyStyle"
         latin:keyLabel="@string/keylabel_for_popular_domain"
-        latin:keyLabelOption="fontNormal"
+        latin:keyLabelOption="fontNormal|popupHint"
         latin:keyOutputText="@string/keylabel_for_popular_domain"
-        latin:keyHintIcon="@drawable/hint_popup_holo"
         latin:popupCharacters="@string/alternates_for_popular_domain" />
     <switch>
         <case
diff --git a/java/res/xml/kbd_key_styles.xml b/java/res/xml/kbd_key_styles.xml
index f888b231e5ff23552119b680640fc78ea4b90af7..63c019d2cec360a2e1273725cc2cc28ec7b1a1db 100644
--- a/java/res/xml/kbd_key_styles.xml
+++ b/java/res/xml/kbd_key_styles.xml
@@ -50,7 +50,7 @@
         <default>
             <key-style
                 latin:styleName="settingsPopupStyle"
-                latin:keyHintIcon="@drawable/hint_popup"
+                latin:keyLabelOption="popupHint"
                 latin:popupCharacters="\@drawable/sym_keyboard_settings_holo|\@integer/key_settings"
                 latin:parentStyle="functionalKeyStyle" />
         </default>
@@ -308,7 +308,7 @@
         latin:styleName="smileyKeyStyle"
         latin:keyLabel=":-)"
         latin:keyOutputText=":-) "
-        latin:keyHintIcon="@drawable/hint_popup"
+        latin:keyLabelOption="popupHint"
         latin:popupCharacters="@string/alternates_for_smiley"
         latin:maxPopupKeyboardColumn="5"
         latin:parentStyle="functionalKeyStyle" />
diff --git a/java/res/xml/kbd_qwerty_row4.xml b/java/res/xml/kbd_qwerty_row4.xml
index 21d80eb0b31329e95ec5977480bd2934860ce2ae..dfe5de359ad310a5cc422906cdd240fd1641776d 100644
--- a/java/res/xml/kbd_qwerty_row4.xml
+++ b/java/res/xml/kbd_qwerty_row4.xml
@@ -59,15 +59,15 @@
                 latin:webInput="true"
             >
                 <Key
-                    latin:keyHintIcon="@drawable/hint_popup"
+                    latin:keyStyle="tabKeyStyle"
+                    latin:keyLabelOption="popupHint"
                     latin:popupCharacters="@string/alternates_for_web_tab_punctuation"
-                    latin:maxPopupKeyboardColumn="8"
-                    latin:keyStyle="tabKeyStyle" />
+                    latin:maxPopupKeyboardColumn="8" />
             </case>
             <default>
                 <Key
                     latin:keyLabel="."
-                    latin:keyHintIcon="@drawable/hint_popup"
+                    latin:keyLabelOption="popupHint"
                     latin:popupCharacters="@string/alternates_for_punctuation"
                     latin:maxPopupKeyboardColumn="7"
                     latin:keyStyle="functionalKeyStyle" />
diff --git a/java/res/xml/kbd_symbols_row4.xml b/java/res/xml/kbd_symbols_row4.xml
index 726f7c37a4c4defffa2717bec7576b615b32e854..704402aaf03eef09349f9bad6dee5f65b18402c3 100644
--- a/java/res/xml/kbd_symbols_row4.xml
+++ b/java/res/xml/kbd_symbols_row4.xml
@@ -56,7 +56,7 @@
         </switch>
         <Key
             latin:keyLabel="."
-            latin:keyHintIcon="@drawable/hint_popup"
+            latin:keyLabelOption="popupHint"
             latin:popupCharacters="@string/alternates_for_punctuation"
             latin:maxPopupKeyboardColumn="7"
             latin:keyStyle="functionalKeyStyle" />
diff --git a/java/src/com/android/inputmethod/keyboard/Keyboard.java b/java/src/com/android/inputmethod/keyboard/Keyboard.java
index 267abccb3fa1e6875662d5381a11a28cc40c6f1e..77a4cde55a0a33fe61176fe4852a36bf66b7e062 100644
--- a/java/src/com/android/inputmethod/keyboard/Keyboard.java
+++ b/java/src/com/android/inputmethod/keyboard/Keyboard.java
@@ -16,15 +16,16 @@
 
 package com.android.inputmethod.keyboard;
 
-import com.android.inputmethod.latin.R;
-
-import org.xmlpull.v1.XmlPullParserException;
-
 import android.content.Context;
 import android.content.res.Resources;
+import android.content.res.TypedArray;
 import android.graphics.drawable.Drawable;
 import android.util.Log;
 
+import com.android.inputmethod.latin.R;
+
+import org.xmlpull.v1.XmlPullParserException;
+
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -146,6 +147,8 @@ public class Keyboard {
 
     private final ProximityInfo mProximityInfo;
 
+    public final Drawable mPopupHintIcon;
+
     /**
      * Creates a keyboard from the given xml key layout file.
      * @param context the application or service context
@@ -171,8 +174,14 @@ public class Keyboard {
         mDefaultVerticalGap = 0;
         mDefaultHeight = mDefaultWidth;
         mId = id;
-        loadKeyboard(context, xmlLayoutResId);
         mProximityInfo = new ProximityInfo(GRID_WIDTH, GRID_HEIGHT);
+
+        final TypedArray attrs = context.obtainStyledAttributes(
+                null, R.styleable.Keyboard, R.attr.keyboardStyle, R.style.Keyboard);
+        mPopupHintIcon = attrs.getDrawable(R.styleable.Keyboard_popupHintIcon);
+        attrs.recycle();
+
+        loadKeyboard(context, xmlLayoutResId);
     }
 
     public int getProximityInfo() {
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardParser.java b/java/src/com/android/inputmethod/keyboard/KeyboardParser.java
index c2db62a1c72f2fba49bba1030377c66de1926f45..07166b1dba02e5a2324e63797b42bf595205a0c6 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardParser.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardParser.java
@@ -16,12 +16,6 @@
 
 package com.android.inputmethod.keyboard;
 
-import com.android.inputmethod.compat.EditorInfoCompatUtils;
-import com.android.inputmethod.latin.R;
-
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
 import android.content.Context;
 import android.content.res.Resources;
 import android.content.res.TypedArray;
@@ -31,6 +25,12 @@ import android.util.TypedValue;
 import android.util.Xml;
 import android.view.InflateException;
 
+import com.android.inputmethod.compat.EditorInfoCompatUtils;
+import com.android.inputmethod.latin.R;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
 import java.io.IOException;
 import java.util.Arrays;
 import java.util.List;
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java b/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java
index 8e9c7ef7ea511dc3ae57f85a091631e58190ed51..50c61ffaebaf6a54b470342b45d088131caf8f70 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java
@@ -202,7 +202,9 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha
             final Locale savedLocale = Utils.setSystemLocale(res,
                     mSubtypeSwitcher.getInputLocale());
 
-            keyboard = new LatinKeyboard(mInputMethodService, id, id.mWidth);
+            final Context themeContext = new ContextThemeWrapper(mInputMethodService,
+                    KEYBOARD_THEMES[mThemeIndex]);
+            keyboard = new LatinKeyboard(themeContext, id, id.mWidth);
 
             if (id.mEnableShiftLock) {
                 keyboard.enableShiftLock();
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardView.java b/java/src/com/android/inputmethod/keyboard/KeyboardView.java
index f8bce40b1ad60c861161241f83dbdeb7467e4928..fa47bf7c1d4eb6c4c5b2237e5982d3eaabb869d5 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardView.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardView.java
@@ -16,9 +16,6 @@
 
 package com.android.inputmethod.keyboard;
 
-import com.android.inputmethod.latin.LatinImeLogger;
-import com.android.inputmethod.latin.R;
-
 import android.content.Context;
 import android.content.pm.PackageManager;
 import android.content.res.Resources;
@@ -50,6 +47,9 @@ import android.widget.LinearLayout;
 import android.widget.PopupWindow;
 import android.widget.TextView;
 
+import com.android.inputmethod.latin.LatinImeLogger;
+import com.android.inputmethod.latin.R;
+
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.WeakHashMap;
@@ -176,10 +176,11 @@ public class KeyboardView extends View implements PointerTracker.UIProxy {
     private final float KEY_LABEL_VERTICAL_ADJUSTMENT_FACTOR_CENTER = 0.45f;
     private final float KEY_LABEL_VERTICAL_PADDING_FACTOR = 1.60f;
     private final String KEY_LABEL_REFERENCE_CHAR = "H";
-    private final int KEY_LABEL_OPTION_ALIGN_LEFT = 1;
-    private final int KEY_LABEL_OPTION_ALIGN_RIGHT = 2;
-    private final int KEY_LABEL_OPTION_ALIGN_BOTTOM = 8;
-    private final int KEY_LABEL_OPTION_FONT_NORMAL = 16;
+    private final int KEY_LABEL_OPTION_ALIGN_LEFT = 0x01;
+    private final int KEY_LABEL_OPTION_ALIGN_RIGHT = 0x02;
+    private final int KEY_LABEL_OPTION_ALIGN_BOTTOM = 0x08;
+    private final int KEY_LABEL_OPTION_FONT_NORMAL = 0x10;
+    private final int KEY_LABEL_OPTION_POPUP_HINT = 0x20;
     private final int mKeyLabelHorizontalPadding;
 
     private final UIHandler mHandler = new UIHandler();
@@ -762,14 +763,15 @@ public class KeyboardView extends View implements PointerTracker.UIProxy {
         }
 
         // Draw hint icon.
-        if (key.mHintIcon != null) {
+        if (key.mHintIcon != null || (key.mLabelOption & KEY_LABEL_OPTION_POPUP_HINT) != 0) {
             final int drawableWidth = keyDrawWidth;
             final int drawableHeight = key.mHeight;
             final int drawableX = 0;
             final int drawableY = HINT_ICON_VERTICAL_ADJUSTMENT_PIXEL;
             Drawable hintIcon = (isManualTemporaryUpperCase
                     && key.mManualTemporaryUpperCaseHintIcon != null)
-                    ? key.mManualTemporaryUpperCaseHintIcon : key.mHintIcon;
+                    ? key.mManualTemporaryUpperCaseHintIcon
+                    : (key.mHintIcon != null ? key.mHintIcon : mKeyboard.mPopupHintIcon);
             drawIcon(canvas, hintIcon, drawableX, drawableY, drawableWidth, drawableHeight);
             if (DEBUG_SHOW_ALIGN)
                 drawRectangle(canvas, drawableX, drawableY, drawableWidth, drawableHeight,