Add keyHintIcon attribute to BaseKeyboard.Key class

This keyHintIcon attribute is used to specify hint icon drawable at
top right corner of Key.

Change-Id: Icaa91e63c4473b2513396bd3fbeb8ed6fd73586c
diff --git a/java/res/drawable-mdpi/keyboard_hint_at.9.png b/java/res/drawable-mdpi/keyboard_hint_at.9.png
new file mode 100644
index 0000000..69baede
--- /dev/null
+++ b/java/res/drawable-mdpi/keyboard_hint_at.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_hint_colon.9.png b/java/res/drawable-mdpi/keyboard_hint_colon.9.png
new file mode 100644
index 0000000..9d0d7cb
--- /dev/null
+++ b/java/res/drawable-mdpi/keyboard_hint_colon.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_hint_doublecross.9.png b/java/res/drawable-mdpi/keyboard_hint_doublecross.9.png
new file mode 100644
index 0000000..d24aa0f
--- /dev/null
+++ b/java/res/drawable-mdpi/keyboard_hint_doublecross.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_hint_exclamation.9.png b/java/res/drawable-mdpi/keyboard_hint_exclamation.9.png
new file mode 100644
index 0000000..f6cc7fe
--- /dev/null
+++ b/java/res/drawable-mdpi/keyboard_hint_exclamation.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_hint_greater.9.png b/java/res/drawable-mdpi/keyboard_hint_greater.9.png
new file mode 100644
index 0000000..5210392
--- /dev/null
+++ b/java/res/drawable-mdpi/keyboard_hint_greater.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_hint_plus.9.png b/java/res/drawable-mdpi/keyboard_hint_plus.9.png
new file mode 100644
index 0000000..d1d85ac
--- /dev/null
+++ b/java/res/drawable-mdpi/keyboard_hint_plus.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_hint_question.9.png b/java/res/drawable-mdpi/keyboard_hint_question.9.png
new file mode 100644
index 0000000..37f6e5f
--- /dev/null
+++ b/java/res/drawable-mdpi/keyboard_hint_question.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_hint_quote.9.png b/java/res/drawable-mdpi/keyboard_hint_quote.9.png
new file mode 100644
index 0000000..e7d2cb5
--- /dev/null
+++ b/java/res/drawable-mdpi/keyboard_hint_quote.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_hint_smaller.9.png b/java/res/drawable-mdpi/keyboard_hint_smaller.9.png
new file mode 100644
index 0000000..76553cf
--- /dev/null
+++ b/java/res/drawable-mdpi/keyboard_hint_smaller.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_hint_star.9.png b/java/res/drawable-mdpi/keyboard_hint_star.9.png
new file mode 100644
index 0000000..47978c4
--- /dev/null
+++ b/java/res/drawable-mdpi/keyboard_hint_star.9.png
Binary files differ
diff --git a/java/res/values/attrs.xml b/java/res/values/attrs.xml
index 943a43b..1900214 100644
--- a/java/res/values/attrs.xml
+++ b/java/res/values/attrs.xml
@@ -106,8 +106,12 @@
         <attr name="keyOutputText" format="string" />
         <!-- The label to display on the key. -->
         <attr name="keyLabel" format="string" />
+        <!-- The label to display on the key when keyboard is in temporary shift mode. -->
+        <attr name="temporaryShiftKeyLabel" format="string" />
         <!-- The icon to display on the key instead of the label. -->
         <attr name="keyIcon" format="reference" />
+        <!-- The hint icon to display on the key in conjunction with the label -->
+        <attr name="keyHintIcon" format="reference" />
         <!-- Mode of the keyboard. If the mode doesn't match the
              requested keyboard mode, the key will be skipped. -->
         <attr name="keyboardMode" />
diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml
index 94fe76d..a05d291 100644
--- a/java/res/values/strings.xml
+++ b/java/res/values/strings.xml
@@ -212,6 +212,8 @@
     <string name="label_alpha_key">ABC</string>
     <!-- Label for ALT modifier key.  Must be short to fit on key! -->
     <string name="label_alt_key">ALT</string>
+    <!-- Label for Shift modifier key of symbol keyboard.  Must be short to fit on key! -->
+    <string name="label_more_key">More</string>
 
     <!-- Voice related labels -->
 
diff --git a/java/res/xml-da/kbd_qwerty.xml b/java/res/xml-da/kbd_qwerty.xml
index 4aef4b4..431c5d7 100644
--- a/java/res/xml-da/kbd_qwerty.xml
+++ b/java/res/xml-da/kbd_qwerty.xml
@@ -34,44 +34,54 @@
     <Row>
         <Key
             latin:keyLabel="q"
+            latin:keyHintIcon="@drawable/keyboard_hint_1"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_q"
             latin:keyWidth="8.75%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="w"
+            latin:keyHintIcon="@drawable/keyboard_hint_2"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_w" />
         <Key
             latin:keyLabel="e"
+            latin:keyHintIcon="@drawable/keyboard_hint_3"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_e" />
         <Key
             latin:keyLabel="r"
+            latin:keyHintIcon="@drawable/keyboard_hint_4"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_r" />
         <Key
             latin:keyLabel="t"
+            latin:keyHintIcon="@drawable/keyboard_hint_5"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_t" />
         <Key
             latin:keyLabel="y"
+            latin:keyHintIcon="@drawable/keyboard_hint_6"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_y" />
         <Key
             latin:keyLabel="u"
+            latin:keyHintIcon="@drawable/keyboard_hint_7"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_u" />
         <Key
             latin:keyLabel="i"
+            latin:keyHintIcon="@drawable/keyboard_hint_8"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_i" />
         <Key
             latin:keyLabel="o"
+            latin:keyHintIcon="@drawable/keyboard_hint_9"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_o" />
         <Key
             latin:keyLabel="p"
+            latin:keyHintIcon="@drawable/keyboard_hint_0"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_p" />
         <Key
diff --git a/java/res/xml-da/kbd_qwerty_black.xml b/java/res/xml-da/kbd_qwerty_black.xml
index e3b6768..43bcdee 100644
--- a/java/res/xml-da/kbd_qwerty_black.xml
+++ b/java/res/xml-da/kbd_qwerty_black.xml
@@ -34,44 +34,54 @@
     <Row>
         <Key
             latin:keyLabel="q"
+            latin:keyHintIcon="@drawable/keyboard_hint_1"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_q"
             latin:keyWidth="8.75%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="w"
+            latin:keyHintIcon="@drawable/keyboard_hint_2"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_w" />
         <Key
             latin:keyLabel="e"
+            latin:keyHintIcon="@drawable/keyboard_hint_3"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_e" />
         <Key
             latin:keyLabel="r"
+            latin:keyHintIcon="@drawable/keyboard_hint_4"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_r" />
         <Key
             latin:keyLabel="t"
+            latin:keyHintIcon="@drawable/keyboard_hint_5"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_t" />
         <Key
             latin:keyLabel="y"
+            latin:keyHintIcon="@drawable/keyboard_hint_6"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_y" />
         <Key
             latin:keyLabel="u"
+            latin:keyHintIcon="@drawable/keyboard_hint_7"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_u" />
         <Key
             latin:keyLabel="i"
+            latin:keyHintIcon="@drawable/keyboard_hint_8"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_i" />
         <Key
             latin:keyLabel="o"
+            latin:keyHintIcon="@drawable/keyboard_hint_9"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_o" />
         <Key
             latin:keyLabel="p"
+            latin:keyHintIcon="@drawable/keyboard_hint_0"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_p" />
         <Key
diff --git a/java/res/xml-de/kbd_qwerty.xml b/java/res/xml-de/kbd_qwerty.xml
index 6318a9d..cc9d32f 100644
--- a/java/res/xml-de/kbd_qwerty.xml
+++ b/java/res/xml-de/kbd_qwerty.xml
@@ -28,43 +28,53 @@
     <Row>
         <Key
             latin:keyLabel="q"
