Merge "move setup wizard package name into google namespace"
diff --git a/java/res/drawable/btn_keyboard_key_stone.xml b/java/res/drawable/btn_keyboard_key_stone.xml
index a6040a0..27932e8 100644
--- a/java/res/drawable/btn_keyboard_key_stone.xml
+++ b/java/res/drawable/btn_keyboard_key_stone.xml
@@ -16,6 +16,13 @@
 
 <selector xmlns:android="http://schemas.android.com/apk/res/android">
 
+    <!-- Functional keys. -->
+
+    <item android:state_single="true" android:state_pressed="true"
+          android:drawable="@drawable/btn_keyboard_key_fulltrans_pressed" />
+    <item android:state_single="true"
+          android:drawable="@drawable/btn_keyboard_key_normal_stone" />
+
     <!-- Toggle keys. Use checkable/checked state. -->
 
     <item android:state_checkable="true" android:state_checked="true"
diff --git a/java/res/values-de-rZZ/donottranslate-altchars.xml b/java/res/values-de-rZZ/donottranslate-altchars.xml
new file mode 100644
index 0000000..a6f8fc8
--- /dev/null
+++ b/java/res/values-de-rZZ/donottranslate-altchars.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2011, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="alternates_for_a">ä,â,à,á,æ,ã,å,ā</string>
+    <string name="alternates_for_e">3,ė</string>
+    <string name="alternates_for_o">9,ö,ô,ò,ó,õ,œ,ø,ō</string>
+    <string name="alternates_for_u">7,ü,û,ù,ú,ū</string>
+    <string name="alternates_for_s">ß,ś,š</string>
+    <string name="alternates_for_n">ñ,ń</string>
+    <string name="alternates_for_y">6</string>
+    <string name="alternates_for_z"></string>
+</resources>
diff --git a/java/res/values/attrs.xml b/java/res/values/attrs.xml
index 73f62c6..d8d31e3 100644
--- a/java/res/values/attrs.xml
+++ b/java/res/values/attrs.xml
@@ -90,13 +90,6 @@
             <enum name="italic" value="2" />
             <enum name="boldItalic" value="3" />
         </attr>
-
-        <attr name="colorScheme" format="enum">
-            <!-- This should be aligned with KeyboardView.COLOR_SCHEME_* -->
-            <enum name="white" value="0" />
-            <enum name="black" value="1" />
-        </attr>
-
     </declare-styleable>
 
     <declare-styleable name="CandidateView">
@@ -141,6 +134,35 @@
         <attr name="popupKeyboardTemplate" format="reference" />
         <!-- Locale of the keyboard layout -->
         <attr name="keyboardLocale" format="string" />
+        <!-- Icon set for key top and key preview. -->
+        <attr name="iconShiftKey" format="reference" />
+        <attr name="iconToSymbolKey" format="reference" />
+        <attr name="iconToSymbolKeyWithShortcut" format="reference" />
+        <attr name="iconDeleteKey" format="reference" />
+        <attr name="iconSettingsKey" format="reference" />
+        <attr name="iconShortcutKey" format="reference" />
+        <attr name="iconSpaceKey" format="reference" />
+        <attr name="iconReturnKey" format="reference" />
+        <attr name="iconSearchKey" format="reference" />
+        <attr name="iconTabKey" format="reference" />
+        <attr name="iconNum1Key" format="reference" />
+        <attr name="iconNum2Key" format="reference" />
+        <attr name="iconNum3Key" format="reference" />
+        <attr name="iconNum4Key" format="reference" />
+        <attr name="iconNum5Key" format="reference" />
+        <attr name="iconNum6Key" format="reference" />
+        <attr name="iconNum7Key" format="reference" />
+        <attr name="iconNum8Key" format="reference" />
+        <attr name="iconNum9Key" format="reference" />
+        <attr name="iconNum0Key" format="reference" />
+        <attr name="iconNumStarKey" format="reference" />
+        <attr name="iconNumPoundKey" format="reference" />
+        <attr name="iconNumAltKey" format="reference" />
+        <attr name="iconShiftedShiftKey" format="reference" />
+        <attr name="iconPreviewSpaceKey" format="reference" />
+        <attr name="iconPreviewTabKey" format="reference" />
+        <attr name="iconPreviewSettingsKey" format="reference" />
+        <attr name="iconPreviewShortcutKey" format="reference" />
     </declare-styleable>
 
     <declare-styleable name="Keyboard_Key">
@@ -163,8 +185,6 @@
         <attr name="isSticky" format="boolean" />
         <!-- Whether long-pressing on this key will make it repeat. -->
         <attr name="isRepeatable" format="boolean" />
-        <!-- The icon to show in the popup preview. -->
-        <attr name="iconPreview" format="reference" />
         <!-- The string of characters to output when this key is pressed. -->
         <attr name="keyOutputText" format="string" />
         <!-- The label to display on the key. -->
@@ -182,11 +202,47 @@
             <flag name="hasUppercaseLetter" value="0x40" />
         </attr>
         <!-- The icon to display on the key instead of the label. -->
-        <attr name="keyIcon" format="reference" />
+        <attr name="keyIcon" format="enum">
+            <!-- This should be aligned with KeyboardIcons.ICON_* -->
+            <enum name="iconShiftKey" value="1" />
+            <enum name="iconToSymbolKey" value="2" />
+            <enum name="iconToSymbolKeyWithShortcut" value="3" />
+            <enum name="iconDeleteKey" value="4" />
+            <enum name="iconSettingsKey" value="5" />
+            <enum name="iconShortcutKey" value="6" />
+            <enum name="iconSpaceKey" value="7" />
+            <enum name="iconReturnKey" value="8" />
+            <enum name="iconSearchKey" value="9" />
+            <enum name="iconTabKey" value="10" />
+            <enum name="iconNum1Key" value="11" />
+            <enum name="iconNum2Key" value="12" />
+            <enum name="iconNum3Key" value="13" />
+            <enum name="iconNum4Key" value="14" />
+            <enum name="iconNum5Key" value="15" />
+            <enum name="iconNum6Key" value="16" />
+            <enum name="iconNum7Key" value="17" />
+            <enum name="iconNum8Key" value="18" />
+            <enum name="iconNum9Key" value="19" />
+            <enum name="iconNum0Key" value="20" />
+            <enum name="iconNumStarKey" value="21" />
+            <enum name="iconNumPoundKey" value="22" />
+            <enum name="iconNumAltKey" value="23" />
+        </attr>
+        <!-- Shift key icon for shifted state -->
+        <attr name="keyIconShifted" format="enum">
+            <!-- This should be aligned with KeyboardIcons.ICON_SHIFTED_* -->
+            <enum name="iconShiftedShiftKey" value="24" />
+        </attr>
+        <!-- The icon to show in the popup preview. -->
+        <attr name="keyIconPreview" format="enum">
+            <!-- This should be aligned with KeyboardIcons.ICON_PREVIEW_* -->
+            <enum name="iconPreviewSpaceKey" value="25" />
+            <enum name="iconPreviewTabKey" value="26" />
+            <enum name="iconPreviewSettingsKey" value="27" />
+            <enum name="iconPreviewShortcutKey" value="28" />
+        </attr>
         <!-- The key style to specify a set of key attributes defined by <key_style/> -->
         <attr name="keyStyle" format="string" />
-        <!-- Shift key icon for shifted state -->
-        <attr name="shiftedIcon" format="reference" />
         <!-- The key is enabled and responds on press. -->
         <attr name="enabled" format="boolean" />
         <!-- Visual insets -->
diff --git a/java/res/values/donottranslate.xml b/java/res/values/donottranslate.xml
index 1cdae3d..2dbfe92 100644
--- a/java/res/values/donottranslate.xml
+++ b/java/res/values/donottranslate.xml
@@ -150,9 +150,11 @@
     <string-array name="subtype_locale_exception_keys">
         <item>en_US</item>
         <item>en_GB</item>
+        <item>de_ZZ</item>
     </string-array>
     <string-array name="subtype_locale_exception_values">
         <item>English (US)</item>
         <item>English (UK)</item>
+        <item>Deutsch (QWERTY)</item>
     </string-array>
 </resources>
diff --git a/java/res/values/keyboard-icons-black.xml b/java/res/values/keyboard-icons-black.xml
new file mode 100644
index 0000000..f11a9c4
--- /dev/null
+++ b/java/res/values/keyboard-icons-black.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<resources>
+    <style name="KeyboardIcons.Black" parent="android:Theme.Light">
+        <item name="iconShiftKey">@drawable/sym_bkeyboard_shift</item>
+        <item name="iconToSymbolKeyWithShortcut">@drawable/sym_bkeyboard_123_mic</item>
+        <item name="iconDeleteKey">@drawable/sym_bkeyboard_delete</item>
+        <item name="iconSettingsKey">@drawable/sym_bkeyboard_settings</item>
+        <item name="iconShortcutKey">@drawable/sym_bkeyboard_mic</item>
+        <item name="iconSpaceKey">@drawable/sym_bkeyboard_space</item>
+        <item name="iconReturnKey">@drawable/sym_bkeyboard_return</item>
+        <item name="iconSearchKey">@drawable/sym_bkeyboard_search</item>
+        <item name="iconTabKey">@drawable/sym_bkeyboard_tab</item>
+        <item name="iconNum1Key">@drawable/sym_bkeyboard_num1</item>
+        <item name="iconNum2Key">@drawable/sym_bkeyboard_num2</item>
+        <item name="iconNum3Key">@drawable/sym_bkeyboard_num3</item>
+        <item name="iconNum4Key">@drawable/sym_bkeyboard_num4</item>
+        <item name="iconNum5Key">@drawable/sym_bkeyboard_num5</item>
+        <item name="iconNum6Key">@drawable/sym_bkeyboard_num6</item>
+        <item name="iconNum7Key">@drawable/sym_bkeyboard_num7</item>
+        <item name="iconNum8Key">@drawable/sym_bkeyboard_num8</item>
+        <item name="iconNum9Key">@drawable/sym_bkeyboard_num9</item>
+        <item name="iconNum0Key">@drawable/sym_bkeyboard_num0</item>
+        <item name="iconNumStarKey">@drawable/sym_bkeyboard_numstar</item>
+        <item name="iconNumPoundKey">@drawable/sym_bkeyboard_numpound</item>
+        <item name="iconNumAltKey">@drawable/sym_bkeyboard_numalt</item>
+        <item name="iconShiftedShiftKey">@drawable/sym_bkeyboard_shift_locked</item>
+        <item name="iconPreviewSpaceKey">@drawable/sym_keyboard_feedback_space</item>
+        <item name="iconPreviewTabKey">@drawable/sym_keyboard_feedback_tab</item>
+        <item name="iconPreviewSettingsKey">@drawable/sym_keyboard_feedback_settings</item>
+        <item name="iconPreviewShortcutKey">@drawable/sym_keyboard_feedback_mic</item>
+    </style>
+</resources>
diff --git a/java/res/values/keyboard-icons-holo.xml b/java/res/values/keyboard-icons-holo.xml
new file mode 100644
index 0000000..5f396ca
--- /dev/null
+++ b/java/res/values/keyboard-icons-holo.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<resources>
+    <style name="KeyboardIcons.Holo" parent="android:Theme.Holo">
+        <item name="iconShiftKey">@drawable/sym_keyboard_shift_holo</item>
+<!--         <item name="iconToSymbolKeyWithShortcut">@drawable/sym_keyboard_123_mic_holo</item> -->
+        <item name="iconDeleteKey">@drawable/sym_keyboard_delete_holo</item>
+        <item name="iconSettingsKey">@drawable/sym_keyboard_settings_holo</item>
+        <item name="iconShortcutKey">@drawable/sym_keyboard_voice_holo</item>
+        <item name="iconSpaceKey">@drawable/sym_keyboard_space_holo</item>
+        <item name="iconReturnKey">@drawable/sym_keyboard_return_holo</item>
+<!--         <item name="iconSearchKey">@drawable/sym_keyboard_search_holo</item> -->
+        <item name="iconTabKey">@drawable/sym_keyboard_tab_holo</item>
+        <item name="iconNum1Key">@drawable/sym_keyboard_num1_holo</item>
+        <item name="iconNum2Key">@drawable/sym_keyboard_num2_holo</item>
+        <item name="iconNum3Key">@drawable/sym_keyboard_num3_holo</item>
+        <item name="iconNum4Key">@drawable/sym_keyboard_num4_holo</item>
+        <item name="iconNum5Key">@drawable/sym_keyboard_num5_holo</item>
+        <item name="iconNum6Key">@drawable/sym_keyboard_num6_holo</item>
+        <item name="iconNum7Key">@drawable/sym_keyboard_num7_holo</item>
+        <item name="iconNum8Key">@drawable/sym_keyboard_num8_holo</item>
+        <item name="iconNum9Key">@drawable/sym_keyboard_num9_holo</item>
+        <item name="iconNum0Key">@drawable/sym_keyboard_num0_holo</item>
+        <item name="iconNumStarKey">@drawable/sym_keyboard_numbstar_holo</item>
+        <item name="iconNumPoundKey">@drawable/sym_keyboard_numbpound_holo</item>
+<!--         <item name="iconNumAltKey">@drawable/sym_keyboard_numalt_holo</item> -->
+        <item name="iconShiftedShiftKey">@drawable/sym_keyboard_shift_locked_holo</item>
+        <item name="iconPreviewSpaceKey">@drawable/sym_keyboard_space_holo</item>
+        <item name="iconPreviewTabKey">@drawable/sym_keyboard_tab_holo</item>
+        <item name="iconPreviewSettingsKey">@drawable/sym_keyboard_settings_holo</item>
+<!--         <item name="iconPreviewShortcutKey">@drawable/sym_keyboard_feedback_voice_holo</item> -->
+    </style>
+</resources>
diff --git a/java/res/values/keyboard-icons-white.xml b/java/res/values/keyboard-icons-white.xml
new file mode 100644
index 0000000..f25f7d4
--- /dev/null
+++ b/java/res/values/keyboard-icons-white.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<resources>
+    <style name="KeyboardIcons" parent="android:Theme">
+        <item name="iconShiftKey">@drawable/sym_keyboard_shift</item>
+        <item name="iconToSymbolKeyWithShortcut">@drawable/sym_keyboard_123_mic</item>
+        <item name="iconDeleteKey">@drawable/sym_keyboard_delete</item>
+        <item name="iconSettingsKey">@drawable/sym_keyboard_settings</item>
+        <item name="iconShortcutKey">@drawable/sym_keyboard_mic</item>
+        <item name="iconSpaceKey">@drawable/sym_keyboard_space</item>
+        <item name="iconReturnKey">@drawable/sym_keyboard_return</item>
+        <item name="iconSearchKey">@drawable/sym_keyboard_search</item>
+        <item name="iconTabKey">@drawable/sym_keyboard_tab</item>
+        <item name="iconNum1Key">@drawable/sym_keyboard_num1</item>
+        <item name="iconNum2Key">@drawable/sym_keyboard_num2</item>
+        <item name="iconNum3Key">@drawable/sym_keyboard_num3</item>
+        <item name="iconNum4Key">@drawable/sym_keyboard_num4</item>
+        <item name="iconNum5Key">@drawable/sym_keyboard_num5</item>
+        <item name="iconNum6Key">@drawable/sym_keyboard_num6</item>
+        <item name="iconNum7Key">@drawable/sym_keyboard_num7</item>
+        <item name="iconNum8Key">@drawable/sym_keyboard_num8</item>
+        <item name="iconNum9Key">@drawable/sym_keyboard_num9</item>
+        <item name="iconNum0Key">@drawable/sym_keyboard_num0</item>
+        <item name="iconNumStarKey">@drawable/sym_keyboard_numstar</item>
+        <item name="iconNumPoundKey">@drawable/sym_keyboard_numpound</item>
+        <item name="iconNumAltKey">@drawable/sym_keyboard_numalt</item>
+        <item name="iconShiftedShiftKey">@drawable/sym_keyboard_shift_locked</item>
+        <item name="iconPreviewSpaceKey">@drawable/sym_keyboard_feedback_space</item>
+        <item name="iconPreviewTabKey">@drawable/sym_keyboard_feedback_tab</item>
+        <item name="iconPreviewSettingsKey">@drawable/sym_keyboard_feedback_settings</item>
+        <item name="iconPreviewShortcutKey">@drawable/sym_keyboard_feedback_mic</item>
+    </style>
+</resources>
diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml
index 465d0fd..d3f1923 100644
--- a/java/res/values/strings.xml
+++ b/java/res/values/strings.xml
@@ -252,6 +252,8 @@
     <string name="subtype_mode_da_keyboard">Danish Keyboard</string>
     <!-- Description for German keyboard subtype [CHAR LIMIT=35] -->
     <string name="subtype_mode_de_keyboard">German Keyboard</string>
+    <!-- Description for German QWERTY keyboard subtype [CHAR LIMIT=35] -->
+    <string name="subtype_mode_de_qwerty_keyboard">German QWERTY Keyboard</string>
     <!-- Description for English (United Kingdom) keyboard subtype [CHAR LIMIT=35] -->
     <string name="subtype_mode_en_GB_keyboard">English (UK) Keyboard</string>
     <!-- Description for English (United States) keyboard subtype [CHAR LIMIT=35] -->
diff --git a/java/res/values/styles.xml b/java/res/values/styles.xml
index 3780fe3..1363f64 100644
--- a/java/res/values/styles.xml
+++ b/java/res/values/styles.xml
@@ -59,7 +59,6 @@
         <item name="shadowColor">#BB000000</item>
         <item name="shadowRadius">2.75</item>
         <item name="backgroundDimAmount">0.5</item>
-        <item name="colorScheme">white</item>
     </style>
     <style name="KeyPreviewStyle">
         <item name="android:background">@drawable/keyboard_key_feedback</item>
@@ -107,7 +106,6 @@
         <item name="keyTextColor">@color/latinkeyboard_key_color_black</item>
         <item name="keyTextInactivatedColor">#FF808080</item>
         <item name="shadowColor">@color/latinkeyboard_key_color_white</item>
-        <item name="colorScheme">black</item>
     </style>
     <style name="PopupMiniKeyboardView.Stone" parent="PopupMiniKeyboardView">
         <item name="keyBackground">@drawable/btn_keyboard_key_stone</item>