+            latin:keyHintIcon="@drawable/keyboard_hint_1"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_q"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="w"
+            latin:keyHintIcon="@drawable/keyboard_hint_2"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_w" />
         <Key
             latin:keyLabel="e"
+            latin:keyHintIcon="@drawable/keyboard_hint_3"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_e" />
         <Key
             latin:keyLabel="r"
+            latin:keyHintIcon="@drawable/keyboard_hint_4"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_r" />
         <Key
             latin:keyLabel="t"
+            latin:keyHintIcon="@drawable/keyboard_hint_5"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_t" />
         <Key
             latin:keyLabel="z"
+            latin:keyHintIcon="@drawable/keyboard_hint_6"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_z" />
         <Key
             latin:keyLabel="u"
+            latin:keyHintIcon="@drawable/keyboard_hint_7"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_u" />
         <Key
             latin:keyLabel="i"
+            latin:keyHintIcon="@drawable/keyboard_hint_8"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_i" />
         <Key
             latin:keyLabel="o"
+            latin:keyHintIcon="@drawable/keyboard_hint_9"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_o" />
         <Key
             latin:keyLabel="p"
+            latin:keyHintIcon="@drawable/keyboard_hint_0"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_p"
             latin:keyEdgeFlags="right" />
diff --git a/java/res/xml-de/kbd_qwerty_black.xml b/java/res/xml-de/kbd_qwerty_black.xml
index dfa7ef6..fc0ede3 100644
--- a/java/res/xml-de/kbd_qwerty_black.xml
+++ b/java/res/xml-de/kbd_qwerty_black.xml
@@ -28,43 +28,53 @@
     <Row>
         <Key
             latin:keyLabel="q"
+            latin:keyHintIcon="@drawable/keyboard_hint_1"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_q"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="w"
+            latin:keyHintIcon="@drawable/keyboard_hint_2"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_w" />
         <Key
             latin:keyLabel="e"
+            latin:keyHintIcon="@drawable/keyboard_hint_3"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_e" />
         <Key
             latin:keyLabel="r"
             latin:popupKeyboard="@xml/kbd_popup_template"
+            latin:keyHintIcon="@drawable/keyboard_hint_4"
             latin:popupCharacters="@string/alternates_for_r" />
         <Key
             latin:keyLabel="t"
             latin:popupKeyboard="@xml/kbd_popup_template"
+            latin:keyHintIcon="@drawable/keyboard_hint_5"
             latin:popupCharacters="@string/alternates_for_t" />
         <Key
             latin:keyLabel="z"
+            latin:keyHintIcon="@drawable/keyboard_hint_6"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_z" />
         <Key
             latin:keyLabel="u"
+            latin:keyHintIcon="@drawable/keyboard_hint_7"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_u" />
         <Key
             latin:keyLabel="i"
+            latin:keyHintIcon="@drawable/keyboard_hint_8"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_i" />
         <Key
             latin:keyLabel="o"
+            latin:keyHintIcon="@drawable/keyboard_hint_9"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_o" />
         <Key
             latin:keyLabel="p"
+            latin:keyHintIcon="@drawable/keyboard_hint_0"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_p"
             latin:keyEdgeFlags="right" />
diff --git a/java/res/xml-fr/kbd_qwerty.xml b/java/res/xml-fr/kbd_qwerty.xml
index 80d4d25..c18339c 100644
--- a/java/res/xml-fr/kbd_qwerty.xml
+++ b/java/res/xml-fr/kbd_qwerty.xml
@@ -28,43 +28,53 @@
     <Row>
         <Key
             latin:keyLabel="a"
+            latin:keyHintIcon="@drawable/keyboard_hint_1"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_a"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="z"
+            latin:keyHintIcon="@drawable/keyboard_hint_2"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_z" />
         <Key
             latin:keyLabel="e"
+            latin:keyHintIcon="@drawable/keyboard_hint_3"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_e" />
         <Key
             latin:keyLabel="r"
+            latin:keyHintIcon="@drawable/keyboard_hint_4"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_r" />
         <Key
             latin:keyLabel="t"
+            latin:keyHintIcon="@drawable/keyboard_hint_5"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_t" />
         <Key
             latin:keyLabel="y"
+            latin:keyHintIcon="@drawable/keyboard_hint_6"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_y" />
         <Key
             latin:keyLabel="u"
+            latin:keyHintIcon="@drawable/keyboard_hint_7"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_u" />
         <Key
             latin:keyLabel="i"
+            latin:keyHintIcon="@drawable/keyboard_hint_8"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_i" />
         <Key
             latin:keyLabel="o"
+            latin:keyHintIcon="@drawable/keyboard_hint_9"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_o" />
         <Key
             latin:keyLabel="p"
+            latin:keyHintIcon="@drawable/keyboard_hint_0"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_p"
             latin:keyEdgeFlags="right" />
diff --git a/java/res/xml-fr/kbd_qwerty_black.xml b/java/res/xml-fr/kbd_qwerty_black.xml
index 28bf3f9..c0f263f 100644
--- a/java/res/xml-fr/kbd_qwerty_black.xml
+++ b/java/res/xml-fr/kbd_qwerty_black.xml
@@ -28,43 +28,53 @@
     <Row>
         <Key
             latin:keyLabel="a"
+            latin:keyHintIcon="@drawable/keyboard_hint_1"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_a"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="z"
+            latin:keyHintIcon="@drawable/keyboard_hint_2"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_z" />
         <Key
             latin:keyLabel="e"
+            latin:keyHintIcon="@drawable/keyboard_hint_3"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_e" />
         <Key
             latin:keyLabel="r"
+            latin:keyHintIcon="@drawable/keyboard_hint_4"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_r" />
         <Key
             latin:keyLabel="t"
+            latin:keyHintIcon="@drawable/keyboard_hint_5"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_t" />
         <Key
             latin:keyLabel="y"
+            latin:keyHintIcon="@drawable/keyboard_hint_6"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_y" />
         <Key
             latin:keyLabel="u"
+            latin:keyHintIcon="@drawable/keyboard_hint_7"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_u" />
         <Key
             latin:keyLabel="i"
+            latin:keyHintIcon="@drawable/keyboard_hint_8"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_i" />
         <Key
             latin:keyLabel="o"
+            latin:keyHintIcon="@drawable/keyboard_hint_9"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_o" />
         <Key
             latin:keyLabel="p"
+            latin:keyHintIcon="@drawable/keyboard_hint_0"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_p"
             latin:keyEdgeFlags="right" />
diff --git a/java/res/xml-nb/kbd_qwerty.xml b/java/res/xml-nb/kbd_qwerty.xml
index 8921d53..ea7fb30 100644
--- a/java/res/xml-nb/kbd_qwerty.xml
+++ b/java/res/xml-nb/kbd_qwerty.xml
@@ -34,44 +34,54 @@
     <Row>
         <Key
             latin:keyLabel="q"
+            latin:keyHintIcon="@drawable/keyboard_hint_1"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_q"
             latin:keyWidth="8.75%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="w"
+            latin:keyHintIcon="@drawable/keyboard_hint_2"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_w" />
         <Key
             latin:keyLabel="e"
+            latin:keyHintIcon="@drawable/keyboard_hint_3"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_e" />
         <Key
             latin:keyLabel="r"
+            latin:keyHintIcon="@drawable/keyboard_hint_4"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_r" />
         <Key
             latin:keyLabel="t"
+            latin:keyHintIcon="@drawable/keyboard_hint_5"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_t" />
         <Key
             latin:keyLabel="y"
+            latin:keyHintIcon="@drawable/keyboard_hint_6"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_y" />
         <Key
             latin:keyLabel="u"
+            latin:keyHintIcon="@drawable/keyboard_hint_7"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_u" />
         <Key
             latin:keyLabel="i"