diff --git a/java/res/values/themes-basic-highcontrast.xml b/java/res/values/themes-basic-highcontrast.xml
new file mode 100644
index 0000000..8122e4e
--- /dev/null
+++ b/java/res/values/themes-basic-highcontrast.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<resources>
+    <style name="KeyboardTheme.HighContrast" parent="KeyboardIcons">
+        <item name="keyboardStyle">@style/Keyboard</item>
+        <item name="latinKeyboardStyle">@style/LatinKeyboard</item>
+        <item name="keyboardViewStyle">@style/KeyboardView.HighContrast</item>
+        <item name="keyPreviewStyle">@style/KeyPreviewStyle</item>
+        <item name="popupMiniKeyboardViewStyle">@style/PopupMiniKeyboardView</item>
+        <item name="popupMiniKeyboardPanelStyle">@style/PopupMiniKeyboardPanelStyle</item>
+        <item name="suggestionsStripBackgroundStyle">@style/SuggestionsStripBackgroundStyle</item>
+        <item name="suggestionBackgroundStyle">@style/SuggestionBackgroundStyle</item>
+        <item name="suggestionPreviewBackgroundStyle">@style/SuggestionPreviewBackgroundStyle</item>
+        <item name="candidateViewStyle">@style/CandidateViewStyle</item>
+    </style>
+</resources>
diff --git a/java/res/values/themes-basic.xml b/java/res/values/themes-basic.xml
new file mode 100644
index 0000000..50b52de
--- /dev/null
+++ b/java/res/values/themes-basic.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<resources>
+    <style name="KeyboardTheme" parent="KeyboardIcons">
+        <item name="keyboardStyle">@style/Keyboard</item>
+        <item name="latinKeyboardStyle">@style/LatinKeyboard</item>
+        <item name="keyboardViewStyle">@style/KeyboardView</item>
+        <item name="keyPreviewStyle">@style/KeyPreviewStyle</item>
+        <item name="popupMiniKeyboardViewStyle">@style/PopupMiniKeyboardView</item>
+        <item name="popupMiniKeyboardPanelStyle">@style/PopupMiniKeyboardPanelStyle</item>
+        <item name="suggestionsStripBackgroundStyle">@style/SuggestionsStripBackgroundStyle</item>
+        <item name="suggestionBackgroundStyle">@style/SuggestionBackgroundStyle</item>
+        <item name="suggestionPreviewBackgroundStyle">@style/SuggestionPreviewBackgroundStyle</item>
+        <item name="candidateViewStyle">@style/CandidateViewStyle</item>
+    </style>
+</resources>
diff --git a/java/res/values/themes-gingerbread.xml b/java/res/values/themes-gingerbread.xml
new file mode 100644
index 0000000..cdb10c8
--- /dev/null
+++ b/java/res/values/themes-gingerbread.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<resources>
+    <style name="KeyboardTheme.Gingerbread" parent="KeyboardIcons">
+        <item name="keyboardStyle">@style/Keyboard</item>
+        <item name="latinKeyboardStyle">@style/LatinKeyboard</item>
+        <item name="keyboardViewStyle">@style/KeyboardView.Gingerbread</item>
+        <item name="keyPreviewStyle">@style/KeyPreviewStyle</item>
+        <item name="popupMiniKeyboardViewStyle">@style/PopupMiniKeyboardView.Gingerbread</item>
+        <item name="popupMiniKeyboardPanelStyle">@style/PopupMiniKeyboardPanelStyle</item>
+        <item name="suggestionsStripBackgroundStyle">@style/SuggestionsStripBackgroundStyle</item>
+        <item name="suggestionBackgroundStyle">@style/SuggestionBackgroundStyle</item>
+        <item name="suggestionPreviewBackgroundStyle">@style/SuggestionPreviewBackgroundStyle</item>
+        <item name="candidateViewStyle">@style/CandidateViewStyle</item>
+    </style>
+</resources>
diff --git a/java/res/values/themes-honeycomb.xml b/java/res/values/themes-honeycomb.xml
new file mode 100644
index 0000000..07f5b83
--- /dev/null
+++ b/java/res/values/themes-honeycomb.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<resources>
+    <style name="KeyboardTheme.Honeycomb" parent="KeyboardIcons.Holo">
+        <item name="keyboardStyle">@style/Keyboard.Honeycomb</item>
+        <item name="latinKeyboardStyle">@style/LatinKeyboard.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.Honeycomb</item>
+        <item name="suggestionBackgroundStyle">@style/SuggestionBackgroundStyle.Honeycomb</item>
+        <item name="suggestionPreviewBackgroundStyle">@style/SuggestionPreviewBackgroundStyle.Honeycomb</item>
+        <item name="candidateViewStyle">@style/CandidateViewStyle.Honeycomb</item>
+    </style>
+</resources>
diff --git a/java/res/values/themes-stone-bold.xml b/java/res/values/themes-stone-bold.xml
new file mode 100644
index 0000000..4955f22
--- /dev/null
+++ b/java/res/values/themes-stone-bold.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<resources>
+    <style name="KeyboardTheme.Stone.Bold" parent="KeyboardIcons.Black">
+        <item name="keyboardStyle">@style/Keyboard</item>
+        <item name="latinKeyboardStyle">@style/LatinKeyboard.Stone</item>
+        <item name="keyboardViewStyle">@style/KeyboardView.Stone.Bold</item>
+        <item name="keyPreviewStyle">@style/KeyPreviewStyle</item>
+        <item name="popupMiniKeyboardViewStyle">@style/PopupMiniKeyboardView.Stone</item>
+        <item name="popupMiniKeyboardPanelStyle">@style/PopupMiniKeyboardPanelStyle</item>
+        <item name="suggestionsStripBackgroundStyle">@style/SuggestionsStripBackgroundStyle</item>
+        <item name="suggestionBackgroundStyle">@style/SuggestionBackgroundStyle</item>
+        <item name="suggestionPreviewBackgroundStyle">@style/SuggestionPreviewBackgroundStyle</item>
+        <item name="candidateViewStyle">@style/CandidateViewStyle</item>
+    </style>
+</resources>
diff --git a/java/res/values/themes-stone.xml b/java/res/values/themes-stone.xml
new file mode 100644
index 0000000..39a011b
--- /dev/null
+++ b/java/res/values/themes-stone.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<resources>
+    <style name="KeyboardTheme.Stone" parent="KeyboardIcons.Black">
+        <item name="keyboardStyle">@style/Keyboard</item>
+        <item name="latinKeyboardStyle">@style/LatinKeyboard.Stone</item>
+        <item name="keyboardViewStyle">@style/KeyboardView.Stone</item>
+        <item name="keyPreviewStyle">@style/KeyPreviewStyle</item>
+        <item name="popupMiniKeyboardViewStyle">@style/PopupMiniKeyboardView.Stone</item>
+        <item name="popupMiniKeyboardPanelStyle">@style/PopupMiniKeyboardPanelStyle</item>
+        <item name="suggestionsStripBackgroundStyle">@style/SuggestionsStripBackgroundStyle</item>
+        <item name="suggestionBackgroundStyle">@style/SuggestionBackgroundStyle</item>
+        <item name="suggestionPreviewBackgroundStyle">@style/SuggestionPreviewBackgroundStyle</item>
+        <item name="candidateViewStyle">@style/CandidateViewStyle</item>
+    </style>
+</resources>
diff --git a/java/res/values/themes.xml b/java/res/values/themes.xml
deleted file mode 100644
index 728ce5a..0000000
--- a/java/res/values/themes.xml
+++ /dev/null
@@ -1,85 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<resources>
-    <style name="KeyboardTheme" parent="android:Theme">
-        <item name="keyboardStyle">@style/Keyboard</item>
-        <item name="latinKeyboardStyle">@style/LatinKeyboard</item>
-        <item name="keyboardViewStyle">@style/KeyboardView</item>
-        <item name="keyPreviewStyle">@style/KeyPreviewStyle</item>
-        <item name="popupMiniKeyboardViewStyle">@style/PopupMiniKeyboardView</item>
-        <item name="popupMiniKeyboardPanelStyle">@style/PopupMiniKeyboardPanelStyle</item>
-        <item name="suggestionsStripBackgroundStyle">@style/SuggestionsStripBackgroundStyle</item>
-        <item name="suggestionBackgroundStyle">@style/SuggestionBackgroundStyle</item>
-        <item name="suggestionPreviewBackgroundStyle">@style/SuggestionPreviewBackgroundStyle</item>
-        <item name="candidateViewStyle">@style/CandidateViewStyle</item>
-    </style>
-    <style name="KeyboardTheme.HighContrast" parent="android:Theme">
-        <item name="keyboardStyle">@style/Keyboard</item>
-        <item name="latinKeyboardStyle">@style/LatinKeyboard</item>
-        <item name="keyboardViewStyle">@style/KeyboardView.HighContrast</item>
-        <item name="keyPreviewStyle">@style/KeyPreviewStyle</item>
-        <item name="popupMiniKeyboardViewStyle">@style/PopupMiniKeyboardView</item>
-        <item name="popupMiniKeyboardPanelStyle">@style/PopupMiniKeyboardPanelStyle</item>
-        <item name="suggestionsStripBackgroundStyle">@style/SuggestionsStripBackgroundStyle</item>
-        <item name="suggestionBackgroundStyle">@style/SuggestionBackgroundStyle</item>
-        <item name="candidateViewStyle">@style/CandidateViewStyle</item>
-    </style>
-    <style name="KeyboardTheme.Stone" parent="android:Theme.Light">
-        <item name="keyboardStyle">@style/Keyboard</item>
-        <item name="latinKeyboardStyle">@style/LatinKeyboard.Stone</item>
-        <item name="keyboardViewStyle">@style/KeyboardView.Stone</item>
-        <item name="keyPreviewStyle">@style/KeyPreviewStyle</item>
-        <item name="popupMiniKeyboardViewStyle">@style/PopupMiniKeyboardView.Stone</item>
-        <item name="popupMiniKeyboardPanelStyle">@style/PopupMiniKeyboardPanelStyle</item>
-        <item name="suggestionsStripBackgroundStyle">@style/SuggestionsStripBackgroundStyle</item>
-        <item name="suggestionBackgroundStyle">@style/SuggestionBackgroundStyle</item>
-        <item name="candidateViewStyle">@style/CandidateViewStyle</item>
-    </style>
-    <style name="KeyboardTheme.Stone.Bold" parent="android:Theme.Light">
-        <item name="keyboardStyle">@style/Keyboard</item>
-        <item name="latinKeyboardStyle">@style/LatinKeyboard.Stone</item>
-        <item name="keyboardViewStyle">@style/KeyboardView.Stone.Bold</item>
-        <item name="keyPreviewStyle">@style/KeyPreviewStyle</item>
-        <item name="popupMiniKeyboardViewStyle">@style/PopupMiniKeyboardView.Stone</item>
-        <item name="popupMiniKeyboardPanelStyle">@style/PopupMiniKeyboardPanelStyle</item>
-        <item name="suggestionsStripBackgroundStyle">@style/SuggestionsStripBackgroundStyle</item>
-        <item name="suggestionBackgroundStyle">@style/SuggestionBackgroundStyle</item>
-        <item name="candidateViewStyle">@style/CandidateViewStyle</item>
-    </style>
-    <style name="KeyboardTheme.Gingerbread" parent="android:Theme.Black">
-        <item name="keyboardStyle">@style/Keyboard</item>
-        <item name="latinKeyboardStyle">@style/LatinKeyboard</item>
-        <item name="keyboardViewStyle">@style/KeyboardView.Gingerbread</item>
-        <item name="keyPreviewStyle">@style/KeyPreviewStyle</item>
-        <item name="popupMiniKeyboardViewStyle">@style/PopupMiniKeyboardView.Gingerbread</item>
-        <item name="popupMiniKeyboardPanelStyle">@style/PopupMiniKeyboardPanelStyle</item>
-        <item name="suggestionsStripBackgroundStyle">@style/SuggestionsStripBackgroundStyle</item>
-        <item name="suggestionBackgroundStyle">@style/SuggestionBackgroundStyle</item>
-        <item name="candidateViewStyle">@style/CandidateViewStyle</item>
-    </style>
-    <style name="KeyboardTheme.Honeycomb" parent="android:Theme.Holo">
-        <item name="keyboardStyle">@style/Keyboard.Honeycomb</item>
-        <item name="latinKeyboardStyle">@style/LatinKeyboard.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.Honeycomb</item>
-        <item name="suggestionBackgroundStyle">@style/SuggestionBackgroundStyle.Honeycomb</item>
-        <item name="candidateViewStyle">@style/CandidateViewStyle.Honeycomb</item>
-    </style>
-</resources>
diff --git a/java/res/xml-de-rZZ/kbd_qwerty.xml b/java/res/xml-de-rZZ/kbd_qwerty.xml
new file mode 100644
index 0000000..d5fd8ef
--- /dev/null
+++ b/java/res/xml-de-rZZ/kbd_qwerty.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2011, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<Keyboard
+    xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+    latin:keyboardLocale="de"
+>
+    <include
+        latin:keyboardLayout="@xml/kbd_rows_qwerty" />
+</Keyboard>
diff --git a/java/res/xml-sw600dp/kbd_key_styles.xml b/java/res/xml-sw600dp/kbd_key_styles.xml
index a388879..dbff293 100644
--- a/java/res/xml-sw600dp/kbd_key_styles.xml
+++ b/java/res/xml-sw600dp/kbd_key_styles.xml
@@ -22,153 +22,70 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
 >
     <!-- Base key style for the functional key -->
-    <switch>
-        <case
-            latin:colorScheme="white"
-        >
-            <key-style
-                latin:styleName="functionalKeyStyle"
-                latin:isFunctional="true" />
-        </case>
-        <case
-            latin:colorScheme="black"
-        >
-            <key-style
-                latin:styleName="functionalKeyStyle" />
-        </case>
-    </switch>
+    <key-style
+        latin:styleName="functionalKeyStyle"
+        latin:isFunctional="true" />
     <!-- Functional key styles -->
+    <key-style
+        latin:styleName="shiftKeyStyle"
+        latin:code="@integer/key_shift"
+        latin:keyIcon="iconShiftKey"
+        latin:keyIconShifted="iconShiftedShiftKey"
+        latin:parentStyle="functionalKeyStyle"
+        latin:isSticky="true" />
+    <key-style
+        latin:styleName="deleteKeyStyle"
+        latin:code="@integer/key_delete"
+        latin:keyIcon="iconDeleteKey"
+        latin:parentStyle="functionalKeyStyle"
+        latin:isRepeatable="true" />
+    <key-style
+        latin:styleName="returnKeyStyle"
+        latin:code="@integer/key_return"
+        latin:keyIcon="iconReturnKey"
+        latin:parentStyle="functionalKeyStyle" />
+    <key-style
+        latin:styleName="spaceKeyStyle"
+        latin:code="@integer/key_space"
+        latin:keyIconPreview="iconPreviewSpaceKey" />
+    <key-style
+        latin:styleName="nonSpecialBackgroundSpaceKeyStyle"
+        latin:code="@integer/key_space"
+        latin:keyIconPreview="iconPreviewSpaceKey" />
+    <key-style
+        latin:styleName="smileyKeyStyle"
+        latin:keyLabel=":-)"
+        latin:keyOutputText=":-) "
+        latin:keyLabelOption="popupHint"
+        latin:popupCharacters="@string/alternates_for_smiley"
+        latin:maxPopupKeyboardColumn="5" />
     <switch>
         <case
-            latin:colorScheme="white"
+            latin:voiceKeyEnabled="true"
         >
             <key-style
-                latin:styleName="shiftKeyStyle"
-                latin:code="@integer/key_shift"
-                latin:keyIcon="@drawable/sym_keyboard_shift_holo"
-                latin:shiftedIcon="@drawable/sym_keyboard_shift_locked_holo"
-                latin:iconPreview="@drawable/sym_keyboard_feedback_shift"
-                latin:parentStyle="functionalKeyStyle"
-                latin:isSticky="true" />
-            <key-style
-                latin:styleName="deleteKeyStyle"
-                latin:code="@integer/key_delete"
-                latin:keyIcon="@drawable/sym_keyboard_delete_holo"
-                latin:iconPreview="@drawable/sym_keyboard_feedback_delete"
-                latin:parentStyle="functionalKeyStyle"
-                latin:isRepeatable="true" />
-            <key-style
-                latin:styleName="returnKeyStyle"
-                latin:code="@integer/key_return"
-                latin:keyIcon="@drawable/sym_keyboard_return_holo"
-                latin:iconPreview="@drawable/sym_keyboard_feedback_return"
-                latin:parentStyle="functionalKeyStyle" />
-            <key-style
-                latin:styleName="spaceKeyStyle"
-                latin:code="@integer/key_space"
-                latin:iconPreview="@drawable/sym_keyboard_feedback_space" />
-            <key-style
-                latin:styleName="nonSpecialBackgroundSpaceKeyStyle"
-                latin:code="@integer/key_space"
-                latin:iconPreview="@drawable/sym_keyboard_feedback_space" />
-            <key-style
-                latin:styleName="smileyKeyStyle"
-                latin:keyLabel=":-)"
-                latin:keyOutputText=":-) "
+                latin:styleName="shortcutOrSettingsKeyStyle"
+                latin:code="@integer/key_shortcut"
+                latin:keyIcon="iconShortcutKey"
+                latin:keyIconPreview="iconPreviewShortcutKey"
                 latin:keyLabelOption="popupHint"
-                latin:popupCharacters="@string/alternates_for_smiley"
-                latin:maxPopupKeyboardColumn="5" />
-            <switch>
-                <case
-                    latin:voiceKeyEnabled="true"
-                >
-                    <key-style
-                        latin:styleName="micOrSettingsKeyStyle"
-                        latin:code="@integer/key_shortcut"
-                        latin:keyIcon="@drawable/sym_keyboard_voice_holo"
-                        latin:iconPreview="@drawable/sym_keyboard_feedback_mic"
-                        latin:keyLabelOption="popupHint"
-                        latin:popupCharacters="\@drawable/sym_keyboard_settings|\@integer/key_settings"
-                        latin:parentStyle="functionalKeyStyle" />
-                </case>
-                <default>
-                    <key-style
-                        latin:styleName="micOrSettingsKeyStyle"
-                        latin:code="@integer/key_settings"
-                        latin:keyIcon="@drawable/sym_keyboard_settings_holo"
-                        latin:iconPreview="@drawable/sym_keyboard_feedback_settings"
-                        latin:parentStyle="functionalKeyStyle" />
-                </default>
-            </switch>
-        </case>
-        <case
-            latin:colorScheme="black"
-        >
-            <key-style
-                latin:styleName="shiftKeyStyle"
-                latin:code="@integer/key_shift"
-                latin:keyIcon="@drawable/sym_bkeyboard_shift"
-                latin:shiftedIcon="@drawable/sym_bkeyboard_shift_locked"
-                latin:iconPreview="@drawable/sym_keyboard_feedback_shift"
-                latin:parentStyle="functionalKeyStyle"
-                latin:isSticky="true" />
-            <key-style
-                latin:styleName="deleteKeyStyle"
-                latin:code="@integer/key_delete"
-                latin:keyIcon="@drawable/sym_bkeyboard_delete"
-                latin:iconPreview="@drawable/sym_keyboard_feedback_delete"
-                latin:parentStyle="functionalKeyStyle"
-                latin:isRepeatable="true" />
-            <key-style
-                latin:styleName="returnKeyStyle"
-                latin:code="@integer/key_return"
-                latin:keyIcon="@drawable/sym_bkeyboard_return"
-                latin:iconPreview="@drawable/sym_keyboard_feedback_return"
+                latin:popupCharacters="\@icon/5|\@integer/key_settings"
                 latin:parentStyle="functionalKeyStyle" />
-            <key-style
-                latin:styleName="spaceKeyStyle"
-                latin:code="@integer/key_space"
-                latin:iconPreview="@drawable/sym_keyboard_feedback_space" />
-            <key-style
-                latin:styleName="nonSpecialBackgroundSpaceKeyStyle"
-                latin:code="@integer/key_space"
-                latin:iconPreview="@drawable/sym_keyboard_feedback_space" />
-            <key-style
-                latin:styleName="smileyKeyStyle"
-                latin:keyLabel=":-)"
-                latin:keyOutputText=":-) "
-                latin:keyLabelOption="popupHint"
-                latin:popupCharacters="@string/alternates_for_smiley"
-                latin:maxPopupKeyboardColumn="5" />
-            <switch>
-                <case
-                    latin:voiceKeyEnabled="true"
-                >
-                    <key-style
-                        latin:styleName="micOrSettingsKeyStyle"
-                        latin:code="@integer/key_shortcut"
-                        latin:keyIcon="@drawable/sym_bkeyboard_mic"
-                        latin:iconPreview="@drawable/sym_keyboard_feedback_mic"
-                        latin:keyLabelOption="popupHint"
-                        latin:popupCharacters="\@drawable/sym_keyboard_settings|\@integer/key_settings"
-                        latin:parentStyle="functionalKeyStyle" />
-                </case>
-                <default>
-                    <key-style
-                        latin:styleName="micOrSettingsKeyStyle"
-                        latin:code="@integer/key_settings"
-                        latin:keyIcon="@drawable/sym_bkeyboard_settings"
-                        latin:iconPreview="@drawable/sym_keyboard_feedback_settings"
-                        latin:parentStyle="functionalKeyStyle" />
-                </default>
-            </switch>
         </case>
+        <default>
+            <key-style
+                latin:styleName="shortcutOrSettingsKeyStyle"
+                latin:code="@integer/key_settings"
+                latin:keyIcon="iconSettingsKey"
+                latin:keyIconPreview="iconPreviewSettingsKey"
+                latin:parentStyle="functionalKeyStyle" />
+        </default>
     </switch>
     <key-style
         latin:styleName="tabKeyStyle"
         latin:code="@integer/key_tab"
-        latin:keyIcon="@drawable/sym_keyboard_tab_holo"
-        latin:iconPreview="@drawable/sym_keyboard_tab_holo"
+        latin:keyIcon="iconTabKey"
+        latin:keyIconPreview="iconPreviewTabKey"
         latin:parentStyle="functionalKeyStyle" />
     <key-style
         latin:styleName="toSymbolKeyStyle"
diff --git a/java/res/xml-sw600dp/kbd_number.xml b/java/res/xml-sw600dp/kbd_number.xml
index 0ff1da9..3a370c8 100644
--- a/java/res/xml-sw600dp/kbd_number.xml
+++ b/java/res/xml-sw600dp/kbd_number.xml
@@ -80,7 +80,7 @@
                     latin:keyStyle="num0KeyStyle" />
                 <Spacer />
                 <Key
-                    latin:keyStyle="micOrSettingsKeyStyle"
+                    latin:keyStyle="shortcutOrSettingsKeyStyle"
                     latin:keyXPos="-11.00%p"
                     latin:keyWidth="fillRight"
                     latin:keyEdgeFlags="right" />
@@ -176,7 +176,7 @@
                 <Key
                     latin:keyLabel="#" />
                 <Key
-                    latin:keyStyle="micOrSettingsKeyStyle"
+                    latin:keyStyle="shortcutOrSettingsKeyStyle"
                     latin:keyXPos="-11.00%p"
                     latin:keyWidth="fillBoth"
                     latin:keyEdgeFlags="right" />
diff --git a/java/res/xml-sw600dp/kbd_numkey_styles.xml b/java/res/xml-sw600dp/kbd_numkey_styles.xml
deleted file mode 100644
index b10dc93..0000000
--- a/java/res/xml-sw600dp/kbd_numkey_styles.xml
+++ /dev/null
@@ -1,150 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-**
-** Copyright 2011, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-**     http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<merge
-    xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
->
-    <switch>
-        <case
-            latin:colorScheme="white"
-        >
-            <key-style
-                latin:styleName="num0KeyStyle"
-                latin:code="48"
-                latin:keyIcon="@drawable/sym_keyboard_num0_holo" />
-            <key-style
-                latin:styleName="num1KeyStyle"
-                latin:code="49"
-                latin:keyIcon="@drawable/sym_keyboard_num1_holo" />
-            <key-style
-                latin:styleName="num2KeyStyle"
-                latin:code="50"
-                latin:keyIcon="@drawable/sym_keyboard_num2_holo" />
-            <key-style
-                latin:styleName="num3KeyStyle"
-                latin:code="51"
-                latin:keyIcon="@drawable/sym_keyboard_num3_holo" />
-            <key-style
-                latin:styleName="num4KeyStyle"
-                latin:code="52"
-                latin:keyIcon="@drawable/sym_keyboard_num4_holo" />
-            <key-style
-                latin:styleName="num5KeyStyle"
-                latin:code="53"
-                latin:keyIcon="@drawable/sym_keyboard_num5_holo" />
-            <key-style
-                latin:styleName="num6KeyStyle"
-                latin:code="54"
-                latin:keyIcon="@drawable/sym_keyboard_num6_holo" />
-            <key-style
-                latin:styleName="num7KeyStyle"
-                latin:code="55"
-                latin:keyIcon="@drawable/sym_keyboard_num7_holo" />
-            <key-style
-                latin:styleName="num8KeyStyle"
-                latin:code="56"
-                latin:keyIcon="@drawable/sym_keyboard_num8_holo" />
-            <key-style
-                latin:styleName="num9KeyStyle"
-                latin:code="57"
-                latin:keyIcon="@drawable/sym_keyboard_num9_holo" />
-            <key-style
-                latin:styleName="numStarKeyStyle"
-                latin:code="42"
-                latin:keyIcon="@drawable/sym_keyboard_numbstar_holo" />
-            <key-style
-                latin:styleName="numPoundKeyStyle"
-                latin:code="35"
-                latin:keyIcon="@drawable/sym_keyboard_numbpound_holo" />
-            <key-style
-                latin:styleName="numAltKeyStyle"
-                latin:code="@integer/key_switch_alpha_symbol"
-                latin:keyIcon="@drawable/sym_keyboard_numalt"
-                latin:iconPreview="@drawable/sym_keyboard_feedback_numalt" />
-            <key-style
-                latin:styleName="numSpaceKeyStyle"
-                latin:code="@integer/key_space"
-                latin:keyIcon="@drawable/sym_keyboard_space"
-                latin:iconPreview="@drawable/sym_keyboard_feedback_space" />
-        </case>
-        <case
-            latin:colorScheme="black"
-        >
-            <key-style
-                latin:styleName="num0KeyStyle"
-                latin:code="48"
-                latin:keyIcon="@drawable/sym_bkeyboard_num0" />
-            <key-style
-                latin:styleName="num1KeyStyle"
-                latin:code="49"
-                latin:keyIcon="@drawable/sym_bkeyboard_num1" />
-            <key-style
-                latin:styleName="num2KeyStyle"
-                latin:code="50"
-                latin:keyIcon="@drawable/sym_bkeyboard_num2" />
-            <key-style
-                latin:styleName="num3KeyStyle"
-                latin:code="51"
-                latin:keyIcon="@drawable/sym_bkeyboard_num3" />
-            <key-style
-                latin:styleName="num4KeyStyle"
-                latin:code="52"
-                latin:keyIcon="@drawable/sym_bkeyboard_num4" />
-            <key-style
-                latin:styleName="num5KeyStyle"
-                latin:code="53"
-                latin:keyIcon="@drawable/sym_bkeyboard_num5" />
-            <key-style
-                latin:styleName="num6KeyStyle"
-                latin:code="54"
-                latin:keyIcon="@drawable/sym_bkeyboard_num6" />
-            <key-style
-                latin:styleName="num7KeyStyle"
-                latin:code="55"
-                latin:keyIcon="@drawable/sym_bkeyboard_num7" />
-            <key-style
-                latin:styleName="num8KeyStyle"
-                latin:code="56"
-                latin:keyIcon="@drawable/sym_bkeyboard_num8" />
-            <key-style
-                latin:styleName="num9KeyStyle"
-                latin:code="57"
-                latin:keyIcon="@drawable/sym_bkeyboard_num9" />
-            <key-style
-                latin:styleName="numStarKeyStyle"
-                latin:code="42"
-                latin:keyIcon="@drawable/sym_bkeyboard_numstar" />
-            <key-style
-                latin:styleName="numPoundKeyStyle"
-                latin:code="35"
-                latin:keyIcon="@drawable/sym_bkeyboard_numpound" />
-            <key-style
-                latin:styleName="numAltKeyStyle"
-                latin:code="@integer/key_switch_alpha_symbol"
-                latin:keyIcon="@drawable/sym_bkeyboard_numalt"
-                latin:iconPreview="@drawable/sym_keyboard_feedback_numalt" />
-            <key-style
-                latin:styleName="numSpaceKeyStyle"
-                latin:code="@integer/key_space"
-                latin:keyIcon="@drawable/sym_bkeyboard_space"
-                latin:iconPreview="@drawable/sym_keyboard_feedback_space" />
-        </case>
-    </switch>
-</merge>
diff --git a/java/res/xml-sw600dp/kbd_phone.xml b/java/res/xml-sw600dp/kbd_phone.xml
index 20b2849..133983d 100644
--- a/java/res/xml-sw600dp/kbd_phone.xml
+++ b/java/res/xml-sw600dp/kbd_phone.xml
@@ -109,7 +109,7 @@
         <Key
             latin:keyStyle="numPoundKeyStyle" />
         <Key
-            latin:keyStyle="micOrSettingsKeyStyle"
+            latin:keyStyle="shortcutOrSettingsKeyStyle"
             latin:keyXPos="-11.00%p"
             latin:keyWidth="fillBoth"
             latin:keyEdgeFlags="right" />
diff --git a/java/res/xml-sw600dp/kbd_phone_symbols.xml b/java/res/xml-sw600dp/kbd_phone_symbols.xml
index a5ae945..73b7e4d 100644
--- a/java/res/xml-sw600dp/kbd_phone_symbols.xml
+++ b/java/res/xml-sw600dp/kbd_phone_symbols.xml
@@ -118,7 +118,7 @@
         <Key
             latin:keyStyle="numPoundKeyStyle" />
         <Key
-            latin:keyStyle="micOrSettingsKeyStyle"
+            latin:keyStyle="shortcutOrSettingsKeyStyle"
             latin:keyXPos="-11.00%p"
             latin:keyWidth="fillBoth"
             latin:keyEdgeFlags="right" />
diff --git a/java/res/xml-sw600dp/kbd_qwerty_row4.xml b/java/res/xml-sw600dp/kbd_qwerty_row4.xml
index 49e377f..958a7ed 100644
--- a/java/res/xml-sw600dp/kbd_qwerty_row4.xml
+++ b/java/res/xml-sw600dp/kbd_qwerty_row4.xml
@@ -155,7 +155,7 @@
             </default>
         </switch>
         <Key
-            latin:keyStyle="micOrSettingsKeyStyle"
+            latin:keyStyle="shortcutOrSettingsKeyStyle"
             latin:keyXPos="-10.0%p"
             latin:keyWidth="fillBoth"
             latin:keyEdgeFlags="right" />
diff --git a/java/res/xml-sw600dp/kbd_symbols.xml b/java/res/xml-sw600dp/kbd_symbols.xml
index 4d3e7d3..fca97c7 100644
--- a/java/res/xml-sw600dp/kbd_symbols.xml
+++ b/java/res/xml-sw600dp/kbd_symbols.xml
@@ -210,7 +210,7 @@
             </default>
         </switch>
         <Key
-            latin:keyStyle="micOrSettingsKeyStyle"
+            latin:keyStyle="shortcutOrSettingsKeyStyle"
             latin:keyXPos="-10.0%p"
             latin:keyWidth="fillBoth"
             latin:keyEdgeFlags="right" />
diff --git a/java/res/xml-sw600dp/kbd_symbols_shift.xml b/java/res/xml-sw600dp/kbd_symbols_shift.xml
index 1743c0f..c23681d 100644
--- a/java/res/xml-sw600dp/kbd_symbols_shift.xml
+++ b/java/res/xml-sw600dp/kbd_symbols_shift.xml
@@ -148,7 +148,7 @@
             latin:keyXPos="30.750%p"
             latin:keyWidth="39.750%p" />
         <Key
-            latin:keyStyle="micOrSettingsKeyStyle"
+            latin:keyStyle="shortcutOrSettingsKeyStyle"
             latin:keyXPos="-10.0%p"
             latin:keyWidth="fillRight"
             latin:keyEdgeFlags="right" />
diff --git a/java/res/xml-sw768dp/kbd_key_styles.xml b/java/res/xml-sw768dp/kbd_key_styles.xml
index 4388e89..5d8c081 100644
--- a/java/res/xml-sw768dp/kbd_key_styles.xml
+++ b/java/res/xml-sw768dp/kbd_key_styles.xml
@@ -22,117 +22,54 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
 >
     <!-- Functional key styles -->
-    <switch>
-        <case
-            latin:colorScheme="white"
-        >
-            <key-style
-                latin:styleName="functionalKeyStyle"
-                latin:isFunctional="true" />
-            <key-style
-                latin:styleName="shiftKeyStyle"
-                latin:code="@integer/key_shift"
-                latin:keyIcon="@drawable/sym_keyboard_shift_holo"
-                latin:shiftedIcon="@drawable/sym_keyboard_shift_locked_holo"
-                latin:iconPreview="@drawable/sym_keyboard_feedback_shift"
-                latin:parentStyle="functionalKeyStyle"
-                latin:isSticky="true" />
-            <key-style
-                latin:styleName="deleteKeyStyle"
-                latin:code="@integer/key_delete"
-                latin:keyIcon="@drawable/sym_keyboard_delete_holo"
-                latin:iconPreview="@drawable/sym_keyboard_feedback_delete"
-                latin:parentStyle="functionalKeyStyle"
-                latin:isRepeatable="true" />
-            <key-style
-                latin:styleName="returnKeyStyle"
-                latin:code="@integer/key_return"
-                latin:keyIcon="@drawable/sym_keyboard_return_holo"
-                latin:iconPreview="@drawable/sym_keyboard_feedback_return"
-                latin:parentStyle="functionalKeyStyle" />
-            <key-style
-                latin:styleName="spaceKeyStyle"
-                latin:code="@integer/key_space"
-                latin:iconPreview="@drawable/sym_keyboard_feedback_space" />
-            <key-style
-                latin:styleName="nonSpecialBackgroundSpaceKeyStyle"
-                latin:code="@integer/key_space"
-                latin:iconPreview="@drawable/sym_keyboard_feedback_space" />
-            <key-style
-                latin:styleName="smileyKeyStyle"
-                latin:keyLabel=":-)"
-                latin:keyOutputText=":-) "
-                latin:keyLabelOption="popupHint"
-                latin:popupCharacters="@string/alternates_for_smiley"
-                latin:maxPopupKeyboardColumn="5" />
-            <key-style
-                latin:styleName="settingsKeyStyle"
-                latin:code="@integer/key_settings"
-                latin:keyIcon="@drawable/sym_keyboard_settings_holo"
-                latin:iconPreview="@drawable/sym_keyboard_feedback_settings"
-                latin:parentStyle="functionalKeyStyle" />
-            <key-style
-                latin:styleName="micKeyStyle"
-                latin:code="@integer/key_shortcut"
-                latin:keyIcon="@drawable/sym_keyboard_voice_holo"
-                latin:iconPreview="@drawable/sym_keyboard_feedback_mic"
-                latin:parentStyle="functionalKeyStyle" />
-        </case>
-        <case
-            latin:colorScheme="black"
-        >
-            <key-style
-                latin:styleName="functionalKeyStyle" />
-            <key-style
-                latin:styleName="shiftKeyStyle"
-                latin:code="@integer/key_shift"
-                latin:keyIcon="@drawable/sym_bkeyboard_shift"
-                latin:shiftedIcon="@drawable/sym_bkeyboard_shift_locked"
-                latin:iconPreview="@drawable/sym_keyboard_feedback_shift"
-                latin:parentStyle="functionalKeyStyle"
-                latin:isSticky="true" />
-            <key-style
-                latin:styleName="deleteKeyStyle"
-                latin:code="@integer/key_delete"
-                latin:keyIcon="@drawable/sym_bkeyboard_delete"
-                latin:iconPreview="@drawable/sym_keyboard_feedback_delete"
-                latin:parentStyle="functionalKeyStyle"
-                latin:isRepeatable="true" />
-            <key-style
-                latin:styleName="returnKeyStyle"
-                latin:code="@integer/key_return"
-                latin:keyIcon="@drawable/sym_bkeyboard_return"
-                latin:iconPreview="@drawable/sym_keyboard_feedback_return"
-                latin:parentStyle="functionalKeyStyle" />
-            <key-style
-                latin:styleName="spaceKeyStyle"
-                latin:code="@integer/key_space"
-                latin:iconPreview="@drawable/sym_keyboard_feedback_space" />
-            <key-style
-                latin:styleName="nonSpecialBackgroundSpaceKeyStyle"
-                latin:code="@integer/key_space"
-                latin:iconPreview="@drawable/sym_keyboard_feedback_space" />
-            <key-style
-                latin:styleName="smileyKeyStyle"
-                latin:keyLabel=":-)"
-                latin:keyOutputText=":-) "
-                latin:keyLabelOption="popupHint"
-                latin:popupCharacters="@string/alternates_for_smiley"
-                latin:maxPopupKeyboardColumn="5" />
-            <key-style
-                latin:styleName="settingsKeyStyle"
-                latin:code="@integer/key_settings"
-                latin:keyIcon="@drawable/sym_bkeyboard_settings"
-                latin:iconPreview="@drawable/sym_keyboard_feedback_settings"
-                latin:parentStyle="functionalKeyStyle" />
-            <key-style
-                latin:styleName="micKeyStyle"
-                latin:code="@integer/key_shortcut"
-                latin:keyIcon="@drawable/sym_bkeyboard_mic"
-                latin:iconPreview="@drawable/sym_keyboard_feedback_mic"
-                latin:parentStyle="functionalKeyStyle" />
-        </case>
-    </switch>
+    <key-style
+        latin:styleName="functionalKeyStyle"
+        latin:isFunctional="true" />
+    <key-style
+        latin:styleName="shiftKeyStyle"
+        latin:code="@integer/key_shift"
+        latin:keyIcon="iconShiftKey"
+        latin:keyIconShifted="iconShiftedShiftKey"
+        latin:parentStyle="functionalKeyStyle"
+        latin:isSticky="true" />
+    <key-style
+        latin:styleName="deleteKeyStyle"
+        latin:code="@integer/key_delete"
+        latin:keyIcon="iconDeleteKey"
+        latin:parentStyle="functionalKeyStyle"
+        latin:isRepeatable="true" />
+    <key-style
+        latin:styleName="returnKeyStyle"
+        latin:code="@integer/key_return"
+        latin:keyIcon="iconReturnKey"
+        latin:parentStyle="functionalKeyStyle" />
+    <key-style
+        latin:styleName="spaceKeyStyle"
+        latin:code="@integer/key_space"
+        latin:keyIconPreview="iconPreviewSpaceKey" />
+    <key-style
+        latin:styleName="nonSpecialBackgroundSpaceKeyStyle"
+        latin:code="@integer/key_space"
+        latin:keyIconPreview="iconPreviewSpaceKey" />
+    <key-style
+        latin:styleName="smileyKeyStyle"
+        latin:keyLabel=":-)"
+        latin:keyOutputText=":-) "
+        latin:keyLabelOption="popupHint"
+        latin:popupCharacters="@string/alternates_for_smiley"
+        latin:maxPopupKeyboardColumn="5" />
+    <key-style
+        latin:styleName="settingsKeyStyle"
+        latin:code="@integer/key_settings"
+        latin:keyIcon="iconSettingsKey"
+        latin:keyIconPreview="iconPreviewSettingsKey"
+        latin:parentStyle="functionalKeyStyle" />
+    <key-style
+        latin:styleName="shortcutKeyStyle"
+        latin:code="@integer/key_shortcut"
+        latin:keyIcon="iconShortcutKey"
+        latin:keyIconPreview="iconPreviewShortcutKey"
+        latin:parentStyle="functionalKeyStyle" />
     <key-style
         latin:styleName="tabKeyStyle"
         latin:code="@integer/key_tab"
diff --git a/java/res/xml-sw768dp/kbd_number.xml b/java/res/xml-sw768dp/kbd_number.xml
index 4f33e41..1e478fd 100644
--- a/java/res/xml-sw768dp/kbd_number.xml
+++ b/java/res/xml-sw768dp/kbd_number.xml
@@ -193,7 +193,7 @@
                         latin:voiceKeyEnabled="true"
                     >
                         <Key
-                            latin:keyStyle="micKeyStyle"
+                            latin:keyStyle="shortcutKeyStyle"
                             latin:keyXPos="-8.047%p"
                             latin:keyWidth="fillRight" />
                     </case>
diff --git a/java/res/xml-sw768dp/kbd_numkey_styles.xml b/java/res/xml-sw768dp/kbd_numkey_styles.xml
deleted file mode 100644
index e27db94..0000000
--- a/java/res/xml-sw768dp/kbd_numkey_styles.xml
+++ /dev/null
@@ -1,148 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-**
-** Copyright 2010, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-**     http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<merge
-    xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
->
-    <switch>
-        <case
-            latin:colorScheme="white"
-        >
-            <key-style
-                latin:styleName="num0KeyStyle"
-                latin:code="48"
-                latin:keyIcon="@drawable/sym_keyboard_num0_holo" />
-            <key-style
-                latin:styleName="num1KeyStyle"
-                latin:code="49"
-                latin:keyIcon="@drawable/sym_keyboard_num1_holo" />
-            <key-style
-                latin:styleName="num2KeyStyle"
-                latin:code="50"
-                latin:keyIcon="@drawable/sym_keyboard_num2_holo" />
-            <key-style
-                latin:styleName="num3KeyStyle"
-                latin:code="51"
-                latin:keyIcon="@drawable/sym_keyboard_num3_holo" />
-            <key-style
-                latin:styleName="num4KeyStyle"
-                latin:code="52"
-                latin:keyIcon="@drawable/sym_keyboard_num4_holo" />
-            <key-style
-                latin:styleName="num5KeyStyle"
-                latin:code="53"
-                latin:keyIcon="@drawable/sym_keyboard_num5_holo" />
-            <key-style
-                latin:styleName="num6KeyStyle"
-                latin:code="54"
-                latin:keyIcon="@drawable/sym_keyboard_num6_holo" />
-            <key-style
-                latin:styleName="num7KeyStyle"
-                latin:code="55"
-                latin:keyIcon="@drawable/sym_keyboard_num7_holo" />
-            <key-style
-                latin:styleName="num8KeyStyle"
-                latin:code="56"
-                latin:keyIcon="@drawable/sym_keyboard_num8_holo" />
-            <key-style
-                latin:styleName="num9KeyStyle"
-                latin:code="57"
-                latin:keyIcon="@drawable/sym_keyboard_num9_holo" />
-            <key-style
-                latin:styleName="numStarKeyStyle"
-                latin:code="42"
-                latin:keyIcon="@drawable/sym_keyboard_numbstar_holo" />
-            <key-style
-                latin:styleName="numPoundKeyStyle"
-                latin:code="35"
-                latin:keyIcon="@drawable/sym_keyboard_numbpound_holo" />
-            <key-style
-                latin:styleName="numAltKeyStyle"
-                latin:code="@integer/key_switch_alpha_symbol"
-                latin:keyIcon="@drawable/sym_keyboard_numalt"
-                latin:iconPreview="@drawable/sym_keyboard_feedback_numalt" />
-            <key-style
-                latin:styleName="numSpaceKeyStyle"
-                latin:code="@integer/key_space"
-                latin:iconPreview="@drawable/sym_keyboard_feedback_space" />
-        </case>
-        <case
-            latin:colorScheme="black"
-        >
-            <key-style
-                latin:styleName="num0KeyStyle"
-                latin:code="48"
-                latin:keyIcon="@drawable/sym_bkeyboard_num0" />
-            <key-style
-                latin:styleName="num1KeyStyle"
-                latin:code="49"
-                latin:keyIcon="@drawable/sym_bkeyboard_num1" />
-            <key-style
-                latin:styleName="num2KeyStyle"
-                latin:code="50"
-                latin:keyIcon="@drawable/sym_bkeyboard_num2" />
-            <key-style
-                latin:styleName="num3KeyStyle"
-                latin:code="51"
-                latin:keyIcon="@drawable/sym_bkeyboard_num3" />
-            <key-style
-                latin:styleName="num4KeyStyle"
-                latin:code="52"
-                latin:keyIcon="@drawable/sym_bkeyboard_num4" />
-            <key-style
-                latin:styleName="num5KeyStyle"
-                latin:code="53"
-                latin:keyIcon="@drawable/sym_bkeyboard_num5" />
-            <key-style
-                latin:styleName="num6KeyStyle"
-                latin:code="54"
-                latin:keyIcon="@drawable/sym_bkeyboard_num6" />
-            <key-style
-                latin:styleName="num7KeyStyle"
-                latin:code="55"
-                latin:keyIcon="@drawable/sym_bkeyboard_num7" />
-            <key-style
-                latin:styleName="num8KeyStyle"
-                latin:code="56"
-                latin:keyIcon="@drawable/sym_bkeyboard_num8" />
-            <key-style
-                latin:styleName="num9KeyStyle"
-                latin:code="57"
-                latin:keyIcon="@drawable/sym_bkeyboard_num9" />
-            <key-style
-                latin:styleName="numStarKeyStyle"
-                latin:code="42"
-                latin:keyIcon="@drawable/sym_bkeyboard_numstar" />
-            <key-style
-                latin:styleName="numPoundKeyStyle"
-                latin:code="35"
-                latin:keyIcon="@drawable/sym_bkeyboard_numpound" />
-            <key-style
-                latin:styleName="numAltKeyStyle"
-                latin:code="@integer/key_switch_alpha_symbol"
-                latin:keyIcon="@drawable/sym_bkeyboard_numalt"
-                latin:iconPreview="@drawable/sym_keyboard_feedback_numalt" />
-            <key-style
-                latin:styleName="numSpaceKeyStyle"
-                latin:code="@integer/key_space"
-                latin:iconPreview="@drawable/sym_keyboard_feedback_space" />
-        </case>
-    </switch>
-</merge>
diff --git a/java/res/xml-sw768dp/kbd_phone.xml b/java/res/xml-sw768dp/kbd_phone.xml
index 69169ff..b0d9337 100644
--- a/java/res/xml-sw768dp/kbd_phone.xml
+++ b/java/res/xml-sw768dp/kbd_phone.xml
@@ -123,7 +123,7 @@
                 latin:voiceKeyEnabled="true"
             >
                 <Key
-                    latin:keyStyle="micKeyStyle"
+                    latin:keyStyle="shortcutKeyStyle"
                     latin:keyXPos="-8.047%p"
                     latin:keyWidth="fillRight" />
             </case>
diff --git a/java/res/xml-sw768dp/kbd_phone_symbols.xml b/java/res/xml-sw768dp/kbd_phone_symbols.xml
index e95579c..120a149 100644
--- a/java/res/xml-sw768dp/kbd_phone_symbols.xml
+++ b/java/res/xml-sw768dp/kbd_phone_symbols.xml
@@ -134,7 +134,7 @@
                 latin:voiceKeyEnabled="true"
             >
                 <Key
-                    latin:keyStyle="micKeyStyle"
+                    latin:keyStyle="shortcutKeyStyle"
                     latin:keyXPos="-8.047%p"
                     latin:keyWidth="fillRight" />
             </case>
diff --git a/java/res/xml-sw768dp/kbd_qwerty_row4.xml b/java/res/xml-sw768dp/kbd_qwerty_row4.xml
index fba2a65..00eabab 100644
--- a/java/res/xml-sw768dp/kbd_qwerty_row4.xml
+++ b/java/res/xml-sw768dp/kbd_qwerty_row4.xml
@@ -132,7 +132,7 @@
                 latin:voiceKeyEnabled="true"
             >
                 <Key