+            latin:keyHintIcon="@drawable/keyboard_hint_8"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_i" />
         <Key
             latin:keyLabel="o"
+            latin:keyHintIcon="@drawable/keyboard_hint_9"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_o" />
         <Key
             latin:keyLabel="p"
+            latin:keyHintIcon="@drawable/keyboard_hint_0"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_p" />
         <Key
diff --git a/java/res/xml-nb/kbd_qwerty_black.xml b/java/res/xml-nb/kbd_qwerty_black.xml
index 1497d67..ea1a3a0 100644
--- a/java/res/xml-nb/kbd_qwerty_black.xml
+++ b/java/res/xml-nb/kbd_qwerty_black.xml
@@ -34,44 +34,54 @@
     <Row>
         <Key
             latin:keyLabel="q"
+            latin:keyHintIcon="@drawable/keyboard_hint_1"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_q"
             latin:keyWidth="8.75%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="w"
+            latin:keyHintIcon="@drawable/keyboard_hint_2"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_w" />
         <Key
             latin:keyLabel="e"
+            latin:keyHintIcon="@drawable/keyboard_hint_3"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_e" />
         <Key
             latin:keyLabel="r"
+            latin:keyHintIcon="@drawable/keyboard_hint_4"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_r" />
         <Key
             latin:keyLabel="t"
+            latin:keyHintIcon="@drawable/keyboard_hint_5"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_t" />
         <Key
             latin:keyLabel="y"
+            latin:keyHintIcon="@drawable/keyboard_hint_6"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_y" />
         <Key
             latin:keyLabel="u"
+            latin:keyHintIcon="@drawable/keyboard_hint_7"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_u" />
         <Key
             latin:keyLabel="i"
+            latin:keyHintIcon="@drawable/keyboard_hint_8"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_i" />
         <Key
             latin:keyLabel="o"
+            latin:keyHintIcon="@drawable/keyboard_hint_9"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_o" />
         <Key
             latin:keyLabel="p"
+            latin:keyHintIcon="@drawable/keyboard_hint_0"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_p" />
         <Key
diff --git a/java/res/xml-ru/kbd_qwerty.xml b/java/res/xml-ru/kbd_qwerty.xml
index 80ce4d0..e31f517 100644
--- a/java/res/xml-ru/kbd_qwerty.xml
+++ b/java/res/xml-ru/kbd_qwerty.xml
@@ -28,44 +28,54 @@
     <Row>
         <Key
             latin:keyLabel="й"
+            latin:keyHintIcon="@drawable/keyboard_hint_1"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="1"
             latin:keyWidth="8.75%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="ц"
+            latin:keyHintIcon="@drawable/keyboard_hint_2"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="2" />
         <Key
             latin:keyLabel="у"
+            latin:keyHintIcon="@drawable/keyboard_hint_3"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="3" />
         <Key
             latin:keyLabel="к"
+            latin:keyHintIcon="@drawable/keyboard_hint_4"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="4" />
         <Key
             latin:keyLabel="е"
+            latin:keyHintIcon="@drawable/keyboard_hint_5"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_cyrillic_e" />
         <Key
             latin:keyLabel="н"
+            latin:keyHintIcon="@drawable/keyboard_hint_6"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="6" />
         <Key
             latin:keyLabel="г"
+            latin:keyHintIcon="@drawable/keyboard_hint_7"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="7" />
         <Key
             latin:keyLabel="ш"
+            latin:keyHintIcon="@drawable/keyboard_hint_8"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="8" />
         <Key
             latin:keyLabel="щ"
+            latin:keyHintIcon="@drawable/keyboard_hint_9"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="9" />
         <Key
             latin:keyLabel="з"
+            latin:keyHintIcon="@drawable/keyboard_hint_0"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="0" />
         <Key
diff --git a/java/res/xml-ru/kbd_qwerty_black.xml b/java/res/xml-ru/kbd_qwerty_black.xml
index c3f120a..3ddfd29 100644
--- a/java/res/xml-ru/kbd_qwerty_black.xml
+++ b/java/res/xml-ru/kbd_qwerty_black.xml
@@ -28,44 +28,54 @@
     <Row>
         <Key
             latin:keyLabel="й"
+            latin:keyHintIcon="@drawable/keyboard_hint_1"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="1"
             latin:keyWidth="8.75%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="ц"
+            latin:keyHintIcon="@drawable/keyboard_hint_2"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="2" />
         <Key
             latin:keyLabel="у"
+            latin:keyHintIcon="@drawable/keyboard_hint_3"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="3" />
         <Key
             latin:keyLabel="к"
+            latin:keyHintIcon="@drawable/keyboard_hint_4"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="4" />
         <Key
             latin:keyLabel="е"
+            latin:keyHintIcon="@drawable/keyboard_hint_5"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_cyrillic_e" />
         <Key
             latin:keyLabel="н"
+            latin:keyHintIcon="@drawable/keyboard_hint_6"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="6" />
         <Key
             latin:keyLabel="г"
+            latin:keyHintIcon="@drawable/keyboard_hint_7"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="7" />
         <Key
             latin:keyLabel="ш"
+            latin:keyHintIcon="@drawable/keyboard_hint_8"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="8" />
         <Key
             latin:keyLabel="щ"
+            latin:keyHintIcon="@drawable/keyboard_hint_9"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="9" />
         <Key
             latin:keyLabel="з"
+            latin:keyHintIcon="@drawable/keyboard_hint_0"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="0" />
         <Key
diff --git a/java/res/xml-sr/kbd_qwerty.xml b/java/res/xml-sr/kbd_qwerty.xml
index 7cc4770..dd74fc2 100644
--- a/java/res/xml-sr/kbd_qwerty.xml
+++ b/java/res/xml-sr/kbd_qwerty.xml
@@ -29,43 +29,53 @@
     <Row>
         <Key
             latin:keyLabel="љ"
+            latin:keyHintIcon="@drawable/keyboard_hint_1"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="1"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="њ"
+            latin:keyHintIcon="@drawable/keyboard_hint_2"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="2" />
         <Key
             latin:keyLabel="е"
+            latin:keyHintIcon="@drawable/keyboard_hint_3"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="3" />
         <Key
             latin:keyLabel="р"
+            latin:keyHintIcon="@drawable/keyboard_hint_4"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="4" />
         <Key
             latin:keyLabel="т"
+            latin:keyHintIcon="@drawable/keyboard_hint_5"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="5" />
         <Key
             latin:keyLabel="з"
+            latin:keyHintIcon="@drawable/keyboard_hint_6"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="6" />
         <Key
             latin:keyLabel="у"
+            latin:keyHintIcon="@drawable/keyboard_hint_7"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="7" />
         <Key
             latin:keyLabel="и"
+            latin:keyHintIcon="@drawable/keyboard_hint_8"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="8" />
         <Key
             latin:keyLabel="о"
+            latin:keyHintIcon="@drawable/keyboard_hint_9"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="9" />
         <Key
             latin:keyLabel="п"
+            latin:keyHintIcon="@drawable/keyboard_hint_0"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="0" />
         <Key
diff --git a/java/res/xml-sr/kbd_qwerty_black.xml b/java/res/xml-sr/kbd_qwerty_black.xml
index d61ff3e..8c73ee3 100644
--- a/java/res/xml-sr/kbd_qwerty_black.xml
+++ b/java/res/xml-sr/kbd_qwerty_black.xml
@@ -29,43 +29,53 @@
     <Row>
         <Key
             latin:keyLabel="љ"
+            latin:keyHintIcon="@drawable/keyboard_hint_1"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="1"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="њ"
+            latin:keyHintIcon="@drawable/keyboard_hint_2"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="2" />
         <Key
             latin:keyLabel="е"
+            latin:keyHintIcon="@drawable/keyboard_hint_3"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="3" />
         <Key
             latin:keyLabel="р"