-                    latin:keyStyle="micKeyStyle"
+                    latin:keyStyle="shortcutKeyStyle"
                     latin:keyXPos="-8.047%p"
                     latin:keyWidth="fillRight" />
             </case>
diff --git a/java/res/xml-sw768dp/kbd_symbols.xml b/java/res/xml-sw768dp/kbd_symbols.xml
index d1a83c4..0e6103a 100644
--- a/java/res/xml-sw768dp/kbd_symbols.xml
+++ b/java/res/xml-sw768dp/kbd_symbols.xml
@@ -186,7 +186,7 @@
                 latin:voiceKeyEnabled="true"
             >
                 <Key
-                    latin:keyStyle="micKeyStyle"
+                    latin:keyStyle="shortcutKeyStyle"
                     latin:keyXPos="-8.047%p"
                     latin:keyWidth="fillRight" />
             </case>
diff --git a/java/res/xml-sw768dp/kbd_symbols_shift.xml b/java/res/xml-sw768dp/kbd_symbols_shift.xml
index dde144f..b368141 100644
--- a/java/res/xml-sw768dp/kbd_symbols_shift.xml
+++ b/java/res/xml-sw768dp/kbd_symbols_shift.xml
@@ -166,7 +166,7 @@
                 latin:voiceKeyEnabled="true"
             >
                 <Key
-                    latin:keyStyle="micKeyStyle"
+                    latin:keyStyle="shortcutKeyStyle"
                     latin:keyXPos="-8.047%p"
                     latin:keyWidth="fillRight" />
             </case>
diff --git a/java/res/xml/kbd_key_styles.xml b/java/res/xml/kbd_key_styles.xml
index 201bff6..0c59fd8 100644
--- a/java/res/xml/kbd_key_styles.xml
+++ b/java/res/xml/kbd_key_styles.xml
@@ -22,21 +22,9 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
 >
     <!-- Base key style for the functional key -->
-    <switch>
-       <case
-            latin:colorScheme="white"
-        >
-            <key-style
-                latin:styleName="functionalKeyStyle"
-                latin:isFunctional="true" />
-        </case>
-        <case
-            latin:colorScheme="black"
-        >
-            <key-style
-                latin:styleName="functionalKeyStyle" />
-        </case>
-    </switch>
+    <key-style
+        latin:styleName="functionalKeyStyle"
+        latin:isFunctional="true" />
     <!-- Base key style for the key which may have settings key as popup key -->
     <switch>
         <case
@@ -51,159 +39,76 @@
             <key-style
                 latin:styleName="settingsPopupStyle"
                 latin:keyLabelOption="popupHint"
-                latin:popupCharacters="\@drawable/sym_keyboard_settings_holo|\@integer/key_settings"
+                latin:popupCharacters="\@icon/5|\@integer/key_settings"
                 latin:parentStyle="functionalKeyStyle" />
         </default>
     </switch>
     <!-- Functional key styles -->
+    <key-style
+        latin:styleName="shiftKeyStyle"
+        latin:code="@integer/key_shift"
+        latin:keyIcon="iconShiftKey"
+        latin:keyIconShifted="iconShiftedShiftKey"
+        latin:parentStyle="functionalKeyStyle"
+        latin:isSticky="true" />
+    <key-style
+        latin:styleName="deleteKeyStyle"
+        latin:code="@integer/key_delete"
+        latin:keyIcon="iconDeleteKey"
+        latin:parentStyle="functionalKeyStyle"
+        latin:isRepeatable="true" />
     <switch>
+        <!-- When this qwerty keyboard has no voice key but voice key is enabled, then symbol
+             keyboard will have mic key. That means we should use "?123mic" key here. -->
         <case
-            latin:colorScheme="white"
+            latin:voiceKeyEnabled="true"
+            latin:hasVoiceKey="false"
         >
             <key-style
-                latin:styleName="shiftKeyStyle"
-                latin:code="@integer/key_shift"
-                latin:keyIcon="@drawable/sym_keyboard_shift"
-                latin:shiftedIcon="@drawable/sym_keyboard_shift_locked"
-                latin:iconPreview="@drawable/sym_keyboard_feedback_shift"
-                latin:parentStyle="functionalKeyStyle"
-                latin:isSticky="true" />
-            <key-style
-                latin:styleName="deleteKeyStyle"
-                latin:code="@integer/key_delete"
-                latin:keyIcon="@drawable/sym_keyboard_delete"
-                latin:iconPreview="@drawable/sym_keyboard_feedback_delete"
-                latin:parentStyle="functionalKeyStyle"
-                latin:isRepeatable="true" />
-            <switch>
-                <!-- When this qwerty keyboard has no voice key but voice key is enabled, then
-                     symbol keyboard will have mic key. That means we should use "?123mic" key
-                     here. -->
-                <case
-                    latin:voiceKeyEnabled="true"
-                    latin:hasVoiceKey="false"
-                >
-                    <key-style
-                        latin:styleName="toSymbolKeyStyle"
-                        latin:code="@integer/key_switch_alpha_symbol"
-                        latin:keyIcon="@drawable/sym_keyboard_123_mic"
-                        latin:iconPreview="@drawable/sym_keyboard_feedback_123_mic"
-                        latin:parentStyle="functionalKeyStyle" />
-                </case>
-                <default>
-                    <key-style
-                        latin:styleName="toSymbolKeyStyle"
-                        latin:code="@integer/key_switch_alpha_symbol"
-                        latin:keyLabel="@string/label_to_symbol_key"
-                        latin:parentStyle="functionalKeyStyle" />
-                </default>
-            </switch>
-            <key-style
-                latin:styleName="settingsKeyStyle"
-                latin:code="@integer/key_settings"
-                latin:keyIcon="@drawable/sym_keyboard_settings"
-                latin:iconPreview="@drawable/sym_keyboard_settings"
+                latin:styleName="toSymbolKeyStyle"
+                latin:code="@integer/key_switch_alpha_symbol"
+                latin:keyIcon="iconToSymbolKeyWithShortcut"
                 latin:parentStyle="functionalKeyStyle" />
-            <key-style
-                latin:styleName="spaceKeyStyle"
-                latin:code="@integer/key_space"
-                latin:keyIcon="@drawable/sym_keyboard_space"
-                latin:iconPreview="@drawable/sym_keyboard_space"
-                latin:parentStyle="functionalKeyStyle" />
-            <key-style
-                latin:styleName="tabKeyStyle"
-                latin:code="@integer/key_tab"
-                latin:keyIcon="@drawable/sym_keyboard_tab"
-                latin:iconPreview="@drawable/sym_keyboard_tab"
-                latin:parentStyle="functionalKeyStyle" />
-            <key-style
-                latin:styleName="micKeyStyle"
-                latin:code="@integer/key_shortcut"
-                latin:keyIcon="@drawable/sym_keyboard_mic"
-                latin:iconPreview="@drawable/sym_keyboard_feedback_mic"
-                latin:parentStyle="settingsPopupStyle" />
-            <!-- Note: This key style is not for functional tab key. This is used for the tab key
-                 which is laid out as normal letter key. -->
-            <key-style
-                latin:styleName="nonSpecialBackgroundTabKeyStyle"
-                latin:code="@integer/key_tab"
-                latin:keyIcon="@drawable/sym_keyboard_tab"
-                latin:iconPreview="@drawable/sym_keyboard_tab" />
         </case>
-        <case
-            latin:colorScheme="black"
-        >
+        <default>
             <key-style
-                latin:styleName="shiftKeyStyle"
-                latin:code="@integer/key_shift"
-                latin:keyIcon="@drawable/sym_bkeyboard_shift"
-                latin:shiftedIcon="@drawable/sym_bkeyboard_shift_locked"
-                latin:iconPreview="@drawable/sym_keyboard_feedback_shift"
-                latin:parentStyle="functionalKeyStyle"
-                latin:isSticky="true" />
-            <key-style
-                latin:styleName="deleteKeyStyle"
-                latin:code="@integer/key_delete"
-                latin:keyIcon="@drawable/sym_bkeyboard_delete"
-                latin:iconPreview="@drawable/sym_keyboard_feedback_delete"
-                latin:parentStyle="functionalKeyStyle"
-                latin:isRepeatable="true" />
-            <switch>
-                <!-- When this qwerty keyboard has no voice key but voice key is enabled, then
-                     symbol keyboard will have mic key. That means we should use "?123mic" key
-                     here. -->
-                <case
-                    latin:voiceKeyEnabled="true"
-                    latin:hasVoiceKey="false"
-                >
-                    <key-style
-                        latin:styleName="toSymbolKeyStyle"
-                        latin:code="@integer/key_switch_alpha_symbol"
-                        latin:keyIcon="@drawable/sym_bkeyboard_123_mic"
-                        latin:iconPreview="@drawable/sym_keyboard_feedback_123_mic"
-                        latin:parentStyle="functionalKeyStyle" />
-                </case>
-                <default>
-                    <key-style
-                        latin:styleName="toSymbolKeyStyle"
-                        latin:code="@integer/key_switch_alpha_symbol"
-                        latin:keyLabel="@string/label_to_symbol_key"
-                        latin:parentStyle="functionalKeyStyle" />
-                </default>
-            </switch>
-            <key-style
-                latin:styleName="settingsKeyStyle"
-                latin:code="@integer/key_settings"
-                latin:keyIcon="@drawable/sym_bkeyboard_settings"
-                latin:iconPreview="@drawable/sym_keyboard_feedback_settings"
+                latin:styleName="toSymbolKeyStyle"
+                latin:code="@integer/key_switch_alpha_symbol"
+                latin:keyLabel="@string/label_to_symbol_key"
                 latin:parentStyle="functionalKeyStyle" />
-            <key-style
-                latin:styleName="spaceKeyStyle"
-                latin:code="@integer/key_space"
-                latin:keyIcon="@drawable/sym_bkeyboard_space"
-                latin:iconPreview="@drawable/sym_keyboard_feedback_space"
-                latin:parentStyle="functionalKeyStyle" />
-            <key-style
-                latin:styleName="tabKeyStyle"
-                latin:code="@integer/key_tab"
-                latin:keyIcon="@drawable/sym_bkeyboard_tab"
-                latin:iconPreview="@drawable/sym_keyboard_feedback_tab"
-                latin:parentStyle="functionalKeyStyle" />
-            <key-style
-                latin:styleName="micKeyStyle"
-                latin:code="@integer/key_shortcut"
-                latin:keyIcon="@drawable/sym_bkeyboard_mic"
-                latin:iconPreview="@drawable/sym_keyboard_feedback_mic"
-                latin:parentStyle="settingsPopupStyle" />
-            <!-- Note: This key style is not for functional tab key. This is used for the tab key
-                 which is laid out as normal letter key. -->
-            <key-style
-                latin:styleName="nonSpecialBackgroundTabKeyStyle"
-                latin:code="@integer/key_tab"
-                latin:keyIcon="@drawable/sym_bkeyboard_tab"
-                latin:iconPreview="@drawable/sym_keyboard_feedback_tab" />
-        </case>
+        </default>
     </switch>
+    <key-style
+        latin:styleName="settingsKeyStyle"
+        latin:code="@integer/key_settings"
+        latin:keyIcon="iconSettingsKey"
+        latin:keyIconPreview="iconPreviewSettingsKey"
+        latin:parentStyle="functionalKeyStyle" />
+    <key-style
+        latin:styleName="spaceKeyStyle"
+        latin:code="@integer/key_space"
+        latin:keyIcon="iconSpaceKey"
+        latin:keyIconPreview="iconPreviewSpaceKey"
+        latin:parentStyle="functionalKeyStyle" />
+    <key-style
+        latin:styleName="tabKeyStyle"
+        latin:code="@integer/key_tab"
+        latin:keyIcon="iconTabKey"
+        latin:keyIconPreview="iconPreviewTabKey"
+        latin:parentStyle="functionalKeyStyle" />
+    <key-style
+        latin:styleName="shortcutKeyStyle"
+        latin:code="@integer/key_shortcut"
+        latin:keyIcon="iconShortcutKey"
+        latin:keyIconPreview="iconPreviewShortcutKey"
+        latin:parentStyle="settingsPopupStyle" />
+    <!-- Note: This key style is not for functional tab key. This is used for the tab key which is
+         laid out as normal letter key. -->
+    <key-style
+        latin:styleName="nonSpecialBackgroundTabKeyStyle"
+        latin:code="@integer/key_tab"
+        latin:keyIcon="iconTabKey"
+        latin:keyIconPreview="iconPreviewTabKey" />
     <!-- Return key style -->
     <switch>
         <case
@@ -245,52 +150,18 @@
         <case
             latin:imeAction="actionSearch"
         >
-            <switch>
-                <case
-                    latin:colorScheme="white"
-                >
-                    <key-style
-                        latin:styleName="returnKeyStyle"
-                        latin:code="@integer/key_return"
-                        latin:keyIcon="@drawable/sym_keyboard_search"
-                        latin:iconPreview="@drawable/sym_keyboard_feedback_search"
-                        latin:parentStyle="functionalKeyStyle" />
-                </case>
-                <case
-                    latin:colorScheme="black"
-                >
-                    <key-style
-                        latin:styleName="returnKeyStyle"
-                        latin:code="@integer/key_return"
-                        latin:keyIcon="@drawable/sym_bkeyboard_search"
-                        latin:iconPreview="@drawable/sym_keyboard_feedback_search"
-                        latin:parentStyle="functionalKeyStyle" />
-                </case>
-            </switch>
+            <key-style
+                latin:styleName="returnKeyStyle"
+                latin:code="@integer/key_return"
+                latin:keyIcon="iconSearchKey"
+                latin:parentStyle="functionalKeyStyle" />
         </case>
         <default>
-            <switch>
-                <case
-                    latin:colorScheme="white"
-                >
-                    <key-style
-                        latin:styleName="returnKeyStyle"
-                        latin:code="@integer/key_return"
-                        latin:keyIcon="@drawable/sym_keyboard_return"
-                        latin:iconPreview="@drawable/sym_keyboard_return"
-                        latin:parentStyle="functionalKeyStyle" />
-                </case>
-                <case
-                    latin:colorScheme="black"
-                >
-                    <key-style
-                        latin:styleName="returnKeyStyle"
-                        latin:code="@integer/key_return"
-                        latin:keyIcon="@drawable/sym_bkeyboard_return"
-                        latin:iconPreview="@drawable/sym_keyboard_feedback_return"
-                        latin:parentStyle="functionalKeyStyle" />
-                </case>
-            </switch>
+            <key-style
+                latin:styleName="returnKeyStyle"
+                latin:code="@integer/key_return"
+                latin:keyIcon="iconReturnKey"
+                latin:parentStyle="functionalKeyStyle" />
         </default>
     </switch>
     <key-style
@@ -335,4 +206,4 @@
                 latin:parentStyle="functionalKeyStyle" />
         </default>
     </switch>
-</merge>
\ No newline at end of file
+</merge>
diff --git a/java/res/xml/kbd_numkey_styles.xml b/java/res/xml/kbd_numkey_styles.xml
index 2f9ae32..f53046a 100644
--- a/java/res/xml/kbd_numkey_styles.xml
+++ b/java/res/xml/kbd_numkey_styles.xml
@@ -21,130 +21,61 @@
 <merge
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
 >
-    <switch>
-        <case
-            latin:colorScheme="white"
-        >
-            <key-style
-                latin:styleName="num0KeyStyle"
-                latin:code="48"
-                latin:keyIcon="@drawable/sym_keyboard_num0" />
-            <key-style
-                latin:styleName="num1KeyStyle"
-                latin:code="49"
-                latin:keyIcon="@drawable/sym_keyboard_num1" />
-            <key-style
-                latin:styleName="num2KeyStyle"
-                latin:code="50"
-                latin:keyIcon="@drawable/sym_keyboard_num2" />
-            <key-style
-                latin:styleName="num3KeyStyle"
-                latin:code="51"
-                latin:keyIcon="@drawable/sym_keyboard_num3" />
-            <key-style
-                latin:styleName="num4KeyStyle"
-                latin:code="52"
-                latin:keyIcon="@drawable/sym_keyboard_num4" />
-            <key-style
-                latin:styleName="num5KeyStyle"
-                latin:code="53"
-                latin:keyIcon="@drawable/sym_keyboard_num5" />
-            <key-style
-                latin:styleName="num6KeyStyle"
-                latin:code="54"
-                latin:keyIcon="@drawable/sym_keyboard_num6" />
-            <key-style
-                latin:styleName="num7KeyStyle"
-                latin:code="55"
-                latin:keyIcon="@drawable/sym_keyboard_num7" />
-            <key-style
-                latin:styleName="num8KeyStyle"
-                latin:code="56"
-                latin:keyIcon="@drawable/sym_keyboard_num8" />
-            <key-style
-                latin:styleName="num9KeyStyle"
-                latin:code="57"
-                latin:keyIcon="@drawable/sym_keyboard_num9" />
-            <key-style
-                latin:styleName="numStarKeyStyle"
-                latin:code="42"
-                latin:keyIcon="@drawable/sym_keyboard_numstar" />
-            <key-style
-                latin:styleName="numPoundKeyStyle"
-                latin:code="35"
-                latin:keyIcon="@drawable/sym_keyboard_numpound" />
-            <key-style
-                latin:styleName="numAltKeyStyle"
-                latin:code="@integer/key_switch_alpha_symbol"
-                latin:keyIcon="@drawable/sym_keyboard_numalt"
-                latin:iconPreview="@drawable/sym_keyboard_feedback_numalt" />
-            <key-style
-                latin:styleName="numSpaceKeyStyle"
-                latin:code="@integer/key_space"
-                latin:keyIcon="@drawable/sym_keyboard_space"
-                latin:iconPreview="@drawable/sym_keyboard_feedback_space" />
-        </case>
-        <case
-            latin:colorScheme="black"
-        >
-            <key-style
-                latin:styleName="num0KeyStyle"
-                latin:code="48"
-                latin:keyIcon="@drawable/sym_bkeyboard_num0" />
-            <key-style
-                latin:styleName="num1KeyStyle"
-                latin:code="49"
-                latin:keyIcon="@drawable/sym_bkeyboard_num1" />
-            <key-style
-                latin:styleName="num2KeyStyle"
-                latin:code="50"
-                latin:keyIcon="@drawable/sym_bkeyboard_num2" />
-            <key-style
-                latin:styleName="num3KeyStyle"
-                latin:code="51"
-                latin:keyIcon="@drawable/sym_bkeyboard_num3" />
-            <key-style
-                latin:styleName="num4KeyStyle"
-                latin:code="52"
-                latin:keyIcon="@drawable/sym_bkeyboard_num4" />
-            <key-style
-                latin:styleName="num5KeyStyle"
-                latin:code="53"
-                latin:keyIcon="@drawable/sym_bkeyboard_num5" />
-            <key-style
-                latin:styleName="num6KeyStyle"
-                latin:code="54"
-                latin:keyIcon="@drawable/sym_bkeyboard_num6" />
-            <key-style
-                latin:styleName="num7KeyStyle"
-                latin:code="55"
-                latin:keyIcon="@drawable/sym_bkeyboard_num7" />
-            <key-style
-                latin:styleName="num8KeyStyle"
-                latin:code="56"
-                latin:keyIcon="@drawable/sym_bkeyboard_num8" />
-            <key-style
-                latin:styleName="num9KeyStyle"
-                latin:code="57"
-                latin:keyIcon="@drawable/sym_bkeyboard_num9" />
-            <key-style
-                latin:styleName="numStarKeyStyle"
-                latin:code="42"
-                latin:keyIcon="@drawable/sym_bkeyboard_numstar" />
-            <key-style
-                latin:styleName="numPoundKeyStyle"
-                latin:code="35"
-                latin:keyIcon="@drawable/sym_bkeyboard_numpound" />
-            <key-style
-                latin:styleName="numAltKeyStyle"
-                latin:code="@integer/key_switch_alpha_symbol"
-                latin:keyIcon="@drawable/sym_bkeyboard_numalt"
-                latin:iconPreview="@drawable/sym_keyboard_feedback_numalt" />
-            <key-style
-                latin:styleName="numSpaceKeyStyle"
-                latin:code="@integer/key_space"
-                latin:keyIcon="@drawable/sym_bkeyboard_space"
-                latin:iconPreview="@drawable/sym_keyboard_feedback_space" />
-        </case>
-    </switch>
+    <key-style
+        latin:styleName="num0KeyStyle"
+        latin:code="48"
+        latin:keyIcon="iconNum0Key" />
+    <key-style
+        latin:styleName="num1KeyStyle"
+        latin:code="49"
+        latin:keyIcon="iconNum1Key" />
+    <key-style
+        latin:styleName="num2KeyStyle"
+        latin:code="50"
+        latin:keyIcon="iconNum2Key" />
+    <key-style
+        latin:styleName="num3KeyStyle"
+        latin:code="51"
+        latin:keyIcon="iconNum3Key" />
+    <key-style
+        latin:styleName="num4KeyStyle"
+        latin:code="52"
+        latin:keyIcon="iconNum4Key" />
+    <key-style
+        latin:styleName="num5KeyStyle"
+        latin:code="53"
+        latin:keyIcon="iconNum5Key" />
+    <key-style
+        latin:styleName="num6KeyStyle"
+        latin:code="54"
+        latin:keyIcon="iconNum6Key" />
+    <key-style
+        latin:styleName="num7KeyStyle"
+        latin:code="55"
+        latin:keyIcon="iconNum7Key" />
+    <key-style
+        latin:styleName="num8KeyStyle"
+        latin:code="56"
+        latin:keyIcon="iconNum8Key" />
+    <key-style
+        latin:styleName="num9KeyStyle"
+        latin:code="57"
+        latin:keyIcon="iconNum9Key" />
+    <key-style
+        latin:styleName="numStarKeyStyle"
+        latin:code="42"
+        latin:keyIcon="iconNumStarKey" />
+    <key-style
+        latin:styleName="numPoundKeyStyle"
+        latin:code="35"
+        latin:keyIcon="iconNumPoundKey" />
+    <key-style
+        latin:styleName="numAltKeyStyle"
+        latin:code="@integer/key_switch_alpha_symbol"
+        latin:keyIcon="iconNumAltKey" />
+    <key-style
+        latin:styleName="numSpaceKeyStyle"
+        latin:code="@integer/key_space"
+        latin:keyIcon="iconSpaceKey"
+        latin:keyIconPreview="iconPreviewSpaceKey" />
 </merge>