+            latin:keyHintIcon="@drawable/keyboard_hint_4"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="4" />
         <Key
             latin:keyLabel="т"
+            latin:keyHintIcon="@drawable/keyboard_hint_5"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="5" />
         <Key
             latin:keyLabel="з"
+            latin:keyHintIcon="@drawable/keyboard_hint_6"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="6" />
         <Key
             latin:keyLabel="у"
+            latin:keyHintIcon="@drawable/keyboard_hint_7"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="7" />
         <Key
             latin:keyLabel="и"
+            latin:keyHintIcon="@drawable/keyboard_hint_8"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="8" />
         <Key
             latin:keyLabel="о"
+            latin:keyHintIcon="@drawable/keyboard_hint_9"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="9" />
         <Key
             latin:keyLabel="п"
+            latin:keyHintIcon="@drawable/keyboard_hint_0"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="0" />
         <Key
diff --git a/java/res/xml-sv/kbd_qwerty.xml b/java/res/xml-sv/kbd_qwerty.xml
index 2c584e2..6425624 100644
--- a/java/res/xml-sv/kbd_qwerty.xml
+++ b/java/res/xml-sv/kbd_qwerty.xml
@@ -36,44 +36,54 @@
     <Row>
         <Key
             latin:keyLabel="q"
+            latin:keyHintIcon="@drawable/keyboard_hint_1"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_q"
             latin:keyWidth="8.75%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="w"
+            latin:keyHintIcon="@drawable/keyboard_hint_2"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_w" />
         <Key
             latin:keyLabel="e"
+            latin:keyHintIcon="@drawable/keyboard_hint_3"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_e" />
         <Key
             latin:keyLabel="r"
+            latin:keyHintIcon="@drawable/keyboard_hint_4"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_r" />
         <Key
             latin:keyLabel="t"
+            latin:keyHintIcon="@drawable/keyboard_hint_5"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_t" />
         <Key
             latin:keyLabel="y"
+            latin:keyHintIcon="@drawable/keyboard_hint_6"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_y" />
         <Key
             latin:keyLabel="u"
+            latin:keyHintIcon="@drawable/keyboard_hint_7"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_u" />
         <Key
             latin:keyLabel="i"
+            latin:keyHintIcon="@drawable/keyboard_hint_8"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_i" />
         <Key
             latin:keyLabel="o"
+            latin:keyHintIcon="@drawable/keyboard_hint_9"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_o" />
         <Key
             latin:keyLabel="p"
+            latin:keyHintIcon="@drawable/keyboard_hint_0"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_p" />
         <Key
diff --git a/java/res/xml-sv/kbd_qwerty_black.xml b/java/res/xml-sv/kbd_qwerty_black.xml
index 90dca89..6337b91 100644
--- a/java/res/xml-sv/kbd_qwerty_black.xml
+++ b/java/res/xml-sv/kbd_qwerty_black.xml
@@ -36,44 +36,54 @@
     <Row>
         <Key
             latin:keyLabel="q"
+            latin:keyHintIcon="@drawable/keyboard_hint_1"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_q"
             latin:keyWidth="8.75%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="w"
+            latin:keyHintIcon="@drawable/keyboard_hint_2"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_w" />
         <Key
             latin:keyLabel="e"
+            latin:keyHintIcon="@drawable/keyboard_hint_3"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_e" />
         <Key
             latin:keyLabel="r"
+            latin:keyHintIcon="@drawable/keyboard_hint_4"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_r" />
         <Key
             latin:keyLabel="t"
+            latin:keyHintIcon="@drawable/keyboard_hint_5"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_t" />
         <Key
             latin:keyLabel="y"
+            latin:keyHintIcon="@drawable/keyboard_hint_6"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_y" />
         <Key
             latin:keyLabel="u"
+            latin:keyHintIcon="@drawable/keyboard_hint_7"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_u" />
         <Key
             latin:keyLabel="i"
+            latin:keyHintIcon="@drawable/keyboard_hint_8"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_i" />
         <Key
             latin:keyLabel="o"
+            latin:keyHintIcon="@drawable/keyboard_hint_9"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_o" />
         <Key
             latin:keyLabel="p"
+            latin:keyHintIcon="@drawable/keyboard_hint_0"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_p" />
         <Key
diff --git a/java/res/xml-xlarge/kbd_qwerty.xml b/java/res/xml-xlarge/kbd_qwerty.xml
index a76eff0..f372eda 100644
--- a/java/res/xml-xlarge/kbd_qwerty.xml
+++ b/java/res/xml-xlarge/kbd_qwerty.xml
@@ -30,49 +30,62 @@
         <Key
             latin:codes="@integer/key_tab"
             latin:keyLabel="Tab"
+            latin:isModifier="true"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="q"
+            latin:keyHintIcon="@drawable/keyboard_hint_1"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_q" />
         <Key
             latin:keyLabel="w"
+            latin:keyHintIcon="@drawable/keyboard_hint_2"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_w" />
         <Key
             latin:keyLabel="e"
+            latin:keyHintIcon="@drawable/keyboard_hint_3"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_e" />
         <Key
             latin:keyLabel="r"
+            latin:keyHintIcon="@drawable/keyboard_hint_4"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_r" />
         <Key
             latin:keyLabel="t"
+            latin:keyHintIcon="@drawable/keyboard_hint_5"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_t" />
         <Key
             latin:keyLabel="y"
+            latin:keyHintIcon="@drawable/keyboard_hint_6"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_y" />
         <Key
             latin:keyLabel="u"
+            latin:keyHintIcon="@drawable/keyboard_hint_7"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_u" />
         <Key
             latin:keyLabel="i"
+            latin:keyHintIcon="@drawable/keyboard_hint_8"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_i" />
         <Key
             latin:keyLabel="o"
+            latin:keyHintIcon="@drawable/keyboard_hint_9"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_o" />
         <Key
             latin:keyLabel="p"
+            latin:keyHintIcon="@drawable/keyboard_hint_0"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_p" />
         <Key
             latin:keyLabel="="
+            latin:temporaryShiftKeyLabel="+"
+            latin:keyHintIcon="@drawable/keyboard_hint_plus"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="+" />
         <Key
@@ -121,10 +134,14 @@
             latin:popupCharacters="@string/alternates_for_l" />
         <Key
             latin:keyLabel=";"
+            latin:temporaryShiftKeyLabel=":"
+            latin:keyHintIcon="@drawable/keyboard_hint_colon"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters=":" />
         <Key
             latin:keyLabel="\'"
+            latin:temporaryShiftKeyLabel="&quot;"
+            latin:keyHintIcon="@drawable/keyboard_hint_quote"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="&quot;" />
         <Key
@@ -168,14 +185,20 @@
             latin:keyLabel="m" />
         <Key
             latin:keyLabel=","
+            latin:temporaryShiftKeyLabel="*"
+            latin:keyHintIcon="@drawable/keyboard_hint_star"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="*" />
         <Key
             latin:keyLabel="."
+            latin:temporaryShiftKeyLabel="!"
+            latin:keyHintIcon="@drawable/keyboard_hint_exclamation"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="!" />
         <Key
             latin:keyLabel="/"
+            latin:temporaryShiftKeyLabel="\?"
+            latin:keyHintIcon="@drawable/keyboard_hint_question"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="\?" />
         <Key
@@ -191,11 +214,15 @@
     <!-- This row is intentionally not marked as a bottom row -->
         <Key
             latin:keyLabel="("
+            latin:temporaryShiftKeyLabel="&lt;"
+            latin:keyHintIcon="@drawable/keyboard_hint_smaller"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="&lt;"
             latin:horizontalGap="16.25%p" />
         <Key
             latin:keyLabel=")"
+            latin:temporaryShiftKeyLabel="&gt;"
+            latin:keyHintIcon="@drawable/keyboard_hint_greater"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="&gt;" />
         <Key