diff --git a/java/res/xml/kbd_qwerty_f1.xml b/java/res/xml/kbd_qwerty_f1.xml
index 45cc8f5..51b9800 100644
--- a/java/res/xml/kbd_qwerty_f1.xml
+++ b/java/res/xml/kbd_qwerty_f1.xml
@@ -48,7 +48,7 @@
                             latin:hasVoiceKey="true"
                         >
                             <Key
-                                latin:keyStyle="micKeyStyle"
+                                latin:keyStyle="shortcutKeyStyle"
                                 latin:keyWidth="9.2%p" />
                         </case>
                         <!-- latin:hasVoiceKey="false" -->
@@ -93,7 +93,7 @@
                             latin:hasVoiceKey="true"
                         >
                             <Key
-                                latin:keyStyle="micKeyStyle" />
+                                latin:keyStyle="shortcutKeyStyle" />
                         </case>
                         <!-- latin:hasVoiceKey="false" -->
                         <case
diff --git a/java/res/xml/kbd_symbols_f1.xml b/java/res/xml/kbd_symbols_f1.xml
index bd10477..da5b5fc 100644
--- a/java/res/xml/kbd_symbols_f1.xml
+++ b/java/res/xml/kbd_symbols_f1.xml
@@ -30,7 +30,7 @@
                     latin:hasVoiceKey="true"
                 >
                     <Key
-                        latin:keyStyle="micKeyStyle"
+                        latin:keyStyle="shortcutKeyStyle"
                         latin:keyWidth="9.2%p" />
                 </case>
                 <!-- latin:hasVoiceKey="false" -->
@@ -49,7 +49,7 @@
                     latin:hasVoiceKey="true"
                 >
                     <Key
-                        latin:keyStyle="micKeyStyle" />
+                        latin:keyStyle="shortcutKeyStyle" />
                 </case>
                 <!-- latin:hasVoiceKey="false" -->
                 <default>
diff --git a/java/res/xml/method.xml b/java/res/xml/method.xml
index 59b5b9d..c9c9203 100644
--- a/java/res/xml/method.xml
+++ b/java/res/xml/method.xml
@@ -73,6 +73,11 @@
             android:imeSubtypeLocale="de"
             android:imeSubtypeMode="keyboard"
     />
+    <subtype android:icon="@drawable/ic_subtype_keyboard"
+            android:label="@string/subtype_mode_de_qwerty_keyboard"
+            android:imeSubtypeLocale="de_ZZ"
+            android:imeSubtypeMode="keyboard"
+    />
 <!--     <subtype android:icon="@drawable/ic_subtype_mic" -->
 <!--             android:label="@string/subtype_mode_de_voice" -->
 <!--             android:imeSubtypeLocale="de" -->
diff --git a/java/src/com/android/inputmethod/compat/FrameLayoutCompatUtils.java b/java/src/com/android/inputmethod/compat/FrameLayoutCompatUtils.java
new file mode 100644
index 0000000..46499f1
--- /dev/null
+++ b/java/src/com/android/inputmethod/compat/FrameLayoutCompatUtils.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.inputmethod.compat;
+
+import android.view.ViewGroup;
+import android.view.ViewGroup.MarginLayoutParams;
+import android.widget.FrameLayout;
+import android.widget.RelativeLayout;
+
+public class FrameLayoutCompatUtils {
+    private static final boolean NEEDS_FRAME_LAYOUT_HACK = (
+            android.os.Build.VERSION.SDK_INT < 11 /* Honeycomb */);
+
+    public static ViewGroup getPlacer(ViewGroup container) {
+        if (NEEDS_FRAME_LAYOUT_HACK) {
+            // Insert RelativeLayout to be able to setMargin because pre-Honeycomb FrameLayout
+            // could not handle setMargin properly.
+            final ViewGroup placer = new RelativeLayout(container.getContext());
+            container.addView(placer);
+            return placer;
+        } else {
+            return container;
+        }
+    }
+
+    public static MarginLayoutParams newLayoutParam(ViewGroup placer, int width, int height) {
+        if (placer instanceof FrameLayout) {
+            return new FrameLayout.LayoutParams(width, height);
+        } else if (placer instanceof RelativeLayout) {
+            return new RelativeLayout.LayoutParams(width, height);
+        } else if (placer == null) {
+            throw new NullPointerException("placer is null");
+        } else {
+            throw new IllegalArgumentException("placer is neither FrameLayout nor RelativeLayout: "
+                    + placer.getClass().getName());
+        }
+    }
+}
diff --git a/java/src/com/android/inputmethod/deprecated/languageswitcher/InputLanguageSelection.java b/java/src/com/android/inputmethod/deprecated/languageswitcher/InputLanguageSelection.java
index fe70eef..cf6cd0f 100644
--- a/java/src/com/android/inputmethod/deprecated/languageswitcher/InputLanguageSelection.java
+++ b/java/src/com/android/inputmethod/deprecated/languageswitcher/InputLanguageSelection.java
@@ -16,7 +16,7 @@
 
 package com.android.inputmethod.deprecated.languageswitcher;
 
-import com.android.inputmethod.keyboard.KeyboardParser;
+import com.android.inputmethod.keyboard.internal.KeyboardParser;
 import com.android.inputmethod.latin.DictionaryFactory;
 import com.android.inputmethod.latin.R;
 import com.android.inputmethod.latin.Settings;
diff --git a/java/src/com/android/inputmethod/keyboard/KeyDetector.java b/java/src/com/android/inputmethod/keyboard/KeyDetector.java
index 7add43a..818f3f9 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyDetector.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyDetector.java
@@ -18,6 +18,8 @@
 
 import android.util.Log;
 
+import com.android.inputmethod.keyboard.internal.Key;
+
 import java.util.Arrays;
 import java.util.List;
 
diff --git a/java/src/com/android/inputmethod/keyboard/Keyboard.java b/java/src/com/android/inputmethod/keyboard/Keyboard.java
index 58629ba..889d54b 100644
--- a/java/src/com/android/inputmethod/keyboard/Keyboard.java
+++ b/java/src/com/android/inputmethod/keyboard/Keyboard.java
@@ -21,6 +21,10 @@
 import android.graphics.drawable.Drawable;
 import android.util.Log;
 
+import com.android.inputmethod.keyboard.internal.Key;
+import com.android.inputmethod.keyboard.internal.KeyboardIconsSet;
+import com.android.inputmethod.keyboard.internal.KeyboardParser;
+import com.android.inputmethod.keyboard.internal.KeyboardShiftState;
 import com.android.inputmethod.latin.R;
 
 import org.xmlpull.v1.XmlPullParserException;
@@ -51,7 +55,7 @@
  * </pre>
  */
 public class Keyboard {
-    private static final String TAG = "Keyboard";
+    private static final String TAG = Keyboard.class.getSimpleName();
 
     public static final int EDGE_LEFT = 0x01;
     public static final int EDGE_RIGHT = 0x02;
@@ -130,6 +134,8 @@
 
     public final KeyboardId mId;
 
+    public final KeyboardIconsSet mIconsSet = new KeyboardIconsSet();
+
     // Variables for pre-computing nearest keys.
 
     // TODO: Change GRID_WIDTH and GRID_HEIGHT to private.
@@ -448,7 +454,7 @@
         }
     }
 
-    protected static void setDefaultBounds(Drawable drawable)  {
+    public static void setDefaultBounds(Drawable drawable)  {
         if (drawable != null)
             drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),
                     drawable.getIntrinsicHeight());
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardId.java b/java/src/com/android/inputmethod/keyboard/KeyboardId.java
index d97bb67..2497eeb 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardId.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardId.java
@@ -42,7 +42,6 @@
     public final int mWidth;
     public final int mMode;
     public final int mXmlId;
-    public final int mColorScheme;
     public final boolean mNavigateAction;
     public final boolean mPasswordInput;
     public final boolean mHasSettingsKey;
@@ -56,9 +55,9 @@
 
     private final int mHashCode;
 
-    public KeyboardId(String xmlName, int xmlId, int colorScheme, Locale locale, int orientation,
-            int width, int mode, EditorInfo attribute, boolean hasSettingsKey,
-            boolean voiceKeyEnabled, boolean hasVoiceKey, boolean enableShiftLock) {
+    public KeyboardId(String xmlName, int xmlId, Locale locale, int orientation, int width,
+            int mode, EditorInfo attribute, boolean hasSettingsKey, boolean voiceKeyEnabled,
+            boolean hasVoiceKey, boolean enableShiftLock) {
         final int inputType = (attribute != null) ? attribute.inputType : 0;
         final int imeOptions = (attribute != null) ? attribute.imeOptions : 0;
         this.mLocale = locale;
@@ -66,7 +65,6 @@
         this.mWidth = width;
         this.mMode = mode;
         this.mXmlId = xmlId;
-        this.mColorScheme = colorScheme;
         // Note: Turn off checking navigation flag to show TAB key for now.
         this.mNavigateAction = InputTypeCompatUtils.isWebInputType(inputType);
 //                || EditorInfoCompatUtils.hasFlagNavigateNext(imeOptions)
@@ -91,7 +89,6 @@
                 width,
                 mode,
                 xmlId,
-                colorScheme,
                 mNavigateAction,
                 mPasswordInput,
                 hasSettingsKey,
@@ -103,15 +100,15 @@
     }
 
     public KeyboardId cloneWithNewLayout(String xmlName, int xmlId) {
-        return new KeyboardId(xmlName, xmlId, mColorScheme, mLocale, mOrientation, mWidth, mMode,
-                mAttribute, mHasSettingsKey, mVoiceKeyEnabled, mHasVoiceKey, mEnableShiftLock);
+        return new KeyboardId(xmlName, xmlId, mLocale, mOrientation, mWidth, mMode, mAttribute,
+                mHasSettingsKey, mVoiceKeyEnabled, mHasVoiceKey, mEnableShiftLock);
     }
 
     public KeyboardId cloneWithNewGeometry(int width) {
         if (mWidth == width)
             return this;
-        return new KeyboardId(mXmlName, mXmlId, mColorScheme, mLocale, mOrientation, width, mMode,
-                mAttribute, mHasSettingsKey, mVoiceKeyEnabled, mHasVoiceKey, mEnableShiftLock);
+        return new KeyboardId(mXmlName, mXmlId, mLocale, mOrientation, width, mMode, mAttribute,
+                mHasSettingsKey, mVoiceKeyEnabled, mHasVoiceKey, mEnableShiftLock);
     }
 
     public int getXmlId() {
@@ -145,7 +142,6 @@
             && other.mWidth == this.mWidth
             && other.mMode == this.mMode
             && other.mXmlId == this.mXmlId
-            && other.mColorScheme == this.mColorScheme
             && other.mNavigateAction == this.mNavigateAction
             && other.mPasswordInput == this.mPasswordInput
             && other.mHasSettingsKey == this.mHasSettingsKey
@@ -162,13 +158,12 @@
 
     @Override
     public String toString() {
-        return String.format("[%s.xml %s %s%d %s %s %s%s%s%s%s%s%s]",
+        return String.format("[%s.xml %s %s%d %s %s %s%s%s%s%s%s]",
                 mXmlName,
                 mLocale,
                 (mOrientation == 1 ? "port" : "land"), mWidth,
                 modeName(mMode),
                 EditorInfoCompatUtils.imeOptionsName(mImeAction),
-                colorSchemeName(mColorScheme),
                 (mNavigateAction ? " navigateAction" : ""),
                 (mPasswordInput ? " passwordInput" : ""),
                 (mHasSettingsKey ? " hasSettingsKey" : ""),
@@ -189,12 +184,4 @@
         }
         return null;
     }
-
-    public static String colorSchemeName(int colorScheme) {
-        switch (colorScheme) {
-        case KeyboardView.COLOR_SCHEME_WHITE: return "white";
-        case KeyboardView.COLOR_SCHEME_BLACK: return "black";
-        }
-        return null;
-    }
 }
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java b/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java
index 1218a5a..7c70168 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java
@@ -27,6 +27,9 @@
 import android.view.inputmethod.EditorInfo;
 
 import com.android.inputmethod.compat.InputMethodManagerCompatWrapper;
+import com.android.inputmethod.keyboard.internal.Key;
+import com.android.inputmethod.keyboard.internal.ModifierKeyState;
+import com.android.inputmethod.keyboard.internal.ShiftKeyState;
 import com.android.inputmethod.latin.LatinIME;
 import com.android.inputmethod.latin.LatinImeLogger;
 import com.android.inputmethod.latin.R;
@@ -255,7 +258,6 @@
     private KeyboardId getKeyboardId(EditorInfo attribute, boolean isSymbols) {
         final int mode = Utils.getKeyboardMode(attribute);
         final boolean hasVoiceKey = hasVoiceKey(isSymbols);
-        final int charColorId = getColorScheme();
         final int xmlId;
         final boolean enableShiftLock;
 
@@ -288,9 +290,8 @@
             mKeyboardWidth = res.getDisplayMetrics().widthPixels;
         final Locale locale = mSubtypeSwitcher.getInputLocale();
         return new KeyboardId(
-                res.getResourceEntryName(xmlId), xmlId, charColorId, locale, orientation,
-                mKeyboardWidth, mode, attribute, hasSettingsKey, mVoiceKeyEnabled, hasVoiceKey,
-                enableShiftLock);
+                res.getResourceEntryName(xmlId), xmlId, locale, orientation, mKeyboardWidth,
+                mode, attribute, hasSettingsKey, mVoiceKeyEnabled, hasVoiceKey, enableShiftLock);
     }
 
     private KeyboardId makeSiblingKeyboardId(KeyboardId base, int alphabet, int phone) {
@@ -785,11 +786,6 @@
         }
     }
 
-    private int getColorScheme() {
-        return (mKeyboardView != null)
-                ? mKeyboardView.getColorScheme() : KeyboardView.COLOR_SCHEME_WHITE;
-    }
-
     public void onAutoCorrectionStateChanged(boolean isAutoCorrection) {
         if (mIsAutoCorrectionActive != isAutoCorrection) {
             mIsAutoCorrectionActive = isAutoCorrection;
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardView.java b/java/src/com/android/inputmethod/keyboard/KeyboardView.java
index f73cdc0..4b16214 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardView.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardView.java
@@ -42,11 +42,14 @@
 import android.view.ViewConfiguration;
 import android.view.ViewGroup;
 import android.view.ViewGroup.MarginLayoutParams;
-import android.widget.FrameLayout;
-import android.widget.LinearLayout;
 import android.widget.PopupWindow;
 import android.widget.TextView;
 
+import com.android.inputmethod.compat.FrameLayoutCompatUtils;
+import com.android.inputmethod.keyboard.internal.Key;
+import com.android.inputmethod.keyboard.internal.MiniKeyboardBuilder;
+import com.android.inputmethod.keyboard.internal.PointerTrackerQueue;
+import com.android.inputmethod.keyboard.internal.SwipeTracker;
 import com.android.inputmethod.latin.LatinImeLogger;
 import com.android.inputmethod.latin.R;
 
@@ -59,7 +62,6 @@
  * presses and touch movements.
  *
  * @attr ref R.styleable#KeyboardView_backgroundDimAmount
- * @attr ref R.styleable#KeyboardView_colorScheme
  * @attr ref R.styleable#KeyboardView_keyBackground
  * @attr ref R.styleable#KeyboardView_keyHysteresisDistance
  * @attr ref R.styleable#KeyboardView_keyLetterRatio
@@ -88,9 +90,6 @@
     private static final boolean ENABLE_CAPSLOCK_BY_LONGPRESS = true;
     private static final boolean ENABLE_CAPSLOCK_BY_DOUBLETAP = true;
 
-    public static final int COLOR_SCHEME_WHITE = 0;
-    public static final int COLOR_SCHEME_BLACK = 1;
-
     // Timing constants
     private final int mKeyRepeatInterval;
 
@@ -106,7 +105,6 @@
     private final float mKeyLabelRatio;
     private final float mKeyHintLetterRatio;
     private final float mKeyUppercaseLetterRatio;
-    private final int mColorScheme;
     private final int mShadowColor;
     private final float mShadowRadius;
     private final Drawable mKeyBackground;
@@ -353,7 +351,6 @@
         mShadowRadius = a.getFloat(R.styleable.KeyboardView_shadowRadius, 0f);
         // TODO: Use Theme (android.R.styleable.Theme_backgroundDimAmount)
         mBackgroundDimAmount = a.getFloat(R.styleable.KeyboardView_backgroundDimAmount, 0.5f);
-        mColorScheme = a.getInt(R.styleable.KeyboardView_colorScheme, COLOR_SCHEME_WHITE);
         a.recycle();
 
         final Resources res = getResources();
@@ -562,10 +559,6 @@
         return mShowKeyPreviewPopup;
     }
 
-    public int getColorScheme() {
-        return mColorScheme;
-    }
-
     /**
      * When enabled, calls to {@link KeyboardActionListener#onCodeInput} will include key
      * codes for adjacent keys.  When disabled, only the primary key code will be
@@ -942,27 +935,12 @@
     }
 
     private void addKeyPreview(TextView keyPreview) {
-        ViewGroup placer = mPreviewPlacer;
-        if (placer == null) {
-            final FrameLayout screenContent = (FrameLayout) getRootView().findViewById(
-                    android.R.id.content);
-            if (android.os.Build.VERSION.SDK_INT >= /* HONEYCOMB */11) {
-                placer = screenContent;
-            } else {
-                // Insert LinearLayout to be able to setMargin because pre-Honeycomb FrameLayout
-                // could not handle setMargin properly.
-                placer = new LinearLayout(getContext());
-                screenContent.addView(placer);
-            }
-            mPreviewPlacer = placer;
+        if (mPreviewPlacer == null) {
+            mPreviewPlacer = FrameLayoutCompatUtils.getPlacer(
+                    (ViewGroup)getRootView().findViewById(android.R.id.content));
         }
-        if (placer instanceof FrameLayout) {
-            // Honeycomb or later.
-            placer.addView(keyPreview, new FrameLayout.LayoutParams(0, 0));
-        } else {
-            // Gingerbread or ealier.
-            placer.addView(keyPreview, new LinearLayout.LayoutParams(0, 0));
-        }
+        final ViewGroup placer = mPreviewPlacer;
+        placer.addView(keyPreview, FrameLayoutCompatUtils.newLayoutParam(placer, 0, 0));
     }
 
     // TODO: Introduce minimum duration for displaying key previews
diff --git a/java/src/com/android/inputmethod/keyboard/LatinKeyboard.java b/java/src/com/android/inputmethod/keyboard/LatinKeyboard.java
index 020fb56..e741625 100644
--- a/java/src/com/android/inputmethod/keyboard/LatinKeyboard.java
+++ b/java/src/com/android/inputmethod/keyboard/LatinKeyboard.java
@@ -33,6 +33,8 @@
 import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
 
+import com.android.inputmethod.keyboard.internal.Key;
+import com.android.inputmethod.keyboard.internal.SlidingLocaleDrawable;
 import com.android.inputmethod.latin.R;
 import com.android.inputmethod.latin.SubtypeSwitcher;
 
diff --git a/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java b/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java
index 901df6a..d25d1f0 100644
--- a/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java
+++ b/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java
@@ -24,6 +24,7 @@
 import android.view.MotionEvent;
 
 import com.android.inputmethod.deprecated.VoiceProxy;
+import com.android.inputmethod.keyboard.internal.Key;
 import com.android.inputmethod.latin.LatinImeLogger;
 import com.android.inputmethod.latin.Utils;
 
diff --git a/java/src/com/android/inputmethod/keyboard/MiniKeyboard.java b/java/src/com/android/inputmethod/keyboard/MiniKeyboard.java
index 2d6766f..d3d3fa5 100644
--- a/java/src/com/android/inputmethod/keyboard/MiniKeyboard.java
+++ b/java/src/com/android/inputmethod/keyboard/MiniKeyboard.java
@@ -18,6 +18,8 @@
 
 import android.content.Context;
 
+import com.android.inputmethod.keyboard.internal.Key;
+
 import java.util.List;
 
 public class MiniKeyboard extends Keyboard {
diff --git a/java/src/com/android/inputmethod/keyboard/MiniKeyboardKeyDetector.java b/java/src/com/android/inputmethod/keyboard/MiniKeyboardKeyDetector.java
index cc5c3bb..9170c3b 100644
--- a/java/src/com/android/inputmethod/keyboard/MiniKeyboardKeyDetector.java
+++ b/java/src/com/android/inputmethod/keyboard/MiniKeyboardKeyDetector.java
@@ -16,6 +16,8 @@
 
 package com.android.inputmethod.keyboard;
 
+import com.android.inputmethod.keyboard.internal.Key;
+
 import java.util.List;
 
 public class MiniKeyboardKeyDetector extends KeyDetector {
diff --git a/java/src/com/android/inputmethod/keyboard/PointerTracker.java b/java/src/com/android/inputmethod/keyboard/PointerTracker.java
index 0a727ad..1d70481 100644
--- a/java/src/com/android/inputmethod/keyboard/PointerTracker.java
+++ b/java/src/com/android/inputmethod/keyboard/PointerTracker.java
@@ -16,16 +16,19 @@
 
 package com.android.inputmethod.keyboard;
 
-import com.android.inputmethod.keyboard.KeyboardView.UIHandler;
-import com.android.inputmethod.latin.LatinImeLogger;
-import com.android.inputmethod.latin.R;
-import com.android.inputmethod.latin.SubtypeSwitcher;
-
 import android.content.res.Resources;
 import android.os.SystemClock;
 import android.util.Log;
 import android.view.MotionEvent;
 
+import com.android.inputmethod.keyboard.KeyboardView.UIHandler;
+import com.android.inputmethod.keyboard.internal.Key;
+import com.android.inputmethod.keyboard.internal.PointerTrackerKeyState;
+import com.android.inputmethod.keyboard.internal.PointerTrackerQueue;
+import com.android.inputmethod.latin.LatinImeLogger;
+import com.android.inputmethod.latin.R;
+import com.android.inputmethod.latin.SubtypeSwitcher;
+
 import java.util.Arrays;
 import java.util.List;
 
diff --git a/java/src/com/android/inputmethod/keyboard/PopupMiniKeyboardView.java b/java/src/com/android/inputmethod/keyboard/PopupMiniKeyboardView.java
index ff64c73..2085404 100644
--- a/java/src/com/android/inputmethod/keyboard/PopupMiniKeyboardView.java
+++ b/java/src/com/android/inputmethod/keyboard/PopupMiniKeyboardView.java
@@ -25,6 +25,7 @@
 import android.view.View;
 import android.widget.PopupWindow;
 
+import com.android.inputmethod.keyboard.internal.Key;
 import com.android.inputmethod.latin.R;
 
 /**
diff --git a/java/src/com/android/inputmethod/keyboard/PopupPanel.java b/java/src/com/android/inputmethod/keyboard/PopupPanel.java
index 6f2b161..72fa740 100644
--- a/java/src/com/android/inputmethod/keyboard/PopupPanel.java
+++ b/java/src/com/android/inputmethod/keyboard/PopupPanel.java
@@ -19,6 +19,8 @@
 import android.view.MotionEvent;
 import android.widget.PopupWindow;
 
+import com.android.inputmethod.keyboard.internal.Key;
+
 public interface PopupPanel {
     /**
      * Show popup panel.
diff --git a/java/src/com/android/inputmethod/keyboard/ProximityInfo.java b/java/src/com/android/inputmethod/keyboard/ProximityInfo.java
index 33acc69..a6a07e5 100644
--- a/java/src/com/android/inputmethod/keyboard/ProximityInfo.java
+++ b/java/src/com/android/inputmethod/keyboard/ProximityInfo.java
@@ -16,6 +16,7 @@
 
 package com.android.inputmethod.keyboard;
 
+import com.android.inputmethod.keyboard.internal.Key;
 import com.android.inputmethod.latin.Utils;
 
 import java.util.Arrays;
diff --git a/java/src/com/android/inputmethod/keyboard/Key.java b/java/src/com/android/inputmethod/keyboard/internal/Key.java
similarity index 94%
rename from java/src/com/android/inputmethod/keyboard/Key.java
rename to java/src/com/android/inputmethod/keyboard/internal/Key.java
index e5ee272..5470067 100644
--- a/java/src/com/android/inputmethod/keyboard/Key.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/Key.java
@@ -14,11 +14,7 @@
  * the License.
  */
 
-package com.android.inputmethod.keyboard;
-
-import com.android.inputmethod.keyboard.KeyStyles.KeyStyle;
-import com.android.inputmethod.keyboard.KeyboardParser.ParseException;
-import com.android.inputmethod.latin.R;
+package com.android.inputmethod.keyboard.internal;
 
 import android.content.res.Resources;
 import android.content.res.TypedArray;
@@ -27,6 +23,11 @@
 import android.text.TextUtils;
 import android.util.Xml;
 
+import com.android.inputmethod.keyboard.Keyboard;
+import com.android.inputmethod.keyboard.internal.KeyStyles.KeyStyle;
+import com.android.inputmethod.keyboard.internal.KeyboardParser.ParseException;
+import com.android.inputmethod.latin.R;
+
 import java.util.ArrayList;
 
 /**
@@ -164,7 +165,7 @@
         mLabel = PopupCharactersParser.getLabel(popupSpecification);
         mOutputText = PopupCharactersParser.getOutputText(popupSpecification);
         mCode = PopupCharactersParser.getCode(res, popupSpecification);
-        mIcon = PopupCharactersParser.getIcon(res, popupSpecification);
+        mIcon = keyboard.mIconsSet.getIcon(PopupCharactersParser.getIconId(popupSpecification));
         // Horizontal gap is divided equally to both sides of the key.
         mX = x + mGap / 2;
         mY = y;
@@ -262,13 +263,18 @@
             mEdgeFlags = style.getFlag(keyAttr, R.styleable.Keyboard_Key_keyEdgeFlags, 0)
                     | row.mRowEdgeFlags;
 
+            final KeyboardIconsSet iconsSet = mKeyboard.mIconsSet;
             mVisualInsetsLeft = KeyboardParser.getDimensionOrFraction(keyAttr,
                     R.styleable.Keyboard_Key_visualInsetsLeft, mKeyboard.getDisplayHeight(), 0);
             mVisualInsetsRight = KeyboardParser.getDimensionOrFraction(keyAttr,
                     R.styleable.Keyboard_Key_visualInsetsRight, mKeyboard.getDisplayHeight(), 0);
-            mPreviewIcon = style.getDrawable(keyAttr, R.styleable.Keyboard_Key_iconPreview);
+            mPreviewIcon = iconsSet.getIcon(style.getInt(
+                    keyAttr, R.styleable.Keyboard_Key_keyIconPreview,
+                    KeyboardIconsSet.ICON_UNDEFINED));
             Keyboard.setDefaultBounds(mPreviewIcon);
-            mIcon = style.getDrawable(keyAttr, R.styleable.Keyboard_Key_keyIcon);
+            mIcon = iconsSet.getIcon(style.getInt(
+                    keyAttr, R.styleable.Keyboard_Key_keyIcon,
+                    KeyboardIconsSet.ICON_UNDEFINED));
             Keyboard.setDefaultBounds(mIcon);
             mHintLetter = style.getText(keyAttr, R.styleable.Keyboard_Key_keyHintLetter);
 
@@ -287,8 +293,9 @@
                 mCode = Keyboard.CODE_DUMMY;
             }
 
-            final Drawable shiftedIcon = style.getDrawable(keyAttr,
-                    R.styleable.Keyboard_Key_shiftedIcon);
+            final Drawable shiftedIcon = iconsSet.getIcon(style.getInt(
+                    keyAttr, R.styleable.Keyboard_Key_keyIconShifted,
+                    KeyboardIconsSet.ICON_UNDEFINED));
             if (shiftedIcon != null)
                 mKeyboard.getShiftedIcons().put(this, shiftedIcon);
         } finally {
diff --git a/java/src/com/android/inputmethod/keyboard/KeyStyles.java b/java/src/com/android/inputmethod/keyboard/internal/KeyStyles.java
similarity index 90%
rename from java/src/com/android/inputmethod/keyboard/KeyStyles.java
rename to java/src/com/android/inputmethod/keyboard/internal/KeyStyles.java
index ce5ee54..983f064 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyStyles.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyStyles.java
@@ -14,16 +14,15 @@
  * the License.
  */
 
-package com.android.inputmethod.keyboard;
-
-import com.android.inputmethod.keyboard.KeyboardParser.ParseException;
-import com.android.inputmethod.latin.R;
+package com.android.inputmethod.keyboard.internal;
 
 import android.content.res.TypedArray;
 import android.content.res.XmlResourceParser;
-import android.graphics.drawable.Drawable;
 import android.util.Log;
 
+import com.android.inputmethod.keyboard.internal.KeyboardParser.ParseException;
+import com.android.inputmethod.latin.R;
+
 import java.util.ArrayList;
 import java.util.HashMap;
 
@@ -37,7 +36,6 @@
 
     public interface KeyStyle {
         public CharSequence[] getTextArray(TypedArray a, int index);
-        public Drawable getDrawable(TypedArray a, int index);
         public CharSequence getText(TypedArray a, int index);
         public int getInt(TypedArray a, int index, int defaultValue);
         public int getFlag(TypedArray a, int index, int defaultValue);
@@ -55,11 +53,6 @@
         }
 
         @Override
-        public Drawable getDrawable(TypedArray a, int index) {
-            return a.getDrawable(index);
-        }
-
-        @Override
         public CharSequence getText(TypedArray a, int index) {
             return a.getText(index);
         }
@@ -140,12 +133,6 @@
         }
 
         @Override
-        public Drawable getDrawable(TypedArray a, int index) {
-            return a.hasValue(index)
-                    ? super.getDrawable(a, index) : (Drawable)mAttributes.get(index);
-        }
-
-        @Override
         public CharSequence getText(TypedArray a, int index) {
             return a.hasValue(index)
                     ? super.getText(a, index) : (CharSequence)mAttributes.get(index);
@@ -177,25 +164,20 @@
             // TODO: Currently not all Key attributes can be declared as style.
             readInt(keyAttr, R.styleable.Keyboard_Key_code);
             readText(keyAttr, R.styleable.Keyboard_Key_keyLabel);
-            readFlag(keyAttr, R.styleable.Keyboard_Key_keyLabelOption);
-            readTextArray(keyAttr, R.styleable.Keyboard_Key_popupCharacters);
-            readInt(keyAttr, R.styleable.Keyboard_Key_maxPopupKeyboardColumn);
             readText(keyAttr, R.styleable.Keyboard_Key_keyOutputText);
-            readDrawable(keyAttr, R.styleable.Keyboard_Key_keyIcon);
-            readDrawable(keyAttr, R.styleable.Keyboard_Key_iconPreview);
             readText(keyAttr, R.styleable.Keyboard_Key_keyHintLetter);
-            readDrawable(keyAttr, R.styleable.Keyboard_Key_shiftedIcon);
+            readTextArray(keyAttr, R.styleable.Keyboard_Key_popupCharacters);
+            readFlag(keyAttr, R.styleable.Keyboard_Key_keyLabelOption);
+            readInt(keyAttr, R.styleable.Keyboard_Key_keyIcon);
+            readInt(keyAttr, R.styleable.Keyboard_Key_keyIconPreview);
+            readInt(keyAttr, R.styleable.Keyboard_Key_keyIconShifted);
+            readInt(keyAttr, R.styleable.Keyboard_Key_maxPopupKeyboardColumn);
             readBoolean(keyAttr, R.styleable.Keyboard_Key_isFunctional);
             readBoolean(keyAttr, R.styleable.Keyboard_Key_isSticky);
             readBoolean(keyAttr, R.styleable.Keyboard_Key_isRepeatable);
             readBoolean(keyAttr, R.styleable.Keyboard_Key_enabled);
         }
 
-        private void readDrawable(TypedArray a, int index) {
-            if (a.hasValue(index))
-                mAttributes.put(index, a.getDrawable(index));
-        }
-
         private void readText(TypedArray a, int index) {
             if (a.hasValue(index))
                 mAttributes.put(index, a.getText(index));
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardIconsSet.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardIconsSet.java
new file mode 100644
index 0000000..9916af5
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardIconsSet.java
@@ -0,0 +1,155 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.android.inputmethod.keyboard.internal;
+
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.graphics.drawable.Drawable;
+import android.util.Log;
+
+import com.android.inputmethod.keyboard.Keyboard;
+import com.android.inputmethod.latin.R;
+
+public class KeyboardIconsSet {
+    private static final String TAG = KeyboardIconsSet.class.getSimpleName();
+
+    public static final int ICON_UNDEFINED = 0;
+
+    // This should be aligned with Keyboard.keyIcon enum.
+    private static final int ICON_SHIFT_KEY = 1;
+    private static final int ICON_TO_SYMBOL_KEY = 2;
+    private static final int ICON_TO_SYMBOL_KEY_WITH_SHORTCUT = 3;
+    private static final int ICON_DELETE_KEY = 4;
+    private static final int ICON_SETTINGS_KEY = 5;
+    private static final int ICON_SHORTCUT_KEY = 6;
+    private static final int ICON_SPACE_KEY = 7;
+    private static final int ICON_RETURN_KEY = 8;
+    private static final int ICON_SEARCH_KEY = 9;
+    private static final int ICON_TAB_KEY = 10;
+    private static final int ICON_NUM1_KEY = 11;
+    private static final int ICON_NUM2_KEY = 12;
+    private static final int ICON_NUM3_KEY = 13;
+    private static final int ICON_NUM4_KEY = 14;
+    private static final int ICON_NUM5_KEY = 15;
+    private static final int ICON_NUM6_KEY = 16;
+    private static final int ICON_NUM7_KEY = 17;
+    private static final int ICON_NUM8_KEY = 18;
+    private static final int ICON_NUM9_KEY = 19;
+    private static final int ICON_NUM0_KEY = 20;
+    private static final int ICON_NUM_STAR_KEY = 21;
+    private static final int ICON_NUM_POUND_KEY = 22;
+    private static final int ICON_NUM_ALT_KEY = 23;
+    // This should be aligned with Keyboard.keyIconShifted enum.
+    private static final int ICON_SHIFTED_SHIFT_KEY = 24;
+    // This should be aligned with Keyboard.keyIconPreview enum.
+    private static final int ICON_PREVIEW_SPACE_KEY = 25;
+    private static final int ICON_PREVIEW_TAB_KEY = 26;
+    private static final int ICON_PREVIEW_SETTINGS_KEY = 27;
+    private static final int ICON_PREVIEW_SHORTCUT_KEY = 28;
+
+    private static final int ICON_LAST = 28;
+
+    private final Drawable mIcons[] = new Drawable[ICON_LAST + 1];
+
+    private static final int getIconId(int attrIndex) {
+        switch (attrIndex) {
+        case R.styleable.Keyboard_iconShiftKey:
+            return ICON_SHIFT_KEY;
+        case R.styleable.Keyboard_iconToSymbolKey:
+            return ICON_TO_SYMBOL_KEY;
+        case R.styleable.Keyboard_iconToSymbolKeyWithShortcut:
+            return ICON_TO_SYMBOL_KEY_WITH_SHORTCUT;
+        case R.styleable.Keyboard_iconDeleteKey:
+            return ICON_DELETE_KEY;
+        case R.styleable.Keyboard_iconSettingsKey:
+            return ICON_SETTINGS_KEY;
+        case R.styleable.Keyboard_iconShortcutKey:
+            return ICON_SHORTCUT_KEY;
+        case R.styleable.Keyboard_iconSpaceKey:
+            return ICON_SPACE_KEY;
+        case R.styleable.Keyboard_iconReturnKey:
+            return ICON_RETURN_KEY;
+        case R.styleable.Keyboard_iconSearchKey:
+            return ICON_SEARCH_KEY;
+        case R.styleable.Keyboard_iconTabKey:
+            return ICON_TAB_KEY;
+        case R.styleable.Keyboard_iconNum1Key:
+            return ICON_NUM1_KEY;
+        case R.styleable.Keyboard_iconNum2Key:
+            return ICON_NUM2_KEY;
+        case R.styleable.Keyboard_iconNum3Key:
+            return ICON_NUM3_KEY;
+        case R.styleable.Keyboard_iconNum4Key:
+            return ICON_NUM4_KEY;
+        case R.styleable.Keyboard_iconNum5Key:
+            return ICON_NUM5_KEY;
+        case R.styleable.Keyboard_iconNum6Key:
+            return ICON_NUM6_KEY;
+        case R.styleable.Keyboard_iconNum7Key:
+            return ICON_NUM7_KEY;
+        case R.styleable.Keyboard_iconNum8Key:
+            return ICON_NUM8_KEY;
+        case R.styleable.Keyboard_iconNum9Key:
+            return ICON_NUM9_KEY;
+        case R.styleable.Keyboard_iconNum0Key:
+            return ICON_NUM0_KEY;
+        case R.styleable.Keyboard_iconNumStarKey:
+            return ICON_NUM_STAR_KEY;
+        case R.styleable.Keyboard_iconNumPoundKey:
+            return ICON_NUM_POUND_KEY;
+        case R.styleable.Keyboard_iconNumAltKey:
+            return ICON_NUM_ALT_KEY;
+        case R.styleable.Keyboard_iconShiftedShiftKey:
+            return ICON_SHIFTED_SHIFT_KEY;
+        case R.styleable.Keyboard_iconPreviewSpaceKey:
+            return ICON_PREVIEW_SPACE_KEY;
+        case R.styleable.Keyboard_iconPreviewTabKey:
+            return ICON_PREVIEW_TAB_KEY;
+        case R.styleable.Keyboard_iconPreviewSettingsKey:
+            return ICON_PREVIEW_SETTINGS_KEY;
+        case R.styleable.Keyboard_iconPreviewShortcutKey:
+            return ICON_PREVIEW_SHORTCUT_KEY;
+        default:
+            return ICON_UNDEFINED;
+        }
+    }
+
+    public void loadIcons(TypedArray keyboardAttrs) {
+        final int count = keyboardAttrs.getIndexCount();
+        for (int i = 0; i < count; i++) {
+            final int attrIndex = keyboardAttrs.getIndex(i);
+            final int iconId = getIconId(attrIndex);
+            if (iconId != ICON_UNDEFINED) {
+                try {
+                    final Drawable icon = keyboardAttrs.getDrawable(attrIndex);
+                    Keyboard.setDefaultBounds(icon);
+                    mIcons[iconId] = icon;
+                } catch (Resources.NotFoundException e) {
+                    Log.w(TAG, "Drawable resource for icon #" + iconId + " not found");
+                }
+            }
+        }
+    }
+
+    public Drawable getIcon(int iconId) {
+        if (iconId == ICON_UNDEFINED)
+            return null;
+        if (iconId < 0 || iconId >= mIcons.length)
+            throw new IllegalArgumentException("icon id is out of range: " + iconId);
+        return mIcons[iconId];
+    }
+}
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardParser.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardParser.java
similarity index 96%
rename from java/src/com/android/inputmethod/keyboard/KeyboardParser.java
rename to java/src/com/android/inputmethod/keyboard/internal/KeyboardParser.java
index 20af12b..78546f8 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardParser.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardParser.java
@@ -14,7 +14,7 @@
  * the License.
  */
 
-package com.android.inputmethod.keyboard;
+package com.android.inputmethod.keyboard.internal;
 
 import android.content.Context;
 import android.content.res.Resources;
@@ -26,6 +26,8 @@
 import android.view.InflateException;
 
 import com.android.inputmethod.compat.EditorInfoCompatUtils;
+import com.android.inputmethod.keyboard.Keyboard;
+import com.android.inputmethod.keyboard.KeyboardId;
 import com.android.inputmethod.latin.R;
 
 import org.xmlpull.v1.XmlPullParser;
@@ -88,14 +90,14 @@
  * You can declare Key style and specify styles within Key tags.
  * <pre>
  *     &gt;switch&lt;
- *       &gt;case colorScheme="white"&lt;
- *         &gt;key-style styleName="shift-key" parentStyle="modifier-key"
- *           keyIcon="@drawable/sym_keyboard_shift"
+ *       &gt;case mode="email"&lt;
+ *         &gt;key-style styleName="f1-key" parentStyle="modifier-key"
+ *           keyLabel=".com"
  *         /&lt;
  *       &gt;/case&lt;
- *       &gt;case colorScheme="black"&lt;
- *         &gt;key-style styleName="shift-key" parentStyle="modifier-key"
- *           keyIcon="@drawable/sym_bkeyboard_shift"
+ *       &gt;case mode="url"&lt;
+ *         &gt;key-style styleName="f1-key" parentStyle="modifier-key"
+ *           keyLabel="http://"
  *         /&lt;
  *       &gt;/case&lt;
  *     &gt;/switch&lt;
@@ -230,6 +232,8 @@
 
             keyboard.setMaxPopupKeyboardColumn(keyAttr.getInt(
                     R.styleable.Keyboard_Key_maxPopupKeyboardColumn, 5));
+
+            mKeyboard.mIconsSet.loadIcons(keyboardAttr);
         } finally {
             keyAttr.recycle();
             keyboardAttr.recycle();
@@ -483,8 +487,6 @@
                     R.styleable.Keyboard_Case_voiceKeyEnabled, id.mVoiceKeyEnabled);
             final boolean voiceKeyMatched = matchBoolean(a,
                     R.styleable.Keyboard_Case_hasVoiceKey, id.mHasVoiceKey);
-            final boolean colorSchemeMatched = matchInteger(viewAttr,
-                    R.styleable.KeyboardView_colorScheme, id.mColorScheme);
             // As noted at {@link KeyboardId} class, we are interested only in enum value masked by
             // {@link android.view.inputmethod.EditorInfo#IME_MASK_ACTION} and
             // {@link android.view.inputmethod.EditorInfo#IME_FLAG_NO_ENTER_ACTION}. So matching
@@ -499,14 +501,11 @@
                     R.styleable.Keyboard_Case_countryCode, id.mLocale.getCountry());
             final boolean selected = modeMatched && navigateActionMatched && passwordInputMatched
                     && settingsKeyMatched && voiceEnabledMatched && voiceKeyMatched
-                    && colorSchemeMatched && imeActionMatched && localeCodeMatched
-                    && languageCodeMatched && countryCodeMatched;
+                    && imeActionMatched && localeCodeMatched && languageCodeMatched
+                    && countryCodeMatched;
 