@@ -206,10 +233,14 @@
             latin:isModifier="true" />
         <Key
             latin:keyLabel="_"
+            latin:temporaryShiftKeyLabel="\@"
+            latin:keyHintIcon="@drawable/keyboard_hint_at"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="\@" />
         <Key
             latin:keyLabel="-"
+            latin:temporaryShiftKeyLabel="#"
+            latin:keyHintIcon="@drawable/keyboard_hint_doublecross"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="#" />
     </Row>
diff --git a/java/res/xml-xlarge/kbd_symbols.xml b/java/res/xml-xlarge/kbd_symbols.xml
index 7d23dc5..8391ef7 100644
--- a/java/res/xml-xlarge/kbd_symbols.xml
+++ b/java/res/xml-xlarge/kbd_symbols.xml
@@ -30,6 +30,7 @@
         <Key
             latin:codes="@integer/key_tab"
             latin:keyLabel="Tab"
+            latin:isModifier="true"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="1" />
@@ -102,7 +103,7 @@
     <Row>
         <Key
             latin:codes="@integer/key_shift"
-            latin:keyIcon="@drawable/sym_keyboard_shift"
+            latin:keyLabel="@string/label_more_key"
             latin:iconPreview="@drawable/sym_keyboard_feedback_shift"
             latin:keyWidth="12.5%p"
             latin:isModifier="true"
@@ -130,7 +131,7 @@
             latin:keyLabel="\?" />
         <Key
             latin:codes="@integer/key_shift"
-            latin:keyIcon="@drawable/sym_keyboard_shift"
+            latin:keyLabel="@string/label_more_key"
             latin:iconPreview="@drawable/sym_keyboard_feedback_shift"
             latin:keyWidth="12.5%p"
             latin:isModifier="true"
diff --git a/java/res/xml-xlarge/kbd_symbols_shift.xml b/java/res/xml-xlarge/kbd_symbols_shift.xml
index 6680d96..ee6800e 100644
--- a/java/res/xml-xlarge/kbd_symbols_shift.xml
+++ b/java/res/xml-xlarge/kbd_symbols_shift.xml
@@ -30,6 +30,7 @@
         <Key
             latin:codes="@integer/key_tab"
             latin:keyLabel="Tab"
+            latin:isModifier="true"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="∞" />
@@ -102,7 +103,7 @@
     <Row>
         <Key
             latin:codes="@integer/key_shift"
-            latin:keyIcon="@drawable/sym_keyboard_shift"
+            latin:keyLabel="@string/label_more_key"
             latin:iconPreview="@drawable/sym_keyboard_feedback_shift"
             latin:keyWidth="12.5%p"
             latin:isModifier="true"
@@ -130,7 +131,7 @@
             latin:keyLabel="¿" />
         <Key
             latin:codes="@integer/key_shift"
-            latin:keyIcon="@drawable/sym_keyboard_shift"
+            latin:keyLabel="@string/label_more_key"
             latin:iconPreview="@drawable/sym_keyboard_feedback_shift"
             latin:keyWidth="12.5%p"
             latin:isModifier="true"
diff --git a/java/res/xml/kbd_qwerty.xml b/java/res/xml/kbd_qwerty.xml
index 5e68fd6..ed581a9 100644
--- a/java/res/xml/kbd_qwerty.xml
+++ b/java/res/xml/kbd_qwerty.xml
@@ -28,43 +28,53 @@
     <Row>
         <Key
             latin:keyLabel="q"
+            latin:keyHintIcon="@drawable/keyboard_hint_1"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_q"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="w"
+            latin:keyHintIcon="@drawable/keyboard_hint_2"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_w" />
         <Key
             latin:keyLabel="e"
+            latin:keyHintIcon="@drawable/keyboard_hint_3"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_e" />
         <Key
             latin:keyLabel="r"
+            latin:keyHintIcon="@drawable/keyboard_hint_4"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_r" />
         <Key
             latin:keyLabel="t"
+            latin:keyHintIcon="@drawable/keyboard_hint_5"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_t" />
         <Key
             latin:keyLabel="y"
+            latin:keyHintIcon="@drawable/keyboard_hint_6"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_y" />
         <Key
             latin:keyLabel="u"
+            latin:keyHintIcon="@drawable/keyboard_hint_7"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_u" />
         <Key
             latin:keyLabel="i"
+            latin:keyHintIcon="@drawable/keyboard_hint_8"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_i" />
         <Key
             latin:keyLabel="o"
+            latin:keyHintIcon="@drawable/keyboard_hint_9"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_o" />
         <Key
             latin:keyLabel="p"
+            latin:keyHintIcon="@drawable/keyboard_hint_0"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_p"
             latin:keyEdgeFlags="right" />
diff --git a/java/res/xml/kbd_qwerty_black.xml b/java/res/xml/kbd_qwerty_black.xml
index fff4093..a357318 100644
--- a/java/res/xml/kbd_qwerty_black.xml
+++ b/java/res/xml/kbd_qwerty_black.xml
@@ -28,43 +28,53 @@
     <Row>
         <Key
             latin:keyLabel="q"
+            latin:keyHintIcon="@drawable/keyboard_hint_1"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_q"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="w"
+            latin:keyHintIcon="@drawable/keyboard_hint_2"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_w" />
         <Key
             latin:keyLabel="e"
+            latin:keyHintIcon="@drawable/keyboard_hint_3"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_e" />
         <Key
             latin:keyLabel="r"
+            latin:keyHintIcon="@drawable/keyboard_hint_4"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_r" />
         <Key
             latin:keyLabel="t"
+            latin:keyHintIcon="@drawable/keyboard_hint_5"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_t" />
         <Key
             latin:keyLabel="y"
+            latin:keyHintIcon="@drawable/keyboard_hint_6"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_y" />
         <Key
             latin:keyLabel="u"
+            latin:keyHintIcon="@drawable/keyboard_hint_7"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_u" />
         <Key
             latin:keyLabel="i"
+            latin:keyHintIcon="@drawable/keyboard_hint_8"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_i" />
         <Key
             latin:keyLabel="o"
+            latin:keyHintIcon="@drawable/keyboard_hint_9"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_o" />
         <Key
             latin:keyLabel="p"
+            latin:keyHintIcon="@drawable/keyboard_hint_0"
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="@string/alternates_for_p"
             latin:keyEdgeFlags="right" />
diff --git a/java/src/com/android/inputmethod/latin/BaseKeyboard.java b/java/src/com/android/inputmethod/latin/BaseKeyboard.java
index 6f32f9c..0bf4f4e 100644
--- a/java/src/com/android/inputmethod/latin/BaseKeyboard.java
+++ b/java/src/com/android/inputmethod/latin/BaseKeyboard.java
@@ -194,9 +194,13 @@
 
         /** Label to display */
         public CharSequence label;
+        /** Label to display when keyboard is in temporary shift mode */
+        public CharSequence temporaryShiftLabel;
 
         /** Icon to display instead of a label. Icon takes precedence over a label */
         public Drawable icon;
+        /** Hint icon to display on the key in conjunction with the label */
+        public Drawable hintIcon;
         /** Preview version of the icon, for the preview popup */
         public Drawable iconPreview;
         /** Width of the key, not including the gap */
@@ -294,22 +298,17 @@
             TypedArray a = res.obtainAttributes(Xml.asAttributeSet(parser),
                     R.styleable.BaseKeyboard);
 
-            width = getDimensionOrFraction(a,
-                    R.styleable.BaseKeyboard_keyWidth,
+            width = getDimensionOrFraction(a, R.styleable.BaseKeyboard_keyWidth,
                     keyboard.mDisplayWidth, parent.defaultWidth);
-            height = getDimensionOrFraction(a,
-                    R.styleable.BaseKeyboard_keyHeight,
+            height = getDimensionOrFraction(a, R.styleable.BaseKeyboard_keyHeight,
                     keyboard.mDisplayHeight, parent.defaultHeight);
-            gap = getDimensionOrFraction(a,
-                    R.styleable.BaseKeyboard_horizontalGap,
+            gap = getDimensionOrFraction(a, R.styleable.BaseKeyboard_horizontalGap,
                     keyboard.mDisplayWidth, parent.defaultHorizontalGap);
             a.recycle();
-            a = res.obtainAttributes(Xml.asAttributeSet(parser),
-                    R.styleable.BaseKeyboard_Key);
+            a = res.obtainAttributes(Xml.asAttributeSet(parser), R.styleable.BaseKeyboard_Key);
             this.x += gap;
             TypedValue codesValue = new TypedValue();
-            a.getValue(R.styleable.BaseKeyboard_Key_codes,
-                    codesValue);
+            a.getValue(R.styleable.BaseKeyboard_Key_codes, codesValue);
             if (codesValue.type == TypedValue.TYPE_INT_DEC
                     || codesValue.type == TypedValue.TYPE_INT_HEX) {
                 codes = new int[] { codesValue.data };
@@ -318,29 +317,22 @@
             }
 
             iconPreview = a.getDrawable(R.styleable.BaseKeyboard_Key_iconPreview);
-            if (iconPreview != null) {
-                iconPreview.setBounds(0, 0, iconPreview.getIntrinsicWidth(),
-                        iconPreview.getIntrinsicHeight());
-            }
-            popupCharacters = a.getText(
-                    R.styleable.BaseKeyboard_Key_popupCharacters);
-            popupResId = a.getResourceId(
-                    R.styleable.BaseKeyboard_Key_popupKeyboard, 0);
-            repeatable = a.getBoolean(
-                    R.styleable.BaseKeyboard_Key_isRepeatable, false);
-            modifier = a.getBoolean(
-                    R.styleable.BaseKeyboard_Key_isModifier, false);
-            sticky = a.getBoolean(
-                    R.styleable.BaseKeyboard_Key_isSticky, false);
+            setDefaultBounds(iconPreview);
+            popupCharacters = a.getText(R.styleable.BaseKeyboard_Key_popupCharacters);
+            popupResId = a.getResourceId(R.styleable.BaseKeyboard_Key_popupKeyboard, 0);
+            repeatable = a.getBoolean(R.styleable.BaseKeyboard_Key_isRepeatable, false);
+            modifier = a.getBoolean(R.styleable.BaseKeyboard_Key_isModifier, false);
+            sticky = a.getBoolean(R.styleable.BaseKeyboard_Key_isSticky, false);
             edgeFlags = a.getInt(R.styleable.BaseKeyboard_Key_keyEdgeFlags, 0);
             edgeFlags |= parent.rowEdgeFlags;
 
-            icon = a.getDrawable(
-                    R.styleable.BaseKeyboard_Key_keyIcon);
-            if (icon != null) {
-                icon.setBounds(0, 0, icon.getIntrinsicWidth(), icon.getIntrinsicHeight());
-            }
+            icon = a.getDrawable(R.styleable.BaseKeyboard_Key_keyIcon);
+            setDefaultBounds(icon);
+            hintIcon = a.getDrawable(R.styleable.BaseKeyboard_Key_keyHintIcon);
+            setDefaultBounds(hintIcon);
+
             label = a.getText(R.styleable.BaseKeyboard_Key_keyLabel);
+            temporaryShiftLabel = a.getText(R.styleable.BaseKeyboard_Key_temporaryShiftKeyLabel);
             text = a.getText(R.styleable.BaseKeyboard_Key_keyOutputText);
 
             if (codes == null && !TextUtils.isEmpty(label)) {
@@ -679,10 +671,12 @@
         return new int[0];
     }
 
+    // TODO should be private
     protected Row createRowFromXml(Resources res, XmlResourceParser parser) {
         return new Row(res, this, parser);
     }
 
+    // TODO should be private
     protected Key createKeyFromXml(Resources res, Row parent, int x, int y,
             XmlResourceParser parser) {
         return new Key(res, parent, x, y, parser);
@@ -707,6 +701,7 @@
                     if (TAG_ROW.equals(tag)) {
                         inRow = true;
                         x = 0;
+                        // TODO createRowFromXml should not be called from BaseKeyboard constructor.
                         currentRow = createRowFromXml(res, parser);
                         skipRow = currentRow.mode != 0 && currentRow.mode != mKeyboardMode;
                         if (skipRow) {
@@ -715,6 +710,7 @@
                         }
                    } else if (TAG_KEY.equals(tag)) {
                         inKey = true;
+                        // TODO createKeyFromXml should not be called from BaseKeyboard constructor.
                         key = createKeyFromXml(res, currentRow, x, y, parser);
                         mKeys.add(key);
                         if (key.codes[0] == KEYCODE_SHIFT) {
@@ -793,4 +789,10 @@
         }
         return defValue;
     }
+
+    protected static void setDefaultBounds(Drawable drawable)  {
+        if (drawable != null)
+            drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),
+                    drawable.getIntrinsicHeight());
+    }
 }
diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboard.java b/java/src/com/android/inputmethod/latin/LatinKeyboard.java
index 53ccf36..3fc484d 100644
--- a/java/src/com/android/inputmethod/latin/LatinKeyboard.java
+++ b/java/src/com/android/inputmethod/latin/LatinKeyboard.java
@@ -62,9 +62,6 @@
     private Key mF1Key;
     private Key mSpaceKey;
     private Key m123Key;
-    private final int NUMBER_HINT_COUNT = 10;
-    private Key[] mNumberHintKeys;
-    private Drawable[] mNumberHintIcons = new Drawable[NUMBER_HINT_COUNT];
     private int mSpaceKeyIndex = -1;
     private int mSpaceDragStartX;
     private int mSpaceDragLastDiff;
@@ -119,9 +116,7 @@
         mRes = res;
         mShiftLockIcon = res.getDrawable(R.drawable.sym_keyboard_shift_locked);
         mShiftLockPreviewIcon = res.getDrawable(R.drawable.sym_keyboard_feedback_shift_locked);
-        mShiftLockPreviewIcon.setBounds(0, 0, 
-                mShiftLockPreviewIcon.getIntrinsicWidth(),
-                mShiftLockPreviewIcon.getIntrinsicHeight());
+        setDefaultBounds(mShiftLockPreviewIcon);
         mSpaceIcon = res.getDrawable(R.drawable.sym_keyboard_space);
         mSpaceAutoCompletionIndicator = res.getDrawable(R.drawable.sym_keyboard_space_led);
         mSpacePreviewIcon = res.getDrawable(R.drawable.sym_keyboard_feedback_space);
@@ -138,37 +133,11 @@
         mIsAlphaKeyboard = xmlLayoutResId == R.xml.kbd_qwerty
                 || xmlLayoutResId == R.xml.kbd_qwerty_black;
         mSpaceKeyIndex = indexOf(LatinIME.KEYCODE_SPACE);
-        initializeNumberHintResources(context);
-    }
-
-    private void initializeNumberHintResources(Context context) {
-        final Resources res = context.getResources();
-        mNumberHintIcons[0] = res.getDrawable(R.drawable.keyboard_hint_0);
-        mNumberHintIcons[1] = res.getDrawable(R.drawable.keyboard_hint_1);
-        mNumberHintIcons[2] = res.getDrawable(R.drawable.keyboard_hint_2);
-        mNumberHintIcons[3] = res.getDrawable(R.drawable.keyboard_hint_3);
-        mNumberHintIcons[4] = res.getDrawable(R.drawable.keyboard_hint_4);
-        mNumberHintIcons[5] = res.getDrawable(R.drawable.keyboard_hint_5);
-        mNumberHintIcons[6] = res.getDrawable(R.drawable.keyboard_hint_6);
-        mNumberHintIcons[7] = res.getDrawable(R.drawable.keyboard_hint_7);
-        mNumberHintIcons[8] = res.getDrawable(R.drawable.keyboard_hint_8);
-        mNumberHintIcons[9] = res.getDrawable(R.drawable.keyboard_hint_9);
-    }
-
-    // TODO: delete this method and do initialization in constructor.
-    private void initializeMemberVariablesAsNeeded() {
-        if (mNumberHintKeys == null)
-            mNumberHintKeys = new Key[NUMBER_HINT_COUNT];
     }
 
     @Override
     protected Key createKeyFromXml(Resources res, Row parent, int x, int y, 
             XmlResourceParser parser) {
-        // TODO: This initialization is needed because this protected method is being called from
-        // the base class constructor before this class constructor gets called. We need to fix
-        // this.
-        initializeMemberVariablesAsNeeded();
-
         Key key = new LatinKey(res, parent, x, y, parser);
         switch (key.codes[0]) {
         case LatinIME.KEYCODE_ENTER:
@@ -186,17 +155,6 @@
             break;
         }
 
-        // For number hints on the upper-right corner of key
-        int hintNumber = -1;
-        if (LatinKeyboardBaseView.isNumberAtLeftmostPopupChar(key)) {
-            hintNumber = key.popupCharacters.charAt(0) - '0';
-        } else if (LatinKeyboardBaseView.isNumberAtRightmostPopupChar(key)) {
-            hintNumber = key.popupCharacters.charAt(key.popupCharacters.length() - 1) - '0';
-        }
-        if (hintNumber >= 0 && hintNumber <= 9) {
-            mNumberHintKeys[hintNumber] = key;
-        }
-
         return key;
     }
 