-            if (DEBUG) Log.d(TAG, String.format("<%s%s%s%s%s%s%s%s%s%s%s%s> %s", TAG_CASE,
+            if (DEBUG) Log.d(TAG, String.format("<%s%s%s%s%s%s%s%s%s%s%s> %s", TAG_CASE,
                     textAttr(a.getString(R.styleable.Keyboard_Case_mode), "mode"),
-                    textAttr(KeyboardId.colorSchemeName(
-                            viewAttr.getInt(
-                                    R.styleable.KeyboardView_colorScheme, -1)), "colorScheme"),
                     booleanAttr(a, R.styleable.Keyboard_Case_navigateAction, "navigateAction"),
                     booleanAttr(a, R.styleable.Keyboard_Case_passwordInput, "passwordInput"),
                     booleanAttr(a, R.styleable.Keyboard_Case_hasSettingsKey, "hasSettingsKey"),
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardShiftState.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardShiftState.java
similarity index 97%
rename from java/src/com/android/inputmethod/keyboard/KeyboardShiftState.java
rename to java/src/com/android/inputmethod/keyboard/internal/KeyboardShiftState.java
index e015b51..0cde4e5 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardShiftState.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardShiftState.java
@@ -14,10 +14,12 @@
  * the License.
  */
 
-package com.android.inputmethod.keyboard;
+package com.android.inputmethod.keyboard.internal;
 
 import android.util.Log;
 
+import com.android.inputmethod.keyboard.KeyboardSwitcher;
+
 public class KeyboardShiftState {
     private static final String TAG = "KeyboardShiftState";
     private static final boolean DEBUG = KeyboardSwitcher.DEBUG_STATE;
diff --git a/java/src/com/android/inputmethod/keyboard/MiniKeyboardBuilder.java b/java/src/com/android/inputmethod/keyboard/internal/MiniKeyboardBuilder.java
similarity index 97%
rename from java/src/com/android/inputmethod/keyboard/MiniKeyboardBuilder.java
rename to java/src/com/android/inputmethod/keyboard/internal/MiniKeyboardBuilder.java
index 6e93912..01faae6 100644
--- a/java/src/com/android/inputmethod/keyboard/MiniKeyboardBuilder.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/MiniKeyboardBuilder.java
@@ -14,15 +14,18 @@
  * the License.
  */
 
-package com.android.inputmethod.keyboard;
-
-import com.android.inputmethod.latin.R;
+package com.android.inputmethod.keyboard.internal;
 
 import android.content.Context;
 import android.content.res.Resources;
 import android.graphics.Paint;
 import android.graphics.Rect;
 
+import com.android.inputmethod.keyboard.Keyboard;
+import com.android.inputmethod.keyboard.KeyboardView;
+import com.android.inputmethod.keyboard.MiniKeyboard;
+import com.android.inputmethod.latin.R;
+
 import java.util.List;
 
 public class MiniKeyboardBuilder {
diff --git a/java/src/com/android/inputmethod/keyboard/ModifierKeyState.java b/java/src/com/android/inputmethod/keyboard/internal/ModifierKeyState.java
similarity index 95%
rename from java/src/com/android/inputmethod/keyboard/ModifierKeyState.java
rename to java/src/com/android/inputmethod/keyboard/internal/ModifierKeyState.java
index ebbc79a..dae73c4 100644
--- a/java/src/com/android/inputmethod/keyboard/ModifierKeyState.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/ModifierKeyState.java
@@ -14,10 +14,12 @@
  * the License.
  */
 
-package com.android.inputmethod.keyboard;
+package com.android.inputmethod.keyboard.internal;
 
 import android.util.Log;
 
+import com.android.inputmethod.keyboard.KeyboardSwitcher;
+
 public class ModifierKeyState {
     protected static final String TAG = "ModifierKeyState";
     protected static final boolean DEBUG = KeyboardSwitcher.DEBUG_STATE;
diff --git a/java/src/com/android/inputmethod/keyboard/PointerTrackerKeyState.java b/java/src/com/android/inputmethod/keyboard/internal/PointerTrackerKeyState.java
similarity index 92%
rename from java/src/com/android/inputmethod/keyboard/PointerTrackerKeyState.java
rename to java/src/com/android/inputmethod/keyboard/internal/PointerTrackerKeyState.java
index eecbb26..ddadb13 100644
--- a/java/src/com/android/inputmethod/keyboard/PointerTrackerKeyState.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/PointerTrackerKeyState.java
@@ -14,12 +14,15 @@
  * the License.
  */
 
-package com.android.inputmethod.keyboard;
+package com.android.inputmethod.keyboard.internal;
+
+import com.android.inputmethod.keyboard.KeyDetector;
+import com.android.inputmethod.keyboard.PointerTracker;
 
 /**
  * This class keeps track of a key index and a position where {@link PointerTracker} is.
  */
-/* package */ class PointerTrackerKeyState {
+public class PointerTrackerKeyState {
     private final KeyDetector mKeyDetector;
 
     // The position and time at which first down event occurred.
diff --git a/java/src/com/android/inputmethod/keyboard/PointerTrackerQueue.java b/java/src/com/android/inputmethod/keyboard/internal/PointerTrackerQueue.java
similarity index 95%
rename from java/src/com/android/inputmethod/keyboard/PointerTrackerQueue.java
rename to java/src/com/android/inputmethod/keyboard/internal/PointerTrackerQueue.java
index 9e287c6..f87cd86 100644
--- a/java/src/com/android/inputmethod/keyboard/PointerTrackerQueue.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/PointerTrackerQueue.java
@@ -14,7 +14,9 @@
  * the License.
  */
 
-package com.android.inputmethod.keyboard;
+package com.android.inputmethod.keyboard.internal;
+
+import com.android.inputmethod.keyboard.PointerTracker;
 
 import java.util.LinkedList;
 
diff --git a/java/src/com/android/inputmethod/keyboard/PopupCharactersParser.java b/java/src/com/android/inputmethod/keyboard/internal/PopupCharactersParser.java
similarity index 88%
rename from java/src/com/android/inputmethod/keyboard/PopupCharactersParser.java
rename to java/src/com/android/inputmethod/keyboard/internal/PopupCharactersParser.java
index ff78ee5..8276f5d 100644
--- a/java/src/com/android/inputmethod/keyboard/PopupCharactersParser.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/PopupCharactersParser.java
@@ -14,13 +14,14 @@
  * the License.
  */
 
-package com.android.inputmethod.keyboard;
-
-import com.android.inputmethod.latin.R;
+package com.android.inputmethod.keyboard.internal;
 
 import android.content.res.Resources;
-import android.graphics.drawable.Drawable;
 import android.text.TextUtils;
+import android.util.Log;
+
+import com.android.inputmethod.keyboard.Keyboard;
+import com.android.inputmethod.latin.R;
 
 /**
  * String parser of popupCharacters attribute of Key.
@@ -28,16 +29,19 @@
  * Each popup key text is one of the following:
  * - A single letter (Letter)
  * - Label optionally followed by keyOutputText or code (keyLabel|keyOutputText).
- * - Icon followed by keyOutputText or code (@drawable/icon|@integer/key_code)
+ * - Icon followed by keyOutputText or code (@icon/icon_number|@integer/key_code)
  * Special character, comma ',' backslash '\', and bar '|' can be escaped by '\'
  * character.
  * Note that the character '@' and '\' are also parsed by XML parser and CSV parser as well.
+ * See {@link KeyboardIconsSet} about icon_number.
  */
 public class PopupCharactersParser {
+    private static final String TAG = PopupCharactersParser.class.getSimpleName();
+
     private static final char ESCAPE = '\\';
     private static final String LABEL_END = "|";
     private static final String PREFIX_AT = "@";
-    private static final String PREFIX_ICON = PREFIX_AT + "drawable/";
+    private static final String PREFIX_ICON = PREFIX_AT + "icon/";
     private static final String PREFIX_CODE = PREFIX_AT + "integer/";
 
     private PopupCharactersParser() {
@@ -150,13 +154,18 @@
         return Keyboard.CODE_DUMMY;
     }
 
-    public static Drawable getIcon(Resources res, String popupSpec) {
+    public static int getIconId(String popupSpec) {
         if (hasIcon(popupSpec)) {
             int end = popupSpec.indexOf(LABEL_END, PREFIX_ICON.length() + 1);
-            int resId = getResourceId(res, popupSpec.substring(PREFIX_AT.length(), end));
-            return res.getDrawable(resId);
+            final String iconId = popupSpec.substring(PREFIX_ICON.length(), end);
+            try {
+                return Integer.valueOf(iconId);
+            } catch (NumberFormatException e) {
+                Log.w(TAG, "illegal icon id specified: " + iconId);
+                return KeyboardIconsSet.ICON_UNDEFINED;
+            }
         }
-        return null;
+        return KeyboardIconsSet.ICON_UNDEFINED;
     }
 
     private static int getResourceId(Resources res, String name) {
diff --git a/java/src/com/android/inputmethod/keyboard/Row.java b/java/src/com/android/inputmethod/keyboard/internal/Row.java
similarity index 96%
rename from java/src/com/android/inputmethod/keyboard/Row.java
rename to java/src/com/android/inputmethod/keyboard/internal/Row.java
index 40d7e14..06aadcc 100644
--- a/java/src/com/android/inputmethod/keyboard/Row.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/Row.java
@@ -14,15 +14,16 @@
  * the License.
  */
 
-package com.android.inputmethod.keyboard;
-
-import com.android.inputmethod.latin.R;
+package com.android.inputmethod.keyboard.internal;
 
 import android.content.res.Resources;
 import android.content.res.TypedArray;
 import android.content.res.XmlResourceParser;
 import android.util.Xml;
 
+import com.android.inputmethod.keyboard.Keyboard;
+import com.android.inputmethod.latin.R;
+
 /**
  * Container for keys in the keyboard. All keys in a row are at the same Y-coordinate.
  * Some of the key size defaults can be overridden per row from what the {@link Keyboard}
diff --git a/java/src/com/android/inputmethod/keyboard/ShiftKeyState.java b/java/src/com/android/inputmethod/keyboard/internal/ShiftKeyState.java
similarity index 97%
rename from java/src/com/android/inputmethod/keyboard/ShiftKeyState.java
rename to java/src/com/android/inputmethod/keyboard/internal/ShiftKeyState.java
index ba15624..6617b91 100644
--- a/java/src/com/android/inputmethod/keyboard/ShiftKeyState.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/ShiftKeyState.java
@@ -14,7 +14,7 @@
  * the License.
  */
 
-package com.android.inputmethod.keyboard;
+package com.android.inputmethod.keyboard.internal;
 
 import android.util.Log;
 
diff --git a/java/src/com/android/inputmethod/keyboard/SlidingLocaleDrawable.java b/java/src/com/android/inputmethod/keyboard/internal/SlidingLocaleDrawable.java
similarity index 96%
rename from java/src/com/android/inputmethod/keyboard/SlidingLocaleDrawable.java
rename to java/src/com/android/inputmethod/keyboard/internal/SlidingLocaleDrawable.java
index dd271de..df4b575 100644
--- a/java/src/com/android/inputmethod/keyboard/SlidingLocaleDrawable.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/SlidingLocaleDrawable.java
@@ -14,7 +14,7 @@
  * the License.
  */
 
-package com.android.inputmethod.keyboard;
+package com.android.inputmethod.keyboard.internal;
 
 import android.content.Context;
 import android.content.res.TypedArray;
@@ -28,6 +28,8 @@
 import android.text.TextPaint;
 import android.view.ViewConfiguration;
 
+import com.android.inputmethod.keyboard.Keyboard;
+import com.android.inputmethod.keyboard.LatinKeyboard;
 import com.android.inputmethod.latin.R;
 import com.android.inputmethod.latin.SubtypeSwitcher;
 
@@ -78,7 +80,7 @@
         mThreshold = ViewConfiguration.get(context).getScaledTouchSlop();
     }
 
-    void setDiff(int diff) {
+    public void setDiff(int diff) {
         if (diff == Integer.MAX_VALUE) {
             mHitThreshold = false;
             mCurrentLanguage = null;
diff --git a/java/src/com/android/inputmethod/keyboard/SwipeTracker.java b/java/src/com/android/inputmethod/keyboard/internal/SwipeTracker.java
similarity index 98%
rename from java/src/com/android/inputmethod/keyboard/SwipeTracker.java
rename to java/src/com/android/inputmethod/keyboard/internal/SwipeTracker.java
index 975b13b..8d192c2 100644
--- a/java/src/com/android/inputmethod/keyboard/SwipeTracker.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/SwipeTracker.java
@@ -14,7 +14,7 @@
  * the License.
  */
 
-package com.android.inputmethod.keyboard;
+package com.android.inputmethod.keyboard.internal;
 
 import android.view.MotionEvent;
 
diff --git a/java/src/com/android/inputmethod/latin/CandidateView.java b/java/src/com/android/inputmethod/latin/CandidateView.java
index fa27ca5..09b356d 100644
--- a/java/src/com/android/inputmethod/latin/CandidateView.java
+++ b/java/src/com/android/inputmethod/latin/CandidateView.java
@@ -44,6 +44,7 @@
 import android.widget.PopupWindow;
 import android.widget.TextView;
 
+import com.android.inputmethod.compat.FrameLayoutCompatUtils;
 import com.android.inputmethod.compat.LinearLayoutCompatUtils;
 import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
 
@@ -244,7 +245,8 @@
     public void setListener(Listener listener, View inputView) {
         mListener = listener;
         mKeyboardView = inputView.findViewById(R.id.keyboard_view);
-        mCandidatesPane = (ViewGroup)inputView.findViewById(R.id.candidates_pane);
+        mCandidatesPane = FrameLayoutCompatUtils.getPlacer(
+                (ViewGroup)inputView.findViewById(R.id.candidates_pane));
         mCandidatesPane.setOnClickListener(this);
         mCandidatesPaneContainer = (ViewGroup)inputView.findViewById(
                 R.id.candidates_pane_container);
@@ -346,12 +348,10 @@
                 }
                 if (x != 0) {
                     final View divider = mDividers.get(i - NUM_CANDIDATES_IN_STRIP);
-                    mCandidatesPane.addView(divider);
-                    placeCandidateAt(divider, x, y);
+                    addCandidateAt(divider, x, y);
                     x += dividerWidth;
                 }
-                mCandidatesPane.addView(tv);
-                placeCandidateAt(tv, x, y);
+                addCandidateAt(tv, x, y);
                 x += width;
             }
 
@@ -372,14 +372,13 @@
         }
     }
 
-    private void placeCandidateAt(View v, int x, int y) {
-        ViewGroup.LayoutParams lp = v.getLayoutParams();
-        if (lp instanceof ViewGroup.MarginLayoutParams) {
-            ViewGroup.MarginLayoutParams mlp = (ViewGroup.MarginLayoutParams)lp;
-            mlp.width = v.getMeasuredWidth();
-            mlp.height = v.getMeasuredHeight();
-            mlp.setMargins(x, y + (mCandidateStripHeight - mlp.height) / 2, 0, 0);
-        }
+    private void addCandidateAt(View v, int x, int y) {
+        final int width = v.getMeasuredWidth();
+        final int height = v.getMeasuredHeight();
+        final MarginLayoutParams marginLayoutParams = FrameLayoutCompatUtils.newLayoutParam(
+                mCandidatesPane, width, height);
+        marginLayoutParams.setMargins(x, y + (mCandidateStripHeight - height) / 2, 0, 0);
+        mCandidatesPane.addView(v, marginLayoutParams);
     }
 
     private void centeringCandidates(int from, int to, int width, int paneWidth) {
diff --git a/tests/src/com/android/inputmethod/keyboard/PopupCharactersParserTests.java b/tests/src/com/android/inputmethod/keyboard/PopupCharactersParserTests.java
deleted file mode 100644
index ae78866..0000000
--- a/tests/src/com/android/inputmethod/keyboard/PopupCharactersParserTests.java
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.android.inputmethod.keyboard;
-
-import com.android.inputmethod.latin.R;
-import android.content.res.Resources;
-import android.graphics.drawable.Drawable;
-import android.test.AndroidTestCase;
-
-public class PopupCharactersParserTests extends AndroidTestCase {
-    private Resources mRes;
-
-    private static final String CODE_SETTINGS = "@integer/key_settings";
-    private static final String ICON_SETTINGS = "@drawable/sym_keyboard_settings";
-    private static final String CODE_NON_EXISTING = "@integer/non_existing";
-    private static final String ICON_NON_EXISTING = "@drawable/non_existing";
-
-    private int mCodeSettings;
-    private Drawable mIconSettings;
-
-    @Override
-    protected void setUp() {
-        Resources res = getContext().getResources();
-        mRes = res;
-
-        final String packageName = res.getResourcePackageName(R.string.english_ime_name);
-        final int codeId = res.getIdentifier(CODE_SETTINGS.substring(1), null, packageName);
-        final int iconId = res.getIdentifier(ICON_SETTINGS.substring(1), null, packageName);
-        mCodeSettings = res.getInteger(codeId);
-        mIconSettings = res.getDrawable(iconId);
-    }
-
-    private void assertParser(String message, String popupSpec, String expectedLabel,
-            String expectedOutputText, Drawable expectedIcon, int expectedCode) {
-        String actualLabel = PopupCharactersParser.getLabel(popupSpec);
-        assertEquals(message + ": label:", expectedLabel, actualLabel);
-
-        String actualOutputText = PopupCharactersParser.getOutputText(popupSpec);
-        assertEquals(message + ": ouptputText:", expectedOutputText, actualOutputText);
-
-        Drawable actualIcon = PopupCharactersParser.getIcon(mRes, popupSpec);
-        // We can not compare drawables, checking null or non-null instead.
-        if (expectedIcon == null) {
-            assertNull(message + ": icon null:", actualIcon);
-        } else {
-            assertNotNull(message + ": icon non-null:", actualIcon);
-        }
-
-        int actualCode = PopupCharactersParser.getCode(mRes, popupSpec);
-        assertEquals(message + ": codes value:", expectedCode, actualCode);
-    }
-
-    private void assertParserError(String message, String popupSpec, String expectedLabel,
-            String expectedOutputText, Drawable expectedIcon, int expectedCode) {
-        try {
-            assertParser(message, popupSpec, expectedLabel, expectedOutputText, expectedIcon,
-                    expectedCode);
-            fail(message);
-        } catch (PopupCharactersParser.PopupCharactersParserError pcpe) {
-            // success.
-        }
-    }
-
-    public void testSingleLetter() {
-        assertParser("Single letter", "a", "a", null, null, 'a');
-        assertParser("Single escaped bar", "\\|", "|", null, null, '|');
-        assertParser("Single escaped escape", "\\\\", "\\", null, null, '\\');
-        assertParser("Single comma", ",", ",", null, null, ',');
-        assertParser("Single escaped comma", "\\,", ",", null, null, ',');
-        assertParser("Single escaped letter", "\\a", "a", null, null, 'a');
-        assertParser("Single at", "@", "@", null, null, '@');
-        assertParser("Single escaped at", "\\@", "@", null, null, '@');
-        assertParser("Single letter with outputText", "a|abc", "a", "abc", null,
-                Keyboard.CODE_DUMMY);
-        assertParser("Single letter with escaped outputText", "a|a\\|c", "a", "a|c", null,
-                Keyboard.CODE_DUMMY);
-        assertParser("Single letter with comma outputText", "a|a,b", "a", "a,b", null,
-                Keyboard.CODE_DUMMY);
-        assertParser("Single letter with escaped comma outputText", "a|a\\,b", "a", "a,b", null,
-                Keyboard.CODE_DUMMY);
-        assertParser("Single letter with outputText starts with at", "a|@bc", "a", "@bc", null,
-                Keyboard.CODE_DUMMY);
-        assertParser("Single letter with outputText contains at", "a|a@c", "a", "a@c", null,
-                Keyboard.CODE_DUMMY);
-        assertParser("Single letter with escaped at outputText", "a|\\@bc", "a", "@bc", null,
-                Keyboard.CODE_DUMMY);
-        assertParser("Single escaped escape with outputText", "\\\\|\\\\", "\\", "\\", null,
-                Keyboard.CODE_DUMMY);
-        assertParser("Single escaped bar with outputText", "\\||\\|", "|", "|", null,
-                Keyboard.CODE_DUMMY);
-        assertParser("Single letter with code", "a|" + CODE_SETTINGS, "a", null, null,
-                mCodeSettings);
-    }
-
-    public void testLabel() {
-        assertParser("Simple label", "abc", "abc", "abc", null, Keyboard.CODE_DUMMY);
-        assertParser("Label with escaped bar", "a\\|c", "a|c", "a|c", null,
-                Keyboard.CODE_DUMMY);
-        assertParser("Label with escaped escape", "a\\\\c", "a\\c", "a\\c", null,
-                Keyboard.CODE_DUMMY);
-        assertParser("Label with comma", "a,c", "a,c", "a,c", null, Keyboard.CODE_DUMMY);
-        assertParser("Label with escaped comma", "a\\,c", "a,c", "a,c", null,
-                Keyboard.CODE_DUMMY);
-        assertParser("Label starts with at", "@bc", "@bc", "@bc", null, Keyboard.CODE_DUMMY);
-        assertParser("Label contains at", "a@c", "a@c", "a@c", null, Keyboard.CODE_DUMMY);
-        assertParser("Label with escaped at", "\\@bc", "@bc", "@bc", null,
-                Keyboard.CODE_DUMMY);
-        assertParser("Label with escaped letter", "\\abc", "abc", "abc", null,
-                Keyboard.CODE_DUMMY);
-        assertParser("Label with outputText", "abc|def", "abc", "def", null,
-                Keyboard.CODE_DUMMY);
-        assertParser("Label with comma and outputText", "a,c|def", "a,c", "def", null,
-                Keyboard.CODE_DUMMY);
-        assertParser("Escaped comma label with outputText", "a\\,c|def", "a,c", "def", null,
-                Keyboard.CODE_DUMMY);
-        assertParser("Escaped label with outputText", "a\\|c|def", "a|c", "def", null,
-                Keyboard.CODE_DUMMY);
-        assertParser("Label with escaped bar outputText", "abc|d\\|f", "abc", "d|f", null,
-                Keyboard.CODE_DUMMY);
-        assertParser("Escaped escape label with outputText", "a\\\\|def", "a\\", "def", null,
-                Keyboard.CODE_DUMMY);
-        assertParser("Label starts with at and outputText", "@bc|def", "@bc", "def", null,
-                Keyboard.CODE_DUMMY);
-        assertParser("Label contains at label and outputText", "a@c|def", "a@c", "def", null,
-                Keyboard.CODE_DUMMY);
-        assertParser("Escaped at label with outputText", "\\@bc|def", "@bc", "def", null,
-                Keyboard.CODE_DUMMY);
-        assertParser("Label with comma outputText", "abc|a,b", "abc", "a,b", null,
-                Keyboard.CODE_DUMMY);
-        assertParser("Label with escaped comma outputText", "abc|a\\,b", "abc", "a,b", null,
-                Keyboard.CODE_DUMMY);
-        assertParser("Label with outputText starts with at", "abc|@bc", "abc", "@bc", null,
-                Keyboard.CODE_DUMMY);
-        assertParser("Label with outputText contains at", "abc|a@c", "abc", "a@c", null,
-                Keyboard.CODE_DUMMY);
-        assertParser("Label with escaped at outputText", "abc|\\@bc", "abc", "@bc", null,
-                Keyboard.CODE_DUMMY);
-        assertParser("Label with escaped bar outputText", "abc|d\\|f", "abc", "d|f",
-                null, Keyboard.CODE_DUMMY);
-        assertParser("Escaped bar label with escaped bar outputText", "a\\|c|d\\|f", "a|c", "d|f",
-                null, Keyboard.CODE_DUMMY);
-        assertParser("Label with code", "abc|" + CODE_SETTINGS, "abc", null, null, mCodeSettings);
-        assertParser("Escaped label with code", "a\\|c|" + CODE_SETTINGS, "a|c", null, null,
-                mCodeSettings);
-    }
-
-    public void testIconAndCode() {
-        assertParser("Icon with outputText", ICON_SETTINGS + "|abc", null, "abc", mIconSettings,
-                Keyboard.CODE_DUMMY);
-        assertParser("Icon with outputText starts with at", ICON_SETTINGS + "|@bc", null, "@bc",
-                mIconSettings, Keyboard.CODE_DUMMY);
-        assertParser("Icon with outputText contains at", ICON_SETTINGS + "|a@c", null, "a@c",
-                mIconSettings, Keyboard.CODE_DUMMY);
-        assertParser("Icon with escaped at outputText", ICON_SETTINGS + "|\\@bc", null, "@bc",
-                mIconSettings, Keyboard.CODE_DUMMY);
-        assertParser("Label starts with at and code", "@bc|" + CODE_SETTINGS, "@bc", null, null,
-                mCodeSettings);
-        assertParser("Label contains at and code", "a@c|" + CODE_SETTINGS, "a@c", null, null,
-                mCodeSettings);
-        assertParser("Escaped at label with code", "\\@bc|" + CODE_SETTINGS, "@bc", null, null,
-                mCodeSettings);
-        assertParser("Icon with code", ICON_SETTINGS + "|" + CODE_SETTINGS, null, null,
-                mIconSettings, mCodeSettings);
-    }
-
-    public void testFormatError() {
-        assertParserError("Empty spec", "", null, null, null, Keyboard.CODE_UNSPECIFIED);
-        assertParserError("Empty label with outputText", "|a", null, "a", null,
-                Keyboard.CODE_DUMMY);
-        assertParserError("Empty label with code", "|" + CODE_SETTINGS, null, null, null,
-                mCodeSettings);
-        assertParserError("Empty outputText with label", "a|", "a", null, null,
-                Keyboard.CODE_UNSPECIFIED);
-        assertParserError("Empty outputText with icon", ICON_SETTINGS + "|", null, null,
-                mIconSettings, Keyboard.CODE_UNSPECIFIED);
-        assertParserError("Empty icon and code", "|", null, null, null, Keyboard.CODE_UNSPECIFIED);
-        assertParserError("Icon without code", ICON_SETTINGS, null, null, mIconSettings,
-                Keyboard.CODE_DUMMY);
-        assertParserError("Non existing icon", ICON_NON_EXISTING + "|abc", null, "abc", null,
-                Keyboard.CODE_DUMMY);
-        assertParserError("Non existing code", "abc|" + CODE_NON_EXISTING, "abc", null, null,
-                Keyboard.CODE_UNSPECIFIED);
-        assertParserError("Third bar at end", "a|b|", "a", null, null, Keyboard.CODE_UNSPECIFIED);
-        assertParserError("Multiple bar", "a|b|c", "a", null, null, Keyboard.CODE_UNSPECIFIED);
-        assertParserError("Multiple bar with label and code", "a|" + CODE_SETTINGS + "|c", "a",
-                null, null, mCodeSettings);
-        assertParserError("Multiple bar with icon and outputText", ICON_SETTINGS + "|b|c", null,
-                null, mIconSettings, Keyboard.CODE_UNSPECIFIED);
-        assertParserError("Multiple bar with icon and code",
-                ICON_SETTINGS + "|" + CODE_SETTINGS + "|c", null, null, mIconSettings,
-                mCodeSettings);
-    }
-}
diff --git a/tests/src/com/android/inputmethod/keyboard/KeyStylesTests.java b/tests/src/com/android/inputmethod/keyboard/internal/KeyStylesTests.java
similarity index 96%
rename from tests/src/com/android/inputmethod/keyboard/KeyStylesTests.java
rename to tests/src/com/android/inputmethod/keyboard/internal/KeyStylesTests.java
index 5dff114..4050a71 100644
--- a/tests/src/com/android/inputmethod/keyboard/KeyStylesTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/internal/KeyStylesTests.java
@@ -14,9 +14,9 @@
  * the License.
  */
 
-package com.android.inputmethod.keyboard;
+package com.android.inputmethod.keyboard.internal;
 
-import com.android.inputmethod.keyboard.KeyStyles.EmptyKeyStyle;
+import com.android.inputmethod.keyboard.internal.KeyStyles.EmptyKeyStyle;
 
 import android.test.AndroidTestCase;
 import android.text.TextUtils;
diff --git a/tests/src/com/android/inputmethod/keyboard/MiniKeyboardBuilderTests.java b/tests/src/com/android/inputmethod/keyboard/internal/MiniKeyboardBuilderTests.java
similarity index 99%
rename from tests/src/com/android/inputmethod/keyboard/MiniKeyboardBuilderTests.java
rename to tests/src/com/android/inputmethod/keyboard/internal/MiniKeyboardBuilderTests.java
index 600342a..0d2802d 100644
--- a/tests/src/com/android/inputmethod/keyboard/MiniKeyboardBuilderTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/internal/MiniKeyboardBuilderTests.java
@@ -14,9 +14,9 @@
  * the License.
  */
 
-package com.android.inputmethod.keyboard;
+package com.android.inputmethod.keyboard.internal;
 
-import com.android.inputmethod.keyboard.MiniKeyboardBuilder.MiniKeyboardLayoutParams;
+import com.android.inputmethod.keyboard.internal.MiniKeyboardBuilder.MiniKeyboardLayoutParams;
 
 import android.test.AndroidTestCase;
 
diff --git a/tests/src/com/android/inputmethod/keyboard/internal/PopupCharactersParserTests.java b/tests/src/com/android/inputmethod/keyboard/internal/PopupCharactersParserTests.java
new file mode 100644
index 0000000..e4a1c68
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/internal/PopupCharactersParserTests.java
@@ -0,0 +1,220 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.android.inputmethod.keyboard.internal;
+
+import android.content.res.Resources;
+import android.test.AndroidTestCase;
+
+import com.android.inputmethod.keyboard.Keyboard;
+import com.android.inputmethod.latin.R;
+
+public class PopupCharactersParserTests extends AndroidTestCase {
+    private Resources mRes;
+
+    private static final int ICON_SETTINGS_KEY = 5;
+    private static final int ICON_UNDEFINED = KeyboardIconsSet.ICON_UNDEFINED;
+
+    private static final String CODE_SETTINGS = "@integer/key_settings";
+    private static final String ICON_SETTINGS = "@icon/" + ICON_SETTINGS_KEY;
+    private static final String CODE_NON_EXISTING = "@integer/non_existing";
+    private static final String ICON_NON_EXISTING = "@icon/non_existing";
+
+    private int mCodeSettings;
+
+    @Override
+    protected void setUp() {
+        Resources res = getContext().getResources();
+        mRes = res;
+
+        final String packageName = res.getResourcePackageName(R.string.english_ime_name);
+        final int codeId = res.getIdentifier(CODE_SETTINGS.substring(1), null, packageName);
+        mCodeSettings = res.getInteger(codeId);
+    }
+
+    private void assertParser(String message, String popupSpec, String expectedLabel,
+            String expectedOutputText, int expectedIcon, int expectedCode) {
+        String actualLabel = PopupCharactersParser.getLabel(popupSpec);
+        assertEquals(message + ": label:", expectedLabel, actualLabel);
+
+        String actualOutputText = PopupCharactersParser.getOutputText(popupSpec);
+        assertEquals(message + ": ouptputText:", expectedOutputText, actualOutputText);
+
+        int actualIcon = PopupCharactersParser.getIconId(popupSpec);
+        assertEquals(message + ": icon:", expectedIcon, actualIcon);
+
+        int actualCode = PopupCharactersParser.getCode(mRes, popupSpec);
+        assertEquals(message + ": codes value:", expectedCode, actualCode);
+    }
+
+    private void assertParserError(String message, String popupSpec, String expectedLabel,
+            String expectedOutputText, int expectedIcon, int expectedCode) {
+        try {
+            assertParser(message, popupSpec, expectedLabel, expectedOutputText, expectedIcon,
+                    expectedCode);
+            fail(message);
+        } catch (PopupCharactersParser.PopupCharactersParserError pcpe) {
+            // success.
+        }
+    }
+
+    public void testSingleLetter() {
+        assertParser("Single letter", "a",
+                "a", null, ICON_UNDEFINED, 'a');
+        assertParser("Single escaped bar", "\\|",
+                "|", null, ICON_UNDEFINED, '|');
+        assertParser("Single escaped escape", "\\\\",
+                "\\", null, ICON_UNDEFINED, '\\');
+        assertParser("Single comma", ",",
+                ",", null, ICON_UNDEFINED, ',');
+        assertParser("Single escaped comma", "\\,",
+                ",", null, ICON_UNDEFINED, ',');
+        assertParser("Single escaped letter", "\\a",
+                "a", null, ICON_UNDEFINED, 'a');
+        assertParser("Single at", "@",
+                "@", null, ICON_UNDEFINED, '@');
+        assertParser("Single escaped at", "\\@",
+                "@", null, ICON_UNDEFINED, '@');
+        assertParser("Single letter with outputText", "a|abc",
+                "a", "abc", ICON_UNDEFINED, Keyboard.CODE_DUMMY);
+        assertParser("Single letter with escaped outputText", "a|a\\|c",
+                "a", "a|c", ICON_UNDEFINED, Keyboard.CODE_DUMMY);
+        assertParser("Single letter with comma outputText", "a|a,b",
+                "a", "a,b", ICON_UNDEFINED, Keyboard.CODE_DUMMY);
+        assertParser("Single letter with escaped comma outputText", "a|a\\,b",
+                "a", "a,b", ICON_UNDEFINED, Keyboard.CODE_DUMMY);
+        assertParser("Single letter with outputText starts with at", "a|@bc",
+                "a", "@bc", ICON_UNDEFINED, Keyboard.CODE_DUMMY);
+        assertParser("Single letter with outputText contains at", "a|a@c",
+                "a", "a@c", ICON_UNDEFINED, Keyboard.CODE_DUMMY);
+        assertParser("Single letter with escaped at outputText", "a|\\@bc",
+                "a", "@bc", ICON_UNDEFINED, Keyboard.CODE_DUMMY);
+        assertParser("Single escaped escape with outputText", "\\\\|\\\\",
+                "\\", "\\", ICON_UNDEFINED, Keyboard.CODE_DUMMY);
+        assertParser("Single escaped bar with outputText", "\\||\\|",
+                "|", "|", ICON_UNDEFINED, Keyboard.CODE_DUMMY);
+        assertParser("Single letter with code", "a|" + CODE_SETTINGS,
+                "a", null, ICON_UNDEFINED, mCodeSettings);
+    }
+
+    public void testLabel() {
+        assertParser("Simple label", "abc",
+                "abc", "abc", ICON_UNDEFINED, Keyboard.CODE_DUMMY);
+        assertParser("Label with escaped bar", "a\\|c",
+                "a|c", "a|c", ICON_UNDEFINED, Keyboard.CODE_DUMMY);
+        assertParser("Label with escaped escape", "a\\\\c",
+                "a\\c", "a\\c", ICON_UNDEFINED, Keyboard.CODE_DUMMY);
+        assertParser("Label with comma", "a,c",
+                "a,c", "a,c", ICON_UNDEFINED, Keyboard.CODE_DUMMY);
+        assertParser("Label with escaped comma", "a\\,c",
+                "a,c", "a,c", ICON_UNDEFINED, Keyboard.CODE_DUMMY);
+        assertParser("Label starts with at", "@bc",
+                "@bc", "@bc", ICON_UNDEFINED, Keyboard.CODE_DUMMY);
+        assertParser("Label contains at", "a@c",
+                "a@c", "a@c", ICON_UNDEFINED, Keyboard.CODE_DUMMY);
+        assertParser("Label with escaped at", "\\@bc",
+                "@bc", "@bc", ICON_UNDEFINED, Keyboard.CODE_DUMMY);
+        assertParser("Label with escaped letter", "\\abc",
+                "abc", "abc", ICON_UNDEFINED, Keyboard.CODE_DUMMY);
+        assertParser("Label with outputText", "abc|def",
+                "abc", "def", ICON_UNDEFINED, Keyboard.CODE_DUMMY);
+        assertParser("Label with comma and outputText", "a,c|def",
+                "a,c", "def", ICON_UNDEFINED, Keyboard.CODE_DUMMY);
+        assertParser("Escaped comma label with outputText", "a\\,c|def",
+                "a,c", "def", ICON_UNDEFINED, Keyboard.CODE_DUMMY);
+        assertParser("Escaped label with outputText", "a\\|c|def",
+                "a|c", "def", ICON_UNDEFINED, Keyboard.CODE_DUMMY);
+        assertParser("Label with escaped bar outputText", "abc|d\\|f",
+                "abc", "d|f", ICON_UNDEFINED, Keyboard.CODE_DUMMY);
+        assertParser("Escaped escape label with outputText", "a\\\\|def",
+                "a\\", "def", ICON_UNDEFINED, Keyboard.CODE_DUMMY);
+        assertParser("Label starts with at and outputText", "@bc|def",
+                "@bc", "def", ICON_UNDEFINED, Keyboard.CODE_DUMMY);
+        assertParser("Label contains at label and outputText", "a@c|def",
+                "a@c", "def", ICON_UNDEFINED, Keyboard.CODE_DUMMY);
+        assertParser("Escaped at label with outputText", "\\@bc|def",
+                "@bc", "def", ICON_UNDEFINED, Keyboard.CODE_DUMMY);
+        assertParser("Label with comma outputText", "abc|a,b",
+                "abc", "a,b", ICON_UNDEFINED, Keyboard.CODE_DUMMY);
+        assertParser("Label with escaped comma outputText", "abc|a\\,b",
+                "abc", "a,b", ICON_UNDEFINED, Keyboard.CODE_DUMMY);
+        assertParser("Label with outputText starts with at", "abc|@bc",
+                "abc", "@bc", ICON_UNDEFINED, Keyboard.CODE_DUMMY);
+        assertParser("Label with outputText contains at", "abc|a@c",
+                "abc", "a@c", ICON_UNDEFINED, Keyboard.CODE_DUMMY);
+        assertParser("Label with escaped at outputText", "abc|\\@bc",
+                "abc", "@bc", ICON_UNDEFINED, Keyboard.CODE_DUMMY);
+        assertParser("Label with escaped bar outputText", "abc|d\\|f",
+                "abc", "d|f", ICON_UNDEFINED, Keyboard.CODE_DUMMY);
+        assertParser("Escaped bar label with escaped bar outputText", "a\\|c|d\\|f",
+                "a|c", "d|f", ICON_UNDEFINED, Keyboard.CODE_DUMMY);
+        assertParser("Label with code", "abc|" + CODE_SETTINGS,
+                "abc", null, ICON_UNDEFINED, mCodeSettings);
+        assertParser("Escaped label with code", "a\\|c|" + CODE_SETTINGS,
+                "a|c", null, ICON_UNDEFINED, mCodeSettings);
+    }
+
+    public void testIconAndCode() {
+        assertParser("Icon with outputText", ICON_SETTINGS + "|abc",
+                null, "abc", ICON_SETTINGS_KEY, Keyboard.CODE_DUMMY);
+        assertParser("Icon with outputText starts with at", ICON_SETTINGS + "|@bc",
+                null, "@bc", ICON_SETTINGS_KEY, Keyboard.CODE_DUMMY);
+        assertParser("Icon with outputText contains at", ICON_SETTINGS + "|a@c",
+                null, "a@c", ICON_SETTINGS_KEY, Keyboard.CODE_DUMMY);
+        assertParser("Icon with escaped at outputText", ICON_SETTINGS + "|\\@bc",
+                null, "@bc", ICON_SETTINGS_KEY, Keyboard.CODE_DUMMY);
+        assertParser("Label starts with at and code", "@bc|" + CODE_SETTINGS,
+                "@bc", null, ICON_UNDEFINED, mCodeSettings);
+        assertParser("Label contains at and code", "a@c|" + CODE_SETTINGS,
+                "a@c", null, ICON_UNDEFINED, mCodeSettings);
+        assertParser("Escaped at label with code", "\\@bc|" + CODE_SETTINGS,
+                "@bc", null, ICON_UNDEFINED, mCodeSettings);
+        assertParser("Icon with code", ICON_SETTINGS + "|" + CODE_SETTINGS,
+                null, null, ICON_SETTINGS_KEY, mCodeSettings);
+    }
+
+    public void testFormatError() {
+        assertParserError("Empty spec", "", null,
+                null, ICON_UNDEFINED, Keyboard.CODE_UNSPECIFIED);
+        assertParserError("Empty label with outputText", "|a",
+                null, "a", ICON_UNDEFINED, Keyboard.CODE_DUMMY);
+        assertParserError("Empty label with code", "|" + CODE_SETTINGS,
+                null, null, ICON_UNDEFINED, mCodeSettings);
+        assertParserError("Empty outputText with label", "a|",
+                "a", null, ICON_UNDEFINED, Keyboard.CODE_UNSPECIFIED);
+        assertParserError("Empty outputText with icon", ICON_SETTINGS + "|",
+                null, null, ICON_SETTINGS_KEY, Keyboard.CODE_UNSPECIFIED);
+        assertParserError("Empty icon and code", "|",
+                null, null, ICON_UNDEFINED, Keyboard.CODE_UNSPECIFIED);
+        assertParserError("Icon without code", ICON_SETTINGS,
+                null, null, ICON_SETTINGS_KEY, Keyboard.CODE_DUMMY);
+        assertParser("Non existing icon", ICON_NON_EXISTING + "|abc",
+                null, "abc", ICON_UNDEFINED, Keyboard.CODE_DUMMY);
+        assertParserError("Non existing code", "abc|" + CODE_NON_EXISTING,
+                "abc", null, ICON_UNDEFINED, Keyboard.CODE_UNSPECIFIED);
+        assertParserError("Third bar at end", "a|b|",
+                "a", null, ICON_UNDEFINED, Keyboard.CODE_UNSPECIFIED);
+        assertParserError("Multiple bar", "a|b|c",
+                "a", null, ICON_UNDEFINED, Keyboard.CODE_UNSPECIFIED);
+        assertParserError("Multiple bar with label and code", "a|" + CODE_SETTINGS + "|c",
+                "a", null, ICON_UNDEFINED, mCodeSettings);
+        assertParserError("Multiple bar with icon and outputText", ICON_SETTINGS + "|b|c",
+                null, null, ICON_SETTINGS_KEY, Keyboard.CODE_UNSPECIFIED);
+        assertParserError("Multiple bar with icon and code",
+                ICON_SETTINGS + "|" + CODE_SETTINGS + "|c",
+                null, null, ICON_SETTINGS_KEY, mCodeSettings);
+    }
+}
diff --git a/tests/src/com/android/inputmethod/latin/EventRingBufferTests.java b/tests/src/com/android/inputmethod/latin/EventRingBufferTests.java
index 869781f..a3d2a2b 100644
--- a/tests/src/com/android/inputmethod/latin/EventRingBufferTests.java
+++ b/tests/src/com/android/inputmethod/latin/EventRingBufferTests.java
@@ -16,7 +16,7 @@
 
 package com.android.inputmethod.latin;
 
-import com.android.inputmethod.keyboard.SwipeTracker.EventRingBuffer;
+import com.android.inputmethod.keyboard.internal.SwipeTracker.EventRingBuffer;
 
 import android.test.AndroidTestCase;
 
diff --git a/tests/src/com/android/inputmethod/latin/SuggestHelper.java b/tests/src/com/android/inputmethod/latin/SuggestHelper.java
index 87ea011..f1224a2 100644
--- a/tests/src/com/android/inputmethod/latin/SuggestHelper.java
+++ b/tests/src/com/android/inputmethod/latin/SuggestHelper.java
@@ -16,10 +16,10 @@
 
 package com.android.inputmethod.latin;
 
-import com.android.inputmethod.keyboard.Key;
 import com.android.inputmethod.keyboard.KeyDetector;
 import com.android.inputmethod.keyboard.KeyboardId;
 import com.android.inputmethod.keyboard.LatinKeyboard;
+import com.android.inputmethod.keyboard.internal.Key;
 
 import android.content.Context;
 import android.text.TextUtils;
diff --git a/tests/src/com/android/inputmethod/latin/SuggestTestsBase.java b/tests/src/com/android/inputmethod/latin/SuggestTestsBase.java
index 28766c2..bb2a6fe 100644
--- a/tests/src/com/android/inputmethod/latin/SuggestTestsBase.java
+++ b/tests/src/com/android/inputmethod/latin/SuggestTestsBase.java
@@ -16,15 +16,14 @@
 
 package com.android.inputmethod.latin;
 
-import com.android.inputmethod.keyboard.KeyboardId;
-import com.android.inputmethod.keyboard.KeyboardView;
-
 import android.content.res.AssetFileDescriptor;
 import android.content.res.Configuration;
 import android.test.AndroidTestCase;
 import android.text.TextUtils;
 import android.view.inputmethod.EditorInfo;
 
+import com.android.inputmethod.keyboard.KeyboardId;
+
 import java.io.File;
 import java.io.InputStream;
 import java.util.Locale;
@@ -41,8 +40,8 @@
     protected KeyboardId createKeyboardId(Locale locale) {
         final int displayWidth = getContext().getResources().getDisplayMetrics().widthPixels;
         return new KeyboardId(locale.toString() + " keyboard",
-                com.android.inputmethod.latin.R.xml.kbd_qwerty, KeyboardView.COLOR_SCHEME_WHITE,
-                locale, Configuration.ORIENTATION_LANDSCAPE, displayWidth, KeyboardId.MODE_TEXT,
+                com.android.inputmethod.latin.R.xml.kbd_qwerty, locale,
+                Configuration.ORIENTATION_LANDSCAPE, displayWidth, KeyboardId.MODE_TEXT,
                 new EditorInfo(), false, false, false, false);
     }