@@ -251,11 +209,7 @@
                     break;
             }
             // Set the initial size of the preview icon
-            if (mEnterKey.iconPreview != null) {
-                mEnterKey.iconPreview.setBounds(0, 0, 
-                        mEnterKey.iconPreview.getIntrinsicWidth(),
-                        mEnterKey.iconPreview.getIntrinsicHeight());
-            }
+            setDefaultBounds(mEnterKey.iconPreview);
         }
     }
 
@@ -279,7 +233,7 @@
     public boolean isShiftLocked() {
         return mShiftState == SHIFT_LOCKED;
     }
-    
+
     @Override
     public boolean setShifted(boolean shiftState) {
         boolean shiftChanged = false;
@@ -314,6 +268,10 @@
         }
     }
 
+    public boolean isTemporaryUpperCase() {
+        return mIsAlphaKeyboard && isShifted() && !isShiftLocked();
+    }
+
     /* package */ boolean isAlphaKeyboard() {
         return mIsAlphaKeyboard;
     }
@@ -335,11 +293,6 @@
         if (mSpaceKey != null) {
             updateSpaceBarForLocale(isAutoCompletion, isBlack);
         }
-        updateNumberHintKeys();
-    }
-
-    private void setDefaultBounds(Drawable drawable) {
-        drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
     }
 
     public void setVoiceMode(boolean hasVoiceButton, boolean hasVoice) {
@@ -385,14 +338,6 @@
         return mSpaceKey;
     }
 
-    private void updateNumberHintKeys() {
-        for (int i = 0; i < mNumberHintKeys.length; ++i) {
-            if (mNumberHintKeys[i] != null) {
-                mNumberHintKeys[i].icon = mNumberHintIcons[i];
-            }
-        }
-    }
-
     public boolean isLanguageSwitchEnabled() {
         return mLocale != null;
     }
@@ -828,8 +773,7 @@
 
         public SlidingLocaleDrawable(Drawable background, int width, int height) {
             mBackground = background;
-            mBackground.setBounds(0, 0,
-                    mBackground.getIntrinsicWidth(), mBackground.getIntrinsicHeight());
+            setDefaultBounds(mBackground);
             mWidth = width;
             mHeight = height;
             mTextPaint = new TextPaint();
@@ -887,7 +831,7 @@
                 canvas.drawText(mNextLanguage, diff - width / 2, baseline, paint);
                 canvas.drawText(mPrevLanguage, diff + width + width / 2, baseline, paint);
 
-                lArrow.setBounds(0, 0, lArrow.getIntrinsicWidth(), lArrow.getIntrinsicHeight());
+                setDefaultBounds(lArrow);
                 rArrow.setBounds(width - rArrow.getIntrinsicWidth(), 0, width,
                         rArrow.getIntrinsicHeight());
                 lArrow.draw(canvas);
diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java
index 264e2f1..05b29b9 100644
--- a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java
+++ b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java
@@ -578,7 +578,7 @@
         mKeys = mKeyDetector.setKeyboard(keyboard, -getPaddingLeft(),
                 -getPaddingTop() + mVerticalCorrection);
         for (PointerTracker tracker : mPointerTrackers) {
-            tracker.setKeyboard(mKeys, mKeyHysteresisDistance);
+            tracker.setKeyboard(keyboard, mKeys, mKeyHysteresisDistance);
         }
         requestLayout();
         // Hint to reallocate the buffer if the size changed
@@ -802,8 +802,19 @@
             canvas.translate(key.x + kbdPaddingLeft, key.y + kbdPaddingTop);
             keyBackground.draw(canvas);
 
-            boolean shouldDrawIcon = true;
+            boolean drawHintIcon = true;
             if (label != null) {
+                // If keyboard is multi-touch capable and in temporary upper case state and key has
+                // tempoarary shift label, label should be hint character and hint icon should not
+                // be drawn.
+                if (mHasDistinctMultitouch
+                        && mKeyboard instanceof LatinKeyboard
+                        && ((LatinKeyboard)mKeyboard).isTemporaryUpperCase()
+                        && key.temporaryShiftLabel != null) {
+                    label = key.temporaryShiftLabel.toString();
+                    drawHintIcon = false;
+                }
+
                 // For characters, use large font. For labels like "Done", use small font.
                 if (label.length() > 1 && key.codes.length < 2) {
                     paint.setTextSize(mLabelTextSize);
@@ -823,25 +834,26 @@
                     paint);
                 // Turn off drop shadow
                 paint.setShadowLayer(0, 0, 0, 0);
-
-                // Usually don't draw icon if label is not null, but we draw icon for the number
-                // hint.
-                shouldDrawIcon = isNumberAtEdgeOfPopupChars(key);
             }
-            if (key.icon != null && shouldDrawIcon) {
-                // Special handing for the upper-right number hint icons
-                final int drawableWidth = isNumberAtEdgeOfPopupChars(key) ?
-                        key.width : key.icon.getIntrinsicWidth();
-                final int drawableHeight = isNumberAtEdgeOfPopupChars(key) ?
-                        key.height : key.icon.getIntrinsicHeight();
+            Drawable icon = null;
+            if (key.label == null && key.icon != null)
+                icon = key.icon;
+            if (icon == null && key.hintIcon != null && drawHintIcon)
+                icon = key.hintIcon;
+            if (icon != null) {
+                // Hack for key hint icon displaying at the top right corner of the key.
+                final int drawableWidth = icon == key.hintIcon
+                        ? key.width : icon.getIntrinsicWidth();
+                final int drawableHeight = icon == key.hintIcon
+                        ? key.height : icon.getIntrinsicHeight();
 
                 final int drawableX = (key.width - padding.left - padding.right
                         - drawableWidth) / 2 + padding.left;
                 final int drawableY = (key.height - padding.top - padding.bottom
                         - drawableHeight) / 2 + padding.top;
                 canvas.translate(drawableX, drawableY);
-                key.icon.setBounds(0, 0, drawableWidth, drawableHeight);
-                key.icon.draw(canvas);
+                icon.setBounds(0, 0, drawableWidth, drawableHeight);
+                icon.draw(canvas);
                 canvas.translate(-drawableX, -drawableY);
             }
             canvas.translate(-key.x - kbdPaddingLeft, -key.y - kbdPaddingTop);
@@ -906,16 +918,18 @@
         }
     }
 
+    // TODO Must fix popup preview on xlarge layout
     private void showKey(final int keyIndex, PointerTracker tracker) {
         Key key = tracker.getKey(keyIndex);
         if (key == null)
             return;
         // Should not draw number hint icons
-        if (key.icon != null && !isNumberAtEdgeOfPopupChars(key)) {
+        if (key.icon != null && key.label == null) {
             mPreviewText.setCompoundDrawables(null, null, null,
                     key.iconPreview != null ? key.iconPreview : key.icon);
             mPreviewText.setText(null);
         } else {
+            // TODO Should take care of temporaryShiftLabel here.
             mPreviewText.setCompoundDrawables(null, null, null, null);
             mPreviewText.setText(adjustCase(tracker.getPreviewText(key)));
             if (key.label.length() > 1 && key.codes.length < 2) {
@@ -997,7 +1011,7 @@
      * Invalidates a key so that it will be redrawn on the next repaint. Use this method if only
      * one key is changing it's content. Any changes that affect the position or size of the key
      * may not be honored.
-     * @param key key in the attached {@link Keyboard}.
+     * @param key key in the attached {@link BaseKeyboard}.
      * @see #invalidateAllKeys
      */
     public void invalidateKey(Key key) {
@@ -1182,11 +1196,7 @@
         return false;
     }
 
-    private static boolean isNumberAtEdgeOfPopupChars(Key key) {
-        return isNumberAtLeftmostPopupChar(key) || isNumberAtRightmostPopupChar(key);
-    }
-
-    /* package */ static boolean isNumberAtLeftmostPopupChar(Key key) {
+    private static boolean isNumberAtLeftmostPopupChar(Key key) {
         if (key.popupCharacters != null && key.popupCharacters.length() > 0
                 && isAsciiDigit(key.popupCharacters.charAt(0))) {
             return true;
@@ -1194,14 +1204,6 @@
         return false;
     }
 
-    /* package */ static boolean isNumberAtRightmostPopupChar(Key key) {
-        if (key.popupCharacters != null && key.popupCharacters.length() > 0
-                && isAsciiDigit(key.popupCharacters.charAt(key.popupCharacters.length() - 1))) {
-            return true;
-        }
-        return false;
-    }
-
     private static boolean isAsciiDigit(char c) {
         return (c < 0x80) && Character.isDigit(c);
     }
@@ -1221,7 +1223,7 @@
             final PointerTracker tracker =
                 new PointerTracker(i, mHandler, mKeyDetector, this, mHasDistinctMultitouch);
             if (keys != null)
-                tracker.setKeyboard(keys, mKeyHysteresisDistance);
+                tracker.setKeyboard(mKeyboard, keys, mKeyHysteresisDistance);
             if (listener != null)
                 tracker.setOnKeyboardActionListener(listener);
             pointers.add(tracker);
diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardView.java
index 912af7e..f3d045b 100644
--- a/java/src/com/android/inputmethod/latin/LatinKeyboardView.java
+++ b/java/src/com/android/inputmethod/latin/LatinKeyboardView.java
@@ -109,9 +109,9 @@
     @Override
     protected CharSequence adjustCase(CharSequence label) {
         BaseKeyboard keyboard = getKeyboard();
-        if (keyboard.isShifted()
-                && keyboard instanceof LatinKeyboard
+        if (keyboard instanceof LatinKeyboard
                 && ((LatinKeyboard) keyboard).isAlphaKeyboard()
+                && keyboard.isShifted()
                 && !TextUtils.isEmpty(label) && label.length() < 3
                 && Character.isLowerCase(label.charAt(0))) {
             label = label.toString().toUpperCase();
diff --git a/java/src/com/android/inputmethod/latin/PointerTracker.java b/java/src/com/android/inputmethod/latin/PointerTracker.java
index cf4f7d5..6517a20 100644
--- a/java/src/com/android/inputmethod/latin/PointerTracker.java
+++ b/java/src/com/android/inputmethod/latin/PointerTracker.java
@@ -52,6 +52,7 @@
     private OnKeyboardActionListener mListener;
     private final boolean mHasDistinctMultitouch;
 
+    private BaseKeyboard mKeyboard;
     private Key[] mKeys;
     private int mKeyHysteresisDistanceSquared = -1;
 
@@ -179,9 +180,10 @@
         mListener = listener;
     }
 
-    public void setKeyboard(Key[] keys, float keyHysteresisDistance) {
-        if (keys == null || keyHysteresisDistance < 0)
+    public void setKeyboard(BaseKeyboard keyboard, Key[] keys, float keyHysteresisDistance) {
+        if (keyboard == null || keys == null || keyHysteresisDistance < 0)
             throw new IllegalArgumentException();
+        mKeyboard = keyboard;
         mKeys = keys;
         mKeyHysteresisDistanceSquared = (int)(keyHysteresisDistance * keyHysteresisDistance);
         // Update current key index because keyboard layout has been changed.
@@ -280,7 +282,7 @@
                 mHandler.startKeyRepeatTimer(REPEAT_START_DELAY, keyIndex, this);
                 mIsRepeatableKey = true;
             }
-            mHandler.startLongPressTimer(LONGPRESS_TIMEOUT, keyIndex, this);
+            startLongPressTimer(keyIndex);
         }
         showKeyPreviewAndUpdateKey(keyIndex);
     }
@@ -292,14 +294,15 @@
             return;
         KeyState keyState = mKeyState;
         int keyIndex = keyState.onMoveKey(x, y);
-        if (isValidKeyIndex(keyIndex)) {
+        Key key = getKey(keyIndex);
+        if (key != null) {
             if (keyState.getKeyIndex() == NOT_A_KEY) {
                 keyState.onMoveToNewKey(keyIndex, x, y);
-                mHandler.startLongPressTimer(LONGPRESS_TIMEOUT, keyIndex, this);
+                startLongPressTimer(keyIndex);
             } else if (!isMinorMoveBounce(x, y, keyIndex)) {
                 resetMultiTap();
                 keyState.onMoveToNewKey(keyIndex, x, y);
-                mHandler.startLongPressTimer(LONGPRESS_TIMEOUT, keyIndex, this);
+                startLongPressTimer(keyIndex);
             }
         } else {
             if (keyState.getKeyIndex() != NOT_A_KEY) {
@@ -415,6 +418,20 @@
         }
     }
 
+    private void startLongPressTimer(int keyIndex) {
+        Key key = getKey(keyIndex);
+        // If keyboard is in temporary upper case state and the key has temporary shift label,
+        // long press should not be started.
+        if (isTemporaryUpperCase() && key.temporaryShiftLabel != null)
+            return;
+        mHandler.startLongPressTimer(LONGPRESS_TIMEOUT, keyIndex, this);
+    }
+
+    private boolean isTemporaryUpperCase() {
+        return mKeyboard instanceof LatinKeyboard
+                && ((LatinKeyboard)mKeyboard).isTemporaryUpperCase();
+    }
+
     private void detectAndSendKey(int index, int x, int y, long eventTime) {
         final OnKeyboardActionListener listener = mListener;
         final Key key = getKey(index);
@@ -442,6 +459,14 @@
                     }
                     code = key.codes[mTapCount];
                 }
+
+                // If keyboard is in temporary upper case state and key has temporary shift label,
+                // alternate character code should be sent.
+                if (isTemporaryUpperCase() && key.temporaryShiftLabel != null) {
+                    code = key.temporaryShiftLabel.charAt(0);
+                    codes[0] = code;
+                }
+
                 /*
                  * Swap the first and second values in the codes array if the primary code is not
                  * the first value but the second value in the array. This happens when key