Merge "Revert "move setup wizard package name to google namespace""
diff --git a/java/AndroidManifest.xml b/java/AndroidManifest.xml
index 2fbf4c2..cb0a9a2 100644
--- a/java/AndroidManifest.xml
+++ b/java/AndroidManifest.xml
@@ -41,5 +41,11 @@
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
         </activity>
+
+        <receiver android:name="SuggestionSpanPickedNotificationReceiver" android:enabled="true">
+            <intent-filter>
+                <action android:name="android.text.style.SUGGESTION_PICKED" />
+            </intent-filter>
+        </receiver>
     </application>
 </manifest>
diff --git a/java/proguard.flags b/java/proguard.flags
index 914bd75..9094be4 100644
--- a/java/proguard.flags
+++ b/java/proguard.flags
@@ -22,3 +22,7 @@
 -keep class com.android.inputmethod.latin.Utils {
   boolean equalsIgnoreCase(...);
 }
+
+-keep class com.android.inputmethod.latin.spellcheck.SpellChecker {
+  *;
+}
diff --git a/java/res/drawable-xlarge/btn_center_default.9.png b/java/res/drawable-hdpi/btn_center_default.9.png
old mode 100755
new mode 100644
similarity index 100%
rename from java/res/drawable-xlarge/btn_center_default.9.png
rename to java/res/drawable-hdpi/btn_center_default.9.png
Binary files differ
diff --git a/java/res/drawable-xlarge/btn_center_pressed.9.png b/java/res/drawable-hdpi/btn_center_pressed.9.png
old mode 100755
new mode 100644
similarity index 100%
rename from java/res/drawable-xlarge/btn_center_pressed.9.png
rename to java/res/drawable-hdpi/btn_center_pressed.9.png
Binary files differ
diff --git a/java/res/drawable-xlarge/btn_center_selected.9.png b/java/res/drawable-hdpi/btn_center_selected.9.png
similarity index 100%
rename from java/res/drawable-xlarge/btn_center_selected.9.png
rename to java/res/drawable-hdpi/btn_center_selected.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_dark_normal.9.png b/java/res/drawable-hdpi/btn_keyboard_key_dark_normal.9.png
index 01fc8ca..50cc49f 100644
--- a/java/res/drawable-hdpi/btn_keyboard_key_dark_normal.9.png
+++ b/java/res/drawable-hdpi/btn_keyboard_key_dark_normal.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_off.9.png b/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_off.9.png
index af4017e..dabf77e 100644
--- a/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_off.9.png
+++ b/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_off.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_on.9.png b/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_on.9.png
index 4c35aca..6e7d74c 100644
--- a/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_on.9.png
+++ b/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_on.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed.9.png b/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed.9.png
index 174f345..ddb77c2 100644
--- a/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed.9.png
+++ b/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_off.9.png b/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_off.9.png
index 1fcbd9a..1e9227e 100644
--- a/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_off.9.png
+++ b/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_off.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_on.9.png b/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_on.9.png
index 072753f..7207b2e 100644
--- a/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_on.9.png
+++ b/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_on.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_light_normal.9.png b/java/res/drawable-hdpi/btn_keyboard_key_light_normal.9.png
index 1ad7460..9d85c7b 100644
--- a/java/res/drawable-hdpi/btn_keyboard_key_light_normal.9.png
+++ b/java/res/drawable-hdpi/btn_keyboard_key_light_normal.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_light_popup_normal.9.png b/java/res/drawable-hdpi/btn_keyboard_key_light_popup_normal.9.png
index e3a77d6..2ed1b34 100644
--- a/java/res/drawable-hdpi/btn_keyboard_key_light_popup_normal.9.png
+++ b/java/res/drawable-hdpi/btn_keyboard_key_light_popup_normal.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_light_popup_selected.9.png b/java/res/drawable-hdpi/btn_keyboard_key_light_popup_selected.9.png
index 431c449..77e17db 100644
--- a/java/res/drawable-hdpi/btn_keyboard_key_light_popup_selected.9.png
+++ b/java/res/drawable-hdpi/btn_keyboard_key_light_popup_selected.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_light_pressed.9.png b/java/res/drawable-hdpi/btn_keyboard_key_light_pressed.9.png
index ccd59d5..a409639 100644
--- a/java/res/drawable-hdpi/btn_keyboard_key_light_pressed.9.png
+++ b/java/res/drawable-hdpi/btn_keyboard_key_light_pressed.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/cancel.png b/java/res/drawable-hdpi/cancel.png
deleted file mode 100644
index 506cf99..0000000
--- a/java/res/drawable-hdpi/cancel.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/cancel_holo.9.png b/java/res/drawable-hdpi/cancel_holo.9.png
deleted file mode 100644
index 33548d6..0000000
--- a/java/res/drawable-hdpi/cancel_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/dialog_bubble_step02.9.png b/java/res/drawable-hdpi/dialog_bubble_step02.9.png
deleted file mode 100644
index b338364..0000000
--- a/java/res/drawable-hdpi/dialog_bubble_step02.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/dialog_bubble_step07.9.png b/java/res/drawable-hdpi/dialog_bubble_step07.9.png
deleted file mode 100644
index 94b9154..0000000
--- a/java/res/drawable-hdpi/dialog_bubble_step07.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_at_holo.9.png b/java/res/drawable-hdpi/key_hint_at_holo.9.png
index 129e198..b93c2d3 100644
--- a/java/res/drawable-hdpi/key_hint_at_holo.9.png
+++ b/java/res/drawable-hdpi/key_hint_at_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_at_large_holo.9.png b/java/res/drawable-hdpi/key_hint_at_large_holo.9.png
index d90bc31..2b92951 100644
--- a/java/res/drawable-hdpi/key_hint_at_large_holo.9.png
+++ b/java/res/drawable-hdpi/key_hint_at_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_colon_holo.9.png b/java/res/drawable-hdpi/key_hint_colon_holo.9.png
index e82e41c..8fa17e5 100644
--- a/java/res/drawable-hdpi/key_hint_colon_holo.9.png
+++ b/java/res/drawable-hdpi/key_hint_colon_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_colon_large_holo.9.png b/java/res/drawable-hdpi/key_hint_colon_large_holo.9.png
index e46845d..1271341 100644
--- a/java/res/drawable-hdpi/key_hint_colon_large_holo.9.png
+++ b/java/res/drawable-hdpi/key_hint_colon_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_comma_holo.9.png b/java/res/drawable-hdpi/key_hint_comma_holo.9.png
index da0d6fd..44220ec 100644
--- a/java/res/drawable-hdpi/key_hint_comma_holo.9.png
+++ b/java/res/drawable-hdpi/key_hint_comma_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_comma_large_holo.9.png b/java/res/drawable-hdpi/key_hint_comma_large_holo.9.png
index 1f2f707..444b4d0 100644
--- a/java/res/drawable-hdpi/key_hint_comma_large_holo.9.png
+++ b/java/res/drawable-hdpi/key_hint_comma_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_dash_holo.9.png b/java/res/drawable-hdpi/key_hint_dash_holo.9.png
deleted file mode 100644
index a2b2fce..0000000
--- a/java/res/drawable-hdpi/key_hint_dash_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_doublecross_holo.9.png b/java/res/drawable-hdpi/key_hint_doublecross_holo.9.png
deleted file mode 100644
index d5af9f8..0000000
--- a/java/res/drawable-hdpi/key_hint_doublecross_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_equal_holo.9.png b/java/res/drawable-hdpi/key_hint_equal_holo.9.png
deleted file mode 100644
index 4acc3c3..0000000
--- a/java/res/drawable-hdpi/key_hint_equal_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_exclamation_holo.9.png b/java/res/drawable-hdpi/key_hint_exclamation_holo.9.png
index 8d99a27..d5e6884 100644
--- a/java/res/drawable-hdpi/key_hint_exclamation_holo.9.png
+++ b/java/res/drawable-hdpi/key_hint_exclamation_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_exclamation_large_holo.9.png b/java/res/drawable-hdpi/key_hint_exclamation_large_holo.9.png
index e93e491..5dab2f6 100644
--- a/java/res/drawable-hdpi/key_hint_exclamation_large_holo.9.png
+++ b/java/res/drawable-hdpi/key_hint_exclamation_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_larger_holo.9.png b/java/res/drawable-hdpi/key_hint_larger_holo.9.png
deleted file mode 100644
index 10614d9..0000000
--- a/java/res/drawable-hdpi/key_hint_larger_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_minus_holo.9.png b/java/res/drawable-hdpi/key_hint_minus_holo.9.png
deleted file mode 100644
index 2c34ef9..0000000
--- a/java/res/drawable-hdpi/key_hint_minus_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_minus_large_holo.9.png b/java/res/drawable-hdpi/key_hint_minus_large_holo.9.png
deleted file mode 100644
index 0df056e..0000000
--- a/java/res/drawable-hdpi/key_hint_minus_large_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_hint_0.9.png b/java/res/drawable-hdpi/key_hint_num0.9.png
similarity index 100%
rename from java/res/drawable-hdpi/keyboard_hint_0.9.png
rename to java/res/drawable-hdpi/key_hint_num0.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_hint_1.9.png b/java/res/drawable-hdpi/key_hint_num1.9.png
similarity index 100%
rename from java/res/drawable-hdpi/keyboard_hint_1.9.png
rename to java/res/drawable-hdpi/key_hint_num1.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_hint_2.9.png b/java/res/drawable-hdpi/key_hint_num2.9.png
similarity index 100%
rename from java/res/drawable-hdpi/keyboard_hint_2.9.png
rename to java/res/drawable-hdpi/key_hint_num2.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_hint_3.9.png b/java/res/drawable-hdpi/key_hint_num3.9.png
similarity index 100%
rename from java/res/drawable-hdpi/keyboard_hint_3.9.png
rename to java/res/drawable-hdpi/key_hint_num3.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_hint_4.9.png b/java/res/drawable-hdpi/key_hint_num4.9.png
similarity index 100%
rename from java/res/drawable-hdpi/keyboard_hint_4.9.png
rename to java/res/drawable-hdpi/key_hint_num4.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_hint_5.9.png b/java/res/drawable-hdpi/key_hint_num5.9.png
similarity index 100%
rename from java/res/drawable-hdpi/keyboard_hint_5.9.png
rename to java/res/drawable-hdpi/key_hint_num5.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_hint_6.9.png b/java/res/drawable-hdpi/key_hint_num6.9.png
similarity index 100%
rename from java/res/drawable-hdpi/keyboard_hint_6.9.png
rename to java/res/drawable-hdpi/key_hint_num6.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_hint_7.9.png b/java/res/drawable-hdpi/key_hint_num7.9.png
similarity index 100%
rename from java/res/drawable-hdpi/keyboard_hint_7.9.png
rename to java/res/drawable-hdpi/key_hint_num7.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_hint_8.9.png b/java/res/drawable-hdpi/key_hint_num8.9.png
similarity index 100%
rename from java/res/drawable-hdpi/keyboard_hint_8.9.png
rename to java/res/drawable-hdpi/key_hint_num8.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_hint_9.9.png b/java/res/drawable-hdpi/key_hint_num9.9.png
similarity index 100%
rename from java/res/drawable-hdpi/keyboard_hint_9.9.png
rename to java/res/drawable-hdpi/key_hint_num9.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_parenclose_holo.9.png b/java/res/drawable-hdpi/key_hint_parenclose_holo.9.png
deleted file mode 100644
index 9096362..0000000
--- a/java/res/drawable-hdpi/key_hint_parenclose_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_parenopen_holo.9.png b/java/res/drawable-hdpi/key_hint_parenopen_holo.9.png
deleted file mode 100644
index bb4cbd4..0000000
--- a/java/res/drawable-hdpi/key_hint_parenopen_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_period_holo.9.png b/java/res/drawable-hdpi/key_hint_period_holo.9.png
deleted file mode 100644
index 68f789b..0000000
--- a/java/res/drawable-hdpi/key_hint_period_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_plus_holo.9.png b/java/res/drawable-hdpi/key_hint_plus_holo.9.png
index 3dd8506..a11b4ac 100644
--- a/java/res/drawable-hdpi/key_hint_plus_holo.9.png
+++ b/java/res/drawable-hdpi/key_hint_plus_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_plus_large_holo.9.png b/java/res/drawable-hdpi/key_hint_plus_large_holo.9.png
index b0d75f4..3c87c1f 100644
--- a/java/res/drawable-hdpi/key_hint_plus_large_holo.9.png
+++ b/java/res/drawable-hdpi/key_hint_plus_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_question_holo.9.png b/java/res/drawable-hdpi/key_hint_question_holo.9.png
index 4fe6a5b..670b4b9 100644
--- a/java/res/drawable-hdpi/key_hint_question_holo.9.png
+++ b/java/res/drawable-hdpi/key_hint_question_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_question_large_holo.9.png b/java/res/drawable-hdpi/key_hint_question_large_holo.9.png
index 44dfdc4..692f4a6 100644
--- a/java/res/drawable-hdpi/key_hint_question_large_holo.9.png
+++ b/java/res/drawable-hdpi/key_hint_question_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_quote_holo.9.png b/java/res/drawable-hdpi/key_hint_quote_holo.9.png
index 8308aa6..9cc8615 100644
--- a/java/res/drawable-hdpi/key_hint_quote_holo.9.png
+++ b/java/res/drawable-hdpi/key_hint_quote_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_quote_large_holo.9.png b/java/res/drawable-hdpi/key_hint_quote_large_holo.9.png
index e73b9e0..664467b 100644
--- a/java/res/drawable-hdpi/key_hint_quote_large_holo.9.png
+++ b/java/res/drawable-hdpi/key_hint_quote_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_semicolon_holo.9.png b/java/res/drawable-hdpi/key_hint_semicolon_holo.9.png
deleted file mode 100644
index ac3de37..0000000
--- a/java/res/drawable-hdpi/key_hint_semicolon_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_simplequote_holo.9.png b/java/res/drawable-hdpi/key_hint_simplequote_holo.9.png
deleted file mode 100644
index 20d56c5..0000000
--- a/java/res/drawable-hdpi/key_hint_simplequote_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_slash_holo.9.png b/java/res/drawable-hdpi/key_hint_slash_holo.9.png
deleted file mode 100644
index 3fe2c42..0000000
--- a/java/res/drawable-hdpi/key_hint_slash_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_slash_large_holo.9.png b/java/res/drawable-hdpi/key_hint_slash_large_holo.9.png
deleted file mode 100644
index 47e7675..0000000
--- a/java/res/drawable-hdpi/key_hint_slash_large_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_smaller_holo.9.png b/java/res/drawable-hdpi/key_hint_smaller_holo.9.png
deleted file mode 100644
index 19a7d93..0000000
--- a/java/res/drawable-hdpi/key_hint_smaller_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_star_holo.9.png b/java/res/drawable-hdpi/key_hint_star_holo.9.png
deleted file mode 100644
index 4e4340d..0000000
--- a/java/res/drawable-hdpi/key_hint_star_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_underline_holo.9.png b/java/res/drawable-hdpi/key_hint_underline_holo.9.png
index e4f2719..2cb4077 100644
--- a/java/res/drawable-hdpi/key_hint_underline_holo.9.png
+++ b/java/res/drawable-hdpi/key_hint_underline_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_underline_large_holo.9.png b/java/res/drawable-hdpi/key_hint_underline_large_holo.9.png
index dad34fc..6b9a491 100644
--- a/java/res/drawable-hdpi/key_hint_underline_large_holo.9.png
+++ b/java/res/drawable-hdpi/key_hint_underline_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_underscore_holo.9.png b/java/res/drawable-hdpi/key_hint_underscore_holo.9.png
deleted file mode 100644
index e4f2719..0000000
--- a/java/res/drawable-hdpi/key_hint_underscore_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/key_hint_underscore_large_holo.9.png b/java/res/drawable-hdpi/key_hint_underscore_large_holo.9.png
deleted file mode 100644
index dad34fc..0000000
--- a/java/res/drawable-hdpi/key_hint_underscore_large_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_hint_at.9.png b/java/res/drawable-hdpi/keyboard_hint_at.9.png
deleted file mode 100644
index 4b49c0d..0000000
--- a/java/res/drawable-hdpi/keyboard_hint_at.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_hint_colon.9.png b/java/res/drawable-hdpi/keyboard_hint_colon.9.png
deleted file mode 100644
index a91dc47..0000000
--- a/java/res/drawable-hdpi/keyboard_hint_colon.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_hint_doublecross.9.png b/java/res/drawable-hdpi/keyboard_hint_doublecross.9.png
deleted file mode 100644
index c0917c2..0000000
--- a/java/res/drawable-hdpi/keyboard_hint_doublecross.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_hint_exclamation.9.png b/java/res/drawable-hdpi/keyboard_hint_exclamation.9.png
deleted file mode 100644
index 98c07d9..0000000
--- a/java/res/drawable-hdpi/keyboard_hint_exclamation.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_hint_greater.9.png b/java/res/drawable-hdpi/keyboard_hint_greater.9.png
deleted file mode 100644
index f2bf37d..0000000
--- a/java/res/drawable-hdpi/keyboard_hint_greater.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_hint_plus.9.png b/java/res/drawable-hdpi/keyboard_hint_plus.9.png
deleted file mode 100644
index 586e9c1..0000000
--- a/java/res/drawable-hdpi/keyboard_hint_plus.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_hint_question.9.png b/java/res/drawable-hdpi/keyboard_hint_question.9.png
deleted file mode 100644
index 6c7d431..0000000
--- a/java/res/drawable-hdpi/keyboard_hint_question.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_hint_quote.9.png b/java/res/drawable-hdpi/keyboard_hint_quote.9.png
deleted file mode 100644
index 57f44e4..0000000
--- a/java/res/drawable-hdpi/keyboard_hint_quote.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_hint_smaller.9.png b/java/res/drawable-hdpi/keyboard_hint_smaller.9.png
deleted file mode 100644
index 438b95e..0000000
--- a/java/res/drawable-hdpi/keyboard_hint_smaller.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_hint_star.9.png b/java/res/drawable-hdpi/keyboard_hint_star.9.png
deleted file mode 100644
index 33f8281..0000000
--- a/java/res/drawable-hdpi/keyboard_hint_star.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_key_feedback_background.9.png b/java/res/drawable-hdpi/keyboard_key_feedback_background.9.png
index 762a257..27d9923 100644
--- a/java/res/drawable-hdpi/keyboard_key_feedback_background.9.png
+++ b/java/res/drawable-hdpi/keyboard_key_feedback_background.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_key_feedback_background_holo.9.png b/java/res/drawable-hdpi/keyboard_key_feedback_background_holo.9.png
index 8d6acac..943f9e4 100644
--- a/java/res/drawable-hdpi/keyboard_key_feedback_background_holo.9.png
+++ b/java/res/drawable-hdpi/keyboard_key_feedback_background_holo.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_key_feedback_more_background.9.png b/java/res/drawable-hdpi/keyboard_key_feedback_more_background.9.png
index 141d2d6..33263b9 100644
--- a/java/res/drawable-hdpi/keyboard_key_feedback_more_background.9.png
+++ b/java/res/drawable-hdpi/keyboard_key_feedback_more_background.9.png
Binary files differ
diff --git a/java/res/drawable-xlarge/mic_base.png b/java/res/drawable-hdpi/mic_base.png
similarity index 100%
rename from java/res/drawable-xlarge/mic_base.png
rename to java/res/drawable-hdpi/mic_base.png
Binary files differ
diff --git a/java/res/drawable-xlarge/mic_full.png b/java/res/drawable-hdpi/mic_full.png
similarity index 100%
rename from java/res/drawable-xlarge/mic_full.png
rename to java/res/drawable-hdpi/mic_full.png
Binary files differ
diff --git a/java/res/drawable-hdpi/mic_slash.png b/java/res/drawable-hdpi/mic_slash.png
index dc8da62..1dd05c5 100644
--- a/java/res/drawable-hdpi/mic_slash.png
+++ b/java/res/drawable-hdpi/mic_slash.png
Binary files differ
diff --git a/java/res/drawable-hdpi/mic_slash_holo.png b/java/res/drawable-hdpi/mic_slash_holo.png
deleted file mode 100644
index 27a05de..0000000
--- a/java/res/drawable-hdpi/mic_slash_holo.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/ok_cancel.png b/java/res/drawable-hdpi/ok_cancel.png
deleted file mode 100644
index f11e57a..0000000
--- a/java/res/drawable-hdpi/ok_cancel.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/ok_cancel_holo.9.png b/java/res/drawable-hdpi/ok_cancel_holo.9.png
deleted file mode 100644
index 5be81c3..0000000
--- a/java/res/drawable-hdpi/ok_cancel_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/speak_now_level0.png b/java/res/drawable-hdpi/speak_now_level0.png
deleted file mode 100644
index 342849c..0000000
--- a/java/res/drawable-hdpi/speak_now_level0.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/speak_now_level0_holo.png b/java/res/drawable-hdpi/speak_now_level0_holo.png
deleted file mode 100644
index 29eef92..0000000
--- a/java/res/drawable-hdpi/speak_now_level0_holo.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/speak_now_level1.png b/java/res/drawable-hdpi/speak_now_level1.png
deleted file mode 100644
index 8947a43..0000000
--- a/java/res/drawable-hdpi/speak_now_level1.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/speak_now_level1_holo.png b/java/res/drawable-hdpi/speak_now_level1_holo.png
deleted file mode 100644
index a76e990..0000000
--- a/java/res/drawable-hdpi/speak_now_level1_holo.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/speak_now_level2.png b/java/res/drawable-hdpi/speak_now_level2.png
deleted file mode 100644
index 44fc58c..0000000
--- a/java/res/drawable-hdpi/speak_now_level2.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/speak_now_level2_holo.png b/java/res/drawable-hdpi/speak_now_level2_holo.png
deleted file mode 100644
index 8cd462d..0000000
--- a/java/res/drawable-hdpi/speak_now_level2_holo.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/speak_now_level3.png b/java/res/drawable-hdpi/speak_now_level3.png
deleted file mode 100644
index cfa5c1b..0000000
--- a/java/res/drawable-hdpi/speak_now_level3.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/speak_now_level3_holo.png b/java/res/drawable-hdpi/speak_now_level3_holo.png
deleted file mode 100644
index b7371dc..0000000
--- a/java/res/drawable-hdpi/speak_now_level3_holo.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/speak_now_level4.png b/java/res/drawable-hdpi/speak_now_level4.png
deleted file mode 100644
index a050d88..0000000
--- a/java/res/drawable-hdpi/speak_now_level4.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/speak_now_level4_holo.png b/java/res/drawable-hdpi/speak_now_level4_holo.png
deleted file mode 100644
index 74befc8..0000000
--- a/java/res/drawable-hdpi/speak_now_level4_holo.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/speak_now_level5.png b/java/res/drawable-hdpi/speak_now_level5.png
deleted file mode 100644
index 8cd5ae7..0000000
--- a/java/res/drawable-hdpi/speak_now_level5.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/speak_now_level5_holo.png b/java/res/drawable-hdpi/speak_now_level5_holo.png
deleted file mode 100644
index b027e83..0000000
--- a/java/res/drawable-hdpi/speak_now_level5_holo.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/speak_now_level6.png b/java/res/drawable-hdpi/speak_now_level6.png
deleted file mode 100644
index 9f4481e..0000000
--- a/java/res/drawable-hdpi/speak_now_level6.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/speak_now_level6_holo.png b/java/res/drawable-hdpi/speak_now_level6_holo.png
deleted file mode 100644
index 17bb034..0000000
--- a/java/res/drawable-hdpi/speak_now_level6_holo.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_bkeyboard_done.png b/java/res/drawable-hdpi/sym_bkeyboard_done.png
deleted file mode 100644
index b77803d..0000000
--- a/java/res/drawable-hdpi/sym_bkeyboard_done.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_bkeyboard_voice_off.png b/java/res/drawable-hdpi/sym_bkeyboard_voice_off.png
new file mode 100644
index 0000000..081a130
--- /dev/null
+++ b/java/res/drawable-hdpi/sym_bkeyboard_voice_off.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_done.png b/java/res/drawable-hdpi/sym_keyboard_done.png
deleted file mode 100644
index 471c502..0000000
--- a/java/res/drawable-hdpi/sym_keyboard_done.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_feedback_done.png b/java/res/drawable-hdpi/sym_keyboard_feedback_done.png
deleted file mode 100644
index 7015e26..0000000
--- a/java/res/drawable-hdpi/sym_keyboard_feedback_done.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_feedback_shift_locked.png b/java/res/drawable-hdpi/sym_keyboard_feedback_shift_locked.png
deleted file mode 100644
index 1fd822e..0000000
--- a/java/res/drawable-hdpi/sym_keyboard_feedback_shift_locked.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_mic_disabled.png b/java/res/drawable-hdpi/sym_keyboard_mic_disabled.png
deleted file mode 100644
index c8dca62..0000000
--- a/java/res/drawable-hdpi/sym_keyboard_mic_disabled.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_smiley_holo.png b/java/res/drawable-hdpi/sym_keyboard_smiley_holo.png
deleted file mode 100644
index a3f5e84..0000000
--- a/java/res/drawable-hdpi/sym_keyboard_smiley_holo.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_tab.png b/java/res/drawable-hdpi/sym_keyboard_tab.png
index 51d17d9..3d1c5c0 100644
--- a/java/res/drawable-hdpi/sym_keyboard_tab.png
+++ b/java/res/drawable-hdpi/sym_keyboard_tab.png
Binary files differ
diff --git a/java/res/drawable-hdpi/top_suggest_line_holo.9.png b/java/res/drawable-hdpi/top_suggest_line_holo.9.png
deleted file mode 100644
index dcce301..0000000
--- a/java/res/drawable-hdpi/top_suggest_line_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/voice_ime_background.9.png b/java/res/drawable-hdpi/voice_ime_background.9.png
deleted file mode 100644
index 4286852..0000000
--- a/java/res/drawable-hdpi/voice_ime_background.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/voice_swipe_hint.png b/java/res/drawable-hdpi/voice_swipe_hint.png
deleted file mode 100644
index 130f83a..0000000
--- a/java/res/drawable-hdpi/voice_swipe_hint.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-xlarge/vs_dialog_blue.9.png b/java/res/drawable-hdpi/vs_dialog_blue.9.png
similarity index 100%
rename from java/res/drawable-xlarge/vs_dialog_blue.9.png
rename to java/res/drawable-hdpi/vs_dialog_blue.9.png
Binary files differ
diff --git a/java/res/drawable-xlarge/vs_dialog_red.9.png b/java/res/drawable-hdpi/vs_dialog_red.9.png
similarity index 100%
rename from java/res/drawable-xlarge/vs_dialog_red.9.png
rename to java/res/drawable-hdpi/vs_dialog_red.9.png
Binary files differ
diff --git a/java/res/drawable-xlarge/vs_dialog_yellow.9.png b/java/res/drawable-hdpi/vs_dialog_yellow.9.png
similarity index 100%
rename from java/res/drawable-xlarge/vs_dialog_yellow.9.png
rename to java/res/drawable-hdpi/vs_dialog_yellow.9.png
Binary files differ
diff --git a/java/res/drawable-xlarge/vs_popup_mic_edge.png b/java/res/drawable-hdpi/vs_popup_mic_edge.png
similarity index 100%
rename from java/res/drawable-xlarge/vs_popup_mic_edge.png
rename to java/res/drawable-hdpi/vs_popup_mic_edge.png
Binary files differ
diff --git a/java/res/drawable-hdpi/working.png b/java/res/drawable-hdpi/working.png
deleted file mode 100755
index 5ea7023..0000000
--- a/java/res/drawable-hdpi/working.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-land-hdpi/btn_keyboard_key_normal.9.png b/java/res/drawable-land-hdpi/btn_keyboard_key_normal.9.png
old mode 100755
new mode 100644
Binary files differ
diff --git a/java/res/drawable-land-hdpi/btn_keyboard_key_normal_off.9.png b/java/res/drawable-land-hdpi/btn_keyboard_key_normal_off.9.png
old mode 100755
new mode 100644
Binary files differ
diff --git a/java/res/drawable-land-hdpi/btn_keyboard_key_normal_on.9.png b/java/res/drawable-land-hdpi/btn_keyboard_key_normal_on.9.png
old mode 100755
new mode 100644
Binary files differ
diff --git a/java/res/drawable-land-hdpi/btn_keyboard_key_pressed.9.png b/java/res/drawable-land-hdpi/btn_keyboard_key_pressed.9.png
old mode 100755
new mode 100644
Binary files differ
diff --git a/java/res/drawable-land-hdpi/btn_keyboard_key_pressed_off.9.png b/java/res/drawable-land-hdpi/btn_keyboard_key_pressed_off.9.png
old mode 100755
new mode 100644
Binary files differ
diff --git a/java/res/drawable-land-hdpi/btn_keyboard_key_pressed_on.9.png b/java/res/drawable-land-hdpi/btn_keyboard_key_pressed_on.9.png
old mode 100755
new mode 100644
Binary files differ
diff --git a/java/res/drawable-land-hdpi/key_hint_at_holo.9.png b/java/res/drawable-land-hdpi/key_hint_at_holo.9.png
index 874802f..b93c2d3 100644
--- a/java/res/drawable-land-hdpi/key_hint_at_holo.9.png
+++ b/java/res/drawable-land-hdpi/key_hint_at_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/key_hint_at_large_holo.9.png b/java/res/drawable-land-hdpi/key_hint_at_large_holo.9.png
index d90bc31..2b92951 100644
--- a/java/res/drawable-land-hdpi/key_hint_at_large_holo.9.png
+++ b/java/res/drawable-land-hdpi/key_hint_at_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/key_hint_colon_holo.9.png b/java/res/drawable-land-hdpi/key_hint_colon_holo.9.png
index e82e41c..8fa17e5 100644
--- a/java/res/drawable-land-hdpi/key_hint_colon_holo.9.png
+++ b/java/res/drawable-land-hdpi/key_hint_colon_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/key_hint_colon_large_holo.9.png b/java/res/drawable-land-hdpi/key_hint_colon_large_holo.9.png
index e46845d..1271341 100644
--- a/java/res/drawable-land-hdpi/key_hint_colon_large_holo.9.png
+++ b/java/res/drawable-land-hdpi/key_hint_colon_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/key_hint_comma_holo.9.png b/java/res/drawable-land-hdpi/key_hint_comma_holo.9.png
index da0d6fd..44220ec 100644
--- a/java/res/drawable-land-hdpi/key_hint_comma_holo.9.png
+++ b/java/res/drawable-land-hdpi/key_hint_comma_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/key_hint_comma_large_holo.9.png b/java/res/drawable-land-hdpi/key_hint_comma_large_holo.9.png
index 1f2f707..444b4d0 100644
--- a/java/res/drawable-land-hdpi/key_hint_comma_large_holo.9.png
+++ b/java/res/drawable-land-hdpi/key_hint_comma_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/key_hint_dash_holo.9.png b/java/res/drawable-land-hdpi/key_hint_dash_holo.9.png
deleted file mode 100644
index c045b8c..0000000
--- a/java/res/drawable-land-hdpi/key_hint_dash_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-land-hdpi/key_hint_doublecross_holo.9.png b/java/res/drawable-land-hdpi/key_hint_doublecross_holo.9.png
deleted file mode 100644
index 6975ab7..0000000
--- a/java/res/drawable-land-hdpi/key_hint_doublecross_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-land-hdpi/key_hint_equal_holo.9.png b/java/res/drawable-land-hdpi/key_hint_equal_holo.9.png
deleted file mode 100644
index a619fb2..0000000
--- a/java/res/drawable-land-hdpi/key_hint_equal_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-land-hdpi/key_hint_exclamation_holo.9.png b/java/res/drawable-land-hdpi/key_hint_exclamation_holo.9.png
index 570a1b8..d5e6884 100644
--- a/java/res/drawable-land-hdpi/key_hint_exclamation_holo.9.png
+++ b/java/res/drawable-land-hdpi/key_hint_exclamation_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/key_hint_exclamation_large_holo.9.png b/java/res/drawable-land-hdpi/key_hint_exclamation_large_holo.9.png
index e93e491..5dab2f6 100644
--- a/java/res/drawable-land-hdpi/key_hint_exclamation_large_holo.9.png
+++ b/java/res/drawable-land-hdpi/key_hint_exclamation_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/key_hint_larger_holo.9.png b/java/res/drawable-land-hdpi/key_hint_larger_holo.9.png
deleted file mode 100644
index f8d960f..0000000
--- a/java/res/drawable-land-hdpi/key_hint_larger_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-land-hdpi/key_hint_minus_holo.9.png b/java/res/drawable-land-hdpi/key_hint_minus_holo.9.png
deleted file mode 100644
index 2c34ef9..0000000
--- a/java/res/drawable-land-hdpi/key_hint_minus_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-land-hdpi/key_hint_minus_large_holo.9.png b/java/res/drawable-land-hdpi/key_hint_minus_large_holo.9.png
deleted file mode 100644
index 0df056e..0000000
--- a/java/res/drawable-land-hdpi/key_hint_minus_large_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-land-hdpi/key_hint_parenclose_holo.9.png b/java/res/drawable-land-hdpi/key_hint_parenclose_holo.9.png
deleted file mode 100644
index 9d8b057..0000000
--- a/java/res/drawable-land-hdpi/key_hint_parenclose_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-land-hdpi/key_hint_parenopen_holo.9.png b/java/res/drawable-land-hdpi/key_hint_parenopen_holo.9.png
deleted file mode 100644
index 8e2d8f2..0000000
--- a/java/res/drawable-land-hdpi/key_hint_parenopen_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-land-hdpi/key_hint_period_holo.9.png b/java/res/drawable-land-hdpi/key_hint_period_holo.9.png
deleted file mode 100644
index bf8c6d7..0000000
--- a/java/res/drawable-land-hdpi/key_hint_period_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-land-hdpi/key_hint_plus_holo.9.png b/java/res/drawable-land-hdpi/key_hint_plus_holo.9.png
index 3dd8506..a11b4ac 100644
--- a/java/res/drawable-land-hdpi/key_hint_plus_holo.9.png
+++ b/java/res/drawable-land-hdpi/key_hint_plus_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/key_hint_plus_large_holo.9.png b/java/res/drawable-land-hdpi/key_hint_plus_large_holo.9.png
index b0d75f4..3c87c1f 100644
--- a/java/res/drawable-land-hdpi/key_hint_plus_large_holo.9.png
+++ b/java/res/drawable-land-hdpi/key_hint_plus_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/key_hint_question_holo.9.png b/java/res/drawable-land-hdpi/key_hint_question_holo.9.png
index 1a0db31..670b4b9 100644
--- a/java/res/drawable-land-hdpi/key_hint_question_holo.9.png
+++ b/java/res/drawable-land-hdpi/key_hint_question_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/key_hint_question_large_holo.9.png b/java/res/drawable-land-hdpi/key_hint_question_large_holo.9.png
index 44dfdc4..692f4a6 100644
--- a/java/res/drawable-land-hdpi/key_hint_question_large_holo.9.png
+++ b/java/res/drawable-land-hdpi/key_hint_question_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/key_hint_quote_holo.9.png b/java/res/drawable-land-hdpi/key_hint_quote_holo.9.png
index bfb612f..9cc8615 100644
--- a/java/res/drawable-land-hdpi/key_hint_quote_holo.9.png
+++ b/java/res/drawable-land-hdpi/key_hint_quote_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/key_hint_quote_large_holo.9.png b/java/res/drawable-land-hdpi/key_hint_quote_large_holo.9.png
index e73b9e0..664467b 100644
--- a/java/res/drawable-land-hdpi/key_hint_quote_large_holo.9.png
+++ b/java/res/drawable-land-hdpi/key_hint_quote_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/key_hint_semicolon_holo.9.png b/java/res/drawable-land-hdpi/key_hint_semicolon_holo.9.png
deleted file mode 100644
index f352758..0000000
--- a/java/res/drawable-land-hdpi/key_hint_semicolon_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-land-hdpi/key_hint_simplequote_holo.9.png b/java/res/drawable-land-hdpi/key_hint_simplequote_holo.9.png
deleted file mode 100644
index e69a969..0000000
--- a/java/res/drawable-land-hdpi/key_hint_simplequote_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-land-hdpi/key_hint_slash_holo.9.png b/java/res/drawable-land-hdpi/key_hint_slash_holo.9.png
deleted file mode 100644
index 592ea44..0000000
--- a/java/res/drawable-land-hdpi/key_hint_slash_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-land-hdpi/key_hint_slash_large_holo.9.png b/java/res/drawable-land-hdpi/key_hint_slash_large_holo.9.png
deleted file mode 100644
index b18be7b..0000000
--- a/java/res/drawable-land-hdpi/key_hint_slash_large_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-land-hdpi/key_hint_smaller_holo.9.png b/java/res/drawable-land-hdpi/key_hint_smaller_holo.9.png
deleted file mode 100644
index 145320d..0000000
--- a/java/res/drawable-land-hdpi/key_hint_smaller_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-land-hdpi/key_hint_star_holo.9.png b/java/res/drawable-land-hdpi/key_hint_star_holo.9.png
deleted file mode 100644
index 9bde78a..0000000
--- a/java/res/drawable-land-hdpi/key_hint_star_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-land-hdpi/key_hint_underline_holo.9.png b/java/res/drawable-land-hdpi/key_hint_underline_holo.9.png
index b2ab17d..2cb4077 100644
--- a/java/res/drawable-land-hdpi/key_hint_underline_holo.9.png
+++ b/java/res/drawable-land-hdpi/key_hint_underline_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/key_hint_underline_large_holo.9.png b/java/res/drawable-land-hdpi/key_hint_underline_large_holo.9.png
index dad34fc..6b9a491 100644
--- a/java/res/drawable-land-hdpi/key_hint_underline_large_holo.9.png
+++ b/java/res/drawable-land-hdpi/key_hint_underline_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-hdpi/key_hint_underscore_holo.9.png b/java/res/drawable-land-hdpi/key_hint_underscore_holo.9.png
deleted file mode 100644
index e4f2719..0000000
--- a/java/res/drawable-land-hdpi/key_hint_underscore_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-land-hdpi/key_hint_underscore_large_holo.9.png b/java/res/drawable-land-hdpi/key_hint_underscore_large_holo.9.png
deleted file mode 100644
index dad34fc..0000000
--- a/java/res/drawable-land-hdpi/key_hint_underscore_large_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_at_holo.9.png b/java/res/drawable-land-mdpi/key_hint_at_holo.9.png
index 5b946ff..8c84654 100644
--- a/java/res/drawable-land-mdpi/key_hint_at_holo.9.png
+++ b/java/res/drawable-land-mdpi/key_hint_at_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_at_large_holo.9.png b/java/res/drawable-land-mdpi/key_hint_at_large_holo.9.png
index 852f899..b9e095b 100644
--- a/java/res/drawable-land-mdpi/key_hint_at_large_holo.9.png
+++ b/java/res/drawable-land-mdpi/key_hint_at_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_colon_holo.9.png b/java/res/drawable-land-mdpi/key_hint_colon_holo.9.png
index 1d9346e..3cd0e3c 100644
--- a/java/res/drawable-land-mdpi/key_hint_colon_holo.9.png
+++ b/java/res/drawable-land-mdpi/key_hint_colon_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_colon_large_holo.9.png b/java/res/drawable-land-mdpi/key_hint_colon_large_holo.9.png
index 17e9091..01b47b2 100644
--- a/java/res/drawable-land-mdpi/key_hint_colon_large_holo.9.png
+++ b/java/res/drawable-land-mdpi/key_hint_colon_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_comma_holo.9.png b/java/res/drawable-land-mdpi/key_hint_comma_holo.9.png
index c2a913c..b70f71b 100644
--- a/java/res/drawable-land-mdpi/key_hint_comma_holo.9.png
+++ b/java/res/drawable-land-mdpi/key_hint_comma_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_comma_large_holo.9.png b/java/res/drawable-land-mdpi/key_hint_comma_large_holo.9.png
index 846f213..1ae82d4 100644
--- a/java/res/drawable-land-mdpi/key_hint_comma_large_holo.9.png
+++ b/java/res/drawable-land-mdpi/key_hint_comma_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_dash_holo.9.png b/java/res/drawable-land-mdpi/key_hint_dash_holo.9.png
deleted file mode 100644
index 1cb0bdf..0000000
--- a/java/res/drawable-land-mdpi/key_hint_dash_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_doublecross_holo.9.png b/java/res/drawable-land-mdpi/key_hint_doublecross_holo.9.png
deleted file mode 100644
index 7e7ceb3..0000000
--- a/java/res/drawable-land-mdpi/key_hint_doublecross_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_equal_holo.9.png b/java/res/drawable-land-mdpi/key_hint_equal_holo.9.png
deleted file mode 100644
index 8e57059..0000000
--- a/java/res/drawable-land-mdpi/key_hint_equal_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_exclamation_holo.9.png b/java/res/drawable-land-mdpi/key_hint_exclamation_holo.9.png
index ce8e8de..3409535 100644
--- a/java/res/drawable-land-mdpi/key_hint_exclamation_holo.9.png
+++ b/java/res/drawable-land-mdpi/key_hint_exclamation_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_exclamation_large_holo.9.png b/java/res/drawable-land-mdpi/key_hint_exclamation_large_holo.9.png
index 035dcf8..8dd2f27 100644
--- a/java/res/drawable-land-mdpi/key_hint_exclamation_large_holo.9.png
+++ b/java/res/drawable-land-mdpi/key_hint_exclamation_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_larger_holo.9.png b/java/res/drawable-land-mdpi/key_hint_larger_holo.9.png
deleted file mode 100644
index 37c0527..0000000
--- a/java/res/drawable-land-mdpi/key_hint_larger_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_minus_large_holo.9.png b/java/res/drawable-land-mdpi/key_hint_minus_large_holo.9.png
deleted file mode 100644
index 52c28dd..0000000
--- a/java/res/drawable-land-mdpi/key_hint_minus_large_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_parenclose_holo.9.png b/java/res/drawable-land-mdpi/key_hint_parenclose_holo.9.png
deleted file mode 100644
index 97e1f14..0000000
--- a/java/res/drawable-land-mdpi/key_hint_parenclose_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_parenopen_holo.9.png b/java/res/drawable-land-mdpi/key_hint_parenopen_holo.9.png
deleted file mode 100644
index 36add5d..0000000
--- a/java/res/drawable-land-mdpi/key_hint_parenopen_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_period_holo.9.png b/java/res/drawable-land-mdpi/key_hint_period_holo.9.png
deleted file mode 100644
index 4a70f07..0000000
--- a/java/res/drawable-land-mdpi/key_hint_period_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_plus_holo.9.png b/java/res/drawable-land-mdpi/key_hint_plus_holo.9.png
index 931390b..51e86ba 100644
--- a/java/res/drawable-land-mdpi/key_hint_plus_holo.9.png
+++ b/java/res/drawable-land-mdpi/key_hint_plus_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_plus_large_holo.9.png b/java/res/drawable-land-mdpi/key_hint_plus_large_holo.9.png
index e6f9f8a..bf30f92 100644
--- a/java/res/drawable-land-mdpi/key_hint_plus_large_holo.9.png
+++ b/java/res/drawable-land-mdpi/key_hint_plus_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_question_holo.9.png b/java/res/drawable-land-mdpi/key_hint_question_holo.9.png
index 6cbeb59..38b5d61 100644
--- a/java/res/drawable-land-mdpi/key_hint_question_holo.9.png
+++ b/java/res/drawable-land-mdpi/key_hint_question_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_question_large_holo.9.png b/java/res/drawable-land-mdpi/key_hint_question_large_holo.9.png
index bfd58de..448a027 100644
--- a/java/res/drawable-land-mdpi/key_hint_question_large_holo.9.png
+++ b/java/res/drawable-land-mdpi/key_hint_question_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_quote_holo.9.png b/java/res/drawable-land-mdpi/key_hint_quote_holo.9.png
index 3b361b7..92fe8ea 100644
--- a/java/res/drawable-land-mdpi/key_hint_quote_holo.9.png
+++ b/java/res/drawable-land-mdpi/key_hint_quote_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_quote_large_holo.9.png b/java/res/drawable-land-mdpi/key_hint_quote_large_holo.9.png
index 2a08aa1..a777d01 100644
--- a/java/res/drawable-land-mdpi/key_hint_quote_large_holo.9.png
+++ b/java/res/drawable-land-mdpi/key_hint_quote_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_semicolon_holo.9.png b/java/res/drawable-land-mdpi/key_hint_semicolon_holo.9.png
deleted file mode 100644
index 63a3875..0000000
--- a/java/res/drawable-land-mdpi/key_hint_semicolon_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_simplequote_holo.9.png b/java/res/drawable-land-mdpi/key_hint_simplequote_holo.9.png
deleted file mode 100644
index 3c217b0..0000000
--- a/java/res/drawable-land-mdpi/key_hint_simplequote_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_slash_holo.9.png b/java/res/drawable-land-mdpi/key_hint_slash_holo.9.png
deleted file mode 100644
index 98545f0..0000000
--- a/java/res/drawable-land-mdpi/key_hint_slash_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_slash_large_holo.9.png b/java/res/drawable-land-mdpi/key_hint_slash_large_holo.9.png
deleted file mode 100644
index a3a0297..0000000
--- a/java/res/drawable-land-mdpi/key_hint_slash_large_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_smaller_holo.9.png b/java/res/drawable-land-mdpi/key_hint_smaller_holo.9.png
deleted file mode 100644
index 5af1836..0000000
--- a/java/res/drawable-land-mdpi/key_hint_smaller_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_star_holo.9.png b/java/res/drawable-land-mdpi/key_hint_star_holo.9.png
deleted file mode 100644
index 18304d7..0000000
--- a/java/res/drawable-land-mdpi/key_hint_star_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_underline_holo.9.png b/java/res/drawable-land-mdpi/key_hint_underline_holo.9.png
index 06f3efb..7a452c5 100644
--- a/java/res/drawable-land-mdpi/key_hint_underline_holo.9.png
+++ b/java/res/drawable-land-mdpi/key_hint_underline_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_underline_large_holo.9.png b/java/res/drawable-land-mdpi/key_hint_underline_large_holo.9.png
index 50f99a1..f738b02 100644
--- a/java/res/drawable-land-mdpi/key_hint_underline_large_holo.9.png
+++ b/java/res/drawable-land-mdpi/key_hint_underline_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-xhdpi/hint_popup_holo.9.png b/java/res/drawable-land-xhdpi/hint_popup_holo.9.png
new file mode 100644
index 0000000..3cd20d3
--- /dev/null
+++ b/java/res/drawable-land-xhdpi/hint_popup_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-xhdpi/key_hint_at_holo.9.png b/java/res/drawable-land-xhdpi/key_hint_at_holo.9.png
new file mode 100644
index 0000000..1d257cb
--- /dev/null
+++ b/java/res/drawable-land-xhdpi/key_hint_at_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-xhdpi/key_hint_at_large_holo.9.png b/java/res/drawable-land-xhdpi/key_hint_at_large_holo.9.png
new file mode 100644
index 0000000..53de283
--- /dev/null
+++ b/java/res/drawable-land-xhdpi/key_hint_at_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-xhdpi/key_hint_colon_holo.9.png b/java/res/drawable-land-xhdpi/key_hint_colon_holo.9.png
new file mode 100644
index 0000000..73394b5
--- /dev/null
+++ b/java/res/drawable-land-xhdpi/key_hint_colon_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-xhdpi/key_hint_colon_large_holo.9.png b/java/res/drawable-land-xhdpi/key_hint_colon_large_holo.9.png
new file mode 100644
index 0000000..a4a6acb
--- /dev/null
+++ b/java/res/drawable-land-xhdpi/key_hint_colon_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-xhdpi/key_hint_comma_holo.9.png b/java/res/drawable-land-xhdpi/key_hint_comma_holo.9.png
new file mode 100644
index 0000000..d4dbdf4
--- /dev/null
+++ b/java/res/drawable-land-xhdpi/key_hint_comma_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-xhdpi/key_hint_comma_large_holo.9.png b/java/res/drawable-land-xhdpi/key_hint_comma_large_holo.9.png
new file mode 100644
index 0000000..aea5c8e
--- /dev/null
+++ b/java/res/drawable-land-xhdpi/key_hint_comma_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-xhdpi/key_hint_exclamation_holo.9.png b/java/res/drawable-land-xhdpi/key_hint_exclamation_holo.9.png
new file mode 100644
index 0000000..078d1d8
--- /dev/null
+++ b/java/res/drawable-land-xhdpi/key_hint_exclamation_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-xhdpi/key_hint_exclamation_large_holo.9.png b/java/res/drawable-land-xhdpi/key_hint_exclamation_large_holo.9.png
new file mode 100644
index 0000000..ddd6b13
--- /dev/null
+++ b/java/res/drawable-land-xhdpi/key_hint_exclamation_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-xhdpi/key_hint_plus_holo.9.png b/java/res/drawable-land-xhdpi/key_hint_plus_holo.9.png
new file mode 100644
index 0000000..d0ce9c9
--- /dev/null
+++ b/java/res/drawable-land-xhdpi/key_hint_plus_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-xhdpi/key_hint_plus_large_holo.9.png b/java/res/drawable-land-xhdpi/key_hint_plus_large_holo.9.png
new file mode 100644
index 0000000..9cf20e8
--- /dev/null
+++ b/java/res/drawable-land-xhdpi/key_hint_plus_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-xhdpi/key_hint_question_holo.9.png b/java/res/drawable-land-xhdpi/key_hint_question_holo.9.png
new file mode 100644
index 0000000..1e886d8
--- /dev/null
+++ b/java/res/drawable-land-xhdpi/key_hint_question_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-xhdpi/key_hint_question_large_holo.9.png b/java/res/drawable-land-xhdpi/key_hint_question_large_holo.9.png
new file mode 100644
index 0000000..8262287
--- /dev/null
+++ b/java/res/drawable-land-xhdpi/key_hint_question_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-xhdpi/key_hint_quote_holo.9.png b/java/res/drawable-land-xhdpi/key_hint_quote_holo.9.png
new file mode 100644
index 0000000..fd8bbad
--- /dev/null
+++ b/java/res/drawable-land-xhdpi/key_hint_quote_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-xhdpi/key_hint_quote_large_holo.9.png b/java/res/drawable-land-xhdpi/key_hint_quote_large_holo.9.png
new file mode 100644
index 0000000..51d5b49
--- /dev/null
+++ b/java/res/drawable-land-xhdpi/key_hint_quote_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-xhdpi/key_hint_underline_holo.9.png b/java/res/drawable-land-xhdpi/key_hint_underline_holo.9.png
new file mode 100644
index 0000000..37d2fa5
--- /dev/null
+++ b/java/res/drawable-land-xhdpi/key_hint_underline_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-xhdpi/key_hint_underline_large_holo.9.png b/java/res/drawable-land-xhdpi/key_hint_underline_large_holo.9.png
new file mode 100644
index 0000000..4249a8e
--- /dev/null
+++ b/java/res/drawable-land-xhdpi/key_hint_underline_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xlarge/btn_center_default.9.png b/java/res/drawable-mdpi/btn_center_default.9.png
old mode 100755
new mode 100644
similarity index 100%
copy from java/res/drawable-xlarge/btn_center_default.9.png
copy to java/res/drawable-mdpi/btn_center_default.9.png
Binary files differ
diff --git a/java/res/drawable-xlarge/btn_center_pressed.9.png b/java/res/drawable-mdpi/btn_center_pressed.9.png
old mode 100755
new mode 100644
similarity index 100%
copy from java/res/drawable-xlarge/btn_center_pressed.9.png
copy to java/res/drawable-mdpi/btn_center_pressed.9.png
Binary files differ
diff --git a/java/res/drawable-xlarge/btn_center_selected.9.png b/java/res/drawable-mdpi/btn_center_selected.9.png
similarity index 100%
copy from java/res/drawable-xlarge/btn_center_selected.9.png
copy to java/res/drawable-mdpi/btn_center_selected.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/cancel.png b/java/res/drawable-mdpi/cancel.png
deleted file mode 100644
index 713a378..0000000
--- a/java/res/drawable-mdpi/cancel.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/cancel_holo.9.png b/java/res/drawable-mdpi/cancel_holo.9.png
deleted file mode 100644
index 74f967e..0000000
--- a/java/res/drawable-mdpi/cancel_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/dialog_bubble_step02.9.png b/java/res/drawable-mdpi/dialog_bubble_step02.9.png
deleted file mode 100644
index d77f85f..0000000
--- a/java/res/drawable-mdpi/dialog_bubble_step02.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/dialog_bubble_step07.9.png b/java/res/drawable-mdpi/dialog_bubble_step07.9.png
deleted file mode 100644
index 80f4a0e..0000000
--- a/java/res/drawable-mdpi/dialog_bubble_step07.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_at_holo.9.png b/java/res/drawable-mdpi/key_hint_at_holo.9.png
index 5b946ff..8c84654 100644
--- a/java/res/drawable-mdpi/key_hint_at_holo.9.png
+++ b/java/res/drawable-mdpi/key_hint_at_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_at_large_holo.9.png b/java/res/drawable-mdpi/key_hint_at_large_holo.9.png
index 852f899..b9e095b 100644
--- a/java/res/drawable-mdpi/key_hint_at_large_holo.9.png
+++ b/java/res/drawable-mdpi/key_hint_at_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_colon_holo.9.png b/java/res/drawable-mdpi/key_hint_colon_holo.9.png
index 1d9346e..3cd0e3c 100644
--- a/java/res/drawable-mdpi/key_hint_colon_holo.9.png
+++ b/java/res/drawable-mdpi/key_hint_colon_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_colon_large_holo.9.png b/java/res/drawable-mdpi/key_hint_colon_large_holo.9.png
index 17e9091..01b47b2 100644
--- a/java/res/drawable-mdpi/key_hint_colon_large_holo.9.png
+++ b/java/res/drawable-mdpi/key_hint_colon_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_comma_holo.9.png b/java/res/drawable-mdpi/key_hint_comma_holo.9.png
index c2a913c..b70f71b 100644
--- a/java/res/drawable-mdpi/key_hint_comma_holo.9.png
+++ b/java/res/drawable-mdpi/key_hint_comma_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_comma_large_holo.9.png b/java/res/drawable-mdpi/key_hint_comma_large_holo.9.png
index 846f213..1ae82d4 100644
--- a/java/res/drawable-mdpi/key_hint_comma_large_holo.9.png
+++ b/java/res/drawable-mdpi/key_hint_comma_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_dash_holo.9.png b/java/res/drawable-mdpi/key_hint_dash_holo.9.png
deleted file mode 100644
index 2ee22ba..0000000
--- a/java/res/drawable-mdpi/key_hint_dash_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_doublecross_holo.9.png b/java/res/drawable-mdpi/key_hint_doublecross_holo.9.png
deleted file mode 100644
index 0da9332..0000000
--- a/java/res/drawable-mdpi/key_hint_doublecross_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_equal_holo.9.png b/java/res/drawable-mdpi/key_hint_equal_holo.9.png
deleted file mode 100644
index f5a9ba2..0000000
--- a/java/res/drawable-mdpi/key_hint_equal_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_exclamation_holo.9.png b/java/res/drawable-mdpi/key_hint_exclamation_holo.9.png
index ce8e8de..3409535 100644
--- a/java/res/drawable-mdpi/key_hint_exclamation_holo.9.png
+++ b/java/res/drawable-mdpi/key_hint_exclamation_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_exclamation_large_holo.9.png b/java/res/drawable-mdpi/key_hint_exclamation_large_holo.9.png
index 035dcf8..8dd2f27 100644
--- a/java/res/drawable-mdpi/key_hint_exclamation_large_holo.9.png
+++ b/java/res/drawable-mdpi/key_hint_exclamation_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_larger_holo.9.png b/java/res/drawable-mdpi/key_hint_larger_holo.9.png
deleted file mode 100644
index 50652bb..0000000
--- a/java/res/drawable-mdpi/key_hint_larger_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_minus_holo.9.png b/java/res/drawable-mdpi/key_hint_minus_holo.9.png
deleted file mode 100644
index e59a315..0000000
--- a/java/res/drawable-mdpi/key_hint_minus_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_minus_large_holo.9.png b/java/res/drawable-mdpi/key_hint_minus_large_holo.9.png
deleted file mode 100644
index 52c28dd..0000000
--- a/java/res/drawable-mdpi/key_hint_minus_large_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_hint_0.9.png b/java/res/drawable-mdpi/key_hint_num0.9.png
similarity index 100%
rename from java/res/drawable-mdpi/keyboard_hint_0.9.png
rename to java/res/drawable-mdpi/key_hint_num0.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_hint_1.9.png b/java/res/drawable-mdpi/key_hint_num1.9.png
similarity index 100%
rename from java/res/drawable-mdpi/keyboard_hint_1.9.png
rename to java/res/drawable-mdpi/key_hint_num1.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_hint_2.9.png b/java/res/drawable-mdpi/key_hint_num2.9.png
similarity index 100%
rename from java/res/drawable-mdpi/keyboard_hint_2.9.png
rename to java/res/drawable-mdpi/key_hint_num2.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_hint_3.9.png b/java/res/drawable-mdpi/key_hint_num3.9.png
similarity index 100%
rename from java/res/drawable-mdpi/keyboard_hint_3.9.png
rename to java/res/drawable-mdpi/key_hint_num3.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_hint_4.9.png b/java/res/drawable-mdpi/key_hint_num4.9.png
similarity index 100%
rename from java/res/drawable-mdpi/keyboard_hint_4.9.png
rename to java/res/drawable-mdpi/key_hint_num4.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_hint_5.9.png b/java/res/drawable-mdpi/key_hint_num5.9.png
similarity index 100%
rename from java/res/drawable-mdpi/keyboard_hint_5.9.png
rename to java/res/drawable-mdpi/key_hint_num5.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_hint_6.9.png b/java/res/drawable-mdpi/key_hint_num6.9.png
similarity index 100%
rename from java/res/drawable-mdpi/keyboard_hint_6.9.png
rename to java/res/drawable-mdpi/key_hint_num6.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_hint_7.9.png b/java/res/drawable-mdpi/key_hint_num7.9.png
similarity index 100%
rename from java/res/drawable-mdpi/keyboard_hint_7.9.png
rename to java/res/drawable-mdpi/key_hint_num7.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_hint_8.9.png b/java/res/drawable-mdpi/key_hint_num8.9.png
similarity index 100%
rename from java/res/drawable-mdpi/keyboard_hint_8.9.png
rename to java/res/drawable-mdpi/key_hint_num8.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_hint_9.9.png b/java/res/drawable-mdpi/key_hint_num9.9.png
similarity index 100%
rename from java/res/drawable-mdpi/keyboard_hint_9.9.png
rename to java/res/drawable-mdpi/key_hint_num9.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_parenclose_holo.9.png b/java/res/drawable-mdpi/key_hint_parenclose_holo.9.png
deleted file mode 100644
index 52ee86a..0000000
--- a/java/res/drawable-mdpi/key_hint_parenclose_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_parenopen_holo.9.png b/java/res/drawable-mdpi/key_hint_parenopen_holo.9.png
deleted file mode 100644
index b0ed388..0000000
--- a/java/res/drawable-mdpi/key_hint_parenopen_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_period_holo.9.png b/java/res/drawable-mdpi/key_hint_period_holo.9.png
deleted file mode 100644
index 8d798a5..0000000
--- a/java/res/drawable-mdpi/key_hint_period_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_plus_holo.9.png b/java/res/drawable-mdpi/key_hint_plus_holo.9.png
index 931390b..51e86ba 100644
--- a/java/res/drawable-mdpi/key_hint_plus_holo.9.png
+++ b/java/res/drawable-mdpi/key_hint_plus_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_plus_large_holo.9.png b/java/res/drawable-mdpi/key_hint_plus_large_holo.9.png
index e6f9f8a..bf30f92 100644
--- a/java/res/drawable-mdpi/key_hint_plus_large_holo.9.png
+++ b/java/res/drawable-mdpi/key_hint_plus_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_question_holo.9.png b/java/res/drawable-mdpi/key_hint_question_holo.9.png
index 6cbeb59..38b5d61 100644
--- a/java/res/drawable-mdpi/key_hint_question_holo.9.png
+++ b/java/res/drawable-mdpi/key_hint_question_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_question_large_holo.9.png b/java/res/drawable-mdpi/key_hint_question_large_holo.9.png
index bfd58de..448a027 100644
--- a/java/res/drawable-mdpi/key_hint_question_large_holo.9.png
+++ b/java/res/drawable-mdpi/key_hint_question_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_quote_holo.9.png b/java/res/drawable-mdpi/key_hint_quote_holo.9.png
index 3b361b7..92fe8ea 100644
--- a/java/res/drawable-mdpi/key_hint_quote_holo.9.png
+++ b/java/res/drawable-mdpi/key_hint_quote_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_quote_large_holo.9.png b/java/res/drawable-mdpi/key_hint_quote_large_holo.9.png
index 2a08aa1..a777d01 100644
--- a/java/res/drawable-mdpi/key_hint_quote_large_holo.9.png
+++ b/java/res/drawable-mdpi/key_hint_quote_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_semicolon_holo.9.png b/java/res/drawable-mdpi/key_hint_semicolon_holo.9.png
deleted file mode 100644
index 7f9e8c9..0000000
--- a/java/res/drawable-mdpi/key_hint_semicolon_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_simplequote_holo.9.png b/java/res/drawable-mdpi/key_hint_simplequote_holo.9.png
deleted file mode 100644
index 5e1a45c..0000000
--- a/java/res/drawable-mdpi/key_hint_simplequote_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_slash_holo.9.png b/java/res/drawable-mdpi/key_hint_slash_holo.9.png
deleted file mode 100644
index 645586a..0000000
--- a/java/res/drawable-mdpi/key_hint_slash_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_slash_large_holo.9.png b/java/res/drawable-mdpi/key_hint_slash_large_holo.9.png
deleted file mode 100644
index 75c3bb1..0000000
--- a/java/res/drawable-mdpi/key_hint_slash_large_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_smaller_holo.9.png b/java/res/drawable-mdpi/key_hint_smaller_holo.9.png
deleted file mode 100644
index 2a0587c..0000000
--- a/java/res/drawable-mdpi/key_hint_smaller_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_star_holo.9.png b/java/res/drawable-mdpi/key_hint_star_holo.9.png
deleted file mode 100644
index 9f33b98..0000000
--- a/java/res/drawable-mdpi/key_hint_star_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_underline_holo.9.png b/java/res/drawable-mdpi/key_hint_underline_holo.9.png
index b137b00..7a452c5 100644
--- a/java/res/drawable-mdpi/key_hint_underline_holo.9.png
+++ b/java/res/drawable-mdpi/key_hint_underline_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_underline_large_holo.9.png b/java/res/drawable-mdpi/key_hint_underline_large_holo.9.png
index 9845e3b..f738b02 100644
--- a/java/res/drawable-mdpi/key_hint_underline_large_holo.9.png
+++ b/java/res/drawable-mdpi/key_hint_underline_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_underscore_holo.9.png b/java/res/drawable-mdpi/key_hint_underscore_holo.9.png
deleted file mode 100644
index 52e871e..0000000
--- a/java/res/drawable-mdpi/key_hint_underscore_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/key_hint_underscore_large_holo.9.png b/java/res/drawable-mdpi/key_hint_underscore_large_holo.9.png
deleted file mode 100644
index ee0e835..0000000
--- a/java/res/drawable-mdpi/key_hint_underscore_large_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_hint_at.9.png b/java/res/drawable-mdpi/keyboard_hint_at.9.png
deleted file mode 100644
index 69baede..0000000
--- a/java/res/drawable-mdpi/keyboard_hint_at.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_hint_colon.9.png b/java/res/drawable-mdpi/keyboard_hint_colon.9.png
deleted file mode 100644
index 9d0d7cb..0000000
--- a/java/res/drawable-mdpi/keyboard_hint_colon.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_hint_doublecross.9.png b/java/res/drawable-mdpi/keyboard_hint_doublecross.9.png
deleted file mode 100644
index d24aa0f..0000000
--- a/java/res/drawable-mdpi/keyboard_hint_doublecross.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_hint_exclamation.9.png b/java/res/drawable-mdpi/keyboard_hint_exclamation.9.png
deleted file mode 100644
index f6cc7fe..0000000
--- a/java/res/drawable-mdpi/keyboard_hint_exclamation.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_hint_greater.9.png b/java/res/drawable-mdpi/keyboard_hint_greater.9.png
deleted file mode 100644
index 5210392..0000000
--- a/java/res/drawable-mdpi/keyboard_hint_greater.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_hint_plus.9.png b/java/res/drawable-mdpi/keyboard_hint_plus.9.png
deleted file mode 100644
index d1d85ac..0000000
--- a/java/res/drawable-mdpi/keyboard_hint_plus.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_hint_question.9.png b/java/res/drawable-mdpi/keyboard_hint_question.9.png
deleted file mode 100644
index 37f6e5f..0000000
--- a/java/res/drawable-mdpi/keyboard_hint_question.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_hint_quote.9.png b/java/res/drawable-mdpi/keyboard_hint_quote.9.png
deleted file mode 100644
index e7d2cb5..0000000
--- a/java/res/drawable-mdpi/keyboard_hint_quote.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_hint_smaller.9.png b/java/res/drawable-mdpi/keyboard_hint_smaller.9.png
deleted file mode 100644
index 76553cf..0000000
--- a/java/res/drawable-mdpi/keyboard_hint_smaller.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_hint_star.9.png b/java/res/drawable-mdpi/keyboard_hint_star.9.png
deleted file mode 100644
index 47978c4..0000000
--- a/java/res/drawable-mdpi/keyboard_hint_star.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_key_feedback_background_holo.9.png b/java/res/drawable-mdpi/keyboard_key_feedback_background_holo.9.png
index 286cf84..3d6a76f 100644
--- a/java/res/drawable-mdpi/keyboard_key_feedback_background_holo.9.png
+++ b/java/res/drawable-mdpi/keyboard_key_feedback_background_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xlarge/mic_base.png b/java/res/drawable-mdpi/mic_base.png
similarity index 100%
copy from java/res/drawable-xlarge/mic_base.png
copy to java/res/drawable-mdpi/mic_base.png
Binary files differ
diff --git a/java/res/drawable-xlarge/mic_full.png b/java/res/drawable-mdpi/mic_full.png
similarity index 100%
copy from java/res/drawable-xlarge/mic_full.png
copy to java/res/drawable-mdpi/mic_full.png
Binary files differ
diff --git a/java/res/drawable-mdpi/mic_slash_holo.png b/java/res/drawable-mdpi/mic_slash_holo.png
deleted file mode 100644
index 07181e6..0000000
--- a/java/res/drawable-mdpi/mic_slash_holo.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/ok_cancel.png b/java/res/drawable-mdpi/ok_cancel.png
deleted file mode 100644
index 20d10f9..0000000
--- a/java/res/drawable-mdpi/ok_cancel.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/ok_cancel_holo.9.png b/java/res/drawable-mdpi/ok_cancel_holo.9.png
deleted file mode 100644
index 035a4f6..0000000
--- a/java/res/drawable-mdpi/ok_cancel_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/speak_now_level0.png b/java/res/drawable-mdpi/speak_now_level0.png
deleted file mode 100644
index 5bd1360..0000000
--- a/java/res/drawable-mdpi/speak_now_level0.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/speak_now_level0_holo.png b/java/res/drawable-mdpi/speak_now_level0_holo.png
deleted file mode 100644
index 2090b95..0000000
--- a/java/res/drawable-mdpi/speak_now_level0_holo.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/speak_now_level1.png b/java/res/drawable-mdpi/speak_now_level1.png
deleted file mode 100644
index ccb76b8..0000000
--- a/java/res/drawable-mdpi/speak_now_level1.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/speak_now_level1_holo.png b/java/res/drawable-mdpi/speak_now_level1_holo.png
deleted file mode 100644
index 8acf482..0000000
--- a/java/res/drawable-mdpi/speak_now_level1_holo.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/speak_now_level2.png b/java/res/drawable-mdpi/speak_now_level2.png
deleted file mode 100644
index 715f900..0000000
--- a/java/res/drawable-mdpi/speak_now_level2.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/speak_now_level2_holo.png b/java/res/drawable-mdpi/speak_now_level2_holo.png
deleted file mode 100644
index 4b307d5..0000000
--- a/java/res/drawable-mdpi/speak_now_level2_holo.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/speak_now_level3.png b/java/res/drawable-mdpi/speak_now_level3.png
deleted file mode 100644
index 725248a..0000000
--- a/java/res/drawable-mdpi/speak_now_level3.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/speak_now_level3_holo.png b/java/res/drawable-mdpi/speak_now_level3_holo.png
deleted file mode 100644
index 7c7cd66..0000000
--- a/java/res/drawable-mdpi/speak_now_level3_holo.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/speak_now_level4.png b/java/res/drawable-mdpi/speak_now_level4.png
deleted file mode 100644
index ff6c50b..0000000
--- a/java/res/drawable-mdpi/speak_now_level4.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/speak_now_level4_holo.png b/java/res/drawable-mdpi/speak_now_level4_holo.png
deleted file mode 100644
index 362c453..0000000
--- a/java/res/drawable-mdpi/speak_now_level4_holo.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/speak_now_level5.png b/java/res/drawable-mdpi/speak_now_level5.png
deleted file mode 100644
index a5d6b89..0000000
--- a/java/res/drawable-mdpi/speak_now_level5.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/speak_now_level5_holo.png b/java/res/drawable-mdpi/speak_now_level5_holo.png
deleted file mode 100644
index 1886bef..0000000
--- a/java/res/drawable-mdpi/speak_now_level5_holo.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/speak_now_level6.png b/java/res/drawable-mdpi/speak_now_level6.png
deleted file mode 100644
index dcdb48d..0000000
--- a/java/res/drawable-mdpi/speak_now_level6.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/speak_now_level6_holo.png b/java/res/drawable-mdpi/speak_now_level6_holo.png
deleted file mode 100644
index 88e4131..0000000
--- a/java/res/drawable-mdpi/speak_now_level6_holo.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_bkeyboard_done.png b/java/res/drawable-mdpi/sym_bkeyboard_done.png
deleted file mode 100644
index 05ce7c6..0000000
--- a/java/res/drawable-mdpi/sym_bkeyboard_done.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_done.png b/java/res/drawable-mdpi/sym_keyboard_done.png
deleted file mode 100644
index c0d6d13..0000000
--- a/java/res/drawable-mdpi/sym_keyboard_done.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_feedback_done.png b/java/res/drawable-mdpi/sym_keyboard_feedback_done.png
deleted file mode 100644
index 0d7ebd4..0000000
--- a/java/res/drawable-mdpi/sym_keyboard_feedback_done.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_feedback_shift_locked.png b/java/res/drawable-mdpi/sym_keyboard_feedback_shift_locked.png
deleted file mode 100644
index 494524a..0000000
--- a/java/res/drawable-mdpi/sym_keyboard_feedback_shift_locked.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_mic_disabled.png b/java/res/drawable-mdpi/sym_keyboard_mic_disabled.png
deleted file mode 100644
index e926b3f..0000000
--- a/java/res/drawable-mdpi/sym_keyboard_mic_disabled.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_smiley_holo.png b/java/res/drawable-mdpi/sym_keyboard_smiley_holo.png
deleted file mode 100644
index 594fe21..0000000
--- a/java/res/drawable-mdpi/sym_keyboard_smiley_holo.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/voice_ime_background.9.png b/java/res/drawable-mdpi/voice_ime_background.9.png
deleted file mode 100644
index 9b15bc2..0000000
--- a/java/res/drawable-mdpi/voice_ime_background.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/voice_swipe_hint.png b/java/res/drawable-mdpi/voice_swipe_hint.png
deleted file mode 100644
index bb88732..0000000
--- a/java/res/drawable-mdpi/voice_swipe_hint.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-xlarge/vs_dialog_blue.9.png b/java/res/drawable-mdpi/vs_dialog_blue.9.png
similarity index 100%
copy from java/res/drawable-xlarge/vs_dialog_blue.9.png
copy to java/res/drawable-mdpi/vs_dialog_blue.9.png
Binary files differ
diff --git a/java/res/drawable-xlarge/vs_dialog_red.9.png b/java/res/drawable-mdpi/vs_dialog_red.9.png
similarity index 100%
copy from java/res/drawable-xlarge/vs_dialog_red.9.png
copy to java/res/drawable-mdpi/vs_dialog_red.9.png
Binary files differ
diff --git a/java/res/drawable-xlarge/vs_dialog_yellow.9.png b/java/res/drawable-mdpi/vs_dialog_yellow.9.png
similarity index 100%
copy from java/res/drawable-xlarge/vs_dialog_yellow.9.png
copy to java/res/drawable-mdpi/vs_dialog_yellow.9.png
Binary files differ
diff --git a/java/res/drawable-xlarge/vs_popup_mic_edge.png b/java/res/drawable-mdpi/vs_popup_mic_edge.png
similarity index 100%
copy from java/res/drawable-xlarge/vs_popup_mic_edge.png
copy to java/res/drawable-mdpi/vs_popup_mic_edge.png
Binary files differ
diff --git a/java/res/drawable-mdpi/working.png b/java/res/drawable-mdpi/working.png
deleted file mode 100644
index 4a930c5..0000000
--- a/java/res/drawable-mdpi/working.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-sw600dp-hdpi/btn_keyboard_key_popup_selected_holo.9.png b/java/res/drawable-sw600dp-hdpi/btn_keyboard_key_popup_selected_holo.9.png
new file mode 100644
index 0000000..544ed7f
--- /dev/null
+++ b/java/res/drawable-sw600dp-hdpi/btn_keyboard_key_popup_selected_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-hdpi/hint_popup_holo.9.png b/java/res/drawable-sw600dp-hdpi/hint_popup_holo.9.png
new file mode 100644
index 0000000..2ffc6ea
--- /dev/null
+++ b/java/res/drawable-sw600dp-hdpi/hint_popup_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-hdpi/keyboard_key_feedback_background_holo.9.png b/java/res/drawable-sw600dp-hdpi/keyboard_key_feedback_background_holo.9.png
new file mode 100644
index 0000000..39219a5
--- /dev/null
+++ b/java/res/drawable-sw600dp-hdpi/keyboard_key_feedback_background_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-hdpi/keyboard_key_feedback_more_background_holo.9.png b/java/res/drawable-sw600dp-hdpi/keyboard_key_feedback_more_background_holo.9.png
new file mode 100644
index 0000000..e5cc5b7
--- /dev/null
+++ b/java/res/drawable-sw600dp-hdpi/keyboard_key_feedback_more_background_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-hdpi/sym_keyboard_numsymbol_holo.png b/java/res/drawable-sw600dp-hdpi/sym_keyboard_numsymbol_holo.png
new file mode 100644
index 0000000..398eaea
--- /dev/null
+++ b/java/res/drawable-sw600dp-hdpi/sym_keyboard_numsymbol_holo.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-hdpi/sym_keyboard_tab_holo.png b/java/res/drawable-sw600dp-hdpi/sym_keyboard_tab_holo.png
new file mode 100644
index 0000000..1780f68
--- /dev/null
+++ b/java/res/drawable-sw600dp-hdpi/sym_keyboard_tab_holo.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-land-hdpi/hint_popup_holo.9.png b/java/res/drawable-sw600dp-land-hdpi/hint_popup_holo.9.png
new file mode 100644
index 0000000..2ffc6ea
--- /dev/null
+++ b/java/res/drawable-sw600dp-land-hdpi/hint_popup_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-land-mdpi/hint_popup_holo.9.png b/java/res/drawable-sw600dp-land-mdpi/hint_popup_holo.9.png
new file mode 100644
index 0000000..f5d15b7
--- /dev/null
+++ b/java/res/drawable-sw600dp-land-mdpi/hint_popup_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-land-xhdpi/hint_popup_holo.9.png b/java/res/drawable-sw600dp-land-xhdpi/hint_popup_holo.9.png
new file mode 100644
index 0000000..bc37fa8
--- /dev/null
+++ b/java/res/drawable-sw600dp-land-xhdpi/hint_popup_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_dark_normal_holo.9.png b/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_dark_normal_holo.9.png
new file mode 100644
index 0000000..2ad7304
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_dark_normal_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_dark_normal_off_holo.9.png b/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_dark_normal_off_holo.9.png
new file mode 100644
index 0000000..fc21e79
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_dark_normal_off_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_dark_normal_on_holo.9.png b/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_dark_normal_on_holo.9.png
new file mode 100644
index 0000000..76cfbb2
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_dark_normal_on_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_dark_pressed_holo.9.png b/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_dark_pressed_holo.9.png
new file mode 100644
index 0000000..73748c2
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_dark_pressed_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_dark_pressed_off_holo.9.png b/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_dark_pressed_off_holo.9.png
new file mode 100644
index 0000000..059d4ac
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_dark_pressed_off_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_dark_pressed_on_holo.9.png b/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_dark_pressed_on_holo.9.png
new file mode 100644
index 0000000..e5cfdec
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_dark_pressed_on_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_light_normal_holo.9.png b/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_light_normal_holo.9.png
new file mode 100644
index 0000000..060524a
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_light_normal_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_light_pressed_holo.9.png b/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_light_pressed_holo.9.png
new file mode 100644
index 0000000..f4b061e
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_light_pressed_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_popup_selected_holo.9.png b/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_popup_selected_holo.9.png
new file mode 100644
index 0000000..ffa7386
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_popup_selected_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/hint_popup_holo.9.png b/java/res/drawable-sw600dp-mdpi/hint_popup_holo.9.png
new file mode 100644
index 0000000..f5d15b7
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/hint_popup_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/key_hint_at_holo.9.png b/java/res/drawable-sw600dp-mdpi/key_hint_at_holo.9.png
new file mode 100644
index 0000000..8c84654
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/key_hint_at_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/key_hint_at_large_holo.9.png b/java/res/drawable-sw600dp-mdpi/key_hint_at_large_holo.9.png
new file mode 100644
index 0000000..b9e095b
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/key_hint_at_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/key_hint_colon_holo.9.png b/java/res/drawable-sw600dp-mdpi/key_hint_colon_holo.9.png
new file mode 100644
index 0000000..3cd0e3c
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/key_hint_colon_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/key_hint_colon_large_holo.9.png b/java/res/drawable-sw600dp-mdpi/key_hint_colon_large_holo.9.png
new file mode 100644
index 0000000..01b47b2
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/key_hint_colon_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/key_hint_comma_holo.9.png b/java/res/drawable-sw600dp-mdpi/key_hint_comma_holo.9.png
new file mode 100644
index 0000000..b70f71b
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/key_hint_comma_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/key_hint_comma_large_holo.9.png b/java/res/drawable-sw600dp-mdpi/key_hint_comma_large_holo.9.png
new file mode 100644
index 0000000..1ae82d4
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/key_hint_comma_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/key_hint_exclamation_holo.9.png b/java/res/drawable-sw600dp-mdpi/key_hint_exclamation_holo.9.png
new file mode 100644
index 0000000..3409535
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/key_hint_exclamation_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/key_hint_exclamation_large_holo.9.png b/java/res/drawable-sw600dp-mdpi/key_hint_exclamation_large_holo.9.png
new file mode 100644
index 0000000..8dd2f27
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/key_hint_exclamation_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/key_hint_plus_holo.9.png b/java/res/drawable-sw600dp-mdpi/key_hint_plus_holo.9.png
new file mode 100644
index 0000000..51e86ba
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/key_hint_plus_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/key_hint_plus_large_holo.9.png b/java/res/drawable-sw600dp-mdpi/key_hint_plus_large_holo.9.png
new file mode 100644
index 0000000..bf30f92
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/key_hint_plus_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/key_hint_question_holo.9.png b/java/res/drawable-sw600dp-mdpi/key_hint_question_holo.9.png
new file mode 100644
index 0000000..38b5d61
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/key_hint_question_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/key_hint_question_large_holo.9.png b/java/res/drawable-sw600dp-mdpi/key_hint_question_large_holo.9.png
new file mode 100644
index 0000000..448a027
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/key_hint_question_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/key_hint_quote_holo.9.png b/java/res/drawable-sw600dp-mdpi/key_hint_quote_holo.9.png
new file mode 100644
index 0000000..92fe8ea
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/key_hint_quote_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/key_hint_quote_large_holo.9.png b/java/res/drawable-sw600dp-mdpi/key_hint_quote_large_holo.9.png
new file mode 100644
index 0000000..a777d01
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/key_hint_quote_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/key_hint_underline_holo.9.png b/java/res/drawable-sw600dp-mdpi/key_hint_underline_holo.9.png
new file mode 100644
index 0000000..7a452c5
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/key_hint_underline_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/key_hint_underline_large_holo.9.png b/java/res/drawable-sw600dp-mdpi/key_hint_underline_large_holo.9.png
new file mode 100644
index 0000000..f738b02
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/key_hint_underline_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/keyboard_background_holo.9.png b/java/res/drawable-sw600dp-mdpi/keyboard_background_holo.9.png
new file mode 100644
index 0000000..a93966c
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/keyboard_background_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/keyboard_key_feedback_background_holo.9.png b/java/res/drawable-sw600dp-mdpi/keyboard_key_feedback_background_holo.9.png
new file mode 100644
index 0000000..5f15217
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/keyboard_key_feedback_background_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/keyboard_key_feedback_more_background_holo.9.png b/java/res/drawable-sw600dp-mdpi/keyboard_key_feedback_more_background_holo.9.png
new file mode 100644
index 0000000..77a806c
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/keyboard_key_feedback_more_background_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/keyboard_popup_panel_background_holo.9.png b/java/res/drawable-sw600dp-mdpi/keyboard_popup_panel_background_holo.9.png
new file mode 100644
index 0000000..7be7ab7
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/keyboard_popup_panel_background_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/keyboard_suggest_strip_holo.9.png b/java/res/drawable-sw600dp-mdpi/keyboard_suggest_strip_holo.9.png
new file mode 100644
index 0000000..1f87a68
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/keyboard_suggest_strip_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_delete_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_delete_holo.png
new file mode 100644
index 0000000..1555791
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_delete_holo.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_num0_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_num0_holo.png
new file mode 100644
index 0000000..e1d395b
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_num0_holo.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_num1_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_num1_holo.png
new file mode 100644
index 0000000..225436a
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_num1_holo.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_num2_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_num2_holo.png
new file mode 100644
index 0000000..e513fa4
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_num2_holo.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_num3_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_num3_holo.png
new file mode 100644
index 0000000..b91e005
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_num3_holo.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_num4_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_num4_holo.png
new file mode 100644
index 0000000..65f8824
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_num4_holo.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_num5_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_num5_holo.png
new file mode 100644
index 0000000..b89ef07
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_num5_holo.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_num6_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_num6_holo.png
new file mode 100644
index 0000000..931275a
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_num6_holo.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_num7_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_num7_holo.png
new file mode 100644
index 0000000..9396c4c
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_num7_holo.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_num8_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_num8_holo.png
new file mode 100644
index 0000000..12e3eef
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_num8_holo.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_num9_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_num9_holo.png
new file mode 100644
index 0000000..6911c2b
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_num9_holo.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_numbpound_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_numbpound_holo.png
new file mode 100644
index 0000000..e3a8b49
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_numbpound_holo.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_numbstar_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_numbstar_holo.png
new file mode 100644
index 0000000..e80e934
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_numbstar_holo.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_numsymbol_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_numsymbol_holo.png
new file mode 100644
index 0000000..7315384
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_numsymbol_holo.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_return_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_return_holo.png
new file mode 100644
index 0000000..d519cce
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_return_holo.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_settings_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_settings_holo.png
new file mode 100644
index 0000000..784a450
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_settings_holo.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_shift_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_shift_holo.png
new file mode 100644
index 0000000..91d6e32
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_shift_holo.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_shift_locked_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_shift_locked_holo.png
new file mode 100644
index 0000000..2bd0536
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_shift_locked_holo.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_space_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_space_holo.png
new file mode 100644
index 0000000..25e655d
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_space_holo.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_tab_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_tab_holo.png
new file mode 100644
index 0000000..5acd12c
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_tab_holo.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_voice_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_voice_holo.png
new file mode 100644
index 0000000..c1116dc
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_voice_holo.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_voice_off_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_voice_off_holo.png
new file mode 100644
index 0000000..44919df
--- /dev/null
+++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_voice_off_holo.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-xhdpi/btn_keyboard_key_popup_selected_holo.9.png b/java/res/drawable-sw600dp-xhdpi/btn_keyboard_key_popup_selected_holo.9.png
new file mode 100644
index 0000000..8b5d1b0
--- /dev/null
+++ b/java/res/drawable-sw600dp-xhdpi/btn_keyboard_key_popup_selected_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-xhdpi/hint_popup_holo.9.png b/java/res/drawable-sw600dp-xhdpi/hint_popup_holo.9.png
new file mode 100644
index 0000000..bc37fa8
--- /dev/null
+++ b/java/res/drawable-sw600dp-xhdpi/hint_popup_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-xhdpi/keyboard_key_feedback_background_holo.9.png b/java/res/drawable-sw600dp-xhdpi/keyboard_key_feedback_background_holo.9.png
new file mode 100644
index 0000000..8d43a4b
--- /dev/null
+++ b/java/res/drawable-sw600dp-xhdpi/keyboard_key_feedback_background_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-xhdpi/keyboard_key_feedback_more_background_holo.9.png b/java/res/drawable-sw600dp-xhdpi/keyboard_key_feedback_more_background_holo.9.png
new file mode 100644
index 0000000..e973c7e
--- /dev/null
+++ b/java/res/drawable-sw600dp-xhdpi/keyboard_key_feedback_more_background_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-xhdpi/sym_keyboard_numsymbol_holo.png b/java/res/drawable-sw600dp-xhdpi/sym_keyboard_numsymbol_holo.png
new file mode 100644
index 0000000..c7a8b28
--- /dev/null
+++ b/java/res/drawable-sw600dp-xhdpi/sym_keyboard_numsymbol_holo.png
Binary files differ
diff --git a/java/res/drawable-sw600dp-xhdpi/sym_keyboard_tab_holo.png b/java/res/drawable-sw600dp-xhdpi/sym_keyboard_tab_holo.png
new file mode 100644
index 0000000..fd9f8cc
--- /dev/null
+++ b/java/res/drawable-sw600dp-xhdpi/sym_keyboard_tab_holo.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-hdpi/btn_keyboard_key_popup_selected_holo.9.png b/java/res/drawable-sw768dp-hdpi/btn_keyboard_key_popup_selected_holo.9.png
new file mode 100644
index 0000000..544ed7f
--- /dev/null
+++ b/java/res/drawable-sw768dp-hdpi/btn_keyboard_key_popup_selected_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-hdpi/hint_popup_holo.9.png b/java/res/drawable-sw768dp-hdpi/hint_popup_holo.9.png
new file mode 100644
index 0000000..2ffc6ea
--- /dev/null
+++ b/java/res/drawable-sw768dp-hdpi/hint_popup_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-hdpi/keyboard_key_feedback_background_holo.9.png b/java/res/drawable-sw768dp-hdpi/keyboard_key_feedback_background_holo.9.png
new file mode 100644
index 0000000..099a508
--- /dev/null
+++ b/java/res/drawable-sw768dp-hdpi/keyboard_key_feedback_background_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-hdpi/keyboard_key_feedback_more_background_holo.9.png b/java/res/drawable-sw768dp-hdpi/keyboard_key_feedback_more_background_holo.9.png
new file mode 100644
index 0000000..c21240f
--- /dev/null
+++ b/java/res/drawable-sw768dp-hdpi/keyboard_key_feedback_more_background_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-land-hdpi/hint_popup_holo.9.png b/java/res/drawable-sw768dp-land-hdpi/hint_popup_holo.9.png
new file mode 100644
index 0000000..2b93014
--- /dev/null
+++ b/java/res/drawable-sw768dp-land-hdpi/hint_popup_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-land-mdpi/hint_popup_holo.9.png b/java/res/drawable-sw768dp-land-mdpi/hint_popup_holo.9.png
new file mode 100644
index 0000000..c409cea
--- /dev/null
+++ b/java/res/drawable-sw768dp-land-mdpi/hint_popup_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-land-mdpi/key_hint_at_holo.9.png b/java/res/drawable-sw768dp-land-mdpi/key_hint_at_holo.9.png
new file mode 100644
index 0000000..5b946ff
--- /dev/null
+++ b/java/res/drawable-sw768dp-land-mdpi/key_hint_at_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-land-mdpi/key_hint_at_large_holo.9.png b/java/res/drawable-sw768dp-land-mdpi/key_hint_at_large_holo.9.png
new file mode 100644
index 0000000..852f899
--- /dev/null
+++ b/java/res/drawable-sw768dp-land-mdpi/key_hint_at_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-land-mdpi/key_hint_colon_holo.9.png b/java/res/drawable-sw768dp-land-mdpi/key_hint_colon_holo.9.png
new file mode 100644
index 0000000..1d9346e
--- /dev/null
+++ b/java/res/drawable-sw768dp-land-mdpi/key_hint_colon_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-land-mdpi/key_hint_colon_large_holo.9.png b/java/res/drawable-sw768dp-land-mdpi/key_hint_colon_large_holo.9.png
new file mode 100644
index 0000000..17e9091
--- /dev/null
+++ b/java/res/drawable-sw768dp-land-mdpi/key_hint_colon_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_minus_holo.9.png b/java/res/drawable-sw768dp-land-mdpi/key_hint_comma_holo.9.png
similarity index 63%
copy from java/res/drawable-land-mdpi/key_hint_minus_holo.9.png
copy to java/res/drawable-sw768dp-land-mdpi/key_hint_comma_holo.9.png
index e59a315..c2a913c 100644
--- a/java/res/drawable-land-mdpi/key_hint_minus_holo.9.png
+++ b/java/res/drawable-sw768dp-land-mdpi/key_hint_comma_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_minus_holo.9.png b/java/res/drawable-sw768dp-land-mdpi/key_hint_comma_large_holo.9.png
similarity index 63%
rename from java/res/drawable-land-mdpi/key_hint_minus_holo.9.png
rename to java/res/drawable-sw768dp-land-mdpi/key_hint_comma_large_holo.9.png
index e59a315..846f213 100644
--- a/java/res/drawable-land-mdpi/key_hint_minus_holo.9.png
+++ b/java/res/drawable-sw768dp-land-mdpi/key_hint_comma_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-land-mdpi/key_hint_exclamation_holo.9.png b/java/res/drawable-sw768dp-land-mdpi/key_hint_exclamation_holo.9.png
new file mode 100644
index 0000000..ce8e8de
--- /dev/null
+++ b/java/res/drawable-sw768dp-land-mdpi/key_hint_exclamation_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-land-mdpi/key_hint_exclamation_large_holo.9.png b/java/res/drawable-sw768dp-land-mdpi/key_hint_exclamation_large_holo.9.png
new file mode 100644
index 0000000..035dcf8
--- /dev/null
+++ b/java/res/drawable-sw768dp-land-mdpi/key_hint_exclamation_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-land-mdpi/key_hint_plus_holo.9.png b/java/res/drawable-sw768dp-land-mdpi/key_hint_plus_holo.9.png
new file mode 100644
index 0000000..931390b
--- /dev/null
+++ b/java/res/drawable-sw768dp-land-mdpi/key_hint_plus_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-land-mdpi/key_hint_plus_large_holo.9.png b/java/res/drawable-sw768dp-land-mdpi/key_hint_plus_large_holo.9.png
new file mode 100644
index 0000000..e6f9f8a
--- /dev/null
+++ b/java/res/drawable-sw768dp-land-mdpi/key_hint_plus_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-land-mdpi/key_hint_question_holo.9.png b/java/res/drawable-sw768dp-land-mdpi/key_hint_question_holo.9.png
new file mode 100644
index 0000000..6cbeb59
--- /dev/null
+++ b/java/res/drawable-sw768dp-land-mdpi/key_hint_question_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-land-mdpi/key_hint_question_large_holo.9.png b/java/res/drawable-sw768dp-land-mdpi/key_hint_question_large_holo.9.png
new file mode 100644
index 0000000..bfd58de
--- /dev/null
+++ b/java/res/drawable-sw768dp-land-mdpi/key_hint_question_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_minus_holo.9.png b/java/res/drawable-sw768dp-land-mdpi/key_hint_quote_holo.9.png
similarity index 62%
copy from java/res/drawable-land-mdpi/key_hint_minus_holo.9.png
copy to java/res/drawable-sw768dp-land-mdpi/key_hint_quote_holo.9.png
index e59a315..3b361b7 100644
--- a/java/res/drawable-land-mdpi/key_hint_minus_holo.9.png
+++ b/java/res/drawable-sw768dp-land-mdpi/key_hint_quote_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_minus_holo.9.png b/java/res/drawable-sw768dp-land-mdpi/key_hint_quote_large_holo.9.png
similarity index 61%
copy from java/res/drawable-land-mdpi/key_hint_minus_holo.9.png
copy to java/res/drawable-sw768dp-land-mdpi/key_hint_quote_large_holo.9.png
index e59a315..2a08aa1 100644
--- a/java/res/drawable-land-mdpi/key_hint_minus_holo.9.png
+++ b/java/res/drawable-sw768dp-land-mdpi/key_hint_quote_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_underscore_holo.9.png b/java/res/drawable-sw768dp-land-mdpi/key_hint_underline_holo.9.png
similarity index 62%
rename from java/res/drawable-land-mdpi/key_hint_underscore_holo.9.png
rename to java/res/drawable-sw768dp-land-mdpi/key_hint_underline_holo.9.png
index 52e871e..06f3efb 100644
--- a/java/res/drawable-land-mdpi/key_hint_underscore_holo.9.png
+++ b/java/res/drawable-sw768dp-land-mdpi/key_hint_underline_holo.9.png
Binary files differ
diff --git a/java/res/drawable-land-mdpi/key_hint_underscore_large_holo.9.png b/java/res/drawable-sw768dp-land-mdpi/key_hint_underline_large_holo.9.png
similarity index 77%
rename from java/res/drawable-land-mdpi/key_hint_underscore_large_holo.9.png
rename to java/res/drawable-sw768dp-land-mdpi/key_hint_underline_large_holo.9.png
index ee0e835..50f99a1 100644
--- a/java/res/drawable-land-mdpi/key_hint_underscore_large_holo.9.png
+++ b/java/res/drawable-sw768dp-land-mdpi/key_hint_underline_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-land-xhdpi/hint_popup_holo.9.png b/java/res/drawable-sw768dp-land-xhdpi/hint_popup_holo.9.png
new file mode 100644
index 0000000..3cd20d3
--- /dev/null
+++ b/java/res/drawable-sw768dp-land-xhdpi/hint_popup_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_dark_normal_holo.9.png b/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_dark_normal_holo.9.png
new file mode 100644
index 0000000..2ad7304
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_dark_normal_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_dark_normal_off_holo.9.png b/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_dark_normal_off_holo.9.png
new file mode 100644
index 0000000..fc21e79
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_dark_normal_off_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_dark_normal_on_holo.9.png b/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_dark_normal_on_holo.9.png
new file mode 100644
index 0000000..76cfbb2
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_dark_normal_on_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_dark_pressed_holo.9.png b/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_dark_pressed_holo.9.png
new file mode 100644
index 0000000..73748c2
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_dark_pressed_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_dark_pressed_off_holo.9.png b/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_dark_pressed_off_holo.9.png
new file mode 100644
index 0000000..059d4ac
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_dark_pressed_off_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_dark_pressed_on_holo.9.png b/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_dark_pressed_on_holo.9.png
new file mode 100644
index 0000000..e5cfdec
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_dark_pressed_on_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_light_normal_holo.9.png b/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_light_normal_holo.9.png
new file mode 100644
index 0000000..060524a
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_light_normal_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_light_pressed_holo.9.png b/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_light_pressed_holo.9.png
new file mode 100644
index 0000000..f4b061e
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_light_pressed_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_popup_selected_holo.9.png b/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_popup_selected_holo.9.png
new file mode 100644
index 0000000..ffa7386
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_popup_selected_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/hint_popup_holo.9.png b/java/res/drawable-sw768dp-mdpi/hint_popup_holo.9.png
new file mode 100644
index 0000000..01d1139
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/hint_popup_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/key_hint_at_holo.9.png b/java/res/drawable-sw768dp-mdpi/key_hint_at_holo.9.png
new file mode 100644
index 0000000..8c84654
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/key_hint_at_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/key_hint_at_large_holo.9.png b/java/res/drawable-sw768dp-mdpi/key_hint_at_large_holo.9.png
new file mode 100644
index 0000000..b9e095b
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/key_hint_at_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/key_hint_colon_holo.9.png b/java/res/drawable-sw768dp-mdpi/key_hint_colon_holo.9.png
new file mode 100644
index 0000000..3cd0e3c
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/key_hint_colon_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/key_hint_colon_large_holo.9.png b/java/res/drawable-sw768dp-mdpi/key_hint_colon_large_holo.9.png
new file mode 100644
index 0000000..01b47b2
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/key_hint_colon_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/key_hint_comma_holo.9.png b/java/res/drawable-sw768dp-mdpi/key_hint_comma_holo.9.png
new file mode 100644
index 0000000..b70f71b
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/key_hint_comma_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/key_hint_comma_large_holo.9.png b/java/res/drawable-sw768dp-mdpi/key_hint_comma_large_holo.9.png
new file mode 100644
index 0000000..1ae82d4
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/key_hint_comma_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/key_hint_exclamation_holo.9.png b/java/res/drawable-sw768dp-mdpi/key_hint_exclamation_holo.9.png
new file mode 100644
index 0000000..3409535
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/key_hint_exclamation_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/key_hint_exclamation_large_holo.9.png b/java/res/drawable-sw768dp-mdpi/key_hint_exclamation_large_holo.9.png
new file mode 100644
index 0000000..8dd2f27
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/key_hint_exclamation_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/key_hint_plus_holo.9.png b/java/res/drawable-sw768dp-mdpi/key_hint_plus_holo.9.png
new file mode 100644
index 0000000..51e86ba
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/key_hint_plus_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/key_hint_plus_large_holo.9.png b/java/res/drawable-sw768dp-mdpi/key_hint_plus_large_holo.9.png
new file mode 100644
index 0000000..bf30f92
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/key_hint_plus_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/key_hint_question_holo.9.png b/java/res/drawable-sw768dp-mdpi/key_hint_question_holo.9.png
new file mode 100644
index 0000000..38b5d61
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/key_hint_question_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/key_hint_question_large_holo.9.png b/java/res/drawable-sw768dp-mdpi/key_hint_question_large_holo.9.png
new file mode 100644
index 0000000..448a027
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/key_hint_question_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/key_hint_quote_holo.9.png b/java/res/drawable-sw768dp-mdpi/key_hint_quote_holo.9.png
new file mode 100644
index 0000000..92fe8ea
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/key_hint_quote_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/key_hint_quote_large_holo.9.png b/java/res/drawable-sw768dp-mdpi/key_hint_quote_large_holo.9.png
new file mode 100644
index 0000000..a777d01
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/key_hint_quote_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/key_hint_underline_holo.9.png b/java/res/drawable-sw768dp-mdpi/key_hint_underline_holo.9.png
new file mode 100644
index 0000000..7a452c5
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/key_hint_underline_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/key_hint_underline_large_holo.9.png b/java/res/drawable-sw768dp-mdpi/key_hint_underline_large_holo.9.png
new file mode 100644
index 0000000..f738b02
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/key_hint_underline_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/keyboard_background_holo.9.png b/java/res/drawable-sw768dp-mdpi/keyboard_background_holo.9.png
new file mode 100644
index 0000000..a93966c
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/keyboard_background_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/keyboard_key_feedback_background_holo.9.png b/java/res/drawable-sw768dp-mdpi/keyboard_key_feedback_background_holo.9.png
new file mode 100644
index 0000000..286cf84
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/keyboard_key_feedback_background_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/keyboard_key_feedback_more_background_holo.9.png b/java/res/drawable-sw768dp-mdpi/keyboard_key_feedback_more_background_holo.9.png
new file mode 100644
index 0000000..e3f5be8
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/keyboard_key_feedback_more_background_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/keyboard_popup_panel_background_holo.9.png b/java/res/drawable-sw768dp-mdpi/keyboard_popup_panel_background_holo.9.png
new file mode 100644
index 0000000..7be7ab7
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/keyboard_popup_panel_background_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/keyboard_suggest_strip_holo.9.png b/java/res/drawable-sw768dp-mdpi/keyboard_suggest_strip_holo.9.png
new file mode 100644
index 0000000..1f87a68
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/keyboard_suggest_strip_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/sym_keyboard_delete_holo.png b/java/res/drawable-sw768dp-mdpi/sym_keyboard_delete_holo.png
new file mode 100644
index 0000000..1555791
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/sym_keyboard_delete_holo.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/sym_keyboard_num0_holo.png b/java/res/drawable-sw768dp-mdpi/sym_keyboard_num0_holo.png
new file mode 100644
index 0000000..e1d395b
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/sym_keyboard_num0_holo.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/sym_keyboard_num1_holo.png b/java/res/drawable-sw768dp-mdpi/sym_keyboard_num1_holo.png
new file mode 100644
index 0000000..225436a
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/sym_keyboard_num1_holo.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/sym_keyboard_num2_holo.png b/java/res/drawable-sw768dp-mdpi/sym_keyboard_num2_holo.png
new file mode 100644
index 0000000..e513fa4
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/sym_keyboard_num2_holo.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/sym_keyboard_num3_holo.png b/java/res/drawable-sw768dp-mdpi/sym_keyboard_num3_holo.png
new file mode 100644
index 0000000..b91e005
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/sym_keyboard_num3_holo.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/sym_keyboard_num4_holo.png b/java/res/drawable-sw768dp-mdpi/sym_keyboard_num4_holo.png
new file mode 100644
index 0000000..65f8824
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/sym_keyboard_num4_holo.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/sym_keyboard_num5_holo.png b/java/res/drawable-sw768dp-mdpi/sym_keyboard_num5_holo.png
new file mode 100644
index 0000000..b89ef07
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/sym_keyboard_num5_holo.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/sym_keyboard_num6_holo.png b/java/res/drawable-sw768dp-mdpi/sym_keyboard_num6_holo.png
new file mode 100644
index 0000000..931275a
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/sym_keyboard_num6_holo.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/sym_keyboard_num7_holo.png b/java/res/drawable-sw768dp-mdpi/sym_keyboard_num7_holo.png
new file mode 100644
index 0000000..9396c4c
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/sym_keyboard_num7_holo.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/sym_keyboard_num8_holo.png b/java/res/drawable-sw768dp-mdpi/sym_keyboard_num8_holo.png
new file mode 100644
index 0000000..12e3eef
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/sym_keyboard_num8_holo.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/sym_keyboard_num9_holo.png b/java/res/drawable-sw768dp-mdpi/sym_keyboard_num9_holo.png
new file mode 100644
index 0000000..6911c2b
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/sym_keyboard_num9_holo.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/sym_keyboard_numbpound_holo.png b/java/res/drawable-sw768dp-mdpi/sym_keyboard_numbpound_holo.png
new file mode 100644
index 0000000..e3a8b49
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/sym_keyboard_numbpound_holo.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/sym_keyboard_numbstar_holo.png b/java/res/drawable-sw768dp-mdpi/sym_keyboard_numbstar_holo.png
new file mode 100644
index 0000000..e80e934
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/sym_keyboard_numbstar_holo.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/sym_keyboard_return_holo.png b/java/res/drawable-sw768dp-mdpi/sym_keyboard_return_holo.png
new file mode 100644
index 0000000..d519cce
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/sym_keyboard_return_holo.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/sym_keyboard_settings_holo.png b/java/res/drawable-sw768dp-mdpi/sym_keyboard_settings_holo.png
new file mode 100644
index 0000000..784a450
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/sym_keyboard_settings_holo.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/sym_keyboard_shift_holo.png b/java/res/drawable-sw768dp-mdpi/sym_keyboard_shift_holo.png
new file mode 100644
index 0000000..91d6e32
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/sym_keyboard_shift_holo.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/sym_keyboard_shift_locked_holo.png b/java/res/drawable-sw768dp-mdpi/sym_keyboard_shift_locked_holo.png
new file mode 100644
index 0000000..2bd0536
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/sym_keyboard_shift_locked_holo.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/sym_keyboard_space_holo.png b/java/res/drawable-sw768dp-mdpi/sym_keyboard_space_holo.png
new file mode 100644
index 0000000..25e655d
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/sym_keyboard_space_holo.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/sym_keyboard_voice_holo.png b/java/res/drawable-sw768dp-mdpi/sym_keyboard_voice_holo.png
new file mode 100644
index 0000000..c1116dc
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/sym_keyboard_voice_holo.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-mdpi/sym_keyboard_voice_off_holo.png b/java/res/drawable-sw768dp-mdpi/sym_keyboard_voice_off_holo.png
new file mode 100644
index 0000000..44919df
--- /dev/null
+++ b/java/res/drawable-sw768dp-mdpi/sym_keyboard_voice_off_holo.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-xhdpi/btn_keyboard_key_popup_selected_holo.9.png b/java/res/drawable-sw768dp-xhdpi/btn_keyboard_key_popup_selected_holo.9.png
new file mode 100644
index 0000000..8b5d1b0
--- /dev/null
+++ b/java/res/drawable-sw768dp-xhdpi/btn_keyboard_key_popup_selected_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-xhdpi/hint_popup_holo.9.png b/java/res/drawable-sw768dp-xhdpi/hint_popup_holo.9.png
new file mode 100644
index 0000000..bc37fa8
--- /dev/null
+++ b/java/res/drawable-sw768dp-xhdpi/hint_popup_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-xhdpi/keyboard_key_feedback_background_holo.9.png b/java/res/drawable-sw768dp-xhdpi/keyboard_key_feedback_background_holo.9.png
new file mode 100644
index 0000000..38c84e8
--- /dev/null
+++ b/java/res/drawable-sw768dp-xhdpi/keyboard_key_feedback_background_holo.9.png
Binary files differ
diff --git a/java/res/drawable-sw768dp-xhdpi/keyboard_key_feedback_more_background_holo.9.png b/java/res/drawable-sw768dp-xhdpi/keyboard_key_feedback_more_background_holo.9.png
new file mode 100644
index 0000000..f66e545
--- /dev/null
+++ b/java/res/drawable-sw768dp-xhdpi/keyboard_key_feedback_more_background_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal.9.png
new file mode 100644
index 0000000..eae1e3a
--- /dev/null
+++ b/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_holo.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_holo.9.png
new file mode 100644
index 0000000..3e4a812
--- /dev/null
+++ b/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_off.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_off.9.png
new file mode 100644
index 0000000..13bad8f
--- /dev/null
+++ b/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_off.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_off_holo.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_off_holo.9.png
new file mode 100644
index 0000000..d61dd2b
--- /dev/null
+++ b/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_off_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_on.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_on.9.png
new file mode 100644
index 0000000..853b8bc
--- /dev/null
+++ b/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_on.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_on_holo.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_on_holo.9.png
new file mode 100644
index 0000000..c127e2a
--- /dev/null
+++ b/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_on_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed.9.png
new file mode 100644
index 0000000..1edfd64
--- /dev/null
+++ b/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_holo.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_holo.9.png
new file mode 100644
index 0000000..ac3f358
--- /dev/null
+++ b/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_off.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_off.9.png
new file mode 100644
index 0000000..dfdbfad
--- /dev/null
+++ b/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_off.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_off_holo.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_off_holo.9.png
new file mode 100644
index 0000000..e5de3b0
--- /dev/null
+++ b/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_off_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_on.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_on.9.png
new file mode 100644
index 0000000..0e2733e
--- /dev/null
+++ b/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_on.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_on_holo.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_on_holo.9.png
new file mode 100644
index 0000000..c63b69a
--- /dev/null
+++ b/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_on_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_light_normal.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_light_normal.9.png
new file mode 100644
index 0000000..ea13a7f
--- /dev/null
+++ b/java/res/drawable-xhdpi/btn_keyboard_key_light_normal.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_light_normal_holo.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_light_normal_holo.9.png
new file mode 100644
index 0000000..e1361ed
--- /dev/null
+++ b/java/res/drawable-xhdpi/btn_keyboard_key_light_normal_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_light_popup_normal.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_light_popup_normal.9.png
new file mode 100644
index 0000000..2ed1b34
--- /dev/null
+++ b/java/res/drawable-xhdpi/btn_keyboard_key_light_popup_normal.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_light_popup_selected.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_light_popup_selected.9.png
new file mode 100644
index 0000000..057c571
--- /dev/null
+++ b/java/res/drawable-xhdpi/btn_keyboard_key_light_popup_selected.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_light_pressed.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_light_pressed.9.png
new file mode 100644
index 0000000..5d8e46d
--- /dev/null
+++ b/java/res/drawable-xhdpi/btn_keyboard_key_light_pressed.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_light_pressed_holo.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_light_pressed_holo.9.png
new file mode 100644
index 0000000..6efd3a7
--- /dev/null
+++ b/java/res/drawable-xhdpi/btn_keyboard_key_light_pressed_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_popup_selected_holo.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_popup_selected_holo.9.png
new file mode 100644
index 0000000..3ed9b1e
--- /dev/null
+++ b/java/res/drawable-xhdpi/btn_keyboard_key_popup_selected_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/hint_popup_holo.9.png b/java/res/drawable-xhdpi/hint_popup_holo.9.png
new file mode 100644
index 0000000..bc37fa8
--- /dev/null
+++ b/java/res/drawable-xhdpi/hint_popup_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/key_hint_at_holo.9.png b/java/res/drawable-xhdpi/key_hint_at_holo.9.png
new file mode 100644
index 0000000..1d257cb
--- /dev/null
+++ b/java/res/drawable-xhdpi/key_hint_at_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/key_hint_at_large_holo.9.png b/java/res/drawable-xhdpi/key_hint_at_large_holo.9.png
new file mode 100644
index 0000000..53de283
--- /dev/null
+++ b/java/res/drawable-xhdpi/key_hint_at_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/key_hint_colon_holo.9.png b/java/res/drawable-xhdpi/key_hint_colon_holo.9.png
new file mode 100644
index 0000000..73394b5
--- /dev/null
+++ b/java/res/drawable-xhdpi/key_hint_colon_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/key_hint_colon_large_holo.9.png b/java/res/drawable-xhdpi/key_hint_colon_large_holo.9.png
new file mode 100644
index 0000000..a4a6acb
--- /dev/null
+++ b/java/res/drawable-xhdpi/key_hint_colon_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/key_hint_comma_holo.9.png b/java/res/drawable-xhdpi/key_hint_comma_holo.9.png
new file mode 100644
index 0000000..d4dbdf4
--- /dev/null
+++ b/java/res/drawable-xhdpi/key_hint_comma_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/key_hint_comma_large_holo.9.png b/java/res/drawable-xhdpi/key_hint_comma_large_holo.9.png
new file mode 100644
index 0000000..aea5c8e
--- /dev/null
+++ b/java/res/drawable-xhdpi/key_hint_comma_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/key_hint_exclamation_holo.9.png b/java/res/drawable-xhdpi/key_hint_exclamation_holo.9.png
new file mode 100644
index 0000000..078d1d8
--- /dev/null
+++ b/java/res/drawable-xhdpi/key_hint_exclamation_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/key_hint_exclamation_large_holo.9.png b/java/res/drawable-xhdpi/key_hint_exclamation_large_holo.9.png
new file mode 100644
index 0000000..ddd6b13
--- /dev/null
+++ b/java/res/drawable-xhdpi/key_hint_exclamation_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/key_hint_plus_holo.9.png b/java/res/drawable-xhdpi/key_hint_plus_holo.9.png
new file mode 100644
index 0000000..d0ce9c9
--- /dev/null
+++ b/java/res/drawable-xhdpi/key_hint_plus_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/key_hint_plus_large_holo.9.png b/java/res/drawable-xhdpi/key_hint_plus_large_holo.9.png
new file mode 100644
index 0000000..9cf20e8
--- /dev/null
+++ b/java/res/drawable-xhdpi/key_hint_plus_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/key_hint_question_holo.9.png b/java/res/drawable-xhdpi/key_hint_question_holo.9.png
new file mode 100644
index 0000000..1e886d8
--- /dev/null
+++ b/java/res/drawable-xhdpi/key_hint_question_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/key_hint_question_large_holo.9.png b/java/res/drawable-xhdpi/key_hint_question_large_holo.9.png
new file mode 100644
index 0000000..8262287
--- /dev/null
+++ b/java/res/drawable-xhdpi/key_hint_question_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/key_hint_quote_holo.9.png b/java/res/drawable-xhdpi/key_hint_quote_holo.9.png
new file mode 100644
index 0000000..fd8bbad
--- /dev/null
+++ b/java/res/drawable-xhdpi/key_hint_quote_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/key_hint_quote_large_holo.9.png b/java/res/drawable-xhdpi/key_hint_quote_large_holo.9.png
new file mode 100644
index 0000000..51d5b49
--- /dev/null
+++ b/java/res/drawable-xhdpi/key_hint_quote_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/key_hint_underline_holo.9.png b/java/res/drawable-xhdpi/key_hint_underline_holo.9.png
new file mode 100644
index 0000000..37d2fa5
--- /dev/null
+++ b/java/res/drawable-xhdpi/key_hint_underline_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/key_hint_underline_large_holo.9.png b/java/res/drawable-xhdpi/key_hint_underline_large_holo.9.png
new file mode 100644
index 0000000..4249a8e
--- /dev/null
+++ b/java/res/drawable-xhdpi/key_hint_underline_large_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/keyboard_key_feedback_background.9.png b/java/res/drawable-xhdpi/keyboard_key_feedback_background.9.png
new file mode 100644
index 0000000..16c7610
--- /dev/null
+++ b/java/res/drawable-xhdpi/keyboard_key_feedback_background.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/keyboard_key_feedback_background_holo.9.png b/java/res/drawable-xhdpi/keyboard_key_feedback_background_holo.9.png
new file mode 100644
index 0000000..943f9e4
--- /dev/null
+++ b/java/res/drawable-xhdpi/keyboard_key_feedback_background_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/keyboard_key_feedback_more_background.9.png b/java/res/drawable-xhdpi/keyboard_key_feedback_more_background.9.png
new file mode 100644
index 0000000..e020e34
--- /dev/null
+++ b/java/res/drawable-xhdpi/keyboard_key_feedback_more_background.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/keyboard_key_feedback_more_background_holo.9.png b/java/res/drawable-xhdpi/keyboard_key_feedback_more_background_holo.9.png
new file mode 100644
index 0000000..f66e545
--- /dev/null
+++ b/java/res/drawable-xhdpi/keyboard_key_feedback_more_background_holo.9.png
Binary files differ
diff --git a/java/res/drawable-xlarge/caution.png b/java/res/drawable-xlarge/caution.png
deleted file mode 100755
index eaef534..0000000
--- a/java/res/drawable-xlarge/caution.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-xlarge/mic_slash.png b/java/res/drawable-xlarge/mic_slash.png
deleted file mode 100644
index 1dd05c5..0000000
--- a/java/res/drawable-xlarge/mic_slash.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable/btn_center_default.9.png b/java/res/drawable/btn_center_default.9.png
deleted file mode 100755
index d5ec36b..0000000
--- a/java/res/drawable/btn_center_default.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable/btn_center_pressed.9.png b/java/res/drawable/btn_center_pressed.9.png
deleted file mode 100755
index 593a679..0000000
--- a/java/res/drawable/btn_center_pressed.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable/btn_center_selected.9.png b/java/res/drawable/btn_center_selected.9.png
deleted file mode 100644
index f1914a8..0000000
--- a/java/res/drawable/btn_center_selected.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable/btn_keyboard_key2.xml b/java/res/drawable/btn_keyboard_key2.xml
deleted file mode 100644
index bd745b7..0000000
--- a/java/res/drawable/btn_keyboard_key2.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-
-    <!-- Toggle keys. Use checkable/checked state. -->
-
-    <item android:state_checkable="true" android:state_checked="true"
-          android:state_pressed="true"
-          android:drawable="@drawable/btn_keyboard_key_pressed_on" />
-    <item android:state_checkable="true" android:state_pressed="true"
-          android:drawable="@drawable/btn_keyboard_key_fulltrans_pressed" />
-    <item android:state_checkable="true" android:state_checked="true"
-          android:drawable="@drawable/btn_keyboard_key_normal_on" />
-    <item android:state_checkable="true"
-          android:drawable="@drawable/btn_keyboard_key_fulltrans_normal" />
-
-    <!-- Normal keys -->
-
-    <item android:state_pressed="true"
-          android:drawable="@drawable/btn_keyboard_key_fulltrans_pressed" />
-    <item android:drawable="@drawable/btn_keyboard_key_fulltrans_normal" />
-</selector>
diff --git a/java/res/drawable/btn_keyboard_key_gingerbread_popup.xml b/java/res/drawable/btn_keyboard_key_popup.xml
similarity index 93%
rename from java/res/drawable/btn_keyboard_key_gingerbread_popup.xml
rename to java/res/drawable/btn_keyboard_key_popup.xml
index 9b6d23b..860cfd5 100644
--- a/java/res/drawable/btn_keyboard_key_gingerbread_popup.xml
+++ b/java/res/drawable/btn_keyboard_key_popup.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
+<!-- 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.
diff --git a/java/res/drawable/btn_keyboard_key_honeycomb_popup.xml b/java/res/drawable/btn_keyboard_key_popup_honeycomb.xml
similarity index 93%
rename from java/res/drawable/btn_keyboard_key_honeycomb_popup.xml
rename to java/res/drawable/btn_keyboard_key_popup_honeycomb.xml
index 6c27136..f5a191f 100644
--- a/java/res/drawable/btn_keyboard_key_honeycomb_popup.xml
+++ b/java/res/drawable/btn_keyboard_key_popup_honeycomb.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
+<!-- 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.
diff --git a/java/res/drawable/caution.png b/java/res/drawable/caution.png
deleted file mode 100755
index eaef534..0000000
--- a/java/res/drawable/caution.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable/mic_base.png b/java/res/drawable/mic_base.png
deleted file mode 100644
index 53e29ff..0000000
--- a/java/res/drawable/mic_base.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable/mic_full.png b/java/res/drawable/mic_full.png
deleted file mode 100644
index e3e3dfa..0000000
--- a/java/res/drawable/mic_full.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable/mic_slash.png b/java/res/drawable/mic_slash.png
deleted file mode 100644
index 1dd05c5..0000000
--- a/java/res/drawable/mic_slash.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable/vs_dialog_blue.9.png b/java/res/drawable/vs_dialog_blue.9.png
deleted file mode 100644
index cf27e8f..0000000
--- a/java/res/drawable/vs_dialog_blue.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable/vs_dialog_red.9.png b/java/res/drawable/vs_dialog_red.9.png
deleted file mode 100644
index 6c08d5a..0000000
--- a/java/res/drawable/vs_dialog_red.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable/vs_dialog_yellow.9.png b/java/res/drawable/vs_dialog_yellow.9.png
deleted file mode 100644
index 2fb06c2..0000000
--- a/java/res/drawable/vs_dialog_yellow.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable/vs_popup_mic_edge.png b/java/res/drawable/vs_popup_mic_edge.png
deleted file mode 100644
index 4ff6337..0000000
--- a/java/res/drawable/vs_popup_mic_edge.png
+++ /dev/null
Binary files differ
diff --git a/java/res/layout-xlarge/candidates.xml b/java/res/layout-sw768dp/candidates.xml
similarity index 95%
rename from java/res/layout-xlarge/candidates.xml
rename to java/res/layout-sw768dp/candidates.xml
index 096a0ad..93b0304 100644
--- a/java/res/layout-xlarge/candidates.xml
+++ b/java/res/layout-sw768dp/candidates.xml
@@ -20,6 +20,7 @@
 
 <LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/candidates_container"
     android:orientation="horizontal"
     android:gravity="bottom"
     android:layout_width="match_parent"
@@ -33,9 +34,9 @@
         android:orientation="horizontal"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:background="@drawable/keyboard_suggest_strip_holo"
         android:paddingRight="@dimen/candidate_strip_padding"
         android:paddingLeft="@dimen/candidate_strip_padding"
+        style="?attr/suggestionsStripBackgroundStyle"
     >
         <HorizontalScrollView
             android:layout_width="match_parent"
diff --git a/java/res/layout-xlarge/recognition_status.xml b/java/res/layout-sw768dp/recognition_status.xml
similarity index 100%
rename from java/res/layout-xlarge/recognition_status.xml
rename to java/res/layout-sw768dp/recognition_status.xml
diff --git a/java/res/layout-xlarge/candidate.xml b/java/res/layout-xlarge/candidate.xml
deleted file mode 100644
index 582e642..0000000
--- a/java/res/layout-xlarge/candidate.xml
+++ /dev/null
@@ -1,59 +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.
-*/
--->
-
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="wrap_content"
-    android:layout_height="match_parent"
-    android:orientation="horizontal"
->
-    <ImageView
-        android:id="@+id/candidate_divider"
-        android:layout_width="wrap_content"
-        android:layout_height="match_parent"
-        android:src="@drawable/keyboard_suggest_strip_divider"
-        android:paddingRight="@dimen/candidate_padding"
-        android:paddingLeft="@dimen/candidate_padding"
-        android:visibility="invisible"
-        android:focusable="false"
-        android:clickable="false"
-        android:gravity="center_vertical|center_horizontal" />
-    <Button
-        android:id="@+id/candidate_word"
-        android:layout_width="wrap_content"
-        android:layout_height="match_parent"
-        android:minWidth="@dimen/candidate_min_width"
-        android:textSize="@dimen/candidate_text_size"
-        android:textColor="@color/candidate_normal"
-        android:background="@drawable/btn_candidate_holo"
-        android:focusable="true"
-        android:clickable="true"
-        android:gravity="center_vertical|center_horizontal" />
-    <TextView
-        android:id="@+id/candidate_debug_info"
-        android:layout_width="wrap_content"
-        android:layout_height="match_parent"
-        android:visibility="gone"
-        android:textSize="10dip"
-        android:textColor="#ff808080"
-        android:focusable="false"
-        android:clickable="false"
-        android:gravity="bottom" />
-</LinearLayout>
diff --git a/java/res/layout/bubble_text.xml b/java/res/layout/bubble_text.xml
deleted file mode 100644
index c3957b6..0000000
--- a/java/res/layout/bubble_text.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/* 
-**
-** Copyright 2009, 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.
-*/
--->
-
-<TextView xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="wrap_content" 
-    android:layout_height="wrap_content"
-    android:textSize="14sp"
-    android:textColor="?android:attr/textColorPrimary"
-    android:minWidth="32dip"
-    android:gravity="center"
-    android:shadowRadius="2.75"
-    android:shadowColor="#BB000000"
-    />
diff --git a/java/res/layout/candidate.xml b/java/res/layout/candidate.xml
index 5472a1d..aa2845f 100644
--- a/java/res/layout/candidate.xml
+++ b/java/res/layout/candidate.xml
@@ -24,17 +24,6 @@
     android:layout_height="match_parent"
     android:orientation="horizontal"
 >
-    <ImageView
-        android:id="@+id/candidate_divider"
-        android:layout_width="wrap_content"
-        android:layout_height="match_parent"
-        android:src="@drawable/keyboard_suggest_strip_divider"
-        android:paddingRight="@dimen/candidate_padding"
-        android:paddingLeft="@dimen/candidate_padding"
-        android:visibility="invisible"
-        android:focusable="false"
-        android:clickable="false"
-        android:gravity="center_vertical|center_horizontal" />
     <Button
         android:id="@+id/candidate_word"
         android:layout_width="wrap_content"
@@ -42,10 +31,10 @@
         android:minWidth="@dimen/candidate_min_width"
         android:textSize="@dimen/candidate_text_size"
         android:textColor="@color/candidate_normal"
-        android:background="@drawable/btn_candidate"
         android:focusable="true"
         android:clickable="true"
-        android:gravity="center_vertical|center_horizontal" />
+        android:gravity="center_vertical|center_horizontal"
+        style="?attr/suggestionBackgroundStyle" />
     <TextView
         android:id="@+id/candidate_debug_info"
         android:layout_width="wrap_content"
diff --git a/java/res/layout-xlarge/candidate_preview.xml b/java/res/layout/candidate_divider.xml
similarity index 66%
rename from java/res/layout-xlarge/candidate_preview.xml
rename to java/res/layout/candidate_divider.xml
index 61d5f8e..dc6738a 100644
--- a/java/res/layout-xlarge/candidate_preview.xml
+++ b/java/res/layout/candidate_divider.xml
@@ -18,12 +18,14 @@
 */
 -->
 
-<TextView
+<ImageView
     xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/candidate_divider"
     android:layout_width="wrap_content"
-    android:layout_height="wrap_content"
-    android:textSize="18sp"
-    android:textColor="?android:attr/textColorPrimaryInverse"
-    android:minWidth="32dip"
-    android:gravity="center"
-    android:background="@drawable/keyboard_popup_panel_background_holo" />
+    android:layout_height="match_parent"
+    android:src="@drawable/keyboard_suggest_strip_divider"
+    android:paddingRight="@dimen/candidate_padding"
+    android:paddingLeft="@dimen/candidate_padding"
+    android:focusable="false"
+    android:clickable="false"
+    android:gravity="center_vertical|center_horizontal" />
diff --git a/java/res/layout/candidate_preview.xml b/java/res/layout/candidate_preview.xml
index fe2002d..32705c9 100644
--- a/java/res/layout/candidate_preview.xml
+++ b/java/res/layout/candidate_preview.xml
@@ -19,11 +19,10 @@
 -->
 
 <TextView xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="wrap_content" 
+    android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:textSize="18sp"
     android:textColor="?android:attr/textColorPrimaryInverse"
     android:minWidth="32dip"
     android:gravity="center"
-    android:background="@drawable/candidate_feedback_background"
-    />
+    style="?attr/suggestionPreviewBackgroundStyle" />
diff --git a/java/res/layout/candidates.xml b/java/res/layout/candidates.xml
index 3d91c1d..2bcafc9 100644
--- a/java/res/layout/candidates.xml
+++ b/java/res/layout/candidates.xml
@@ -20,6 +20,7 @@
 
 <LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/candidates_container"
     android:orientation="horizontal"
     android:gravity="bottom"
     android:layout_width="match_parent"
@@ -31,10 +32,10 @@
     <HorizontalScrollView
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:background="@drawable/keyboard_suggest_strip"
         android:fadingEdge="horizontal"
         android:fadingEdgeLength="@dimen/candidate_strip_fading_edge_length"
         android:scrollbars="none"
+        style="?attr/suggestionsStripBackgroundStyle"
     >
         <com.android.inputmethod.latin.CandidateView
             android:id="@+id/candidates"
diff --git a/java/res/layout/input_basic.xml b/java/res/layout/input_basic.xml
deleted file mode 100644
index 8666dae..0000000
--- a/java/res/layout/input_basic.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/* 
-**
-** Copyright 2008, 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.
-*/
--->
-
-<com.android.inputmethod.keyboard.LatinKeyboardView
-        xmlns:android="http://schemas.android.com/apk/res/android"
-        xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
-        android:id="@+id/latin_keyboard_view"
-        android:layout_alignParentBottom="true"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:padding="0dip"
-        android:background="@drawable/keyboard_background"
-
-        latin:keyBackground="@drawable/btn_keyboard_key"
-        />
diff --git a/java/res/layout/input_basic_highcontrast.xml b/java/res/layout/input_basic_highcontrast.xml
deleted file mode 100644
index 4829c7d..0000000
--- a/java/res/layout/input_basic_highcontrast.xml
+++ /dev/null
@@ -1,32 +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.
-*/
--->
-
-<com.android.inputmethod.keyboard.LatinKeyboardView
-        xmlns:android="http://schemas.android.com/apk/res/android"
-        xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
-        android:id="@+id/latin_keyboard_view"
-        android:layout_alignParentBottom="true"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:padding="0dip"
-        android:background="@android:color/black"
-
-        latin:keyBackground="@drawable/btn_keyboard_key3"
-        />
diff --git a/java/res/layout/input_honeycomb.xml b/java/res/layout/input_honeycomb.xml
deleted file mode 100644
index 8dadafd..0000000
--- a/java/res/layout/input_honeycomb.xml
+++ /dev/null
@@ -1,40 +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.
-*/
--->
-
-<com.android.inputmethod.keyboard.LatinKeyboardView
-        xmlns:android="http://schemas.android.com/apk/res/android"
-        xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
-        android:id="@+id/latin_keyboard_view"
-        android:layout_alignParentBottom="true"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:padding="0dip"
-        android:background="@drawable/keyboard_background_holo"
-
-        latin:keyBackground="@drawable/btn_keyboard_key_honeycomb"
-        latin:keyPreviewLayout="@layout/key_preview_honeycomb"
-        latin:keyPreviewHeight="@dimen/key_preview_height_holo"
-        latin:keyPreviewOffset="@dimen/key_preview_offset_holo"
-        latin:popupLayout="@layout/keyboard_popup_honeycomb"
-        latin:keyTextColorDisabled="#FF63666D"
-        latin:keyLetterStyle="bold"
-        latin:shadowColor="#00000000"
-        latin:shadowRadius="0.0"
-        />
diff --git a/java/res/layout/input_stone_bold.xml b/java/res/layout/input_stone_bold.xml
deleted file mode 100644
index a0b4068..0000000
--- a/java/res/layout/input_stone_bold.xml
+++ /dev/null
@@ -1,38 +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.
-*/
--->
-
-<com.android.inputmethod.keyboard.LatinKeyboardView
-        xmlns:android="http://schemas.android.com/apk/res/android"
-        xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
-        android:id="@+id/latin_keyboard_view"
-        android:layout_alignParentBottom="true"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:padding="0dip"
-        android:background="@drawable/keyboard_background"
-
-        latin:keyBackground="@drawable/btn_keyboard_key_stone"
-        latin:keyTextColor="@color/latinkeyboard_key_color_black"
-        latin:keyTextColorDisabled="#FF808080"
-        latin:shadowColor="@color/latinkeyboard_key_color_white"
-        latin:keyLetterStyle="bold"
-        latin:colorScheme="black"
-        latin:popupLayout="@layout/keyboard_popup_stone"
-        />
diff --git a/java/res/layout/input_stone_normal.xml b/java/res/layout/input_stone_normal.xml
deleted file mode 100644
index 41cbc16..0000000
--- a/java/res/layout/input_stone_normal.xml
+++ /dev/null
@@ -1,37 +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.
-*/
--->
-
-<com.android.inputmethod.keyboard.LatinKeyboardView
-        xmlns:android="http://schemas.android.com/apk/res/android"
-        xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
-        android:id="@+id/latin_keyboard_view"
-        android:layout_alignParentBottom="true"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:padding="0dip"
-        android:background="@drawable/keyboard_background"
-
-        latin:keyBackground="@drawable/btn_keyboard_key_stone"
-        latin:keyTextColor="@color/latinkeyboard_key_color_black"
-        latin:keyTextColorDisabled="#FF808080"
-        latin:shadowColor="@color/latinkeyboard_key_color_white"
-        latin:colorScheme="black"
-        latin:popupLayout="@layout/keyboard_popup_stone"
-        />
diff --git a/java/res/layout/input_gingerbread.xml b/java/res/layout/input_view.xml
similarity index 62%
rename from java/res/layout/input_gingerbread.xml
rename to java/res/layout/input_view.xml
index ccca501..c8820b0 100644
--- a/java/res/layout/input_gingerbread.xml
+++ b/java/res/layout/input_view.xml
@@ -2,7 +2,7 @@
 <!--
 /*
 **
-** Copyright 2010, The Android Open Source Project
+** 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.
@@ -18,16 +18,19 @@
 */
 -->
 
-<com.android.inputmethod.keyboard.LatinKeyboardView
-        xmlns:android="http://schemas.android.com/apk/res/android"
-        xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+>
+    <include
+        layout="@layout/candidates" />
+    <com.android.inputmethod.keyboard.LatinKeyboardView
         android:id="@+id/latin_keyboard_view"
         android:layout_alignParentBottom="true"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:padding="0dip"
-        android:background="@drawable/keyboard_dark_background"
-
-        latin:keyBackground="@drawable/btn_keyboard_key_gingerbread"
-        latin:keyLetterStyle="bold"
-        />
+        android:padding="0dip" />
+</LinearLayout>
diff --git a/java/res/layout/key_preview.xml b/java/res/layout/key_preview.xml
index de03506..5032dd5 100644
--- a/java/res/layout/key_preview.xml
+++ b/java/res/layout/key_preview.xml
@@ -25,5 +25,5 @@
     android:textColor="@color/latinkeyboard_key_color_white"
     android:minWidth="32dip"
     android:gravity="center"
-    android:background="@drawable/keyboard_key_feedback"
+    style="?attr/keyPreviewStyle"
     />
diff --git a/java/res/layout/key_preview_honeycomb.xml b/java/res/layout/key_preview_honeycomb.xml
deleted file mode 100644
index 2fbfbb5..0000000
--- a/java/res/layout/key_preview_honeycomb.xml
+++ /dev/null
@@ -1,29 +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.
-*/
--->
-
-<TextView xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="wrap_content"
-    android:layout_height="80sp"
-    android:textSize="40sp"
-    android:textColor="@color/latinkeyboard_key_color_white"
-    android:minWidth="32dip"
-    android:gravity="center"
-    android:background="@drawable/keyboard_key_feedback_honeycomb"
-    />
diff --git a/java/res/layout/keyboard_popup.xml b/java/res/layout/keyboard_popup.xml
index 0317d8d..e2508da 100644
--- a/java/res/layout/keyboard_popup.xml
+++ b/java/res/layout/keyboard_popup.xml
@@ -22,9 +22,7 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:orientation="horizontal"
-        android:background="@drawable/keyboard_popup_panel_background"
-        android:paddingLeft="@dimen/mini_keyboard_horizontal_padding"
-        android:paddingRight="@dimen/mini_keyboard_horizontal_padding"
+        style="?attr/popupMiniKeyboardPanelStyle"
         >
     <com.android.inputmethod.keyboard.PopupMiniKeyboardView
             xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
@@ -32,9 +30,5 @@
             android:layout_alignParentBottom="true"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-
-            latin:keyBackground="@drawable/btn_keyboard_key_gingerbread_popup"
-            latin:keyHysteresisDistance="0dip"
-            latin:verticalCorrection="@dimen/mini_keyboard_vertical_correction"
             />
 </LinearLayout>
diff --git a/java/res/layout/keyboard_popup_honeycomb.xml b/java/res/layout/keyboard_popup_honeycomb.xml
deleted file mode 100644
index 2ddcbdc..0000000
--- a/java/res/layout/keyboard_popup_honeycomb.xml
+++ /dev/null
@@ -1,40 +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.
-*/
--->
-<LinearLayout
-        xmlns:android="http://schemas.android.com/apk/res/android"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:orientation="horizontal"
-        android:background="@drawable/keyboard_popup_panel_background_holo"
-        android:paddingLeft="@dimen/mini_keyboard_horizontal_padding_holo"
-        android:paddingRight="@dimen/mini_keyboard_horizontal_padding_holo"
-        >
-    <com.android.inputmethod.keyboard.PopupMiniKeyboardView
-            xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
-            android:id="@+id/mini_keyboard_view"
-            android:layout_alignParentBottom="true"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-
-            latin:keyBackground="@drawable/btn_keyboard_key_honeycomb_popup"
-            latin:keyHysteresisDistance="0dip"
-            latin:verticalCorrection="@dimen/mini_keyboard_vertical_correction"
-            />
-</LinearLayout>
diff --git a/java/res/layout/keyboard_popup_stone.xml b/java/res/layout/keyboard_popup_stone.xml
deleted file mode 100644
index 94176b2..0000000
--- a/java/res/layout/keyboard_popup_stone.xml
+++ /dev/null
@@ -1,40 +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.
-*/
--->
-
-<LinearLayout
-        xmlns:android="http://schemas.android.com/apk/res/android"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:orientation="horizontal"
-        android:background="@drawable/keyboard_popup_panel_background"
-        >
-    <com.android.inputmethod.keyboard.PopupMiniKeyboardView
-            xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
-            android:id="@+id/mini_keyboard_view"
-            android:layout_alignParentBottom="true"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:background="@drawable/keyboard_background"
-
-            latin:keyBackground="@drawable/btn_keyboard_key_stone"
-            latin:keyTextColor="@color/latinkeyboard_key_color_black"
-            latin:shadowColor="@color/latinkeyboard_key_color_white"
-        />
-</LinearLayout>
diff --git a/java/res/raw/type3.ogg b/java/res/raw/type3.ogg
deleted file mode 100644
index 20e6708..0000000
--- a/java/res/raw/type3.ogg
+++ /dev/null
Binary files differ
diff --git a/java/res/values-af/strings.xml b/java/res/values-af/strings.xml
new file mode 100644
index 0000000..22e8d2c
--- /dev/null
+++ b/java/res/values-af/strings.xml
@@ -0,0 +1,245 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/*
+**
+** Copyright 2008, 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:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="english_ime_name" msgid="7252517407088836577">"Android-sleutelbord"</string>
+    <string name="english_ime_settings" msgid="6661589557206947774">"Android-sleutelbordinstellings"</string>
+    <!-- no translation found for english_ime_input_options (3909945612939668554) -->
+    <skip />
+    <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibreer met sleuteldruk"</string>
+    <string name="sound_on_keypress" msgid="6093592297198243644">"Klank met sleuteldruk"</string>
+    <!-- no translation found for popup_on_keypress (123894815723512944) -->
+    <skip />
+    <!-- no translation found for general_category (1859088467017573195) -->
+    <skip />
+    <!-- no translation found for correction_category (2236750915056607613) -->
+    <skip />
+    <!-- no translation found for ngram_category (5337109164339320257) -->
+    <skip />
+    <!-- no translation found for misc_category (6894192814868233453) -->
+    <skip />
+    <!-- no translation found for advanced_settings (362895144495591463) -->
+    <skip />
+    <!-- no translation found for advanced_settings_summary (5193513161106637254) -->
+    <skip />
+    <!-- no translation found for key_preview_popup_dismiss_delay (6213164897443068248) -->
+    <skip />
+    <!-- no translation found for key_preview_popup_dismiss_no_delay (2096123151571458064) -->
+    <skip />
+    <!-- no translation found for key_preview_popup_dismiss_default_delay (2166964333903906734) -->
+    <skip />
+    <string name="auto_cap" msgid="1719746674854628252">"Outohoofletters"</string>
+    <string name="quick_fixes" msgid="5353213327680897927">"Vinnige oplossings"</string>
+    <string name="quick_fixes_summary" msgid="3405028402510332373">"Korrigeer algemene tikfoute"</string>
+    <!-- no translation found for prefs_show_suggestions (8026799663445531637) -->
+    <skip />
+    <!-- no translation found for prefs_show_suggestions_summary (1583132279498502825) -->
+    <skip />
+    <!-- no translation found for prefs_suggestion_visibility_show_name (3219916594067551303) -->
+    <skip />
+    <!-- no translation found for prefs_suggestion_visibility_show_only_portrait_name (3551821800439659812) -->
+    <skip />
+    <!-- no translation found for prefs_suggestion_visibility_hide_name (6309143926422234673) -->
+    <skip />
+    <!-- no translation found for prefs_use_spacebar_language_switch (8828538114550634449) -->
+    <skip />
+    <!-- no translation found for prefs_settings_key (4623341240804046498) -->
+    <skip />
+    <!-- no translation found for settings_key_mode_auto_name (2993460277873684680) -->
+    <skip />
+    <!-- no translation found for settings_key_mode_always_show_name (3047567041784760575) -->
+    <skip />
+    <!-- no translation found for settings_key_mode_always_hide_name (7833948046716923994) -->
+    <skip />
+    <!-- outdated translation 7911639788808958255 -->     <string name="auto_correction" msgid="4979925752001319458">"Woordvoorstelle"</string>
+    <!-- outdated translation 6881047311475758267 -->     <string name="auto_correction_summary" msgid="5625751551134658006">"Korrigeer outomaties die vorige woord"</string>
+    <!-- no translation found for auto_correction_threshold_mode_off (8470882665417944026) -->
+    <skip />
+    <!-- no translation found for auto_correction_threshold_mode_modest (8788366690620799097) -->
+    <skip />
+    <!-- no translation found for auto_correction_threshold_mode_aggeressive (3524029103734923819) -->
+    <skip />
+    <!-- no translation found for bigram_suggestion (2636414079905220518) -->
+    <skip />
+    <!-- no translation found for bigram_suggestion_summary (4383845146070101531) -->
+    <skip />
+    <!-- no translation found for bigram_prediction (8914273444762259739) -->
+    <skip />
+    <!-- no translation found for bigram_prediction_summary (1747261921174300098) -->
+    <skip />
+    <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Gestoor"</string>
+    <string name="label_go_key" msgid="1635148082137219148">"Gaan"</string>
+    <string name="label_next_key" msgid="362972844525672568">"Volgende"</string>
+    <string name="label_done_key" msgid="2441578748772529288">"Klaar"</string>
+    <string name="label_send_key" msgid="2815056534433717444">"Stuur"</string>
+    <!-- no translation found for label_to_alpha_key (4793983863798817523) -->
+    <skip />
+    <!-- no translation found for label_more_key (3760239494604948502) -->
+    <skip />
+    <!-- no translation found for label_pause_key (181098308428035340) -->
+    <skip />
+    <!-- no translation found for label_wait_key (6402152600878093134) -->
+    <skip />
+    <!-- no translation found for voice_warning_title (4419354150908395008) -->
+    <skip />
+    <!-- no translation found for voice_warning_locale_not_supported (637923019716442333) -->
+    <skip />
+    <!-- no translation found for voice_warning_may_not_understand (5596289095878251072) -->
+    <skip />
+    <!-- no translation found for voice_warning_how_to_turn_off (3190378129944934856) -->
+    <skip />
+    <!-- no translation found for voice_hint_dialog_message (1420686286820661548) -->
+    <skip />
+    <!-- no translation found for voice_listening (467518160751321844) -->
+    <skip />
+    <!-- no translation found for voice_working (6666937792815731889) -->
+    <skip />
+    <string name="voice_initializing" msgid="661962047129906646"></string>
+    <!-- no translation found for voice_error (5140896300312186162) -->
+    <skip />
+    <!-- no translation found for voice_network_error (6649556447401862563) -->
+    <skip />
+    <!-- no translation found for voice_too_much_speech (5746973620134227376) -->
+    <skip />
+    <!-- no translation found for voice_audio_error (5072707727016414454) -->
+    <skip />
+    <!-- no translation found for voice_server_error (7807129913977261644) -->
+    <skip />
+    <!-- no translation found for voice_speech_timeout (8461817525075498795) -->
+    <skip />
+    <!-- no translation found for voice_no_match (4285117547030179174) -->
+    <skip />
+    <string name="voice_not_installed" msgid="5552450909753842415">"Stemsoek nie geïnstalleer nie"</string>
+    <!-- no translation found for voice_swipe_hint (6943546180310682021) -->
+    <skip />
+    <!-- no translation found for voice_punctuation_hint (1611389463237317754) -->
+    <skip />
+    <string name="cancel" msgid="6830980399865683324">"Kanselleer"</string>
+    <string name="ok" msgid="7898366843681727667">"OK"</string>
+    <!-- no translation found for voice_input (2466640768843347841) -->
+    <skip />
+    <!-- no translation found for voice_input_modes_main_keyboard (3360660341121083174) -->
+    <skip />
+    <!-- no translation found for voice_input_modes_symbols_keyboard (7203213240786084067) -->
+    <skip />
+    <!-- no translation found for voice_input_modes_off (3745699748218082014) -->
+    <skip />
+    <!-- no translation found for voice_input_modes_summary_main_keyboard (6586544292900314339) -->
+    <skip />
+    <!-- no translation found for voice_input_modes_summary_symbols_keyboard (5233725927281932391) -->
+    <skip />
+    <!-- no translation found for voice_input_modes_summary_off (63875609591897607) -->
+    <skip />
+    <!-- no translation found for selectInputMethod (315076553378705821) -->
+    <skip />
+    <!-- no translation found for language_selection_title (1651299598555326750) -->
+    <skip />
+    <!-- no translation found for language_selection_summary (187110938289512256) -->
+    <skip />
+    <!-- no translation found for hint_add_to_dictionary (9006292060636342317) -->
+    <skip />
+    <!-- no translation found for has_dictionary (6071847973466625007) -->
+    <skip />
+    <!-- no translation found for prefs_enable_log (6620424505072963557) -->
+    <skip />
+    <!-- no translation found for prefs_description_log (5827825607258246003) -->
+    <skip />
+    <!-- no translation found for prefs_enable_recorrection (4588408906649533582) -->
+    <skip />
+    <!-- no translation found for prefs_enable_recorrection_summary (5082041365862396329) -->
+    <skip />
+    <!-- no translation found for keyboard_layout (437433231038683666) -->
+    <skip />
+    <!-- no translation found for subtype_mode_cs_keyboard (1141718931112377586) -->
+    <skip />
+    <!-- no translation found for subtype_mode_ar_keyboard (2655338636329774995) -->
+    <skip />
+    <!-- no translation found for subtype_mode_da_keyboard (1243570804427922104) -->
+    <skip />
+    <!-- no translation found for subtype_mode_de_keyboard (1990979135959462145) -->
+    <skip />
+    <!-- no translation found for subtype_mode_en_GB_keyboard (7945856548410373708) -->
+    <skip />
+    <!-- no translation found for subtype_mode_en_US_keyboard (3708655163769735410) -->
+    <skip />
+    <!-- no translation found for subtype_mode_es_keyboard (1775125478866113148) -->
+    <skip />
+    <!-- no translation found for subtype_mode_fr_keyboard (8016515336759761014) -->
+    <skip />
+    <!-- no translation found for subtype_mode_fr_CA_keyboard (2628517247158376263) -->
+    <skip />
+    <!-- no translation found for subtype_mode_fr_CH_keyboard (6742806653181621228) -->
+    <skip />
+    <!-- no translation found for subtype_mode_iw_keyboard (1787536828253289950) -->
+    <skip />
+    <!-- no translation found for subtype_mode_it_keyboard (4934199655425394484) -->
+    <skip />
+    <!-- no translation found for subtype_mode_nb_keyboard (1175783216100212360) -->
+    <skip />
+    <!-- no translation found for subtype_mode_nl_keyboard (5090278083256037936) -->
+    <skip />
+    <!-- no translation found for subtype_mode_pl_keyboard (2225816414814396047) -->
+    <skip />
+    <!-- no translation found for subtype_mode_pt_keyboard (7503997804861754840) -->
+    <skip />
+    <!-- no translation found for subtype_mode_ru_keyboard (1383995915064277943) -->
+    <skip />
+    <!-- no translation found for subtype_mode_sr_keyboard (5019440799612208168) -->
+    <skip />
+    <!-- no translation found for subtype_mode_sv_keyboard (4933838139861753401) -->
+    <skip />
+    <!-- no translation found for subtype_mode_af_voice (7542487489657902699) -->
+    <skip />
+    <!-- no translation found for subtype_mode_cs_voice (1136386688120958641) -->
+    <skip />
+    <!-- no translation found for subtype_mode_de_voice (8378803143958089866) -->
+    <skip />
+    <!-- no translation found for subtype_mode_en_voice (6643420989651848728) -->
+    <skip />
+    <!-- no translation found for subtype_mode_es_voice (1323473601346507487) -->
+    <skip />
+    <!-- no translation found for subtype_mode_fr_voice (4675914209337824269) -->
+    <skip />
+    <!-- no translation found for subtype_mode_it_voice (5077373057157441323) -->
+    <skip />
+    <!-- no translation found for subtype_mode_ja_voice (6604859132669646367) -->
+    <skip />
+    <!-- no translation found for subtype_mode_ko_voice (4890391190762324561) -->
+    <skip />
+    <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) -->
+    <skip />
+    <!-- no translation found for subtype_mode_pl_voice (2076196021014840487) -->
+    <skip />
+    <!-- no translation found for subtype_mode_pt_voice (8036522712795994397) -->
+    <skip />
+    <!-- no translation found for subtype_mode_ru_voice (8034596947963787529) -->
+    <skip />
+    <!-- no translation found for subtype_mode_tr_voice (3402067436761140005) -->
+    <skip />
+    <!-- no translation found for subtype_mode_yue_voice (1576887891614624263) -->
+    <skip />
+    <!-- no translation found for subtype_mode_zh_voice (4360533229467271152) -->
+    <skip />
+    <!-- no translation found for subtype_mode_zu_voice (1146122571698884636) -->
+    <skip />
+    <!-- no translation found for prefs_usability_study_mode (6937813623647419810) -->
+    <skip />
+</resources>
diff --git a/java/res/values-am/strings.xml b/java/res/values-am/strings.xml
new file mode 100644
index 0000000..536f061
--- /dev/null
+++ b/java/res/values-am/strings.xml
@@ -0,0 +1,209 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/*
+**
+** Copyright 2008, 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:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="english_ime_name" msgid="7252517407088836577">"የAndroid ቁልፍሰሌዳ"</string>
+    <string name="english_ime_settings" msgid="6661589557206947774">"የAndroid ቁልፍሰሌዳ ቅንብሮች"</string>
+    <string name="english_ime_input_options" msgid="3909945612939668554">"ግቤት አማራጮች"</string>
+    <string name="vibrate_on_keypress" msgid="5258079494276955460">"በቁልፍመጫንጊዜ አንዝር"</string>
+    <string name="sound_on_keypress" msgid="6093592297198243644">"በቁልፍ መጫን ላይ የሚወጣ ድምፅ"</string>
+    <string name="popup_on_keypress" msgid="123894815723512944">"ቁልፍ ጫን ላይ ብቅ ባይ"</string>
+    <!-- no translation found for general_category (1859088467017573195) -->
+    <skip />
+    <!-- no translation found for correction_category (2236750915056607613) -->
+    <skip />
+    <!-- no translation found for ngram_category (5337109164339320257) -->
+    <skip />
+    <!-- no translation found for misc_category (6894192814868233453) -->
+    <skip />
+    <!-- no translation found for advanced_settings (362895144495591463) -->
+    <skip />
+    <!-- no translation found for advanced_settings_summary (5193513161106637254) -->
+    <skip />
+    <!-- no translation found for key_preview_popup_dismiss_delay (6213164897443068248) -->
+    <skip />
+    <!-- no translation found for key_preview_popup_dismiss_no_delay (2096123151571458064) -->
+    <skip />
+    <!-- no translation found for key_preview_popup_dismiss_default_delay (2166964333903906734) -->
+    <skip />
+    <string name="auto_cap" msgid="1719746674854628252">"ራስ-ሰር አቢይ ማድረግ"</string>
+    <string name="quick_fixes" msgid="5353213327680897927">"ፈጣንጥገና"</string>
+    <string name="quick_fixes_summary" msgid="3405028402510332373">" የተለመዱ የትየባ ስህተቶችንያስተካክላል"</string>
+    <!-- no translation found for prefs_show_suggestions (8026799663445531637) -->
+    <skip />
+    <!-- no translation found for prefs_show_suggestions_summary (1583132279498502825) -->
+    <skip />
+    <!-- no translation found for prefs_suggestion_visibility_show_name (3219916594067551303) -->
+    <skip />
+    <!-- no translation found for prefs_suggestion_visibility_show_only_portrait_name (3551821800439659812) -->
+    <skip />
+    <!-- no translation found for prefs_suggestion_visibility_hide_name (6309143926422234673) -->
+    <skip />
+    <!-- no translation found for prefs_use_spacebar_language_switch (8828538114550634449) -->
+    <skip />
+    <string name="prefs_settings_key" msgid="4623341240804046498">"የቅንብሮች ቁልፍ አሳይ"</string>
+    <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"ራስ ሰር"</string>
+    <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"ሁልጊዜ አሳይ"</string>
+    <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"ሁልጊዜ ደብቅ"</string>
+    <!-- outdated translation 7911639788808958255 -->     <string name="auto_correction" msgid="4979925752001319458">"የቃልአማራጮች"</string>
+    <!-- outdated translation 6881047311475758267 -->     <string name="auto_correction_summary" msgid="5625751551134658006">"የቀደመውን ቃል በራስሰር አስተካክል"</string>
+    <!-- no translation found for auto_correction_threshold_mode_off (8470882665417944026) -->
+    <skip />
+    <!-- no translation found for auto_correction_threshold_mode_modest (8788366690620799097) -->
+    <skip />
+    <!-- no translation found for auto_correction_threshold_mode_aggeressive (3524029103734923819) -->
+    <skip />
+    <!-- outdated translation 1323347224043514969 -->     <string name="bigram_suggestion" msgid="2636414079905220518">"ቢግራም ምክሮች"</string>
+    <string name="bigram_suggestion_summary" msgid="4383845146070101531">"ምክርን ለማሻሻል የቀደመ ቃልን ተጠቀም"</string>
+    <!-- no translation found for bigram_prediction (8914273444762259739) -->
+    <skip />
+    <!-- no translation found for bigram_prediction_summary (1747261921174300098) -->
+    <skip />
+    <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : ተቀምጧል"</string>
+    <string name="label_go_key" msgid="1635148082137219148">"ሂድ"</string>
+    <string name="label_next_key" msgid="362972844525672568">"በመቀጠል"</string>
+    <string name="label_done_key" msgid="2441578748772529288">"ተከናውኗል"</string>
+    <string name="label_send_key" msgid="2815056534433717444">" ይላኩ"</string>
+    <!-- no translation found for label_to_alpha_key (4793983863798817523) -->
+    <skip />
+    <string name="label_more_key" msgid="3760239494604948502">"ተጨማሪ"</string>
+    <!-- no translation found for label_pause_key (181098308428035340) -->
+    <skip />
+    <!-- no translation found for label_wait_key (6402152600878093134) -->
+    <skip />
+    <string name="voice_warning_title" msgid="4419354150908395008">"የድምፅ ግቤ ት"</string>
+    <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"የድምፅ ግቤት በአሁኑ ጊዜ ለእርስዎን ቋንቋ አይደግፍም፣ ግን በእንግሊዘኛ ይሰራል።"</string>
+    <!-- outdated translation 4611518823070986445 -->     <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"የድምፅ ግቤት የGoogleን አውታረ መረብ ንግግር ማወቂያ የሙከራ ገፅታ ነው።"</string>
+    <!-- outdated translation 5652369578498701761 -->     <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"የድምፅ ግቤት አጥፋ፣ ወደ ቁልፍሰሌዳ ቅንብሮች ሂድ።"</string>
+    <!-- outdated translation 6892342981545727994 -->     <string name="voice_hint_dialog_message" msgid="1420686286820661548">"የድምፅ ግቤት ለመጠቀም፣ የማይክሮፎን አዝራሩን ይጫኑ ወይም በማያ ቁልፍ ሰሌዳው ላይ ጣትዎን ያንሸራቱ።"</string>
+    <string name="voice_listening" msgid="467518160751321844">"አሁን ተናገር"</string>
+    <string name="voice_working" msgid="6666937792815731889">"ሥራ ላይ"</string>
+    <string name="voice_initializing" msgid="661962047129906646"></string>
+    <string name="voice_error" msgid="5140896300312186162">"ስህተት፣ እባክዎ እንደገና ይሞክሩ።"</string>
+    <string name="voice_network_error" msgid="6649556447401862563">"ማያያዝ አልተቻለም"</string>
+    <string name="voice_too_much_speech" msgid="5746973620134227376">"ስህተት፣ በጣም ብዙ ንግግር።"</string>
+    <string name="voice_audio_error" msgid="5072707727016414454">"የድምፅ ችግር"</string>
+    <string name="voice_server_error" msgid="7807129913977261644">"የአገልጋይ ስህተት"</string>
+    <string name="voice_speech_timeout" msgid="8461817525075498795">"ምንም ንግግር አልተሰማም"</string>
+    <string name="voice_no_match" msgid="4285117547030179174">"ምንም ተመሳሳይ አልተገኘም።"</string>
+    <string name="voice_not_installed" msgid="5552450909753842415">"የድምፅ ፍለጋአልተጫነም"</string>
+    <string name="voice_swipe_hint" msgid="6943546180310682021"><b>"ምክር፡"</b>" ለመናገር በቁልፍሰሌዳ ላይ አንሸራት"</string>
+    <string name="voice_punctuation_hint" msgid="1611389463237317754"><b>"ምክር፡"</b>" ሌላ ጊዜ፣  እንደ \"period\", \"comma\", ወይም \"question mark\" ያሉ ስርዓተ ነጥቦችን ለመናገር ሞክር።"</string>
+    <string name="cancel" msgid="6830980399865683324">"ይቅር"</string>
+    <string name="ok" msgid="7898366843681727667">"እሺ"</string>
+    <string name="voice_input" msgid="2466640768843347841">"የድምፅ ግቤት"</string>
+    <!-- no translation found for voice_input_modes_main_keyboard (3360660341121083174) -->
+    <skip />
+    <!-- no translation found for voice_input_modes_symbols_keyboard (7203213240786084067) -->
+    <skip />
+    <!-- no translation found for voice_input_modes_off (3745699748218082014) -->
+    <skip />
+    <!-- no translation found for voice_input_modes_summary_main_keyboard (6586544292900314339) -->
+    <skip />
+    <!-- no translation found for voice_input_modes_summary_symbols_keyboard (5233725927281932391) -->
+    <skip />
+    <!-- no translation found for voice_input_modes_summary_off (63875609591897607) -->
+    <skip />
+    <string name="selectInputMethod" msgid="315076553378705821">"የግቤት ሜተድ ምረጥ"</string>
+    <string name="language_selection_title" msgid="1651299598555326750">"ቋንቋዎች አግቤት"</string>
+    <string name="language_selection_summary" msgid="187110938289512256">"ቋንቋ ለመለወጥ የቦታ ቁልፍ ላይ ጣትዎን ያንሸራቱ"</string>
+    <string name="hint_add_to_dictionary" msgid="9006292060636342317">"← ለማስቀመጥ ድጋሚ ንካ"</string>
+    <string name="has_dictionary" msgid="6071847973466625007">"መዝገበ ቃላት አለ"</string>
+    <string name="prefs_enable_log" msgid="6620424505072963557">"የተጠቃሚ ግብረ ምላሽ አንቃ"</string>
+    <string name="prefs_description_log" msgid="5827825607258246003">"ወደ Google የተሰናከለ ሪፖርቶች እና አጠቃቀም ስታስቲክስ በራስ ሰር በመላክ ይህን ግቤት ሜተድ አርትኢ እገዛ ያሻሽላል።"</string>
+    <string name="prefs_enable_recorrection" msgid="4588408906649533582">"ቃላትን ለማስተካከል ንካ"</string>
+    <!-- outdated translation 1056068922330206170 -->     <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"የገቡ ቃላትን ለማስተካከል ንካ"</string>
+    <string name="keyboard_layout" msgid="437433231038683666">"የቁልፍ ሰሌዳ ገጽታ"</string>
+    <!-- no translation found for subtype_mode_cs_keyboard (1141718931112377586) -->
+    <skip />
+    <!-- no translation found for subtype_mode_ar_keyboard (2655338636329774995) -->
+    <skip />
+    <!-- no translation found for subtype_mode_da_keyboard (1243570804427922104) -->
+    <skip />
+    <!-- no translation found for subtype_mode_de_keyboard (1990979135959462145) -->
+    <skip />
+    <!-- no translation found for subtype_mode_en_GB_keyboard (7945856548410373708) -->
+    <skip />
+    <!-- no translation found for subtype_mode_en_US_keyboard (3708655163769735410) -->
+    <skip />
+    <!-- no translation found for subtype_mode_es_keyboard (1775125478866113148) -->
+    <skip />
+    <!-- no translation found for subtype_mode_fr_keyboard (8016515336759761014) -->
+    <skip />
+    <!-- no translation found for subtype_mode_fr_CA_keyboard (2628517247158376263) -->
+    <skip />
+    <!-- no translation found for subtype_mode_fr_CH_keyboard (6742806653181621228) -->
+    <skip />
+    <!-- no translation found for subtype_mode_iw_keyboard (1787536828253289950) -->
+    <skip />
+    <!-- no translation found for subtype_mode_it_keyboard (4934199655425394484) -->
+    <skip />
+    <!-- no translation found for subtype_mode_nb_keyboard (1175783216100212360) -->
+    <skip />
+    <!-- no translation found for subtype_mode_nl_keyboard (5090278083256037936) -->
+    <skip />
+    <!-- no translation found for subtype_mode_pl_keyboard (2225816414814396047) -->
+    <skip />
+    <!-- no translation found for subtype_mode_pt_keyboard (7503997804861754840) -->
+    <skip />
+    <!-- no translation found for subtype_mode_ru_keyboard (1383995915064277943) -->
+    <skip />
+    <!-- no translation found for subtype_mode_sr_keyboard (5019440799612208168) -->
+    <skip />
+    <!-- no translation found for subtype_mode_sv_keyboard (4933838139861753401) -->
+    <skip />
+    <!-- no translation found for subtype_mode_af_voice (7542487489657902699) -->
+    <skip />
+    <!-- no translation found for subtype_mode_cs_voice (1136386688120958641) -->
+    <skip />
+    <!-- no translation found for subtype_mode_de_voice (8378803143958089866) -->
+    <skip />
+    <!-- no translation found for subtype_mode_en_voice (6643420989651848728) -->
+    <skip />
+    <!-- no translation found for subtype_mode_es_voice (1323473601346507487) -->
+    <skip />
+    <!-- no translation found for subtype_mode_fr_voice (4675914209337824269) -->
+    <skip />
+    <!-- no translation found for subtype_mode_it_voice (5077373057157441323) -->
+    <skip />
+    <!-- no translation found for subtype_mode_ja_voice (6604859132669646367) -->
+    <skip />
+    <!-- no translation found for subtype_mode_ko_voice (4890391190762324561) -->
+    <skip />
+    <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) -->
+    <skip />
+    <!-- no translation found for subtype_mode_pl_voice (2076196021014840487) -->
+    <skip />
+    <!-- no translation found for subtype_mode_pt_voice (8036522712795994397) -->
+    <skip />
+    <!-- no translation found for subtype_mode_ru_voice (8034596947963787529) -->
+    <skip />
+    <!-- no translation found for subtype_mode_tr_voice (3402067436761140005) -->
+    <skip />
+    <!-- no translation found for subtype_mode_yue_voice (1576887891614624263) -->
+    <skip />
+    <!-- no translation found for subtype_mode_zh_voice (4360533229467271152) -->
+    <skip />
+    <!-- no translation found for subtype_mode_zu_voice (1146122571698884636) -->
+    <skip />
+    <!-- no translation found for prefs_usability_study_mode (6937813623647419810) -->
+    <skip />
+</resources>
diff --git a/java/res/values-ar/strings.xml b/java/res/values-ar/strings.xml
index df5b87a..2e7e482 100644
--- a/java/res/values-ar/strings.xml
+++ b/java/res/values-ar/strings.xml
@@ -30,6 +30,11 @@
     <string name="correction_category" msgid="2236750915056607613">"تصحيح النص"</string>
     <string name="ngram_category" msgid="5337109164339320257">"الاقتراحات بناءً على الكلمات السابقة"</string>
     <string name="misc_category" msgid="6894192814868233453">"خيارات أخرى"</string>
+    <string name="advanced_settings" msgid="362895144495591463">"الإعدادات المتقدمة"</string>
+    <string name="advanced_settings_summary" msgid="5193513161106637254">"خيارات للمستخدمين الخبراء"</string>
+    <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"تأخير إزالة النافذة المنبثقة الأساسية"</string>
+    <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"بلا تأخير"</string>
+    <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"افتراضي"</string>
     <string name="auto_cap" msgid="1719746674854628252">"استخدام الأحرف الكبيرة تلقائيًا"</string>
     <string name="quick_fixes" msgid="5353213327680897927">"إصلاحات سريعة"</string>
     <string name="quick_fixes_summary" msgid="3405028402510332373">"تصحيح الأخطاء المكتوبة الشائعة"</string>
@@ -105,7 +110,6 @@
     <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"لوحة مفاتيح إنجليزية (بريطانيا)"</string>
     <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"لوحة مفاتيح إنجليزية (الولايات المتحدة)"</string>
     <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"لوحة مفاتيح إسبانية"</string>
-    <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"لوحة مفاتيح إسبانية (الولايات المتحدة)"</string>
     <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"لوحة مفاتيح فرنسية"</string>
     <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"لوحة مفاتيح فرنسية (كندا)"</string>
     <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"لوحة مفاتيح فرنسية (سويسرا)"</string>
@@ -113,6 +117,8 @@
     <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"لوحة مفاتيح إيطالية"</string>
     <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"لوحة مفاتيح نرويجية"</string>
     <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"لوحة مفاتيح بولندية"</string>
+    <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"لوحة المفاتيح البولندية"</string>
+    <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"لوحة المفاتيح البرتغالية"</string>
     <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"لوحة مفاتيح روسية"</string>
     <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"لوحة مفاتيح صربية"</string>
     <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"لوحة مفاتيح سويدية"</string>
diff --git a/java/res/values-bg/strings.xml b/java/res/values-bg/strings.xml
index 7f59a13..4c2a968 100644
--- a/java/res/values-bg/strings.xml
+++ b/java/res/values-bg/strings.xml
@@ -28,8 +28,13 @@
     <string name="popup_on_keypress" msgid="123894815723512944">"Изскачащ прозорец при натискане на клавиш"</string>
     <string name="general_category" msgid="1859088467017573195">"Общи"</string>
     <string name="correction_category" msgid="2236750915056607613">"Корекция на текста"</string>
-    <string name="ngram_category" msgid="5337109164339320257">"Предложения въз на основа на предишни думи"</string>
+    <string name="ngram_category" msgid="5337109164339320257">"Предложения въз основа на предишни думи"</string>
     <string name="misc_category" msgid="6894192814868233453">"Други опции"</string>
+    <string name="advanced_settings" msgid="362895144495591463">"Разширени настройки"</string>
+    <string name="advanced_settings_summary" msgid="5193513161106637254">"Опции за потребителите експерти"</string>
+    <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Отхвърляне на подсказката"</string>
+    <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Без задържане"</string>
+    <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"По подразбиране"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Автоматично поставяне на главни букви"</string>
     <string name="quick_fixes" msgid="5353213327680897927">"Бързи корекции"</string>
     <string name="quick_fixes_summary" msgid="3405028402510332373">"Коригира най-честите грешки при въвеждане"</string>
@@ -38,7 +43,7 @@
     <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Винаги да се показва"</string>
     <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Показване с вертикална ориентация"</string>
     <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Винаги да се скрива"</string>
-    <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Клавишът интервал да превкл. езика"</string>
+    <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Смяна на езика с клавиша за интервал"</string>
     <string name="prefs_settings_key" msgid="4623341240804046498">"Показване на клавиша за настройки"</string>
     <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Автоматично"</string>
     <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Да се показва винаги"</string>
@@ -105,7 +110,6 @@
     <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"английска (Великобрит.) клавиатура"</string>
     <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"английска (САЩ) клавиатура"</string>
     <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"испанска клавиатура"</string>
-    <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"испанска (САЩ) клавиатура"</string>
     <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"френска клавиатура"</string>
     <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"френска (Канада) клавиатура"</string>
     <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"френска (Швейцария) клавиатура"</string>
@@ -113,6 +117,8 @@
     <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"италианска клавиатура"</string>
     <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"норвежка клавиатура"</string>
     <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"нидерландска клавиатура"</string>
+    <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Полска клавиатура"</string>
+    <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Португалска клавиатура"</string>
     <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"руска клавиатура"</string>
     <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"сръбска клавиатура"</string>
     <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"шведска клавиатура"</string>
diff --git a/java/res/values-ca/strings.xml b/java/res/values-ca/strings.xml
index 36939fe..ca14863 100644
--- a/java/res/values-ca/strings.xml
+++ b/java/res/values-ca/strings.xml
@@ -30,6 +30,11 @@
     <string name="correction_category" msgid="2236750915056607613">"Correcció de text"</string>
     <string name="ngram_category" msgid="5337109164339320257">"Suggeriments basats en paraules anteriors"</string>
     <string name="misc_category" msgid="6894192814868233453">"Altres opcions"</string>
+    <string name="advanced_settings" msgid="362895144495591463">"Configuració avançada"</string>
+    <string name="advanced_settings_summary" msgid="5193513161106637254">"Opcions per a usuaris experts"</string>
+    <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Retard d\'om. em. de tecla"</string>
+    <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Sense retard"</string>
+    <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Predeterminat"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Majúscules automàtiques"</string>
     <string name="quick_fixes" msgid="5353213327680897927">"Correccions ràpides"</string>
     <string name="quick_fixes_summary" msgid="3405028402510332373">"Corregeix els errors d\'ortografia habituals"</string>
@@ -38,7 +43,7 @@
     <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Mostra sempre"</string>
     <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Mostra en mode vertical"</string>
     <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Amaga sempre"</string>
-    <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Utilitza el canvi d\'idioma amb la barra espaiadora"</string>
+    <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Canvi d\'idioma amb la barra espaiadora"</string>
     <string name="prefs_settings_key" msgid="4623341240804046498">"Mostra la tecla de configuració"</string>
     <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automàtic"</string>
     <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Mostra sempre"</string>
@@ -51,7 +56,7 @@
     <string name="bigram_suggestion" msgid="2636414079905220518">"Suggeriments Bigram"</string>
     <string name="bigram_suggestion_summary" msgid="4383845146070101531">"Utilitza la paraula anterior per millorar el suggeriment"</string>
     <string name="bigram_prediction" msgid="8914273444762259739">"Predicció Bigram"</string>
-    <string name="bigram_prediction_summary" msgid="1747261921174300098">"Utilitza la paraula anterior per a la predicció també"</string>
+    <string name="bigram_prediction_summary" msgid="1747261921174300098">"Utilitza també la paraula anterior per a la predicció"</string>
     <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: desada"</string>
     <string name="label_go_key" msgid="1635148082137219148">"Vés"</string>
     <string name="label_next_key" msgid="362972844525672568">"Següent"</string>
@@ -63,7 +68,7 @@
     <string name="label_wait_key" msgid="6402152600878093134">"Espera"</string>
     <string name="voice_warning_title" msgid="4419354150908395008">"Entrada de veu"</string>
     <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Actualment, l\'entrada de veu no és compatible amb el vostre idioma, però funciona en anglès."</string>
-    <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"L\'entrada de veu utilitza el reconeixement de veu de Google. S\'hi aplica la "<a href="http://m.google.com/privacy">"Política de privadesa de Google Mobile"</a>"."</string>
+    <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"L\'entrada de veu utilitza el reconeixement de veu de Google. S\'hi aplica la "<a href="http://m.google.com/privacy">"Política de privadesa de Google per a mòbils"</a>"."</string>
     <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Per desactivar l\'entada de veu, vés a la configuració del mètode d\'entrada."</string>
     <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Per utilitzar l\'entrada de veu, prem el botó del micròfon."</string>
     <string name="voice_listening" msgid="467518160751321844">"Parleu ara"</string>
@@ -105,7 +110,6 @@
     <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Teclat anglès (Regne Unit)"</string>
     <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Teclat anglès (Estats Units)"</string>
     <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Teclat espanyol"</string>
-    <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"Teclat espanyol (Estats Units)"</string>
     <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Teclat francès"</string>
     <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Teclat francès (Canadà)"</string>
     <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Teclat francès (Suïssa)"</string>
@@ -113,6 +117,8 @@
     <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Teclat italià"</string>
     <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Teclat noruec"</string>
     <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Teclat holandès"</string>
+    <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Teclat polonès"</string>
+    <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Teclat portuguès"</string>
     <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Teclat rus"</string>
     <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Teclat serbi"</string>
     <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Teclat suec"</string>
diff --git a/java/res/values-cs/strings.xml b/java/res/values-cs/strings.xml
index 132bc1c..65f9509 100644
--- a/java/res/values-cs/strings.xml
+++ b/java/res/values-cs/strings.xml
@@ -30,6 +30,11 @@
     <string name="correction_category" msgid="2236750915056607613">"Oprava textu"</string>
     <string name="ngram_category" msgid="5337109164339320257">"Návrhy na základě předchozích slov"</string>
     <string name="misc_category" msgid="6894192814868233453">"Další možnosti"</string>
+    <string name="advanced_settings" msgid="362895144495591463">"Pokročilá nastavení"</string>
+    <string name="advanced_settings_summary" msgid="5193513161106637254">"Možnosti pro zkušené uživatele"</string>
+    <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Prodleva vysk. okna kláv."</string>
+    <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Bez prodlevy"</string>
+    <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Výchozí"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Velká písmena automaticky"</string>
     <string name="quick_fixes" msgid="5353213327680897927">"Rychlé opravy"</string>
     <string name="quick_fixes_summary" msgid="3405028402510332373">"Opravuje nejčastější chyby při psaní"</string>
@@ -105,7 +110,6 @@
     <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Klávesnice – angličtina (VB)"</string>
     <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Klávesnice – angličtina (USA)"</string>
     <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Klávesnice – španělština"</string>
-    <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"Klávesnice – španělština (USA)"</string>
     <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Klávesnice – francouzština"</string>
     <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Klávesnice – francouzština (Kanada)"</string>
     <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Klávesnice – francouzština (Švýc.)"</string>
@@ -113,6 +117,8 @@
     <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Klávesnice – italština"</string>
     <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Klávesnice – norština"</string>
     <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Klávesnice – holandština"</string>
+    <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Polská klávesnice"</string>
+    <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Portugalská klávesnice"</string>
     <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Klávesnice – ruština"</string>
     <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Klávesnice – srbština"</string>
     <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Klávesnice – švédština"</string>
diff --git a/java/res/values-da/strings.xml b/java/res/values-da/strings.xml
index ad92b24..1b0e9c4 100644
--- a/java/res/values-da/strings.xml
+++ b/java/res/values-da/strings.xml
@@ -30,6 +30,11 @@
     <string name="correction_category" msgid="2236750915056607613">"Tekstkorrigering"</string>
     <string name="ngram_category" msgid="5337109164339320257">"Forslag baseret på tidligere ord"</string>
     <string name="misc_category" msgid="6894192814868233453">"Andre valgmuligheder"</string>
+    <string name="advanced_settings" msgid="362895144495591463">"Avancerede indstillinger"</string>
+    <string name="advanced_settings_summary" msgid="5193513161106637254">"Muligheder for ekspertbrugere"</string>
+    <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Forsink. afvis. af taste-popup"</string>
+    <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Ingen forsink."</string>
+    <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Standard"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Skriv aut. med stort"</string>
     <string name="quick_fixes" msgid="5353213327680897927">"Hurtige løsninger"</string>
     <string name="quick_fixes_summary" msgid="3405028402510332373">"Retter almindelige stavefejl"</string>
@@ -105,7 +110,6 @@
     <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Engelsk tastatur (Storbritannien)"</string>
     <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Engelsk tastatur (USA)"</string>
     <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Spansk tastatur"</string>
-    <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"Spansk tastatur (USA)"</string>
     <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Fransk tastatur"</string>
     <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Fransk tastatur (Canada)"</string>
     <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Fransk tastatur (Schweiz)"</string>
@@ -113,6 +117,8 @@
     <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Italiensk tastatur"</string>
     <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Norsk tastatur"</string>
     <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Hollandsk tastatur"</string>
+    <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Polsk tastatur"</string>
+    <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Portugisisk tastatur"</string>
     <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Russisk tastatur"</string>
     <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Serbisk tastatur"</string>
     <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Svensk tastatur"</string>
diff --git a/java/res/values-de/strings.xml b/java/res/values-de/strings.xml
index 65f0faa..da232c2 100644
--- a/java/res/values-de/strings.xml
+++ b/java/res/values-de/strings.xml
@@ -30,6 +30,11 @@
     <string name="correction_category" msgid="2236750915056607613">"Textkorrektur"</string>
     <string name="ngram_category" msgid="5337109164339320257">"Vorschläge basieren auf bisherigen Wörtern"</string>
     <string name="misc_category" msgid="6894192814868233453">"Sonstige Optionen"</string>
+    <string name="advanced_settings" msgid="362895144495591463">"Erweiterte Einstellungen"</string>
+    <string name="advanced_settings_summary" msgid="5193513161106637254">"Optionen für Experten"</string>
+    <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Verzög. Schlüssel-Pop-up"</string>
+    <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Keine Verzögerung"</string>
+    <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Standard"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Autom. Groß-/Kleinschr."</string>
     <string name="quick_fixes" msgid="5353213327680897927">"Quick Fixes"</string>
     <string name="quick_fixes_summary" msgid="3405028402510332373">"Korrigiert gängige Tippfehler"</string>
@@ -105,7 +110,6 @@
     <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Englische Tastatur (GB)"</string>
     <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Englische Tastatur (USA)"</string>
     <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Spanische Tastatur"</string>
-    <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"Spanische Tastatur (USA)"</string>
     <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Französische Tastatur"</string>
     <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Französische Tastatur (Kanada)"</string>
     <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Französische Tastatur (Schweiz)"</string>
@@ -113,6 +117,8 @@
     <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Italienische Tastatur"</string>
     <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Norwegische Tastatur"</string>
     <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Niederländische Tastatur"</string>
+    <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Polnische Tastatur"</string>
+    <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Portugiesische Tastatur"</string>
     <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Russische Tastatur"</string>
     <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Serbische Tastatur"</string>
     <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Schwedische Tastatur"</string>
diff --git a/java/res/values-el/strings.xml b/java/res/values-el/strings.xml
index 5cee959..120cbc3 100644
--- a/java/res/values-el/strings.xml
+++ b/java/res/values-el/strings.xml
@@ -30,6 +30,11 @@
     <string name="correction_category" msgid="2236750915056607613">"Διόρθωση κειμένου"</string>
     <string name="ngram_category" msgid="5337109164339320257">"Προτάσεις που βασίζονται σε προηγούμενες λέξεις"</string>
     <string name="misc_category" msgid="6894192814868233453">"Άλλες επιλογές"</string>
+    <string name="advanced_settings" msgid="362895144495591463">"Σύνθετες ρυθμίσεις"</string>
+    <string name="advanced_settings_summary" msgid="5193513161106637254">"Επιλογές για έμπειρους χρήστες"</string>
+    <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Χρόνος εξαφ. αναδ. παραθ."</string>
+    <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Χωρίς καθυστέρ."</string>
+    <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Προεπιλογή"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Αυτόματη χρήση κεφαλαίων"</string>
     <string name="quick_fixes" msgid="5353213327680897927">"Γρήγορες διορθώσεις"</string>
     <string name="quick_fixes_summary" msgid="3405028402510332373">"Διορθώνει συνηθισμένα λάθη πληκτρολόγησης"</string>
@@ -105,7 +110,6 @@
     <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Αγγλικό (ΗΒ) πληκτρολόγιο"</string>
     <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Αγγλικό (ΗΠΑ) πληκτρολόγιο"</string>
     <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Ισπανικό πληκτρολόγιο"</string>
-    <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"Ισπανικό (ΗΠΑ) πληκτρολόγιο"</string>
     <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Γαλλικό πληκτρολόγιο"</string>
     <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Γαλλικό (Καναδάς) πληκτρολόγιο"</string>
     <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Γαλλικό (Ελβετία) πληκτρολόγιο"</string>
@@ -113,6 +117,8 @@
     <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Ιταλικό πληκτρολόγιο"</string>
     <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Νορβηγικό πληκτρολόγιο"</string>
     <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Ολλανδικό πληκτρολόγιο"</string>
+    <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Πληκτρολόγιο με πολωνικούς χαρακτήρες"</string>
+    <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Πορτογαλικό πληκτρολόγιο"</string>
     <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Ρωσικό πληκτρολόγιο"</string>
     <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Σερβικό πληκτρολόγιο"</string>
     <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Σουηδικό πληκτρολόγιο"</string>
diff --git a/java/res/values-en-rGB/strings.xml b/java/res/values-en-rGB/strings.xml
index 7d5d501..3aa37c9 100644
--- a/java/res/values-en-rGB/strings.xml
+++ b/java/res/values-en-rGB/strings.xml
@@ -30,6 +30,11 @@
     <string name="correction_category" msgid="2236750915056607613">"Text correction"</string>
     <string name="ngram_category" msgid="5337109164339320257">"Suggestions based on previous words"</string>
     <string name="misc_category" msgid="6894192814868233453">"Other Options"</string>
+    <string name="advanced_settings" msgid="362895144495591463">"Advanced settings"</string>
+    <string name="advanced_settings_summary" msgid="5193513161106637254">"Options for expert users"</string>
+    <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Key pop-up dismiss delay"</string>
+    <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"No delay"</string>
+    <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Default"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Auto-capitalisation"</string>
     <string name="quick_fixes" msgid="5353213327680897927">"Quick fixes"</string>
     <string name="quick_fixes_summary" msgid="3405028402510332373">"Corrects commonly typed mistakes"</string>
@@ -105,7 +110,6 @@
     <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"English (UK) Keyboard"</string>
     <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"English (US) Keyboard"</string>
     <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Spanish Keyboard"</string>
-    <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"Spanish (US) Keyboard"</string>
     <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"French Keyboard"</string>
     <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"French (Canada) Keyboard"</string>
     <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"French (Switzerland) Keyboard"</string>
@@ -113,6 +117,8 @@
     <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Italian Keyboard"</string>
     <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Norwegian Keyboard"</string>
     <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Dutch Keyboard"</string>
+    <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Polish keyboard"</string>
+    <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Portuguese Keyboard"</string>
     <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Russian Keyboard"</string>
     <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Serbian Keyboard"</string>
     <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Swedish Keyboard"</string>
diff --git a/java/res/values-en/whitelist.xml b/java/res/values-en/whitelist.xml
new file mode 100644
index 0000000..9395f4c
--- /dev/null
+++ b/java/res/values-en/whitelist.xml
@@ -0,0 +1,38 @@
+<?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">
+    <!--
+        An entry of the whitelist word should be:
+        1. (int)frequency
+        2. (String)before
+        3. (String)after
+     -->
+    <string-array name="wordlist_whitelist" translatable="false">
+
+        <item>255</item>
+        <item>ill</item>
+        <item>I\'ll</item>
+
+        <item>255</item>
+        <item>thisd</item>
+        <item>this\'d</item>
+
+    </string-array>
+</resources>
diff --git a/java/res/values-es-rUS/strings.xml b/java/res/values-es-rUS/strings.xml
index e40f98b..dc9028e 100644
--- a/java/res/values-es-rUS/strings.xml
+++ b/java/res/values-es-rUS/strings.xml
@@ -30,6 +30,11 @@
     <string name="correction_category" msgid="2236750915056607613">"Corrección de texto"</string>
     <string name="ngram_category" msgid="5337109164339320257">"Sugerencias sobre la base de palabras anteriores"</string>
     <string name="misc_category" msgid="6894192814868233453">"Otras opciones"</string>
+    <string name="advanced_settings" msgid="362895144495591463">"Configuración avanzada"</string>
+    <string name="advanced_settings_summary" msgid="5193513161106637254">"Opciones para usuarios expertos"</string>
+    <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Demora en rechazo de ventana emergente de clave"</string>
+    <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Sin demora"</string>
+    <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Predeterminada"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Mayúsculas automáticas"</string>
     <string name="quick_fixes" msgid="5353213327680897927">"Arreglos rápidos"</string>
     <string name="quick_fixes_summary" msgid="3405028402510332373">"Corrige errores de escritura comunes"</string>
@@ -105,7 +110,6 @@
     <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Teclado en inglés (Reino Unido)"</string>
     <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Teclado en inglés (EE.UU.)"</string>
     <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Teclado en español"</string>
-    <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"Teclado en español (EE.UU.)"</string>
     <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Teclado en francés"</string>
     <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Teclado en francés (Canadá)"</string>
     <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Teclado en francés (Suiza)"</string>
@@ -113,6 +117,8 @@
     <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Teclado en italiano"</string>
     <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Teclado en noruego"</string>
     <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Teclado en holandés"</string>
+    <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Teclado polaco"</string>
+    <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Teclado en portugués"</string>
     <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Teclado en ruso"</string>
     <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Teclado en serbio"</string>
     <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Teclado en sueco"</string>
diff --git a/java/res/values-es/strings.xml b/java/res/values-es/strings.xml
index e153242..6a97748 100644
--- a/java/res/values-es/strings.xml
+++ b/java/res/values-es/strings.xml
@@ -27,12 +27,14 @@
     <string name="sound_on_keypress" msgid="6093592297198243644">"Sonido al pulsar tecla"</string>
     <string name="popup_on_keypress" msgid="123894815723512944">"Popup al pulsar tecla"</string>
     <string name="general_category" msgid="1859088467017573195">"General"</string>
-    <!-- no translation found for correction_category (2236750915056607613) -->
-    <skip />
-    <!-- no translation found for ngram_category (5337109164339320257) -->
-    <skip />
-    <!-- no translation found for misc_category (6894192814868233453) -->
-    <skip />
+    <string name="correction_category" msgid="2236750915056607613">"Corrección ortográfica"</string>
+    <string name="ngram_category" msgid="5337109164339320257">"Sugerencias basadas en palabras anteriores"</string>
+    <string name="misc_category" msgid="6894192814868233453">"Otras opciones"</string>
+    <string name="advanced_settings" msgid="362895144495591463">"Ajustes avanzados"</string>
+    <string name="advanced_settings_summary" msgid="5193513161106637254">"Opciones para usuarios expertos"</string>
+    <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Retraso de rechazo"</string>
+    <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Sin retraso"</string>
+    <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Predeterminado"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Mayúsculas automáticas"</string>
     <string name="quick_fixes" msgid="5353213327680897927">"Correcciones rápidas"</string>
     <string name="quick_fixes_summary" msgid="3405028402510332373">"Corrige los errores tipográficos que se cometen con más frecuencia."</string>
@@ -41,8 +43,7 @@
     <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Mostrar siempre"</string>
     <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Mostrar en modo vertical"</string>
     <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Ocultar siempre"</string>
-    <!-- no translation found for prefs_use_spacebar_language_switch (8828538114550634449) -->
-    <skip />
+    <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Utilizar espacio para cambiar idioma"</string>
     <string name="prefs_settings_key" msgid="4623341240804046498">"Mostrar tecla de ajustes"</string>
     <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automáticamente"</string>
     <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Mostrar siempre"</string>
@@ -52,12 +53,10 @@
     <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Desactivada"</string>
     <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Parcial"</string>
     <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Total"</string>
-    <!-- outdated translation 7146707435859263625 -->     <string name="bigram_suggestion" msgid="2636414079905220518">"Sugerencias de bigramas"</string>
+    <string name="bigram_suggestion" msgid="2636414079905220518">"Sugerencias de bigramas"</string>
     <string name="bigram_suggestion_summary" msgid="4383845146070101531">"Usar palabra anterior para mejorar sugerencias"</string>
-    <!-- no translation found for bigram_prediction (8914273444762259739) -->
-    <skip />
-    <!-- no translation found for bigram_prediction_summary (1747261921174300098) -->
-    <skip />
+    <string name="bigram_prediction" msgid="8914273444762259739">"Predicción de bigramas"</string>
+    <string name="bigram_prediction_summary" msgid="1747261921174300098">"Utilizar también la palabra anterior para realizar la predicción"</string>
     <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: guardada"</string>
     <string name="label_go_key" msgid="1635148082137219148">"Ir"</string>
     <string name="label_next_key" msgid="362972844525672568">"Sig."</string>
@@ -111,7 +110,6 @@
     <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Teclado inglés (Reino Unido)"</string>
     <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Teclado de inglés (EE.UU.)"</string>
     <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Teclado español"</string>
-    <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"Teclado en español (EE.UU.)"</string>
     <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Teclado francés"</string>
     <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Teclado francés (Canadá)"</string>
     <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Teclado francés (Suiza)"</string>
@@ -119,6 +117,8 @@
     <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Teclado italiano"</string>
     <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Teclado noruego"</string>
     <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Teclado holandés"</string>
+    <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Teclado polaco"</string>
+    <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Teclado portugués"</string>
     <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Teclado ruso"</string>
     <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Teclado serbio"</string>
     <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Teclado sueco"</string>
diff --git a/java/res/values-fa/strings.xml b/java/res/values-fa/strings.xml
index 25ee9df..9b6023f 100644
--- a/java/res/values-fa/strings.xml
+++ b/java/res/values-fa/strings.xml
@@ -30,6 +30,11 @@
     <string name="correction_category" msgid="2236750915056607613">"تصحیح متن"</string>
     <string name="ngram_category" msgid="5337109164339320257">"پیشنهادهایی بر اساس کلمه های قبلی"</string>
     <string name="misc_category" msgid="6894192814868233453">"سایر گزینه ها"</string>
+    <string name="advanced_settings" msgid="362895144495591463">"تنظیمات پیشرفته"</string>
+    <string name="advanced_settings_summary" msgid="5193513161106637254">"گزینه هایی برای کاربران حرفه ای"</string>
+    <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"تأخیر در رد کردن کلید نمایشی"</string>
+    <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"بدون تأخیر"</string>
+    <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"پیش فرض"</string>
     <string name="auto_cap" msgid="1719746674854628252">"نوشتن با حروف بزرگ خودکار"</string>
     <string name="quick_fixes" msgid="5353213327680897927">"راه حل های سریع"</string>
     <string name="quick_fixes_summary" msgid="3405028402510332373">"تصحیح خطاهای تایپی رایج"</string>
@@ -105,7 +110,6 @@
     <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"صفحه کلید انگلیسی (بریتانیایی)"</string>
     <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"صفحه کلید انگلیسی (آمریکایی)"</string>
     <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"صفحه کلید اسپانیایی"</string>
-    <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"صفحه کلید اسپانیایی (آمریکایی)"</string>
     <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"صفحه کلید فرانسوی"</string>
     <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"صفحه کلید فرانسوی (کانادایی)"</string>
     <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"صفحه کلید فرانسوی (سوئیس)"</string>
@@ -113,6 +117,8 @@
     <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"صفحه کلید ایتالیایی"</string>
     <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"صفحه کلید نروژی"</string>
     <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"صفحه کلید هلندی"</string>
+    <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"صفحه کلید لهستانی"</string>
+    <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"صفحه کلید پرتغالی"</string>
     <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"صفحه کلید روسی"</string>
     <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"صفحه کلید صربی"</string>
     <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"صفحه کلید سوئدی"</string>
diff --git a/java/res/values-fi/strings.xml b/java/res/values-fi/strings.xml
index f02e821..60cf7a1 100644
--- a/java/res/values-fi/strings.xml
+++ b/java/res/values-fi/strings.xml
@@ -30,6 +30,11 @@
     <string name="correction_category" msgid="2236750915056607613">"Tekstin korjaus"</string>
     <string name="ngram_category" msgid="5337109164339320257">"Aiempiin sanoihin perustuvat ehdotukset"</string>
     <string name="misc_category" msgid="6894192814868233453">"Muut vaihtoehdot"</string>
+    <string name="advanced_settings" msgid="362895144495591463">"Lisäasetukset"</string>
+    <string name="advanced_settings_summary" msgid="5193513161106637254">"Valinnat kokeneille käyttäjille"</string>
+    <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Näppäimen hylkäysviive"</string>
+    <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Ei viivettä"</string>
+    <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Oletus"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Automaattiset isot kirjaimet"</string>
     <string name="quick_fixes" msgid="5353213327680897927">"Pikakorjaukset"</string>
     <string name="quick_fixes_summary" msgid="3405028402510332373">"Korjaa yleiset kirjoitusvirheet"</string>
@@ -105,7 +110,6 @@
     <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Näppäimistö: englanti (UK)"</string>
     <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Näppäimistö: englanti (US)"</string>
     <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Näppäimistö: espanja"</string>
-    <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"Näppäimistö: espanja (US)"</string>
     <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Näppäimistö: ranska"</string>
     <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Näppäimistö: ranska (Kanada)"</string>
     <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Näppäimistö: ranska (Sveitsi)"</string>
@@ -113,6 +117,8 @@
     <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Näppäimistö: italia"</string>
     <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Näppäimistö: norja"</string>
     <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Näppäimistö: hollanti"</string>
+    <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Näppäimistö: puola"</string>
+    <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Näppäimistö: portugali"</string>
     <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Näppäimistö: venäjä"</string>
     <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Näppäimistö: serbia"</string>
     <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Näppäimistö: ruotsi"</string>
diff --git a/java/res/values-fr/strings.xml b/java/res/values-fr/strings.xml
index 276aed2..67d2f50 100644
--- a/java/res/values-fr/strings.xml
+++ b/java/res/values-fr/strings.xml
@@ -30,6 +30,11 @@
     <string name="correction_category" msgid="2236750915056607613">"Correction du texte"</string>
     <string name="ngram_category" msgid="5337109164339320257">"Suggestions basées sur les mots précédents"</string>
     <string name="misc_category" msgid="6894192814868233453">"Autres options"</string>
+    <string name="advanced_settings" msgid="362895144495591463">"Paramètres avancés"</string>
+    <string name="advanced_settings_summary" msgid="5193513161106637254">"Options destinées aux utilisateurs expérimentés"</string>
+    <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Délai masq. touche pop-up"</string>
+    <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Aucun délai"</string>
+    <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Par défaut"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Majuscules auto"</string>
     <string name="quick_fixes" msgid="5353213327680897927">"Corrections rapides"</string>
     <string name="quick_fixes_summary" msgid="3405028402510332373">"Corrige les fautes de frappe courantes"</string>
@@ -38,7 +43,7 @@
     <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Toujours afficher"</string>
     <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Afficher en mode Portrait"</string>
     <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Toujours masquer"</string>
-    <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Sélecteur langue barre d\'espace"</string>
+    <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Barre d\'espace pour changer langue"</string>
     <string name="prefs_settings_key" msgid="4623341240804046498">"Afficher touche param."</string>
     <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automatique"</string>
     <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Toujours afficher"</string>
@@ -105,7 +110,6 @@
     <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Clavier anglais (Royaume-Uni)"</string>
     <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Clavier anglais (États-Unis)"</string>
     <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Clavier espagnol"</string>
-    <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"Clavier espagnol (États-Unis)"</string>
     <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Clavier français"</string>
     <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Clavier français (Canada)"</string>
     <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Clavier français (Suisse)"</string>
@@ -113,6 +117,8 @@
     <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Clavier italien"</string>
     <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Clavier norvégien"</string>
     <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Clavier néerlandais"</string>
+    <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Clavier polonais"</string>
+    <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Clavier portugais"</string>
     <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Clavier russe"</string>
     <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Clavier serbe"</string>
     <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Clavier suédois"</string>
diff --git a/java/res/values-hr/strings.xml b/java/res/values-hr/strings.xml
index 6117821..e1e83c5 100644
--- a/java/res/values-hr/strings.xml
+++ b/java/res/values-hr/strings.xml
@@ -30,6 +30,11 @@
     <string name="correction_category" msgid="2236750915056607613">"Ispravak teksta"</string>
     <string name="ngram_category" msgid="5337109164339320257">"Prijedlozi na temelju prethodnih riječi"</string>
     <string name="misc_category" msgid="6894192814868233453">"Ostale opcije"</string>
+    <string name="advanced_settings" msgid="362895144495591463">"Napredne postavke"</string>
+    <string name="advanced_settings_summary" msgid="5193513161106637254">"Opcije za stručne korisnike"</string>
+    <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Bez odgode klj. skočnih"</string>
+    <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Bez odgode"</string>
+    <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Zadano"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Automatsko pisanje velikih slova"</string>
     <string name="quick_fixes" msgid="5353213327680897927">"Brzi popravci"</string>
     <string name="quick_fixes_summary" msgid="3405028402510332373">"Ispravlja uobičajene pogreške u pisanju"</string>
@@ -38,7 +43,7 @@
     <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Uvijek prikaži"</string>
     <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Prikaži u portretnom načinu"</string>
     <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Uvijek sakrij"</string>
-    <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Koristite razmaknicu za prebacivanje jezika"</string>
+    <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Upotrijebite razmaknicu za prebacivanje jezika"</string>
     <string name="prefs_settings_key" msgid="4623341240804046498">"Prikaži tipku postavki"</string>
     <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automatski"</string>
     <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Uvijek prikaži"</string>
@@ -51,7 +56,7 @@
     <string name="bigram_suggestion" msgid="2636414079905220518">"Bigram prijedlozi"</string>
     <string name="bigram_suggestion_summary" msgid="4383845146070101531">"Upotrijebi prethodnu riječ radi poboljšanja prijedloga"</string>
     <string name="bigram_prediction" msgid="8914273444762259739">"Bigram predviđanje"</string>
-    <string name="bigram_prediction_summary" msgid="1747261921174300098">"Koristite prethodnu riječ i za predviđanje"</string>
+    <string name="bigram_prediction_summary" msgid="1747261921174300098">"Upotrijebite prethodnu riječ i za predviđanje"</string>
     <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Spremljeno"</string>
     <string name="label_go_key" msgid="1635148082137219148">"Idi"</string>
     <string name="label_next_key" msgid="362972844525672568">"Dalje"</string>
@@ -105,7 +110,6 @@
     <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Engleska (UK) tipkovnica"</string>
     <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Engleska (SAD) tipkovnica"</string>
     <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Španjolska tipkovnica"</string>
-    <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"Tipkovnica za španjolski (SAD)"</string>
     <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Francuska tipkovnica"</string>
     <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Francuska (Kanada) tipkovnica"</string>
     <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Francuska (Švicarska) tipkovnica"</string>
@@ -113,6 +117,8 @@
     <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Talijanska tipkovnica"</string>
     <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Norveška tipkovnica"</string>
     <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Nizozemska tipkovnica"</string>
+    <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Poljska tipkovnica"</string>
+    <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Portugalska tipkovnica"</string>
     <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Ruska tipkovnica"</string>
     <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Srpska tipkovnica"</string>
     <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Švedska tipkovnica"</string>
diff --git a/java/res/values-hu/strings.xml b/java/res/values-hu/strings.xml
index 81255d7..5cbc571 100644
--- a/java/res/values-hu/strings.xml
+++ b/java/res/values-hu/strings.xml
@@ -30,6 +30,11 @@
     <string name="correction_category" msgid="2236750915056607613">"Szövegjavítás"</string>
     <string name="ngram_category" msgid="5337109164339320257">"Javaslatok korábbi szavak alapján"</string>
     <string name="misc_category" msgid="6894192814868233453">"Egyéb beállítások"</string>
+    <string name="advanced_settings" msgid="362895144495591463">"Speciális beállítások"</string>
+    <string name="advanced_settings_summary" msgid="5193513161106637254">"Beállítások gyakorlott felhasználóknak"</string>
+    <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Gombeltüntetés késése"</string>
+    <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Nincs késés"</string>
+    <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Alapbeállítás"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Automatikusan nagy kezdőbetű"</string>
     <string name="quick_fixes" msgid="5353213327680897927">"Gyorsjavítások"</string>
     <string name="quick_fixes_summary" msgid="3405028402510332373">"Kijavítja a gyakori gépelési hibákat"</string>
@@ -105,7 +110,6 @@
     <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Angol (UK) billentyűzet"</string>
     <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Angol (US) billentyűzet"</string>
     <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Spanyol billentyűzet"</string>
-    <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"Spanyol (US) billentyűzet"</string>
     <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Francia billentyűzet"</string>
     <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Francia (kanadai) billentyűzet"</string>
     <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Francia (svájci) billentyűzet"</string>
@@ -113,6 +117,8 @@
     <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Olasz billentyűzet"</string>
     <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Norvég billentyűzet"</string>
     <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Holland billentyűzet"</string>
+    <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Lengyel billentyűzet"</string>
+    <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Portugál billentyűzet"</string>
     <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Orosz billentyűzet"</string>
     <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Szerb billentyűzet"</string>
     <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Svéd billentyűzet"</string>
diff --git a/java/res/values-in/strings.xml b/java/res/values-in/strings.xml
index 32ef38d..79eaf12 100644
--- a/java/res/values-in/strings.xml
+++ b/java/res/values-in/strings.xml
@@ -30,6 +30,11 @@
     <string name="correction_category" msgid="2236750915056607613">"Koreksi teks"</string>
     <string name="ngram_category" msgid="5337109164339320257">"Saran berdasarkan kata sebelumnya"</string>
     <string name="misc_category" msgid="6894192814868233453">"Opsi lain"</string>
+    <string name="advanced_settings" msgid="362895144495591463">"Setelan lanjutan"</string>
+    <string name="advanced_settings_summary" msgid="5193513161106637254">"Pilihan untuk pengguna ahli"</string>
+    <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Tundaan singkir munculan kunci"</string>
+    <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Tanpa penundaan"</string>
+    <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Bawaan"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Kapitalisasi otomatis"</string>
     <string name="quick_fixes" msgid="5353213327680897927">"Perbaikan cepat"</string>
     <string name="quick_fixes_summary" msgid="3405028402510332373">"Memperbaiki kesalahan ketik umum"</string>
@@ -105,7 +110,6 @@
     <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Keyboard Inggris (Britania Raya)"</string>
     <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Keyboard Inggris (AS)"</string>
     <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Keyboard Spanyol"</string>
-    <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"Keyboard Spanyol (AS)"</string>
     <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Keyboard Prancis"</string>
     <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Keyboard Prancis (Kanada)"</string>
     <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Keyboard Prancis (Swiss)"</string>
@@ -113,6 +117,8 @@
     <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Keyboard Italia"</string>
     <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Keyboard Norwegia"</string>
     <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Keyboard Belanda"</string>
+    <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Keyboard bahasa Polski"</string>
+    <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Keyboard Portugis"</string>
     <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Keyboard Rusia"</string>
     <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Keyboard Serbia"</string>
     <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Keyboard Swedia"</string>
diff --git a/java/res/values-it/strings.xml b/java/res/values-it/strings.xml
index 3a896fc..054133c 100644
--- a/java/res/values-it/strings.xml
+++ b/java/res/values-it/strings.xml
@@ -30,6 +30,11 @@
     <string name="correction_category" msgid="2236750915056607613">"Correzione testo"</string>
     <string name="ngram_category" msgid="5337109164339320257">"Suggerimenti in base alle parole precedenti"</string>
     <string name="misc_category" msgid="6894192814868233453">"Altre opzioni"</string>
+    <string name="advanced_settings" msgid="362895144495591463">"Impostazioni avanzate"</string>
+    <string name="advanced_settings_summary" msgid="5193513161106637254">"Opzioni per utenti esperti"</string>
+    <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Ritardo eliminaz. popup tasto"</string>
+    <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Nessun ritardo"</string>
+    <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Predefinito"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Maiuscole automatiche"</string>
     <string name="quick_fixes" msgid="5353213327680897927">"Correzioni veloci"</string>
     <string name="quick_fixes_summary" msgid="3405028402510332373">"Corregge gli errori di digitazione più comuni"</string>
@@ -105,7 +110,6 @@
     <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Tastiera inglese (Regno Unito)"</string>
     <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Tastiera inglese (Stati Uniti)"</string>
     <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Tastiera spagnola"</string>
-    <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"Tastiera spagnola (Stati Uniti)"</string>
     <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Tastiera francese"</string>
     <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Tastiera francese (Canada)"</string>
     <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Tastiera francese (Svizzera)"</string>
@@ -113,6 +117,8 @@
     <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Tastiera italiana"</string>
     <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Tastiera norvegese"</string>
     <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Tastiera olandese"</string>
+    <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Tastiera polacca"</string>
+    <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Tastiera portoghese"</string>
     <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Tastiera russa"</string>
     <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Tastiera serba"</string>
     <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Tastiera svedese"</string>
diff --git a/java/res/values-iw/strings.xml b/java/res/values-iw/strings.xml
index 0b26ed9..e28434f 100644
--- a/java/res/values-iw/strings.xml
+++ b/java/res/values-iw/strings.xml
@@ -30,6 +30,11 @@
     <string name="correction_category" msgid="2236750915056607613">"תיקון טקסט"</string>
     <string name="ngram_category" msgid="5337109164339320257">"הצעות המבוססות על מילים קודמות"</string>
     <string name="misc_category" msgid="6894192814868233453">"אפשרויות אחרות"</string>
+    <string name="advanced_settings" msgid="362895144495591463">"הגדרות מתקדמות"</string>
+    <string name="advanced_settings_summary" msgid="5193513161106637254">"אפשרויות עבור משתמשים מתקדמים"</string>
+    <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"עיכוב דחייה של מוקפץ ראשי"</string>
+    <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"ללא עיכוב"</string>
+    <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"ברירת מחדל"</string>
     <string name="auto_cap" msgid="1719746674854628252">"הפיכה אוטומטית של אותיות לרישיות"</string>
     <string name="quick_fixes" msgid="5353213327680897927">"תיקונים מהירים"</string>
     <string name="quick_fixes_summary" msgid="3405028402510332373">"מתקן שגיאות הקלדה נפוצות"</string>
@@ -105,7 +110,6 @@
     <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"מקלדת אנגלית (בריטניה)"</string>
     <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"מקלדת אנגלית (ארה\"ב)"</string>
     <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"מקלדת ספרדית"</string>
-    <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"מקלדת ספרדית (ארה\"ב)"</string>
     <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"מקלדת צרפתית"</string>
     <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"מקלדת צרפתית (קנדה)"</string>
     <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"מקלדת צרפתית (שוויץ)"</string>
@@ -113,6 +117,8 @@
     <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"מקלדת איטלקית"</string>
     <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"מקלדת נורווגית"</string>
     <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"מקלדת הולנדית"</string>
+    <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"מקלדת פולנית"</string>
+    <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"מקלדת פורטוגזית"</string>
     <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"מקלדת רוסית"</string>
     <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"מקלדת סרבית"</string>
     <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"מקלדת שוודית"</string>
diff --git a/java/res/values-ja/strings.xml b/java/res/values-ja/strings.xml
index 402c356..90e3ee7 100644
--- a/java/res/values-ja/strings.xml
+++ b/java/res/values-ja/strings.xml
@@ -30,6 +30,11 @@
     <string name="correction_category" msgid="2236750915056607613">"テキストの修正"</string>
     <string name="ngram_category" msgid="5337109164339320257">"前の語句に基づいた入力候補表示"</string>
     <string name="misc_category" msgid="6894192814868233453">"他のオプション"</string>
+    <string name="advanced_settings" msgid="362895144495591463">"詳細設定"</string>
+    <string name="advanced_settings_summary" msgid="5193513161106637254">"上級ユーザー向けオプション"</string>
+    <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"キーのポップアップ時間"</string>
+    <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"すぐに消去"</string>
+    <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"デフォルト"</string>
     <string name="auto_cap" msgid="1719746674854628252">"自動大文字変換"</string>
     <string name="quick_fixes" msgid="5353213327680897927">"クイックフィックス"</string>
     <string name="quick_fixes_summary" msgid="3405028402510332373">"よくある誤字・脱字を修正します"</string>
@@ -105,7 +110,6 @@
     <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"英語(英国)のキーボード"</string>
     <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"英語(米国)のキーボード"</string>
     <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"スペイン語のキーボード"</string>
-    <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"スペイン語(米国)のキーボード"</string>
     <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"フランス語のキーボード"</string>
     <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"フランス語(カナダ)のキーボード"</string>
     <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"フランス語(スイス)のキーボード"</string>
@@ -113,6 +117,8 @@
     <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"イタリア語のキーボード"</string>
     <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"ノルウェー語のキーボード"</string>
     <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"オランダ語のキーボード"</string>
+    <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"ポーランド語のキーボード"</string>
+    <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"ポルトガル語のキーボード"</string>
     <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"ロシア語のキーボード"</string>
     <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"セルビア語のキーボード"</string>
     <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"スウェーデン語のキーボード"</string>
diff --git a/java/res/values-ko/strings.xml b/java/res/values-ko/strings.xml
index ca2f570..3660d0a 100644
--- a/java/res/values-ko/strings.xml
+++ b/java/res/values-ko/strings.xml
@@ -30,6 +30,11 @@
     <string name="correction_category" msgid="2236750915056607613">"텍스트 수정"</string>
     <string name="ngram_category" msgid="5337109164339320257">"이전 단어에 기반한 추천"</string>
     <string name="misc_category" msgid="6894192814868233453">"기타 옵션"</string>
+    <string name="advanced_settings" msgid="362895144495591463">"고급 설정"</string>
+    <string name="advanced_settings_summary" msgid="5193513161106637254">"전문 사용자용 옵션"</string>
+    <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"키 팝업 해제 지연"</string>
+    <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"지연 없음"</string>
+    <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"기본값"</string>
     <string name="auto_cap" msgid="1719746674854628252">"자동 대문자화"</string>
     <string name="quick_fixes" msgid="5353213327680897927">"빠른 수정"</string>
     <string name="quick_fixes_summary" msgid="3405028402510332373">"자주 발생하는 오타를 수정합니다."</string>
@@ -105,7 +110,6 @@
     <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"영어(영국) 키보드"</string>
     <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"영어(미국) 키보드"</string>
     <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"스페인어 키보드"</string>
-    <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"스페인어(미국) 키보드"</string>
     <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"프랑스어 키보드"</string>
     <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"프랑스어(캐나다) 키보드"</string>
     <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"프랑스어(스위스) 키보드"</string>
@@ -113,6 +117,8 @@
     <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"이탈리아어 키보드"</string>
     <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"노르웨이어 키보드"</string>
     <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"네덜란드어 키보드"</string>
+    <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"폴란드어 키보드"</string>
+    <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"포르투갈어 키보드"</string>
     <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"러시아어 키보드"</string>
     <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"세르비아어 키보드"</string>
     <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"스웨덴어 키보드"</string>
diff --git a/java/res/values-land/dimens.xml b/java/res/values-land/dimens.xml
index c46a517..6b52ad4 100644
--- a/java/res/values-land/dimens.xml
+++ b/java/res/values-land/dimens.xml
@@ -21,6 +21,7 @@
 <resources>
     <!-- keyboardHeight = key_height*4 + key_bottom_gap*3, key_height=0.260in -->
     <dimen name="keyboardHeight">1.100in</dimen>
+    <fraction name="minKeyboardHeight">45%p</fraction>
     <!-- key_height + key_bottom_gap = popup_key_height -->
 <!--    <dimen name="key_height">0.260in</dimen>-->
     <dimen name="key_bottom_gap">0.020in</dimen>
@@ -28,9 +29,12 @@
     <dimen name="keyboard_top_padding">0.0in</dimen>
     <dimen name="keyboard_bottom_padding">0.0in</dimen>
     <dimen name="keyboard_horizontal_edges_padding">0.0in</dimen>
+    <fraction name="key_letter_ratio">55%</fraction>
+    <fraction name="key_label_text_ratio">35%</fraction>
+    <dimen name="key_preview_offset">0.08in</dimen>
+    <fraction name="key_preview_text_ratio">90%</fraction>
     <dimen name="candidate_strip_height">38dip</dimen>
     <dimen name="candidate_strip_fading_edge_length">63dip</dimen>
-    <dimen name="spacebar_vertical_correction">2dip</dimen>
     <!-- Amount of allowance for selecting keys in a mini popup keyboard by sliding finger. -->
     <!-- popup_key_height x 1.2 -->
     <dimen name="mini_keyboard_slide_allowance">0.336in</dimen>
diff --git a/java/res/values-lt/strings.xml b/java/res/values-lt/strings.xml
index fbe50e0..631c875 100644
--- a/java/res/values-lt/strings.xml
+++ b/java/res/values-lt/strings.xml
@@ -30,6 +30,11 @@
     <string name="correction_category" msgid="2236750915056607613">"Teksto taisymas"</string>
     <string name="ngram_category" msgid="5337109164339320257">"Pasiūlymai pagal ankstesnius žodžius"</string>
     <string name="misc_category" msgid="6894192814868233453">"Kitos parinktys"</string>
+    <string name="advanced_settings" msgid="362895144495591463">"Išplėstiniai nustatymai"</string>
+    <string name="advanced_settings_summary" msgid="5193513161106637254">"Parinktys ekspertams"</string>
+    <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Pagr. išš. l. atsis. d."</string>
+    <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Be delsos"</string>
+    <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Numatytasis"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Automatinis didžiųjų raidžių rašymas"</string>
     <string name="quick_fixes" msgid="5353213327680897927">"Greiti pataisymai"</string>
     <string name="quick_fixes_summary" msgid="3405028402510332373">"Taiso dažnai padarytas rašybos klaidas"</string>
@@ -105,7 +110,6 @@
     <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Angliška (JK) klaviatūra"</string>
     <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Angliška (JAV) klaviatūra"</string>
     <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Ispaniška klaviatūra"</string>
-    <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"Ispaniška (JAV) klaviatūra"</string>
     <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Prancūziška klaviatūra"</string>
     <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Prancūziška (Kanada) klaviatūra"</string>
     <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Prancūziška (Šveicarija) klaviatūra"</string>
@@ -113,6 +117,8 @@
     <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Itališka klaviatūra"</string>
     <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Norvegiška klaviatūra"</string>
     <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Olandiška klaviatūra"</string>
+    <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Lenkiška klaviatūra"</string>
+    <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Portugališka klaviatūra"</string>
     <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Rusiška klaviatūra"</string>
     <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Serbiška klaviatūra"</string>
     <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Švediška klaviatūra"</string>
diff --git a/java/res/values-lv/strings.xml b/java/res/values-lv/strings.xml
index 84bee53..101afbe 100644
--- a/java/res/values-lv/strings.xml
+++ b/java/res/values-lv/strings.xml
@@ -28,8 +28,13 @@
     <string name="popup_on_keypress" msgid="123894815723512944">"Nospiežot taustiņu, parādīt uznirstošo izvēlni"</string>
     <string name="general_category" msgid="1859088467017573195">"Vispārīgi"</string>
     <string name="correction_category" msgid="2236750915056607613">"Teksta korekcija"</string>
-    <string name="ngram_category" msgid="5337109164339320257">"Ieteikumi, pamatojoties uz iepriekšējiem vārdiem"</string>
+    <string name="ngram_category" msgid="5337109164339320257">"Ieteikumi, kuru pamatā ir iepriekšējie vārdi"</string>
     <string name="misc_category" msgid="6894192814868233453">"Citas opcijas"</string>
+    <string name="advanced_settings" msgid="362895144495591463">"Papildu iestatījumi"</string>
+    <string name="advanced_settings_summary" msgid="5193513161106637254">"Opcijas speciālistiem"</string>
+    <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Taust. uzn. loga noraid. aizk."</string>
+    <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Bez aizkaves"</string>
+    <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Noklusējums"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Automātiska lielo burtu lietošana"</string>
     <string name="quick_fixes" msgid="5353213327680897927">"Ātrie labojumi"</string>
     <string name="quick_fixes_summary" msgid="3405028402510332373">"Nodrošina izplatītu drukas kļūdu labošanu."</string>
@@ -38,7 +43,7 @@
     <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Vienmēr rādīt"</string>
     <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Rādīt portreta režīmā"</string>
     <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Vienmēr slēpt"</string>
-    <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Izmantot atstarpēšanas taustiņu, lai pārslēgtu valodu"</string>
+    <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Izmantot valodu pārslēgšanai atstarpēšanas taustiņu"</string>
     <string name="prefs_settings_key" msgid="4623341240804046498">"Rādīt iestatījumu taustiņu"</string>
     <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automātiski"</string>
     <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Vienmēr rādīt"</string>
@@ -105,7 +110,6 @@
     <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Angļu (Lielbritānija) tastatūra"</string>
     <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Angļu (ASV) tastatūra"</string>
     <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Spāņu tastatūra"</string>
-    <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"Spāņu (ASV) tastatūra"</string>
     <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Franču tastatūra"</string>
     <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Franču (Kanāda) tastatūra"</string>
     <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Franču (Šveices) tastatūra"</string>
@@ -113,6 +117,8 @@
     <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Itāļu tastatūra"</string>
     <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Norvēģu tastatūra"</string>
     <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Holandiešu tastatūra"</string>
+    <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Poļu valodas tastatūra"</string>
+    <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Portugāļu valodas tastatūra"</string>
     <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Krievu tastatūra"</string>
     <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Serbu tastatūra"</string>
     <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Zviedru tastatūra"</string>
diff --git a/java/res/values-ms/strings.xml b/java/res/values-ms/strings.xml
new file mode 100644
index 0000000..4fc52e5
--- /dev/null
+++ b/java/res/values-ms/strings.xml
@@ -0,0 +1,248 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/*
+**
+** Copyright 2008, 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:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="english_ime_name" msgid="7252517407088836577">"Papan kekunci Android"</string>
+    <string name="english_ime_settings" msgid="6661589557206947774">"Tetapan papan kekunci Android"</string>
+    <!-- no translation found for english_ime_input_options (3909945612939668554) -->
+    <skip />
+    <string name="vibrate_on_keypress" msgid="5258079494276955460">"Getar pada tekanan kekunci"</string>
+    <string name="sound_on_keypress" msgid="6093592297198243644">"Bunyi pada tekanan kekunci"</string>
+    <!-- no translation found for popup_on_keypress (123894815723512944) -->
+    <skip />
+    <!-- no translation found for general_category (1859088467017573195) -->
+    <skip />
+    <!-- no translation found for correction_category (2236750915056607613) -->
+    <skip />
+    <!-- no translation found for ngram_category (5337109164339320257) -->
+    <skip />
+    <!-- no translation found for misc_category (6894192814868233453) -->
+    <skip />
+    <!-- no translation found for advanced_settings (362895144495591463) -->
+    <skip />
+    <!-- no translation found for advanced_settings_summary (5193513161106637254) -->
+    <skip />
+    <!-- no translation found for key_preview_popup_dismiss_delay (6213164897443068248) -->
+    <skip />
+    <!-- no translation found for key_preview_popup_dismiss_no_delay (2096123151571458064) -->
+    <skip />
+    <!-- no translation found for key_preview_popup_dismiss_default_delay (2166964333903906734) -->
+    <skip />
+    <string name="auto_cap" msgid="1719746674854628252">"Huruf besar auto"</string>
+    <string name="quick_fixes" msgid="5353213327680897927">"Pembaikan pantas"</string>
+    <string name="quick_fixes_summary" msgid="3405028402510332373">"Membetulkan kesalahan menaip yang biasa"</string>
+    <!-- no translation found for prefs_show_suggestions (8026799663445531637) -->
+    <skip />
+    <!-- no translation found for prefs_show_suggestions_summary (1583132279498502825) -->
+    <skip />
+    <!-- no translation found for prefs_suggestion_visibility_show_name (3219916594067551303) -->
+    <skip />
+    <!-- no translation found for prefs_suggestion_visibility_show_only_portrait_name (3551821800439659812) -->
+    <skip />
+    <!-- no translation found for prefs_suggestion_visibility_hide_name (6309143926422234673) -->
+    <skip />
+    <!-- no translation found for prefs_use_spacebar_language_switch (8828538114550634449) -->
+    <skip />
+    <!-- no translation found for prefs_settings_key (4623341240804046498) -->
+    <skip />
+    <!-- no translation found for settings_key_mode_auto_name (2993460277873684680) -->
+    <skip />
+    <!-- no translation found for settings_key_mode_always_show_name (3047567041784760575) -->
+    <skip />
+    <!-- no translation found for settings_key_mode_always_hide_name (7833948046716923994) -->
+    <skip />
+    <!-- outdated translation 7911639788808958255 -->     <string name="auto_correction" msgid="4979925752001319458">"Cadangan perkataan"</string>
+    <!-- outdated translation 6881047311475758267 -->     <string name="auto_correction_summary" msgid="5625751551134658006">"Membetulkan perkataan sebelumnya secara automatik"</string>
+    <!-- no translation found for auto_correction_threshold_mode_off (8470882665417944026) -->
+    <skip />
+    <!-- no translation found for auto_correction_threshold_mode_modest (8788366690620799097) -->
+    <skip />
+    <!-- no translation found for auto_correction_threshold_mode_aggeressive (3524029103734923819) -->
+    <skip />
+    <!-- no translation found for bigram_suggestion (2636414079905220518) -->
+    <skip />
+    <!-- no translation found for bigram_suggestion_summary (4383845146070101531) -->
+    <skip />
+    <!-- no translation found for bigram_prediction (8914273444762259739) -->
+    <skip />
+    <!-- no translation found for bigram_prediction_summary (1747261921174300098) -->
+    <skip />
+    <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Disimpan"</string>
+    <string name="label_go_key" msgid="1635148082137219148">"Pergi"</string>
+    <string name="label_next_key" msgid="362972844525672568">"Seterusnya"</string>
+    <string name="label_done_key" msgid="2441578748772529288">"Selesai"</string>
+    <string name="label_send_key" msgid="2815056534433717444">"Hantar"</string>
+    <!-- no translation found for label_to_alpha_key (4793983863798817523) -->
+    <skip />
+    <!-- no translation found for label_more_key (3760239494604948502) -->
+    <skip />
+    <!-- no translation found for label_pause_key (181098308428035340) -->
+    <skip />
+    <!-- no translation found for label_wait_key (6402152600878093134) -->
+    <skip />
+    <!-- no translation found for voice_warning_title (4419354150908395008) -->
+    <skip />
+    <!-- no translation found for voice_warning_locale_not_supported (637923019716442333) -->
+    <skip />
+    <!-- no translation found for voice_warning_may_not_understand (5596289095878251072) -->
+    <skip />
+    <!-- no translation found for voice_warning_how_to_turn_off (3190378129944934856) -->
+    <skip />
+    <!-- no translation found for voice_hint_dialog_message (1420686286820661548) -->
+    <skip />
+    <!-- no translation found for voice_listening (467518160751321844) -->
+    <skip />
+    <!-- no translation found for voice_working (6666937792815731889) -->
+    <skip />
+    <string name="voice_initializing" msgid="661962047129906646"></string>
+    <!-- no translation found for voice_error (5140896300312186162) -->
+    <skip />
+    <!-- no translation found for voice_network_error (6649556447401862563) -->
+    <skip />
+    <!-- no translation found for voice_too_much_speech (5746973620134227376) -->
+    <skip />
+    <!-- no translation found for voice_audio_error (5072707727016414454) -->
+    <skip />
+    <!-- no translation found for voice_server_error (7807129913977261644) -->
+    <skip />
+    <!-- no translation found for voice_speech_timeout (8461817525075498795) -->
+    <skip />
+    <!-- no translation found for voice_no_match (4285117547030179174) -->
+    <skip />
+    <!-- no translation found for voice_not_installed (5552450909753842415) -->
+    <skip />
+    <!-- no translation found for voice_swipe_hint (6943546180310682021) -->
+    <skip />
+    <!-- no translation found for voice_punctuation_hint (1611389463237317754) -->
+    <skip />
+    <!-- no translation found for cancel (6830980399865683324) -->
+    <skip />
+    <!-- no translation found for ok (7898366843681727667) -->
+    <skip />
+    <!-- no translation found for voice_input (2466640768843347841) -->
+    <skip />
+    <!-- no translation found for voice_input_modes_main_keyboard (3360660341121083174) -->
+    <skip />
+    <!-- no translation found for voice_input_modes_symbols_keyboard (7203213240786084067) -->
+    <skip />
+    <!-- no translation found for voice_input_modes_off (3745699748218082014) -->
+    <skip />
+    <!-- no translation found for voice_input_modes_summary_main_keyboard (6586544292900314339) -->
+    <skip />
+    <!-- no translation found for voice_input_modes_summary_symbols_keyboard (5233725927281932391) -->
+    <skip />
+    <!-- no translation found for voice_input_modes_summary_off (63875609591897607) -->
+    <skip />
+    <!-- no translation found for selectInputMethod (315076553378705821) -->
+    <skip />
+    <!-- no translation found for language_selection_title (1651299598555326750) -->
+    <skip />
+    <!-- no translation found for language_selection_summary (187110938289512256) -->
+    <skip />
+    <!-- no translation found for hint_add_to_dictionary (9006292060636342317) -->
+    <skip />
+    <!-- no translation found for has_dictionary (6071847973466625007) -->
+    <skip />
+    <!-- no translation found for prefs_enable_log (6620424505072963557) -->
+    <skip />
+    <!-- no translation found for prefs_description_log (5827825607258246003) -->
+    <skip />
+    <!-- no translation found for prefs_enable_recorrection (4588408906649533582) -->
+    <skip />
+    <!-- no translation found for prefs_enable_recorrection_summary (5082041365862396329) -->
+    <skip />
+    <!-- no translation found for keyboard_layout (437433231038683666) -->
+    <skip />
+    <!-- no translation found for subtype_mode_cs_keyboard (1141718931112377586) -->
+    <skip />
+    <!-- no translation found for subtype_mode_ar_keyboard (2655338636329774995) -->
+    <skip />
+    <!-- no translation found for subtype_mode_da_keyboard (1243570804427922104) -->
+    <skip />
+    <!-- no translation found for subtype_mode_de_keyboard (1990979135959462145) -->
+    <skip />
+    <!-- no translation found for subtype_mode_en_GB_keyboard (7945856548410373708) -->
+    <skip />
+    <!-- no translation found for subtype_mode_en_US_keyboard (3708655163769735410) -->
+    <skip />
+    <!-- no translation found for subtype_mode_es_keyboard (1775125478866113148) -->
+    <skip />
+    <!-- no translation found for subtype_mode_fr_keyboard (8016515336759761014) -->
+    <skip />
+    <!-- no translation found for subtype_mode_fr_CA_keyboard (2628517247158376263) -->
+    <skip />
+    <!-- no translation found for subtype_mode_fr_CH_keyboard (6742806653181621228) -->
+    <skip />
+    <!-- no translation found for subtype_mode_iw_keyboard (1787536828253289950) -->
+    <skip />
+    <!-- no translation found for subtype_mode_it_keyboard (4934199655425394484) -->
+    <skip />
+    <!-- no translation found for subtype_mode_nb_keyboard (1175783216100212360) -->
+    <skip />
+    <!-- no translation found for subtype_mode_nl_keyboard (5090278083256037936) -->
+    <skip />
+    <!-- no translation found for subtype_mode_pl_keyboard (2225816414814396047) -->
+    <skip />
+    <!-- no translation found for subtype_mode_pt_keyboard (7503997804861754840) -->
+    <skip />
+    <!-- no translation found for subtype_mode_ru_keyboard (1383995915064277943) -->
+    <skip />
+    <!-- no translation found for subtype_mode_sr_keyboard (5019440799612208168) -->
+    <skip />
+    <!-- no translation found for subtype_mode_sv_keyboard (4933838139861753401) -->
+    <skip />
+    <!-- no translation found for subtype_mode_af_voice (7542487489657902699) -->
+    <skip />
+    <!-- no translation found for subtype_mode_cs_voice (1136386688120958641) -->
+    <skip />
+    <!-- no translation found for subtype_mode_de_voice (8378803143958089866) -->
+    <skip />
+    <!-- no translation found for subtype_mode_en_voice (6643420989651848728) -->
+    <skip />
+    <!-- no translation found for subtype_mode_es_voice (1323473601346507487) -->
+    <skip />
+    <!-- no translation found for subtype_mode_fr_voice (4675914209337824269) -->
+    <skip />
+    <!-- no translation found for subtype_mode_it_voice (5077373057157441323) -->
+    <skip />
+    <!-- no translation found for subtype_mode_ja_voice (6604859132669646367) -->
+    <skip />
+    <!-- no translation found for subtype_mode_ko_voice (4890391190762324561) -->
+    <skip />
+    <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) -->
+    <skip />
+    <!-- no translation found for subtype_mode_pl_voice (2076196021014840487) -->
+    <skip />
+    <!-- no translation found for subtype_mode_pt_voice (8036522712795994397) -->
+    <skip />
+    <!-- no translation found for subtype_mode_ru_voice (8034596947963787529) -->
+    <skip />
+    <!-- no translation found for subtype_mode_tr_voice (3402067436761140005) -->
+    <skip />
+    <!-- no translation found for subtype_mode_yue_voice (1576887891614624263) -->
+    <skip />
+    <!-- no translation found for subtype_mode_zh_voice (4360533229467271152) -->
+    <skip />
+    <!-- no translation found for subtype_mode_zu_voice (1146122571698884636) -->
+    <skip />
+    <!-- no translation found for prefs_usability_study_mode (6937813623647419810) -->
+    <skip />
+</resources>
diff --git a/java/res/values-nb/strings.xml b/java/res/values-nb/strings.xml
index e20c951..f4a8154 100644
--- a/java/res/values-nb/strings.xml
+++ b/java/res/values-nb/strings.xml
@@ -30,6 +30,11 @@
     <string name="correction_category" msgid="2236750915056607613">"Tekstkorrigering"</string>
     <string name="ngram_category" msgid="5337109164339320257">"Forslag basert på tidligere ord"</string>
     <string name="misc_category" msgid="6894192814868233453">"Andre alternativer"</string>
+    <string name="advanced_settings" msgid="362895144495591463">"Avanserte innstillinger"</string>
+    <string name="advanced_settings_summary" msgid="5193513161106637254">"Alternativer for ekspertbrukere"</string>
+    <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Tregt tastevindu"</string>
+    <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"U/ forsinkelse"</string>
+    <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Standard"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Stor forbokstav"</string>
     <string name="quick_fixes" msgid="5353213327680897927">"Autokorrektur"</string>
     <string name="quick_fixes_summary" msgid="3405028402510332373">"Retter vanlige stavefeil"</string>
@@ -105,7 +110,6 @@
     <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Engelsk tastatur (Storbritannia)"</string>
     <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Engelsk tastatur (USA)"</string>
     <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Spansk tastatur"</string>
-    <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"Spansk tastatur (USA)"</string>
     <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Fransk tastatur"</string>
     <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Fransk tastatur (Canada)"</string>
     <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Fransk tastatur (Sveits)"</string>
@@ -113,6 +117,8 @@
     <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Italiensk tastatur"</string>
     <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Norsk tastatur"</string>
     <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Nederlandsk tastatur"</string>
+    <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Polsk tastatur"</string>
+    <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Portugisisk tastatur"</string>
     <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Russisk tastatur"</string>
     <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Serbisk tastatur"</string>
     <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Svensk tastatur"</string>
diff --git a/java/res/values-nl/strings.xml b/java/res/values-nl/strings.xml
index 89b714b..ab56389 100644
--- a/java/res/values-nl/strings.xml
+++ b/java/res/values-nl/strings.xml
@@ -30,6 +30,11 @@
     <string name="correction_category" msgid="2236750915056607613">"Tekstcorrectie"</string>
     <string name="ngram_category" msgid="5337109164339320257">"Suggesties op basis van eerdere woorden"</string>
     <string name="misc_category" msgid="6894192814868233453">"Andere opties"</string>
+    <string name="advanced_settings" msgid="362895144495591463">"Geavanceerde instellingen"</string>
+    <string name="advanced_settings_summary" msgid="5193513161106637254">"Opties voor ervaren gebruikers"</string>
+    <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Afwijz.vertr. toetspop-up"</string>
+    <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Geen vertraging"</string>
+    <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Standaard"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Auto-hoofdlettergebruik"</string>
     <string name="quick_fixes" msgid="5353213327680897927">"Snelle oplossingen"</string>
     <string name="quick_fixes_summary" msgid="3405028402510332373">"Hiermee worden veelvoorkomende typefouten gecorrigeerd"</string>
@@ -105,7 +110,6 @@
     <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Engels toetsenbord (VK)"</string>
     <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Engels toetsenbord (VS)"</string>
     <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Spaans toetsenbord"</string>
-    <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"Spaans toetsenbord (VS)"</string>
     <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Frans toetsenbord"</string>
     <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Frans toetsenbord (Canada)"</string>
     <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Frans toetsenbord (Zwitserland)"</string>
@@ -113,6 +117,8 @@
     <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Italiaans toetsenbord"</string>
     <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Noors toetsenbord"</string>
     <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Nederlands toetsenbord"</string>
+    <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Pools toetsenbord"</string>
+    <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Portugees toetsenbord"</string>
     <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Russisch toetsenbord"</string>
     <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Servisch toetsenbord"</string>
     <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Zweeds toetsenbord"</string>
diff --git a/java/res/values-pl/strings.xml b/java/res/values-pl/strings.xml
index 65240d7..7b83029 100644
--- a/java/res/values-pl/strings.xml
+++ b/java/res/values-pl/strings.xml
@@ -30,6 +30,11 @@
     <string name="correction_category" msgid="2236750915056607613">"Poprawianie tekstu"</string>
     <string name="ngram_category" msgid="5337109164339320257">"Podpowiedzi na podstawie wcześniejszych słów"</string>
     <string name="misc_category" msgid="6894192814868233453">"Inne opcje"</string>
+    <string name="advanced_settings" msgid="362895144495591463">"Ustawienia zaawansowane"</string>
+    <string name="advanced_settings_summary" msgid="5193513161106637254">"Opcje dla zaawansowanych użytkowników"</string>
+    <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Opóźnienie wyłączenia wyskakującego okienka"</string>
+    <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Bez opóźnienia"</string>
+    <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Wartość domyślna"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Wstawiaj wielkie litery"</string>
     <string name="quick_fixes" msgid="5353213327680897927">"Szybkie poprawki"</string>
     <string name="quick_fixes_summary" msgid="3405028402510332373">"Poprawia częste błędy wpisywania"</string>
@@ -105,7 +110,6 @@
     <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Klawiatura angielska (UK)"</string>
     <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Klawiatura angielska (USA)"</string>
     <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Klawiatura hiszpańska"</string>
-    <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"Klawiatura hiszpańska (USA)"</string>
     <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Klawiatura francuska"</string>
     <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Klawiatura francuska (Kanada)"</string>
     <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Klawiatura francuska (Szwajcaria)"</string>
@@ -113,6 +117,8 @@
     <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Klawiatura włoska"</string>
     <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Klawiatura norweska"</string>
     <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Klawiatura holenderska"</string>
+    <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Klawiatura polska"</string>
+    <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Klawiatura portugalska"</string>
     <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Klawiatura rosyjska"</string>
     <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Klawiatura serbska"</string>
     <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Klawiatura szwedzka"</string>
diff --git a/java/res/values-pt-rPT/strings.xml b/java/res/values-pt-rPT/strings.xml
index b972ce0..491e9c1 100644
--- a/java/res/values-pt-rPT/strings.xml
+++ b/java/res/values-pt-rPT/strings.xml
@@ -30,6 +30,11 @@
     <string name="correction_category" msgid="2236750915056607613">"Correção de texto"</string>
     <string name="ngram_category" msgid="5337109164339320257">"Sugestões baseadas em palavras anteriores"</string>
     <string name="misc_category" msgid="6894192814868233453">"Outras opções"</string>
+    <string name="advanced_settings" msgid="362895144495591463">"Definições avançadas"</string>
+    <string name="advanced_settings_summary" msgid="5193513161106637254">"Opções para utilizadores experientes"</string>
+    <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Atraso p/ ignorar pop-up"</string>
+    <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Sem atraso"</string>
+    <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Predefinido"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Letras maiúsculas automáticas"</string>
     <string name="quick_fixes" msgid="5353213327680897927">"Correcções rápidas"</string>
     <string name="quick_fixes_summary" msgid="3405028402510332373">"Corrige os erros de escrita comuns"</string>
@@ -105,7 +110,6 @@
     <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Teclado inglês (Reino Unido)"</string>
     <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Teclado inglês (EUA)"</string>
     <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Teclado espanhol"</string>
-    <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"Teclado espanhol (EUA)"</string>
     <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Teclado francês"</string>
     <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Teclado francês (Canadá)"</string>
     <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Teclado francês (Suíça)"</string>
@@ -113,6 +117,8 @@
     <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Teclado italiano"</string>
     <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Teclado norueguês"</string>
     <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Teclado holandês"</string>
+    <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Teclado Polaco"</string>
+    <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Teclado Português"</string>
     <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Teclado russo"</string>
     <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Teclado sérvio"</string>
     <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Teclado sueco"</string>
diff --git a/java/res/values-pt/strings.xml b/java/res/values-pt/strings.xml
index a999dc6..c24e079 100644
--- a/java/res/values-pt/strings.xml
+++ b/java/res/values-pt/strings.xml
@@ -30,6 +30,11 @@
     <string name="correction_category" msgid="2236750915056607613">"Correção de texto"</string>
     <string name="ngram_category" msgid="5337109164339320257">"Sugestões baseadas em palavras anteriores"</string>
     <string name="misc_category" msgid="6894192814868233453">"Outras opções"</string>
+    <string name="advanced_settings" msgid="362895144495591463">"Configurações avançadas"</string>
+    <string name="advanced_settings_summary" msgid="5193513161106637254">"Opções para usuários experientes"</string>
+    <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Dispens. atraso chave princ."</string>
+    <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Sem atraso"</string>
+    <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Padrão"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Capitaliz. automática"</string>
     <string name="quick_fixes" msgid="5353213327680897927">"Reparos rápidos"</string>
     <string name="quick_fixes_summary" msgid="3405028402510332373">"Corrige erros comuns de digitação"</string>
@@ -105,7 +110,6 @@
     <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Teclado para inglês (Reino Unido)"</string>
     <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Teclado para inglês (EUA)"</string>
     <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Teclado para espanhol"</string>
-    <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"Teclado para espanhol"</string>
     <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Teclado para francês"</string>
     <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Teclado para francês (Canadá)"</string>
     <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Teclado para francês (Suíça)"</string>
@@ -113,6 +117,8 @@
     <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Teclado para italiano"</string>
     <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Teclado para norueguês"</string>
     <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Teclado para holandês"</string>
+    <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Teclado polonês"</string>
+    <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Teclado em português"</string>
     <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Teclado para russo"</string>
     <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Teclado para sérvio"</string>
     <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Teclado para sueco"</string>
diff --git a/java/res/values-rm/strings.xml b/java/res/values-rm/strings.xml
index b0c1bea..e424122 100644
--- a/java/res/values-rm/strings.xml
+++ b/java/res/values-rm/strings.xml
@@ -35,6 +35,16 @@
     <skip />
     <!-- no translation found for misc_category (6894192814868233453) -->
     <skip />
+    <!-- no translation found for advanced_settings (362895144495591463) -->
+    <skip />
+    <!-- no translation found for advanced_settings_summary (5193513161106637254) -->
+    <skip />
+    <!-- no translation found for key_preview_popup_dismiss_delay (6213164897443068248) -->
+    <skip />
+    <!-- no translation found for key_preview_popup_dismiss_no_delay (2096123151571458064) -->
+    <skip />
+    <!-- no translation found for key_preview_popup_dismiss_default_delay (2166964333903906734) -->
+    <skip />
     <string name="auto_cap" msgid="1719746674854628252">"Maiusclas automaticas"</string>
     <string name="quick_fixes" msgid="5353213327680897927">"Correcturas sveltas"</string>
     <string name="quick_fixes_summary" msgid="3405028402510332373">"Curregia sbagls da tippar currents"</string>
@@ -145,8 +155,6 @@
     <skip />
     <!-- no translation found for subtype_mode_es_keyboard (1775125478866113148) -->
     <skip />
-    <!-- no translation found for subtype_mode_es_US_keyboard (3702125193532262008) -->
-    <skip />
     <!-- no translation found for subtype_mode_fr_keyboard (8016515336759761014) -->
     <skip />
     <!-- no translation found for subtype_mode_fr_CA_keyboard (2628517247158376263) -->
@@ -161,6 +169,10 @@
     <skip />
     <!-- no translation found for subtype_mode_nl_keyboard (5090278083256037936) -->
     <skip />
+    <!-- no translation found for subtype_mode_pl_keyboard (2225816414814396047) -->
+    <skip />
+    <!-- no translation found for subtype_mode_pt_keyboard (7503997804861754840) -->
+    <skip />
     <!-- no translation found for subtype_mode_ru_keyboard (1383995915064277943) -->
     <skip />
     <!-- no translation found for subtype_mode_sr_keyboard (5019440799612208168) -->
diff --git a/java/res/values-ro/strings.xml b/java/res/values-ro/strings.xml
index 0fcefd1..7b11f91 100644
--- a/java/res/values-ro/strings.xml
+++ b/java/res/values-ro/strings.xml
@@ -30,6 +30,11 @@
     <string name="correction_category" msgid="2236750915056607613">"Corectare text"</string>
     <string name="ngram_category" msgid="5337109164339320257">"Sugestii bazate pe cuvinte anterioare"</string>
     <string name="misc_category" msgid="6894192814868233453">"Alte opţiuni"</string>
+    <string name="advanced_settings" msgid="362895144495591463">"Setări avansate"</string>
+    <string name="advanced_settings_summary" msgid="5193513161106637254">"Opţiuni pt. utiliz. experţi"</string>
+    <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Înt. înch. pop-up esenţ."</string>
+    <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Fără întârziere"</string>
+    <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Prestabilit"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Auto-capitalizare"</string>
     <string name="quick_fixes" msgid="5353213327680897927">"Remedieri rapide"</string>
     <string name="quick_fixes_summary" msgid="3405028402510332373">"Corectează greşelile introduse frecvent"</string>
@@ -38,7 +43,7 @@
     <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Afişaţi întotdeauna"</string>
     <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Afişaţi în modul Portret"</string>
     <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Ascundeţi întotdeauna"</string>
-    <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Sp. pt. comut. lb."</string>
+    <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Spacebar – selector limbă"</string>
     <string name="prefs_settings_key" msgid="4623341240804046498">"Afişaţi tasta setări"</string>
     <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automat"</string>
     <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Afişaţi întotdeauna"</string>
@@ -48,10 +53,10 @@
     <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Dezactivată"</string>
     <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Moderată"</string>
     <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Agresivă"</string>
-    <string name="bigram_suggestion" msgid="2636414079905220518">"Sugestii pentru cuvinte de două litere"</string>
+    <string name="bigram_suggestion" msgid="2636414079905220518">"Sugestii de tip bigram"</string>
     <string name="bigram_suggestion_summary" msgid="4383845146070101531">"Utilizaţi cuvântul anterior pentru a îmbunătăţi sugestia"</string>
-    <string name="bigram_prediction" msgid="8914273444762259739">"Sugestii pentru cuvinte de două litere"</string>
-    <string name="bigram_prediction_summary" msgid="1747261921174300098">"De asemenea, utilizaţi pentru sugestii cuvântul precedent"</string>
+    <string name="bigram_prediction" msgid="8914273444762259739">"Predicţii de tip bigram"</string>
+    <string name="bigram_prediction_summary" msgid="1747261921174300098">"Se utilizează şi cuvântul precedent pentru predicţii"</string>
     <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: salvat"</string>
     <string name="label_go_key" msgid="1635148082137219148">"OK"</string>
     <string name="label_next_key" msgid="362972844525672568">"Înainte"</string>
@@ -105,7 +110,6 @@
     <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Tastatură engleză (Marea Britanie)"</string>
     <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Tastatură engleză (S.U.A.)"</string>
     <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Tastatură spaniolă"</string>
-    <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"Tastatură spaniolă (S.U.A.)"</string>
     <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Tastatură franceză"</string>
     <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Tastatură franceză (Canada)"</string>
     <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Tastatură franceză (Elveţia)"</string>
@@ -113,6 +117,8 @@
     <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Tastatură italiană"</string>
     <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Tastatură norvegiană"</string>
     <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Tastatură olandeză"</string>
+    <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Tastatură poloneză"</string>
+    <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Tastatură portugheză"</string>
     <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Tastatură rusă"</string>
     <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Tastatură sârbă"</string>
     <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Tastatură suedeză"</string>
diff --git a/java/res/values-ru/strings.xml b/java/res/values-ru/strings.xml
index 2e8577e..f813413 100644
--- a/java/res/values-ru/strings.xml
+++ b/java/res/values-ru/strings.xml
@@ -30,6 +30,11 @@
     <string name="correction_category" msgid="2236750915056607613">"Исправление текста"</string>
     <string name="ngram_category" msgid="5337109164339320257">"Подсказки, основанные на предыдущих словах"</string>
     <string name="misc_category" msgid="6894192814868233453">"Другие варианты"</string>
+    <string name="advanced_settings" msgid="362895144495591463">"Расширенные настройки"</string>
+    <string name="advanced_settings_summary" msgid="5193513161106637254">"Для опытных пользователей"</string>
+    <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Задержка закрытия"</string>
+    <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Без задержки"</string>
+    <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"По умолчанию"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Заглавные автоматически"</string>
     <string name="quick_fixes" msgid="5353213327680897927">"Быстрое исправление"</string>
     <string name="quick_fixes_summary" msgid="3405028402510332373">"Исправлять распространенные опечатки"</string>
@@ -105,7 +110,6 @@
     <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Клавиатура: английская (Великобритания)"</string>
     <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Клавиатура: английская (США)"</string>
     <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Клавиатура: испанская"</string>
-    <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"Клавиатура: испанская (США)"</string>
     <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Клавиатура: французская"</string>
     <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Клавиатура: французская"</string>
     <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Клавиатура: французская (Швейцария)"</string>
@@ -113,6 +117,8 @@
     <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Клавиатура: итальянская"</string>
     <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Клавиатура: норвежская"</string>
     <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Клавиатура: голландская"</string>
+    <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Польская клавиатура"</string>
+    <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Португальская раскладка"</string>
     <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Клавиатура: русская"</string>
     <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Клавиатура: сербская"</string>
     <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Голос: шведский"</string>
diff --git a/java/res/values-sk/strings.xml b/java/res/values-sk/strings.xml
index eeefa82..911e1ec 100644
--- a/java/res/values-sk/strings.xml
+++ b/java/res/values-sk/strings.xml
@@ -30,6 +30,11 @@
     <string name="correction_category" msgid="2236750915056607613">"Oprava textu"</string>
     <string name="ngram_category" msgid="5337109164339320257">"Návrhy na základe predchádzajúcich slov"</string>
     <string name="misc_category" msgid="6894192814868233453">"Ďalšie možnosti"</string>
+    <string name="advanced_settings" msgid="362895144495591463">"Rozšírené nastavenia"</string>
+    <string name="advanced_settings_summary" msgid="5193513161106637254">"Možnosti pre skúsených používateľov"</string>
+    <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Onesk. zrušenia kľúč. kon. okna"</string>
+    <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Bez oneskorenia"</string>
+    <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Predvolená"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Veľké písmená automaticky"</string>
     <string name="quick_fixes" msgid="5353213327680897927">"Rýchle opravy"</string>
     <string name="quick_fixes_summary" msgid="3405028402510332373">"Opravuje najčastejšie chyby pri písaní"</string>
@@ -105,7 +110,6 @@
     <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"klávesnica – angličtina (br.)"</string>
     <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"klávesnica – angličtina (am.)"</string>
     <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"klávesnica – španielčina"</string>
-    <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"klávesnica – španielčina (am.)"</string>
     <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"klávesnica – francúzština"</string>
     <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"klávesnica – francúzština (Kanada)"</string>
     <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"klávesnica – francúzština (Švajč.)"</string>
@@ -113,6 +117,8 @@
     <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"klávesnica – taliančina"</string>
     <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"klávesnica – nórčina"</string>
     <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"klávesnica – holandčina"</string>
+    <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Poľská klávesnica"</string>
+    <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Portugalská klávesnica"</string>
     <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"klávesnica – ruština"</string>
     <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"hlas – srbčina"</string>
     <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"klávesnica – švédčina"</string>
diff --git a/java/res/values-sl/strings.xml b/java/res/values-sl/strings.xml
index 91f9036..f04f343 100644
--- a/java/res/values-sl/strings.xml
+++ b/java/res/values-sl/strings.xml
@@ -30,6 +30,11 @@
     <string name="correction_category" msgid="2236750915056607613">"Popravek besedila"</string>
     <string name="ngram_category" msgid="5337109164339320257">"Predlogi, ki temeljijo na prejšnjih besedah"</string>
     <string name="misc_category" msgid="6894192814868233453">"Druge možnosti"</string>
+    <string name="advanced_settings" msgid="362895144495591463">"Dodatne nastavitve"</string>
+    <string name="advanced_settings_summary" msgid="5193513161106637254">"Možnosti za izkušene uporabnike"</string>
+    <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Zakas. okna za zavrnitev"</string>
+    <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Brez zamude"</string>
+    <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Privzeto"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Samodejne velike začetnice"</string>
     <string name="quick_fixes" msgid="5353213327680897927">"Hitri popravki"</string>
     <string name="quick_fixes_summary" msgid="3405028402510332373">"Popravi pogoste tipkarske napake"</string>
@@ -105,7 +110,6 @@
     <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Tipkovnica za britansko angleščino"</string>
     <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Tipkovnica za ameriško angleščino"</string>
     <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Španska tipkovnica"</string>
-    <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"Tipkovnica za ameriško španščino"</string>
     <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Francoska tipkovnica"</string>
     <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Tipkovnica za kanadsko francoščino"</string>
     <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Tipkovnica za švicarsko francoščino"</string>
@@ -113,6 +117,8 @@
     <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Italijanska tipkovnica"</string>
     <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Norveška tipkovnica"</string>
     <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Nizozemska tipkovnica"</string>
+    <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Poljska tipkovnica"</string>
+    <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Portugalska tipkovnica"</string>
     <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Ruska tipkovnica"</string>
     <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Srbska tipkovnica"</string>
     <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Švedska tipkovnica"</string>
diff --git a/java/res/values-sr/strings.xml b/java/res/values-sr/strings.xml
index b20f1df..375f646 100644
--- a/java/res/values-sr/strings.xml
+++ b/java/res/values-sr/strings.xml
@@ -29,7 +29,12 @@
     <string name="general_category" msgid="1859088467017573195">"Опште"</string>
     <string name="correction_category" msgid="2236750915056607613">"Исправљање текста"</string>
     <string name="ngram_category" msgid="5337109164339320257">"Предлози на основу претходних речи"</string>
-    <string name="misc_category" msgid="6894192814868233453">"Друге опције:"</string>
+    <string name="misc_category" msgid="6894192814868233453">"Друге опције"</string>
+    <string name="advanced_settings" msgid="362895144495591463">"Напредна подешавања"</string>
+    <string name="advanced_settings_summary" msgid="5193513161106637254">"Опције за искусне кориснике"</string>
+    <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Одложи одбац. иск. прозора тастера"</string>
+    <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Без одлагања"</string>
+    <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Подразумевано"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Аутоматски унос великих слова"</string>
     <string name="quick_fixes" msgid="5353213327680897927">"Брзе исправке"</string>
     <string name="quick_fixes_summary" msgid="3405028402510332373">"Исправља честе грешке у куцању"</string>
@@ -105,7 +110,6 @@
     <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Језик тастатуре: енглески (УК)"</string>
     <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Језик тастатуре: енглески (САД)"</string>
     <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Језик тастатуре: шпански"</string>
-    <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"Језик тастатуре: шпански (САД)"</string>
     <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Језик тастатуре: француски"</string>
     <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Језик тастатуре: француски (Канада)"</string>
     <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Језик тастатуре: француски (Швајц.)"</string>
@@ -113,6 +117,8 @@
     <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Језик тастатуре: италијански"</string>
     <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Језик тастатуре: норвешки"</string>
     <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Језик тастатуре: холандски"</string>
+    <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Језик тастатуре: пољски"</string>
+    <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Језик тастатуре: португалски"</string>
     <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Језик тастатуре: руски"</string>
     <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Језик тастатуре: српски"</string>
     <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Језик тастатуре: шведски"</string>
diff --git a/java/res/values-sv/strings.xml b/java/res/values-sv/strings.xml
index 2d35fd8..d9e51a3 100644
--- a/java/res/values-sv/strings.xml
+++ b/java/res/values-sv/strings.xml
@@ -30,6 +30,11 @@
     <string name="correction_category" msgid="2236750915056607613">"Textkorrigering"</string>
     <string name="ngram_category" msgid="5337109164339320257">"Förslag baserade på tidigare ord"</string>
     <string name="misc_category" msgid="6894192814868233453">"Andra alternativ"</string>
+    <string name="advanced_settings" msgid="362895144495591463">"Avancerade inställningar"</string>
+    <string name="advanced_settings_summary" msgid="5193513161106637254">"Alternativ för expertanvändare"</string>
+    <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Ta bort popup-fördröjning"</string>
+    <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Fördröj inte"</string>
+    <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Standard"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Automatiska versaler"</string>
     <string name="quick_fixes" msgid="5353213327680897927">"Snabba lösningar"</string>
     <string name="quick_fixes_summary" msgid="3405028402510332373">"Åtgärdar automatiskt vanliga misstag"</string>
@@ -105,7 +110,6 @@
     <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Engelskt tangentbord (Storbrit.)"</string>
     <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Engelskt tangentbord (USA)"</string>
     <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Spanskt tangentbord"</string>
-    <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"Spanskt tangentbord (USA)"</string>
     <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Franskt tangentbord"</string>
     <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Franskt tangentbord (Kanada)"</string>
     <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Franskt tangentbord (Schweiz)"</string>
@@ -113,6 +117,8 @@
     <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Italienskt tangentbord"</string>
     <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Norskt tangentbord"</string>
     <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Holländskt tangentbord"</string>
+    <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Polskt tangentbord"</string>
+    <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Portugisiskt tangentbord"</string>
     <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Ryskt tangentbord"</string>
     <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Serbiskt tangentbord"</string>
     <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Svenskt tangentbord"</string>
diff --git a/java/res/values-sw/strings.xml b/java/res/values-sw/strings.xml
new file mode 100644
index 0000000..dd8f7fc
--- /dev/null
+++ b/java/res/values-sw/strings.xml
@@ -0,0 +1,209 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/*
+**
+** Copyright 2008, 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:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="english_ime_name" msgid="7252517407088836577">"Kibodi ya Android"</string>
+    <string name="english_ime_settings" msgid="6661589557206947774">"Mipangilio ya kibodi ya Android"</string>
+    <string name="english_ime_input_options" msgid="3909945612939668554">"Chaguo za uingizaji"</string>
+    <string name="vibrate_on_keypress" msgid="5258079494276955460">"Tetema unabofya kitufe"</string>
+    <string name="sound_on_keypress" msgid="6093592297198243644">"Toa sauti unapobofya kitufe"</string>
+    <string name="popup_on_keypress" msgid="123894815723512944">"Ibuka kitufe kinapobonyezwa"</string>
+    <!-- no translation found for general_category (1859088467017573195) -->
+    <skip />
+    <!-- no translation found for correction_category (2236750915056607613) -->
+    <skip />
+    <!-- no translation found for ngram_category (5337109164339320257) -->
+    <skip />
+    <!-- no translation found for misc_category (6894192814868233453) -->
+    <skip />
+    <!-- no translation found for advanced_settings (362895144495591463) -->
+    <skip />
+    <!-- no translation found for advanced_settings_summary (5193513161106637254) -->
+    <skip />
+    <!-- no translation found for key_preview_popup_dismiss_delay (6213164897443068248) -->
+    <skip />
+    <!-- no translation found for key_preview_popup_dismiss_no_delay (2096123151571458064) -->
+    <skip />
+    <!-- no translation found for key_preview_popup_dismiss_default_delay (2166964333903906734) -->
+    <skip />
+    <string name="auto_cap" msgid="1719746674854628252">"Uwekaji wa herufi kubwa kiotomatiki"</string>
+    <string name="quick_fixes" msgid="5353213327680897927">"Utatuzi wa haraka"</string>
+    <string name="quick_fixes_summary" msgid="3405028402510332373">"Husahihisha makosa ya kawaida yaliyoandikwa"</string>
+    <!-- no translation found for prefs_show_suggestions (8026799663445531637) -->
+    <skip />
+    <!-- no translation found for prefs_show_suggestions_summary (1583132279498502825) -->
+    <skip />
+    <!-- no translation found for prefs_suggestion_visibility_show_name (3219916594067551303) -->
+    <skip />
+    <!-- no translation found for prefs_suggestion_visibility_show_only_portrait_name (3551821800439659812) -->
+    <skip />
+    <!-- no translation found for prefs_suggestion_visibility_hide_name (6309143926422234673) -->
+    <skip />
+    <!-- no translation found for prefs_use_spacebar_language_switch (8828538114550634449) -->
+    <skip />
+    <string name="prefs_settings_key" msgid="4623341240804046498">"Onyesha kitufe cha mipangilio"</string>
+    <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Kiotomatiki"</string>
+    <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Onyesha kila wakati"</string>
+    <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">" Ficha kila mara"</string>
+    <!-- outdated translation 7911639788808958255 -->     <string name="auto_correction" msgid="4979925752001319458">"Mapendekezo ya neno"</string>
+    <!-- outdated translation 6881047311475758267 -->     <string name="auto_correction_summary" msgid="5625751551134658006">"Sahihisha neno lililotangulia kiotomatiki"</string>
+    <!-- no translation found for auto_correction_threshold_mode_off (8470882665417944026) -->
+    <skip />
+    <!-- no translation found for auto_correction_threshold_mode_modest (8788366690620799097) -->
+    <skip />
+    <!-- no translation found for auto_correction_threshold_mode_aggeressive (3524029103734923819) -->
+    <skip />
+    <!-- outdated translation 1323347224043514969 -->     <string name="bigram_suggestion" msgid="2636414079905220518">"Mapendekezo ya Bigramu"</string>
+    <string name="bigram_suggestion_summary" msgid="4383845146070101531">"Tumia neno la hapo awali ili kuboresha pendekezo"</string>
+    <!-- no translation found for bigram_prediction (8914273444762259739) -->
+    <skip />
+    <!-- no translation found for bigram_prediction_summary (1747261921174300098) -->
+    <skip />
+    <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Imehifadhiwa"</string>
+    <string name="label_go_key" msgid="1635148082137219148">"Nenda"</string>
+    <string name="label_next_key" msgid="362972844525672568">"Ifuatayo"</string>
+    <string name="label_done_key" msgid="2441578748772529288">"Kwisha"</string>
+    <string name="label_send_key" msgid="2815056534433717444">"Tuma"</string>
+    <!-- no translation found for label_to_alpha_key (4793983863798817523) -->
+    <skip />
+    <string name="label_more_key" msgid="3760239494604948502">"Zaidi"</string>
+    <!-- no translation found for label_pause_key (181098308428035340) -->
+    <skip />
+    <!-- no translation found for label_wait_key (6402152600878093134) -->
+    <skip />
+    <string name="voice_warning_title" msgid="4419354150908395008">"Uingizaji wa sauti"</string>
+    <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Uingizaji wa sauti hauhimiliwi kwa lugha yako kwa sasa, lakini inafanya kazi kwa Kiingereza."</string>
+    <!-- outdated translation 4611518823070986445 -->     <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Uingizaji wa sauti ni kipengele cha jaribio kinachotumia utambulisho wa mtandao wa matamshi kutoka Google."</string>
+    <!-- outdated translation 5652369578498701761 -->     <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Kuzima uingizaji wa sauti, nenda kwa mipangilio ya kibodi."</string>
+    <!-- outdated translation 6892342981545727994 -->     <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Ili kutumia uingizaji wa sauti, bonyeza kitufe cha kipaza sauti au telezesha kidole chako kwa kibodi ya skirini.."</string>
+    <string name="voice_listening" msgid="467518160751321844">"Ongea sasa"</string>
+    <string name="voice_working" msgid="6666937792815731889">"Inafanya kazi"</string>
+    <string name="voice_initializing" msgid="661962047129906646"></string>
+    <string name="voice_error" msgid="5140896300312186162">"Hitilafu. Tafadhali jaribu tena."</string>
+    <string name="voice_network_error" msgid="6649556447401862563">"Haiwezi kuunganisha"</string>
+    <string name="voice_too_much_speech" msgid="5746973620134227376">"Hitilafu, usemi ni zaidi."</string>
+    <string name="voice_audio_error" msgid="5072707727016414454">"Tatizo la sauti"</string>
+    <string name="voice_server_error" msgid="7807129913977261644">"Hitilafu ya Seva"</string>
+    <string name="voice_speech_timeout" msgid="8461817525075498795">"Hakuna matamshi yaliyosikizwa"</string>
+    <string name="voice_no_match" msgid="4285117547030179174">"Hakuna zinazolingana zilizopatikana."</string>
+    <string name="voice_not_installed" msgid="5552450909753842415">"Utafutaji wa sauti haujawekwa"</string>
+    <string name="voice_swipe_hint" msgid="6943546180310682021"><b>"Kidokezo:"</b>" Telezesha kidole kwenye kibodi ili utamke"</string>
+    <string name="voice_punctuation_hint" msgid="1611389463237317754"><b>"Kidokezo:"</b>" Wakati mwingine, jaribu kutamka uakifishaji kama vile \"kituo\", \"koma\", au \"kiulizio cha swali\"."</string>
+    <string name="cancel" msgid="6830980399865683324">"Ghairi"</string>
+    <string name="ok" msgid="7898366843681727667">"Sawa"</string>
+    <string name="voice_input" msgid="2466640768843347841">"Uingizaji wa sauti"</string>
+    <!-- no translation found for voice_input_modes_main_keyboard (3360660341121083174) -->
+    <skip />
+    <!-- no translation found for voice_input_modes_symbols_keyboard (7203213240786084067) -->
+    <skip />
+    <!-- no translation found for voice_input_modes_off (3745699748218082014) -->
+    <skip />
+    <!-- no translation found for voice_input_modes_summary_main_keyboard (6586544292900314339) -->
+    <skip />
+    <!-- no translation found for voice_input_modes_summary_symbols_keyboard (5233725927281932391) -->
+    <skip />
+    <!-- no translation found for voice_input_modes_summary_off (63875609591897607) -->
+    <skip />
+    <string name="selectInputMethod" msgid="315076553378705821">"Chagua mtindo wa uingizaji"</string>
+    <string name="language_selection_title" msgid="1651299598555326750">"Lugha za uingizaji"</string>
+    <string name="language_selection_summary" msgid="187110938289512256">"Telezesha kidole kwenye kitufe cha nafasi ili kubadilisha lugha"</string>
+    <string name="hint_add_to_dictionary" msgid="9006292060636342317">"← Gusa tena ili kuhifadhi"</string>
+    <string name="has_dictionary" msgid="6071847973466625007">"Kamusi inapatikana"</string>
+    <string name="prefs_enable_log" msgid="6620424505072963557">"Wezesha maoni ya watumiaji"</string>
+    <string name="prefs_description_log" msgid="5827825607258246003">"Saidia kuimarisha mbinu ya uingizaji wa kihariri, kwa kutuma takwimu za matumizi na ripoti za kuvurugika kwa Google kiotomatiki."</string>
+    <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Gusa ili kurekebisha maneno"</string>
+    <!-- outdated translation 1056068922330206170 -->     <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Gusa maneno yaliyoingizwa ili kuyarekebisha"</string>
+    <string name="keyboard_layout" msgid="437433231038683666">"Maandhari ya Kibodi"</string>
+    <!-- no translation found for subtype_mode_cs_keyboard (1141718931112377586) -->
+    <skip />
+    <!-- no translation found for subtype_mode_ar_keyboard (2655338636329774995) -->
+    <skip />
+    <!-- no translation found for subtype_mode_da_keyboard (1243570804427922104) -->
+    <skip />
+    <!-- no translation found for subtype_mode_de_keyboard (1990979135959462145) -->
+    <skip />
+    <!-- no translation found for subtype_mode_en_GB_keyboard (7945856548410373708) -->
+    <skip />
+    <!-- no translation found for subtype_mode_en_US_keyboard (3708655163769735410) -->
+    <skip />
+    <!-- no translation found for subtype_mode_es_keyboard (1775125478866113148) -->
+    <skip />
+    <!-- no translation found for subtype_mode_fr_keyboard (8016515336759761014) -->
+    <skip />
+    <!-- no translation found for subtype_mode_fr_CA_keyboard (2628517247158376263) -->
+    <skip />
+    <!-- no translation found for subtype_mode_fr_CH_keyboard (6742806653181621228) -->
+    <skip />
+    <!-- no translation found for subtype_mode_iw_keyboard (1787536828253289950) -->
+    <skip />
+    <!-- no translation found for subtype_mode_it_keyboard (4934199655425394484) -->
+    <skip />
+    <!-- no translation found for subtype_mode_nb_keyboard (1175783216100212360) -->
+    <skip />
+    <!-- no translation found for subtype_mode_nl_keyboard (5090278083256037936) -->
+    <skip />
+    <!-- no translation found for subtype_mode_pl_keyboard (2225816414814396047) -->
+    <skip />
+    <!-- no translation found for subtype_mode_pt_keyboard (7503997804861754840) -->
+    <skip />
+    <!-- no translation found for subtype_mode_ru_keyboard (1383995915064277943) -->
+    <skip />
+    <!-- no translation found for subtype_mode_sr_keyboard (5019440799612208168) -->
+    <skip />
+    <!-- no translation found for subtype_mode_sv_keyboard (4933838139861753401) -->
+    <skip />
+    <!-- no translation found for subtype_mode_af_voice (7542487489657902699) -->
+    <skip />
+    <!-- no translation found for subtype_mode_cs_voice (1136386688120958641) -->
+    <skip />
+    <!-- no translation found for subtype_mode_de_voice (8378803143958089866) -->
+    <skip />
+    <!-- no translation found for subtype_mode_en_voice (6643420989651848728) -->
+    <skip />
+    <!-- no translation found for subtype_mode_es_voice (1323473601346507487) -->
+    <skip />
+    <!-- no translation found for subtype_mode_fr_voice (4675914209337824269) -->
+    <skip />
+    <!-- no translation found for subtype_mode_it_voice (5077373057157441323) -->
+    <skip />
+    <!-- no translation found for subtype_mode_ja_voice (6604859132669646367) -->
+    <skip />
+    <!-- no translation found for subtype_mode_ko_voice (4890391190762324561) -->
+    <skip />
+    <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) -->
+    <skip />
+    <!-- no translation found for subtype_mode_pl_voice (2076196021014840487) -->
+    <skip />
+    <!-- no translation found for subtype_mode_pt_voice (8036522712795994397) -->
+    <skip />
+    <!-- no translation found for subtype_mode_ru_voice (8034596947963787529) -->
+    <skip />
+    <!-- no translation found for subtype_mode_tr_voice (3402067436761140005) -->
+    <skip />
+    <!-- no translation found for subtype_mode_yue_voice (1576887891614624263) -->
+    <skip />
+    <!-- no translation found for subtype_mode_zh_voice (4360533229467271152) -->
+    <skip />
+    <!-- no translation found for subtype_mode_zu_voice (1146122571698884636) -->
+    <skip />
+    <!-- no translation found for prefs_usability_study_mode (6937813623647419810) -->
+    <skip />
+</resources>
diff --git a/java/res/values-xlarge-land/dimens.xml b/java/res/values-sw600dp-land/dimens.xml
similarity index 66%
copy from java/res/values-xlarge-land/dimens.xml
copy to java/res/values-sw600dp-land/dimens.xml
index fd6b1f3..618b7f4 100644
--- a/java/res/values-xlarge-land/dimens.xml
+++ b/java/res/values-sw600dp-land/dimens.xml
@@ -2,7 +2,7 @@
 <!--
 /*
 **
-** Copyright 2010, The Android Open Source Project
+** 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.
@@ -19,23 +19,21 @@
 -->
 
 <resources>
-    <!-- keyboardHeight = key_height*4 + key_bottom_gap*3, key_height=14.5mm -->
-    <dimen name="keyboardHeight">58.0mm</dimen>
+    <!-- keyboardHeight = key_height*4 + key_bottom_gap*3 -->
+    <dimen name="keyboardHeight">45.0mm</dimen>
     <!-- key_height + key_bottom_gap = popup_key_height -->
     <!-- <dimen name="key_height">14.5mm</dimen> -->
-    <dimen name="key_bottom_gap">0.0mm</dimen>
-    <dimen name="key_horizontal_gap">0.0mm</dimen>
+    <dimen name="key_bottom_gap">1.3mm</dimen>
+    <dimen name="key_horizontal_gap">1.3mm</dimen>
     <dimen name="popup_key_height">13.0mm</dimen>
     <dimen name="keyboard_top_padding">1.1mm</dimen>
     <dimen name="keyboard_bottom_padding">0.0mm</dimen>
-    <dimen name="keyboard_horizontal_edges_padding">0.0mm</dimen>
+    <!-- key_height x 1.0 -->
+    <dimen name="key_preview_height">13.0mm</dimen>
 
-    <dimen name="key_letter_size">28dip</dimen>
-    <dimen name="key_label_text_size">20dip</dimen>
+    <dimen name="key_letter_size">25dip</dimen>
+    <dimen name="key_label_text_size">18dip</dimen>
     <!-- left or right padding of label alignment -->
     <dimen name="key_label_horizontal_alignment_padding">18dip</dimen>
-    <dimen name="key_preview_height_holo">26.5mm</dimen>
-    <dimen name="key_preview_offset_holo">7.5mm</dimen>
-
     <dimen name="candidate_strip_padding">40.0mm</dimen>
 </resources>
diff --git a/java/res/values-xlarge/config.xml b/java/res/values-sw600dp/config.xml
similarity index 80%
copy from java/res/values-xlarge/config.xml
copy to java/res/values-sw600dp/config.xml
index 80ef3cd..c3d3445 100644
--- a/java/res/values-xlarge/config.xml
+++ b/java/res/values-sw600dp/config.xml
@@ -2,7 +2,7 @@
 <!--
 /*
 **
-** Copyright 2010, The Android Open Source Project
+** 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.
@@ -19,11 +19,10 @@
 -->
 
 <resources>
-    <bool name="config_enable_show_settings_key_option">false</bool>
+    <bool name="config_enable_show_settings_key_option">true</bool>
     <bool name="config_enable_show_subtype_settings">false</bool>
     <bool name="config_enable_show_voice_key_option">false</bool>
-    <!-- TODO: This configuration value is temporary set true to check popup preview behavior. -->
-    <bool name="config_enable_show_popup_on_keypress_option">true</bool>
+    <bool name="config_enable_show_popup_on_keypress_option">false</bool>
     <bool name="config_enable_show_recorrection_option">false</bool>
     <bool name="config_enable_quick_fixes_option">false</bool>
     <bool name="config_enable_bigram_suggestions_option">false</bool>
@@ -37,11 +36,10 @@
     <bool name="config_use_spacebar_language_switcher">false</bool>
     <!-- Showing mini keyboard, just above the touched point if true, aligned to the key if false -->
     <bool name="config_show_mini_keyboard_at_touched_point">true</bool>
-    <integer name="config_delay_update_suggestions">180</integer>
+    <!-- The language is never displayed if == 0, always displayed if < 0 -->
+    <integer name="config_delay_before_fadeout_language_on_spacebar">1200</integer>
     <!-- This configuration is the index of the array {@link KeyboardSwitcher.KEYBOARD_THEMES}. -->
     <string name="config_default_keyboard_theme_id" translatable="false">5</string>
     <string name="config_text_size_of_language_on_spacebar" translatable="false">medium</string>
     <integer name="config_max_popup_keyboard_column">5</integer>
-    <!--  Screen metrics for logging. 0 = "mdpi", 1 = "hdpi", 2 = "xlarge" -->
-    <integer name="log_screen_metrics">2</integer>
 </resources>
diff --git a/java/res/values-xlarge/dimens.xml b/java/res/values-sw600dp/dimens.xml
similarity index 63%
copy from java/res/values-xlarge/dimens.xml
copy to java/res/values-sw600dp/dimens.xml
index 4f78bea..7cdf727 100644
--- a/java/res/values-xlarge/dimens.xml
+++ b/java/res/values-sw600dp/dimens.xml
@@ -2,7 +2,7 @@
 <!--
 /*
 **
-** Copyright 2010, The Android Open Source Project
+** 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.
@@ -19,17 +19,19 @@
 -->
 
 <resources>
-    <!-- keyboardHeight = key_height*4 + key_bottom_gap*3, key_height=12mm -->
+    <!-- keyboardHeight = key_height*4 + key_bottom_gap*3 -->
     <dimen name="keyboardHeight">48.0mm</dimen>
+    <fraction name="maxKeyboardHeight">50%p</fraction>
+    <fraction name="minKeyboardHeight">-61.8%p</fraction>
     <!-- key_height + key_bottom_gap = popup_key_height -->
     <!-- <dimen name="key_height">14.5mm</dimen> -->
-    <dimen name="key_bottom_gap">0.0mm</dimen>
-    <dimen name="key_horizontal_gap">0.0mm</dimen>
+    <dimen name="key_bottom_gap">1.0mm</dimen>
+    <dimen name="key_horizontal_gap">1.0mm</dimen>
     <dimen name="popup_key_height">10.0mm</dimen>
     <dimen name="keyboard_top_padding">1.1mm</dimen>
     <dimen name="keyboard_bottom_padding">0.0mm</dimen>
-    <dimen name="keyboard_horizontal_edges_padding">0.0mm</dimen>
-    <dimen name="mini_keyboard_horizontal_padding_holo">40dip</dimen>
+    <!-- key_height x 1.0 -->
+    <dimen name="key_preview_height">13.0mm</dimen>
     <dimen name="mini_keyboard_key_horizontal_padding">12dip</dimen>
     <!-- Amount of allowance for selecting keys in a mini popup keyboard by sliding finger. -->
     <!-- popup_key_height x 1.2 -->
@@ -37,20 +39,15 @@
     <!-- popup_key_height x -1.0 -->
     <dimen name="mini_keyboard_vertical_correction">-13.0mm</dimen>
 
-    <dimen name="key_letter_size">26dip</dimen>
-    <dimen name="key_label_text_size">16dip</dimen>
+    <fraction name="key_letter_ratio">45%</fraction>
+    <fraction name="key_label_text_ratio">29%</fraction>
+    <fraction name="key_preview_text_ratio">82%</fraction>
     <!-- left or right padding of label alignment -->
     <dimen name="key_label_horizontal_alignment_padding">6dip</dimen>
-    <dimen name="key_preview_text_size_large">24dip</dimen>
-    <dimen name="key_preview_height_holo">23.0mm</dimen>
-    <dimen name="key_preview_offset_holo">8.0mm</dimen>
 
     <dimen name="candidate_strip_height">46dip</dimen>
-    <!-- candidate_strip_minimum_height =
-         key_preview_height_holo - key_preview_offset_holo + alpha -->
-    <dimen name="candidate_strip_minimum_height">18mm</dimen>
     <dimen name="candidate_strip_padding">15.0mm</dimen>
-    <dimen name="candidate_min_width">46dip</dimen>
-    <dimen name="candidate_padding">8dip</dimen>
+    <dimen name="candidate_min_width">0.3in</dimen>
+    <dimen name="candidate_padding">12dip</dimen>
     <dimen name="candidate_text_size">22dip</dimen>
 </resources>
diff --git a/java/res/values-sw600dp/donottranslate.xml b/java/res/values-sw600dp/donottranslate.xml
new file mode 100644
index 0000000..6d94c28
--- /dev/null
+++ b/java/res/values-sw600dp/donottranslate.xml
@@ -0,0 +1,23 @@
+<?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">
+    <!--  Default value of the visibility of the suggestion strip -->
+    <string name="prefs_suggestion_visibility_default_value" translatable="false">1</string>
+</resources>
diff --git a/java/res/values-xlarge-land/dimens.xml b/java/res/values-sw768dp-land/dimens.xml
similarity index 84%
rename from java/res/values-xlarge-land/dimens.xml
rename to java/res/values-sw768dp-land/dimens.xml
index fd6b1f3..ce36145 100644
--- a/java/res/values-xlarge-land/dimens.xml
+++ b/java/res/values-sw768dp-land/dimens.xml
@@ -21,17 +21,18 @@
 <resources>
     <!-- keyboardHeight = key_height*4 + key_bottom_gap*3, key_height=14.5mm -->
     <dimen name="keyboardHeight">58.0mm</dimen>
+    <fraction name="minKeyboardHeight">45%p</fraction>
     <!-- key_height + key_bottom_gap = popup_key_height -->
     <!-- <dimen name="key_height">14.5mm</dimen> -->
-    <dimen name="key_bottom_gap">0.0mm</dimen>
-    <dimen name="key_horizontal_gap">0.0mm</dimen>
+    <dimen name="key_bottom_gap">1.6mm</dimen>
+    <dimen name="key_horizontal_gap">1.6mm</dimen>
     <dimen name="popup_key_height">13.0mm</dimen>
     <dimen name="keyboard_top_padding">1.1mm</dimen>
     <dimen name="keyboard_bottom_padding">0.0mm</dimen>
     <dimen name="keyboard_horizontal_edges_padding">0.0mm</dimen>
 
-    <dimen name="key_letter_size">28dip</dimen>
-    <dimen name="key_label_text_size">20dip</dimen>
+    <fraction name="key_letter_ratio">30.7%</fraction>
+    <fraction name="key_label_text_ratio">21.9%</fraction>
     <!-- left or right padding of label alignment -->
     <dimen name="key_label_horizontal_alignment_padding">18dip</dimen>
     <dimen name="key_preview_height_holo">26.5mm</dimen>
diff --git a/java/res/values-xlarge/config.xml b/java/res/values-sw768dp/config.xml
similarity index 97%
rename from java/res/values-xlarge/config.xml
rename to java/res/values-sw768dp/config.xml
index 80ef3cd..663332f 100644
--- a/java/res/values-xlarge/config.xml
+++ b/java/res/values-sw768dp/config.xml
@@ -20,7 +20,6 @@
 
 <resources>
     <bool name="config_enable_show_settings_key_option">false</bool>
-    <bool name="config_enable_show_subtype_settings">false</bool>
     <bool name="config_enable_show_voice_key_option">false</bool>
     <!-- TODO: This configuration value is temporary set true to check popup preview behavior. -->
     <bool name="config_enable_show_popup_on_keypress_option">true</bool>
diff --git a/java/res/values-xlarge/dimens.xml b/java/res/values-sw768dp/dimens.xml
similarity index 87%
rename from java/res/values-xlarge/dimens.xml
rename to java/res/values-sw768dp/dimens.xml
index 4f78bea..cb380fb 100644
--- a/java/res/values-xlarge/dimens.xml
+++ b/java/res/values-sw768dp/dimens.xml
@@ -21,10 +21,11 @@
 <resources>
     <!-- keyboardHeight = key_height*4 + key_bottom_gap*3, key_height=12mm -->
     <dimen name="keyboardHeight">48.0mm</dimen>
+    <fraction name="minKeyboardHeight">-35.0%p</fraction>
     <!-- key_height + key_bottom_gap = popup_key_height -->
     <!-- <dimen name="key_height">14.5mm</dimen> -->
-    <dimen name="key_bottom_gap">0.0mm</dimen>
-    <dimen name="key_horizontal_gap">0.0mm</dimen>
+    <dimen name="key_bottom_gap">1.1mm</dimen>
+    <dimen name="key_horizontal_gap">1.1mm</dimen>
     <dimen name="popup_key_height">10.0mm</dimen>
     <dimen name="keyboard_top_padding">1.1mm</dimen>
     <dimen name="keyboard_bottom_padding">0.0mm</dimen>
@@ -37,11 +38,11 @@
     <!-- popup_key_height x -1.0 -->
     <dimen name="mini_keyboard_vertical_correction">-13.0mm</dimen>
 
-    <dimen name="key_letter_size">26dip</dimen>
-    <dimen name="key_label_text_size">16dip</dimen>
+    <fraction name="key_letter_ratio">34.4%</fraction>
+    <fraction name="key_label_text_ratio">21.2%</fraction>
     <!-- left or right padding of label alignment -->
     <dimen name="key_label_horizontal_alignment_padding">6dip</dimen>
-    <dimen name="key_preview_text_size_large">24dip</dimen>
+    <fraction name="key_preview_text_ratio">26.3%</fraction>
     <dimen name="key_preview_height_holo">23.0mm</dimen>
     <dimen name="key_preview_offset_holo">8.0mm</dimen>
 
diff --git a/java/res/values-xlarge/donottranslate.xml b/java/res/values-sw768dp/donottranslate.xml
similarity index 100%
rename from java/res/values-xlarge/donottranslate.xml
rename to java/res/values-sw768dp/donottranslate.xml
diff --git a/java/res/values-th/strings.xml b/java/res/values-th/strings.xml
index cd7fe95..64f96d6 100644
--- a/java/res/values-th/strings.xml
+++ b/java/res/values-th/strings.xml
@@ -30,6 +30,11 @@
     <string name="correction_category" msgid="2236750915056607613">"การแก้ไขข้อความ"</string>
     <string name="ngram_category" msgid="5337109164339320257">"ข้อเสนอแนะตามคำก่อนหน้านี้"</string>
     <string name="misc_category" msgid="6894192814868233453">"ตัวเลือกอื่นๆ"</string>
+    <string name="advanced_settings" msgid="362895144495591463">"การตั้งค่าขั้นสูง"</string>
+    <string name="advanced_settings_summary" msgid="5193513161106637254">"ตัวเลือกสำหรับผู้ใช้ที่มีความเชี่ยวชาญ"</string>
+    <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"การหน่วงเวลาก่อนปิดป๊อปอัพหลัก"</string>
+    <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"ไม่มีการหน่วงเวลา"</string>
+    <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"ค่าเริ่มต้น"</string>
     <string name="auto_cap" msgid="1719746674854628252">"ปรับเป็นตัวพิมพ์ใหญ่อัตโนมัติ"</string>
     <string name="quick_fixes" msgid="5353213327680897927">"แก้ไขด่วน"</string>
     <string name="quick_fixes_summary" msgid="3405028402510332373">"แก้ไขข้อผิดพลาดในการพิมพ์ที่พบบ่อย"</string>
@@ -105,7 +110,6 @@
     <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"แป้นพิมพ์ภาษาอังกฤษ (สหราชอาณาจักร)"</string>
     <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"แป้นพิมพ์ภาษาอังกฤษ (สหรัฐอเมริกา)"</string>
     <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"แปันพิมพ์ภาษาสเปน"</string>
-    <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"แป้นพิมพ์ภาษาสเปน (สหรัฐอเมริกา)"</string>
     <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"แป้นพิมพ์ภาษาฝรั่งเศส"</string>
     <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"แป้นพิมพ์ภาษาฝรั่งเศส (แคนาดา)"</string>
     <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"แป้นพิมพ์ภาษาฝรั่งเศส (สวิตเซอร์แลนด์)"</string>
@@ -113,6 +117,8 @@
     <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"แป้นพิมพ์ภาษาอิตาลี"</string>
     <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"แป้นพิมพ์ภาษานอร์เวย์"</string>
     <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"แป้นพิมพ์ภาษาดัตช์"</string>
+    <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"แป้นพิมพ์ภาษาโปแลนด์"</string>
+    <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"แป้นพิมพ์ภาษาโปรตุเกส"</string>
     <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"แป้นพิมพ์ภาษารัสเซีย"</string>
     <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"แป้นพิมพ์ภาษาเซอร์เบีย"</string>
     <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"แป้นพิมพ์ภาษาสวีเดน"</string>
diff --git a/java/res/values-tl/strings.xml b/java/res/values-tl/strings.xml
index da62eaf..e406149 100644
--- a/java/res/values-tl/strings.xml
+++ b/java/res/values-tl/strings.xml
@@ -30,6 +30,11 @@
     <string name="correction_category" msgid="2236750915056607613">"Pagwawasto ng teksto"</string>
     <string name="ngram_category" msgid="5337109164339320257">"Mga suhestiyon batay sa mga nakaraang salita"</string>
     <string name="misc_category" msgid="6894192814868233453">"Iba pang mga pagpipilian"</string>
+    <string name="advanced_settings" msgid="362895144495591463">"Mga advanced na setting"</string>
+    <string name="advanced_settings_summary" msgid="5193513161106637254">"Mga pagpipilian para sa mga ekspertong user"</string>
+    <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Balewala antala key popup"</string>
+    <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Walang antala"</string>
+    <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Default"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Auto-capitalization"</string>
     <string name="quick_fixes" msgid="5353213327680897927">"Mga mabilisang pagsasaayos"</string>
     <string name="quick_fixes_summary" msgid="3405028402510332373">"Itinatama ang mga karaniwang na-type na mali"</string>
@@ -105,7 +110,6 @@
     <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Ingles (UK) na Keyboard"</string>
     <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Ingles (US) na Keyboard"</string>
     <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Spanish na Keyboard"</string>
-    <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"Spanish (US) na Keyboard"</string>
     <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"French na Keyboard"</string>
     <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"French (Canada) na Keyboard"</string>
     <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"French (Switzerland) na Keyboard"</string>
@@ -113,6 +117,8 @@
     <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Italian na Keyboard"</string>
     <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Norwegian na Keyboard"</string>
     <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Dutch na Keyboard"</string>
+    <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Polish na Keyboard"</string>
+    <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Portuguese na Keyboard"</string>
     <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Russian na Keyboard"</string>
     <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Serbian na Keyboard"</string>
     <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Swedish na Keyboard"</string>
diff --git a/java/res/values-tr/strings.xml b/java/res/values-tr/strings.xml
index 2607ae2..fee878e 100644
--- a/java/res/values-tr/strings.xml
+++ b/java/res/values-tr/strings.xml
@@ -30,6 +30,11 @@
     <string name="correction_category" msgid="2236750915056607613">"Metin düzeltme"</string>
     <string name="ngram_category" msgid="5337109164339320257">"Önceki kelimelere dayalı öneriler"</string>
     <string name="misc_category" msgid="6894192814868233453">"Diğer seçenekler"</string>
+    <string name="advanced_settings" msgid="362895144495591463">"Gelişmiş ayarlar"</string>
+    <string name="advanced_settings_summary" msgid="5193513161106637254">"Uzman kullanıcılar için seçenekler"</string>
+    <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Tuş popup içn kaptm ertlm"</string>
+    <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Gecikme yok"</string>
+    <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Varsayılan"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Otomatik olarak büyük harf yap"</string>
     <string name="quick_fixes" msgid="5353213327680897927">"Hızlı onarımlar"</string>
     <string name="quick_fixes_summary" msgid="3405028402510332373">"Yaygın olarak yapılan yazım hatalarını düzeltir"</string>
@@ -38,7 +43,7 @@
     <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Her zaman göster"</string>
     <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Dikey modda göster"</string>
     <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Her zaman gizle"</string>
-    <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Dil geçişi içn boşluk çubğn kullan"</string>
+    <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Dil geçişi &gt; boşluk çubuğuyla"</string>
     <string name="prefs_settings_key" msgid="4623341240804046498">"Ayarları göster tuşu"</string>
     <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Otomatik"</string>
     <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Her zaman göster"</string>
@@ -105,7 +110,6 @@
     <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"İngilizce (İngiltere) Klavye"</string>
     <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"İngilizce (ABD) Klavye"</string>
     <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"İspanyolca Klavye"</string>
-    <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"İspanyolca (ABD) Klavye"</string>
     <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Fransızca Klavye"</string>
     <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Fransızca (Kanada) Klavye"</string>
     <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Fransızca (İsviçre) Klavye"</string>
@@ -113,6 +117,8 @@
     <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"İtalyanca Klavye"</string>
     <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Norveççe Klavye"</string>
     <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Felemenkçe Klavye"</string>
+    <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Lehçe Klavye"</string>
+    <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Portekizce Klavye"</string>
     <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Rusça Klavye"</string>
     <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Sırpça Klavye"</string>
     <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"İsveççe Klavye"</string>
diff --git a/java/res/values-uk/strings.xml b/java/res/values-uk/strings.xml
index a2f589d..cb1a864 100644
--- a/java/res/values-uk/strings.xml
+++ b/java/res/values-uk/strings.xml
@@ -30,6 +30,11 @@
     <string name="correction_category" msgid="2236750915056607613">"Виправлення тексту"</string>
     <string name="ngram_category" msgid="5337109164339320257">"Пропозиції на основі попередніх слів"</string>
     <string name="misc_category" msgid="6894192814868233453">"Інші опції"</string>
+    <string name="advanced_settings" msgid="362895144495591463">"Розширені налаштування"</string>
+    <string name="advanced_settings_summary" msgid="5193513161106637254">"Налаштування для досвідчених користувачів"</string>
+    <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Затримка клавіши закриття"</string>
+    <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Без затримки"</string>
+    <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"За умовчанням"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Авто викор. вел. літер"</string>
     <string name="quick_fixes" msgid="5353213327680897927">"Шв. виправлення"</string>
     <string name="quick_fixes_summary" msgid="3405028402510332373">"Виправляє поширені помилки"</string>
@@ -105,7 +110,6 @@
     <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Англ. розкладка (Великобританія)"</string>
     <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Англійська розкладка (США)"</string>
     <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Іспанська розкладка"</string>
-    <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"Іспанська розкладка (США)"</string>
     <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Французька розкладка"</string>
     <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Французька розкладка (Канада)"</string>
     <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Французька розкладка (Швейцарія)"</string>
@@ -113,6 +117,8 @@
     <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Італійська розкладка"</string>
     <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Норвезька розкладка"</string>
     <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Голланд. розклад."</string>
+    <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Польська розкладка"</string>
+    <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Португальська розкладка"</string>
     <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Російська розкладка"</string>
     <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Сербська розкладка"</string>
     <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Шведська розкладка"</string>
diff --git a/java/res/values-vi/strings.xml b/java/res/values-vi/strings.xml
index 81be826..53bd16a 100644
--- a/java/res/values-vi/strings.xml
+++ b/java/res/values-vi/strings.xml
@@ -30,6 +30,11 @@
     <string name="correction_category" msgid="2236750915056607613">"Sửa văn bản"</string>
     <string name="ngram_category" msgid="5337109164339320257">"Đề xuất dựa trên các từ trước đó"</string>
     <string name="misc_category" msgid="6894192814868233453">"Tùy chọn khác"</string>
+    <string name="advanced_settings" msgid="362895144495591463">"Cài đặt nâng cao"</string>
+    <string name="advanced_settings_summary" msgid="5193513161106637254">"Tùy chọn cho người dùng chuyên gia"</string>
+    <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Hlại việc l.bỏ csổ b.lên chính"</string>
+    <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Không có tgian trễ"</string>
+    <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Mặc định"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Tự động viết hoa"</string>
     <string name="quick_fixes" msgid="5353213327680897927">"Sửa nhanh"</string>
     <string name="quick_fixes_summary" msgid="3405028402510332373">"Sửa lỗi nhập thông thường"</string>
@@ -105,7 +110,6 @@
     <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Bàn phím tiếng Anh (Anh)"</string>
     <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Bàn phím tiếng Anh (Mỹ)"</string>
     <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Bàn phím tiếng Tây Ban Nha"</string>
-    <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"Bàn phím tiếng Tây Ban Nha (Mỹ)"</string>
     <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Bàn phím tiếng Pháp"</string>
     <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Bàn phím tiếng Pháp (Canada)"</string>
     <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Bàn phím tiếng Pháp (Thụy Sĩ)"</string>
@@ -113,6 +117,8 @@
     <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Bàn phím tiếng Ý"</string>
     <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Bàn phím tiếng Na Uy"</string>
     <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Bàn phím tiếng Hà Lan"</string>
+    <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Bàn phím tiếng Ba Lan"</string>
+    <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Bàn phím tiếng Bồ Đào Nha"</string>
     <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Bàn phím tiếng Nga"</string>
     <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Bàn phím tiếng Serbia"</string>
     <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Bàn phím tiếng Thụy Điển"</string>
diff --git a/java/res/values-zh-rCN/strings.xml b/java/res/values-zh-rCN/strings.xml
index 1f15831..12e10b0 100644
--- a/java/res/values-zh-rCN/strings.xml
+++ b/java/res/values-zh-rCN/strings.xml
@@ -30,6 +30,11 @@
     <string name="correction_category" msgid="2236750915056607613">"文本更正"</string>
     <string name="ngram_category" msgid="5337109164339320257">"根据前面的字词提供建议"</string>
     <string name="misc_category" msgid="6894192814868233453">"其他选项"</string>
+    <string name="advanced_settings" msgid="362895144495591463">"高级设置"</string>
+    <string name="advanced_settings_summary" msgid="5193513161106637254">"适合专家级用户的选项"</string>
+    <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"关闭弹出式键盘的延迟"</string>
+    <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"无延迟"</string>
+    <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"默认"</string>
     <string name="auto_cap" msgid="1719746674854628252">"自动大写"</string>
     <string name="quick_fixes" msgid="5353213327680897927">"快速纠正"</string>
     <string name="quick_fixes_summary" msgid="3405028402510332373">"纠正常见的输入错误"</string>
@@ -105,7 +110,6 @@
     <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"英语(英国)键盘"</string>
     <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"英语(美国)键盘"</string>
     <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"西班牙语键盘"</string>
-    <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"西班牙语(美国)键盘"</string>
     <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"法语键盘"</string>
     <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"法语(加拿大)键盘"</string>
     <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"法语(瑞士)键盘"</string>
@@ -113,6 +117,8 @@
     <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"意大利语键盘"</string>
     <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"挪威语键盘"</string>
     <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"荷兰语键盘"</string>
+    <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"波兰语键盘"</string>
+    <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"葡萄牙语键盘"</string>
     <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"俄语键盘"</string>
     <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"塞尔维亚语键盘"</string>
     <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"瑞典语键盘"</string>
diff --git a/java/res/values-zh-rTW/strings.xml b/java/res/values-zh-rTW/strings.xml
index 8a89aeb..5251dd3 100644
--- a/java/res/values-zh-rTW/strings.xml
+++ b/java/res/values-zh-rTW/strings.xml
@@ -30,6 +30,11 @@
     <string name="correction_category" msgid="2236750915056607613">"文字修正"</string>
     <string name="ngram_category" msgid="5337109164339320257">"根據先前字詞產生的建議"</string>
     <string name="misc_category" msgid="6894192814868233453">"其他選項"</string>
+    <string name="advanced_settings" msgid="362895144495591463">"進階設定"</string>
+    <string name="advanced_settings_summary" msgid="5193513161106637254">"提供給專業使用者的選項"</string>
+    <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"關閉彈出式鍵盤的延遲時間"</string>
+    <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"不延遲"</string>
+    <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"預設"</string>
     <string name="auto_cap" msgid="1719746674854628252">"自動大寫"</string>
     <string name="quick_fixes" msgid="5353213327680897927">"快速修正"</string>
     <string name="quick_fixes_summary" msgid="3405028402510332373">"修正一般打字錯誤"</string>
@@ -105,7 +110,6 @@
     <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"英文 (英國) 鍵盤"</string>
     <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"英文 (美國) 鍵盤"</string>
     <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"西班牙文鍵盤"</string>
-    <string name="subtype_mode_es_US_keyboard" msgid="3702125193532262008">"西班牙文 (美國) 鍵盤"</string>
     <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"法文鍵盤"</string>
     <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"法文 (加拿大) 鍵盤"</string>
     <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"法文 (瑞士) 鍵盤"</string>
@@ -113,6 +117,8 @@
     <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"義大利文鍵盤"</string>
     <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"挪威文鍵盤"</string>
     <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"荷蘭文鍵盤"</string>
+    <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"波蘭文鍵盤"</string>
+    <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"葡萄牙文鍵盤"</string>
     <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"俄文鍵盤"</string>
     <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"塞爾維亞文鍵盤"</string>
     <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"瑞典文語音"</string>
diff --git a/java/res/values-zu/strings.xml b/java/res/values-zu/strings.xml
new file mode 100644
index 0000000..4ee4604
--- /dev/null
+++ b/java/res/values-zu/strings.xml
@@ -0,0 +1,209 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/*
+**
+** Copyright 2008, 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:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="english_ime_name" msgid="7252517407088836577">"Ikhibhodi ye-Android"</string>
+    <string name="english_ime_settings" msgid="6661589557206947774">"Izilungiselelo zekhibhodi ye-Android"</string>
+    <string name="english_ime_input_options" msgid="3909945612939668554">"Okukhethwa kukho kokungenayo"</string>
+    <string name="vibrate_on_keypress" msgid="5258079494276955460">"Dlidlizelisa ngokucindezela inkinobho"</string>
+    <string name="sound_on_keypress" msgid="6093592297198243644">"Umsindo wokucindezela ukhiye"</string>
+    <string name="popup_on_keypress" msgid="123894815723512944">"Ugaxekile ngokucindezela ukhiye"</string>
+    <!-- no translation found for general_category (1859088467017573195) -->
+    <skip />
+    <!-- no translation found for correction_category (2236750915056607613) -->
+    <skip />
+    <!-- no translation found for ngram_category (5337109164339320257) -->
+    <skip />
+    <!-- no translation found for misc_category (6894192814868233453) -->
+    <skip />
+    <!-- no translation found for advanced_settings (362895144495591463) -->
+    <skip />
+    <!-- no translation found for advanced_settings_summary (5193513161106637254) -->
+    <skip />
+    <!-- no translation found for key_preview_popup_dismiss_delay (6213164897443068248) -->
+    <skip />
+    <!-- no translation found for key_preview_popup_dismiss_no_delay (2096123151571458064) -->
+    <skip />
+    <!-- no translation found for key_preview_popup_dismiss_default_delay (2166964333903906734) -->
+    <skip />
+    <string name="auto_cap" msgid="1719746674854628252">"Ukwenza ofeleba okuzenzakalelayo"</string>
+    <string name="quick_fixes" msgid="5353213327680897927">"Ukulungisa okusheshayo"</string>
+    <string name="quick_fixes_summary" msgid="3405028402510332373">"Ilungisa amaphutha athayiphwa ngokuvamile"</string>
+    <!-- no translation found for prefs_show_suggestions (8026799663445531637) -->
+    <skip />
+    <!-- no translation found for prefs_show_suggestions_summary (1583132279498502825) -->
+    <skip />
+    <!-- no translation found for prefs_suggestion_visibility_show_name (3219916594067551303) -->
+    <skip />
+    <!-- no translation found for prefs_suggestion_visibility_show_only_portrait_name (3551821800439659812) -->
+    <skip />
+    <!-- no translation found for prefs_suggestion_visibility_hide_name (6309143926422234673) -->
+    <skip />
+    <!-- no translation found for prefs_use_spacebar_language_switch (8828538114550634449) -->
+    <skip />
+    <string name="prefs_settings_key" msgid="4623341240804046498">"Bonisa ukhiye wezilungiselelo"</string>
+    <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Okuzenzakalelayo"</string>
+    <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Bonisa njalo"</string>
+    <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Fihla njalo"</string>
+    <!-- outdated translation 7911639788808958255 -->     <string name="auto_correction" msgid="4979925752001319458">"Iziphakamiso zezwi"</string>
+    <!-- outdated translation 6881047311475758267 -->     <string name="auto_correction_summary" msgid="5625751551134658006">"Ngokuzenzakalelayo ilungisa igama elandulele"</string>
+    <!-- no translation found for auto_correction_threshold_mode_off (8470882665417944026) -->
+    <skip />
+    <!-- no translation found for auto_correction_threshold_mode_modest (8788366690620799097) -->
+    <skip />
+    <!-- no translation found for auto_correction_threshold_mode_aggeressive (3524029103734923819) -->
+    <skip />
+    <!-- outdated translation 1323347224043514969 -->     <string name="bigram_suggestion" msgid="2636414079905220518">"Iziphakamiso ze-Biagram"</string>
+    <string name="bigram_suggestion_summary" msgid="4383845146070101531">"Sebenzisa igama elandulele ukuthuthukisa okusikiselwayo"</string>
+    <!-- no translation found for bigram_prediction (8914273444762259739) -->
+    <skip />
+    <!-- no translation found for bigram_prediction_summary (1747261921174300098) -->
+    <skip />
+    <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Kulondoloziwe"</string>
+    <string name="label_go_key" msgid="1635148082137219148">"Iya"</string>
+    <string name="label_next_key" msgid="362972844525672568">"Okulandelayo"</string>
+    <string name="label_done_key" msgid="2441578748772529288">"Kwenziwe"</string>
+    <string name="label_send_key" msgid="2815056534433717444">"Thumela"</string>
+    <!-- no translation found for label_to_alpha_key (4793983863798817523) -->
+    <skip />
+    <string name="label_more_key" msgid="3760239494604948502">"Okungaphezulu"</string>
+    <!-- no translation found for label_pause_key (181098308428035340) -->
+    <skip />
+    <!-- no translation found for label_wait_key (6402152600878093134) -->
+    <skip />
+    <string name="voice_warning_title" msgid="4419354150908395008">"Okungenayo kwezwi"</string>
+    <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Okungenayo kwezwi akusekelwa kolimi lwakho, kodwa kuyasebenza Ngesingisi."</string>
+    <!-- outdated translation 4611518823070986445 -->     <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Okungenayo kwezwi isici sokuhlola kusebenzisa ukuqaphela izwi lenethiwekhi ye-Google."</string>
+    <!-- outdated translation 5652369578498701761 -->     <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Ukuvala okungenayo kwezwi, iya kwizilungiselelo zekhibhodi."</string>
+    <!-- outdated translation 6892342981545727994 -->     <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Ukusebenzisa okungenayo kwezwi, cindezela inkinobho yemakrofoni noma slayida umunwe wakho kwikhibhodi esesikrinini."</string>
+    <string name="voice_listening" msgid="467518160751321844">"Khuluma manje"</string>
+    <string name="voice_working" msgid="6666937792815731889">"Kuyasebenza"</string>
+    <string name="voice_initializing" msgid="661962047129906646"></string>
+    <string name="voice_error" msgid="5140896300312186162">"Iphutha. Sicela uzame futhi."</string>
+    <string name="voice_network_error" msgid="6649556447401862563">"Ayikwazanga ukuxhuma"</string>
+    <string name="voice_too_much_speech" msgid="5746973620134227376">"Iphutha, kunamagama amaningi."</string>
+    <string name="voice_audio_error" msgid="5072707727016414454">"Inkinga yomsindo"</string>
+    <string name="voice_server_error" msgid="7807129913977261644">"Iphutha leseva"</string>
+    <string name="voice_speech_timeout" msgid="8461817525075498795">"Awekho amagama azwakele"</string>
+    <string name="voice_no_match" msgid="4285117547030179174">"Akukho okufanayo okutholiwe"</string>
+    <string name="voice_not_installed" msgid="5552450909753842415">"Ukusesha ngezwi akufakiwe"</string>
+    <string name="voice_swipe_hint" msgid="6943546180310682021"><b>"Isexwayiso:"</b>"Shintshela kwikhibhodi ukuze ukhulume"</string>
+    <string name="voice_punctuation_hint" msgid="1611389463237317754"><b>"Isixwayiso: "</b>"Esikhathini esilandelayo, zama ukukhuluma izimpimiselo ezinjengo \"isikhathi, \"ikhefu\" noma \"uphawu lombuzo\"."</string>
+    <string name="cancel" msgid="6830980399865683324">"Khansela"</string>
+    <string name="ok" msgid="7898366843681727667">"KULUNGILE"</string>
+    <string name="voice_input" msgid="2466640768843347841">"Okungenayo kwezwi"</string>
+    <!-- no translation found for voice_input_modes_main_keyboard (3360660341121083174) -->
+    <skip />
+    <!-- no translation found for voice_input_modes_symbols_keyboard (7203213240786084067) -->
+    <skip />
+    <!-- no translation found for voice_input_modes_off (3745699748218082014) -->
+    <skip />
+    <!-- no translation found for voice_input_modes_summary_main_keyboard (6586544292900314339) -->
+    <skip />
+    <!-- no translation found for voice_input_modes_summary_symbols_keyboard (5233725927281932391) -->
+    <skip />
+    <!-- no translation found for voice_input_modes_summary_off (63875609591897607) -->
+    <skip />
+    <string name="selectInputMethod" msgid="315076553378705821">"Khetha indlela yokungenayo"</string>
+    <string name="language_selection_title" msgid="1651299598555326750">"Izilimi zokufakwayo"</string>
+    <string name="language_selection_summary" msgid="187110938289512256">"Slayida umunwe kwibha yesikhala ukushintsha ulimi"</string>
+    <string name="hint_add_to_dictionary" msgid="9006292060636342317">"← Thinta futhi ukulondoloza"</string>
+    <string name="has_dictionary" msgid="6071847973466625007">"Isichazamazwi siyatholakala"</string>
+    <string name="prefs_enable_log" msgid="6620424505072963557">"Vumela impendulo yomsebenzisi"</string>
+    <string name="prefs_description_log" msgid="5827825607258246003">"Siza ukuthuthukisa umhleli wendlela yokungenayo ngokuthumela izibalo zokubala nokuphahlaza imibiko e-Google."</string>
+    <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Thinta ukulungisa amagama"</string>
+    <!-- outdated translation 1056068922330206170 -->     <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Thinta amagama afakiwe ukuwalungisa"</string>
+    <string name="keyboard_layout" msgid="437433231038683666">"Indikimba Yekhibhodi"</string>
+    <!-- no translation found for subtype_mode_cs_keyboard (1141718931112377586) -->
+    <skip />
+    <!-- no translation found for subtype_mode_ar_keyboard (2655338636329774995) -->
+    <skip />
+    <!-- no translation found for subtype_mode_da_keyboard (1243570804427922104) -->
+    <skip />
+    <!-- no translation found for subtype_mode_de_keyboard (1990979135959462145) -->
+    <skip />
+    <!-- no translation found for subtype_mode_en_GB_keyboard (7945856548410373708) -->
+    <skip />
+    <!-- no translation found for subtype_mode_en_US_keyboard (3708655163769735410) -->
+    <skip />
+    <!-- no translation found for subtype_mode_es_keyboard (1775125478866113148) -->
+    <skip />
+    <!-- no translation found for subtype_mode_fr_keyboard (8016515336759761014) -->
+    <skip />
+    <!-- no translation found for subtype_mode_fr_CA_keyboard (2628517247158376263) -->
+    <skip />
+    <!-- no translation found for subtype_mode_fr_CH_keyboard (6742806653181621228) -->
+    <skip />
+    <!-- no translation found for subtype_mode_iw_keyboard (1787536828253289950) -->
+    <skip />
+    <!-- no translation found for subtype_mode_it_keyboard (4934199655425394484) -->
+    <skip />
+    <!-- no translation found for subtype_mode_nb_keyboard (1175783216100212360) -->
+    <skip />
+    <!-- no translation found for subtype_mode_nl_keyboard (5090278083256037936) -->
+    <skip />
+    <!-- no translation found for subtype_mode_pl_keyboard (2225816414814396047) -->
+    <skip />
+    <!-- no translation found for subtype_mode_pt_keyboard (7503997804861754840) -->
+    <skip />
+    <!-- no translation found for subtype_mode_ru_keyboard (1383995915064277943) -->
+    <skip />
+    <!-- no translation found for subtype_mode_sr_keyboard (5019440799612208168) -->
+    <skip />
+    <!-- no translation found for subtype_mode_sv_keyboard (4933838139861753401) -->
+    <skip />
+    <!-- no translation found for subtype_mode_af_voice (7542487489657902699) -->
+    <skip />
+    <!-- no translation found for subtype_mode_cs_voice (1136386688120958641) -->
+    <skip />
+    <!-- no translation found for subtype_mode_de_voice (8378803143958089866) -->
+    <skip />
+    <!-- no translation found for subtype_mode_en_voice (6643420989651848728) -->
+    <skip />
+    <!-- no translation found for subtype_mode_es_voice (1323473601346507487) -->
+    <skip />
+    <!-- no translation found for subtype_mode_fr_voice (4675914209337824269) -->
+    <skip />
+    <!-- no translation found for subtype_mode_it_voice (5077373057157441323) -->
+    <skip />
+    <!-- no translation found for subtype_mode_ja_voice (6604859132669646367) -->
+    <skip />
+    <!-- no translation found for subtype_mode_ko_voice (4890391190762324561) -->
+    <skip />
+    <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) -->
+    <skip />
+    <!-- no translation found for subtype_mode_pl_voice (2076196021014840487) -->
+    <skip />
+    <!-- no translation found for subtype_mode_pt_voice (8036522712795994397) -->
+    <skip />
+    <!-- no translation found for subtype_mode_ru_voice (8034596947963787529) -->
+    <skip />
+    <!-- no translation found for subtype_mode_tr_voice (3402067436761140005) -->
+    <skip />
+    <!-- no translation found for subtype_mode_yue_voice (1576887891614624263) -->
+    <skip />
+    <!-- no translation found for subtype_mode_zh_voice (4360533229467271152) -->
+    <skip />
+    <!-- no translation found for subtype_mode_zu_voice (1146122571698884636) -->
+    <skip />
+    <!-- no translation found for prefs_usability_study_mode (6937813623647419810) -->
+    <skip />
+</resources>
diff --git a/java/res/values/attrs.xml b/java/res/values/attrs.xml
index e88b007..5557dde 100644
--- a/java/res/values/attrs.xml
+++ b/java/res/values/attrs.xml
@@ -15,21 +15,32 @@
 -->
 
 <resources>
+    <declare-styleable name="KeyboardTheme">
+        <!-- KeyboardView style -->
+        <attr name="keyboardViewStyle" format="reference" />
+        <attr name="keyPreviewStyle" format="reference" />
+        <!-- PopupMiniKeyboardView style -->
+        <attr name="popupMiniKeyboardViewStyle" format="reference" />
+        <attr name="popupMiniKeyboardPanelStyle" format="reference" />
+        <!-- Suggestions strip style -->
+        <attr name="suggestionsStripBackgroundStyle" format="reference" />
+        <attr name="suggestionBackgroundStyle" format="reference" />
+        <attr name="suggestionPreviewBackgroundStyle" format="reference" />
+    </declare-styleable>
 
     <declare-styleable name="KeyboardView">
-        <!-- Default KeyboardView style. -->
-        <attr name="keyboardViewStyle" format="reference" />
-
         <!-- Image for the key. This image needs to be a StateListDrawable, with the following
              possible states: normal, pressed, checkable, checkable+pressed, checkable+checked,
              checkable+checked+pressed. -->
         <attr name="keyBackground" format="reference" />
 
-        <!-- Size of the text for one letter character keys. -->
-        <attr name="keyLetterSize" format="dimension" />
+        <!-- Size of the text for one letter character keys, in the proportion of key height.
+             -->
+        <attr name="keyLetterRatio" format="float" />
 
-        <!-- Size of the text for custom keys with some text and no icon. -->
-        <attr name="labelTextSize" format="dimension" />
+        <!-- Size of the text for custom keys with some text and no icon, in the proportion of key
+             height. -->
+        <attr name="labelTextRatio" format="float" />
 
         <!-- Color to use for the label in a key. -->
         <attr name="keyTextColor" format="color" />
@@ -59,7 +70,7 @@
         <attr name="shadowRadius" format="float" />
         <attr name="backgroundDimAmount" format="float" />
 
-        <attr name="keyLetterStyle">
+        <attr name="keyLetterStyle" format="enum">
             <!-- This should be aligned with Typeface.NORMAL etc. -->
             <enum name="normal" value="0" />
             <enum name="bold" value="1" />
@@ -67,7 +78,7 @@
             <enum name="boldItalic" value="3" />
         </attr>
 
-        <attr name="colorScheme">
+        <attr name="colorScheme" format="enum">
             <!-- This should be aligned with KeyboardView.COLOR_SCHEME_* -->
             <enum name="white" value="0" />
             <enum name="black" value="1" />
@@ -80,8 +91,19 @@
         <attr name="keyboardHeight" format="dimension" />
         <!-- Maximum keyboard height, in pixels or percentage of display height -->
         <attr name="maxKeyboardHeight" format="dimension|fraction" />
-        <!-- Default width of a key, in pixels or percentage of display width. -->
-        <attr name="keyWidth" format="dimension|fraction" />
+        <!-- Minimum keyboard height represented in pixels, percentage of display height if fraction
+             is positive, or percentage of display width if fraction is negative. -->
+        <attr name="minKeyboardHeight" format="dimension|fraction" />
+        <!-- Default width of a key, in pixels or percentage of display width.
+             If the value is zero, the actual key width will be determined to fill out the area up
+             to the right edge of the keyboard.
+             If the value is negative, the actual key width will be determined to fill out the
+             area between the nearest key on the left hand side and the right edge of the keyboard.
+             -->
+        <attr name="keyWidth" format="dimension|fraction|enum">
+            <enum name="fillRight" value="0" />
+            <enum name="fillBoth" value="-1" />
+        </attr>
         <!-- Default height of a row (key height + vertical gap), in pixels or percentage of
              keyboard height. -->
         <attr name="rowHeight" format="dimension|fraction" />
@@ -103,7 +125,7 @@
         <!-- Maximum column of popup keyboard -->
         <attr name="maxPopupKeyboardColumn" format="integer" />
         <!-- Key edge flags. -->
-        <attr name="keyEdgeFlags">
+        <attr name="keyEdgeFlags" format="integer">
             <!-- Key is anchored to the left of the keyboard. -->
             <flag name="left" value="1" />
             <!-- Key is anchored to the right of the keyboard. -->
@@ -122,7 +144,7 @@
         <!-- The label to display on the key. -->
         <attr name="keyLabel" format="string" />
         <!-- The key label option -->
-        <attr name="keyLabelOption">
+        <attr name="keyLabelOption" format="integer">
             <!-- This should be aligned with KeyboardView.KEY_LABEL_OPTION_* -->
             <flag name="alignLeft" value="1" />
             <flag name="alignRight" value="2" />
@@ -147,11 +169,14 @@
         <!-- Visual insets -->
         <attr name="visualInsetsLeft" format="dimension|fraction" />
         <attr name="visualInsetsRight" format="dimension|fraction" />
+        <!-- The X-coordinate of upper right corner of this key including horizontal gap.
+             If the value is negative, the origin is the right edge of the keyboard. -->
+        <attr name="keyXPos" format="dimension|fraction" />
     </declare-styleable>
 
     <declare-styleable name="Keyboard_Row">
         <!-- Row edge flags. -->
-        <attr name="rowEdgeFlags">
+        <attr name="rowEdgeFlags" format="integer">
             <!-- Row is anchored to the top of the keyboard. -->
             <flag name="top" value="4" />
             <!-- Row is anchored to the bottom of the keyboard. -->
@@ -165,29 +190,31 @@
 
     <declare-styleable name="Keyboard_Case">
         <!-- This should be aligned with KeyboardId.MODE_* -->
-        <attr name="mode">
+        <attr name="mode" format="enum|string">
             <enum name="text" value="0" />
             <enum name="url" value="1" />
             <enum name="email" value="2" />
             <enum name="im" value="3" />
-            <enum name="web" value="4" />
-            <enum name="phone" value="5" />
+            <enum name="phone" value="4" />
+            <enum name="number" value="5" />
         </attr>
+        <attr name="webInput" format="boolean" />
         <attr name="passwordInput" format="boolean" />
         <attr name="hasSettingsKey" format="string" />
         <attr name="voiceKeyEnabled" format="string" />
         <attr name="hasVoiceKey" format="string" />
-        <attr name="imeAction">
+        <attr name="imeAction" format="enum">
             <!-- This should be aligned with EditorInfo.IME_ACTION_* -->
-            <flag name="actionUnspecified" value="0" />
-            <flag name="actionNone" value="1" />
-            <flag name="actionGo" value="2" />
-            <flag name="actionSearch" value="3" />
-            <flag name="actionSend" value="4" />
-            <flag name="actionNext" value="5" />
-            <flag name="actionDone" value="6" />
-            <flag name="actionPrevious" value="7" />
+            <enum name="actionUnspecified" value="0" />
+            <enum name="actionNone" value="1" />
+            <enum name="actionGo" value="2" />
+            <enum name="actionSearch" value="3" />
+            <enum name="actionSend" value="4" />
+            <enum name="actionNext" value="5" />
+            <enum name="actionDone" value="6" />
+            <enum name="actionPrevious" value="7" />
         </attr>
+        <attr name="localeCode" format="string" />
         <attr name="languageCode" format="string" />
         <attr name="countryCode" format="string" />
     </declare-styleable>
diff --git a/java/res/values/bools.xml b/java/res/values/bools.xml
index 2a181e1..889d8f7 100644
--- a/java/res/values/bools.xml
+++ b/java/res/values/bools.xml
@@ -21,6 +21,4 @@
     <!-- Whether this input method should be used as the default for a locale. Override it
          for latin languages. -->
     <bool name="im_is_default">false</bool>
-    <!-- Whether or not voice input is enabled by default. -->
-    <bool name="voice_input_default">true</bool>
 </resources>
diff --git a/java/res/values/config.xml b/java/res/values/config.xml
index 1d24b10..c61a6d5 100644
--- a/java/res/values/config.xml
+++ b/java/res/values/config.xml
@@ -20,9 +20,7 @@
 
 <resources>
     <bool name="config_swipeDisambiguation">true</bool>
-    <bool name="config_long_press_comma_for_settings_enabled">true</bool>
     <bool name="config_enable_show_settings_key_option">true</bool>
-    <bool name="config_enable_show_subtype_settings">true</bool>
     <bool name="config_enable_show_voice_key_option">true</bool>
     <bool name="config_enable_show_popup_on_keypress_option">true</bool>
     <bool name="config_enable_show_recorrection_option">true</bool>
@@ -72,8 +70,6 @@
     <string name="config_default_keyboard_theme_id" translatable="false">4</string>
     <string name="config_text_size_of_language_on_spacebar" translatable="false">small</string>
     <integer name="config_max_popup_keyboard_column">5</integer>
-    <!-- Whether or not auto-correction should be enabled by default -->
-    <bool name="enable_autocorrect">true</bool>
     <string-array name="auto_correction_threshold_values" translatable="false">
         <!-- Off, When auto correction setting is Off, this value is not used. -->
         <item></item>
diff --git a/java/res/values/dimens.xml b/java/res/values/dimens.xml
index 69f962f..e26cad3 100644
--- a/java/res/values/dimens.xml
+++ b/java/res/values/dimens.xml
@@ -21,6 +21,8 @@
 <resources>
     <!-- keyboardHeight = key_height*4 + key_bottom_gap*3, key_height=0.295in -->
     <dimen name="keyboardHeight">1.285in</dimen>
+    <fraction name="maxKeyboardHeight">50%p</fraction>
+    <fraction name="minKeyboardHeight">-61.8%p</fraction>
     <!-- key_height + key_bottom_gap = popup_key_height -->
     <!-- <dimen name="key_height">0.295in</dimen> -->
     <dimen name="key_bottom_gap">0.035in</dimen>
@@ -41,13 +43,13 @@
          to user's finger. -->
     <dimen name="keyboard_vertical_correction">-0.05in</dimen>
 
-    <dimen name="key_letter_size">0.13in</dimen>
-    <dimen name="key_label_text_size">0.083in</dimen>
+    <fraction name="key_letter_ratio">45%</fraction>
+    <fraction name="key_label_text_ratio">29%</fraction>
     <!-- left or right padding of label alignment -->
-    <dimen name="key_label_horizontal_alignment_padding">0.13in</dimen>
+    <dimen name="key_label_horizontal_alignment_padding">21dip</dimen>
     <dimen name="key_preview_height">80sp</dimen>
-    <dimen name="key_preview_offset">0.000in</dimen>
-    <dimen name="key_preview_text_size_large">36sp</dimen>
+    <dimen name="key_preview_offset">0.1in</dimen>
+    <fraction name="key_preview_text_ratio">82%</fraction>
     <dimen name="key_preview_height_holo">130sp</dimen>
     <dimen name="key_preview_offset_holo">0.193in</dimen>
 
@@ -60,11 +62,9 @@
     <dimen name="candidate_min_width">32dip</dimen>
     <dimen name="candidate_padding">6dip</dimen>
     <dimen name="candidate_text_size">18dip</dimen>
-    <dimen name="spacebar_vertical_correction">4dip</dimen>
     <!-- If the screen height in landscape is larger than the below value, then the keyboard
          will not go into extract (fullscreen) mode. -->
     <dimen name="max_height_for_fullscreen">2.5in</dimen>
-    <dimen name="bubble_pointer_offset">22dip</dimen>
 
     <dimen name="key_hysteresis_distance">0.05in</dimen>
 </resources>
diff --git a/java/res/values/durations.xml b/java/res/values/durations.xml
deleted file mode 100644
index 92af68e..0000000
--- a/java/res/values/durations.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/* 
-**
-** Copyright 2008, 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>
-    <!-- Vibration duration in milliseconds, for key presses in the IME. This can be hardware
-        dependent and may require overriding with a device specific overlay. -->
-    <integer name="vibrate_duration_ms">40</integer>
-</resources>
diff --git a/java/res/values/keycodes.xml b/java/res/values/keycodes.xml
index d5926ec..ee34529 100644
--- a/java/res/values/keycodes.xml
+++ b/java/res/values/keycodes.xml
@@ -23,9 +23,6 @@
     <integer name="key_tab">9</integer>
     <integer name="key_return">10</integer>
     <integer name="key_space">32</integer>
-    <integer name="key_dash">45</integer>
-    <integer name="key_single_quote">39</integer>
-    <integer name="key_double_quote">34</integer>
     <integer name="key_shift">-1</integer>
     <integer name="key_switch_alpha_symbol">-2</integer>
     <integer name="key_delete">-5</integer>
diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml
index 823f1e5..b75b21a 100644
--- a/java/res/values/strings.xml
+++ b/java/res/values/strings.xml
@@ -46,6 +46,18 @@
     <!-- Category title for misc options  -->
     <string name="misc_category">Other options</string>
 
+    <!-- Option name for advanced settings screen [CHAR LIMIT=25] -->
+    <string name="advanced_settings">Advanced settings</string>
+    <!-- Option summary for advanced settings screen [CHAR LIMIT=65 (two lines) or 30 (fits on one line, preferable)] -->
+    <string name="advanced_settings_summary">Options for expert users</string>
+
+    <!-- Option for the dismiss delay of the key popup [CHAR LIMIT=25] -->
+    <string name="key_preview_popup_dismiss_delay">Key popup dismiss delay</string>
+    <!-- Description for delay for dismissing a popup on keypress: no delay [CHAR LIMIT=15] -->
+    <string name="key_preview_popup_dismiss_no_delay">No delay</string>
+    <!-- Description for delay for dismissing a popup on screen: default value of the delay [CHAR LIMIT=15] -->
+    <string name="key_preview_popup_dismiss_default_delay">Default</string>
+
     <!-- Option to enable auto capitalization of sentences -->
     <string name="auto_cap">Auto-capitalization</string>
 
@@ -241,8 +253,6 @@
     <string name="subtype_mode_en_US_keyboard">English (US) Keyboard</string>
     <!-- Description for Spanish keyboard subtype [CHAR LIMIT=35] -->
     <string name="subtype_mode_es_keyboard">Spanish Keyboard</string>
-    <!-- Description for Spanish (United States) keyboard subtype [CHAR LIMIT=35] -->
-    <string name="subtype_mode_es_US_keyboard">Spanish (US) Keyboard</string>
     <!-- Description for French keyboard subtype [CHAR LIMIT=35] -->
     <string name="subtype_mode_fr_keyboard">French Keyboard</string>
     <!-- Description for French (Canada) keyboard subtype [CHAR LIMIT=35] -->
@@ -260,6 +270,8 @@
     <string name="subtype_mode_nl_keyboard">Dutch Keyboard</string>
     <!-- Description for Polish keyboard subtype [CHAR LIMIT=35] -->
     <string name="subtype_mode_pl_keyboard">Polish Keyboard</string>
+    <!-- Description for Portuguese keyboard subtype [CHAR LIMIT=35] -->
+    <string name="subtype_mode_pt_keyboard">Portuguese Keyboard</string>
     <!-- Description for Russian keyboard subtype [CHAR LIMIT=35] -->
     <string name="subtype_mode_ru_keyboard">Russian Keyboard</string>
     <!-- Description for Serbian keyboard subtype [CHAR LIMIT=35] -->
diff --git a/java/res/values/styles.xml b/java/res/values/styles.xml
index 8a4b16d..7cb4593 100644
--- a/java/res/values/styles.xml
+++ b/java/res/values/styles.xml
@@ -15,18 +15,18 @@
 -->
 
 <resources>
+    <!-- Theme "Basic" -->
     <style name="KeyboardView">
         <item name="android:background">@drawable/keyboard_background</item>
-
         <item name="keyBackground">@drawable/btn_keyboard_key</item>
-        <item name="keyLetterSize">@dimen/key_letter_size</item>
+        <item name="keyLetterRatio">@fraction/key_letter_ratio</item>
         <item name="keyLetterStyle">normal</item>
         <item name="keyTextColor">#FFFFFFFF</item>
         <item name="keyTextColorDisabled">#FFFFFFFF</item>
         <item name="keyPreviewLayout">@layout/key_preview</item>
         <item name="keyPreviewOffset">@dimen/key_preview_offset</item>
         <item name="keyPreviewHeight">@dimen/key_preview_height</item>
-        <item name="labelTextSize">@dimen/key_label_text_size</item>
+        <item name="labelTextRatio">@fraction/key_label_text_ratio</item>
         <item name="popupLayout">@layout/keyboard_popup</item>
         <item name="keyHysteresisDistance">@dimen/key_hysteresis_distance</item>
         <item name="verticalCorrection">@dimen/keyboard_vertical_correction</item>
@@ -35,6 +35,91 @@
         <item name="backgroundDimAmount">0.5</item>
         <item name="colorScheme">white</item>
     </style>
+    <style name="KeyPreviewStyle">
+        <item name="android:background">@drawable/keyboard_key_feedback</item>
+    </style>
+    <style name="PopupMiniKeyboardView" parent="KeyboardView">
+        <item name="keyBackground">@drawable/btn_keyboard_key_popup</item>
+        <item name="keyHysteresisDistance">0dip</item>
+        <item name="verticalCorrection">@dimen/mini_keyboard_vertical_correction</item>
+    </style>
+    <style name="PopupMiniKeyboardPanelStyle">
+        <item name="android:background">@drawable/keyboard_popup_panel_background</item>
+        <item name="android:paddingLeft">@dimen/mini_keyboard_horizontal_padding</item>
+        <item name="android:paddingRight">@dimen/mini_keyboard_horizontal_padding</item>
+    </style>
+    <style name="SuggestionsStripBackgroundStyle">
+        <item name="android:background">@drawable/keyboard_suggest_strip</item>
+    </style>
+    <style name="SuggestionBackgroundStyle">
+        <item name="android:background">@drawable/btn_candidate</item>
+    </style>
+    <style name="SuggestionPreviewBackgroundStyle">
+        <item name="android:background">@drawable/candidate_feedback_background</item>
+    </style>
+    <!-- Theme "Basic high contrast" -->
+    <style name="KeyboardView.HighContrast" parent="KeyboardView">
+        <item name="android:background">@android:color/black</item>
+        <item name="keyBackground">@drawable/btn_keyboard_key3</item>
+    </style>
+    <!-- Theme "Stone" -->
+    <style name="KeyboardView.Stone" parent="KeyboardView">
+        <item name="keyBackground">@drawable/btn_keyboard_key_stone</item>
+        <item name="keyTextColor">@color/latinkeyboard_key_color_black</item>
+        <item name="keyTextColorDisabled">#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>
+        <item name="keyTextColor">@color/latinkeyboard_key_color_black</item>
+        <item name="shadowColor">@color/latinkeyboard_key_color_white</item>
+    </style>
+    <!-- Theme "Stone bold" -->
+    <style name="KeyboardView.Stone.Bold" parent="KeyboardView.Stone">
+        <item name="keyLetterStyle">bold</item>
+    </style>
+    <!-- Theme "Gingerbread" -->
+    <style name="KeyboardView.Gingerbread" parent="KeyboardView">
+        <item name="android:background">@drawable/keyboard_dark_background</item>
+        <item name="keyBackground">@drawable/btn_keyboard_key_gingerbread</item>
+        <item name="keyLetterStyle">bold</item>
+    </style>
+    <style name="PopupMiniKeyboardView.Gingerbread" parent="PopupMiniKeyboardView">
+        <item name="android:background">@null</item>
+    </style>
+    <!-- Theme "Honeycomb" -->
+    <style name="KeyboardView.Honeycomb" parent="KeyboardView">
+        <item name="android:background">@drawable/keyboard_background_holo</item>
+        <item name="keyBackground">@drawable/btn_keyboard_key_honeycomb</item>
+        <item name="keyPreviewHeight">@dimen/key_preview_height_holo</item>
+        <item name="keyPreviewOffset">@dimen/key_preview_offset_holo</item>
+        <item name="keyTextColorDisabled">#FF63666D</item>
+        <item name="keyLetterStyle">bold</item>
+        <item name="shadowColor">#00000000</item>
+        <item name="shadowRadius">0.0</item>
+    </style>
+    <style name="KeyPreviewStyle.Honeycomb">
+        <item name="android:background">@drawable/keyboard_key_feedback_honeycomb</item>
+    </style>
+    <style name="PopupMiniKeyboardView.Honeycomb" parent="PopupMiniKeyboardView">
+        <item name="android:background">@null</item>
+        <item name="keyBackground">@drawable/btn_keyboard_key_popup_honeycomb</item>
+    </style>
+    <style name="PopupMiniKeyboardPanelStyle.Honeycomb">
+        <item name="android:background">@drawable/keyboard_popup_panel_background_holo</item>
+        <item name="android:paddingLeft">@dimen/mini_keyboard_horizontal_padding_holo</item>
+        <item name="android:paddingRight">@dimen/mini_keyboard_horizontal_padding_holo</item>
+    </style>
+    <style name="SuggestionsStripBackgroundStyle.Holo">
+        <item name="android:background">@drawable/keyboard_suggest_strip_holo</item>
+    </style>
+    <style name="SuggestionBackgroundStyle.Holo">
+        <item name="android:background">@drawable/btn_candidate_holo</item>
+    </style>
+    <style name="SuggestionPreviewBackgroundStyle.Holo">
+        <item name="android:background">@drawable/keyboard_popup_panel_background_holo</item>
+    </style>
     <style name="PopupMiniKeyboardAnimation">
         <item name="android:windowEnterAnimation">@anim/mini_keyboard_fadein</item>
         <item name="android:windowExitAnimation">@anim/mini_keyboard_fadeout</item>
diff --git a/java/res/values/themes.xml b/java/res/values/themes.xml
new file mode 100644
index 0000000..5315a9a
--- /dev/null
+++ b/java/res/values/themes.xml
@@ -0,0 +1,67 @@
+<?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="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>
+    </style>
+    <style name="KeyboardTheme.HighContrast" parent="android:Theme">
+        <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>
+    </style>
+    <style name="KeyboardTheme.Stone" parent="android:Theme.Light">
+        <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>
+    </style>
+    <style name="KeyboardTheme.Stone.Bold" parent="android:Theme.Light">
+        <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>
+    </style>
+    <style name="KeyboardTheme.Gingerbread" parent="android:Theme.Black">
+        <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>
+    </style>
+    <style name="KeyboardTheme.Honeycomb" parent="android:Theme.Holo">
+        <item name="keyboardViewStyle">@style/KeyboardView.Honeycomb</item>
+        <item name="keyPreviewStyle">@style/KeyPreviewStyle.Honeycomb</item>
+        <item name="popupMiniKeyboardViewStyle">@style/PopupMiniKeyboardView.Honeycomb</item>
+        <item name="popupMiniKeyboardPanelStyle">@style/PopupMiniKeyboardPanelStyle.Honeycomb</item>
+        <item name="suggestionsStripBackgroundStyle">@style/SuggestionsStripBackgroundStyle.Holo</item>
+        <item name="suggestionBackgroundStyle">@style/SuggestionBackgroundStyle.Holo</item>
+    </style>
+</resources>
diff --git a/java/res/values/whitelist.xml b/java/res/values/whitelist.xml
index ced52e7..d4ecbfa 100644
--- a/java/res/values/whitelist.xml
+++ b/java/res/values/whitelist.xml
@@ -25,14 +25,5 @@
         3. (String)after
      -->
     <string-array name="wordlist_whitelist">
-
-        <item>255</item>
-        <item>ill</item>
-        <item>I\'ll</item>
-
-        <item>255</item>
-        <item>thisd</item>
-        <item>this\'d</item>
-
     </string-array>
 </resources>
diff --git a/java/res/xml-ar/kbd_qwerty.xml b/java/res/xml-ar/kbd_qwerty.xml
index 5faf603..57823c9 100644
--- a/java/res/xml-ar/kbd_qwerty.xml
+++ b/java/res/xml-ar/kbd_qwerty.xml
@@ -21,9 +21,9 @@
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyboardHeight="@dimen/keyboardHeight"
-    latin:maxKeyboardHeight="50%p"
+    latin:maxKeyboardHeight="@fraction/maxKeyboardHeight"
+    latin:minKeyboardHeight="@fraction/minKeyboardHeight"
     latin:rowHeight="25%p"
-    latin:keyWidth="10%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
     latin:verticalGap="@dimen/key_bottom_gap"
     latin:popupKeyboardTemplate="@xml/kbd_popup_template"
diff --git a/java/res/xml-cs/kbd_qwerty.xml b/java/res/xml-cs/kbd_qwerty.xml
index 0e6e40d..9ead49c 100644
--- a/java/res/xml-cs/kbd_qwerty.xml
+++ b/java/res/xml-cs/kbd_qwerty.xml
@@ -21,9 +21,9 @@
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyboardHeight="@dimen/keyboardHeight"
-    latin:maxKeyboardHeight="50%p"
+    latin:maxKeyboardHeight="@fraction/maxKeyboardHeight"
+    latin:minKeyboardHeight="@fraction/minKeyboardHeight"
     latin:rowHeight="25%p"
-    latin:keyWidth="10%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
     latin:verticalGap="@dimen/key_bottom_gap"
     latin:popupKeyboardTemplate="@xml/kbd_popup_template"
diff --git a/java/res/xml-da/kbd_qwerty.xml b/java/res/xml-da/kbd_qwerty.xml
index d9847ae..12ea33c 100644
--- a/java/res/xml-da/kbd_qwerty.xml
+++ b/java/res/xml-da/kbd_qwerty.xml
@@ -21,7 +21,8 @@
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyboardHeight="@dimen/keyboardHeight"
-    latin:maxKeyboardHeight="50%p"
+    latin:maxKeyboardHeight="@fraction/maxKeyboardHeight"
+    latin:minKeyboardHeight="@fraction/minKeyboardHeight"
     latin:rowHeight="25%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
     latin:verticalGap="@dimen/key_bottom_gap"
diff --git a/java/res/xml-de/kbd_qwerty.xml b/java/res/xml-de/kbd_qwerty.xml
index e656966..5c51bbd 100644
--- a/java/res/xml-de/kbd_qwerty.xml
+++ b/java/res/xml-de/kbd_qwerty.xml
@@ -21,14 +21,14 @@
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyboardHeight="@dimen/keyboardHeight"
-    latin:maxKeyboardHeight="50%p"
+    latin:maxKeyboardHeight="@fraction/maxKeyboardHeight"
+    latin:minKeyboardHeight="@fraction/minKeyboardHeight"
     latin:rowHeight="25%p"
-    latin:keyWidth="10%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
     latin:verticalGap="@dimen/key_bottom_gap"
     latin:popupKeyboardTemplate="@xml/kbd_popup_template"
     latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column"
-    latin:keyboardLocale="de_DE"
+    latin:keyboardLocale="de"
 >
     <include
         latin:keyboardLayout="@xml/kbd_qwertz_rows" />
diff --git a/java/res/xml-en/kbd_qwerty.xml b/java/res/xml-en/kbd_qwerty.xml
new file mode 100644
index 0000000..33e24d3
--- /dev/null
+++ b/java/res/xml-en/kbd_qwerty.xml
@@ -0,0 +1,37 @@
+<?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.
+*/
+-->
+
+<!-- TODO: This is work around to avoid resource selection issue. This file must be removed when the
+     issue is sorted out. -->
+<Keyboard
+    xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+    latin:keyboardHeight="@dimen/keyboardHeight"
+    latin:maxKeyboardHeight="@fraction/maxKeyboardHeight"
+    latin:minKeyboardHeight="@fraction/minKeyboardHeight"
+    latin:rowHeight="25%p"
+    latin:horizontalGap="@dimen/key_horizontal_gap"
+    latin:verticalGap="@dimen/key_bottom_gap"
+    latin:popupKeyboardTemplate="@xml/kbd_popup_template"
+    latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column"
+    latin:keyboardLocale="en,en_US,en_GB"
+>
+    <include
+        latin:keyboardLayout="@xml/kbd_qwerty_rows" />
+</Keyboard>
diff --git a/java/res/xml-es/kbd_qwerty.xml b/java/res/xml-es/kbd_qwerty.xml
new file mode 100644
index 0000000..f986491
--- /dev/null
+++ b/java/res/xml-es/kbd_qwerty.xml
@@ -0,0 +1,35 @@
+<?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:keyboardHeight="@dimen/keyboardHeight"
+    latin:maxKeyboardHeight="@fraction/maxKeyboardHeight"
+    latin:minKeyboardHeight="@fraction/minKeyboardHeight"
+    latin:rowHeight="25%p"
+    latin:horizontalGap="@dimen/key_horizontal_gap"
+    latin:verticalGap="@dimen/key_bottom_gap"
+    latin:popupKeyboardTemplate="@xml/kbd_popup_template"
+    latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column"
+    latin:keyboardLocale="es,es_US"
+>
+    <include
+        latin:keyboardLayout="@xml/kbd_qwerty_rows" />
+</Keyboard>
diff --git a/java/res/xml-fi/kbd_qwerty.xml b/java/res/xml-fi/kbd_qwerty.xml
index ea08d67..e35ab2b 100644
--- a/java/res/xml-fi/kbd_qwerty.xml
+++ b/java/res/xml-fi/kbd_qwerty.xml
@@ -21,7 +21,8 @@
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyboardHeight="@dimen/keyboardHeight"
-    latin:maxKeyboardHeight="50%p"
+    latin:maxKeyboardHeight="@fraction/maxKeyboardHeight"
+    latin:minKeyboardHeight="@fraction/minKeyboardHeight"
     latin:rowHeight="25%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
     latin:verticalGap="@dimen/key_bottom_gap"
diff --git a/java/res/xml-fr-rCA/kbd_qwerty.xml b/java/res/xml-fr-rCA/kbd_qwerty.xml
index f9c2969..7f25848 100644
--- a/java/res/xml-fr-rCA/kbd_qwerty.xml
+++ b/java/res/xml-fr-rCA/kbd_qwerty.xml
@@ -21,9 +21,9 @@
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyboardHeight="@dimen/keyboardHeight"
-    latin:maxKeyboardHeight="50%p"
+    latin:maxKeyboardHeight="@fraction/maxKeyboardHeight"
+    latin:minKeyboardHeight="@fraction/minKeyboardHeight"
     latin:rowHeight="25%p"
-    latin:keyWidth="10%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
     latin:verticalGap="@dimen/key_bottom_gap"
     latin:popupKeyboardTemplate="@xml/kbd_popup_template"
diff --git a/java/res/xml-fr-rCH/kbd_qwerty.xml b/java/res/xml-fr-rCH/kbd_qwerty.xml
index e47cfd9..2baed3c 100644
--- a/java/res/xml-fr-rCH/kbd_qwerty.xml
+++ b/java/res/xml-fr-rCH/kbd_qwerty.xml
@@ -21,9 +21,9 @@
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyboardHeight="@dimen/keyboardHeight"
-    latin:maxKeyboardHeight="50%p"
+    latin:maxKeyboardHeight="@fraction/maxKeyboardHeight"
+    latin:minKeyboardHeight="@fraction/minKeyboardHeight"
     latin:rowHeight="25%p"
-    latin:keyWidth="10%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
     latin:verticalGap="@dimen/key_bottom_gap"
     latin:popupKeyboardTemplate="@xml/kbd_popup_template"
diff --git a/java/res/xml-fr/kbd_qwerty.xml b/java/res/xml-fr/kbd_qwerty.xml
index 2f8e67b..1b10655 100644
--- a/java/res/xml-fr/kbd_qwerty.xml
+++ b/java/res/xml-fr/kbd_qwerty.xml
@@ -21,14 +21,14 @@
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyboardHeight="@dimen/keyboardHeight"
-    latin:maxKeyboardHeight="50%p"
+    latin:maxKeyboardHeight="@fraction/maxKeyboardHeight"
+    latin:minKeyboardHeight="@fraction/minKeyboardHeight"
     latin:rowHeight="25%p"
-    latin:keyWidth="10%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
     latin:verticalGap="@dimen/key_bottom_gap"
     latin:popupKeyboardTemplate="@xml/kbd_popup_template"
     latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column"
-    latin:keyboardLocale="fr_FR"
+    latin:keyboardLocale="fr"
 >
     <include
         latin:keyboardLayout="@xml/kbd_azerty_rows" />
diff --git a/java/res/xml-hu/kbd_qwerty.xml b/java/res/xml-hu/kbd_qwerty.xml
index db729cf..250b455 100644
--- a/java/res/xml-hu/kbd_qwerty.xml
+++ b/java/res/xml-hu/kbd_qwerty.xml
@@ -21,9 +21,9 @@
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyboardHeight="@dimen/keyboardHeight"
-    latin:maxKeyboardHeight="50%p"
+    latin:maxKeyboardHeight="@fraction/maxKeyboardHeight"
+    latin:minKeyboardHeight="@fraction/minKeyboardHeight"
     latin:rowHeight="25%p"
-    latin:keyWidth="10%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
     latin:verticalGap="@dimen/key_bottom_gap"
     latin:popupKeyboardTemplate="@xml/kbd_popup_template"
diff --git a/java/res/xml-iw/kbd_qwerty.xml b/java/res/xml-iw/kbd_qwerty.xml
index 4cd565b..e93927f 100644
--- a/java/res/xml-iw/kbd_qwerty.xml
+++ b/java/res/xml-iw/kbd_qwerty.xml
@@ -21,9 +21,9 @@
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyboardHeight="@dimen/keyboardHeight"
-    latin:maxKeyboardHeight="50%p"
+    latin:maxKeyboardHeight="@fraction/maxKeyboardHeight"
+    latin:minKeyboardHeight="@fraction/minKeyboardHeight"
     latin:rowHeight="25%p"
-    latin:keyWidth="10%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
     latin:verticalGap="@dimen/key_bottom_gap"
     latin:popupKeyboardTemplate="@xml/kbd_popup_template"
diff --git a/java/res/xml-nb/kbd_qwerty.xml b/java/res/xml-nb/kbd_qwerty.xml
index 7b20ca2..e7a743c 100644
--- a/java/res/xml-nb/kbd_qwerty.xml
+++ b/java/res/xml-nb/kbd_qwerty.xml
@@ -21,7 +21,8 @@
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyboardHeight="@dimen/keyboardHeight"
-    latin:maxKeyboardHeight="50%p"
+    latin:maxKeyboardHeight="@fraction/maxKeyboardHeight"
+    latin:minKeyboardHeight="@fraction/minKeyboardHeight"
     latin:rowHeight="25%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
     latin:verticalGap="@dimen/key_bottom_gap"
diff --git a/java/res/xml-pl/kbd_qwerty.xml b/java/res/xml-pl/kbd_qwerty.xml
index fad28d6..7d9476d 100644
--- a/java/res/xml-pl/kbd_qwerty.xml
+++ b/java/res/xml-pl/kbd_qwerty.xml
@@ -21,14 +21,14 @@
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyboardHeight="@dimen/keyboardHeight"
-    latin:maxKeyboardHeight="50%p"
+    latin:maxKeyboardHeight="@fraction/maxKeyboardHeight"
+    latin:minKeyboardHeight="@fraction/minKeyboardHeight"
     latin:rowHeight="25%p"
-    latin:keyWidth="10%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
     latin:verticalGap="@dimen/key_bottom_gap"
     latin:popupKeyboardTemplate="@xml/kbd_popup_template"
     latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column"
-    latin:keyboardLocale="pl_PL"
+    latin:keyboardLocale="pl"
 >
     <include
         latin:keyboardLayout="@xml/kbd_qwerty_rows" />
diff --git a/java/res/xml-pt/kbd_qwerty.xml b/java/res/xml-pt/kbd_qwerty.xml
new file mode 100644
index 0000000..1a89955
--- /dev/null
+++ b/java/res/xml-pt/kbd_qwerty.xml
@@ -0,0 +1,35 @@
+<?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:keyboardHeight="@dimen/keyboardHeight"
+    latin:maxKeyboardHeight="@fraction/maxKeyboardHeight"
+    latin:minKeyboardHeight="@fraction/minKeyboardHeight"
+    latin:rowHeight="25%p"
+    latin:horizontalGap="@dimen/key_horizontal_gap"
+    latin:verticalGap="@dimen/key_bottom_gap"
+    latin:popupKeyboardTemplate="@xml/kbd_popup_template"
+    latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column"
+    latin:keyboardLocale="pt"
+>
+    <include
+        latin:keyboardLayout="@xml/kbd_qwerty_rows" />
+</Keyboard>
diff --git a/java/res/xml-ru/kbd_qwerty.xml b/java/res/xml-ru/kbd_qwerty.xml
index e5aea58..826818c 100644
--- a/java/res/xml-ru/kbd_qwerty.xml
+++ b/java/res/xml-ru/kbd_qwerty.xml
@@ -21,13 +21,14 @@
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyboardHeight="@dimen/keyboardHeight"
-    latin:maxKeyboardHeight="50%p"
+    latin:maxKeyboardHeight="@fraction/maxKeyboardHeight"
+    latin:minKeyboardHeight="@fraction/minKeyboardHeight"
     latin:rowHeight="25%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
     latin:verticalGap="@dimen/key_bottom_gap"
     latin:popupKeyboardTemplate="@xml/kbd_popup_template"
     latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column"
-    latin:keyboardLocale="ru_RU"
+    latin:keyboardLocale="ru"
 >
     <include
         latin:keyboardLayout="@xml/kbd_ru_rows" />
diff --git a/java/res/xml-sr/kbd_qwerty.xml b/java/res/xml-sr/kbd_qwerty.xml
index 9782cd5..6116c75 100644
--- a/java/res/xml-sr/kbd_qwerty.xml
+++ b/java/res/xml-sr/kbd_qwerty.xml
@@ -21,7 +21,8 @@
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyboardHeight="@dimen/keyboardHeight"
-    latin:maxKeyboardHeight="50%p"
+    latin:maxKeyboardHeight="@fraction/maxKeyboardHeight"
+    latin:minKeyboardHeight="@fraction/minKeyboardHeight"
     latin:rowHeight="25%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
     latin:verticalGap="@dimen/key_bottom_gap"
diff --git a/java/res/xml-sv/kbd_qwerty.xml b/java/res/xml-sv/kbd_qwerty.xml
index 3ff1679..69f0b3f 100644
--- a/java/res/xml-sv/kbd_qwerty.xml
+++ b/java/res/xml-sv/kbd_qwerty.xml
@@ -21,7 +21,8 @@
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyboardHeight="@dimen/keyboardHeight"
-    latin:maxKeyboardHeight="50%p"
+    latin:maxKeyboardHeight="@fraction/maxKeyboardHeight"
+    latin:minKeyboardHeight="@fraction/minKeyboardHeight"
     latin:rowHeight="25%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
     latin:verticalGap="@dimen/key_bottom_gap"
diff --git a/java/res/xml-sw600dp-land/kbd_popup_template.xml b/java/res/xml-sw600dp-land/kbd_popup_template.xml
new file mode 100644
index 0000000..2c1d190
--- /dev/null
+++ b/java/res/xml-sw600dp-land/kbd_popup_template.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:keyWidth="5%p"
+    latin:horizontalGap="0px"
+    latin:verticalGap="0px"
+    latin:rowHeight="@dimen/popup_key_height"
+    >
+</Keyboard>
diff --git a/java/res/xml-xlarge/kbd_azerty_rows.xml b/java/res/xml-sw600dp/kbd_azerty_rows.xml
similarity index 79%
copy from java/res/xml-xlarge/kbd_azerty_rows.xml
copy to java/res/xml-sw600dp/kbd_azerty_rows.xml
index 564f776..99c56e4 100644
--- a/java/res/xml-xlarge/kbd_azerty_rows.xml
+++ b/java/res/xml-sw600dp/kbd_azerty_rows.xml
@@ -2,7 +2,7 @@
 <!--
 /*
 **
-** Copyright 2010, The Android Open Source Project
+** 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.
@@ -24,16 +24,13 @@
     <include
         latin:keyboardLayout="@xml/kbd_key_styles" />
     <Row
-        latin:keyWidth="8.272%p"
+        latin:keyWidth="9.0%p"
+        latin:rowEdgeFlags="top"
     >
         <Key
-            latin:keyStyle="tabKeyStyle"
-            latin:keyLabelOption="alignLeft"
-            latin:keyWidth="7.949%p"
-            latin:keyEdgeFlags="left" />
-        <Key
             latin:keyLabel="a"
-            latin:popupCharacters="@string/alternates_for_a" />
+            latin:popupCharacters="@string/alternates_for_a"
+            latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="z"
             latin:popupCharacters="@string/alternates_for_z" />
@@ -63,20 +60,17 @@
             latin:popupCharacters="@string/alternates_for_p" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="9.331%p"
+            latin:keyXPos="-10.0%p"
+            latin:keyWidth="fillBoth"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
-        latin:keyWidth="8.157%p"
+        latin:keyWidth="9.0%p"
     >
         <Key
-            latin:keyStyle="toSymbolKeyStyle"
-            latin:keyLabelOption="alignLeft"
-            latin:keyWidth="10.167%p"
-            latin:keyEdgeFlags="left" />
-        <Key
             latin:keyLabel="q"
-            latin:popupCharacters="@string/alternates_for_q" />
+            latin:popupCharacters="@string/alternates_for_q"
+            latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="s"
             latin:popupCharacters="@string/alternates_for_s" />
@@ -99,19 +93,19 @@
             latin:keyLabel="l"
             latin:popupCharacters="@string/alternates_for_l" />
         <Key
-            latin:keyLabel="m"
-            latin:keyEdgeFlags="right" />
+            latin:keyLabel="m" />
         <Key
             latin:keyStyle="returnKeyStyle"
-            latin:keyWidth="8.593%p"
+            latin:keyXPos="-14.6%p"
+            latin:keyWidth="fillBoth"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
-        latin:keyWidth="8.042%p"
+        latin:keyWidth="8.9%p"
     >
         <Key
             latin:keyStyle="shiftKeyStyle"
-            latin:keyWidth="15.192%p"
+            latin:keyWidth="10.0%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="w"
@@ -130,11 +124,7 @@
             latin:keyLabel="n"
             latin:popupCharacters="@string/alternates_for_n" />
         <Key
-            latin:keyLabel="\'"
-            latin:manualTemporaryUpperCaseCode="58"
-            latin:keyHintIcon="@drawable/key_hint_colon_holo"
-            latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_colon_large_holo"
-            latin:popupCharacters=":" />
+            latin:keyLabel="\'" />
         <switch>
             <case
                 latin:mode="email"
@@ -159,11 +149,9 @@
                     latin:popupCharacters="\?" />
             </default>
         </switch>
-        <Key
-            latin:keyStyle="shiftKeyStyle"
-            latin:keyWidth="12.530%p"
-            latin:keyEdgeFlags="right" />
-    </Row>
+        <include
+            latin:keyboardLayout="@xml/kbd_row3_right" />
+   </Row>
     <include
         latin:keyboardLayout="@xml/kbd_qwerty_row4" />
 </merge>
diff --git a/java/res/xml-sw600dp/kbd_key_styles.xml b/java/res/xml-sw600dp/kbd_key_styles.xml
new file mode 100644
index 0000000..a98ffe6
--- /dev/null
+++ b/java/res/xml-sw600dp/kbd_key_styles.xml
@@ -0,0 +1,214 @@
+<?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"
+>
+    <!-- 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>
+    <!-- Functional key styles -->
+    <switch>
+        <case
+            latin:colorScheme="white"
+        >
+            <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:keyHintIcon="@drawable/hint_popup_holo"
+                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:keyHintIcon="@drawable/hint_popup_holo"
+                        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: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:keyHintIcon="@drawable/hint_popup_holo"
+                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:keyHintIcon="@drawable/hint_popup_holo"
+                        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>
+    </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:parentStyle="functionalKeyStyle" />
+    <key-style
+        latin:styleName="toSymbolKeyStyle"
+        latin:code="@integer/key_switch_alpha_symbol"
+        latin:keyLabel="@string/label_to_symbol_key"
+        latin:keyLabelOption="fontNormal"
+        latin:parentStyle="functionalKeyStyle" />
+    <key-style
+        latin:styleName="toAlphaKeyStyle"
+        latin:code="@integer/key_switch_alpha_symbol"
+        latin:keyLabel="@string/label_to_alpha_key"
+        latin:keyLabelOption="fontNormal"
+        latin:parentStyle="functionalKeyStyle" />
+    <key-style
+        latin:styleName="moreKeyStyle"
+        latin:code="@integer/key_shift"
+        latin:keyLabel="@string/label_more_key"
+        latin:keyLabelOption="fontNormal"
+        latin:parentStyle="functionalKeyStyle"
+        latin:isSticky="true" />
+    <key-style
+        latin:styleName="comKeyStyle"
+        latin:keyLabel="@string/keylabel_for_popular_domain"
+        latin:keyLabelOption="fontNormal"
+        latin:keyOutputText="@string/keylabel_for_popular_domain"
+        latin:keyHintIcon="@drawable/hint_popup_holo"
+        latin:popupCharacters="@string/alternates_for_popular_domain" />
+    <switch>
+        <case
+            latin:passwordInput="true"
+        >
+            <key-style
+                latin:styleName="nonPasswordSymbolKeyStyle"
+                latin:enabled="false" />
+        </case>
+        <!-- latin:passwordInput="false" -->
+        <default>
+            <key-style
+                latin:styleName="nonPasswordSymbolKeyStyle"
+                latin:enabled="true" />
+        </default>
+    </switch>
+</merge>
diff --git a/java/res/xml-sw600dp/kbd_number.xml b/java/res/xml-sw600dp/kbd_number.xml
new file mode 100644
index 0000000..f9096fc
--- /dev/null
+++ b/java/res/xml-sw600dp/kbd_number.xml
@@ -0,0 +1,193 @@
+<?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:keyboardHeight="@dimen/keyboardHeight"
+    latin:maxKeyboardHeight="50%p"
+    latin:rowHeight="25%p"
+    latin:keyWidth="16.75%p"
+    latin:horizontalGap="@dimen/key_horizontal_gap"
+    latin:verticalGap="@dimen/key_bottom_gap"
+    latin:popupKeyboardTemplate="@xml/kbd_popup_template"
+    latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column"
+>
+    <include
+        latin:keyboardLayout="@xml/kbd_key_styles" />
+    <include
+        latin:keyboardLayout="@xml/kbd_numkey_styles" />
+    <switch>
+        <case
+            latin:passwordInput="true"
+        >
+            <!-- This row is intentionally not marked as a top row -->
+            <Row>
+                <Key
+                    latin:keyStyle="num1KeyStyle"
+                    latin:keyXPos="24.875%p" />
+                <Key
+                    latin:keyStyle="num2KeyStyle" />
+                <Key
+                    latin:keyStyle="num3KeyStyle" />
+                <Key
+                    latin:keyStyle="deleteKeyStyle"
+                    latin:keyXPos="-11.00%p"
+                    latin:keyWidth="fillRight"
+                    latin:keyEdgeFlags="right" />
+            </Row>
+            <Row>
+                <Key
+                    latin:keyStyle="num4KeyStyle"
+                    latin:keyXPos="24.875%p" />
+                <Key
+                    latin:keyStyle="num5KeyStyle" />
+                <Key
+                    latin:keyStyle="num6KeyStyle" />
+                <Key
+                    latin:keyStyle="returnKeyStyle"
+                    latin:keyXPos="-11.00%p"
+                    latin:keyWidth="fillRight"
+                    latin:keyEdgeFlags="right" />
+            </Row>
+            <Row>
+                <Key
+                    latin:keyStyle="num7KeyStyle"
+                    latin:keyXPos="24.875%p" />
+                <Key
+                    latin:keyStyle="num8KeyStyle" />
+                <Key
+                    latin:keyStyle="num9KeyStyle" />
+            </Row>
+            <!-- This row is intentionally not marked as a bottom row -->
+            <Row>
+                <Key
+                    latin:keyStyle="tabKeyStyle"
+                    latin:keyWidth="11.00%p"
+                    latin:keyEdgeFlags="left" />
+                <Spacer
+                    latin:keyXPos="24.875%p" />
+                <Key
+                    latin:keyStyle="num0KeyStyle" />
+                <Spacer />
+                <Key
+                    latin:keyStyle="micOrSettingsKeyStyle"
+                    latin:keyXPos="-11.00%p"
+                    latin:keyWidth="fillRight"
+                    latin:keyEdgeFlags="right" />
+            </Row>
+        </case>
+        <!-- latin:passwordInput="false" -->
+        <default>
+            <!-- This row is intentionally not marked as a top row -->
+            <Row>
+                <Key
+                    latin:keyLabel="-"
+                    latin:keyXPos="11.00%p"
+                    latin:keyWidth="9.25%p" />
+                <Key
+                    latin:keyLabel="+"
+                    latin:keyWidth="9.25%p" />
+                <Key
+                    latin:keyLabel="."
+                    latin:keyWidth="9.25%p" />
+                <Key
+                    latin:keyLabel="1"
+                    latin:keyXPos="38.75%p" />
+                <Key
+                    latin:keyLabel="2" />
+                <Key
+                    latin:keyLabel="3" />
+                <Key
+                    latin:keyStyle="deleteKeyStyle"
+                    latin:keyXPos="-11.00%p"
+                    latin:keyWidth="fillBoth"
+                    latin:keyEdgeFlags="right" />
+            </Row>
+            <Row>
+                <Key
+                    latin:keyLabel="*"
+                    latin:keyXPos="11.00%p"
+                    latin:keyWidth="9.25%p" />
+                <Key
+                    latin:keyLabel="/"
+                    latin:keyWidth="9.25%p" />
+                <Key
+                    latin:keyLabel=","
+                    latin:keyWidth="9.25%p" />
+                <Key
+                    latin:keyLabel="4"
+                    latin:keyXPos="38.75%p" />
+                <Key
+                    latin:keyLabel="5" />
+                <Key
+                    latin:keyLabel="6" />
+                <Key
+                    latin:keyStyle="returnKeyStyle"
+                    latin:keyXPos="-11.00%p"
+                    latin:keyWidth="fillBoth"
+                    latin:keyEdgeFlags="right" />
+            </Row>
+            <Row>
+                <!-- There is an empty area below the "More" key and left of the "(" key. To
+                     ignore the touch event on the area, "(" is intentionally not marked as a left
+                     edge key. -->
+                <Key
+                    latin:keyLabel="("
+                    latin:keyXPos="11.00%p"
+                    latin:keyWidth="9.25%p" />
+                <Key
+                    latin:keyLabel=")"
+                    latin:keyWidth="9.25%p" />
+                <Key
+                    latin:keyLabel="="
+                    latin:keyWidth="9.25%p" />
+                <Key
+                    latin:keyLabel="7"
+                    latin:keyXPos="38.75%p" />
+                <Key
+                    latin:keyLabel="8" />
+                <Key
+                    latin:keyLabel="9" />
+            </Row>
+            <!-- This row is intentionally not marked as a bottom row -->
+            <Row>
+                <Key
+                    latin:keyStyle="tabKeyStyle"
+                    latin:keyWidth="11.00%p"
+                    latin:keyEdgeFlags="left" />
+                <Key
+                    latin:keyStyle="nonSpecialBackgroundSpaceKeyStyle"
+                    latin:keyWidth="27.75%p" />
+                <Key
+                    latin:keyLabel="*"
+                    latin:keyXPos="38.75%p" />
+                <Key
+                    latin:keyLabel="0" />
+                <Key
+                    latin:keyLabel="#" />
+                <Key
+                    latin:keyStyle="micOrSettingsKeyStyle"
+                    latin:keyXPos="-11.00%p"
+                    latin:keyWidth="fillBoth"
+                    latin:keyEdgeFlags="right" />
+            </Row>
+        </default>
+    </switch>
+</Keyboard>
diff --git a/java/res/xml-sw600dp/kbd_numkey_styles.xml b/java/res/xml-sw600dp/kbd_numkey_styles.xml
new file mode 100644
index 0000000..b10dc93
--- /dev/null
+++ b/java/res/xml-sw600dp/kbd_numkey_styles.xml
@@ -0,0 +1,150 @@
+<?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
new file mode 100644
index 0000000..b20bb24
--- /dev/null
+++ b/java/res/xml-sw600dp/kbd_phone.xml
@@ -0,0 +1,130 @@
+<?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:keyboardHeight="@dimen/keyboardHeight"
+    latin:maxKeyboardHeight="50%p"
+    latin:rowHeight="25%p"
+    latin:keyWidth="16.75%p"
+    latin:horizontalGap="@dimen/key_horizontal_gap"
+    latin:verticalGap="@dimen/key_bottom_gap"
+    latin:popupKeyboardTemplate="@xml/kbd_popup_template"
+    latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column"
+>
+    <include
+        latin:keyboardLayout="@xml/kbd_key_styles" />
+    <include
+        latin:keyboardLayout="@xml/kbd_numkey_styles" />
+    <!-- This row is intentionally not marked as a top row -->
+    <Row>
+        <Key
+            latin:code="45"
+            latin:keyLabel=" - "
+            latin:keyXPos="15.625%p"
+            latin:keyWidth="9.25%p" />
+        <Key
+            latin:code="43"
+            latin:keyLabel=" + "
+            latin:keyWidth="9.25%p" />
+        <Key
+            latin:keyStyle="num1KeyStyle"
+            latin:keyXPos="38.867%p" />
+        <Key
+            latin:keyStyle="num2KeyStyle" />
+        <Key
+            latin:keyStyle="num3KeyStyle" />
+        <Key
+            latin:keyStyle="deleteKeyStyle"
+            latin:keyXPos="-11.00%p"
+            latin:keyWidth="fillBoth"
+            latin:keyEdgeFlags="right" />
+    </Row>
+    <Row>
+        <Key
+            latin:code="44"
+            latin:keyLabel=" , "
+            latin:keyXPos="15.625%p"
+            latin:keyWidth="9.25%p" />
+        <Key
+            latin:code="46"
+            latin:keyLabel=" . "
+            latin:keyWidth="9.25%p" />
+        <Key
+            latin:keyStyle="num4KeyStyle"
+            latin:keyXPos="38.867%p" />
+        <Key
+            latin:keyStyle="num5KeyStyle" />
+        <Key
+            latin:keyStyle="num6KeyStyle" />
+        <Key
+            latin:keyStyle="returnKeyStyle"
+            latin:keyXPos="-11.00%p"
+            latin:keyWidth="fillBoth"
+            latin:keyEdgeFlags="right" />
+    </Row>
+    <Row>
+        <Key
+            latin:keyStyle="moreKeyStyle"
+            latin:keyWidth="11.0%p"
+            latin:keyEdgeFlags="left" />
+        <!-- There is an empty area below the "More" key and left of the "(" key.  To ignore
+             the touch event on the area, "(" is intentionally not marked as a left edge key. -->
+        <Key
+            latin:code="40"
+            latin:keyLabel=" ( "
+            latin:keyXPos="15.625%p"
+            latin:keyWidth="9.25%p" />
+        <Key
+            latin:code="41"
+            latin:keyLabel=" ) "
+            latin:keyWidth="9.25%p" />
+        <Key
+            latin:keyStyle="num7KeyStyle"
+            latin:keyXPos="38.867%p" />
+        <Key
+            latin:keyStyle="num8KeyStyle" />
+        <Key
+            latin:keyStyle="num9KeyStyle" />
+        </Row>
+    <!-- This row is intentionally not marked as a bottom row -->
+    <Row>
+        <Key
+            latin:keyStyle="tabKeyStyle"
+            latin:keyWidth="11.00%p"
+            latin:keyEdgeFlags="left" />
+        <Key
+            latin:keyStyle="nonSpecialBackgroundSpaceKeyStyle"
+            latin:keyXPos="15.625%p"
+            latin:keyWidth="18.67%p" />
+        <Key
+            latin:keyStyle="numStarKeyStyle"
+            latin:keyXPos="38.867%p" />
+        <Key
+            latin:keyStyle="num0KeyStyle" />
+        <Key
+            latin:keyStyle="numPoundKeyStyle" />
+        <Key
+            latin:keyStyle="micOrSettingsKeyStyle"
+            latin:keyXPos="-11.00%p"
+            latin:keyWidth="fillBoth"
+            latin:keyEdgeFlags="right" />
+    </Row>
+</Keyboard>
diff --git a/java/res/xml-sw600dp/kbd_phone_symbols.xml b/java/res/xml-sw600dp/kbd_phone_symbols.xml
new file mode 100644
index 0000000..7f62673
--- /dev/null
+++ b/java/res/xml-sw600dp/kbd_phone_symbols.xml
@@ -0,0 +1,140 @@
+<?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:keyboardHeight="@dimen/keyboardHeight"
+    latin:maxKeyboardHeight="50%p"
+    latin:rowHeight="25%p"
+    latin:keyWidth="16.75%p"
+    latin:horizontalGap="@dimen/key_horizontal_gap"
+    latin:verticalGap="@dimen/key_bottom_gap"
+    latin:popupKeyboardTemplate="@xml/kbd_popup_template"
+    latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column"
+>
+    <include
+        latin:keyboardLayout="@xml/kbd_key_styles" />
+    <include
+        latin:keyboardLayout="@xml/kbd_numkey_styles" />
+    <!-- This row is intentionally not marked as a top row -->
+    <Row>
+        <Key
+            latin:code="45"
+            latin:keyLabel=" - "
+            latin:keyXPos="11.00%p"
+            latin:keyWidth="9.25%p" />
+        <Key
+            latin:code="43"
+            latin:keyLabel=" + "
+            latin:keyWidth="9.25%p" />
+        <Key
+            latin:code="44"
+            latin:keyLabel="@string/label_pause_key"
+            latin:keyWidth="9.25%p" />
+        <Key
+            latin:keyStyle="num1KeyStyle"
+            latin:keyXPos="38.867%p" />
+        <Key
+            latin:keyStyle="num2KeyStyle" />
+        <Key
+            latin:keyStyle="num3KeyStyle" />
+        <Key
+            latin:keyStyle="deleteKeyStyle"
+            latin:keyXPos="-11.00%p"
+            latin:keyWidth="fillBoth"
+            latin:keyEdgeFlags="right" />
+    </Row>
+    <Row>
+        <Key
+            latin:code="44"
+            latin:keyLabel=" , "
+            latin:keyXPos="11.00%p"
+            latin:keyWidth="9.25%p" />
+        <Key
+            latin:code="46"
+            latin:keyLabel=" . "
+            latin:keyWidth="9.25%p" />
+        <Key
+            latin:code="59"
+            latin:keyLabel="@string/label_wait_key"
+            latin:keyWidth="9.25%p" />
+        <Key
+            latin:keyStyle="num4KeyStyle"
+            latin:keyXPos="38.867%p" />
+        <Key
+            latin:keyStyle="num5KeyStyle" />
+        <Key
+            latin:keyStyle="num6KeyStyle" />
+        <Key
+            latin:keyStyle="returnKeyStyle"
+            latin:keyXPos="-11.00%p"
+            latin:keyWidth="fillBoth"
+            latin:keyEdgeFlags="right" />
+    </Row>
+    <Row>
+        <Key
+            latin:keyStyle="moreKeyStyle"
+            latin:keyWidth="11.00%p"
+            latin:keyEdgeFlags="left" />
+        <!-- There is an empty area below the "More" key and left of the "(" key.  To ignore
+             the touch event on the area, "(" is intentionally not marked as a left edge key. -->
+        <Key
+            latin:code="40"
+            latin:keyLabel=" ( "
+            latin:keyWidth="9.25%p" />
+        <Key
+            latin:code="41"
+            latin:keyLabel=" ) "
+            latin:keyWidth="9.25%p" />
+        <Key
+            latin:code="78"
+            latin:keyLabel=" N "
+            latin:keyWidth="9.25%p" />
+        <Key
+            latin:keyStyle="num7KeyStyle"
+            latin:keyXPos="38.867%p" />
+        <Key
+            latin:keyStyle="num8KeyStyle" />
+        <Key
+            latin:keyStyle="num9KeyStyle" />
+    </Row>
+    <!-- This row is intentionally not marked as a bottom row -->
+    <Row>
+        <Key
+            latin:keyStyle="tabKeyStyle"
+            latin:keyWidth="11.00%p"
+            latin:keyEdgeFlags="left" />
+        <Key
+            latin:keyStyle="nonSpecialBackgroundSpaceKeyStyle"
+            latin:keyWidth="27.75%p" />
+        <Key
+            latin:keyStyle="numStarKeyStyle"
+            latin:keyXPos="38.867%p" />
+        <Key
+            latin:keyStyle="num0KeyStyle" />
+        <Key
+            latin:keyStyle="numPoundKeyStyle" />
+        <Key
+            latin:keyStyle="micOrSettingsKeyStyle"
+            latin:keyXPos="-11.00%p"
+            latin:keyWidth="fillBoth"
+            latin:keyEdgeFlags="right" />
+    </Row>
+</Keyboard>
diff --git a/java/res/xml-sw600dp/kbd_popup_template.xml b/java/res/xml-sw600dp/kbd_popup_template.xml
new file mode 100644
index 0000000..fff2659
--- /dev/null
+++ b/java/res/xml-sw600dp/kbd_popup_template.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:keyWidth="8%p"
+    latin:horizontalGap="@dimen/key_horizontal_gap"
+    latin:verticalGap="0px"
+    latin:rowHeight="@dimen/popup_key_height"
+    >
+</Keyboard>
diff --git a/java/res/xml-sw600dp/kbd_qwerty.xml b/java/res/xml-sw600dp/kbd_qwerty.xml
new file mode 100644
index 0000000..9541e13
--- /dev/null
+++ b/java/res/xml-sw600dp/kbd_qwerty.xml
@@ -0,0 +1,34 @@
+<?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:keyboardHeight="@dimen/keyboardHeight"
+    latin:maxKeyboardHeight="50%p"
+    latin:rowHeight="25%p"
+    latin:keyWidth="10%p"
+    latin:horizontalGap="@dimen/key_horizontal_gap"
+    latin:verticalGap="@dimen/key_bottom_gap"
+    latin:popupKeyboardTemplate="@xml/kbd_popup_template"
+    latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column"
+>
+    <include
+        latin:keyboardLayout="@xml/kbd_qwerty_rows" />
+</Keyboard>
diff --git a/java/res/xml-xlarge/kbd_qwerty_row1.xml b/java/res/xml-sw600dp/kbd_qwerty_row1.xml
similarity index 83%
copy from java/res/xml-xlarge/kbd_qwerty_row1.xml
copy to java/res/xml-sw600dp/kbd_qwerty_row1.xml
index f513559..b781d68 100644
--- a/java/res/xml-xlarge/kbd_qwerty_row1.xml
+++ b/java/res/xml-sw600dp/kbd_qwerty_row1.xml
@@ -2,7 +2,7 @@
 <!--
 /*
 **
-** Copyright 2010, The Android Open Source Project
+** 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.
@@ -21,18 +21,14 @@
 <merge
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
 >
-    <!-- This row is intentionally not marked as a top row -->
     <Row
-        latin:keyWidth="8.272%p"
+        latin:keyWidth="9.0%p"
+        latin:rowEdgeFlags="top"
     >
         <Key
-            latin:keyStyle="tabKeyStyle"
-            latin:keyLabelOption="alignLeft"
-            latin:keyWidth="7.949%p"
-            latin:keyEdgeFlags="left" />
-        <Key
             latin:keyLabel="q"
-            latin:popupCharacters="@string/alternates_for_q" />
+            latin:popupCharacters="@string/alternates_for_q"
+            latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="w"
             latin:popupCharacters="@string/alternates_for_w" />
@@ -62,7 +58,8 @@
             latin:popupCharacters="@string/alternates_for_p" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="9.331%p"
+            latin:keyXPos="-10.0%p"
+            latin:keyWidth="fillBoth"
             latin:keyEdgeFlags="right" />
     </Row>
 </merge>
diff --git a/java/res/xml-xlarge/kbd_qwerty_row2.xml b/java/res/xml-sw600dp/kbd_qwerty_row2.xml
similarity index 82%
copy from java/res/xml-xlarge/kbd_qwerty_row2.xml
copy to java/res/xml-sw600dp/kbd_qwerty_row2.xml
index 02bd0a6..05b005a 100644
--- a/java/res/xml-xlarge/kbd_qwerty_row2.xml
+++ b/java/res/xml-sw600dp/kbd_qwerty_row2.xml
@@ -2,7 +2,7 @@
 <!--
 /*
 **
-** Copyright 2010, The Android Open Source Project
+** 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.
@@ -22,16 +22,13 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
 >
     <Row
-        latin:keyWidth="8.157%p"
+        latin:keyWidth="9.0%p"
     >
         <Key
-            latin:keyStyle="toSymbolKeyStyle"
-            latin:keyLabelOption="alignLeft"
-            latin:keyWidth="11.167%p"
-            latin:keyEdgeFlags="left" />
-        <Key
             latin:keyLabel="a"
-            latin:popupCharacters="@string/alternates_for_a" />
+            latin:popupCharacters="@string/alternates_for_a"
+            latin:keyXPos="4.5%p"
+            latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="s"
             latin:popupCharacters="@string/alternates_for_s" />
@@ -55,7 +52,8 @@
             latin:popupCharacters="@string/alternates_for_l" />
         <Key
             latin:keyStyle="returnKeyStyle"
-            latin:keyWidth="15.750%p"
+            latin:keyXPos="-14.6%p"
+            latin:keyWidth="fillBoth"
             latin:keyEdgeFlags="right" />
     </Row>
 </merge>
diff --git a/java/res/xml-xlarge/kbd_qwerty_row3.xml b/java/res/xml-sw600dp/kbd_qwerty_row3.xml
similarity index 90%
rename from java/res/xml-xlarge/kbd_qwerty_row3.xml
rename to java/res/xml-sw600dp/kbd_qwerty_row3.xml
index b7e9bcf..4118ee1 100644
--- a/java/res/xml-xlarge/kbd_qwerty_row3.xml
+++ b/java/res/xml-sw600dp/kbd_qwerty_row3.xml
@@ -2,7 +2,7 @@
 <!--
 /*
 **
-** Copyright 2010, The Android Open Source Project
+** 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.
@@ -22,11 +22,11 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
 >
     <Row
-        latin:keyWidth="8.042%p"
+        latin:keyWidth="8.9%p"
     >
         <Key
             latin:keyStyle="shiftKeyStyle"
-            latin:keyWidth="15.192%p"
+            latin:keyWidth="10.0%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="z"
@@ -70,9 +70,7 @@
                     latin:popupCharacters="\?" />
             </default>
         </switch>
-        <Key
-            latin:keyStyle="shiftKeyStyle"
-            latin:keyWidth="12.530%p"
-            latin:keyEdgeFlags="right" />
+        <include
+            latin:keyboardLayout="@xml/kbd_row3_right" />
     </Row>
 </merge>
diff --git a/java/res/xml-sw600dp/kbd_qwerty_row4.xml b/java/res/xml-sw600dp/kbd_qwerty_row4.xml
new file mode 100644
index 0000000..3e5492e
--- /dev/null
+++ b/java/res/xml-sw600dp/kbd_qwerty_row4.xml
@@ -0,0 +1,170 @@
+<?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"
+>
+    <!-- This row is intentionally not marked as a bottom row -->
+    <Row
+        latin:keyWidth="8.9%p"
+    >
+        <Key
+            latin:keyStyle="toSymbolKeyStyle"
+            latin:keyLabelOption="alignLeft"
+            latin:keyWidth="13.0%p"
+            latin:keyEdgeFlags="left" />
+        <Key
+            latin:keyStyle="tabKeyStyle" />
+        <switch>
+            <case
+                latin:mode="email"
+            >
+                <Key
+                    latin:keyStyle="comKeyStyle" />
+            </case>
+            <case
+                latin:mode="url"
+            >
+                <Key
+                    latin:keyStyle="comKeyStyle" />
+            </case>
+            <default>
+                <Key
+                    latin:keyLabel="/"
+                    latin:manualTemporaryUpperCaseCode="64"
+                    latin:keyHintIcon="@drawable/key_hint_at_holo"
+                    latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_at_large_holo"
+                    latin:popupCharacters="\@" />
+            </default>
+        </switch>
+        <Key
+            latin:keyStyle="spaceKeyStyle"
+            latin:keyXPos="30.750%p"
+            latin:keyWidth="39.750%p" />
+        <switch>
+            <case
+                latin:languageCode="ru"
+            >
+                <switch>
+                    <case
+                        latin:mode="email"
+                    >
+                        <Key
+                            latin:keyLabel="-"
+                            latin:keyWidth="9.750%p" />
+                    </case>
+                    <case
+                        latin:mode="url"
+                    >
+                        <Key
+                            latin:keyLabel="/"
+                            latin:manualTemporaryUpperCaseCode="58"
+                            latin:keyHintIcon="@drawable/key_hint_colon_holo"
+                            latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_colon_large_holo"
+                            latin:popupCharacters=":"
+                            latin:keyWidth="9.750%p" />
+                    </case>
+                    <default>
+                        <Key
+                            latin:keyLabel="\?"
+                            latin:manualTemporaryUpperCaseCode="95"
+                            latin:keyHintIcon="@drawable/key_hint_underline_holo"
+                            latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_underline_large_holo"
+                            latin:popupCharacters="_"
+                            latin:keyWidth="9.750%p" />
+                    </default>
+                </switch>
+                <switch>
+                    <case
+                        latin:mode="email"
+                    >
+                        <Key
+                            latin:keyLabel="_"
+                            latin:keyWidth="9.750%p" />
+                    </case>
+                    <default>
+                        <Key
+                            latin:keyLabel="!"
+                            latin:manualTemporaryUpperCaseCode="39"
+                            latin:keyHintIcon="@drawable/key_hint_quote_holo"
+                            latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_quote_large_holo"
+                            latin:popupCharacters="\'"
+                            latin:keyWidth="9.750%p" />
+                    </default>
+                </switch>
+            </case>
+            <!-- not languageCode="ru" -->
+            <default>
+                <switch>
+                    <case
+                        latin:mode="email"
+                    >
+                        <Key
+                            latin:keyLabel="-"
+                            latin:keyWidth="9.750%p" />
+                    </case>
+                    <case
+                        latin:mode="url"
+                    >
+                        <Key
+                            latin:keyLabel="/"
+                            latin:manualTemporaryUpperCaseCode="58"
+                            latin:keyHintIcon="@drawable/key_hint_colon_holo"
+                            latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_colon_large_holo"
+                            latin:popupCharacters=":"
+                            latin:keyWidth="9.750%p" />
+                    </case>
+                    <default>
+                        <Key
+                            latin:keyLabel="\'"
+                            latin:manualTemporaryUpperCaseCode="34"
+                            latin:keyHintIcon="@drawable/key_hint_quote_holo"
+                            latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_quote_large_holo"
+                            latin:popupCharacters="&quot;"
+                            latin:keyWidth="9.750%p" />
+                    </default>
+                </switch>
+                <switch>
+                    <case
+                        latin:mode="email"
+                    >
+                        <Key
+                            latin:keyLabel="_"
+                            latin:keyWidth="9.750%p" />
+                    </case>
+                    <default>
+                        <Key
+                            latin:keyLabel="-"
+                            latin:manualTemporaryUpperCaseCode="95"
+                            latin:keyHintIcon="@drawable/key_hint_underline_holo"
+                            latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_underline_large_holo"
+                            latin:popupCharacters="_"
+                            latin:keyWidth="9.750%p" />
+                    </default>
+                </switch>
+            </default>
+        </switch>
+        <Key
+            latin:keyStyle="micOrSettingsKeyStyle"
+            latin:keyXPos="-10.0%p"
+            latin:keyWidth="fillBoth"
+            latin:keyEdgeFlags="right" />
+    </Row>
+</merge>
diff --git a/java/res/xml-sw600dp/kbd_qwerty_rows.xml b/java/res/xml-sw600dp/kbd_qwerty_rows.xml
new file mode 100644
index 0000000..a2d26b3
--- /dev/null
+++ b/java/res/xml-sw600dp/kbd_qwerty_rows.xml
@@ -0,0 +1,34 @@
+<?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"
+>
+    <include
+        latin:keyboardLayout="@xml/kbd_key_styles" />
+    <include
+        latin:keyboardLayout="@xml/kbd_qwerty_row1" />
+    <include
+        latin:keyboardLayout="@xml/kbd_qwerty_row2" />
+    <include
+        latin:keyboardLayout="@xml/kbd_qwerty_row3" />
+    <include
+        latin:keyboardLayout="@xml/kbd_qwerty_row4" />
+</merge>
diff --git a/java/res/xml-xlarge/kbd_qwerty_rows_scandinavia.xml b/java/res/xml-sw600dp/kbd_qwerty_rows_scandinavia.xml
similarity index 84%
rename from java/res/xml-xlarge/kbd_qwerty_rows_scandinavia.xml
rename to java/res/xml-sw600dp/kbd_qwerty_rows_scandinavia.xml
index fb2034f..0bdcd21 100644
--- a/java/res/xml-xlarge/kbd_qwerty_rows_scandinavia.xml
+++ b/java/res/xml-sw600dp/kbd_qwerty_rows_scandinavia.xml
@@ -2,7 +2,7 @@
 <!--
 /*
 **
-** Copyright 2010, The Android Open Source Project
+** 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.
@@ -24,16 +24,14 @@
     <include
         latin:keyboardLayout="@xml/kbd_key_styles" />
     <Row
-        latin:keyWidth="7.520%p"
+        latin:keyWidth="8.0%p"
+        latin:rowEdgeFlags="top"
     >
         <Key
-            latin:keyStyle="tabKeyStyle"
-            latin:keyLabelOption="alignLeft"
-            latin:keyWidth="7.949%p"
-            latin:keyEdgeFlags="left" />
-        <Key
             latin:keyLabel="q"
-            latin:popupCharacters="@string/alternates_for_q" />
+            latin:popupCharacters="@string/alternates_for_q"
+            latin:keyXPos="2.15%p"
+            latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="w"
             latin:popupCharacters="@string/alternates_for_w" />
@@ -65,20 +63,17 @@
             latin:keyLabel="å" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="9.331%p"
+            latin:keyXPos="-10.0%p"
+            latin:keyWidth="fillBoth"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
-        latin:keyWidth="7.520%p"
+        latin:keyWidth="8.0%p"
     >
         <Key
-            latin:keyStyle="toSymbolKeyStyle"
-            latin:keyLabelOption="alignLeft"
-            latin:keyWidth="7.949%p"
-            latin:keyEdgeFlags="left" />
-        <Key
             latin:keyLabel="a"
-            latin:popupCharacters="@string/alternates_for_a" />
+            latin:popupCharacters="@string/alternates_for_a"
+            latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="s"
             latin:popupCharacters="@string/alternates_for_s" />
@@ -108,7 +103,8 @@
             latin:popupCharacters="@string/alternates_for_scandinavia_row2_11" />
         <Key
             latin:keyStyle="returnKeyStyle"
-            latin:keyWidth="9.331%p"
+            latin:keyXPos="-14.6%p"
+            latin:keyWidth="fillBoth"
             latin:keyEdgeFlags="right" />
     </Row>
     <include
diff --git a/java/res/xml-xlarge/kbd_qwertz_rows.xml b/java/res/xml-sw600dp/kbd_qwertz_rows.xml
similarity index 87%
copy from java/res/xml-xlarge/kbd_qwertz_rows.xml
copy to java/res/xml-sw600dp/kbd_qwertz_rows.xml
index 3e99f05..9e717c8 100644
--- a/java/res/xml-xlarge/kbd_qwertz_rows.xml
+++ b/java/res/xml-sw600dp/kbd_qwertz_rows.xml
@@ -2,7 +2,7 @@
 <!--
 /*
 **
-** Copyright 2010, The Android Open Source Project
+** 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.
@@ -24,16 +24,13 @@
     <include
         latin:keyboardLayout="@xml/kbd_key_styles" />
     <Row
-        latin:keyWidth="8.272%p"
+        latin:keyWidth="9.0%p"
+        latin:rowEdgeFlags="top"
     >
         <Key
-            latin:keyStyle="tabKeyStyle"
-            latin:keyLabelOption="alignLeft"
-            latin:keyWidth="7.949%p"
-            latin:keyEdgeFlags="left" />
-        <Key
             latin:keyLabel="q"
-            latin:popupCharacters="@string/alternates_for_q" />
+            latin:popupCharacters="@string/alternates_for_q"
+            latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="w"
             latin:popupCharacters="@string/alternates_for_w" />
@@ -63,17 +60,18 @@
             latin:popupCharacters="@string/alternates_for_p" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="9.331%p"
+            latin:keyXPos="-10.0%p"
+            latin:keyWidth="fillBoth"
             latin:keyEdgeFlags="right" />
     </Row>
     <include
         latin:keyboardLayout="@xml/kbd_qwerty_row2" />
     <Row
-        latin:keyWidth="8.042%p"
+        latin:keyWidth="8.9%p"
     >
         <Key
             latin:keyStyle="shiftKeyStyle"
-            latin:keyWidth="15.192%p"
+            latin:keyWidth="10.0%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="y"
@@ -117,11 +115,9 @@
                     latin:popupCharacters="\?" />
             </default>
         </switch>
-        <Key
-            latin:keyStyle="shiftKeyStyle"
-            latin:keyWidth="12.530%p"
-            latin:keyEdgeFlags="right" />
+        <include
+            latin:keyboardLayout="@xml/kbd_row3_right" />
     </Row>
-   <include
+    <include
         latin:keyboardLayout="@xml/kbd_qwerty_row4" />
 </merge>
diff --git a/java/res/xml-sw600dp/kbd_row3_right.xml b/java/res/xml-sw600dp/kbd_row3_right.xml
new file mode 100644
index 0000000..6f7d40b
--- /dev/null
+++ b/java/res/xml-sw600dp/kbd_row3_right.xml
@@ -0,0 +1,68 @@
+<?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:mode="email"
+        >
+            <Key
+                latin:keyLabel="\@"
+                latin:keyXPos="-8.9%p"
+                latin:keyWidth="fillBoth"
+                latin:keyEdgeFlags="right" />
+        </case>
+        <case
+            latin:mode="url"
+        >
+            <Key
+                latin:keyLabel="-"
+                latin:manualTemporaryUpperCaseCode="95"
+                latin:keyHintIcon="@drawable/key_hint_underline_holo"
+                latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_underline_large_holo"
+                latin:popupCharacters="_"
+                latin:keyXPos="-8.9%p"
+                latin:keyWidth="fillBoth"
+                latin:keyEdgeFlags="right" />
+        </case>
+        <case
+            latin:imeAction="actionSearch"
+        >
+            <Key
+                latin:keyLabel=":"
+                latin:manualTemporaryUpperCaseCode="43"
+                latin:keyHintIcon="@drawable/key_hint_plus_holo"
+                latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_plus_large_holo"
+                latin:popupCharacters="+"
+                latin:keyXPos="-8.9%p"
+                latin:keyWidth="fillBoth"
+                latin:keyEdgeFlags="right" />
+        </case>
+        <default>
+            <Key
+                latin:keyStyle="smileyKeyStyle"
+                latin:keyXPos="-8.9%p"
+                latin:keyWidth="fillBoth"
+                latin:keyEdgeFlags="right" />
+        </default>
+    </switch>
+</merge>
diff --git a/java/res/xml-xlarge/kbd_ru_rows.xml b/java/res/xml-sw600dp/kbd_ru_rows.xml
similarity index 68%
copy from java/res/xml-xlarge/kbd_ru_rows.xml
copy to java/res/xml-sw600dp/kbd_ru_rows.xml
index c5cd043..714d1a8 100644
--- a/java/res/xml-xlarge/kbd_ru_rows.xml
+++ b/java/res/xml-sw600dp/kbd_ru_rows.xml
@@ -23,63 +23,48 @@
 >
     <include
         latin:keyboardLayout="@xml/kbd_key_styles" />
-    <!-- This row is intentionally not marked as a top row -->
     <Row
-        latin:keyWidth="7.520%p"
+        latin:keyWidth="8.0%p"
+        latin:rowEdgeFlags="top"
     >
         <Key
-            latin:keyStyle="tabKeyStyle"
-            latin:keyLabelOption="alignLeft"
-            latin:keyWidth="7.949%p"
+            latin:keyLabel="й"
+            latin:keyXPos="2.15%p"
             latin:keyEdgeFlags="left" />
         <Key
-            latin:keyLabel="й"
-            latin:popupCharacters="1" />
+            latin:keyLabel="ц" />
         <Key
-            latin:keyLabel="ц"
-            latin:popupCharacters="2" />
+            latin:keyLabel="у" />
         <Key
-            latin:keyLabel="у"
-            latin:popupCharacters="3" />
-        <Key
-            latin:keyLabel="к"
-            latin:popupCharacters="4" />
+            latin:keyLabel="к" />
         <Key
             latin:keyLabel="е"
             latin:popupCharacters="@string/alternates_for_cyrillic_e" />
         <Key
-            latin:keyLabel="н"
-            latin:popupCharacters="6" />
+            latin:keyLabel="н" />
         <Key
-            latin:keyLabel="г"
-            latin:popupCharacters="7" />
+            latin:keyLabel="г" />
         <Key
-            latin:keyLabel="ш"
-            latin:popupCharacters="8" />
+            latin:keyLabel="ш" />
         <Key
-            latin:keyLabel="щ"
-            latin:popupCharacters="9" />
+            latin:keyLabel="щ" />
         <Key
-            latin:keyLabel="з"
-            latin:popupCharacters="0" />
+            latin:keyLabel="з" />
         <Key
             latin:keyLabel="х" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="9.331%p"
+            latin:keyXPos="-10.0%p"
+            latin:keyWidth="fillBoth"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
-        latin:keyWidth="7.520%p"
+            latin:keyWidth="8.0%p"
     >
         <Key
-            latin:keyStyle="toSymbolKeyStyle"
-            latin:keyLabelOption="alignLeft"
-            latin:keyWidth="7.949%p"
+            latin:keyLabel="ф"
             latin:keyEdgeFlags="left" />
         <Key
-            latin:keyLabel="ф" />
-        <Key
             latin:keyLabel="ы" />
         <Key
             latin:keyLabel="в" />
@@ -101,15 +86,16 @@
             latin:keyLabel="э" />
         <Key
             latin:keyStyle="returnKeyStyle"
-            latin:keyWidth="9.331%p"
+            latin:keyXPos="-14.6%p"
+            latin:keyWidth="fillBoth"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
-        latin:keyWidth="7.520%p"
+        latin:keyWidth="8.0%p"
     >
         <Key
             latin:keyStyle="shiftKeyStyle"
-            latin:keyWidth="12.400%p"
+            latin:keyWidth="10.0%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="я" />
@@ -136,10 +122,8 @@
             latin:keyHintIcon="@drawable/key_hint_comma_holo"
             latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_comma_large_holo"
             latin:popupCharacters="," />
-        <Key
-            latin:keyStyle="shiftKeyStyle"
-            latin:keyWidth="12.400%p"
-            latin:keyEdgeFlags="right" />
+        <include
+            latin:keyboardLayout="@xml/kbd_row3_right" />
     </Row>
     <include
         latin:keyboardLayout="@xml/kbd_qwerty_row4" />
diff --git a/java/res/xml-sw600dp/kbd_sr_rows.xml b/java/res/xml-sw600dp/kbd_sr_rows.xml
new file mode 100644
index 0000000..62c3b71
--- /dev/null
+++ b/java/res/xml-sw600dp/kbd_sr_rows.xml
@@ -0,0 +1,146 @@
+<?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"
+>
+    <include
+        latin:keyboardLayout="@xml/kbd_key_styles" />
+    <Row
+        latin:keyWidth="8.0%p"
+        latin:rowEdgeFlags="top"
+    >
+        <Key
+            latin:keyLabel="љ"
+            latin:keyXPos="2.15%p"
+            latin:keyEdgeFlags="left" />
+        <Key
+            latin:keyLabel="њ" />
+        <Key
+            latin:keyLabel="е" />
+        <Key
+            latin:keyLabel="р" />
+        <Key
+            latin:keyLabel="т" />
+        <Key
+            latin:keyLabel="з" />
+        <Key
+            latin:keyLabel="у" />
+        <Key
+            latin:keyLabel="и" />
+        <Key
+            latin:keyLabel="о" />
+        <Key
+            latin:keyLabel="п" />
+        <Key
+            latin:keyLabel="ш" />
+        <Key
+            latin:keyStyle="deleteKeyStyle"
+            latin:keyXPos="-10.0%p"
+            latin:keyWidth="fillBoth"
+            latin:keyEdgeFlags="right" />
+    </Row>
+    <Row
+        latin:keyWidth="7.9%p"
+    >
+        <Key
+            latin:keyLabel="а"
+            latin:keyEdgeFlags="left" />
+        <Key
+            latin:keyLabel="с" />
+        <Key
+            latin:keyLabel="д" />
+        <Key
+            latin:keyLabel="ф" />
+        <Key
+            latin:keyLabel="г" />
+        <Key
+            latin:keyLabel="х" />
+        <Key
+            latin:keyLabel="ј" />
+        <Key
+            latin:keyLabel="к" />
+        <Key
+            latin:keyLabel="л" />
+        <Key
+            latin:keyLabel="ч" />
+        <Key
+            latin:keyLabel="ћ" />
+        <Key
+            latin:keyStyle="returnKeyStyle"
+            latin:keyXPos="-14.6%p"
+            latin:keyWidth="fillBoth"
+            latin:keyEdgeFlags="right" />
+    </Row>
+    <Row
+        latin:keyWidth="7.5%p"
+    >
+        <Key
+            latin:keyStyle="shiftKeyStyle"
+            latin:keyWidth="8.0%p"
+            latin:keyEdgeFlags="left" />
+        <Key
+            latin:keyLabel="ѕ" />
+        <Key
+            latin:keyLabel="џ" />
+        <Key
+            latin:keyLabel="ц" />
+        <Key
+            latin:keyLabel="в" />
+        <Key
+            latin:keyLabel="б" />
+        <Key
+            latin:keyLabel="н" />
+        <Key
+            latin:keyLabel="м" />
+        <Key
+            latin:keyLabel="ђ" />
+        <Key
+            latin:keyLabel="ж" />
+        <switch>
+            <case
+                latin:mode="email"
+            >
+                <Key
+                    latin:keyLabel="," />
+                <Key
+                    latin:keyLabel="." />
+            </case>
+            <default>
+                <Key
+                    latin:keyLabel=","
+                    latin:manualTemporaryUpperCaseCode="33"
+                    latin:keyHintIcon="@drawable/key_hint_exclamation_holo"
+                    latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_exclamation_large_holo"
+                    latin:popupCharacters="!" />
+                <Key
+                    latin:keyLabel="."
+                    latin:manualTemporaryUpperCaseCode="63"
+                    latin:keyHintIcon="@drawable/key_hint_question_holo"
+                    latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_question_large_holo"
+                    latin:popupCharacters="\?" />
+            </default>
+        </switch>
+        <include
+            latin:keyboardLayout="@xml/kbd_row3_right" />
+    </Row>
+    <include
+        latin:keyboardLayout="@xml/kbd_qwerty_row4" />
+</merge>
diff --git a/java/res/xml-xlarge/kbd_symbols.xml b/java/res/xml-sw600dp/kbd_symbols.xml
similarity index 75%
rename from java/res/xml-xlarge/kbd_symbols.xml
rename to java/res/xml-sw600dp/kbd_symbols.xml
index f1deae0..3593c77 100644
--- a/java/res/xml-xlarge/kbd_symbols.xml
+++ b/java/res/xml-sw600dp/kbd_symbols.xml
@@ -2,7 +2,7 @@
 <!--
 /*
 **
-** Copyright 2010, The Android Open Source Project
+** 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.
@@ -34,14 +34,9 @@
         latin:keyboardLayout="@xml/kbd_currency_key_styles" />
     <!-- This row is intentionally not marked as a top row -->
     <Row
-        latin:keyWidth="8.272%p"
+        latin:keyWidth="9.0%p"
     >
         <Key
-            latin:keyStyle="tabKeyStyle"
-            latin:keyLabelOption="alignLeft"
-            latin:keyWidth="7.949%p"
-            latin:keyEdgeFlags="left" />
-        <Key
             latin:keyLabel="1"
             latin:popupCharacters="¹,½,⅓,¼,⅛" />
         <Key
@@ -70,19 +65,16 @@
             latin:popupCharacters="ⁿ,∅" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="9.331%p"
+            latin:keyXPos="-10.0%p"
+            latin:keyWidth="fillBoth"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
-        latin:keyWidth="8.157%p"
+        latin:keyWidth="9.0%p"
     >
         <Key
-            latin:keyStyle="toAlphaKeyStyle"
-            latin:keyLabelOption="alignLeft"
-            latin:keyWidth="11.167%p"
-            latin:keyEdgeFlags="left" />
-        <Key
-            latin:keyLabel="#" />
+            latin:keyLabel="#"
+            latin:keyXPos="4.5%p" />
         <Key
             latin:keyStyle="currencyKeyStyle" />
         <Key
@@ -107,15 +99,16 @@
             latin:popupCharacters="],},&gt;" />
         <Key
             latin:keyStyle="returnKeyStyle"
-            latin:keyWidth="15.750%p"
+            latin:keyXPos="-14.6%p"
+            latin:keyWidth="fillBoth"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
-        latin:keyWidth="8.042%p"
+        latin:keyWidth="8.9%p"
     >
         <Key
             latin:keyStyle="moreKeyStyle"
-            latin:keyWidth="15.192%p"
+            latin:keyWidth="10.0%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="&lt;"
@@ -137,7 +130,8 @@
                 latin:mode="url"
             >
                 <Key
-                    latin:keyLabel="\'" />
+                    latin:keyLabel="\'"
+                    latin:popupCharacters="‘,’,‚,‛" />
             </case>
             <default>
                 <Key
@@ -151,10 +145,14 @@
                 latin:languageCode="ru"
             >
                 <Key
-                    latin:keyLabel="\'" />
+                    latin:keyLabel="\'"
+                    latin:popupCharacters="‘,’,‚,‛" />
+                <!-- Note: DroidSans doesn't have double-high-reversed-quotation
+                    '\u201f' glyph. -->
+                <!-- latin:popupCharacters="“,”,„,‟,«,»" -->
                 <Key
                     latin:keyLabel="&quot;"
-                    latin:popupCharacters="“,”,«,»,˝" />
+                    latin:popupCharacters="“,”,«,»" />
                 <Key
                     latin:keyLabel="." />
                 <Key
@@ -174,58 +172,54 @@
             </default>
         </switch>
         <Key
-            latin:keyStyle="moreKeyStyle"
-            latin:keyWidth="12.530%p"
-            latin:keyEdgeFlags="right" />
+            latin:keyLabel="/"
+            latin:keyWidth="fillRight" />
     </Row>
     <!-- This row is intentionally not marked as a bottom row -->
     <Row
-        latin:keyWidth="8.042%p"
+        latin:keyWidth="8.9%p"
     >
-        <Spacer
-            latin:horizontalGap="8.362%p" />
-        <switch>
-            <case latin:hasSettingsKey="true">
-                <Key
-                    latin:keyStyle="settingsKeyStyle" />
-            </case>
-            <default>
-                <Spacer
-                    latin:horizontalGap="8.042%p" />
-            </default>
-        </switch>
         <Key
-            latin:keyLabel="/" />
+            latin:keyStyle="toAlphaKeyStyle"
+            latin:keyLabelOption="alignLeft"
+            latin:keyWidth="13.0%p"
+            latin:keyEdgeFlags="left" />
+        <Key
+            latin:keyStyle="tabKeyStyle" />
         <Key
             latin:keyLabel="\@" />
         <Key
             latin:keyStyle="spaceKeyStyle"
-            latin:keyWidth="37.454%p" />
+            latin:keyXPos="30.750%p"
+            latin:keyWidth="39.750%p" />
         <switch>
             <case
                 latin:languageCode="ru"
             >
                 <Key
-                    latin:keyLabel="_" />
+                    latin:keyLabel="_"
+                    latin:keyWidth="9.750%p" />
                 <Key
-                    latin:keyLabel="-" />
+                    latin:keyLabel="-"
+                    latin:keyWidth="9.750%p" />
             </case>
             <default>
-                <!-- Note: DroidSans doesn't have double-high-reversed-quotation '\u201f' glyph. -->
+                <!-- Note: DroidSans doesn't have double-high-reversed-quotation
+                    '\u201f' glyph. -->
+                <!-- latin:popupCharacters="“,”,„,‟,«,»,‘,’,‚,‛" -->
                 <Key
                     latin:keyLabel="&quot;"
-                    latin:popupCharacters="“,”,„,‟,«,»,‘,’,‚,‛" />
+                    latin:popupCharacters="“,”,«,»,‘,’,‚,‛"
+                    latin:keyWidth="9.750%p" />
                 <Key
-                    latin:keyLabel="_" />
+                    latin:keyLabel="_"
+                    latin:keyWidth="9.750%p" />
             </default>
         </switch>
-        <switch>
-            <case
-                latin:voiceKeyEnabled="true"
-            >
-                <Key
-                    latin:keyStyle="micKeyStyle" />
-            </case>
-        </switch>
+        <Key
+            latin:keyStyle="micOrSettingsKeyStyle"
+            latin:keyXPos="-10.0%p"
+            latin:keyWidth="fillBoth"
+            latin:keyEdgeFlags="right" />
     </Row>
 </Keyboard>
diff --git a/java/res/xml-xlarge/kbd_symbols_shift.xml b/java/res/xml-sw600dp/kbd_symbols_shift.xml
similarity index 78%
copy from java/res/xml-xlarge/kbd_symbols_shift.xml
copy to java/res/xml-sw600dp/kbd_symbols_shift.xml
index cc23358..4cef3a7 100644
--- a/java/res/xml-xlarge/kbd_symbols_shift.xml
+++ b/java/res/xml-sw600dp/kbd_symbols_shift.xml
@@ -2,7 +2,7 @@
 <!--
 /*
 **
-** Copyright 2010, The Android Open Source Project
+** 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.
@@ -32,14 +32,9 @@
         latin:keyboardLayout="@xml/kbd_key_styles" />
     <!-- This row is intentionally not marked as a top row -->
     <Row
-        latin:keyWidth="8.272%p"
+        latin:keyWidth="9.0%p"
     >
         <Key
-            latin:keyStyle="tabKeyStyle"
-            latin:keyLabelOption="alignLeft"
-            latin:keyWidth="7.949%p"
-            latin:keyEdgeFlags="left" />
-        <Key
             latin:keyLabel="~" />
         <Key
             latin:keyLabel="`" />
@@ -71,20 +66,17 @@
             latin:keyLabel="Δ" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="9.331%p"
+            latin:keyXPos="-10.0%p"
+            latin:keyWidth="fillBoth"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
-        latin:keyWidth="8.157%p"
+        latin:keyWidth="9.0%p"
     >
         <Key
-            latin:keyStyle="toAlphaKeyStyle"
-            latin:keyLabelOption="alignLeft"
-            latin:keyWidth="11.167%p"
-            latin:keyEdgeFlags="left" />
-        <Key
             latin:keyStyle="nonPasswordSymbolKeyStyle"
-            latin:keyLabel="£" />
+            latin:keyLabel="£"
+            latin:keyXPos="4.5%p" />
         <Key
             latin:keyStyle="nonPasswordSymbolKeyStyle"
             latin:keyLabel="¢" />
@@ -111,15 +103,16 @@
             latin:keyLabel="}" />
         <Key
             latin:keyStyle="returnKeyStyle"
-            latin:keyWidth="15.750%p"
+            latin:keyXPos="-14.6%p"
+            latin:keyWidth="fillBoth"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
-        latin:keyWidth="8.042%p"
+        latin:keyWidth="8.9%p"
     >
         <Key
             latin:keyStyle="moreKeyStyle"
-            latin:keyWidth="15.192%p"
+            latin:keyWidth="10.0%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="\\" />
@@ -145,37 +138,26 @@
         <Key
             latin:keyStyle="nonPasswordSymbolKeyStyle"
             latin:keyLabel="¿" />
-        <Key
-            latin:keyStyle="moreKeyStyle"
-            latin:keyWidth="12.530%p"
-            latin:keyEdgeFlags="right" />
     </Row>
     <!-- This row is intentionally not marked as a bottom row -->
     <Row
-        latin:keyWidth="8.042%p"
+        latin:keyWidth="8.9%p"
     >
-        <Spacer
-            latin:horizontalGap="24.446%p" />
-        <switch>
-            <case latin:hasSettingsKey="true">
-                <Key
-                    latin:keyStyle="settingsKeyStyle" />
-            </case>
-            <default>
-                <Spacer
-                    latin:horizontalGap="8.042%p" />
-            </default>
-        </switch>
+        <Key
+            latin:keyStyle="toAlphaKeyStyle"
+            latin:keyLabelOption="alignLeft"
+            latin:keyWidth="13.0%p"
+            latin:keyEdgeFlags="left" />
+        <Key
+            latin:keyStyle="tabKeyStyle" />
         <Key
             latin:keyStyle="spaceKeyStyle"
-            latin:keyWidth="37.454%p" />
-        <switch>
-            <case
-                latin:voiceKeyEnabled="true"
-            >
-                <Key
-                    latin:keyStyle="micKeyStyle" />
-            </case>
-        </switch>
+            latin:keyXPos="30.750%p"
+            latin:keyWidth="39.750%p" />
+        <Key
+            latin:keyStyle="micOrSettingsKeyStyle"
+            latin:keyXPos="-10.0%p"
+            latin:keyWidth="fillRight"
+            latin:keyEdgeFlags="right" />
     </Row>
 </Keyboard>
diff --git a/java/res/xml-xlarge-land/kbd_popup_template.xml b/java/res/xml-sw768dp-land/kbd_popup_template.xml
similarity index 100%
rename from java/res/xml-xlarge-land/kbd_popup_template.xml
rename to java/res/xml-sw768dp-land/kbd_popup_template.xml
diff --git a/java/res/xml-xlarge/kbd_ar_rows.xml b/java/res/xml-sw768dp/kbd_ar_rows.xml
similarity index 90%
rename from java/res/xml-xlarge/kbd_ar_rows.xml
rename to java/res/xml-sw768dp/kbd_ar_rows.xml
index e84aae6..c181002 100644
--- a/java/res/xml-xlarge/kbd_ar_rows.xml
+++ b/java/res/xml-sw768dp/kbd_ar_rows.xml
@@ -27,12 +27,12 @@
     <include
         latin:keyboardLayout="@xml/kbd_key_styles" />
     <Row
-        latin:keyWidth="7.49%p"
+        latin:keyWidth="7.375%p"
     >
         <Key
             latin:keyStyle="tabKeyStyle"
             latin:keyLabelOption="alignLeft"
-            latin:keyWidth="7.949%p"
+            latin:keyWidth="7.500%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="ض" />
@@ -61,16 +61,17 @@
             latin:popupCharacters="ج,چ" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="9.331%p"
+            latin:keyXPos="-11.500%p"
+            latin:keyWidth="fillBoth"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
-        latin:keyWidth="7.49%p"
+        latin:keyWidth="7.375%p"
     >
         <Key
             latin:keyStyle="toSymbolKeyStyle"
             latin:keyLabelOption="alignLeft"
-            latin:keyWidth="7.949%p"
+            latin:keyWidth="9.375%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="ش" />
@@ -100,16 +101,20 @@
             latin:keyLabel="ط" />
         <Key
             latin:keyStyle="returnKeyStyle"
-            latin:keyWidth="8.593%p"
+            latin:keyXPos="-9.375%p"
+            latin:keyWidth="fillBoth"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
-        latin:keyWidth="8.042%p"
+        latin:keyWidth="7.375%p"
     >
         <Key
-            latin:keyLabel="ئ"
+            latin:keyStyle="shiftKeyStyle"
+            latin:keyWidth="12.750%p"
             latin:keyEdgeFlags="left" />
         <Key
+            latin:keyLabel="ئ" />
+        <Key
             latin:keyLabel="ء" />
         <Key
             latin:keyLabel="ؤ" />
@@ -130,10 +135,6 @@
             latin:keyLabel="ظ" />
         <Key
             latin:keyLabel="د" />
-        <Key
-            latin:keyStyle="shiftKeyStyle"
-            latin:keyWidth="11.736%p"
-            latin:keyEdgeFlags="right" />
     </Row>
     <include latin:keyboardLayout="@xml/kbd_qwerty_row4" />
 </merge>
diff --git a/java/res/xml-xlarge/kbd_azerty_rows.xml b/java/res/xml-sw768dp/kbd_azerty_rows.xml
similarity index 92%
rename from java/res/xml-xlarge/kbd_azerty_rows.xml
rename to java/res/xml-sw768dp/kbd_azerty_rows.xml
index 564f776..5288ccf 100644
--- a/java/res/xml-xlarge/kbd_azerty_rows.xml
+++ b/java/res/xml-sw768dp/kbd_azerty_rows.xml
@@ -24,12 +24,12 @@
     <include
         latin:keyboardLayout="@xml/kbd_key_styles" />
     <Row
-        latin:keyWidth="8.272%p"
+        latin:keyWidth="8.282%p"
     >
         <Key
             latin:keyStyle="tabKeyStyle"
             latin:keyLabelOption="alignLeft"
-            latin:keyWidth="7.949%p"
+            latin:keyWidth="7.969%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="a"
@@ -63,11 +63,12 @@
             latin:popupCharacters="@string/alternates_for_p" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="9.331%p"
+            latin:keyXPos="-9.219%p"
+            latin:keyWidth="fillBoth"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
-        latin:keyWidth="8.157%p"
+        latin:keyWidth="8.125%p"
     >
         <Key
             latin:keyStyle="toSymbolKeyStyle"
@@ -103,15 +104,16 @@
             latin:keyEdgeFlags="right" />
         <Key
             latin:keyStyle="returnKeyStyle"
-            latin:keyWidth="8.593%p"
+            latin:keyXPos="-15.704%p"
+            latin:keyWidth="fillBoth"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
-        latin:keyWidth="8.042%p"
+        latin:keyWidth="8.047%p"
     >
         <Key
             latin:keyStyle="shiftKeyStyle"
-            latin:keyWidth="15.192%p"
+            latin:keyWidth="13.829%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="w"
@@ -161,7 +163,8 @@
         </switch>
         <Key
             latin:keyStyle="shiftKeyStyle"
-            latin:keyWidth="12.530%p"
+            latin:keyXPos="-13.750%p"
+            latin:keyWidth="fillBoth"
             latin:keyEdgeFlags="right" />
     </Row>
     <include
diff --git a/java/res/xml-xlarge/kbd_iw_rows.xml b/java/res/xml-sw768dp/kbd_iw_rows.xml
similarity index 88%
rename from java/res/xml-xlarge/kbd_iw_rows.xml
rename to java/res/xml-sw768dp/kbd_iw_rows.xml
index a3a239d..5275a1f 100644
--- a/java/res/xml-xlarge/kbd_iw_rows.xml
+++ b/java/res/xml-sw768dp/kbd_iw_rows.xml
@@ -24,12 +24,11 @@
     <include
         latin:keyboardLayout="@xml/kbd_key_styles" />
     <Row
-        latin:keyWidth="8.272%p"
+        latin:keyWidth="8.000%p"
     >
         <Key
             latin:keyStyle="tabKeyStyle"
             latin:keyLabelOption="alignLeft"
-            latin:keyWidth="7.949%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="," />
@@ -53,16 +52,17 @@
             latin:keyLabel="פ" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="9.331%p"
+            latin:keyXPos="-12.000%p"
+            latin:keyWidth="fillBoth"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
-        latin:keyWidth="8.157%p"
+        latin:keyWidth="8.000%p"
     >
         <Key
             latin:keyStyle="toSymbolKeyStyle"
             latin:keyLabelOption="alignLeft"
-            latin:keyWidth="10.167%p"
+            latin:keyWidth="9.600%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="ש" />
@@ -89,15 +89,16 @@
             latin:keyLabel="ף" />
         <Key
             latin:keyStyle="returnKeyStyle"
-            latin:keyWidth="8.593%p"
+            latin:keyXPos="-10.400%p"
+            latin:keyWidth="fillBoth"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
-        latin:keyWidth="8.042%p"
+        latin:keyWidth="8.000%p"
     >
         <Key
             latin:keyStyle="shiftKeyStyle"
-            latin:keyWidth="15.192%p"
+            latin:keyWidth="13.200%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="ז"
@@ -121,10 +122,6 @@
         <Key
             latin:keyLabel="ץ"
             latin:popupCharacters="ץ,ץ׳" />
-        <Key
-            latin:keyStyle="shiftKeyStyle"
-            latin:keyWidth="12.530%p"
-            latin:keyEdgeFlags="right" />
     </Row>
     <include latin:keyboardLayout="@xml/kbd_qwerty_row4" />
 </merge>
diff --git a/java/res/xml-xlarge/kbd_key_styles.xml b/java/res/xml-sw768dp/kbd_key_styles.xml
similarity index 100%
rename from java/res/xml-xlarge/kbd_key_styles.xml
rename to java/res/xml-sw768dp/kbd_key_styles.xml
diff --git a/java/res/xml-xlarge/kbd_number.xml b/java/res/xml-sw768dp/kbd_number.xml
similarity index 66%
rename from java/res/xml-xlarge/kbd_number.xml
rename to java/res/xml-sw768dp/kbd_number.xml
index 012b751..faab38a 100644
--- a/java/res/xml-xlarge/kbd_number.xml
+++ b/java/res/xml-sw768dp/kbd_number.xml
@@ -21,9 +21,10 @@
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyboardHeight="@dimen/keyboardHeight"
-    latin:maxKeyboardHeight="50%p"
+    latin:maxKeyboardHeight="@fraction/maxKeyboardHeight"
+    latin:minKeyboardHeight="@fraction/minKeyboardHeight"
     latin:rowHeight="25%p"
-    latin:keyWidth="11.949%p"
+    latin:keyWidth="13.250%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
     latin:verticalGap="@dimen/key_bottom_gap"
     latin:popupKeyboardTemplate="@xml/kbd_popup_template"
@@ -39,42 +40,42 @@
         >
             <!-- This row is intentionally not marked as a top row -->
             <Row>
-                <Spacer
-                    latin:horizontalGap="32.076%p" />
                 <Key
-                    latin:keyStyle="num1KeyStyle" />
+                    latin:keyStyle="tabKeyStyle"
+                    latin:keyLabelOption="alignLeft"
+                    latin:keyWidth="11.172%p"
+                    latin:keyEdgeFlags="left" />
+                <Key
+                    latin:keyStyle="num1KeyStyle"
+                    latin:keyXPos="32.076%p" />
                 <Key
                     latin:keyStyle="num2KeyStyle" />
                 <Key
                     latin:keyStyle="num3KeyStyle" />
-                <Spacer
-                    latin:horizontalGap="22.272%p" />
                 <Key
                     latin:keyStyle="deleteKeyStyle"
-                    latin:keyWidth="9.804%p"
+                    latin:keyXPos="-11.172%p"
+                    latin:keyWidth="fillRight"
                     latin:keyEdgeFlags="right" />
             </Row>
             <Row>
-                <Spacer
-                    latin:horizontalGap="32.076%p" />
                 <Key
-                    latin:keyStyle="num4KeyStyle" />
+                    latin:keyStyle="num4KeyStyle"
+                    latin:keyXPos="32.076%p" />
                 <Key
                     latin:keyStyle="num5KeyStyle" />
                 <Key
                     latin:keyStyle="num6KeyStyle" />
-                <Spacer
-                    latin:horizontalGap="17.371%p" />
                 <Key
                     latin:keyStyle="returnKeyStyle"
-                    latin:keyWidth="14.706%p"
+                    latin:keyXPos="-11.172%p"
+                    latin:keyWidth="fillRight"
                     latin:keyEdgeFlags="right" />
             </Row>
             <Row>
-                <Spacer
-                    latin:horizontalGap="32.076%p" />
                 <Key
-                    latin:keyStyle="num7KeyStyle" />
+                    latin:keyStyle="num7KeyStyle"
+                    latin:keyXPos="32.076%p" />
                 <Key
                     latin:keyStyle="num8KeyStyle" />
                 <Key
@@ -86,7 +87,7 @@
             <!-- This row is intentionally not marked as a bottom row -->
             <Row>
                 <Spacer
-                    latin:horizontalGap="44.026%p" />
+                    latin:keyXPos="32.076%p" />
                 <Key
                     latin:keyStyle="num0KeyStyle" />
                 <!-- There is an empty area below the "Enter" key and right of the "#" key. To
@@ -101,79 +102,72 @@
                 <Key
                     latin:keyStyle="tabKeyStyle"
                     latin:keyLabelOption="alignLeft"
+                    latin:keyWidth="11.172%p"
                     latin:keyEdgeFlags="left" />
-                <Spacer
-                    latin:horizontalGap="4.458%p" />
                 <Key
                     latin:keyLabel="-"
-                    latin:keyWidth="8.042%p" />
+                    latin:keyXPos="13.829%p"
+                    latin:keyWidth="8.047%p" />
                 <Key
                     latin:keyLabel="+"
-                    latin:keyWidth="8.042%p" />
+                    latin:keyWidth="8.047%p" />
                 <Key
                     latin:keyLabel="."
-                    latin:keyWidth="8.042%p" />
-                <Spacer
-                    latin:horizontalGap="4.458%p" />
+                    latin:keyWidth="8.047%p" />
                 <Key
-                    latin:keyLabel="1" />
+                    latin:keyLabel="1"
+                    latin:keyXPos="43.125%p" />
                 <Key
                     latin:keyLabel="2" />
                 <Key
                     latin:keyLabel="3" />
-                <Spacer
-                    latin:horizontalGap="9.360%p" />
                 <Key
                     latin:keyStyle="deleteKeyStyle"
-                    latin:keyWidth="9.804%p"
+                    latin:keyXPos="-11.172%p"
+                    latin:keyWidth="fillRight"
                     latin:keyEdgeFlags="right" />
             </Row>
             <Row>
-                <Spacer
-                    latin:horizontalGap="16.406%p" />
                 <Key
                     latin:keyLabel="*"
-                    latin:keyWidth="8.042%p" />
+                    latin:keyXPos="13.829%p"
+                    latin:keyWidth="8.047%p" />
                 <Key
                     latin:keyLabel="/"
-                    latin:keyWidth="8.042%p" />
+                    latin:keyWidth="8.047%p" />
                 <Key
                     latin:keyLabel=","
-                    latin:keyWidth="8.042%p" />
-                <Spacer
-                    latin:horizontalGap="4.458%p" />
+                    latin:keyWidth="8.047%p" />
                 <Key
-                    latin:keyLabel="4" />
+                    latin:keyLabel="4"
+                    latin:keyXPos="43.125%p" />
                 <Key
                     latin:keyLabel="5" />
                 <Key
                     latin:keyLabel="6" />
-                <Spacer
-                    latin:horizontalGap="4.458%p" />
                 <Key
                     latin:keyStyle="returnKeyStyle"
-                    latin:keyWidth="14.706%p"
+                    latin:keyXPos="-11.172%p"
+                    latin:keyWidth="fillRight"
                     latin:keyEdgeFlags="right" />
             </Row>
             <Row>
                 <!-- There is an empty area below the "More" key and left of the "(" key. To
                      ignore the touch event on the area, "(" is intentionally not marked as a left
                      edge key. -->
-                <Spacer
-                    latin:horizontalGap="16.406%p" />
                 <Key
                     latin:keyLabel="("
-                    latin:keyWidth="8.042%p" />
+                    latin:keyXPos="13.829%p"
+                    latin:keyWidth="8.047%p" />
                 <Key
                     latin:keyLabel=")"
-                    latin:keyWidth="8.042%p" />
+                    latin:keyWidth="8.047%p" />
                 <Key
                     latin:keyLabel="="
-                    latin:keyWidth="8.042%p" />
-                <Spacer
-                    latin:horizontalGap="4.458%p" />
+                    latin:keyWidth="8.047%p" />
                 <Key
-                    latin:keyLabel="7" />
+                    latin:keyLabel="7"
+                    latin:keyXPos="43.125%p" />
                 <Key
                     latin:keyLabel="8" />
                 <Key
@@ -184,29 +178,20 @@
             </Row>
             <!-- This row is intentionally not marked as a bottom row -->
             <Row>
-                <!-- There is an empty area below the "More" key and left of the "space" key. To
-                     ignore the touch event on the area, "space" is intentionally not marked as a
-                     left edge key. -->
-                <Spacer
-                    latin:horizontalGap="8.362%p" />
                 <switch>
                     <case latin:hasSettingsKey="true">
                         <Key
                             latin:keyStyle="settingsKeyStyle"
-                            latin:keyWidth="8.042%p" />
+                            latin:keyWidth="8.047%p" />
                     </case>
-                    <default>
-                        <Spacer
-                            latin:horizontalGap="8.042%p" />
-                    </default>
                 </switch>
                 <Key
                     latin:keyStyle="nonSpecialBackgroundSpaceKeyStyle"
-                    latin:keyWidth="24.127%p" />
-                <Spacer
-                    latin:horizontalGap="4.458%p" />
+                    latin:keyXPos="13.829%p"
+                    latin:keyWidth="24.140%p" />
                 <Key
-                    latin:keyLabel="*" />
+                    latin:keyLabel="*"
+                    latin:keyXPos="43.125%p" />
                 <Key
                     latin:keyLabel="0" />
                 <Key
@@ -217,12 +202,10 @@
                     >
                         <Key
                             latin:keyStyle="micKeyStyle"
-                            latin:keyWidth="8.042%p" />
+                            latin:keyXPos="-8.047%p"
+                            latin:keyWidth="fillRight" />
                     </case>
                 </switch>
-                <!-- There is an empty area below the "Enter" key and right of the "#" key. To
-                     ignore the touch event on the area, "#" is intentionally not marked as a right
-                     edge key. -->
             </Row>
         </default>
     </switch>
diff --git a/java/res/xml-xlarge/kbd_numkey_styles.xml b/java/res/xml-sw768dp/kbd_numkey_styles.xml
similarity index 100%
rename from java/res/xml-xlarge/kbd_numkey_styles.xml
rename to java/res/xml-sw768dp/kbd_numkey_styles.xml
diff --git a/java/res/xml-xlarge/kbd_phone.xml b/java/res/xml-sw768dp/kbd_phone.xml
similarity index 66%
rename from java/res/xml-xlarge/kbd_phone.xml
rename to java/res/xml-sw768dp/kbd_phone.xml
index 9122176..51627aa 100644
--- a/java/res/xml-xlarge/kbd_phone.xml
+++ b/java/res/xml-sw768dp/kbd_phone.xml
@@ -21,9 +21,10 @@
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyboardHeight="@dimen/keyboardHeight"
-    latin:maxKeyboardHeight="50%p"
+    latin:maxKeyboardHeight="@fraction/maxKeyboardHeight"
+    latin:minKeyboardHeight="@fraction/minKeyboardHeight"
     latin:rowHeight="25%p"
-    latin:keyWidth="11.949%p"
+    latin:keyWidth="13.250%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
     latin:verticalGap="@dimen/key_bottom_gap"
     latin:popupKeyboardTemplate="@xml/kbd_popup_template"
@@ -38,115 +39,101 @@
         <Key
             latin:keyStyle="tabKeyStyle"
             latin:keyLabelOption="alignLeft"
+            latin:keyWidth="11.172%p"
             latin:keyEdgeFlags="left" />
         <!-- To match one character label size with "Tab", I placed spaces around the char '-'
              and '+'. -->
-        <Spacer
-            latin:horizontalGap="8.470%p" />
         <Key
             latin:code="45"
             latin:keyLabel=" - "
-            latin:keyWidth="8.042%p" />
+            latin:keyXPos="20.400%p"
+            latin:keyWidth="8.047%p" />
         <Key
             latin:code="43"
             latin:keyLabel=" + "
-            latin:keyWidth="8.042%p" />
-        <Spacer
-            latin:horizontalGap="8.479%p" />
+            latin:keyWidth="8.047%p" />
         <Key
-            latin:keyStyle="num1KeyStyle" />
+            latin:keyStyle="num1KeyStyle"
+            latin:keyXPos="43.125%p" />
         <Key
             latin:keyStyle="num2KeyStyle" />
         <Key
             latin:keyStyle="num3KeyStyle" />
-        <Spacer
-            latin:horizontalGap="9.360%p" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="9.804%p"
+            latin:keyXPos="-11.172%p"
+            latin:keyWidth="fillRight"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row>
         <Key
             latin:keyStyle="moreKeyStyle"
+            latin:keyWidth="11.172%p"
             latin:keyEdgeFlags="left" />
         <!-- To match one character label size with "More", I placed spaces around the char ','
              and '.'. -->
-        <Spacer
-            latin:horizontalGap="8.470%p" />
         <Key
             latin:code="44"
             latin:keyLabel=" , "
-            latin:keyWidth="8.042%p" />
+            latin:keyXPos="20.400%p"
+            latin:keyWidth="8.047%p" />
         <Key
             latin:code="46"
             latin:keyLabel=" . "
-            latin:keyWidth="8.042%p" />
-        <Spacer
-            latin:horizontalGap="8.479%p" />
+            latin:keyWidth="8.047%p" />
         <Key
-            latin:keyStyle="num4KeyStyle" />
+            latin:keyStyle="num4KeyStyle"
+            latin:keyXPos="43.125%p" />
         <Key
             latin:keyStyle="num5KeyStyle" />
         <Key
             latin:keyStyle="num6KeyStyle" />
-        <Spacer
-            latin:horizontalGap="4.458%p" />
         <Key
             latin:keyStyle="returnKeyStyle"
-            latin:keyWidth="14.706%p"
+            latin:keyXPos="-11.172%p"
+            latin:keyWidth="fillRight"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row>
         <!-- To match one character label size with "More", I placed spaces around the char '('
              and ')'. -->
-        <!-- There is an empty area bellow the "More" key and left of the "(" key.  To ignore
+        <!-- There is an empty area below the "More" key and left of the "(" key.  To ignore
              the touch event on the area, "(" is intentionally not marked as a left edge key. -->
-        <Spacer
-            latin:horizontalGap="20.427%p" />
         <Key
             latin:code="40"
             latin:keyLabel=" ( "
-            latin:keyWidth="8.042%p" />
+            latin:keyXPos="20.400%p"
+            latin:keyWidth="8.047%p" />
         <Key
             latin:code="41"
             latin:keyLabel=" ) "
-            latin:keyWidth="8.042%p" />
-        <Spacer
-            latin:horizontalGap="8.479%p" />
+            latin:keyWidth="8.047%p" />
         <Key
-            latin:keyStyle="num7KeyStyle" />
+            latin:keyStyle="num7KeyStyle"
+            latin:keyXPos="43.125%p" />
         <Key
             latin:keyStyle="num8KeyStyle" />
         <Key
             latin:keyStyle="num9KeyStyle" />
-        <!-- There is an empty area bellow the "Enter" key and right of the "9" key.  To ignore
+        <!-- There is an empty area below the "Enter" key and right of the "9" key.  To ignore
              the touch event on the area, "9" is intentionally not marked as a right edge key. -->
         </Row>
     <!-- This row is intentionally not marked as a bottom row -->
     <Row>
-        <!-- There is an empty area bellow the "More" key and left of the "space" key.  To ignore
-             the touch event on the area, "space" is intentionally not marked as a left edge key. -->
-        <Spacer
-            latin:horizontalGap="12.340%p" />
         <switch>
             <case latin:hasSettingsKey="true">
                 <Key
                     latin:keyStyle="settingsKeyStyle"
-                    latin:keyWidth="8.042%p" />
+                    latin:keyWidth="8.047%p" />
             </case>
-            <default>
-                <Spacer
-                    latin:horizontalGap="8.042%p" />
-            </default>
         </switch>
         <Key
             latin:keyStyle="nonSpecialBackgroundSpaceKeyStyle"
+            latin:keyXPos="20.400%p"
             latin:keyWidth="16.084%p" />
-        <Spacer
-            latin:horizontalGap="8.479%p" />
         <Key
-            latin:keyStyle="numStarKeyStyle" />
+            latin:keyStyle="numStarKeyStyle"
+            latin:keyXPos="43.125%p" />
         <Key
             latin:keyStyle="num0KeyStyle" />
         <Key
@@ -157,10 +144,9 @@
             >
                 <Key
                     latin:keyStyle="micKeyStyle"
-                    latin:keyWidth="8.042%p" />
+                    latin:keyXPos="-8.047%p"
+                    latin:keyWidth="fillRight" />
             </case>
         </switch>
-        <!-- There is an empty area bellow the "Enter" key and right of the "#" key.  To ignore
-             the touch event on the area, "#" is intentionally not marked as a right edge key. -->
     </Row>
 </Keyboard>
diff --git a/java/res/xml-xlarge/kbd_phone_symbols.xml b/java/res/xml-sw768dp/kbd_phone_symbols.xml
similarity index 65%
rename from java/res/xml-xlarge/kbd_phone_symbols.xml
rename to java/res/xml-sw768dp/kbd_phone_symbols.xml
index 055c148..b086b41 100644
--- a/java/res/xml-xlarge/kbd_phone_symbols.xml
+++ b/java/res/xml-sw768dp/kbd_phone_symbols.xml
@@ -21,9 +21,10 @@
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyboardHeight="@dimen/keyboardHeight"
-    latin:maxKeyboardHeight="50%p"
+    latin:maxKeyboardHeight="@fraction/maxKeyboardHeight"
+    latin:minKeyboardHeight="@fraction/minKeyboardHeight"
     latin:rowHeight="25%p"
-    latin:keyWidth="11.949%p"
+    latin:keyWidth="13.250%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
     latin:verticalGap="@dimen/key_bottom_gap"
     latin:popupKeyboardTemplate="@xml/kbd_popup_template"
@@ -38,127 +39,113 @@
         <Key
             latin:keyStyle="tabKeyStyle"
             latin:keyLabelOption="alignLeft"
+            latin:keyWidth="11.172%p"
             latin:keyEdgeFlags="left" />
-        <Spacer
-            latin:horizontalGap="4.458%p" />
         <Key
             latin:code="45"
             latin:keyLabel=" - "
-            latin:keyWidth="8.042%p" />
+            latin:keyXPos="13.829%p"
+            latin:keyWidth="8.047%p" />
         <Key
             latin:code="43"
             latin:keyLabel=" + "
-            latin:keyWidth="8.042%p" />
+            latin:keyWidth="8.047%p" />
         <Key
             latin:code="44"
             latin:keyLabel="@string/label_pause_key"
-            latin:keyWidth="8.042%p" />
+            latin:keyWidth="8.047%p" />
         <!-- To match one character label size with "Tab" and "Pause, I placed spaces around the
              char '-' and '+'. -->
-        <Spacer
-            latin:horizontalGap="4.458%p" />
         <Key
-            latin:keyStyle="num1KeyStyle" />
+            latin:keyStyle="num1KeyStyle"
+            latin:keyXPos="43.125%p" />
         <Key
             latin:keyStyle="num2KeyStyle" />
         <Key
             latin:keyStyle="num3KeyStyle" />
-        <Spacer
-            latin:horizontalGap="9.360%p" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="9.804%p"
+            latin:keyXPos="-11.172%p"
+            latin:keyWidth="fillRight"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row>
         <Key
             latin:keyStyle="moreKeyStyle"
+            latin:keyWidth="11.172%p"
             latin:keyEdgeFlags="left" />
-        <Spacer
-            latin:horizontalGap="4.458%p" />
         <Key
             latin:code="44"
             latin:keyLabel=" , "
-            latin:keyWidth="8.042%p" />
+            latin:keyXPos="13.829%p"
+            latin:keyWidth="8.047%p" />
         <Key
             latin:code="46"
             latin:keyLabel=" . "
-            latin:keyWidth="8.042%p" />
+            latin:keyWidth="8.047%p" />
         <Key
             latin:code="59"
             latin:keyLabel="@string/label_wait_key"
-            latin:keyWidth="8.042%p" />
+            latin:keyWidth="8.047%p" />
         <!-- To match one character label size with "More" and "Wait", I placed spaces around the
              char ',' and '.'. -->
-        <Spacer
-            latin:horizontalGap="4.458%p" />
         <Key
-            latin:keyStyle="num4KeyStyle" />
+            latin:keyStyle="num4KeyStyle"
+            latin:keyXPos="43.125%p" />
         <Key
             latin:keyStyle="num5KeyStyle" />
         <Key
             latin:keyStyle="num6KeyStyle" />
-        <Spacer
-            latin:horizontalGap="4.458%p" />
         <Key
             latin:keyStyle="returnKeyStyle"
-            latin:keyWidth="14.706%p"
+            latin:keyXPos="-11.172%p"
+            latin:keyWidth="fillRight"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row>
         <!-- To match one character label size with "More" and etc., I placed spaces around the
              char 'N', '(' and ')'. -->
-        <!-- There is an empty area bellow the "More" key and left of the "(" key.  To ignore
+        <!-- There is an empty area below the "More" key and left of the "(" key.  To ignore
              the touch event on the area, "(" is intentionally not marked as a left edge key. -->
-        <Spacer
-            latin:horizontalGap="16.406%p" />
         <Key
             latin:code="40"
             latin:keyLabel=" ( "
-            latin:keyWidth="8.042%p" />
+            latin:keyXPos="13.829%p"
+            latin:keyWidth="8.047%p" />
         <Key
             latin:code="41"
             latin:keyLabel=" ) "
-            latin:keyWidth="8.042%p" />
+            latin:keyWidth="8.047%p" />
         <Key
             latin:code="78"
             latin:keyLabel=" N "
-            latin:keyWidth="8.042%p" />
-        <Spacer
-            latin:horizontalGap="4.458%p" />
+            latin:keyWidth="8.047%p" />
         <Key
-            latin:keyStyle="num7KeyStyle" />
+            latin:keyStyle="num7KeyStyle"
+            latin:keyXPos="43.125%p" />
         <Key
             latin:keyStyle="num8KeyStyle" />
         <Key
             latin:keyStyle="num9KeyStyle" />
-        <!-- There is an empty area bellow the "Enter" key and right of the "9" key.  To ignore
+        <!-- There is an empty area below the "Enter" key and right of the "9" key.  To ignore
              the touch event on the area, "9" is intentionally not marked as a right edge key. -->
     </Row>
     <!-- This row is intentionally not marked as a bottom row -->
     <Row>
-        <!-- There is an empty area bellow the "More" key and left of the "space" key.  To ignore
-             the touch event on the area, "space" is intentionally not marked as a left edge key. -->
-        <Spacer
-            latin:horizontalGap="8.362%p" />
         <switch>
             <case latin:hasSettingsKey="true">
                 <Key
                     latin:keyStyle="settingsKeyStyle"
-                    latin:keyWidth="8.042%p" />
+                    latin:keyWidth="8.047%p" />
             </case>
-            <default>
-                <Spacer
-                    latin:horizontalGap="8.042%p" />
-            </default>
         </switch>
         <Key
             latin:keyStyle="nonSpecialBackgroundSpaceKeyStyle"
-            latin:keyWidth="24.127%p" />
-        <Spacer
-            latin:horizontalGap="4.458%p" />
+            latin:keyXPos="13.829%p"
+            latin:keyWidth="24.140%p" />
         <Key
-            latin:keyStyle="numStarKeyStyle" />
+            latin:keyStyle="numStarKeyStyle"
+            latin:keyXPos="43.125%p" />
         <Key
             latin:keyStyle="num0KeyStyle" />
         <Key
@@ -169,10 +156,9 @@
             >
                 <Key
                     latin:keyStyle="micKeyStyle"
-                    latin:keyWidth="8.042%p" />
+                    latin:keyXPos="-8.047%p"
+                    latin:keyWidth="fillRight" />
             </case>
         </switch>
-        <!-- There is an empty area bellow the "Enter" key and right of the "#" key.  To ignore
-             the touch event on the area, "#" is intentionally not marked as a right edge key. -->
     </Row>
 </Keyboard>
diff --git a/java/res/xml-xlarge/kbd_popup_template.xml b/java/res/xml-sw768dp/kbd_popup_template.xml
similarity index 100%
rename from java/res/xml-xlarge/kbd_popup_template.xml
rename to java/res/xml-sw768dp/kbd_popup_template.xml
diff --git a/java/res/xml-xlarge/kbd_qwerty_row1.xml b/java/res/xml-sw768dp/kbd_qwerty_row1.xml
similarity index 93%
rename from java/res/xml-xlarge/kbd_qwerty_row1.xml
rename to java/res/xml-sw768dp/kbd_qwerty_row1.xml
index f513559..3727cf3 100644
--- a/java/res/xml-xlarge/kbd_qwerty_row1.xml
+++ b/java/res/xml-sw768dp/kbd_qwerty_row1.xml
@@ -23,12 +23,12 @@
 >
     <!-- This row is intentionally not marked as a top row -->
     <Row
-        latin:keyWidth="8.272%p"
+        latin:keyWidth="8.282%p"
     >
         <Key
             latin:keyStyle="tabKeyStyle"
             latin:keyLabelOption="alignLeft"
-            latin:keyWidth="7.949%p"
+            latin:keyWidth="7.969%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="q"
@@ -62,7 +62,8 @@
             latin:popupCharacters="@string/alternates_for_p" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="9.331%p"
+            latin:keyXPos="-9.219%p"
+            latin:keyWidth="fillBoth"
             latin:keyEdgeFlags="right" />
     </Row>
 </merge>
diff --git a/java/res/xml-xlarge/kbd_qwerty_row2.xml b/java/res/xml-sw768dp/kbd_qwerty_row2.xml
similarity index 92%
rename from java/res/xml-xlarge/kbd_qwerty_row2.xml
rename to java/res/xml-sw768dp/kbd_qwerty_row2.xml
index 02bd0a6..45af120 100644
--- a/java/res/xml-xlarge/kbd_qwerty_row2.xml
+++ b/java/res/xml-sw768dp/kbd_qwerty_row2.xml
@@ -22,12 +22,12 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
 >
     <Row
-        latin:keyWidth="8.157%p"
+        latin:keyWidth="8.125%p"
     >
         <Key
             latin:keyStyle="toSymbolKeyStyle"
             latin:keyLabelOption="alignLeft"
-            latin:keyWidth="11.167%p"
+            latin:keyWidth="11.172%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="a"
@@ -55,7 +55,8 @@
             latin:popupCharacters="@string/alternates_for_l" />
         <Key
             latin:keyStyle="returnKeyStyle"
-            latin:keyWidth="15.750%p"
+            latin:keyXPos="-15.704%p"
+            latin:keyWidth="fillBoth"
             latin:keyEdgeFlags="right" />
     </Row>
 </merge>
diff --git a/java/res/xml-sw768dp/kbd_qwerty_row3.xml b/java/res/xml-sw768dp/kbd_qwerty_row3.xml
new file mode 100644
index 0000000..7297ea5
--- /dev/null
+++ b/java/res/xml-sw768dp/kbd_qwerty_row3.xml
@@ -0,0 +1,57 @@
+<?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"
+>
+    <Row
+        latin:keyWidth="8.047%p"
+    >
+        <Key
+            latin:keyStyle="shiftKeyStyle"
+            latin:keyWidth="13.829%p"
+            latin:keyEdgeFlags="left" />
+        <Key
+            latin:keyLabel="z"
+            latin:popupCharacters="@string/alternates_for_z" />
+        <Key
+            latin:keyLabel="x" />
+        <Key
+            latin:keyLabel="c"
+            latin:popupCharacters="@string/alternates_for_c" />
+        <Key
+            latin:keyLabel="v"
+            latin:popupCharacters="@string/alternates_for_v" />
+        <Key
+            latin:keyLabel="b" />
+        <Key
+            latin:keyLabel="n"
+            latin:popupCharacters="@string/alternates_for_n" />
+        <Key
+            latin:keyLabel="m" />
+        <include
+            latin:keyboardLayout="@xml/kbd_row3_right2" />
+        <Key
+            latin:keyStyle="shiftKeyStyle"
+            latin:keyXPos="-13.750%p"
+            latin:keyWidth="fillBoth"
+            latin:keyEdgeFlags="right" />
+    </Row>
+</merge>
diff --git a/java/res/xml-sw768dp/kbd_qwerty_row4.xml b/java/res/xml-sw768dp/kbd_qwerty_row4.xml
new file mode 100644
index 0000000..0e71cbf
--- /dev/null
+++ b/java/res/xml-sw768dp/kbd_qwerty_row4.xml
@@ -0,0 +1,146 @@
+<?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"
+>
+    <!-- This row is intentionally not marked as a bottom row -->
+    <Row
+        latin:keyWidth="8.047%p"
+    >
+        <switch>
+            <case
+                latin:hasSettingsKey="true"
+            >
+                <Key
+                    latin:keyStyle="settingsKeyStyle"
+                    latin:keyWidth="8.047%p" />
+            </case>
+        </switch>
+        <Spacer
+            latin:keyXPos="15.157%p"
+            latin:keyWidth="fillRight" />
+        <switch>
+            <case
+                latin:mode="url"
+            >
+                <Key
+                    latin:keyStyle="comKeyStyle"
+                    latin:keyWidth="16.084%p" />
+            </case>
+            <default>
+                <switch>
+                    <case
+                        latin:mode="email"
+                    >
+                        <Key
+                            latin:keyStyle="comKeyStyle" />
+                    </case>
+                    <case
+                        latin:imeAction="actionSearch"
+                    >
+                        <Key
+                            latin:keyLabel=":"
+                            latin:manualTemporaryUpperCaseCode="43"
+                            latin:keyHintIcon="@drawable/key_hint_plus_holo"
+                            latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_plus_large_holo"
+                            latin:popupCharacters="+" />
+                    </case>
+                    <default>
+                        <Key
+                            latin:keyStyle="smileyKeyStyle" />
+                    </default>
+                </switch>
+                <switch>
+                    <case
+                        latin:mode="email"
+                    >
+                        <Key
+                            latin:keyLabel="\@" />
+                    </case>
+                    <default>
+                        <Key
+                            latin:keyLabel="/"
+                            latin:manualTemporaryUpperCaseCode="64"
+                            latin:keyHintIcon="@drawable/key_hint_at_holo"
+                            latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_at_large_holo"
+                            latin:popupCharacters="\@" />
+                    </default>
+                </switch>
+            </default>
+        </switch>
+        <Key
+            latin:keyStyle="spaceKeyStyle"
+            latin:keyXPos="31.250%p"
+            latin:keyWidth="37.500%p" />
+        <switch>
+            <case
+                latin:mode="email"
+            >
+                <Key
+                    latin:keyLabel="-" />
+            </case>
+            <case
+                latin:mode="url"
+            >
+                <Key
+                    latin:keyLabel="/"
+                    latin:manualTemporaryUpperCaseCode="58"
+                    latin:keyHintIcon="@drawable/key_hint_colon_holo"
+                    latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_colon_large_holo"
+                    latin:popupCharacters=":" />
+            </case>
+            <default>
+                <Key
+                    latin:keyLabel="\'"
+                    latin:manualTemporaryUpperCaseCode="34"
+                    latin:keyHintIcon="@drawable/key_hint_quote_holo"
+                    latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_quote_large_holo"
+                    latin:popupCharacters="&quot;" />
+            </default>
+        </switch>
+        <switch>
+            <case
+                latin:mode="email"
+            >
+                <Key
+                    latin:keyLabel="_" />
+            </case>
+            <default>
+                <Key
+                    latin:keyLabel="-"
+                    latin:manualTemporaryUpperCaseCode="95"
+                    latin:keyHintIcon="@drawable/key_hint_underline_holo"
+                    latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_underline_large_holo"
+                    latin:popupCharacters="_" />
+            </default>
+        </switch>
+        <switch>
+            <case
+                latin:voiceKeyEnabled="true"
+            >
+                <Key
+                    latin:keyStyle="micKeyStyle"
+                    latin:keyXPos="-8.047%p"
+                    latin:keyWidth="fillRight" />
+            </case>
+        </switch>
+    </Row>
+</merge>
diff --git a/java/res/xml-xlarge/kbd_qwerty_rows.xml b/java/res/xml-sw768dp/kbd_qwerty_rows.xml
similarity index 100%
rename from java/res/xml-xlarge/kbd_qwerty_rows.xml
rename to java/res/xml-sw768dp/kbd_qwerty_rows.xml
diff --git a/java/res/xml-xlarge/kbd_qwerty_rows_scandinavia.xml b/java/res/xml-sw768dp/kbd_qwerty_rows_scandinavia.xml
similarity index 73%
copy from java/res/xml-xlarge/kbd_qwerty_rows_scandinavia.xml
copy to java/res/xml-sw768dp/kbd_qwerty_rows_scandinavia.xml
index fb2034f..7e9f604 100644
--- a/java/res/xml-xlarge/kbd_qwerty_rows_scandinavia.xml
+++ b/java/res/xml-sw768dp/kbd_qwerty_rows_scandinavia.xml
@@ -24,12 +24,12 @@
     <include
         latin:keyboardLayout="@xml/kbd_key_styles" />
     <Row
-        latin:keyWidth="7.520%p"
+        latin:keyWidth="7.375%p"
     >
         <Key
             latin:keyStyle="tabKeyStyle"
             latin:keyLabelOption="alignLeft"
-            latin:keyWidth="7.949%p"
+            latin:keyWidth="7.500%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="q"
@@ -65,16 +65,17 @@
             latin:keyLabel="å" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="9.331%p"
+            latin:keyXPos="-11.500%p"
+            latin:keyWidth="fillBoth"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
-        latin:keyWidth="7.520%p"
+        latin:keyWidth="7.375%p"
     >
         <Key
             latin:keyStyle="toSymbolKeyStyle"
             latin:keyLabelOption="alignLeft"
-            latin:keyWidth="7.949%p"
+            latin:keyWidth="9.375%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="a"
@@ -108,11 +109,43 @@
             latin:popupCharacters="@string/alternates_for_scandinavia_row2_11" />
         <Key
             latin:keyStyle="returnKeyStyle"
-            latin:keyWidth="9.331%p"
+            latin:keyXPos="-9.375%p"
+            latin:keyWidth="fillBoth"
             latin:keyEdgeFlags="right" />
     </Row>
-    <include
-        latin:keyboardLayout="@xml/kbd_qwerty_row3" />
+    <Row
+        latin:keyWidth="7.375%p"
+    >
+        <Key
+            latin:keyStyle="shiftKeyStyle"
+            latin:keyWidth="12.750%p"
+            latin:keyEdgeFlags="left" />
+        <Key
+            latin:keyLabel="z"
+            latin:popupCharacters="@string/alternates_for_z" />
+        <Key
+            latin:keyLabel="x" />
+        <Key
+            latin:keyLabel="c"
+            latin:popupCharacters="@string/alternates_for_c" />
+        <Key
+            latin:keyLabel="v"
+            latin:popupCharacters="@string/alternates_for_v" />
+        <Key
+            latin:keyLabel="b" />
+        <Key
+            latin:keyLabel="n"
+            latin:popupCharacters="@string/alternates_for_n" />
+        <Key
+            latin:keyLabel="m" />
+        <include
+            latin:keyboardLayout="@xml/kbd_row3_right2" />
+        <Key
+            latin:keyStyle="shiftKeyStyle"
+            latin:keyXPos="-12.750%p"
+            latin:keyWidth="fillRight"
+            latin:keyEdgeFlags="right" />
+    </Row>
     <include
         latin:keyboardLayout="@xml/kbd_qwerty_row4" />
 </merge>
diff --git a/java/res/xml-xlarge/kbd_qwertz_rows.xml b/java/res/xml-sw768dp/kbd_qwertz_rows.xml
similarity index 93%
rename from java/res/xml-xlarge/kbd_qwertz_rows.xml
rename to java/res/xml-sw768dp/kbd_qwertz_rows.xml
index 3e99f05..4e937ac 100644
--- a/java/res/xml-xlarge/kbd_qwertz_rows.xml
+++ b/java/res/xml-sw768dp/kbd_qwertz_rows.xml
@@ -24,12 +24,12 @@
     <include
         latin:keyboardLayout="@xml/kbd_key_styles" />
     <Row
-        latin:keyWidth="8.272%p"
+        latin:keyWidth="8.282%p"
     >
         <Key
             latin:keyStyle="tabKeyStyle"
             latin:keyLabelOption="alignLeft"
-            latin:keyWidth="7.949%p"
+            latin:keyWidth="7.969%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="q"
@@ -63,17 +63,18 @@
             latin:popupCharacters="@string/alternates_for_p" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="9.331%p"
+            latin:keyXPos="-9.219%p"
+            latin:keyWidth="fillBoth"
             latin:keyEdgeFlags="right" />
     </Row>
     <include
         latin:keyboardLayout="@xml/kbd_qwerty_row2" />
     <Row
-        latin:keyWidth="8.042%p"
+        latin:keyWidth="8.047%p"
     >
         <Key
             latin:keyStyle="shiftKeyStyle"
-            latin:keyWidth="15.192%p"
+            latin:keyWidth="13.829%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="y"
@@ -119,7 +120,8 @@
         </switch>
         <Key
             latin:keyStyle="shiftKeyStyle"
-            latin:keyWidth="12.530%p"
+            latin:keyXPos="-13.750%p"
+            latin:keyWidth="fillBoth"
             latin:keyEdgeFlags="right" />
     </Row>
    <include
diff --git a/java/res/xml-sw768dp/kbd_row3_right2.xml b/java/res/xml-sw768dp/kbd_row3_right2.xml
new file mode 100644
index 0000000..1759ea1
--- /dev/null
+++ b/java/res/xml-sw768dp/kbd_row3_right2.xml
@@ -0,0 +1,48 @@
+<?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:mode="email"
+        >
+            <Key
+                latin:keyLabel="," />
+            <Key
+                latin:keyLabel="." />
+        </case>
+        <default>
+            <Key
+                latin:keyLabel=","
+                latin:manualTemporaryUpperCaseCode="33"
+                latin:keyHintIcon="@drawable/key_hint_exclamation_holo"
+                latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_exclamation_large_holo"
+                latin:popupCharacters="!" />
+            <Key
+                latin:keyLabel="."
+                latin:manualTemporaryUpperCaseCode="63"
+                latin:keyHintIcon="@drawable/key_hint_question_holo"
+                latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_question_large_holo"
+                latin:popupCharacters="\?" />
+        </default>
+    </switch>
+</merge>
diff --git a/java/res/xml-xlarge/kbd_ru_rows.xml b/java/res/xml-sw768dp/kbd_ru_rows.xml
similarity index 68%
rename from java/res/xml-xlarge/kbd_ru_rows.xml
rename to java/res/xml-sw768dp/kbd_ru_rows.xml
index c5cd043..ee91481 100644
--- a/java/res/xml-xlarge/kbd_ru_rows.xml
+++ b/java/res/xml-sw768dp/kbd_ru_rows.xml
@@ -25,57 +25,49 @@
         latin:keyboardLayout="@xml/kbd_key_styles" />
     <!-- This row is intentionally not marked as a top row -->
     <Row
-        latin:keyWidth="7.520%p"
+        latin:keyWidth="7.125%p"
     >
         <Key
             latin:keyStyle="tabKeyStyle"
             latin:keyLabelOption="alignLeft"
-            latin:keyWidth="7.949%p"
             latin:keyEdgeFlags="left" />
         <Key
-            latin:keyLabel="й"
-            latin:popupCharacters="1" />
+            latin:keyLabel="й" />
         <Key
-            latin:keyLabel="ц"
-            latin:popupCharacters="2" />
+            latin:keyLabel="ц" />
         <Key
-            latin:keyLabel="у"
-            latin:popupCharacters="3" />
+            latin:keyLabel="у" />
         <Key
-            latin:keyLabel="к"
-            latin:popupCharacters="4" />
+            latin:keyLabel="к" />
         <Key
             latin:keyLabel="е"
             latin:popupCharacters="@string/alternates_for_cyrillic_e" />
         <Key
-            latin:keyLabel="н"
-            latin:popupCharacters="6" />
+            latin:keyLabel="н" />
         <Key
-            latin:keyLabel="г"
-            latin:popupCharacters="7" />
+            latin:keyLabel="г" />
         <Key
-            latin:keyLabel="ш"
-            latin:popupCharacters="8" />
+            latin:keyLabel="ш" />
         <Key
-            latin:keyLabel="щ"
-            latin:popupCharacters="9" />
+            latin:keyLabel="щ" />
         <Key
-            latin:keyLabel="з"
-            latin:popupCharacters="0" />
+            latin:keyLabel="з" />
         <Key
             latin:keyLabel="х" />
         <Key
+            latin:keyLabel="ъ" />
+        <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="9.331%p"
+            latin:keyWidth="fillBoth"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
-        latin:keyWidth="7.520%p"
+        latin:keyWidth="7.125%p"
     >
         <Key
             latin:keyStyle="toSymbolKeyStyle"
             latin:keyLabelOption="alignLeft"
-            latin:keyWidth="7.949%p"
+            latin:keyWidth="9.375%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="ф" />
@@ -101,15 +93,16 @@
             latin:keyLabel="э" />
         <Key
             latin:keyStyle="returnKeyStyle"
-            latin:keyWidth="9.331%p"
+            latin:keyXPos="-9.375%p"
+            latin:keyWidth="fillBoth"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
-        latin:keyWidth="7.520%p"
+        latin:keyWidth="7.125%p"
     >
         <Key
             latin:keyStyle="shiftKeyStyle"
-            latin:keyWidth="12.400%p"
+            latin:keyWidth="12.750%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="я" />
@@ -124,21 +117,16 @@
         <Key
             latin:keyLabel="т" />
         <Key
-            latin:keyLabel="ь"
-            latin:popupCharacters="@string/alternates_for_cyrillic_soft_sign" />
+            latin:keyLabel="ь" />
         <Key
             latin:keyLabel="б" />
         <Key
             latin:keyLabel="ю" />
-        <Key
-            latin:keyLabel="."
-            latin:manualTemporaryUpperCaseCode="44"
-            latin:keyHintIcon="@drawable/key_hint_comma_holo"
-            latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_comma_large_holo"
-            latin:popupCharacters="," />
+        <include
+            latin:keyboardLayout="@xml/kbd_row3_right2" />
         <Key
             latin:keyStyle="shiftKeyStyle"
-            latin:keyWidth="12.400%p"
+            latin:keyWidth="fillBoth"
             latin:keyEdgeFlags="right" />
     </Row>
     <include
diff --git a/java/res/xml-xlarge/kbd_sr_rows.xml b/java/res/xml-sw768dp/kbd_sr_rows.xml
similarity index 60%
rename from java/res/xml-xlarge/kbd_sr_rows.xml
rename to java/res/xml-sw768dp/kbd_sr_rows.xml
index be00585..4997dab 100644
--- a/java/res/xml-xlarge/kbd_sr_rows.xml
+++ b/java/res/xml-sw768dp/kbd_sr_rows.xml
@@ -25,57 +25,48 @@
         latin:keyboardLayout="@xml/kbd_key_styles" />
     <!-- This row is intentionally not marked as a top row -->
     <Row
-        latin:keyWidth="7.520%p"
+        latin:keyWidth="7.125%p"
     >
         <Key
             latin:keyStyle="tabKeyStyle"
             latin:keyLabelOption="alignLeft"
-            latin:keyWidth="8.640%p"
             latin:keyEdgeFlags="left" />
         <Key
-            latin:keyLabel="љ"
-            latin:popupCharacters="1" />
+            latin:keyLabel="љ" />
         <Key
-            latin:keyLabel="њ"
-            latin:popupCharacters="2" />
+            latin:keyLabel="њ" />
         <Key
-            latin:keyLabel="е"
-            latin:popupCharacters="3" />
+            latin:keyLabel="е" />
         <Key
-            latin:keyLabel="р"
-            latin:popupCharacters="4" />
+            latin:keyLabel="р" />
         <Key
-            latin:keyLabel="т"
-            latin:popupCharacters="5" />
+            latin:keyLabel="т" />
         <Key
-            latin:keyLabel="з"
-            latin:popupCharacters="6" />
+            latin:keyLabel="з" />
         <Key
-            latin:keyLabel="у"
-            latin:popupCharacters="7" />
+            latin:keyLabel="у" />
         <Key
-            latin:keyLabel="и"
-            latin:popupCharacters="8" />
+            latin:keyLabel="и" />
         <Key
-            latin:keyLabel="о"
-            latin:popupCharacters="9" />
+            latin:keyLabel="о" />
         <Key
-            latin:keyLabel="п"
-            latin:popupCharacters="0" />
+            latin:keyLabel="п" />
         <Key
             latin:keyLabel="ш" />
         <Key
-            latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="8.640%p"
-            latin:keyEdgeFlags="right" />
+            latin:keyLabel="ђ" />
+        <Key
+            latin:keyLabel="ж"
+            latin:keyWidth="fillRight"
+            latin:keyEdgeFlags="right"/>
     </Row>
     <Row
-        latin:keyWidth="7.520%p"
+        latin:keyWidth="7.250%p"
     >
         <Key
             latin:keyStyle="toSymbolKeyStyle"
             latin:keyLabelOption="alignLeft"
-            latin:keyWidth="8.640%p"
+            latin:keyWidth="11.172%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="а" />
@@ -100,16 +91,17 @@
         <Key
             latin:keyLabel="ћ" />
         <Key
-            latin:keyStyle="returnKeyStyle"
-            latin:keyWidth="8.640%p"
+            latin:keyStyle="deleteKeyStyle"
+            latin:keyXPos="-9.219%p"
+            latin:keyWidth="fillBoth"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
-        latin:keyWidth="7.520%p"
+        latin:keyWidth="7.250%p"
     >
         <Key
             latin:keyStyle="shiftKeyStyle"
-            latin:keyWidth="8.640%p"
+            latin:keyWidth="13.829%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="ѕ" />
@@ -125,25 +117,12 @@
             latin:keyLabel="н" />
         <Key
             latin:keyLabel="м" />
+        <include
+            latin:keyboardLayout="@xml/kbd_row3_right2" />
         <Key
-            latin:keyLabel="ђ" />
-        <Key
-            latin:keyLabel="ж" />
-        <Key
-            latin:keyLabel=","
-            latin:manualTemporaryUpperCaseCode="33"
-            latin:keyHintIcon="@drawable/key_hint_exclamation_holo"
-            latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_exclamation_large_holo"
-            latin:popupCharacters="!" />
-        <Key
-            latin:keyLabel="."
-            latin:manualTemporaryUpperCaseCode="63"
-            latin:keyHintIcon="@drawable/key_hint_question_holo"
-            latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_question_large_holo"
-            latin:popupCharacters="\?" />
-        <Key
-            latin:keyStyle="shiftKeyStyle"
-            latin:keyWidth="8.640%p"
+            latin:keyStyle="returnKeyStyle"
+            latin:keyXPos="-13.750%p"
+            latin:keyWidth="fillRight"
             latin:keyEdgeFlags="right" />
     </Row>
     <include
diff --git a/java/res/xml-xlarge/kbd_symbols.xml b/java/res/xml-sw768dp/kbd_symbols.xml
similarity index 65%
copy from java/res/xml-xlarge/kbd_symbols.xml
copy to java/res/xml-sw768dp/kbd_symbols.xml
index f1deae0..5b359bf 100644
--- a/java/res/xml-xlarge/kbd_symbols.xml
+++ b/java/res/xml-sw768dp/kbd_symbols.xml
@@ -21,7 +21,8 @@
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyboardHeight="@dimen/keyboardHeight"
-    latin:maxKeyboardHeight="50%p"
+    latin:maxKeyboardHeight="@fraction/maxKeyboardHeight"
+    latin:minKeyboardHeight="@fraction/minKeyboardHeight"
     latin:rowHeight="25%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
     latin:verticalGap="@dimen/key_bottom_gap"
@@ -34,12 +35,12 @@
         latin:keyboardLayout="@xml/kbd_currency_key_styles" />
     <!-- This row is intentionally not marked as a top row -->
     <Row
-        latin:keyWidth="8.272%p"
+        latin:keyWidth="8.282%p"
     >
         <Key
             latin:keyStyle="tabKeyStyle"
             latin:keyLabelOption="alignLeft"
-            latin:keyWidth="7.949%p"
+            latin:keyWidth="7.969%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="1"
@@ -70,16 +71,17 @@
             latin:popupCharacters="ⁿ,∅" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="9.331%p"
+            latin:keyXPos="-9.219%p"
+            latin:keyWidth="fillRight"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
-        latin:keyWidth="8.157%p"
+        latin:keyWidth="8.125%p"
     >
         <Key
             latin:keyStyle="toAlphaKeyStyle"
             latin:keyLabelOption="alignLeft"
-            latin:keyWidth="11.167%p"
+            latin:keyWidth="11.172%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="#" />
@@ -107,15 +109,16 @@
             latin:popupCharacters="],},&gt;" />
         <Key
             latin:keyStyle="returnKeyStyle"
-            latin:keyWidth="15.750%p"
+            latin:keyXPos="-15.704%p"
+            latin:keyWidth="fillBoth"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
-        latin:keyWidth="8.042%p"
+        latin:keyWidth="8.047%p"
     >
         <Key
             latin:keyStyle="moreKeyStyle"
-            latin:keyWidth="15.192%p"
+            latin:keyWidth="13.829%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="&lt;"
@@ -128,16 +131,11 @@
             latin:popupCharacters="≠,≈" />
         <switch>
             <case
-                latin:languageCode="ru"
-            >
-                <Key
-                    latin:keyLabel=":" />
-            </case>
-            <case
                 latin:mode="url"
             >
                 <Key
-                    latin:keyLabel="\'" />
+                    latin:keyLabel="\'"
+                    latin:popupCharacters="‘,’,‚,‛" />
             </case>
             <default>
                 <Key
@@ -146,85 +144,59 @@
         </switch>
         <Key
             latin:keyLabel=";" />
-        <switch>
-            <case
-                latin:languageCode="ru"
-            >
-                <Key
-                    latin:keyLabel="\'" />
-                <Key
-                    latin:keyLabel="&quot;"
-                    latin:popupCharacters="“,”,«,»,˝" />
-                <Key
-                    latin:keyLabel="." />
-                <Key
-                    latin:keyLabel="," />
-            </case>
-            <default>
-                <Key
-                    latin:keyLabel="," />
-                <Key
-                    latin:keyLabel="." />
-                <Key
-                    latin:keyLabel="!"
-                    latin:popupCharacters="¡" />
-                <Key
-                    latin:keyLabel="\?"
-                    latin:popupCharacters="¿" />
-            </default>
-        </switch>
+        <Key
+            latin:keyLabel="," />
+        <Key
+            latin:keyLabel="." />
+        <Key
+            latin:keyLabel="!"
+            latin:popupCharacters="¡" />
+        <Key
+            latin:keyLabel="\?"
+            latin:popupCharacters="¿" />
         <Key
             latin:keyStyle="moreKeyStyle"
-            latin:keyWidth="12.530%p"
+            latin:keyXPos="-13.750%p"
+            latin:keyWidth="fillBoth"
             latin:keyEdgeFlags="right" />
     </Row>
     <!-- This row is intentionally not marked as a bottom row -->
     <Row
-        latin:keyWidth="8.042%p"
+        latin:keyWidth="8.047%p"
     >
-        <Spacer
-            latin:horizontalGap="8.362%p" />
         <switch>
-            <case latin:hasSettingsKey="true">
+            <case
+                latin:hasSettingsKey="true"
+            >
                 <Key
-                    latin:keyStyle="settingsKeyStyle" />
+                    latin:keyStyle="settingsKeyStyle"
+                    latin:keyWidth="8.047%p" />
             </case>
-            <default>
-                <Spacer
-                    latin:horizontalGap="8.042%p" />
-            </default>
         </switch>
         <Key
-            latin:keyLabel="/" />
+            latin:keyLabel="/"
+            latin:keyXPos="15.157%p" />
         <Key
             latin:keyLabel="\@" />
         <Key
             latin:keyStyle="spaceKeyStyle"
-            latin:keyWidth="37.454%p" />
-        <switch>
-            <case
-                latin:languageCode="ru"
-            >
-                <Key
-                    latin:keyLabel="_" />
-                <Key
-                    latin:keyLabel="-" />
-            </case>
-            <default>
-                <!-- Note: DroidSans doesn't have double-high-reversed-quotation '\u201f' glyph. -->
-                <Key
-                    latin:keyLabel="&quot;"
-                    latin:popupCharacters="“,”,„,‟,«,»,‘,’,‚,‛" />
-                <Key
-                    latin:keyLabel="_" />
-            </default>
-        </switch>
+            latin:keyXPos="31.250%p"
+            latin:keyWidth="37.500%p" />
+        <!-- Note: DroidSans doesn't have double-high-reversed-quotation '\u201f' glyph. -->
+        <!-- latin:popupCharacters="“,”,„,‟,«,»,‘,’,‚,‛" -->
+        <Key
+            latin:keyLabel="&quot;"
+            latin:popupCharacters="“,”,«,»,‘,’,‚,‛" />
+        <Key
+            latin:keyLabel="_" />
         <switch>
             <case
                 latin:voiceKeyEnabled="true"
             >
                 <Key
-                    latin:keyStyle="micKeyStyle" />
+                    latin:keyStyle="micKeyStyle"
+                    latin:keyXPos="-8.047%p"
+                    latin:keyWidth="fillRight" />
             </case>
         </switch>
     </Row>
diff --git a/java/res/xml-xlarge/kbd_symbols_shift.xml b/java/res/xml-sw768dp/kbd_symbols_shift.xml
similarity index 84%
rename from java/res/xml-xlarge/kbd_symbols_shift.xml
rename to java/res/xml-sw768dp/kbd_symbols_shift.xml
index cc23358..94bd761 100644
--- a/java/res/xml-xlarge/kbd_symbols_shift.xml
+++ b/java/res/xml-sw768dp/kbd_symbols_shift.xml
@@ -21,7 +21,8 @@
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyboardHeight="@dimen/keyboardHeight"
-    latin:maxKeyboardHeight="50%p"
+    latin:maxKeyboardHeight="@fraction/maxKeyboardHeight"
+    latin:minKeyboardHeight="@fraction/minKeyboardHeight"
     latin:rowHeight="25%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
     latin:verticalGap="@dimen/key_bottom_gap"
@@ -32,12 +33,12 @@
         latin:keyboardLayout="@xml/kbd_key_styles" />
     <!-- This row is intentionally not marked as a top row -->
     <Row
-        latin:keyWidth="8.272%p"
+        latin:keyWidth="8.282%p"
     >
         <Key
             latin:keyStyle="tabKeyStyle"
             latin:keyLabelOption="alignLeft"
-            latin:keyWidth="7.949%p"
+            latin:keyWidth="7.969%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="~" />
@@ -71,16 +72,17 @@
             latin:keyLabel="Δ" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="9.331%p"
+            latin:keyXPos="-9.219%p"
+            latin:keyWidth="fillBoth"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
-        latin:keyWidth="8.157%p"
+        latin:keyWidth="8.125%p"
     >
         <Key
             latin:keyStyle="toAlphaKeyStyle"
             latin:keyLabelOption="alignLeft"
-            latin:keyWidth="11.167%p"
+            latin:keyWidth="11.172%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyStyle="nonPasswordSymbolKeyStyle"
@@ -111,15 +113,16 @@
             latin:keyLabel="}" />
         <Key
             latin:keyStyle="returnKeyStyle"
-            latin:keyWidth="15.750%p"
+            latin:keyXPos="-15.704%p"
+            latin:keyWidth="fillBoth"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
-        latin:keyWidth="8.042%p"
+        latin:keyWidth="8.047%p"
     >
         <Key
             latin:keyStyle="moreKeyStyle"
-            latin:keyWidth="15.192%p"
+            latin:keyWidth="13.829%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="\\" />
@@ -147,34 +150,33 @@
             latin:keyLabel="¿" />
         <Key
             latin:keyStyle="moreKeyStyle"
-            latin:keyWidth="12.530%p"
+            latin:keyXPos="-13.750%p"
+            latin:keyWidth="fillBoth"
             latin:keyEdgeFlags="right" />
     </Row>
     <!-- This row is intentionally not marked as a bottom row -->
     <Row
-        latin:keyWidth="8.042%p"
+        latin:keyWidth="8.047%p"
     >
-        <Spacer
-            latin:horizontalGap="24.446%p" />
         <switch>
             <case latin:hasSettingsKey="true">
                 <Key
-                    latin:keyStyle="settingsKeyStyle" />
+                    latin:keyStyle="settingsKeyStyle"
+                    latin:keyWidth="8.047%p" />
             </case>
-            <default>
-                <Spacer
-                    latin:horizontalGap="8.042%p" />
-            </default>
         </switch>
         <Key
             latin:keyStyle="spaceKeyStyle"
-            latin:keyWidth="37.454%p" />
+            latin:keyXPos="31.250%p"
+            latin:keyWidth="37.500%p" />
         <switch>
             <case
                 latin:voiceKeyEnabled="true"
             >
                 <Key
-                    latin:keyStyle="micKeyStyle" />
+                    latin:keyStyle="micKeyStyle"
+                    latin:keyXPos="-8.047%p"
+                    latin:keyWidth="fillRight" />
             </case>
         </switch>
     </Row>
diff --git a/java/res/xml-xlarge/kbd_qwerty_row4.xml b/java/res/xml-xlarge/kbd_qwerty_row4.xml
deleted file mode 100644
index f36b61f..0000000
--- a/java/res/xml-xlarge/kbd_qwerty_row4.xml
+++ /dev/null
@@ -1,258 +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"
->
-    <!-- This row is intentionally not marked as a bottom row -->
-    <Row
-        latin:keyWidth="8.042%p"
-    >
-        <Spacer
-            latin:horizontalGap="8.362%p" />
-        <switch>
-            <case latin:hasSettingsKey="true">
-                <Key
-                    latin:keyStyle="settingsKeyStyle" />
-            </case>
-            <default>
-                <Spacer
-                    latin:horizontalGap="8.042%p" />
-            </default>
-        </switch>
-        <switch>
-            <case
-                latin:languageCode="ru"
-            >
-                <switch>
-                    <!-- TODO: implement logical OR for <case> attribute -->
-                    <case
-                        latin:mode="email"
-                    >
-                        <Key
-                            latin:keyStyle="comKeyStyle" />
-                    </case>
-                    <case
-                        latin:mode="url"
-                    >
-                        <Key
-                            latin:keyStyle="comKeyStyle" />
-                    </case>
-                    <case
-                        latin:imeAction="actionSearch"
-                    >
-                        <Key
-                            latin:keyLabel=":"
-                            latin:manualTemporaryUpperCaseCode="43"
-                            latin:keyHintIcon="@drawable/key_hint_plus_holo"
-                            latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_plus_large_holo"
-                            latin:popupCharacters="+" />
-                    </case>
-                    <default>
-                        <Key
-                            latin:keyStyle="smileyKeyStyle" />
-                    </default>
-                </switch>
-                <switch>
-                    <case
-                        latin:mode="email"
-                    >
-                        <Key
-                            latin:keyLabel="\@" />
-                    </case>
-                    <case
-                        latin:mode="url"
-                    >
-                        <Key
-                            latin:keyLabel="-"
-                            latin:manualTemporaryUpperCaseCode="95"
-                            latin:keyHintIcon="@drawable/key_hint_underline_holo"
-                            latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_underline_large_holo"
-                            latin:popupCharacters="_" />
-                    </case>
-                    <default>
-                        <Key
-                            latin:keyLabel="/"
-                            latin:manualTemporaryUpperCaseCode="64"
-                            latin:keyHintIcon="@drawable/key_hint_at_holo"
-                            latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_at_large_holo"
-                            latin:popupCharacters="\@" />
-                    </default>
-                </switch>
-            </case>
-            <!-- not languageCode="ru" -->
-            <default>
-                <switch>
-                    <case
-                        latin:mode="url"
-                    >
-                        <Key
-                            latin:keyStyle="comKeyStyle"
-                            latin:keyWidth="16.084%p" />
-                    </case>
-                    <default>
-                        <switch>
-                            <case
-                                latin:mode="email"
-                            >
-                                <Key
-                                    latin:keyStyle="comKeyStyle" />
-                            </case>
-                            <case
-                                latin:imeAction="actionSearch"
-                            >
-                                <Key
-                                    latin:keyLabel=":"
-                                    latin:manualTemporaryUpperCaseCode="43"
-                                    latin:keyHintIcon="@drawable/key_hint_plus_holo"
-                                    latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_plus_large_holo"
-                                    latin:popupCharacters="+" />
-                            </case>
-                            <default>
-                                <Key
-                                    latin:keyStyle="smileyKeyStyle" />
-                            </default>
-                        </switch>
-                        <switch>
-                            <case
-                                latin:mode="email"
-                            >
-                                <Key
-                                    latin:keyLabel="\@" />
-                            </case>
-                            <default>
-                                <Key
-                                    latin:keyLabel="/"
-                                    latin:manualTemporaryUpperCaseCode="64"
-                                    latin:keyHintIcon="@drawable/key_hint_at_holo"
-                                    latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_at_large_holo"
-                                    latin:popupCharacters="\@" />
-                            </default>
-                        </switch>
-                    </default>
-                </switch>
-            </default>
-        </switch>
-        <Key
-            latin:keyStyle="spaceKeyStyle"
-            latin:keyWidth="37.454%p" />
-        <switch>
-            <case
-                latin:languageCode="ru"
-            >
-                <switch>
-                    <case
-                        latin:mode="email"
-                    >
-                        <Key
-                            latin:keyLabel="-" />
-                    </case>
-                    <case
-                        latin:mode="url"
-                    >
-                        <Key
-                            latin:keyLabel="/"
-                            latin:manualTemporaryUpperCaseCode="58"
-                            latin:keyHintIcon="@drawable/key_hint_colon_holo"
-                            latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_colon_large_holo"
-                            latin:popupCharacters=":" />
-                    </case>
-                    <default>
-                        <Key
-                            latin:keyLabel="\?"
-                            latin:manualTemporaryUpperCaseCode="95"
-                            latin:keyHintIcon="@drawable/key_hint_underline_holo"
-                            latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_underline_large_holo"
-                            latin:popupCharacters="_" />
-                    </default>
-                </switch>
-                <switch>
-                    <case
-                        latin:mode="email"
-                    >
-                        <Key
-                            latin:keyLabel="_" />
-                    </case>
-                    <default>
-                        <Key
-                            latin:keyLabel="!"
-                            latin:manualTemporaryUpperCaseCode="39"
-                            latin:keyHintIcon="@drawable/key_hint_quote_holo"
-                            latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_quote_large_holo"
-                            latin:popupCharacters="\'" />
-                    </default>
-                </switch>
-            </case>
-            <!-- not languageCode="ru" -->
-            <default>
-                <switch>
-                    <case
-                        latin:mode="email"
-                    >
-                        <Key
-                            latin:keyLabel="-" />
-                    </case>
-                    <case
-                        latin:mode="url"
-                    >
-                        <Key
-                            latin:keyLabel="/"
-                            latin:manualTemporaryUpperCaseCode="58"
-                            latin:keyHintIcon="@drawable/key_hint_colon_holo"
-                            latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_colon_large_holo"
-                            latin:popupCharacters=":" />
-                    </case>
-                    <default>
-                        <Key
-                            latin:keyLabel="\'"
-                            latin:manualTemporaryUpperCaseCode="34"
-                            latin:keyHintIcon="@drawable/key_hint_quote_holo"
-                            latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_quote_large_holo"
-                            latin:popupCharacters="&quot;" />
-                    </default>
-                </switch>
-                <switch>
-                    <case
-                        latin:mode="email"
-                    >
-                        <Key
-                            latin:keyLabel="_" />
-                    </case>
-                    <default>
-                        <Key
-                            latin:keyLabel="-"
-                            latin:manualTemporaryUpperCaseCode="95"
-                            latin:keyHintIcon="@drawable/key_hint_underline_holo"
-                            latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_underline_large_holo"
-                            latin:popupCharacters="_" />
-                    </default>
-                </switch>
-            </default>
-        </switch>
-        <switch>
-            <case
-                latin:voiceKeyEnabled="true"
-            >
-                <Key
-                    latin:keyStyle="micKeyStyle" />
-            </case>
-        </switch>
-    </Row>
-</merge>
diff --git a/java/res/xml/kbd_ar_rows.xml b/java/res/xml/kbd_ar_rows.xml
index b2ea457..a548775 100644
--- a/java/res/xml/kbd_ar_rows.xml
+++ b/java/res/xml/kbd_ar_rows.xml
@@ -53,6 +53,7 @@
         <Key
             latin:keyLabel="ج"
             latin:popupCharacters="چ"
+            latin:keyWidth="fillRight"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
@@ -84,6 +85,7 @@
         <Key
             latin:keyLabel="ك"
             latin:popupCharacters="گ"
+            latin:keyWidth="fillRight"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
@@ -112,7 +114,8 @@
             latin:keyLabel="ث" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="12%p"
+            latin:keyWidth="fillRight"
+            latin:visualInsetsLeft="1%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <include latin:keyboardLayout="@xml/kbd_qwerty_row4" />
diff --git a/java/res/xml/kbd_azerty_rows.xml b/java/res/xml/kbd_azerty_rows.xml
index ab3e1a0..9c81aad 100644
--- a/java/res/xml/kbd_azerty_rows.xml
+++ b/java/res/xml/kbd_azerty_rows.xml
@@ -29,45 +29,46 @@
     >
         <Key
             latin:keyLabel="a"
-            latin:keyHintIcon="@drawable/keyboard_hint_1"
+            latin:keyHintIcon="@drawable/key_hint_num1"
             latin:popupCharacters="@string/alternates_for_a"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="z"
-            latin:keyHintIcon="@drawable/keyboard_hint_2"
+            latin:keyHintIcon="@drawable/key_hint_num2"
             latin:popupCharacters="@string/alternates_for_z" />
         <Key
             latin:keyLabel="e"
-            latin:keyHintIcon="@drawable/keyboard_hint_3"
+            latin:keyHintIcon="@drawable/key_hint_num3"
             latin:popupCharacters="@string/alternates_for_e" />
         <Key
             latin:keyLabel="r"
-            latin:keyHintIcon="@drawable/keyboard_hint_4"
+            latin:keyHintIcon="@drawable/key_hint_num4"
             latin:popupCharacters="@string/alternates_for_r" />
         <Key
             latin:keyLabel="t"
-            latin:keyHintIcon="@drawable/keyboard_hint_5"
+            latin:keyHintIcon="@drawable/key_hint_num5"
             latin:popupCharacters="@string/alternates_for_t" />
         <Key
             latin:keyLabel="y"
-            latin:keyHintIcon="@drawable/keyboard_hint_6"
+            latin:keyHintIcon="@drawable/key_hint_num6"
             latin:popupCharacters="@string/alternates_for_y" />
         <Key
             latin:keyLabel="u"
-            latin:keyHintIcon="@drawable/keyboard_hint_7"
+            latin:keyHintIcon="@drawable/key_hint_num7"
             latin:popupCharacters="@string/alternates_for_u" />
         <Key
             latin:keyLabel="i"
-            latin:keyHintIcon="@drawable/keyboard_hint_8"
+            latin:keyHintIcon="@drawable/key_hint_num8"
             latin:popupCharacters="@string/alternates_for_i" />
         <Key
             latin:keyLabel="o"
-            latin:keyHintIcon="@drawable/keyboard_hint_9"
+            latin:keyHintIcon="@drawable/key_hint_num9"
             latin:popupCharacters="@string/alternates_for_o" />
         <Key
             latin:keyLabel="p"
-            latin:keyHintIcon="@drawable/keyboard_hint_0"
+            latin:keyHintIcon="@drawable/key_hint_num0"
             latin:popupCharacters="@string/alternates_for_p"
+            latin:keyWidth="fillRight"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
@@ -100,6 +101,7 @@
             latin:popupCharacters="@string/alternates_for_l" />
         <Key
             latin:keyLabel="m"
+            latin:keyWidth="fillRight"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
@@ -128,10 +130,11 @@
             latin:keyLabel="n"
             latin:popupCharacters="@string/alternates_for_n" />
         <Key
-            latin:keyLabel="\'" />
+            latin:keyLabel="\'"
+            latin:popupCharacters="‘,’,‚,‛" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="15%p"
+            latin:keyWidth="fillRight"
             latin:visualInsetsLeft="1%p"
             latin:keyEdgeFlags="right" />
     </Row>
diff --git a/java/res/xml/kbd_currency_key_styles.xml b/java/res/xml/kbd_currency_key_styles.xml
index b30dd64..9d3bb47 100644
--- a/java/res/xml/kbd_currency_key_styles.xml
+++ b/java/res/xml/kbd_currency_key_styles.xml
@@ -27,229 +27,59 @@
         >
             <key-style
                 latin:styleName="currencyKeyStyle"
-                latin:keyLabel="$"
-                latin:popupCharacters="@string/alternates_for_currency_dollar" />
+                latin:keyLabel="$" />
         </case>
         <!-- Countries using Euro currency, 23 countries as for January 2011. -->
-        <!-- 1. Andorra (ca_AD, ca_ES) -->
+              1. Andorra (ca_AD, ca_ES)
+              2. Austria (de_AT)
+              3. Belgium (nl_BE, fr_BE, de_BE)
+              4. Cyprus (el_CY, tr_CY)
+              5. Estonia (et_EE)
+              6. Finland (fi_FI, sv_FI)
+              7. France (fr_FR)
+              8. Germany (de_DE)
+              9. Greece (el_GR)
+             10. Ireland (ga_IE, en_IE)
+             11. Italy (it_IT)
+             12. Kosovo (??_XK) ??
+             13. Luxembourg (lb_LU, fr_LU, de_LU)
+             14. Malta (mt_MT, en_MT)
+             15. Monaco (fr_MO)
+             16. Montenegro (sla_ME)
+             17. Netherlands (nl_NL)
+             18. Portugal (pt_PT)
+             19. San Marino (it_SM)
+             20. Slovakia (sk_SK)
+             21. Slovenia (sl_SI)
+             22. Spain (es_ES, ca_ES)
+             23. Vatican City (it_VA)
+        -->
+        <!-- Note: Some locales may not have country code, and it it supposed to indicate the
+             country where the language originally/mainly spoken. -->
         <case
-            latin:languageCode="ca"
-            latin:countryCode=""
+            latin:localeCode="de|es|el|fi|fr|it|nl|sk|sl|pt_PT"
         >
             <key-style
                 latin:styleName="currencyKeyStyle"
                 latin:keyLabel="€"
                 latin:popupCharacters="@string/alternates_for_currency_euro" />
         </case>
-        <!-- 2. Austria (de_AT) -->
-<!--        <case-->
-<!--            latin:countryCode="AT"-->
-<!--        >-->
-<!--            <key-style-->
-<!--                latin:styleName="currencyKeyStyle"-->
-<!--                latin:keyLabel="€"-->
-<!--                latin:popupCharacters="@string/alternates_for_currency_euro" />-->
-<!--        </case>-->
-        <!-- 3. Belgium (nl_BE, fr_BE, de_BE) -->
-<!--        <case-->
-<!--            latin:countryCode="BE"-->
-<!--        >-->
-<!--            <key-style-->
-<!--                latin:styleName="currencyKeyStyle"-->
-<!--                latin:keyLabel="€"-->
-<!--                latin:popupCharacters="@string/alternates_for_currency_euro" />-->
-<!--        </case>-->
-        <!-- 4. Cyprus (el_CY, tr_CY) -->
         <case
-            latin:countryCode="CY"
+            latin:languageCode="ca|et|lb|mt|sla"
         >
             <key-style
                 latin:styleName="currencyKeyStyle"
                 latin:keyLabel="€"
                 latin:popupCharacters="@string/alternates_for_currency_euro" />
         </case>
-        <!-- 5. Estonia (et_EE) -->
-<!--        <case-->
-<!--            latin:languageCode="et"-->
-<!--            latin:countryCode=""-->
-<!--        >-->
-<!--            <key-style-->
-<!--                latin:styleName="currencyKeyStyle"-->
-<!--                latin:keyLabel="€"-->
-<!--                latin:popupCharacters="@string/alternates_for_currency_euro" />-->
-<!--        </case>-->
-        <!-- 6. Finland (fi_FI, sv_FI) -->
         <case
-            latin:languageCode="fi"
-            latin:countryCode=""
+            latin:countryCode="AD|AT|BE|CY|EE|FI|FR|DE|GR|IE|IT|XK|LU|MT|MO|ME|NL|PT|SM|SK|SI|ES|VA"
         >
             <key-style
                 latin:styleName="currencyKeyStyle"
                 latin:keyLabel="€"
                 latin:popupCharacters="@string/alternates_for_currency_euro" />
         </case>
-        <!-- 7. France (fr_FR) -->
-        <case
-            latin:languageCode="fr"
-            latin:countryCode=""
-        >
-            <key-style
-                latin:styleName="currencyKeyStyle"
-                latin:keyLabel="€"
-                latin:popupCharacters="@string/alternates_for_currency_euro" />
-        </case>
-        <!-- 8. Germany (de_DE) -->
-        <case
-            latin:languageCode="de"
-            latin:countryCode=""
-        >
-            <key-style
-                latin:styleName="currencyKeyStyle"
-                latin:keyLabel="€"
-                latin:popupCharacters="@string/alternates_for_currency_euro" />
-        </case>
-        <!-- 9. Greece (el_GR) -->
-        <case
-            latin:languageCode="el"
-            latin:countryCode=""
-        >
-            <key-style
-                latin:styleName="currencyKeyStyle"
-                latin:keyLabel="€"
-                latin:popupCharacters="@string/alternates_for_currency_euro" />
-        </case>
-        <!-- 10. Ireland (ga_IE, en_IE) -->
-        <case
-            latin:countryCode="IE"
-        >
-            <key-style
-                latin:styleName="currencyKeyStyle"
-                latin:keyLabel="€"
-                latin:popupCharacters="@string/alternates_for_currency_euro" />
-        </case>
-        <!-- 11. Italy (it_IT) -->
-        <case
-            latin:languageCode="it"
-            latin:countryCode=""
-        >
-            <key-style
-                latin:styleName="currencyKeyStyle"
-                latin:keyLabel="€"
-                latin:popupCharacters="@string/alternates_for_currency_euro" />
-        </case>
-        <!-- 12. Kosovo -->
-<!--        <case-->
-<!--            latin:countryCode="XK"-->
-<!--        >-->
-<!--            <key-style-->
-<!--                latin:styleName="currencyKeyStyle"-->
-<!--                latin:keyLabel="€"-->
-<!--                latin:popupCharacters="@string/alternates_for_currency_euro" />-->
-<!--        </case>-->
-        <!-- 13. Luxembourg (lb_LU, fr_LU, de_LU) -->
-        <case
-            latin:countryCode="LU"
-        >
-            <key-style
-                latin:styleName="currencyKeyStyle"
-                latin:keyLabel="€"
-                latin:popupCharacters="@string/alternates_for_currency_euro" />
-        </case>
-        <!-- 14. Malta (mt_MT, en_MT) -->
-        <case
-            latin:countryCode="MT"
-        >
-            <key-style
-                latin:styleName="currencyKeyStyle"
-                latin:keyLabel="€"
-                latin:popupCharacters="@string/alternates_for_currency_euro" />
-        </case>
-        <!-- 15. Monaco (fr_MO) -->
-<!--        <case-->
-<!--            latin:countryCode="MO"-->
-<!--        >-->
-<!--            <key-style-->
-<!--                latin:styleName="currencyKeyStyle"-->
-<!--                latin:keyLabel="€"-->
-<!--                latin:popupCharacters="@string/alternates_for_currency_euro" />-->
-<!--        </case>-->
-        <!-- 16. Montenegro (sla_ME) -->
-        <case
-            latin:countryCode="ME"
-        >
-            <key-style
-                latin:styleName="currencyKeyStyle"
-                latin:keyLabel="€"
-                latin:popupCharacters="@string/alternates_for_currency_euro" />
-        </case>
-        <!-- 17. Netherlands (nl_NL) -->
-        <case
-            latin:languageCode="nl"
-            latin:countryCode=""
-        >
-            <key-style
-                latin:styleName="currencyKeyStyle"
-                latin:keyLabel="€"
-                latin:popupCharacters="@string/alternates_for_currency_euro" />
-        </case>
-        <!-- 18. Portugal (pt_PT) -->
-        <case
-            latin:languageCode="pt"
-            latin:countryCode=""
-        >
-            <key-style
-                latin:styleName="currencyKeyStyle"
-                latin:keyLabel="€"
-                latin:popupCharacters="@string/alternates_for_currency_euro" />
-        </case>
-        <!-- 19. San Marino (it_SM) -->
-<!--        <case-->
-<!--            latin:countryCode="SM"-->
-<!--        >-->
-<!--            <key-style-->
-<!--                latin:styleName="currencyKeyStyle"-->
-<!--                latin:keyLabel="€"-->
-<!--                latin:popupCharacters="@string/alternates_for_currency_euro" />-->
-<!--        </case>-->
-        <!-- 20. Slovakia (sk_SK) -->
-        <case
-            latin:languageCode="sk"
-            latin:countryCode=""
-        >
-            <key-style
-                latin:styleName="currencyKeyStyle"
-                latin:keyLabel="€"
-                latin:popupCharacters="@string/alternates_for_currency_euro" />
-        </case>
-        <!-- 21. Slovenia (sl_SI) -->
-        <case
-            latin:languageCode="sl"
-            latin:countryCode=""
-        >
-            <key-style
-                latin:styleName="currencyKeyStyle"
-                latin:keyLabel="€"
-                latin:popupCharacters="@string/alternates_for_currency_euro" />
-        </case>
-        <!-- 22. Spain (es_ES, ca_ES) -->
-        <case
-            latin:languageCode="es"
-            latin:countryCode=""
-        >
-            <key-style
-                latin:styleName="currencyKeyStyle"
-                latin:keyLabel="€"
-                latin:popupCharacters="@string/alternates_for_currency_euro" />
-        </case>
-        <!-- 23. Vatican City (it_VA) -->
-<!--        <case-->
-<!--            latin:countryCode="VA"-->
-<!--        >-->
-<!--            <key-style-->
-<!--                latin:styleName="currencyKeyStyle"-->
-<!--                latin:keyLabel="€"-->
-<!--                latin:popupCharacters="@string/alternates_for_currency_euro" />-->
-<!--        </case>-->
         <!-- United Kingdom -->
         <case
             latin:countryCode="GB"
@@ -266,4 +96,4 @@
                 latin:popupCharacters="@string/alternates_for_currency_dollar" />
         </default>
     </switch>
-</merge>
\ No newline at end of file
+</merge>
diff --git a/java/res/xml/kbd_iw_rows.xml b/java/res/xml/kbd_iw_rows.xml
index fb0c2a9..c3c8f7d 100644
--- a/java/res/xml/kbd_iw_rows.xml
+++ b/java/res/xml/kbd_iw_rows.xml
@@ -27,12 +27,12 @@
     <include
         latin:keyboardLayout="@xml/kbd_key_styles" />
     <Row
+        latin:keyWidth="10%p"
         latin:rowEdgeFlags="top"
     >
-        <Spacer
-            latin:horizontalGap="5%p" />
         <Key
             latin:keyLabel="ק"
+            latin:keyXPos="5%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="ר" />
@@ -50,11 +50,13 @@
             latin:keyLabel="פ" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="15%p"
+            latin:keyWidth="fillRight"
             latin:visualInsetsLeft="1%p"
             latin:keyEdgeFlags="right" />
     </Row>
-    <Row>
+    <Row
+        latin:keyWidth="10%p"
+    >
         <Key
             latin:keyLabel="ש"
             latin:keyEdgeFlags="left" />
@@ -76,13 +78,15 @@
             latin:keyLabel="ך" />
         <Key
             latin:keyLabel="ף"
+            latin:keyWidth="fillRight"
             latin:keyEdgeFlags="right" />
     </Row>
-    <Row>
-        <Spacer
-            latin:horizontalGap="5%p" />
+    <Row
+        latin:keyWidth="10%p"
+    >
         <Key
             latin:keyLabel="ז"
+            latin:keyXPos="5%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="ס" />
@@ -101,6 +105,7 @@
         <Key
             latin:keyLabel="ץ"
             latin:keyEdgeFlags="right" />
+        <!-- Here is 5%p space -->
     </Row>
     <include latin:keyboardLayout="@xml/kbd_qwerty_row4" />
 </merge>
diff --git a/java/res/xml/kbd_key_styles.xml b/java/res/xml/kbd_key_styles.xml
index d4d25d4..f888b23 100644
--- a/java/res/xml/kbd_key_styles.xml
+++ b/java/res/xml/kbd_key_styles.xml
@@ -51,7 +51,7 @@
             <key-style
                 latin:styleName="settingsPopupStyle"
                 latin:keyHintIcon="@drawable/hint_popup"
-                latin:popupCharacters="\@drawable/sym_keyboard_settings|\@integer/key_settings"
+                latin:popupCharacters="\@drawable/sym_keyboard_settings_holo|\@integer/key_settings"
                 latin:parentStyle="functionalKeyStyle" />
         </default>
     </switch>
@@ -101,20 +101,20 @@
             <key-style
                 latin:styleName="settingsKeyStyle"
                 latin:code="@integer/key_settings"
-                latin:keyIcon="@drawable/sym_keyboard_settings"
-                latin:iconPreview="@drawable/sym_keyboard_feedback_settings"
+                latin:keyIcon="@drawable/sym_keyboard_settings_holo"
+                latin:iconPreview="@drawable/sym_keyboard_settings_holo"
                 latin:parentStyle="functionalKeyStyle" />
             <key-style
                 latin:styleName="spaceKeyStyle"
                 latin:code="@integer/key_space"
                 latin:keyIcon="@drawable/sym_keyboard_space"
-                latin:iconPreview="@drawable/sym_keyboard_feedback_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_feedback_tab"
+                latin:iconPreview="@drawable/sym_keyboard_tab"
                 latin:parentStyle="functionalKeyStyle" />
             <key-style
                 latin:styleName="micKeyStyle"
@@ -128,7 +128,7 @@
                 latin:styleName="nonSpecialBackgroundTabKeyStyle"
                 latin:code="@integer/key_tab"
                 latin:keyIcon="@drawable/sym_keyboard_tab"
-                latin:iconPreview="@drawable/sym_keyboard_feedback_tab" />
+                latin:iconPreview="@drawable/sym_keyboard_tab" />
         </case>
         <case
             latin:colorScheme="black"
@@ -277,7 +277,7 @@
                         latin:styleName="returnKeyStyle"
                         latin:code="@integer/key_return"
                         latin:keyIcon="@drawable/sym_keyboard_return"
-                        latin:iconPreview="@drawable/sym_keyboard_feedback_return"
+                        latin:iconPreview="@drawable/sym_keyboard_return"
                         latin:parentStyle="functionalKeyStyle" />
                 </case>
                 <case
diff --git a/java/res/xml/kbd_number.xml b/java/res/xml/kbd_number.xml
index 7bd679b..23b88a5 100644
--- a/java/res/xml/kbd_number.xml
+++ b/java/res/xml/kbd_number.xml
@@ -21,7 +21,8 @@
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyboardHeight="@dimen/keyboardHeight"
-    latin:maxKeyboardHeight="50%p"
+    latin:maxKeyboardHeight="@fraction/maxKeyboardHeight"
+    latin:minKeyboardHeight="@fraction/minKeyboardHeight"
     latin:rowHeight="25%p"
     latin:keyWidth="26.67%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
@@ -31,83 +32,118 @@
 >
     <include
         latin:keyboardLayout="@xml/kbd_key_styles" />
-    <!-- TODO: Should add number password layout just like the xlarge layout does. -->
+    <include
+        latin:keyboardLayout="@xml/kbd_numkey_styles" />
     <switch>
         <case
-            latin:colorScheme="white"
+            latin:passwordInput="true"
         >
-            <key-style
-                latin:styleName="numSpaceKeyStyle"
-                latin:code="@integer/key_space"
-                latin:keyIcon="@drawable/sym_keyboard_space"
-                latin:iconPreview="@drawable/sym_keyboard_feedback_space" />
+            <Row
+                latin:rowEdgeFlags="top"
+            >
+                <Key
+                    latin:keyStyle="num1KeyStyle"
+                    latin:keyEdgeFlags="left" />
+                <Key
+                    latin:keyStyle="num2KeyStyle" />
+                <Key
+                    latin:keyStyle="num3KeyStyle" />
+            </Row>
+            <Row>
+                <Key
+                    latin:keyStyle="num4KeyStyle"
+                    latin:keyEdgeFlags="left" />
+                <Key
+                    latin:keyStyle="num5KeyStyle" />
+                <Key
+                    latin:keyStyle="num6KeyStyle" />
+            </Row>
+            <Row>
+                <Key
+                    latin:keyStyle="num7KeyStyle"
+                    latin:keyEdgeFlags="left" />
+                <Key
+                    latin:keyStyle="num8KeyStyle" />
+                <Key
+                    latin:keyStyle="num9KeyStyle" />
+                <Key
+                    latin:keyStyle="deleteKeyStyle"
+                    latin:keyWidth="fillRight"
+                    latin:keyEdgeFlags="right" />
+            </Row>
+            <Row
+                latin:rowEdgeFlags="bottom"
+            >
+                <Spacer />
+                <Key
+                    latin:keyStyle="num0KeyStyle" />
+                <Spacer />
+                <Key
+                    latin:keyStyle="returnKeyStyle"
+                    latin:keyWidth="fillRight"
+                    latin:keyEdgeFlags="right" />
+            </Row>
         </case>
-        <case
-            latin:colorScheme="black"
-        >
-            <key-style
-                latin:styleName="numSpaceKeyStyle"
-                latin:code="@integer/key_space"
-                latin:keyIcon="@drawable/sym_bkeyboard_space"
-                latin:iconPreview="@drawable/sym_keyboard_feedback_space" />
-        </case>
+        <!-- latin:passwordInput="false" -->
+        <default>
+            <Row
+                latin:rowEdgeFlags="top"
+            >
+                <Key
+                    latin:keyLabel="1"
+                    latin:keyEdgeFlags="left" />
+                <Key
+                    latin:keyLabel="2" />
+                <Key
+                    latin:keyLabel="3" />
+                <Key
+                    latin:keyLabel="-"
+                    latin:keyStyle="functionalKeyStyle"
+                    latin:keyWidth="fillRight"
+                    latin:keyEdgeFlags="right" />
+            </Row>
+            <Row>
+                <Key
+                    latin:keyLabel="4"
+                    latin:keyEdgeFlags="left" />
+                <Key
+                    latin:keyLabel="5" />
+                <Key
+                    latin:keyLabel="6" />
+                <Key
+                    latin:keyLabel=","
+                    latin:keyStyle="functionalKeyStyle"
+                    latin:keyWidth="fillRight"
+                    latin:keyEdgeFlags="right" />
+            </Row>
+            <Row>
+                <Key
+                    latin:keyLabel="7"
+                    latin:keyEdgeFlags="left" />
+                <Key
+                    latin:keyLabel="8" />
+                <Key
+                    latin:keyLabel="9" />
+                <Key
+                    latin:keyStyle="deleteKeyStyle"
+                    latin:keyWidth="fillRight"
+                    latin:keyEdgeFlags="right" />
+            </Row>
+            <Row
+                latin:rowEdgeFlags="bottom"
+            >
+                <Key
+                    latin:keyStyle="numSpaceKeyStyle"
+                    latin:keyEdgeFlags="left" />
+                <Key
+                    latin:keyLabel="0" />
+                <Key
+                    latin:keyLabel="." />
+                <Key
+                    latin:keyStyle="returnKeyStyle"
+                    latin:keyWidth="fillRight"
+                    latin:keyEdgeFlags="right" />
+            </Row>
+        </default>
     </switch>
-    <Row
-        latin:rowEdgeFlags="top"
-    >
-        <Key
-            latin:keyLabel="1"
-            latin:keyEdgeFlags="left" />
-        <Key
-            latin:keyLabel="2" />
-        <Key
-            latin:keyLabel="3" />
-        <Key
-            latin:keyLabel="-"
-            latin:keyStyle="functionalKeyStyle"
-            latin:keyWidth="20%p"
-            latin:keyEdgeFlags="right" />
-    </Row>
-    <Row>
-        <Key
-            latin:keyLabel="4"
-            latin:keyEdgeFlags="left" />
-        <Key
-            latin:keyLabel="5" />
-        <Key
-            latin:keyLabel="6" />
-        <Key
-            latin:keyLabel=","
-            latin:keyStyle="functionalKeyStyle"
-            latin:keyWidth="20%p"
-            latin:keyEdgeFlags="right" />
-    </Row>
-    <Row>
-        <Key
-            latin:keyLabel="7"
-            latin:keyEdgeFlags="left" />
-        <Key
-            latin:keyLabel="8" />
-        <Key
-            latin:keyLabel="9" />
-        <Key
-            latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="20%p"
-            latin:keyEdgeFlags="right" />
-    </Row>
-    <Row
-        latin:rowEdgeFlags="bottom"
-    >
-        <Key
-            latin:keyStyle="numSpaceKeyStyle"
-            latin:keyEdgeFlags="left" />
-        <Key
-            latin:keyLabel="0" />
-        <Key
-            latin:keyLabel="." />
-        <Key
-            latin:keyStyle="returnKeyStyle"
-            latin:keyWidth="20%p"
-            latin:keyEdgeFlags="right" />
-    </Row>
 </Keyboard>
diff --git a/java/res/xml/kbd_phone.xml b/java/res/xml/kbd_phone.xml
index 62fbdee..e1d1ee8 100644
--- a/java/res/xml/kbd_phone.xml
+++ b/java/res/xml/kbd_phone.xml
@@ -21,7 +21,8 @@
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyboardHeight="@dimen/keyboardHeight"
-    latin:maxKeyboardHeight="50%p"
+    latin:maxKeyboardHeight="@fraction/maxKeyboardHeight"
+    latin:minKeyboardHeight="@fraction/minKeyboardHeight"
     latin:rowHeight="25%p"
     latin:keyWidth="26.67%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
@@ -46,7 +47,7 @@
         <Key
             latin:keyLabel="-"
             latin:keyStyle="functionalKeyStyle"
-            latin:keyWidth="20%p"
+            latin:keyWidth="fillRight"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row>
@@ -60,7 +61,7 @@
         <Key
             latin:keyLabel="."
             latin:keyStyle="functionalKeyStyle"
-            latin:keyWidth="20%p"
+            latin:keyWidth="fillRight"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row>
@@ -73,7 +74,7 @@
             latin:keyStyle="num9KeyStyle" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="20%p"
+            latin:keyWidth="fillRight"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
@@ -88,7 +89,7 @@
             latin:keyStyle="numSpaceKeyStyle" />
         <Key
             latin:keyStyle="returnKeyStyle"
-            latin:keyWidth="20%p"
+            latin:keyWidth="fillRight"
             latin:keyEdgeFlags="right" />
     </Row>
 </Keyboard>
diff --git a/java/res/xml/kbd_phone_symbols.xml b/java/res/xml/kbd_phone_symbols.xml
index 67cd330..2af218c 100644
--- a/java/res/xml/kbd_phone_symbols.xml
+++ b/java/res/xml/kbd_phone_symbols.xml
@@ -21,7 +21,8 @@
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyboardHeight="@dimen/keyboardHeight"
-    latin:maxKeyboardHeight="50%p"
+    latin:maxKeyboardHeight="@fraction/maxKeyboardHeight"
+    latin:minKeyboardHeight="@fraction/minKeyboardHeight"
     latin:rowHeight="25%p"
     latin:keyWidth="26.67%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
@@ -46,7 +47,7 @@
         <Key
             latin:keyLabel="-"
             latin:keyStyle="functionalKeyStyle"
-            latin:keyWidth="20%p"
+            latin:keyWidth="fillRight"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row>
@@ -63,7 +64,7 @@
         <Key
             latin:keyLabel="."
             latin:keyStyle="functionalKeyStyle"
-            latin:keyWidth="20%p"
+            latin:keyWidth="fillRight"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row>
@@ -78,7 +79,7 @@
             latin:keyStyle="numPoundKeyStyle" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="20%p"
+            latin:keyWidth="fillRight"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
@@ -94,7 +95,7 @@
             latin:keyStyle="numSpaceKeyStyle" />
         <Key
             latin:keyStyle="returnKeyStyle"
-            latin:keyWidth="20%p"
+            latin:keyWidth="fillRight"
             latin:keyEdgeFlags="right" />
     </Row>
 </Keyboard>
diff --git a/java/res/xml/kbd_qwerty.xml b/java/res/xml/kbd_qwerty.xml
index a4251c0..f0c1fa7 100644
--- a/java/res/xml/kbd_qwerty.xml
+++ b/java/res/xml/kbd_qwerty.xml
@@ -21,9 +21,9 @@
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyboardHeight="@dimen/keyboardHeight"
-    latin:maxKeyboardHeight="50%p"
+    latin:maxKeyboardHeight="@fraction/maxKeyboardHeight"
+    latin:minKeyboardHeight="@fraction/minKeyboardHeight"
     latin:rowHeight="25%p"
-    latin:keyWidth="10%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
     latin:verticalGap="@dimen/key_bottom_gap"
     latin:popupKeyboardTemplate="@xml/kbd_popup_template"
diff --git a/java/res/xml/kbd_qwerty_f1.xml b/java/res/xml/kbd_qwerty_f1.xml
index d0e2884..e89d02d 100644
--- a/java/res/xml/kbd_qwerty_f1.xml
+++ b/java/res/xml/kbd_qwerty_f1.xml
@@ -46,7 +46,7 @@
                 </case>
                 <!-- latin:hasVoiceKey="false" -->
                 <case
-                    latin:mode="web"
+                    latin:webInput="true"
                 >
                     <Key
                         latin:keyLabel="."
diff --git a/java/res/xml/kbd_qwerty_row1.xml b/java/res/xml/kbd_qwerty_row1.xml
index d924965..ba804d3 100644
--- a/java/res/xml/kbd_qwerty_row1.xml
+++ b/java/res/xml/kbd_qwerty_row1.xml
@@ -27,45 +27,46 @@
     >
         <Key
             latin:keyLabel="q"
-            latin:keyHintIcon="@drawable/keyboard_hint_1"
+            latin:keyHintIcon="@drawable/key_hint_num1"
             latin:popupCharacters="@string/alternates_for_q"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="w"
-            latin:keyHintIcon="@drawable/keyboard_hint_2"
+            latin:keyHintIcon="@drawable/key_hint_num2"
             latin:popupCharacters="@string/alternates_for_w" />
         <Key
             latin:keyLabel="e"
-            latin:keyHintIcon="@drawable/keyboard_hint_3"
+            latin:keyHintIcon="@drawable/key_hint_num3"
             latin:popupCharacters="@string/alternates_for_e" />
         <Key
             latin:keyLabel="r"
-            latin:keyHintIcon="@drawable/keyboard_hint_4"
+            latin:keyHintIcon="@drawable/key_hint_num4"
             latin:popupCharacters="@string/alternates_for_r" />
         <Key
             latin:keyLabel="t"
-            latin:keyHintIcon="@drawable/keyboard_hint_5"
+            latin:keyHintIcon="@drawable/key_hint_num5"
             latin:popupCharacters="@string/alternates_for_t" />
         <Key
             latin:keyLabel="y"
-            latin:keyHintIcon="@drawable/keyboard_hint_6"
+            latin:keyHintIcon="@drawable/key_hint_num6"
             latin:popupCharacters="@string/alternates_for_y" />
         <Key
             latin:keyLabel="u"
-            latin:keyHintIcon="@drawable/keyboard_hint_7"
+            latin:keyHintIcon="@drawable/key_hint_num7"
             latin:popupCharacters="@string/alternates_for_u" />
         <Key
             latin:keyLabel="i"
-            latin:keyHintIcon="@drawable/keyboard_hint_8"
+            latin:keyHintIcon="@drawable/key_hint_num8"
             latin:popupCharacters="@string/alternates_for_i" />
         <Key
             latin:keyLabel="o"
-            latin:keyHintIcon="@drawable/keyboard_hint_9"
+            latin:keyHintIcon="@drawable/key_hint_num9"
             latin:popupCharacters="@string/alternates_for_o" />
         <Key
             latin:keyLabel="p"
-            latin:keyHintIcon="@drawable/keyboard_hint_0"
+            latin:keyHintIcon="@drawable/key_hint_num0"
             latin:popupCharacters="@string/alternates_for_p"
+            latin:keyWidth="fillRight"
             latin:keyEdgeFlags="right" />
     </Row>
 </merge>
diff --git a/java/res/xml/kbd_qwerty_row2.xml b/java/res/xml/kbd_qwerty_row2.xml
index 9ed4553..57bbad7 100644
--- a/java/res/xml/kbd_qwerty_row2.xml
+++ b/java/res/xml/kbd_qwerty_row2.xml
@@ -24,11 +24,10 @@
     <Row
         latin:keyWidth="10%p"
     >
-        <Spacer
-            latin:horizontalGap="5%p" />
         <Key
             latin:keyLabel="a"
             latin:popupCharacters="@string/alternates_for_a"
+            latin:keyXPos="5%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="s"
@@ -52,5 +51,6 @@
             latin:keyLabel="l"
             latin:popupCharacters="@string/alternates_for_l"
             latin:keyEdgeFlags="right" />
+        <!-- Here is 5%p space -->
     </Row>
 </merge>
diff --git a/java/res/xml/kbd_qwerty_row3.xml b/java/res/xml/kbd_qwerty_row3.xml
index 3d106e6..98f0404 100644
--- a/java/res/xml/kbd_qwerty_row3.xml
+++ b/java/res/xml/kbd_qwerty_row3.xml
@@ -49,7 +49,7 @@
             latin:keyLabel="m" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="15%p"
+            latin:keyWidth="fillBoth"
             latin:visualInsetsLeft="1%p"
             latin:keyEdgeFlags="right" />
     </Row>
diff --git a/java/res/xml/kbd_qwerty_row4.xml b/java/res/xml/kbd_qwerty_row4.xml
index 82f5a4a..21d80eb 100644
--- a/java/res/xml/kbd_qwerty_row4.xml
+++ b/java/res/xml/kbd_qwerty_row4.xml
@@ -27,54 +27,6 @@
     >
         <switch>
             <case
-                latin:hasSettingsKey="false"
-            >
-                <Key
-                    latin:keyStyle="toSymbolKeyStyle"
-                    latin:keyWidth="20%p"
-                    latin:keyEdgeFlags="left" />
-                <include
-                    latin:keyboardLayout="@xml/kbd_qwerty_f1" />
-                <Key
-                    latin:keyStyle="spaceKeyStyle"
-                    latin:keyWidth="40%p" />
-                <switch>
-                    <case
-                        latin:mode="web"
-                    >
-                         <Key
-                            latin:keyHintIcon="@drawable/hint_popup"
-                            latin:popupCharacters="@string/alternates_for_web_tab_punctuation"
-                            latin:maxPopupKeyboardColumn="8"
-                            latin:keyStyle="tabKeyStyle" />
-                    </case>
-                    <default>
-                        <Key
-                            latin:keyLabel="."
-                            latin:keyHintIcon="@drawable/hint_popup"
-                            latin:popupCharacters="@string/alternates_for_punctuation"
-                            latin:maxPopupKeyboardColumn="7"
-                            latin:keyStyle="functionalKeyStyle" />
-                    </default>
-                </switch>
-                <switch>
-                    <case
-                        latin:mode="im"
-                    >
-                        <Key
-                            latin:keyStyle="smileyKeyStyle"
-                            latin:keyWidth="20%p"
-                            latin:keyEdgeFlags="right" />
-                    </case>
-                    <default>
-                        <Key
-                            latin:keyStyle="returnKeyStyle"
-                            latin:keyWidth="20%p"
-                            latin:keyEdgeFlags="right" />
-                    </default>
-                </switch>
-            </case>
-            <case
                 latin:hasSettingsKey="true"
             >
                 <Key
@@ -88,42 +40,54 @@
                 <Key
                     latin:keyStyle="spaceKeyStyle"
                     latin:keyWidth="30%p" />
-                <switch>
-                    <case
-                        latin:mode="web"
-                    >
-                         <Key
-                            latin:keyHintIcon="@drawable/hint_popup"
-                            latin:popupCharacters="@string/alternates_for_web_tab_punctuation"
-                            latin:maxPopupKeyboardColumn="8"
-                            latin:keyStyle="tabKeyStyle" />
-                    </case>
-                    <default>
-                        <Key
-                            latin:keyLabel="."
-                            latin:keyHintIcon="@drawable/hint_popup"
-                            latin:popupCharacters="@string/alternates_for_punctuation"
-                            latin:maxPopupKeyboardColumn="7"
-                            latin:keyStyle="functionalKeyStyle" />
-                    </default>
-                </switch>
-                <switch>
-                    <case
-                        latin:mode="im"
-                    >
-                        <Key
-                            latin:keyStyle="smileyKeyStyle"
-                            latin:keyWidth="25%p"
-                            latin:keyEdgeFlags="right" />
-                    </case>
-                    <default>
-                        <Key
-                            latin:keyStyle="returnKeyStyle"
-                            latin:keyWidth="25%p"
-                            latin:keyEdgeFlags="right" />
-                    </default>
-                </switch>
             </case>
+            <!-- latin:hasSettingsKey="false" -->
+            <default>
+                <Key
+                    latin:keyStyle="toSymbolKeyStyle"
+                    latin:keyWidth="20%p"
+                    latin:keyEdgeFlags="left" />
+                <include
+                    latin:keyboardLayout="@xml/kbd_qwerty_f1" />
+                <Key
+                    latin:keyStyle="spaceKeyStyle"
+                    latin:keyWidth="40%p" />
+            </default>
+        </switch>
+        <switch>
+            <case
+                latin:webInput="true"
+            >
+                <Key
+                    latin:keyHintIcon="@drawable/hint_popup"
+                    latin:popupCharacters="@string/alternates_for_web_tab_punctuation"
+                    latin:maxPopupKeyboardColumn="8"
+                    latin:keyStyle="tabKeyStyle" />
+            </case>
+            <default>
+                <Key
+                    latin:keyLabel="."
+                    latin:keyHintIcon="@drawable/hint_popup"
+                    latin:popupCharacters="@string/alternates_for_punctuation"
+                    latin:maxPopupKeyboardColumn="7"
+                    latin:keyStyle="functionalKeyStyle" />
+            </default>
+        </switch>
+        <switch>
+            <case
+                latin:mode="im"
+            >
+                <Key
+                    latin:keyStyle="smileyKeyStyle"
+                    latin:keyWidth="fillRight"
+                    latin:keyEdgeFlags="right" />
+            </case>
+            <default>
+                <Key
+                    latin:keyStyle="returnKeyStyle"
+                    latin:keyWidth="fillRight"
+                    latin:keyEdgeFlags="right" />
+            </default>
         </switch>
     </Row>
 </merge>
diff --git a/java/res/xml/kbd_qwerty_rows_scandinavia.xml b/java/res/xml/kbd_qwerty_rows_scandinavia.xml
index 1aae5a0..8cb0640 100644
--- a/java/res/xml/kbd_qwerty_rows_scandinavia.xml
+++ b/java/res/xml/kbd_qwerty_rows_scandinavia.xml
@@ -29,49 +29,49 @@
     >
         <Key
             latin:keyLabel="q"
-            latin:keyHintIcon="@drawable/keyboard_hint_1"
+            latin:keyHintIcon="@drawable/key_hint_num1"
             latin:popupCharacters="@string/alternates_for_q"
             latin:keyWidth="8.75%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="w"
-            latin:keyHintIcon="@drawable/keyboard_hint_2"
+            latin:keyHintIcon="@drawable/key_hint_num2"
             latin:popupCharacters="@string/alternates_for_w" />
         <Key
             latin:keyLabel="e"
-            latin:keyHintIcon="@drawable/keyboard_hint_3"
+            latin:keyHintIcon="@drawable/key_hint_num3"
             latin:popupCharacters="@string/alternates_for_e" />
         <Key
             latin:keyLabel="r"
-            latin:keyHintIcon="@drawable/keyboard_hint_4"
+            latin:keyHintIcon="@drawable/key_hint_num4"
             latin:popupCharacters="@string/alternates_for_r" />
         <Key
             latin:keyLabel="t"
-            latin:keyHintIcon="@drawable/keyboard_hint_5"
+            latin:keyHintIcon="@drawable/key_hint_num5"
             latin:popupCharacters="@string/alternates_for_t" />
         <Key
             latin:keyLabel="y"
-            latin:keyHintIcon="@drawable/keyboard_hint_6"
+            latin:keyHintIcon="@drawable/key_hint_num6"
             latin:popupCharacters="@string/alternates_for_y" />
         <Key
             latin:keyLabel="u"
-            latin:keyHintIcon="@drawable/keyboard_hint_7"
+            latin:keyHintIcon="@drawable/key_hint_num7"
             latin:popupCharacters="@string/alternates_for_u" />
         <Key
             latin:keyLabel="i"
-            latin:keyHintIcon="@drawable/keyboard_hint_8"
+            latin:keyHintIcon="@drawable/key_hint_num8"
             latin:popupCharacters="@string/alternates_for_i" />
         <Key
             latin:keyLabel="o"
-            latin:keyHintIcon="@drawable/keyboard_hint_9"
+            latin:keyHintIcon="@drawable/key_hint_num9"
             latin:popupCharacters="@string/alternates_for_o" />
         <Key
             latin:keyLabel="p"
-            latin:keyHintIcon="@drawable/keyboard_hint_0"
+            latin:keyHintIcon="@drawable/key_hint_num0"
             latin:popupCharacters="@string/alternates_for_p" />
         <Key
             latin:keyLabel="å"
-            latin:keyWidth="8.75%p"
+            latin:keyWidth="fillRight"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
@@ -109,7 +109,7 @@
         <Key
             latin:keyLabel="@string/keylabel_for_scandinavia_row2_11"
             latin:popupCharacters="@string/alternates_for_scandinavia_row2_11"
-            latin:keyWidth="8.75%p"
+            latin:keyWidth="fillRight"
             latin:keyEdgeFlags="right" />
     </Row>
     <include
diff --git a/java/res/xml/kbd_qwertz_rows.xml b/java/res/xml/kbd_qwertz_rows.xml
index bb41f06..603cf35 100644
--- a/java/res/xml/kbd_qwertz_rows.xml
+++ b/java/res/xml/kbd_qwertz_rows.xml
@@ -29,45 +29,46 @@
     >
         <Key
             latin:keyLabel="q"
-            latin:keyHintIcon="@drawable/keyboard_hint_1"
+            latin:keyHintIcon="@drawable/key_hint_num1"
             latin:popupCharacters="@string/alternates_for_q"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="w"
-            latin:keyHintIcon="@drawable/keyboard_hint_2"
+            latin:keyHintIcon="@drawable/key_hint_num2"
             latin:popupCharacters="@string/alternates_for_w" />
         <Key
             latin:keyLabel="e"
-            latin:keyHintIcon="@drawable/keyboard_hint_3"
+            latin:keyHintIcon="@drawable/key_hint_num3"
             latin:popupCharacters="@string/alternates_for_e" />
         <Key
             latin:keyLabel="r"
-            latin:keyHintIcon="@drawable/keyboard_hint_4"
+            latin:keyHintIcon="@drawable/key_hint_num4"
             latin:popupCharacters="@string/alternates_for_r" />
         <Key
             latin:keyLabel="t"
-            latin:keyHintIcon="@drawable/keyboard_hint_5"
+            latin:keyHintIcon="@drawable/key_hint_num5"
             latin:popupCharacters="@string/alternates_for_t" />
         <Key
             latin:keyLabel="z"
-            latin:keyHintIcon="@drawable/keyboard_hint_6"
+            latin:keyHintIcon="@drawable/key_hint_num6"
             latin:popupCharacters="@string/alternates_for_z" />
         <Key
             latin:keyLabel="u"
-            latin:keyHintIcon="@drawable/keyboard_hint_7"
+            latin:keyHintIcon="@drawable/key_hint_num7"
             latin:popupCharacters="@string/alternates_for_u" />
         <Key
             latin:keyLabel="i"
-            latin:keyHintIcon="@drawable/keyboard_hint_8"
+            latin:keyHintIcon="@drawable/key_hint_num8"
             latin:popupCharacters="@string/alternates_for_i" />
         <Key
             latin:keyLabel="o"
-            latin:keyHintIcon="@drawable/keyboard_hint_9"
+            latin:keyHintIcon="@drawable/key_hint_num9"
             latin:popupCharacters="@string/alternates_for_o" />
         <Key
             latin:keyLabel="p"
-            latin:keyHintIcon="@drawable/keyboard_hint_0"
+            latin:keyHintIcon="@drawable/key_hint_num0"
             latin:popupCharacters="@string/alternates_for_p"
+            latin:keyWidth="fillRight"
             latin:keyEdgeFlags="right" />
     </Row>
     <include
@@ -100,7 +101,7 @@
             latin:keyLabel="m" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="15%p"
+            latin:keyWidth="fillRight"
             latin:visualInsetsLeft="1%p"
             latin:keyEdgeFlags="right" />
     </Row>
diff --git a/java/res/xml/kbd_ru_rows.xml b/java/res/xml/kbd_ru_rows.xml
index fa2af3b..76250a3 100644
--- a/java/res/xml/kbd_ru_rows.xml
+++ b/java/res/xml/kbd_ru_rows.xml
@@ -29,49 +29,49 @@
     >
         <Key
             latin:keyLabel="й"
-            latin:keyHintIcon="@drawable/keyboard_hint_1"
+            latin:keyHintIcon="@drawable/key_hint_num1"
             latin:popupCharacters="1"
             latin:keyWidth="8.75%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="ц"
-            latin:keyHintIcon="@drawable/keyboard_hint_2"
+            latin:keyHintIcon="@drawable/key_hint_num2"
             latin:popupCharacters="2" />
         <Key
             latin:keyLabel="у"
-            latin:keyHintIcon="@drawable/keyboard_hint_3"
+            latin:keyHintIcon="@drawable/key_hint_num3"
             latin:popupCharacters="3" />
         <Key
             latin:keyLabel="к"
-            latin:keyHintIcon="@drawable/keyboard_hint_4"
+            latin:keyHintIcon="@drawable/key_hint_num4"
             latin:popupCharacters="4" />
         <Key
             latin:keyLabel="е"
-            latin:keyHintIcon="@drawable/keyboard_hint_5"
+            latin:keyHintIcon="@drawable/key_hint_num5"
             latin:popupCharacters="@string/alternates_for_cyrillic_e" />
         <Key
             latin:keyLabel="н"
-            latin:keyHintIcon="@drawable/keyboard_hint_6"
+            latin:keyHintIcon="@drawable/key_hint_num6"
             latin:popupCharacters="6" />
         <Key
             latin:keyLabel="г"
-            latin:keyHintIcon="@drawable/keyboard_hint_7"
+            latin:keyHintIcon="@drawable/key_hint_num7"
             latin:popupCharacters="7" />
         <Key
             latin:keyLabel="ш"
-            latin:keyHintIcon="@drawable/keyboard_hint_8"
+            latin:keyHintIcon="@drawable/key_hint_num8"
             latin:popupCharacters="8" />
         <Key
             latin:keyLabel="щ"
-            latin:keyHintIcon="@drawable/keyboard_hint_9"
+            latin:keyHintIcon="@drawable/key_hint_num9"
             latin:popupCharacters="9" />
         <Key
             latin:keyLabel="з"
-            latin:keyHintIcon="@drawable/keyboard_hint_0"
+            latin:keyHintIcon="@drawable/key_hint_num0"
             latin:popupCharacters="0" />
         <Key
             latin:keyLabel="х"
-            latin:keyWidth="8.75%p"
+            latin:keyWidth="fillRight"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
@@ -101,7 +101,7 @@
             latin:keyLabel="ж" />
         <Key
             latin:keyLabel="э"
-            latin:keyWidth="8.75%p"
+            latin:keyWidth="fillRight"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
@@ -132,7 +132,7 @@
             latin:keyLabel="ю" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="11.75%p"
+            latin:keyWidth="fillRight"
             latin:keyEdgeFlags="right" />
     </Row>
     <include
diff --git a/java/res/xml/kbd_sr_rows.xml b/java/res/xml/kbd_sr_rows.xml
index 8d6b070..139af80 100644
--- a/java/res/xml/kbd_sr_rows.xml
+++ b/java/res/xml/kbd_sr_rows.xml
@@ -29,47 +29,48 @@
     >
         <Key
             latin:keyLabel="љ"
-            latin:keyHintIcon="@drawable/keyboard_hint_1"
+            latin:keyHintIcon="@drawable/key_hint_num1"
             latin:popupCharacters="1"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="њ"
-            latin:keyHintIcon="@drawable/keyboard_hint_2"
+            latin:keyHintIcon="@drawable/key_hint_num2"
             latin:popupCharacters="2" />
         <Key
             latin:keyLabel="е"
-            latin:keyHintIcon="@drawable/keyboard_hint_3"
+            latin:keyHintIcon="@drawable/key_hint_num3"
             latin:popupCharacters="3" />
         <Key
             latin:keyLabel="р"
-            latin:keyHintIcon="@drawable/keyboard_hint_4"
+            latin:keyHintIcon="@drawable/key_hint_num4"
             latin:popupCharacters="4" />
         <Key
             latin:keyLabel="т"
-            latin:keyHintIcon="@drawable/keyboard_hint_5"
+            latin:keyHintIcon="@drawable/key_hint_num5"
             latin:popupCharacters="5" />
         <Key
             latin:keyLabel="з"
-            latin:keyHintIcon="@drawable/keyboard_hint_6"
+            latin:keyHintIcon="@drawable/key_hint_num6"
             latin:popupCharacters="6" />
         <Key
             latin:keyLabel="у"
-            latin:keyHintIcon="@drawable/keyboard_hint_7"
+            latin:keyHintIcon="@drawable/key_hint_num7"
             latin:popupCharacters="7" />
         <Key
             latin:keyLabel="и"
-            latin:keyHintIcon="@drawable/keyboard_hint_8"
+            latin:keyHintIcon="@drawable/key_hint_num8"
             latin:popupCharacters="8" />
         <Key
             latin:keyLabel="о"
-            latin:keyHintIcon="@drawable/keyboard_hint_9"
+            latin:keyHintIcon="@drawable/key_hint_num9"
             latin:popupCharacters="9" />
         <Key
             latin:keyLabel="п"
-            latin:keyHintIcon="@drawable/keyboard_hint_0"
+            latin:keyHintIcon="@drawable/key_hint_num0"
             latin:popupCharacters="0" />
         <Key
             latin:keyLabel="ш"
+            latin:keyWidth="fillRight"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
@@ -98,6 +99,7 @@
             latin:keyLabel="ч" />
         <Key
             latin:keyLabel="ћ"
+            latin:keyWidth="fillRight"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
@@ -126,7 +128,7 @@
             latin:keyLabel="ж" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="11.00%p"
+            latin:keyWidth="fillRight"
             latin:keyEdgeFlags="right" />
     </Row>
     <include
diff --git a/java/res/xml/kbd_symbols.xml b/java/res/xml/kbd_symbols.xml
index 9748bce..a58a518 100644
--- a/java/res/xml/kbd_symbols.xml
+++ b/java/res/xml/kbd_symbols.xml
@@ -21,7 +21,8 @@
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyboardHeight="@dimen/keyboardHeight"
-    latin:maxKeyboardHeight="50%p"
+    latin:maxKeyboardHeight="@fraction/maxKeyboardHeight"
+    latin:minKeyboardHeight="@fraction/minKeyboardHeight"
     latin:rowHeight="25%p"
     latin:keyWidth="10%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
@@ -64,6 +65,7 @@
         <Key
             latin:keyLabel="0"
             latin:popupCharacters="ⁿ,∅"
+            latin:keyWidth="fillRight"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row>
@@ -94,6 +96,7 @@
         <Key
             latin:keyLabel=")"
             latin:popupCharacters="],},&gt;"
+            latin:keyWidth="fillRight"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row>
@@ -106,13 +109,14 @@
             latin:keyLabel="!"
             latin:popupCharacters="¡" />
         <!-- Note: DroidSans doesn't have double-high-reversed-quotation '\u201f' glyph. -->
+        <!-- latin:popupCharacters="“,”,„,‟,«,»" -->
         <Key
             latin:keyLabel="&quot;"
-            latin:popupCharacters="“,”,„,‟,«,»"
+            latin:popupCharacters="“,”,«,»"
             latin:maxPopupKeyboardColumn="6" />
         <Key
             latin:keyLabel="\'"
-            latin:popupCharacters="‘,’,‚,‛,´" />
+            latin:popupCharacters="‘,’,‚,‛" />
         <Key
             latin:keyLabel=":" />
         <Key
@@ -124,7 +128,7 @@
             latin:popupCharacters="¿" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="15%p"
+            latin:keyWidth="fillRight"
             latin:visualInsetsLeft="1%p"
             latin:keyEdgeFlags="right" />
     </Row>
diff --git a/java/res/xml/kbd_symbols_row4.xml b/java/res/xml/kbd_symbols_row4.xml
index b330095..726f7c3 100644
--- a/java/res/xml/kbd_symbols_row4.xml
+++ b/java/res/xml/kbd_symbols_row4.xml
@@ -22,45 +22,11 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
 >
     <Row
+        latin:keyWidth="10%p"
         latin:rowEdgeFlags="bottom"
     >
         <switch>
             <case
-                latin:hasSettingsKey="false"
-            >
-                <Key
-                    latin:keyStyle="toAlphaKeyStyle"
-                    latin:keyWidth="20%p"
-                    latin:keyEdgeFlags="left" />
-                <include
-                    latin:keyboardLayout="@xml/kbd_symbols_f1" />
-                <Key
-                    latin:keyStyle="spaceKeyStyle"
-                    latin:keyWidth="40%p" />
-                <Key
-                    latin:keyLabel="."
-                    latin:keyHintIcon="@drawable/hint_popup"
-                    latin:popupCharacters="@string/alternates_for_punctuation"
-                    latin:maxPopupKeyboardColumn="7"
-                    latin:keyStyle="functionalKeyStyle" />
-                <switch>
-                    <case
-                        latin:mode="im"
-                    >
-                        <Key
-                            latin:keyStyle="smileyKeyStyle"
-                            latin:keyWidth="20%p"
-                            latin:keyEdgeFlags="right" />
-                    </case>
-                    <default>
-                        <Key
-                            latin:keyStyle="returnKeyStyle"
-                            latin:keyWidth="20%p"
-                            latin:keyEdgeFlags="right" />
-                    </default>
-                </switch>
-            </case>
-            <case
                 latin:hasSettingsKey="true"
             >
                 <Key
@@ -70,33 +36,45 @@
                 <Key
                     latin:keyStyle="settingsKeyStyle" />
                 <include
-                    latin:keyboardLayout="@xml/kbd_symbols_f1" />
+                    latin:keyboardLayout="@xml/kbd_qwerty_f1" />
                 <Key
                     latin:keyStyle="spaceKeyStyle"
                     latin:keyWidth="30%p" />
-                <Key
-                    latin:keyLabel="."
-                    latin:keyHintIcon="@drawable/hint_popup"
-                    latin:popupCharacters="@string/alternates_for_punctuation"
-                    latin:maxPopupKeyboardColumn="7"
-                    latin:keyStyle="functionalKeyStyle" />
-                <switch>
-                    <case
-                        latin:mode="im"
-                    >
-                        <Key
-                            latin:keyStyle="smileyKeyStyle"
-                            latin:keyWidth="25%p"
-                            latin:keyEdgeFlags="right" />
-                    </case>
-                    <default>
-                        <Key
-                            latin:keyStyle="returnKeyStyle"
-                            latin:keyWidth="25%p"
-                            latin:keyEdgeFlags="right" />
-                    </default>
-                </switch>
             </case>
+            <!-- latin:hasSettingsKey="false" -->
+            <default>
+                <Key
+                    latin:keyStyle="toAlphaKeyStyle"
+                    latin:keyWidth="20%p"
+                    latin:keyEdgeFlags="left" />
+                <include
+                    latin:keyboardLayout="@xml/kbd_symbols_f1" />
+                <Key
+                    latin:keyStyle="spaceKeyStyle"
+                    latin:keyWidth="40%p" />
+            </default>
+        </switch>
+        <Key
+            latin:keyLabel="."
+            latin:keyHintIcon="@drawable/hint_popup"
+            latin:popupCharacters="@string/alternates_for_punctuation"
+            latin:maxPopupKeyboardColumn="7"
+            latin:keyStyle="functionalKeyStyle" />
+        <switch>
+            <case
+                latin:mode="im"
+            >
+                <Key
+                    latin:keyStyle="smileyKeyStyle"
+                    latin:keyWidth="fillRight"
+                    latin:keyEdgeFlags="right" />
+            </case>
+            <default>
+                <Key
+                    latin:keyStyle="returnKeyStyle"
+                    latin:keyWidth="fillRight"
+                    latin:keyEdgeFlags="right" />
+            </default>
         </switch>
     </Row>
 </merge>
diff --git a/java/res/xml/kbd_symbols_shift.xml b/java/res/xml/kbd_symbols_shift.xml
index 3978f17..96e741b 100644
--- a/java/res/xml/kbd_symbols_shift.xml
+++ b/java/res/xml/kbd_symbols_shift.xml
@@ -21,7 +21,8 @@
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyboardHeight="@dimen/keyboardHeight"
-    latin:maxKeyboardHeight="50%p"
+    latin:maxKeyboardHeight="@fraction/maxKeyboardHeight"
+    latin:minKeyboardHeight="@fraction/minKeyboardHeight"
     latin:rowHeight="25%p"
     latin:keyWidth="10%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
@@ -62,6 +63,7 @@
             latin:keyLabel="{" />
         <Key
             latin:keyLabel="}"
+            latin:keyWidth="fillRight"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row>
@@ -93,6 +95,7 @@
             latin:keyLabel="[" />
         <Key
             latin:keyLabel="]"
+            latin:keyWidth="fillRight"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row>
@@ -124,7 +127,7 @@
             latin:popupCharacters="≥,»,›" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="15%p"
+            latin:keyWidth="fillRight"
             latin:visualInsetsLeft="1%p"
             latin:keyEdgeFlags="right" />
     </Row>
diff --git a/java/res/xml/kbd_symbols_shift_row4.xml b/java/res/xml/kbd_symbols_shift_row4.xml
index 4f8567d..9eb9b1d 100644
--- a/java/res/xml/kbd_symbols_shift_row4.xml
+++ b/java/res/xml/kbd_symbols_shift_row4.xml
@@ -22,44 +22,11 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
 >
     <Row
+        latin:keyWidth="10%p"
         latin:rowEdgeFlags="bottom"
     >
         <switch>
             <case
-                latin:hasSettingsKey="false"
-            >
-                <Key
-                    latin:keyStyle="toAlphaKeyStyle"
-                    latin:keyWidth="20%p"
-                    latin:keyEdgeFlags="left" />
-                <Key
-                    latin:keyLabel="„"
-                    latin:popupCharacters="“,”,„,‟,«,»,‘,’,‚,‛"
-                    latin:keyStyle="nonPasswordFunctionalKeyStyle" />
-                <Key
-                    latin:keyStyle="spaceKeyStyle"
-                    latin:keyWidth="40%p" />
-                <Key
-                    latin:keyLabel="…"
-                    latin:keyStyle="nonPasswordFunctionalKeyStyle" />
-                <switch>
-                    <case
-                        latin:mode="im"
-                    >
-                        <Key
-                            latin:keyStyle="smileyKeyStyle"
-                            latin:keyWidth="20%p"
-                            latin:keyEdgeFlags="right" />
-                    </case>
-                    <default>
-                        <Key
-                            latin:keyStyle="returnKeyStyle"
-                            latin:keyWidth="20%p"
-                            latin:keyEdgeFlags="right" />
-                    </default>
-                </switch>
-            </case>
-            <case
                 latin:hasSettingsKey="true"
             >
                 <Key
@@ -75,26 +42,40 @@
                 <Key
                     latin:keyStyle="spaceKeyStyle"
                     latin:keyWidth="30%p" />
-                <Key
-                    latin:keyLabel="…"
-                    latin:keyStyle="nonPasswordFunctionalKeyStyle" />
-                <switch>
-                    <case
-                        latin:mode="im"
-                    >
-                        <Key
-                            latin:keyStyle="smileyKeyStyle"
-                            latin:keyWidth="25%p"
-                            latin:keyEdgeFlags="right" />
-                    </case>
-                    <default>
-                        <Key
-                            latin:keyStyle="returnKeyStyle"
-                            latin:keyWidth="25%p"
-                            latin:keyEdgeFlags="right" />
-                    </default>
-                </switch>
             </case>
+            <!-- latin:hasSettingsKey="false" -->
+            <default>
+                <Key
+                    latin:keyStyle="toAlphaKeyStyle"
+                    latin:keyWidth="20%p"
+                    latin:keyEdgeFlags="left" />
+                <Key
+                    latin:keyLabel="„"
+                    latin:popupCharacters="“,”,„,‟,«,»,‘,’,‚,‛"
+                    latin:keyStyle="nonPasswordFunctionalKeyStyle" />
+                <Key
+                    latin:keyStyle="spaceKeyStyle"
+                    latin:keyWidth="40%p" />
+            </default>
+        </switch>
+        <Key
+            latin:keyLabel="…"
+            latin:keyStyle="nonPasswordFunctionalKeyStyle" />
+        <switch>
+            <case
+                latin:mode="im"
+            >
+                <Key
+                    latin:keyStyle="smileyKeyStyle"
+                    latin:keyWidth="fillRight"
+                    latin:keyEdgeFlags="right" />
+            </case>
+            <default>
+                <Key
+                    latin:keyStyle="returnKeyStyle"
+                    latin:keyWidth="fillRight"
+                    latin:keyEdgeFlags="right" />
+            </default>
         </switch>
     </Row>
 </merge>
diff --git a/java/res/xml/method.xml b/java/res/xml/method.xml
index df43701..aba6974 100644
--- a/java/res/xml/method.xml
+++ b/java/res/xml/method.xml
@@ -151,6 +151,11 @@
             android:imeSubtypeMode="keyboard"
     />
     <subtype android:icon="@drawable/ic_subtype_keyboard"
+            android:label="@string/subtype_mode_pt_keyboard"
+            android:imeSubtypeLocale="pt"
+            android:imeSubtypeMode="keyboard"
+    />
+    <subtype android:icon="@drawable/ic_subtype_keyboard"
             android:label="@string/subtype_mode_ru_keyboard"
             android:imeSubtypeLocale="ru"
             android:imeSubtypeMode="keyboard"
diff --git a/java/res/xml/prefs.xml b/java/res/xml/prefs.xml
index 24a1d45..b0497a5 100644
--- a/java/res/xml/prefs.xml
+++ b/java/res/xml/prefs.xml
@@ -130,6 +130,15 @@
           android:entries="@array/keyboard_layout_modes"
           android:defaultValue="@string/config_default_keyboard_theme_id" />
     </PreferenceCategory>
+    <PreferenceScreen
+          android:key="pref_advanced_settings"
+          android:title="@string/advanced_settings"
+          android:summary="@string/advanced_settings_summary">
+          <!-- Values for popup dismiss delay are added programatically -->
+          <ListPreference
+              android:key="pref_key_preview_popup_dismiss_delay"
+              android:title="@string/key_preview_popup_dismiss_delay" />
+    </PreferenceScreen>
     <!-- <Preference
         android:title="Debug Settings"
         android:key="debug_settings">
diff --git a/java/src/com/android/inputmethod/compat/CompatUtils.java b/java/src/com/android/inputmethod/compat/CompatUtils.java
index 0b532f7..6e14bfa 100644
--- a/java/src/com/android/inputmethod/compat/CompatUtils.java
+++ b/java/src/com/android/inputmethod/compat/CompatUtils.java
@@ -22,7 +22,6 @@
 
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Field;
-import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.List;
@@ -74,23 +73,22 @@
             return targetClass.getMethod(name, parameterTypes);
         } catch (SecurityException e) {
             // ignore
-            return null;
         } catch (NoSuchMethodException e) {
             // ignore
-            return null;
         }
+        return null;
     }
 
     public static Field getField(Class<?> targetClass, String name) {
+        if (targetClass == null || TextUtils.isEmpty(name)) return null;
         try {
             return targetClass.getField(name);
         } catch (SecurityException e) {
             // ignore
-            return null;
         } catch (NoSuchFieldException e) {
             // ignore
-            return null;
         }
+        return null;
     }
 
     public static Constructor<?> getConstructor(Class<?> targetClass, Class<?>[] types) {
@@ -99,51 +97,49 @@
             return targetClass.getConstructor(types);
         } catch (SecurityException e) {
             // ignore
-            return null;
         } catch (NoSuchMethodException e) {
             // ignore
-            return null;
         }
+        return null;
+    }
+
+    public static Object newInstance(Constructor<?> constructor, Object[] args) {
+        if (constructor == null) return null;
+        try {
+            return constructor.newInstance(args);
+        } catch (Exception e) {
+            Log.e(TAG, "Exception in newInstance: " + e.getClass().getSimpleName());
+        }
+        return null;
     }
 
     public static Object invoke(
             Object receiver, Object defaultValue, Method method, Object... args) {
-        if (receiver == null || method == null) return defaultValue;
+        if (method == null) return defaultValue;
         try {
             return method.invoke(receiver, args);
-        } catch (IllegalArgumentException e) {
-            Log.e(TAG, "Exception in invoke: IllegalArgumentException");
-            return defaultValue;
-        } catch (IllegalAccessException e) {
-            Log.e(TAG, "Exception in invoke: IllegalAccessException");
-            return defaultValue;
-        } catch (InvocationTargetException e) {
-            Log.e(TAG, "Exception in invoke: IllegalTargetException");
-            return defaultValue;
+        } catch (Exception e) {
+            Log.e(TAG, "Exception in invoke: " + e.getClass().getSimpleName());
         }
+        return defaultValue;
     }
 
     public static Object getFieldValue(Object receiver, Object defaultValue, Field field) {
-        if (receiver == null || field == null) return defaultValue;
+        if (field == null) return defaultValue;
         try {
             return field.get(receiver);
-        } catch (IllegalArgumentException e) {
-            Log.e(TAG, "Exception in getFieldValue: IllegalArgumentException");
-            return defaultValue;
-        } catch (IllegalAccessException e) {
-            Log.e(TAG, "Exception in getFieldValue: IllegalAccessException");
-            return defaultValue;
+        } catch (Exception e) {
+            Log.e(TAG, "Exception in getFieldValue: " + e.getClass().getSimpleName());
         }
+        return defaultValue;
     }
 
     public static void setFieldValue(Object receiver, Field field, Object value) {
-        if (receiver == null || field == null) return;
+        if (field == null) return;
         try {
             field.set(receiver, value);
-        } catch (IllegalArgumentException e) {
-            Log.e(TAG, "Exception in setFieldValue: IllegalArgumentException");
-        } catch (IllegalAccessException e) {
-            Log.e(TAG, "Exception in setFieldValue: IllegalAccessException");
+        } catch (Exception e) {
+            Log.e(TAG, "Exception in setFieldValue: " + e.getClass().getSimpleName());
         }
     }
 
diff --git a/java/src/com/android/inputmethod/compat/EditorInfoCompatUtils.java b/java/src/com/android/inputmethod/compat/EditorInfoCompatUtils.java
index f6f4f7a..2789bcb 100644
--- a/java/src/com/android/inputmethod/compat/EditorInfoCompatUtils.java
+++ b/java/src/com/android/inputmethod/compat/EditorInfoCompatUtils.java
@@ -78,6 +78,9 @@
             case EditorInfo.IME_ACTION_SEND:
                 action = "actionSend";
                 break;
+            case EditorInfo.IME_ACTION_NEXT:
+                action = "actionNext";
+                break;
             case EditorInfo.IME_ACTION_DONE:
                 action = "actionDone";
                 break;
diff --git a/java/src/com/android/inputmethod/compat/InputConnectionCompatUtils.java b/java/src/com/android/inputmethod/compat/InputConnectionCompatUtils.java
index c926be0..7d00b60 100644
--- a/java/src/com/android/inputmethod/compat/InputConnectionCompatUtils.java
+++ b/java/src/com/android/inputmethod/compat/InputConnectionCompatUtils.java
@@ -18,15 +18,12 @@
 
 import com.android.inputmethod.latin.EditingUtils.SelectedWord;
 
-import android.util.Log;
 import android.view.inputmethod.InputConnection;
 
 import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 
 public class InputConnectionCompatUtils {
-    private static final String TAG = InputConnectionCompatUtils.class.getSimpleName();
     private static final Class<?> CLASS_CorrectionInfo = CompatUtils
             .getClass("android.view.inputmethod.CorrectionInfo");
     private static final Class<?>[] INPUT_TYPE_CorrectionInfo = new Class<?>[] { int.class,
@@ -53,18 +50,10 @@
             return;
         }
         Object[] args = { offset, oldText, newText };
-        try {
-            Object correctionInfo = CONSTRUCTOR_CorrectionInfo.newInstance(args);
+        Object correctionInfo = CompatUtils.newInstance(CONSTRUCTOR_CorrectionInfo, args);
+        if (correctionInfo != null) {
             CompatUtils.invoke(ic, null, METHOD_InputConnection_commitCorrection,
                     correctionInfo);
-        } catch (IllegalArgumentException e) {
-            Log.e(TAG, "Error in commitCorrection: IllegalArgumentException");
-        } catch (InstantiationException e) {
-            Log.e(TAG, "Error in commitCorrection: InstantiationException");
-        } catch (IllegalAccessException e) {
-            Log.e(TAG, "Error in commitCorrection: IllegalAccessException");
-        } catch (InvocationTargetException e) {
-            Log.e(TAG, "Error in commitCorrection: InvocationTargetException");
         }
     }
 
diff --git a/java/src/com/android/inputmethod/compat/InputMethodSubtypeCompatWrapper.java b/java/src/com/android/inputmethod/compat/InputMethodSubtypeCompatWrapper.java
index 806c355..667d86c 100644
--- a/java/src/com/android/inputmethod/compat/InputMethodSubtypeCompatWrapper.java
+++ b/java/src/com/android/inputmethod/compat/InputMethodSubtypeCompatWrapper.java
@@ -48,6 +48,8 @@
             CompatUtils.getMethod(CLASS_InputMethodSubtype, "containsExtraValueKey", String.class);
     private static final Method METHOD_getExtraValueOf =
             CompatUtils.getMethod(CLASS_InputMethodSubtype, "getExtraValueOf", String.class);
+    private static final Method METHOD_isAuxiliary =
+            CompatUtils.getMethod(CLASS_InputMethodSubtype, "isAuxiliary");
 
     private final int mDummyNameResId;
     private final int mDummyIconResId;
@@ -116,6 +118,10 @@
         return (String)CompatUtils.invoke(mObj, null, METHOD_getExtraValueOf, key);
     }
 
+    public boolean isAuxiliary() {
+        return (Boolean)CompatUtils.invoke(mObj, false, METHOD_isAuxiliary);
+    }
+
     public boolean isDummy() {
         return !hasOriginalObject();
     }
diff --git a/java/src/com/android/inputmethod/compat/InputTypeCompatUtils.java b/java/src/com/android/inputmethod/compat/InputTypeCompatUtils.java
index d851741..6c2f0f7 100644
--- a/java/src/com/android/inputmethod/compat/InputTypeCompatUtils.java
+++ b/java/src/com/android/inputmethod/compat/InputTypeCompatUtils.java
@@ -37,6 +37,7 @@
             (Integer) CompatUtils.getFieldValue(null, null,
                     FIELD_InputType_TYPE_NUMBER_VARIATION_PASSWORD);
     private static final int WEB_TEXT_PASSWORD_INPUT_TYPE;
+    private static final int WEB_TEXT_EMAIL_ADDRESS_INPUT_TYPE;
     private static final int NUMBER_PASSWORD_INPUT_TYPE;
     private static final int TEXT_PASSWORD_INPUT_TYPE =
             InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD;
@@ -45,20 +46,35 @@
 
     static {
         WEB_TEXT_PASSWORD_INPUT_TYPE =
-                OBJ_InputType_TYPE_TEXT_VARIATION_WEB_PASSWORD != null
-                        ? InputType.TYPE_CLASS_TEXT | OBJ_InputType_TYPE_TEXT_VARIATION_WEB_PASSWORD
-                        : 0;
+            OBJ_InputType_TYPE_TEXT_VARIATION_WEB_PASSWORD != null
+                    ? InputType.TYPE_CLASS_TEXT | OBJ_InputType_TYPE_TEXT_VARIATION_WEB_PASSWORD
+                    : 0;
+        WEB_TEXT_EMAIL_ADDRESS_INPUT_TYPE =
+            OBJ_InputType_TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS != null
+                    ? InputType.TYPE_CLASS_TEXT
+                            | OBJ_InputType_TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS
+                    : 0;
         NUMBER_PASSWORD_INPUT_TYPE =
                 OBJ_InputType_TYPE_NUMBER_VARIATION_PASSWORD != null
                         ? InputType.TYPE_CLASS_NUMBER | OBJ_InputType_TYPE_NUMBER_VARIATION_PASSWORD
                         : 0;
     }
 
+    private static boolean isWebEditTextInputType(int inputType) {
+        return inputType == (InputType.TYPE_CLASS_TEXT
+                | InputType.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT);
+    }
+
     private static boolean isWebPasswordInputType(int inputType) {
         return WEB_TEXT_PASSWORD_INPUT_TYPE != 0
                 && inputType == WEB_TEXT_PASSWORD_INPUT_TYPE;
     }
 
+    private static boolean isWebEmailAddressInputType(int inputType) {
+        return WEB_TEXT_EMAIL_ADDRESS_INPUT_TYPE != 0
+                && inputType == WEB_TEXT_EMAIL_ADDRESS_INPUT_TYPE;
+    }
+
     private static boolean isNumberPasswordInputType(int inputType) {
         return NUMBER_PASSWORD_INPUT_TYPE != 0
                 && inputType == NUMBER_PASSWORD_INPUT_TYPE;
@@ -78,6 +94,13 @@
                 || isWebEmailAddressVariation(variation);
     }
 
+    public static boolean isWebInputType(int inputType) {
+        final int maskedInputType =
+                inputType & (InputType.TYPE_MASK_CLASS | InputType.TYPE_MASK_VARIATION);
+        return isWebEditTextInputType(maskedInputType) || isWebPasswordInputType(maskedInputType)
+                || isWebEmailAddressInputType(maskedInputType);
+    }
+
     // Please refer to TextView.isPasswordInputType
     public static boolean isPasswordInputType(int inputType) {
         final int maskedInputType =
diff --git a/java/src/com/android/inputmethod/compat/SuggestionSpanUtils.java b/java/src/com/android/inputmethod/compat/SuggestionSpanUtils.java
new file mode 100644
index 0000000..5b02de3
--- /dev/null
+++ b/java/src/com/android/inputmethod/compat/SuggestionSpanUtils.java
@@ -0,0 +1,78 @@
+/*
+ * 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 com.android.inputmethod.latin.SuggestedWords;
+import com.android.inputmethod.latin.SuggestionSpanPickedNotificationReceiver;
+
+import android.content.Context;
+import android.text.Spannable;
+import android.text.SpannableString;
+import android.text.Spanned;
+
+import java.lang.reflect.Constructor;
+import java.util.Locale;
+
+public class SuggestionSpanUtils {
+    public static final String ACTION_SUGGESTION_PICKED =
+            "android.text.style.SUGGESTION_PICKED";
+    public static final String SUGGESTION_SPAN_PICKED_AFTER = "after";
+    public static final String SUGGESTION_SPAN_PICKED_BEFORE = "before";
+    public static final String SUGGESTION_SPAN_PICKED_HASHCODE = "hashcode";
+
+    private static final Class<?> CLASS_SuggestionSpan = CompatUtils
+            .getClass("android.text.style.SuggestionSpan");
+    private static final Class<?>[] INPUT_TYPE_SuggestionSpan = new Class<?>[] {
+            Context.class, Locale.class, String[].class, int.class, Class.class };
+    private static final Constructor<?> CONSTRUCTOR_SuggestionSpan = CompatUtils
+            .getConstructor(CLASS_SuggestionSpan, INPUT_TYPE_SuggestionSpan);
+    public static final boolean SUGGESTION_SPAN_IS_SUPPORTED;
+    static {
+        SUGGESTION_SPAN_IS_SUPPORTED =
+                CLASS_SuggestionSpan != null && CONSTRUCTOR_SuggestionSpan != null;
+    }
+
+    public static CharSequence getTextWithSuggestionSpan(Context context,
+            CharSequence suggestion, SuggestedWords suggestedWords) {
+        if (CONSTRUCTOR_SuggestionSpan == null || suggestedWords == null
+                || suggestedWords.size() == 0) {
+            return suggestion;
+        }
+
+        final Spannable spannable;
+        if (suggestion instanceof Spannable) {
+            spannable = (Spannable) suggestion;
+        } else {
+            spannable = new SpannableString(suggestion);
+        }
+        // TODO: Use SUGGESTIONS_MAX_SIZE instead of 5.
+        final int N = Math.min(5, suggestedWords.size());
+        final String[] suggestionsArray = new String[N];
+        for (int i = 0; i < N; ++i) {
+            suggestionsArray[i] = suggestedWords.getWord(i).toString();
+        }
+        final Object[] args =
+                { context, null, suggestionsArray, 0,
+                        (Class<?>) SuggestionSpanPickedNotificationReceiver.class };
+        final Object ss = CompatUtils.newInstance(CONSTRUCTOR_SuggestionSpan, args);
+        if (ss == null) {
+            return suggestion;
+        }
+        spannable.setSpan(ss, 0, suggestion.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+        return spannable;
+    }
+}
diff --git a/java/src/com/android/inputmethod/deprecated/LanguageSwitcherProxy.java b/java/src/com/android/inputmethod/deprecated/LanguageSwitcherProxy.java
index e14a49c..290e6b5 100644
--- a/java/src/com/android/inputmethod/deprecated/LanguageSwitcherProxy.java
+++ b/java/src/com/android/inputmethod/deprecated/LanguageSwitcherProxy.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011 Google Inc.
+ * 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
diff --git a/java/src/com/android/inputmethod/deprecated/VoiceProxy.java b/java/src/com/android/inputmethod/deprecated/VoiceProxy.java
index 753dcee..85993ea 100644
--- a/java/src/com/android/inputmethod/deprecated/VoiceProxy.java
+++ b/java/src/com/android/inputmethod/deprecated/VoiceProxy.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 Google Inc.
+ * 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
@@ -137,8 +137,8 @@
                 @Override
                 public void showHint(int viewResource) {
                     View view = LayoutInflater.from(mService).inflate(viewResource, null);
-                    mService.setCandidatesView(view);
-                    mService.setCandidatesViewShown(true);
+//                    mService.setCandidatesView(view);
+//                    mService.setCandidatesViewShown(true);
                     mIsShowingHint = true;
                 }
               });
@@ -441,7 +441,7 @@
             }
             builder.setTypedWordValid(true).setHasMinimalSuggestion(true);
             mService.setSuggestions(builder.build());
-            mService.setCandidatesViewShown(true);
+//            mService.setCandidatesViewShown(true);
             return true;
         }
         return false;
@@ -526,7 +526,7 @@
         mHandler.post(new Runnable() {
             @Override
             public void run() {
-                mService.setCandidatesViewShown(false);
+//                mService.setCandidatesViewShown(false);
                 mRecognizing = true;
                 mVoiceInput.newView();
                 View v = mVoiceInput.getView();
@@ -536,7 +536,7 @@
                     ((ViewGroup) p).removeView(v);
                 }
 
-                View keyboardView = KeyboardSwitcher.getInstance().getInputView();
+                View keyboardView = KeyboardSwitcher.getInstance().getKeyboardView();
 
                 // The full height of the keyboard is difficult to calculate
                 // as the dimension is expressed in "mm" and not in "pixel"
@@ -691,7 +691,7 @@
         if (mSubtypeSwitcher.isVoiceMode() && windowToken != null) {
             // Close keyboard view if it is been shown.
             if (KeyboardSwitcher.getInstance().isInputViewShown())
-                KeyboardSwitcher.getInstance().getInputView().purgeKeyboardAndClosing();
+                KeyboardSwitcher.getInstance().getKeyboardView().purgeKeyboardAndClosing();
             startListening(false, windowToken);
         }
         // If we have no token, onAttachedToWindow will take care of showing dialog and start
diff --git a/java/src/com/android/inputmethod/deprecated/languageswitcher/InputLanguageSelection.java b/java/src/com/android/inputmethod/deprecated/languageswitcher/InputLanguageSelection.java
index a1b49b4..fe70eef 100644
--- a/java/src/com/android/inputmethod/deprecated/languageswitcher/InputLanguageSelection.java
+++ b/java/src/com/android/inputmethod/deprecated/languageswitcher/InputLanguageSelection.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008-2009 Google Inc.
+ * Copyright (C) 2008-2009 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
@@ -43,6 +43,8 @@
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Locale;
+import java.util.Map.Entry;
+import java.util.TreeMap;
 
 public class InputLanguageSelection extends PreferenceActivity {
 
@@ -51,21 +53,17 @@
     private HashMap<CheckBoxPreference, Locale> mLocaleMap =
             new HashMap<CheckBoxPreference, Locale>();
 
-    private static class Loc implements Comparable<Object> {
+    private static class LocaleEntry implements Comparable<Object> {
         private static Collator sCollator = Collator.getInstance();
 
         private String mLabel;
         public final Locale mLocale;
 
-        public Loc(String label, Locale locale) {
+        public LocaleEntry(String label, Locale locale) {
             this.mLabel = label;
             this.mLocale = locale;
         }
 
-        public void setLabel(String label) {
-            this.mLabel = label;
-        }
-
         @Override
         public String toString() {
             return this.mLabel;
@@ -73,7 +71,7 @@
 
         @Override
         public int compareTo(Object o) {
-            return sCollator.compare(this.mLabel, ((Loc) o).mLabel);
+            return sCollator.compare(this.mLabel, ((LocaleEntry) o).mLabel);
         }
     }
 
@@ -85,21 +83,58 @@
         mPrefs = PreferenceManager.getDefaultSharedPreferences(this);
         mSelectedLanguages = mPrefs.getString(Settings.PREF_SELECTED_LANGUAGES, "");
         String[] languageList = mSelectedLanguages.split(",");
-        ArrayList<Loc> availableLanguages = getUniqueLocales();
+        ArrayList<LocaleEntry> availableLanguages = getUniqueLocales();
         PreferenceGroup parent = getPreferenceScreen();
+        final HashMap<Long, LocaleEntry> dictionaryIdLocaleMap = new HashMap<Long, LocaleEntry>();
+        final TreeMap<LocaleEntry, Boolean> localeHasDictionaryMap =
+                new TreeMap<LocaleEntry, Boolean>();
         for (int i = 0; i < availableLanguages.size(); i++) {
-            Locale locale = availableLanguages.get(i).mLocale;
-            final Pair<Boolean, Boolean> hasDictionaryOrLayout = hasDictionaryOrLayout(locale);
-            final boolean hasDictionary = hasDictionaryOrLayout.first;
+            LocaleEntry loc = availableLanguages.get(i);
+            Locale locale = loc.mLocale;
+            final Pair<Long, Boolean> hasDictionaryOrLayout = hasDictionaryOrLayout(locale);
+            final Long dictionaryId = hasDictionaryOrLayout.first;
             final boolean hasLayout = hasDictionaryOrLayout.second;
+            final boolean hasDictionary = dictionaryId != null;
             // Add this locale to the supported list if:
-            // 1) this locale has a layout/ 2) this locale has a dictionary and the length
-            // of the locale is equal to or larger than 5.
-            if (!hasLayout && !(hasDictionary && locale.toString().length() >= 5)) {
+            // 1) this locale has a layout/ 2) this locale has a dictionary
+            // If some locales have no layout but have a same dictionary, the shortest locale
+            // will be added to the supported list.
+            if (!hasLayout && !hasDictionary) {
                 continue;
             }
+            if (hasLayout) {
+                localeHasDictionaryMap.put(loc, hasDictionary);
+            }
+            if (!hasDictionary) {
+                continue;
+            }
+            if (dictionaryIdLocaleMap.containsKey(dictionaryId)) {
+                final String newLocale = locale.toString();
+                final String oldLocale =
+                        dictionaryIdLocaleMap.get(dictionaryId).mLocale.toString();
+                // Check if this locale is more appropriate to be the candidate of the input locale.
+                if (oldLocale.length() <= newLocale.length() && !hasLayout) {
+                    // Don't add this new locale to the map<dictionary id, locale> if:
+                    // 1) the new locale's name is longer than the existing one, and
+                    // 2) the new locale doesn't have its layout
+                    continue;
+                }
+            }
+            dictionaryIdLocaleMap.put(dictionaryId, loc);
+        }
+
+        for (LocaleEntry localeEntry : dictionaryIdLocaleMap.values()) {
+            if (!localeHasDictionaryMap.containsKey(localeEntry)) {
+                localeHasDictionaryMap.put(localeEntry, true);
+            }
+        }
+
+        for (Entry<LocaleEntry, Boolean> entry : localeHasDictionaryMap.entrySet()) {
+            final LocaleEntry localeEntry = entry.getKey();
+            final Locale locale = localeEntry.mLocale;
+            final Boolean hasDictionary = entry.getValue();
             CheckBoxPreference pref = new CheckBoxPreference(this);
-            pref.setTitle(SubtypeSwitcher.getFullDisplayName(locale, true));
+            pref.setTitle(localeEntry.mLabel);
             boolean checked = isLocaleIn(locale, languageList);
             pref.setChecked(checked);
             if (hasDictionary) {
@@ -118,11 +153,11 @@
         return false;
     }
 
-    private Pair<Boolean, Boolean> hasDictionaryOrLayout(Locale locale) {
-        if (locale == null) return new Pair<Boolean, Boolean>(false, false);
+    private Pair<Long, Boolean> hasDictionaryOrLayout(Locale locale) {
+        if (locale == null) return new Pair<Long, Boolean>(null, false);
         final Resources res = getResources();
         final Locale saveLocale = Utils.setSystemLocale(res, locale);
-        final boolean hasDictionary = DictionaryFactory.isDictionaryAvailable(this, locale);
+        final Long dictionaryId = DictionaryFactory.getDictionaryId(this, locale);
         boolean hasLayout = false;
 
         try {
@@ -141,7 +176,7 @@
         } catch (IOException e) {
         }
         Utils.setSystemLocale(res, saveLocale);
-        return new Pair<Boolean, Boolean>(hasDictionary, hasLayout);
+        return new Pair<Long, Boolean>(dictionaryId, hasLayout);
     }
 
     private String get5Code(Locale locale) {
@@ -174,13 +209,13 @@
         SharedPreferencesCompat.apply(editor);
     }
 
-    public ArrayList<Loc> getUniqueLocales() {
+    public ArrayList<LocaleEntry> getUniqueLocales() {
         String[] locales = getAssets().getLocales();
         Arrays.sort(locales);
-        ArrayList<Loc> uniqueLocales = new ArrayList<Loc>();
+        ArrayList<LocaleEntry> uniqueLocales = new ArrayList<LocaleEntry>();
 
         final int origSize = locales.length;
-        Loc[] preprocess = new Loc[origSize];
+        LocaleEntry[] preprocess = new LocaleEntry[origSize];
         int finalSize = 0;
         for (int i = 0 ; i < origSize; i++ ) {
             String s = locales[i];
@@ -202,26 +237,13 @@
 
             if (finalSize == 0) {
                 preprocess[finalSize++] =
-                        new Loc(SubtypeSwitcher.getFullDisplayName(l, true), l);
+                        new LocaleEntry(SubtypeSwitcher.getFullDisplayName(l, false), l);
             } else {
-                // check previous entry:
-                //  same lang and a country -> upgrade to full name and
-                //    insert ours with full name
-                //  diff lang -> insert ours with lang-only name
-                if (preprocess[finalSize-1].mLocale.getLanguage().equals(
-                        language)) {
-                    preprocess[finalSize-1].setLabel(SubtypeSwitcher.getFullDisplayName(
-                            preprocess[finalSize-1].mLocale, false));
-                    preprocess[finalSize++] =
-                            new Loc(SubtypeSwitcher.getFullDisplayName(l, false), l);
+                if (s.equals("zz_ZZ")) {
+                    // ignore this locale
                 } else {
-                    String displayName;
-                    if (s.equals("zz_ZZ")) {
-                        // ignore this locale
-                    } else {
-                        displayName = SubtypeSwitcher.getFullDisplayName(l, true);
-                        preprocess[finalSize++] = new Loc(displayName, l);
-                    }
+                    final String displayName = SubtypeSwitcher.getFullDisplayName(l, false);
+                    preprocess[finalSize++] = new LocaleEntry(displayName, l);
                 }
             }
         }
diff --git a/java/src/com/android/inputmethod/deprecated/languageswitcher/LanguageSwitcher.java b/java/src/com/android/inputmethod/deprecated/languageswitcher/LanguageSwitcher.java
index 5ef236e..1eedb5e 100644
--- a/java/src/com/android/inputmethod/deprecated/languageswitcher/LanguageSwitcher.java
+++ b/java/src/com/android/inputmethod/deprecated/languageswitcher/LanguageSwitcher.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 Google Inc.
+ * 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
@@ -20,6 +20,7 @@
 import com.android.inputmethod.latin.LatinImeLogger;
 import com.android.inputmethod.latin.Settings;
 import com.android.inputmethod.latin.SharedPreferencesCompat;
+import com.android.inputmethod.latin.Utils;
 
 import android.content.SharedPreferences;
 import android.content.SharedPreferences.Editor;
@@ -125,8 +126,7 @@
     private void constructLocales() {
         mLocales.clear();
         for (final String lang : mSelectedLanguageArray) {
-            final Locale locale = new Locale(lang.substring(0, 2),
-                    lang.length() > 4 ? lang.substring(3, 5) : "");
+            final Locale locale = Utils.constructLocaleFromString(lang);
             mLocales.add(locale);
         }
     }
diff --git a/java/src/com/android/inputmethod/latin/Recorrection.java b/java/src/com/android/inputmethod/deprecated/recorrection/Recorrection.java
similarity index 63%
rename from java/src/com/android/inputmethod/latin/Recorrection.java
rename to java/src/com/android/inputmethod/deprecated/recorrection/Recorrection.java
index 3fa6292..d40728d 100644
--- a/java/src/com/android/inputmethod/latin/Recorrection.java
+++ b/java/src/com/android/inputmethod/deprecated/recorrection/Recorrection.java
@@ -14,11 +14,22 @@
  * the License.
  */
 
-package com.android.inputmethod.latin;
+package com.android.inputmethod.deprecated.recorrection;
 
 import com.android.inputmethod.compat.InputConnectionCompatUtils;
+import com.android.inputmethod.compat.SuggestionSpanUtils;
 import com.android.inputmethod.deprecated.VoiceProxy;
 import com.android.inputmethod.keyboard.KeyboardSwitcher;
+import com.android.inputmethod.latin.AutoCorrection;
+import com.android.inputmethod.latin.CandidateView;
+import com.android.inputmethod.latin.EditingUtils;
+import com.android.inputmethod.latin.LatinIME;
+import com.android.inputmethod.latin.R;
+import com.android.inputmethod.latin.Settings;
+import com.android.inputmethod.latin.Suggest;
+import com.android.inputmethod.latin.SuggestedWords;
+import com.android.inputmethod.latin.TextEntryState;
+import com.android.inputmethod.latin.WordComposer;
 
 import android.content.SharedPreferences;
 import android.content.res.Resources;
@@ -32,12 +43,13 @@
 /**
  * Manager of re-correction functionalities
  */
-public class Recorrection {
+public class Recorrection implements SharedPreferences.OnSharedPreferenceChangeListener {
     private static final Recorrection sInstance = new Recorrection();
 
     private LatinIME mService;
     private boolean mRecorrectionEnabled = false;
-    private final ArrayList<WordAlternatives> mWordHistory = new ArrayList<WordAlternatives>();
+    private final ArrayList<RecorrectionSuggestionEntries> mRecorrectionSuggestionsList =
+            new ArrayList<RecorrectionSuggestionEntries>();
 
     public static Recorrection getInstance() {
         return sInstance;
@@ -58,20 +70,17 @@
     }
 
     private void initInternal(LatinIME context, SharedPreferences prefs) {
-        final Resources res = context.getResources();
-        // If the option should not be shown, do not read the re-correction preference
-        // but always use the default setting defined in the resources.
-        if (res.getBoolean(R.bool.config_enable_show_recorrection_option)) {
-            mRecorrectionEnabled = prefs.getBoolean(Settings.PREF_RECORRECTION_ENABLED,
-                    res.getBoolean(R.bool.config_default_recorrection_enabled));
-        } else {
-            mRecorrectionEnabled = res.getBoolean(R.bool.config_default_recorrection_enabled);
+        if (SuggestionSpanUtils.SUGGESTION_SPAN_IS_SUPPORTED) {
+            mRecorrectionEnabled = false;
+            return;
         }
+        updateRecorrectionEnabled(context.getResources(), prefs);
         mService = context;
+        prefs.registerOnSharedPreferenceChangeListener(this);
     }
 
     public void checkRecorrectionOnStart() {
-        if (!mRecorrectionEnabled) return;
+        if (SuggestionSpanUtils.SUGGESTION_SPAN_IS_SUPPORTED || !mRecorrectionEnabled) return;
 
         final InputConnection ic = mService.getCurrentInputConnection();
         if (ic == null) return;
@@ -98,42 +107,42 @@
     }
 
     public void updateRecorrectionSelection(KeyboardSwitcher keyboardSwitcher,
-            CandidateView candidateView, int candidatesStart, int candidatesEnd, int newSelStart,
-            int newSelEnd, int oldSelStart, int lastSelectionStart,
+            CandidateView candidateView, int candidatesStart, int candidatesEnd,
+            int newSelStart, int newSelEnd, int oldSelStart, int lastSelectionStart,
             int lastSelectionEnd, boolean hasUncommittedTypedChars) {
-        if (mRecorrectionEnabled && mService.isShowingSuggestionsStrip()) {
-            // Don't look for corrections if the keyboard is not visible
-            if (keyboardSwitcher.isInputViewShown()) {
-                // Check if we should go in or out of correction mode.
-                if (mService.isSuggestionsRequested()
-                        && (candidatesStart == candidatesEnd || newSelStart != oldSelStart
-                                || TextEntryState.isRecorrecting())
-                                && (newSelStart < newSelEnd - 1 || !hasUncommittedTypedChars)) {
-                    if (mService.isCursorTouchingWord() || lastSelectionStart < lastSelectionEnd) {
-                        mService.mHandler.cancelUpdateBigramPredictions();
-                        mService.mHandler.postUpdateOldSuggestions();
-                    } else {
-                        abortRecorrection(false);
-                        // If showing the "touch again to save" hint, do not replace it. Else,
-                        // show the bigrams if we are at the end of the text, punctuation otherwise.
-                        if (candidateView != null
-                                && !candidateView.isShowingAddToDictionaryHint()) {
-                            InputConnection ic = mService.getCurrentInputConnection();
-                            if (null == ic || !TextUtils.isEmpty(ic.getTextAfterCursor(1, 0))) {
-                                if (!mService.isShowingPunctuationList()) {
-                                    mService.setPunctuationSuggestions();
-                                }
-                            } else {
-                                mService.mHandler.postUpdateBigramPredictions();
-                            }
+        if (SuggestionSpanUtils.SUGGESTION_SPAN_IS_SUPPORTED || !mRecorrectionEnabled) return;
+        if (!mService.isShowingSuggestionsStrip()) return;
+        if (!keyboardSwitcher.isInputViewShown()) return;
+        if (!mService.isSuggestionsRequested()) return;
+        // Don't look for corrections if the keyboard is not visible
+        // Check if we should go in or out of correction mode.
+        if ((candidatesStart == candidatesEnd || newSelStart != oldSelStart || TextEntryState
+                .isRecorrecting())
+                && (newSelStart < newSelEnd - 1 || !hasUncommittedTypedChars)) {
+            if (mService.isCursorTouchingWord() || lastSelectionStart < lastSelectionEnd) {
+                mService.mHandler.cancelUpdateBigramPredictions();
+                mService.mHandler.postUpdateOldSuggestions();
+            } else {
+                abortRecorrection(false);
+                // If showing the "touch again to save" hint, do not replace it. Else,
+                // show the bigrams if we are at the end of the text, punctuation
+                // otherwise.
+                if (candidateView != null && !candidateView.isShowingAddToDictionaryHint()) {
+                    InputConnection ic = mService.getCurrentInputConnection();
+                    if (null == ic || !TextUtils.isEmpty(ic.getTextAfterCursor(1, 0))) {
+                        if (!mService.isShowingPunctuationList()) {
+                            mService.setPunctuationSuggestions();
                         }
+                    } else {
+                        mService.mHandler.postUpdateBigramPredictions();
                     }
                 }
             }
         }
     }
 
-    public void saveWordInHistory(WordComposer word, CharSequence result) {
+    public void saveRecorrectionSuggestion(WordComposer word, CharSequence result) {
+        if (SuggestionSpanUtils.SUGGESTION_SPAN_IS_SUPPORTED || !mRecorrectionEnabled) return;
         if (word.size() <= 1) {
             return;
         }
@@ -144,12 +153,13 @@
 
         // Make a copy of the CharSequence, since it is/could be a mutable CharSequence
         final String resultCopy = result.toString();
-        WordAlternatives entry = new WordAlternatives(resultCopy, new WordComposer(word));
-        mWordHistory.add(entry);
+        RecorrectionSuggestionEntries entry = new RecorrectionSuggestionEntries(
+                resultCopy, new WordComposer(word));
+        mRecorrectionSuggestionsList.add(entry);
     }
 
     public void clearWordsInHistory() {
-        mWordHistory.clear();
+        mRecorrectionSuggestionsList.clear();
     }
 
     /**
@@ -160,11 +170,12 @@
      */
     public boolean applyTypedAlternatives(WordComposer word, Suggest suggest,
             KeyboardSwitcher keyboardSwitcher, EditingUtils.SelectedWord touching) {
+        if (SuggestionSpanUtils.SUGGESTION_SPAN_IS_SUPPORTED || !mRecorrectionEnabled) return false;
         // If we didn't find a match, search for result in typed word history
         WordComposer foundWord = null;
-        WordAlternatives alternatives = null;
+        RecorrectionSuggestionEntries alternatives = null;
         // Search old suggestions to suggest re-corrected suggestions.
-        for (WordAlternatives entry : mWordHistory) {
+        for (RecorrectionSuggestionEntries entry : mRecorrectionSuggestionsList) {
             if (TextUtils.equals(entry.getChosenWord(), touching.mWord)) {
                 foundWord = entry.mWordComposer;
                 alternatives = entry;
@@ -186,7 +197,7 @@
         // Found a match, show suggestions
         if (foundWord != null || alternatives != null) {
             if (alternatives == null) {
-                alternatives = new WordAlternatives(touching.mWord, foundWord);
+                alternatives = new RecorrectionSuggestionEntries(touching.mWord, foundWord);
             }
             showRecorrections(suggest, keyboardSwitcher, alternatives);
             if (foundWord != null) {
@@ -201,17 +212,18 @@
 
 
     private void showRecorrections(Suggest suggest, KeyboardSwitcher keyboardSwitcher,
-            WordAlternatives alternatives) {
-        SuggestedWords.Builder builder = alternatives.getAlternatives(suggest, keyboardSwitcher);
+            RecorrectionSuggestionEntries entries) {
+        SuggestedWords.Builder builder = entries.getAlternatives(suggest, keyboardSwitcher);
         builder.setTypedWordValid(false).setHasMinimalSuggestion(false);
-        mService.showSuggestions(builder.build(), alternatives.getOriginalWord());
+        mService.showSuggestions(builder.build(), entries.getOriginalWord());
     }
 
-    public void setRecorrectionSuggestions(VoiceProxy voiceProxy, CandidateView candidateView,
-            Suggest suggest, KeyboardSwitcher keyboardSwitcher, WordComposer word,
-            boolean hasUncommittedTypedChars, int lastSelectionStart, int lastSelectionEnd,
-            String wordSeparators) {
+    public void fetchAndDisplayRecorrectionSuggestions(VoiceProxy voiceProxy,
+            CandidateView candidateView, Suggest suggest, KeyboardSwitcher keyboardSwitcher,
+            WordComposer word, boolean hasUncommittedTypedChars, int lastSelectionStart,
+            int lastSelectionEnd, String wordSeparators) {
         if (!InputConnectionCompatUtils.RECORRECTION_SUPPORTED) return;
+        if (SuggestionSpanUtils.SUGGESTION_SPAN_IS_SUPPORTED || !mRecorrectionEnabled) return;
         voiceProxy.setShowingVoiceSuggestions(false);
         if (candidateView != null && candidateView.isShowingAddToDictionaryHint()) {
             return;
@@ -237,7 +249,7 @@
                 ic.endBatchEdit();
             } else {
                 abortRecorrection(true);
-                mService.setPunctuationSuggestions();  // Show the punctuation suggestions list
+                mService.updateBigramPredictions();
             }
         } else {
             abortRecorrection(true);
@@ -245,6 +257,7 @@
     }
 
     public void abortRecorrection(boolean force) {
+        if (SuggestionSpanUtils.SUGGESTION_SPAN_IS_SUPPORTED) return;
         if (force || TextEntryState.isRecorrecting()) {
             TextEntryState.onAbortRecorrection();
             mService.setCandidatesViewShown(mService.isCandidateStripVisible());
@@ -252,4 +265,23 @@
             mService.clearSuggestions();
         }
     }
+
+    public void updateRecorrectionEnabled(Resources res, SharedPreferences prefs) {
+        // If the option should not be shown, do not read the re-correction preference
+        // but always use the default setting defined in the resources.
+        if (res.getBoolean(R.bool.config_enable_show_recorrection_option)) {
+            mRecorrectionEnabled = prefs.getBoolean(Settings.PREF_RECORRECTION_ENABLED,
+                    res.getBoolean(R.bool.config_default_recorrection_enabled));
+        } else {
+            mRecorrectionEnabled = res.getBoolean(R.bool.config_default_recorrection_enabled);
+        }
+    }
+
+    @Override
+    public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
+        if (SuggestionSpanUtils.SUGGESTION_SPAN_IS_SUPPORTED) return;
+        if (key.equals(Settings.PREF_RECORRECTION_ENABLED)) {
+            updateRecorrectionEnabled(mService.getResources(), prefs);
+        }
+    }
 }
diff --git a/java/src/com/android/inputmethod/latin/WordAlternatives.java b/java/src/com/android/inputmethod/deprecated/recorrection/RecorrectionSuggestionEntries.java
similarity index 81%
rename from java/src/com/android/inputmethod/latin/WordAlternatives.java
rename to java/src/com/android/inputmethod/deprecated/recorrection/RecorrectionSuggestionEntries.java
index 0e99144..5e6c870 100644
--- a/java/src/com/android/inputmethod/latin/WordAlternatives.java
+++ b/java/src/com/android/inputmethod/deprecated/recorrection/RecorrectionSuggestionEntries.java
@@ -14,17 +14,20 @@
  * the License.
  */
 
-package com.android.inputmethod.latin;
+package com.android.inputmethod.deprecated.recorrection;
 
 import com.android.inputmethod.keyboard.KeyboardSwitcher;
+import com.android.inputmethod.latin.Suggest;
+import com.android.inputmethod.latin.SuggestedWords;
+import com.android.inputmethod.latin.WordComposer;
 
 import android.text.TextUtils;
 
-public class WordAlternatives {
+public class RecorrectionSuggestionEntries {
     public final CharSequence mChosenWord;
     public final WordComposer mWordComposer;
 
-    public WordAlternatives(CharSequence chosenWord, WordComposer wordComposer) {
+    public RecorrectionSuggestionEntries(CharSequence chosenWord, WordComposer wordComposer) {
         mChosenWord = chosenWord;
         mWordComposer = wordComposer;
     }
@@ -54,6 +57,6 @@
 
     private static SuggestedWords.Builder getTypedSuggestions(
             Suggest suggest, KeyboardSwitcher keyboardSwitcher, WordComposer word) {
-        return suggest.getSuggestedWordBuilder(keyboardSwitcher.getInputView(), word, null);
+        return suggest.getSuggestedWordBuilder(keyboardSwitcher.getKeyboardView(), word, null);
     }
-}
\ No newline at end of file
+}
diff --git a/java/src/com/android/inputmethod/deprecated/voice/FieldContext.java b/java/src/com/android/inputmethod/deprecated/voice/FieldContext.java
index 0ef73d2..3c79cc2 100644
--- a/java/src/com/android/inputmethod/deprecated/voice/FieldContext.java
+++ b/java/src/com/android/inputmethod/deprecated/voice/FieldContext.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2009 Google Inc.
+ * Copyright (C) 2009 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
diff --git a/java/src/com/android/inputmethod/deprecated/voice/Hints.java b/java/src/com/android/inputmethod/deprecated/voice/Hints.java
index 52a4f4e..06b2343 100644
--- a/java/src/com/android/inputmethod/deprecated/voice/Hints.java
+++ b/java/src/com/android/inputmethod/deprecated/voice/Hints.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2009 Google Inc.
+ * Copyright (C) 2009 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
diff --git a/java/src/com/android/inputmethod/deprecated/voice/RecognitionView.java b/java/src/com/android/inputmethod/deprecated/voice/RecognitionView.java
index b57c16f..dcb826e 100644
--- a/java/src/com/android/inputmethod/deprecated/voice/RecognitionView.java
+++ b/java/src/com/android/inputmethod/deprecated/voice/RecognitionView.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2009 Google Inc.
+ * Copyright (C) 2009 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
diff --git a/java/src/com/android/inputmethod/deprecated/voice/SettingsUtil.java b/java/src/com/android/inputmethod/deprecated/voice/SettingsUtil.java
index 7721fe2..855a09a 100644
--- a/java/src/com/android/inputmethod/deprecated/voice/SettingsUtil.java
+++ b/java/src/com/android/inputmethod/deprecated/voice/SettingsUtil.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2009 Google Inc.
+ * Copyright (C) 2009 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
diff --git a/java/src/com/android/inputmethod/deprecated/voice/SoundIndicator.java b/java/src/com/android/inputmethod/deprecated/voice/SoundIndicator.java
index 8cc79de..25b3140 100644
--- a/java/src/com/android/inputmethod/deprecated/voice/SoundIndicator.java
+++ b/java/src/com/android/inputmethod/deprecated/voice/SoundIndicator.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011 Google Inc.
+ * 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
diff --git a/java/src/com/android/inputmethod/deprecated/voice/VoiceInput.java b/java/src/com/android/inputmethod/deprecated/voice/VoiceInput.java
index 7ee0de9..2dba014 100644
--- a/java/src/com/android/inputmethod/deprecated/voice/VoiceInput.java
+++ b/java/src/com/android/inputmethod/deprecated/voice/VoiceInput.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2009 Google Inc.
+ * Copyright (C) 2009 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
diff --git a/java/src/com/android/inputmethod/deprecated/voice/VoiceInputLogger.java b/java/src/com/android/inputmethod/deprecated/voice/VoiceInputLogger.java
index 87b9434..22e8207 100644
--- a/java/src/com/android/inputmethod/deprecated/voice/VoiceInputLogger.java
+++ b/java/src/com/android/inputmethod/deprecated/voice/VoiceInputLogger.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008 Google Inc.
+ * Copyright (C) 2008 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
diff --git a/java/src/com/android/inputmethod/deprecated/voice/WaveformImage.java b/java/src/com/android/inputmethod/deprecated/voice/WaveformImage.java
index a3025f2..8ed279f 100644
--- a/java/src/com/android/inputmethod/deprecated/voice/WaveformImage.java
+++ b/java/src/com/android/inputmethod/deprecated/voice/WaveformImage.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008-2009 Google Inc.
+ * Copyright (C) 2008-2009 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
diff --git a/java/src/com/android/inputmethod/deprecated/voice/Whitelist.java b/java/src/com/android/inputmethod/deprecated/voice/Whitelist.java
index 310689c..6c5f52a 100644
--- a/java/src/com/android/inputmethod/deprecated/voice/Whitelist.java
+++ b/java/src/com/android/inputmethod/deprecated/voice/Whitelist.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2009 Google Inc.
+ * Copyright (C) 2009 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
diff --git a/java/src/com/android/inputmethod/keyboard/Key.java b/java/src/com/android/inputmethod/keyboard/Key.java
index 5c59d44..cb52946 100644
--- a/java/src/com/android/inputmethod/keyboard/Key.java
+++ b/java/src/com/android/inputmethod/keyboard/Key.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 Google Inc.
+ * 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
@@ -101,6 +101,10 @@
     /** Key is enabled and responds on press */
     public boolean mEnabled = true;
 
+    // keyWidth constants
+    private static final int KEYWIDTH_FILL_RIGHT = 0;
+    private static final int KEYWIDTH_FILL_BOTH = -1;
+
     private final static int[] KEY_STATE_NORMAL_ON = {
         android.R.attr.state_checkable,
         android.R.attr.state_checked
@@ -140,12 +144,12 @@
     };
 
     /**
-     * This constructor is being used only for key in mini popup keyboard.
+     * This constructor is being used only for key in popup mini keyboard.
      */
     public Key(Resources res, Keyboard keyboard, CharSequence popupCharacter, int x, int y,
-            int width, int edgeFlags) {
+            int width, int height, int edgeFlags) {
         mKeyboard = keyboard;
-        mHeight = keyboard.getRowHeight() - keyboard.getVerticalGap();
+        mHeight = height - keyboard.getVerticalGap();
         mGap = keyboard.getHorizontalGap();
         mVisualInsetsLeft = mVisualInsetsRight = 0;
         mWidth = width - mGap;
@@ -178,6 +182,7 @@
      * @param x the x coordinate of the top-left
      * @param y the y coordinate of the top-left
      * @param parser the XML parser containing the attributes for this key
+     * @param keyStyles active key styles set
      */
     public Key(Resources res, Row row, int x, int y, XmlResourceParser parser,
             KeyStyles keyStyles) {
@@ -185,6 +190,7 @@
 
         final TypedArray keyboardAttr = res.obtainAttributes(Xml.asAttributeSet(parser),
                 R.styleable.Keyboard);
+        int keyWidth;
         try {
             mHeight = KeyboardParser.getDimensionOrFraction(keyboardAttr,
                     R.styleable.Keyboard_rowHeight,
@@ -192,17 +198,13 @@
             mGap = KeyboardParser.getDimensionOrFraction(keyboardAttr,
                     R.styleable.Keyboard_horizontalGap,
                     mKeyboard.getDisplayWidth(), row.mDefaultHorizontalGap);
-            mWidth = KeyboardParser.getDimensionOrFraction(keyboardAttr,
+            keyWidth = KeyboardParser.getDimensionOrFraction(keyboardAttr,
                     R.styleable.Keyboard_keyWidth,
-                    mKeyboard.getDisplayWidth(), row.mDefaultWidth) - mGap;
+                    mKeyboard.getDisplayWidth(), row.mDefaultWidth);
         } finally {
             keyboardAttr.recycle();
         }
 
-        // Horizontal gap is divided equally to both sides of the key.
-        mX = x + mGap / 2;
-        mY = y;
-
         final TypedArray keyAttr = res.obtainAttributes(Xml.asAttributeSet(parser),
                 R.styleable.Keyboard_Key);
         try {
@@ -216,6 +218,35 @@
                 style = keyStyles.getEmptyKeyStyle();
             }
 
+            final int keyboardWidth = mKeyboard.getDisplayWidth();
+            int keyXPos = KeyboardParser.getDimensionOrFraction(keyAttr,
+                    R.styleable.Keyboard_Key_keyXPos, keyboardWidth, x);
+            if (keyXPos < 0) {
+                // If keyXPos is negative, the actual x-coordinate will be k + keyXPos.
+                keyXPos += keyboardWidth;
+                if (keyXPos < x) {
+                    // keyXPos shouldn't be less than x because drawable area for this key starts
+                    // at x. Or, this key will overlaps the adjacent key on its left hand side.
+                    keyXPos = x;
+                }
+            }
+            if (keyWidth == KEYWIDTH_FILL_RIGHT) {
+                // If keyWidth is zero, the actual key width will be determined to fill out the
+                // area up to the right edge of the keyboard.
+                keyWidth = keyboardWidth - keyXPos;
+            } else if (keyWidth <= KEYWIDTH_FILL_BOTH) {
+                // If keyWidth is negative, the actual key width will be determined to fill out the
+                // area between the nearest key on the left hand side and the right edge of the
+                // keyboard.
+                keyXPos = x;
+                keyWidth = keyboardWidth - keyXPos;
+            }
+
+            // Horizontal gap is divided equally to both sides of the key.
+            mX = keyXPos + mGap / 2;
+            mY = y;
+            mWidth = keyWidth - mGap;
+
             final CharSequence[] popupCharacters = style.getTextArray(keyAttr,
                     R.styleable.Keyboard_Key_popupCharacters);
             if (res.getBoolean(R.bool.config_digit_popup_characters_enabled)) {
@@ -275,7 +306,7 @@
     }
 
     private static boolean isDigitPopupCharacter(CharSequence label) {
-        return label.length() == 1 && Character.isDigit(label.charAt(0));
+        return label != null && label.length() == 1 && Character.isDigit(label.charAt(0));
     }
 
     private static CharSequence[] filterOutDigitPopupCharacters(CharSequence[] popupCharacters) {
diff --git a/java/src/com/android/inputmethod/keyboard/KeyDetector.java b/java/src/com/android/inputmethod/keyboard/KeyDetector.java
index 0b13afe..7add43a 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyDetector.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyDetector.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 Google Inc.
+ * 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
diff --git a/java/src/com/android/inputmethod/keyboard/KeyStyles.java b/java/src/com/android/inputmethod/keyboard/KeyStyles.java
index d464c20..d53df78 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyStyles.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyStyles.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 Google Inc.
+ * 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
diff --git a/java/src/com/android/inputmethod/keyboard/Keyboard.java b/java/src/com/android/inputmethod/keyboard/Keyboard.java
index 492883c..267abcc 100644
--- a/java/src/com/android/inputmethod/keyboard/Keyboard.java
+++ b/java/src/com/android/inputmethod/keyboard/Keyboard.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 Google Inc.
+ * 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
@@ -151,16 +151,11 @@
      * @param context the application or service context
      * @param xmlLayoutResId the resource file that contains the keyboard layout and keys.
      * @param id keyboard identifier
+     * @param width keyboard width
      */
-    public Keyboard(Context context, int xmlLayoutResId, KeyboardId id) {
-        this(context, xmlLayoutResId, id,
-                context.getResources().getDisplayMetrics().widthPixels,
-                context.getResources().getDisplayMetrics().heightPixels);
-    }
 
-    private Keyboard(Context context, int xmlLayoutResId, KeyboardId id, int width,
-            int height) {
-        Resources res = context.getResources();
+    public Keyboard(Context context, int xmlLayoutResId, KeyboardId id, int width) {
+        final Resources res = context.getResources();
         GRID_WIDTH = res.getInteger(R.integer.config_keyboard_grid_width);
         GRID_HEIGHT = res.getInteger(R.integer.config_keyboard_grid_height);
         GRID_SIZE = GRID_WIDTH * GRID_HEIGHT;
@@ -168,7 +163,8 @@
         final int horizontalEdgesPadding = (int)res.getDimension(
                 R.dimen.keyboard_horizontal_edges_padding);
         mDisplayWidth = width - horizontalEdgesPadding * 2;
-        mDisplayHeight = height;
+        // TODO: Adjust the height by referring to the height of area available for drawing as well.
+        mDisplayHeight = res.getDisplayMetrics().heightPixels;
 
         mDefaultHorizontalGap = 0;
         setKeyWidth(mDisplayWidth / 10);
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardActionListener.java b/java/src/com/android/inputmethod/keyboard/KeyboardActionListener.java
index 098af21..7e67d6f 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardActionListener.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardActionListener.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 Google Inc.
+ * 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
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardId.java b/java/src/com/android/inputmethod/keyboard/KeyboardId.java
index f68b68f..7c03ec7 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardId.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardId.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 Google Inc.
+ * 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
@@ -34,35 +34,40 @@
     public static final int MODE_URL = 1;
     public static final int MODE_EMAIL = 2;
     public static final int MODE_IM = 3;
-    public static final int MODE_WEB = 4;
-    public static final int MODE_PHONE = 5;
-    public static final int MODE_NUMBER = 6;
+    public static final int MODE_PHONE = 4;
+    public static final int MODE_NUMBER = 5;
 
     public final Locale mLocale;
     public final int mOrientation;
+    public final int mWidth;
     public final int mMode;
     public final int mXmlId;
     public final int mColorScheme;
+    public final boolean mWebInput;
     public final boolean mPasswordInput;
     public final boolean mHasSettingsKey;
     public final boolean mVoiceKeyEnabled;
     public final boolean mHasVoiceKey;
     public final int mImeAction;
     public final boolean mEnableShiftLock;
+
     public final String mXmlName;
+    public final EditorInfo mAttribute;
 
     private final int mHashCode;
 
     public KeyboardId(String xmlName, int xmlId, int colorScheme, Locale locale, int orientation,
-            int mode, EditorInfo attribute, boolean hasSettingsKey, boolean voiceKeyEnabled,
-            boolean hasVoiceKey, boolean enableShiftLock) {
+            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;
         this.mOrientation = orientation;
+        this.mWidth = width;
         this.mMode = mode;
         this.mXmlId = xmlId;
         this.mColorScheme = colorScheme;
+        this.mWebInput = InputTypeCompatUtils.isWebInputType(inputType);
         this.mPasswordInput = InputTypeCompatUtils.isPasswordInputType(inputType)
                 || InputTypeCompatUtils.isVisiblePasswordInputType(inputType);
         this.mHasSettingsKey = hasSettingsKey;
@@ -73,14 +78,18 @@
         this.mImeAction = imeOptions & (
                 EditorInfo.IME_MASK_ACTION | EditorInfo.IME_FLAG_NO_ENTER_ACTION);
         this.mEnableShiftLock = enableShiftLock;
+
         this.mXmlName = xmlName;
+        this.mAttribute = attribute;
 
         this.mHashCode = Arrays.hashCode(new Object[] {
                 locale,
                 orientation,
+                width,
                 mode,
                 xmlId,
                 colorScheme,
+                mWebInput,
                 mPasswordInput,
                 hasSettingsKey,
                 voiceKeyEnabled,
@@ -90,6 +99,18 @@
         });
     }
 
+    public KeyboardId cloneWithNewLayout(String xmlName, int xmlId) {
+        return new KeyboardId(xmlName, xmlId, mColorScheme, 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);
+    }
+
     public int getXmlId() {
         return mXmlId;
     }
@@ -118,9 +139,11 @@
     boolean equals(KeyboardId other) {
         return other.mLocale.equals(this.mLocale)
             && other.mOrientation == this.mOrientation
+            && other.mWidth == this.mWidth
             && other.mMode == this.mMode
             && other.mXmlId == this.mXmlId
             && other.mColorScheme == this.mColorScheme
+            && other.mWebInput == this.mWebInput
             && other.mPasswordInput == this.mPasswordInput
             && other.mHasSettingsKey == this.mHasSettingsKey
             && other.mVoiceKeyEnabled == this.mVoiceKeyEnabled
@@ -136,18 +159,19 @@
 
     @Override
     public String toString() {
-        return String.format("[%s.xml %s %s %s imeAction=%s %s%s%s%s%s%s]",
+        return String.format("[%s.xml %s %s%d %s %s %s%s%s%s%s%s%s]",
                 mXmlName,
                 mLocale,
-                (mOrientation == 1 ? "port" : "land"),
+                (mOrientation == 1 ? "port" : "land"), mWidth,
                 modeName(mMode),
                 EditorInfoCompatUtils.imeOptionsName(mImeAction),
+                colorSchemeName(mColorScheme),
+                (mWebInput ? " webInput" : ""),
                 (mPasswordInput ? " passwordInput" : ""),
                 (mHasSettingsKey ? " hasSettingsKey" : ""),
                 (mVoiceKeyEnabled ? " voiceKeyEnabled" : ""),
                 (mHasVoiceKey ? " hasVoiceKey" : ""),
-                (mEnableShiftLock ? " enableShiftLock" : ""),
-                colorSchemeName(mColorScheme)
+                (mEnableShiftLock ? " enableShiftLock" : "")
         );
     }
 
@@ -157,7 +181,6 @@
         case MODE_URL: return "url";
         case MODE_EMAIL: return "email";
         case MODE_IM: return "im";
-        case MODE_WEB: return "web";
         case MODE_PHONE: return "phone";
         case MODE_NUMBER: return "number";
         }
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardParser.java b/java/src/com/android/inputmethod/keyboard/KeyboardParser.java
index 69ae788..c2db62a 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardParser.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardParser.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 Google Inc.
+ * 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
@@ -196,9 +196,20 @@
             final int keyboardHeight = (int)keyboardAttr.getDimension(
                     R.styleable.Keyboard_keyboardHeight, displayHeight / 2);
             final int maxKeyboardHeight = getDimensionOrFraction(keyboardAttr,
-                    R.styleable.Keyboard_maxKeyboardHeight, displayHeight,  displayHeight / 2);
-            // Keyboard height will not exceed maxKeyboardHeight.
-            final int height = Math.min(keyboardHeight, maxKeyboardHeight);
+                    R.styleable.Keyboard_maxKeyboardHeight, displayHeight, displayHeight / 2);
+            int minKeyboardHeight = getDimensionOrFraction(keyboardAttr,
+                    R.styleable.Keyboard_minKeyboardHeight, displayHeight, displayHeight / 2);
+            if (minKeyboardHeight < 0) {
+                // Specified fraction was negative, so it should be calculated against display
+                // width.
+                final int displayWidth = keyboard.getDisplayWidth();
+                minKeyboardHeight = -getDimensionOrFraction(keyboardAttr,
+                        R.styleable.Keyboard_minKeyboardHeight, displayWidth, displayWidth / 2);
+            }
+            // Keyboard height will not exceed maxKeyboardHeight and will not be less than
+            // minKeyboardHeight.
+            final int height = Math.max(
+                    Math.min(keyboardHeight, maxKeyboardHeight), minKeyboardHeight);
             final int width = keyboard.getDisplayWidth();
 
             keyboard.setKeyboardHeight(height);
@@ -269,7 +280,7 @@
                 if (TAG_KEY.equals(tag)) {
                     parseKey(parser, row, keys);
                 } else if (TAG_SPACER.equals(tag)) {
-                    parseSpacer(parser, keys);
+                    parseSpacer(parser, row, keys);
                 } else if (TAG_INCLUDE.equals(tag)) {
                     parseIncludeRowContent(parser, row, keys);
                 } else if (TAG_SWITCH.equals(tag)) {
@@ -316,19 +327,32 @@
         }
     }
 
-    private void parseSpacer(XmlResourceParser parser, List<Key> keys)
+    private void parseSpacer(XmlResourceParser parser, Row row, List<Key> keys)
             throws XmlPullParserException, IOException {
         if (keys == null) {
             checkEndTag(TAG_SPACER, parser);
         } else {
             if (DEBUG) Log.d(TAG, String.format("<%s />", TAG_SPACER));
-            final TypedArray a = mResources.obtainAttributes(Xml.asAttributeSet(parser),
+            final TypedArray keyboardAttr = mResources.obtainAttributes(Xml.asAttributeSet(parser),
                     R.styleable.Keyboard);
-            final int gap = getDimensionOrFraction(a, R.styleable.Keyboard_horizontalGap,
-                    mKeyboard.getDisplayWidth(), 0);
-            a.recycle();
+            if (keyboardAttr.hasValue(R.styleable.Keyboard_horizontalGap))
+                throw new IllegalAttribute(parser, "horizontalGap");
+            final int defaultWidth = (row != null) ? row.mDefaultWidth : 0;
+            final int keyWidth = getDimensionOrFraction(keyboardAttr, R.styleable.Keyboard_keyWidth,
+                    mKeyboard.getDisplayWidth(), defaultWidth);
+            keyboardAttr.recycle();
+
+            final TypedArray keyAttr = mResources.obtainAttributes(Xml.asAttributeSet(parser),
+                    R.styleable.Keyboard_Key);
+            int keyXPos = KeyboardParser.getDimensionOrFraction(keyAttr,
+                    R.styleable.Keyboard_Key_keyXPos, mKeyboard.getDisplayWidth(), mCurrentX);
+            if (keyXPos < 0) {
+                // If keyXPos is negative, the actual x-coordinate will be display_width + keyXPos.
+                keyXPos += mKeyboard.getDisplayWidth();
+            }
+
             checkEndTag(TAG_SPACER, parser);
-            setSpacer(gap);
+            setSpacer(keyXPos, keyWidth);
         }
     }
 
@@ -443,8 +467,10 @@
         final TypedArray viewAttr = mResources.obtainAttributes(Xml.asAttributeSet(parser),
                 R.styleable.KeyboardView);
         try {
-            final boolean modeMatched = matchInteger(a,
-                    R.styleable.Keyboard_Case_mode, id.mMode);
+            final boolean modeMatched = matchTypedValue(a,
+                    R.styleable.Keyboard_Case_mode, id.mMode, KeyboardId.modeName(id.mMode));
+            final boolean webInputMatched = matchBoolean(a,
+                    R.styleable.Keyboard_Case_webInput, id.mWebInput);
             final boolean passwordInputMatched = matchBoolean(a,
                     R.styleable.Keyboard_Case_passwordInput, id.mPasswordInput);
             final boolean settingsKeyMatched = matchBoolean(a,
@@ -461,26 +487,30 @@
             // this attribute with id.mImeOptions as integer value is enough for our purpose.
             final boolean imeActionMatched = matchInteger(a,
                     R.styleable.Keyboard_Case_imeAction, id.mImeAction);
+            final boolean localeCodeMatched = matchString(a,
+                    R.styleable.Keyboard_Case_localeCode, id.mLocale.toString());
             final boolean languageCodeMatched = matchString(a,
                     R.styleable.Keyboard_Case_languageCode, id.mLocale.getLanguage());
             final boolean countryCodeMatched = matchString(a,
                     R.styleable.Keyboard_Case_countryCode, id.mLocale.getCountry());
-            final boolean selected = modeMatched && passwordInputMatched && settingsKeyMatched
-                    && voiceEnabledMatched && voiceKeyMatched && colorSchemeMatched
-                    && imeActionMatched && languageCodeMatched && countryCodeMatched;
+            final boolean selected = modeMatched && webInputMatched && passwordInputMatched
+                    && settingsKeyMatched && voiceEnabledMatched && voiceKeyMatched
+                    && colorSchemeMatched && imeActionMatched && localeCodeMatched
+                    && languageCodeMatched && countryCodeMatched;
 
-            if (DEBUG) Log.d(TAG, String.format("<%s%s%s%s%s%s%s%s%s%s> %s", TAG_CASE,
-                    textAttr(KeyboardId.modeName(
-                            a.getInt(R.styleable.Keyboard_Case_mode, -1)), "mode"),
+            if (DEBUG) Log.d(TAG, String.format("<%s%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)), "colorSchemeName"),
+                                    R.styleable.KeyboardView_colorScheme, -1)), "colorScheme"),
+                    booleanAttr(a, R.styleable.Keyboard_Case_webInput, "webInput"),
                     booleanAttr(a, R.styleable.Keyboard_Case_passwordInput, "passwordInput"),
                     booleanAttr(a, R.styleable.Keyboard_Case_hasSettingsKey, "hasSettingsKey"),
                     booleanAttr(a, R.styleable.Keyboard_Case_voiceKeyEnabled, "voiceKeyEnabled"),
                     booleanAttr(a, R.styleable.Keyboard_Case_hasVoiceKey, "hasVoiceKey"),
                     textAttr(EditorInfoCompatUtils.imeOptionsName(
                             a.getInt(R.styleable.Keyboard_Case_imeAction, -1)), "imeAction"),
+                    textAttr(a.getString(R.styleable.Keyboard_Case_localeCode), "localeCode"),
                     textAttr(a.getString(R.styleable.Keyboard_Case_languageCode), "languageCode"),
                     textAttr(a.getString(R.styleable.Keyboard_Case_countryCode), "countryCode"),
                     Boolean.toString(selected)));
@@ -507,7 +537,30 @@
     private static boolean matchString(TypedArray a, int index, String value) {
         // If <case> does not have "index" attribute, that means this <case> is wild-card for the
         // attribute.
-        return !a.hasValue(index) || a.getString(index).equals(value);
+        return !a.hasValue(index) || stringArrayContains(a.getString(index).split("\\|"), value);
+    }
+
+    private static boolean matchTypedValue(TypedArray a, int index, int intValue, String strValue) {
+        // If <case> does not have "index" attribute, that means this <case> is wild-card for the
+        // attribute.
+        final TypedValue v = a.peekValue(index);
+        if (v == null)
+            return true;
+
+        if (isIntegerValue(v)) {
+            return intValue == a.getInt(index, 0);
+        } else if (isStringValue(v)) {
+            return stringArrayContains(a.getString(index).split("\\|"), strValue);
+        }
+        return false;
+    }
+
+    private static boolean stringArrayContains(String[] array, String value) {
+        for (final String elem : array) {
+            if (elem.equals(value))
+                return true;
+        }
+        return false;
     }
 
     private boolean parseDefault(XmlResourceParser parser, Row row, List<Key> keys)
@@ -551,14 +604,14 @@
 
     private void startRow(Row row) {
         mCurrentX = 0;
-        setSpacer(mHorizontalEdgesPadding);
+        setSpacer(mCurrentX, mHorizontalEdgesPadding);
         mCurrentRow = row;
     }
 
     private void endRow() {
         if (mCurrentRow == null)
             throw new InflateException("orphant end row tag");
-        setSpacer(mHorizontalEdgesPadding);
+        setSpacer(mCurrentX, mHorizontalEdgesPadding);
         if (mCurrentX > mMaxRowWidth)
             mMaxRowWidth = mCurrentX;
         mCurrentY += mCurrentRow.mDefaultHeight;
@@ -566,7 +619,7 @@
     }
 
     private void endKey(Key key) {
-        mCurrentX += key.mGap + key.mWidth;
+        mCurrentX = key.mX - key.mGap / 2 + key.mWidth + key.mGap;
     }
 
     private void endKeyboard(int defaultVerticalGap) {
@@ -574,23 +627,42 @@
         mTotalHeight = mCurrentY - defaultVerticalGap;
     }
 
-    private void setSpacer(int gap) {
-        mCurrentX += gap;
+    private void setSpacer(int keyXPos, int width) {
+        mCurrentX = keyXPos + width;
     }
 
     public static int getDimensionOrFraction(TypedArray a, int index, int base, int defValue) {
         final TypedValue value = a.peekValue(index);
         if (value == null)
             return defValue;
-        if (value.type == TypedValue.TYPE_DIMENSION) {
-            return a.getDimensionPixelOffset(index, defValue);
-        } else if (value.type == TypedValue.TYPE_FRACTION) {
+        if (isFractionValue(value)) {
             // Round it to avoid values like 47.9999 from getting truncated
             return Math.round(a.getFraction(index, base, base, defValue));
+        } else if (isDimensionValue(value)) {
+            return a.getDimensionPixelOffset(index, defValue);
+        } else if (isIntegerValue(value)) {
+            // For enum value.
+            return a.getInt(index, defValue);
         }
         return defValue;
     }
 
+    private static boolean isFractionValue(TypedValue v) {
+        return v.type == TypedValue.TYPE_FRACTION;
+    }
+
+    private static boolean isDimensionValue(TypedValue v) {
+        return v.type == TypedValue.TYPE_DIMENSION;
+    }
+
+    private static boolean isIntegerValue(TypedValue v) {
+        return v.type >= TypedValue.TYPE_FIRST_INT && v.type <= TypedValue.TYPE_LAST_INT;
+    }
+
+    private static boolean isStringValue(TypedValue v) {
+        return v.type == TypedValue.TYPE_STRING;
+    }
+
     @SuppressWarnings("serial")
     public static class ParseException extends InflateException {
         public ParseException(String msg, XmlResourceParser parser) {
@@ -613,6 +685,13 @@
     }
 
     @SuppressWarnings("serial")
+    private static class IllegalAttribute extends ParseException {
+        public IllegalAttribute(XmlResourceParser parser, String attribute) {
+            super("Tag " + parser.getName() + " has illegal attribute " + attribute, parser);
+        }
+    }
+
+    @SuppressWarnings("serial")
     private static class NonEmptyTag extends ParseException {
         public NonEmptyTag(String tag, XmlResourceParser parser) {
             super(tag + " must be empty tag", parser);
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardShiftState.java b/java/src/com/android/inputmethod/keyboard/KeyboardShiftState.java
index d541279..e015b51 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardShiftState.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardShiftState.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 Google Inc.
+ * 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
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java b/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java
index 333fbc7..2512118 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java
@@ -16,6 +16,16 @@
 
 package com.android.inputmethod.keyboard;
 
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.content.res.Resources;
+import android.util.Log;
+import android.view.ContextThemeWrapper;
+import android.view.InflateException;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.inputmethod.EditorInfo;
+
 import com.android.inputmethod.compat.InputMethodManagerCompatWrapper;
 import com.android.inputmethod.latin.LatinIME;
 import com.android.inputmethod.latin.LatinImeLogger;
@@ -24,37 +34,30 @@
 import com.android.inputmethod.latin.SubtypeSwitcher;
 import com.android.inputmethod.latin.Utils;
 
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.content.res.Resources;
-import android.util.Log;
-import android.view.InflateException;
-import android.view.inputmethod.EditorInfo;
-
 import java.lang.ref.SoftReference;
 import java.util.HashMap;
 import java.util.Locale;
 
 public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceChangeListener {
-    private static final String TAG = "KeyboardSwitcher";
-    private static final boolean DEBUG = false;
+    private static final String TAG = KeyboardSwitcher.class.getSimpleName();
+    private static final boolean DEBUG_CACHE = LatinImeLogger.sDBG;
     public static final boolean DEBUG_STATE = false;
 
     private static String sConfigDefaultKeyboardThemeId;
     public static final String PREF_KEYBOARD_LAYOUT = "pref_keyboard_layout_20100902";
     private static final int[] KEYBOARD_THEMES = {
-        R.layout.input_basic,
-        R.layout.input_basic_highcontrast,
-        R.layout.input_stone_normal,
-        R.layout.input_stone_bold,
-        R.layout.input_gingerbread,
-        R.layout.input_honeycomb,
+        R.style.KeyboardTheme,
+        R.style.KeyboardTheme_HighContrast,
+        R.style.KeyboardTheme_Stone,
+        R.style.KeyboardTheme_Stone_Bold,
+        R.style.KeyboardTheme_Gingerbread,
+        R.style.KeyboardTheme_Honeycomb,
     };
 
     private SubtypeSwitcher mSubtypeSwitcher;
     private SharedPreferences mPrefs;
 
-    private LatinKeyboardView mInputView;
+    private LatinKeyboardView mKeyboardView;
     private LatinIME mInputMethodService;
 
     // TODO: Combine these key state objects with auto mode switch state.
@@ -98,7 +101,8 @@
     // Default is SETTINGS_KEY_MODE_AUTO.
     private static final int DEFAULT_SETTINGS_KEY_MODE = SETTINGS_KEY_MODE_AUTO;
 
-    private int mLayoutId;
+    private int mThemeIndex;
+    private int mKeyboardWidth;
 
     private static final KeyboardSwitcher sInstance = new KeyboardSwitcher();
 
@@ -118,11 +122,11 @@
         try {
             sConfigDefaultKeyboardThemeId = ims.getString(
                     R.string.config_default_keyboard_theme_id);
-            sInstance.mLayoutId = Integer.valueOf(
+            sInstance.mThemeIndex = Integer.valueOf(
                     prefs.getString(PREF_KEYBOARD_LAYOUT, sConfigDefaultKeyboardThemeId));
         } catch (NumberFormatException e) {
             sConfigDefaultKeyboardThemeId = "0";
-            sInstance.mLayoutId = 0;
+            sInstance.mThemeIndex = 0;
         }
         prefs.registerOnSharedPreferenceChangeListener(sInstance);
     }
@@ -142,7 +146,7 @@
 
     private void loadKeyboardInternal(EditorInfo attribute, boolean voiceButtonEnabled,
             boolean voiceButtonOnPrimary, boolean isSymbols) {
-        if (mInputView == null) return;
+        if (mKeyboardView == null) return;
 
         mAttribute = attribute;
         mVoiceKeyEnabled = voiceButtonEnabled;
@@ -151,15 +155,39 @@
         // Update the settings key state because number of enabled IMEs could have been changed
         mSettingsKeyEnabledInSettings = getSettingsKeyMode(mPrefs, mInputMethodService);
         final KeyboardId id = getKeyboardId(attribute, isSymbols);
-        makeSymbolsKeyboardIds(id.mMode, attribute);
-        mCurrentId = id;
-        mInputView.setKeyPreviewEnabled(mInputMethodService.getPopupOn());
+
+        // Note: This comment is only applied for phone number keyboard layout.
+        // On non-xlarge device, "@integer/key_switch_alpha_symbol" key code is used to switch
+        // between "phone keyboard" and "phone symbols keyboard".  But on xlarge device,
+        // "@integer/key_shift" key code is used for that purpose in order to properly display
+        // "more" and "locked more" key labels.  To achieve these behavior, we should initialize
+        // mSymbolsId and mSymbolsShiftedId to "phone keyboard" and "phone symbols keyboard"
+        // respectively here for xlarge device's layout switching.
+        mSymbolsId = makeSiblingKeyboardId(id, R.xml.kbd_symbols, R.xml.kbd_phone);
+        mSymbolsShiftedId = makeSiblingKeyboardId(
+                id, R.xml.kbd_symbols_shift, R.xml.kbd_phone_symbols);
+
         setKeyboard(getKeyboard(id));
     }
 
+    public void onSizeChanged() {
+        final int width = mInputMethodService.getWindow().getWindow().getDecorView().getWidth();
+        if (width == 0)
+            return;
+        mKeyboardWidth = width;
+        // Set keyboard with new width.
+        final KeyboardId newId = mCurrentId.cloneWithNewGeometry(width);
+        setKeyboard(getKeyboard(newId));
+    }
+
     private void setKeyboard(final Keyboard newKeyboard) {
-        final Keyboard oldKeyboard = mInputView.getKeyboard();
-        mInputView.setKeyboard(newKeyboard);
+        final Keyboard oldKeyboard = mKeyboardView.getKeyboard();
+        mKeyboardView.setKeyboard(newKeyboard);
+        mCurrentId = newKeyboard.mId;
+        final Resources res = mInputMethodService.getResources();
+        mKeyboardView.setKeyPreviewPopupEnabled(
+                Settings.Values.isKeyPreviewPopupEnabled(mPrefs, res),
+                Settings.Values.getKeyPreviewPopupDismissDelay(mPrefs, res));
         final boolean localeChanged = (oldKeyboard == null)
                 || !newKeyboard.mId.mLocale.equals(oldKeyboard.mId.mLocale);
         mInputMethodService.mHandler.startDisplayLanguageOnSpacebar(localeChanged);
@@ -173,19 +201,19 @@
             final Locale savedLocale = Utils.setSystemLocale(res,
                     mSubtypeSwitcher.getInputLocale());
 
-            keyboard = new LatinKeyboard(mInputMethodService, id);
+            keyboard = new LatinKeyboard(mInputMethodService, id, id.mWidth);
 
             if (id.mEnableShiftLock) {
                 keyboard.enableShiftLock();
             }
 
             mKeyboardCache.put(id, new SoftReference<LatinKeyboard>(keyboard));
-            if (DEBUG)
+            if (DEBUG_CACHE)
                 Log.d(TAG, "keyboard cache size=" + mKeyboardCache.size() + ": "
                         + ((ref == null) ? "LOAD" : "GCed") + " id=" + id);
 
             Utils.setSystemLocale(res, savedLocale);
-        } else if (DEBUG) {
+        } else if (DEBUG_CACHE) {
             Log.d(TAG, "keyboard cache size=" + mKeyboardCache.size() + ": HIT  id=" + id);
         }
 
@@ -242,33 +270,19 @@
         final boolean hasSettingsKey = hasSettingsKey(attribute);
         final Resources res = mInputMethodService.getResources();
         final int orientation = res.getConfiguration().orientation;
+        if (mKeyboardWidth == 0)
+            mKeyboardWidth = res.getDisplayMetrics().widthPixels;
         final Locale locale = mSubtypeSwitcher.getInputLocale();
         return new KeyboardId(
-                res.getResourceEntryName(xmlId), xmlId, charColorId, locale, orientation, mode,
-                attribute, hasSettingsKey, mVoiceKeyEnabled, hasVoiceKey, enableShiftLock);
+                res.getResourceEntryName(xmlId), xmlId, charColorId, locale, orientation,
+                mKeyboardWidth, mode, attribute, hasSettingsKey, mVoiceKeyEnabled, hasVoiceKey,
+                enableShiftLock);
     }
 
-    private void makeSymbolsKeyboardIds(final int mode, EditorInfo attribute) {
-        final Locale locale = mSubtypeSwitcher.getInputLocale();
-        final Resources res = mInputMethodService.getResources();
-        final int orientation = res.getConfiguration().orientation;
-        final int colorScheme = getColorScheme();
-        final boolean hasVoiceKey = mVoiceKeyEnabled && !mVoiceButtonOnPrimary;
-        final boolean hasSettingsKey = hasSettingsKey(attribute);
-        // Note: This comment is only applied for phone number keyboard layout.
-        // On non-xlarge device, "@integer/key_switch_alpha_symbol" key code is used to switch
-        // between "phone keyboard" and "phone symbols keyboard".  But on xlarge device,
-        // "@integer/key_shift" key code is used for that purpose in order to properly display
-        // "more" and "locked more" key labels.  To achieve these behavior, we should initialize
-        // mSymbolsId and mSymbolsShiftedId to "phone keyboard" and "phone symbols keyboard"
-        // respectively here for xlarge device's layout switching.
-        int xmlId = mode == KeyboardId.MODE_PHONE ? R.xml.kbd_phone : R.xml.kbd_symbols;
-        final String xmlName = res.getResourceEntryName(xmlId);
-        mSymbolsId = new KeyboardId(xmlName, xmlId, colorScheme, locale, orientation, mode,
-                attribute, hasSettingsKey, mVoiceKeyEnabled, hasVoiceKey, false);
-        xmlId = mode == KeyboardId.MODE_PHONE ? R.xml.kbd_phone_symbols : R.xml.kbd_symbols_shift;
-        mSymbolsShiftedId = new KeyboardId(xmlName, xmlId, colorScheme, locale, orientation, mode,
-                attribute, hasSettingsKey, mVoiceKeyEnabled, hasVoiceKey, false);
+    private KeyboardId makeSiblingKeyboardId(KeyboardId base, int alphabet, int phone) {
+        final int xmlId = base.mMode == KeyboardId.MODE_PHONE ? phone : alphabet;
+        final String xmlName = mInputMethodService.getResources().getResourceEntryName(xmlId);
+        return base.cloneWithNewLayout(xmlName, xmlId);
     }
 
     public int getKeyboardMode() {
@@ -280,18 +294,18 @@
     }
 
     public boolean isInputViewShown() {
-        return mInputView != null && mInputView.isShown();
+        return mKeyboardView != null && mKeyboardView.isShown();
     }
 
     public boolean isKeyboardAvailable() {
-        if (mInputView != null)
-            return mInputView.getKeyboard() != null;
+        if (mKeyboardView != null)
+            return mKeyboardView.getKeyboard() != null;
         return false;
     }
 
     public LatinKeyboard getLatinKeyboard() {
-        if (mInputView != null) {
-            final Keyboard keyboard = mInputView.getKeyboard();
+        if (mKeyboardView != null) {
+            final Keyboard keyboard = mKeyboardView.getKeyboard();
             if (keyboard instanceof LatinKeyboard)
                 return (LatinKeyboard)keyboard;
         }
@@ -344,7 +358,7 @@
                 latinKeyboard.setShiftLocked(false);
             }
             if (latinKeyboard.setShifted(shifted)) {
-                mInputView.invalidateAllKeys();
+                mKeyboardView.invalidateAllKeys();
             }
         }
     }
@@ -352,7 +366,7 @@
     private void setShiftLocked(boolean shiftLocked) {
         LatinKeyboard latinKeyboard = getLatinKeyboard();
         if (latinKeyboard != null && latinKeyboard.setShiftLocked(shiftLocked)) {
-            mInputView.invalidateAllKeys();
+            mKeyboardView.invalidateAllKeys();
         }
     }
 
@@ -394,7 +408,7 @@
         LatinKeyboard latinKeyboard = getLatinKeyboard();
         if (latinKeyboard != null) {
             latinKeyboard.setAutomaticTemporaryUpperCase();
-            mInputView.invalidateAllKeys();
+            mKeyboardView.invalidateAllKeys();
         }
     }
 
@@ -489,7 +503,7 @@
                 // To be able to turn off caps lock by "double tap" on shift key, we should ignore
                 // the second tap of the "double tap" from now for a while because we just have
                 // already turned off caps lock above.
-                mInputView.startIgnoringDoubleTap();
+                mKeyboardView.startIgnoringDoubleTap();
             } else if (isShiftedOrShiftLocked() && shiftKeyState.isPressingOnShifted()
                     && !withSliding) {
                 // Shift has been pressed without chording while shifted state.
@@ -559,14 +573,12 @@
             return;
         final LatinKeyboard keyboard;
         if (mCurrentId.equals(mSymbolsId) || !mCurrentId.equals(mSymbolsShiftedId)) {
-            mCurrentId = mSymbolsShiftedId;
-            keyboard = getKeyboard(mCurrentId);
+            keyboard = getKeyboard(mSymbolsShiftedId);
             // Symbol shifted keyboard has an ALT key that has a caps lock style indicator. To
             // enable the indicator, we need to call setShiftLocked(true).
             keyboard.setShiftLocked(true);
         } else {
-            mCurrentId = mSymbolsId;
-            keyboard = getKeyboard(mCurrentId);
+            keyboard = getKeyboard(mSymbolsId);
             // Symbol keyboard has an ALT key that has a caps lock style indicator. To disable the
             // indicator, we need to call setShiftLocked(false).
             keyboard.setShiftLocked(false);
@@ -580,11 +592,11 @@
     }
 
     public boolean isVibrateAndSoundFeedbackRequired() {
-        return mInputView == null || !mInputView.isInSlidingKeyInput();
+        return mKeyboardView == null || !mKeyboardView.isInSlidingKeyInput();
     }
 
     private int getPointerCount() {
-        return mInputView == null ? 0 : mInputView.getPointerCount();
+        return mKeyboardView == null ? 0 : mKeyboardView.getPointerCount();
     }
 
     private void toggleKeyboardMode() {
@@ -597,7 +609,7 @@
     }
 
     public boolean hasDistinctMultitouch() {
-        return mInputView != null && mInputView.hasDistinctMultitouch();
+        return mKeyboardView != null && mKeyboardView.hasDistinctMultitouch();
     }
 
     private static boolean isSpaceCharacter(int c) {
@@ -694,53 +706,58 @@
         }
     }
 
-    public LatinKeyboardView getInputView() {
-        return mInputView;
+    public LatinKeyboardView getKeyboardView() {
+        return mKeyboardView;
     }
 
-    public LatinKeyboardView onCreateInputView() {
-        createInputViewInternal(mLayoutId, true);
-        return mInputView;
+    public View onCreateInputView() {
+        return createInputView(mThemeIndex, true);
     }
 
-    private void createInputViewInternal(int newLayout, boolean forceReset) {
-        int layoutId = newLayout;
-        if (mLayoutId != layoutId || mInputView == null || forceReset) {
-            if (mInputView != null) {
-                mInputView.closing();
-            }
-            if (KEYBOARD_THEMES.length <= layoutId) {
-                layoutId = Integer.valueOf(sConfigDefaultKeyboardThemeId);
-            }
+    // Instance variable only for {@link #createInputView(int, boolean)}.
+    private View mCurrentInputView;
 
-            Utils.GCUtils.getInstance().reset();
-            boolean tryGC = true;
-            for (int i = 0; i < Utils.GCUtils.GC_TRY_LOOP_MAX && tryGC; ++i) {
-                try {
-                    mInputView = (LatinKeyboardView) mInputMethodService.getLayoutInflater(
-                            ).inflate(KEYBOARD_THEMES[layoutId], null);
-                    tryGC = false;
-                } catch (OutOfMemoryError e) {
-                    Log.w(TAG, "load keyboard failed: " + e);
-                    tryGC = Utils.GCUtils.getInstance().tryGCOrWait(
-                            mLayoutId + "," + layoutId, e);
-                } catch (InflateException e) {
-                    Log.w(TAG, "load keyboard failed: " + e);
-                    tryGC = Utils.GCUtils.getInstance().tryGCOrWait(
-                            mLayoutId + "," + layoutId, e);
-                }
-            }
-            mInputView.setOnKeyboardActionListener(mInputMethodService);
-            mLayoutId = layoutId;
+    private View createInputView(final int newThemeIndex, final boolean forceRecreate) {
+        if (mCurrentInputView != null && mThemeIndex == newThemeIndex && !forceRecreate)
+            return mCurrentInputView;
+
+        if (mKeyboardView != null) {
+            mKeyboardView.closing();
         }
+        final int themeIndex = (newThemeIndex < KEYBOARD_THEMES.length) ? newThemeIndex
+                : Integer.valueOf(sConfigDefaultKeyboardThemeId);
+
+        Utils.GCUtils.getInstance().reset();
+        boolean tryGC = true;
+        for (int i = 0; i < Utils.GCUtils.GC_TRY_LOOP_MAX && tryGC; ++i) {
+            try {
+                final Context themeContext = new ContextThemeWrapper(mInputMethodService,
+                        KEYBOARD_THEMES[themeIndex]);
+                mCurrentInputView = LayoutInflater.from(themeContext).inflate(
+                        R.layout.input_view, null);
+                tryGC = false;
+            } catch (OutOfMemoryError e) {
+                Log.w(TAG, "load keyboard failed: " + e);
+                tryGC = Utils.GCUtils.getInstance().tryGCOrWait(mThemeIndex + "," + themeIndex, e);
+            } catch (InflateException e) {
+                Log.w(TAG, "load keyboard failed: " + e);
+                tryGC = Utils.GCUtils.getInstance().tryGCOrWait(mThemeIndex + "," + themeIndex, e);
+            }
+        }
+
+        mKeyboardView = (LatinKeyboardView) mCurrentInputView.findViewById(
+                R.id.latin_keyboard_view);
+        mKeyboardView.setOnKeyboardActionListener(mInputMethodService);
+        mThemeIndex = themeIndex;
+        return mCurrentInputView;
     }
 
-    private void postSetInputView() {
+    private void postSetInputView(final View newInputView) {
         mInputMethodService.mHandler.post(new Runnable() {
             @Override
             public void run() {
-                if (mInputView != null) {
-                    mInputMethodService.setInputView(mInputView);
+                if (newInputView != null) {
+                    mInputMethodService.setInputView(newInputView);
                 }
                 mInputMethodService.updateInputViewShown();
             }
@@ -752,24 +769,22 @@
         if (PREF_KEYBOARD_LAYOUT.equals(key)) {
             final int layoutId = Integer.valueOf(
                     sharedPreferences.getString(key, sConfigDefaultKeyboardThemeId));
-            createInputViewInternal(layoutId, false);
-            postSetInputView();
+            postSetInputView(createInputView(layoutId, false));
         } else if (Settings.PREF_SETTINGS_KEY.equals(key)) {
             mSettingsKeyEnabledInSettings = getSettingsKeyMode(sharedPreferences,
                     mInputMethodService);
-            createInputViewInternal(mLayoutId, true);
-            postSetInputView();
+            postSetInputView(createInputView(mThemeIndex, true));
         }
     }
 
     private int getColorScheme() {
-        return (mInputView != null)
-                ? mInputView.getColorScheme() : KeyboardView.COLOR_SCHEME_WHITE;
+        return (mKeyboardView != null)
+                ? mKeyboardView.getColorScheme() : KeyboardView.COLOR_SCHEME_WHITE;
     }
 
     public void onAutoCorrectionStateChanged(boolean isAutoCorrection) {
         if (isAutoCorrection != mIsAutoCorrectionActive) {
-            LatinKeyboardView keyboardView = getInputView();
+            LatinKeyboardView keyboardView = getKeyboardView();
             mIsAutoCorrectionActive = isAutoCorrection;
             keyboardView.invalidateKey(((LatinKeyboard) keyboardView.getKeyboard())
                     .onAutoCorrectionStateChanged(isAutoCorrection));
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardView.java b/java/src/com/android/inputmethod/keyboard/KeyboardView.java
index c551ed4..f8bce40 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardView.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardView.java
@@ -58,14 +58,22 @@
  * A view that renders a virtual {@link Keyboard}. It handles rendering of keys and detecting key
  * 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
+ * @attr ref R.styleable#KeyboardView_keyLetterStyle
  * @attr ref R.styleable#KeyboardView_keyPreviewLayout
  * @attr ref R.styleable#KeyboardView_keyPreviewOffset
- * @attr ref R.styleable#KeyboardView_labelTextSize
- * @attr ref R.styleable#KeyboardView_keyTextSize
+ * @attr ref R.styleable#KeyboardView_keyPreviewHeight
  * @attr ref R.styleable#KeyboardView_keyTextColor
+ * @attr ref R.styleable#KeyboardView_keyTextColorDisabled
+ * @attr ref R.styleable#KeyboardView_labelTextRatio
  * @attr ref R.styleable#KeyboardView_verticalCorrection
  * @attr ref R.styleable#KeyboardView_popupLayout
+ * @attr ref R.styleable#KeyboardView_shadowColor
+ * @attr ref R.styleable#KeyboardView_shadowRadius
  */
 public class KeyboardView extends View implements PointerTracker.UIProxy {
     private static final String TAG = KeyboardView.class.getSimpleName();
@@ -86,33 +94,36 @@
     private static final int HINT_ICON_VERTICAL_ADJUSTMENT_PIXEL = -1;
 
     // XML attribute
-    private int mKeyLetterSize;
-    private int mKeyTextColor;
-    private int mKeyTextColorDisabled;
-    private Typeface mKeyLetterStyle = Typeface.DEFAULT;
-    private int mLabelTextSize;
-    private int mColorScheme = COLOR_SCHEME_WHITE;
-    private int mShadowColor;
-    private float mShadowRadius;
-    private Drawable mKeyBackground;
-    private float mBackgroundDimAmount;
-    private float mKeyHysteresisDistance;
-    private float mVerticalCorrection;
-    private int mPreviewOffset;
-    private int mPreviewHeight;
-    private int mPopupLayout;
+    private final float mKeyLetterRatio;
+    private final int mKeyTextColor;
+    private final int mKeyTextColorDisabled;
+    private final Typeface mKeyLetterStyle;
+    private final float mLabelTextRatio;
+    private final int mColorScheme;
+    private final int mShadowColor;
+    private final float mShadowRadius;
+    private final Drawable mKeyBackground;
+    private final float mBackgroundDimAmount;
+    private final float mKeyHysteresisDistance;
+    private final float mVerticalCorrection;
+    private final int mPreviewOffset;
+    private final int mPreviewHeight;
+    private final int mPopupLayout;
 
     // Main keyboard
     private Keyboard mKeyboard;
+    private int mKeyLetterSize;
+    private int mLabelTextSize;
 
     // Key preview
     private boolean mInForeground;
     private TextView mPreviewText;
-    private int mPreviewTextSizeLarge;
-    private boolean mShowKeyPreview = true;
-    private int mKeyPreviewDisplayedY;
+    private float mPreviewTextRatio;
+    private int mPreviewTextSize;
+    private boolean mShowKeyPreviewPopup = true;
+    private int mKeyPreviewPopupDisplayedY = -1;
     private final int mDelayBeforePreview;
-    private final int mDelayAfterPreview;
+    private int mDelayAfterPreview;
     private ViewGroup mPreviewPlacer;
     private final int[] mCoordinates = new int[2];
 
@@ -300,74 +311,36 @@
 
         final TypedArray a = context.obtainStyledAttributes(
                 attrs, R.styleable.KeyboardView, defStyle, R.style.KeyboardView);
-        int previewLayout = 0;
-        int keyTextSize = 0;
 
-        int n = a.getIndexCount();
-
-        for (int i = 0; i < n; i++) {
-            int attr = a.getIndex(i);
-
-            switch (attr) {
-            case R.styleable.KeyboardView_keyBackground:
-                mKeyBackground = a.getDrawable(attr);
-                break;
-            case R.styleable.KeyboardView_keyHysteresisDistance:
-                mKeyHysteresisDistance = a.getDimensionPixelOffset(attr, 0);
-                break;
-            case R.styleable.KeyboardView_verticalCorrection:
-                mVerticalCorrection = a.getDimensionPixelOffset(attr, 0);
-                break;
-            case R.styleable.KeyboardView_keyPreviewLayout:
-                previewLayout = a.getResourceId(attr, 0);
-                break;
-            case R.styleable.KeyboardView_keyPreviewOffset:
-                mPreviewOffset = a.getDimensionPixelOffset(attr, 0);
-                break;
-            case R.styleable.KeyboardView_keyPreviewHeight:
-                mPreviewHeight = a.getDimensionPixelSize(attr, 80);
-                break;
-            case R.styleable.KeyboardView_keyLetterSize:
-                mKeyLetterSize = a.getDimensionPixelSize(attr, 18);
-                break;
-            case R.styleable.KeyboardView_keyTextColor:
-                mKeyTextColor = a.getColor(attr, 0xFF000000);
-                break;
-            case R.styleable.KeyboardView_keyTextColorDisabled:
-                mKeyTextColorDisabled = a.getColor(attr, 0xFF000000);
-                break;
-            case R.styleable.KeyboardView_labelTextSize:
-                mLabelTextSize = a.getDimensionPixelSize(attr, 14);
-                break;
-            case R.styleable.KeyboardView_popupLayout:
-                mPopupLayout = a.getResourceId(attr, 0);
-                break;
-            case R.styleable.KeyboardView_shadowColor:
-                mShadowColor = a.getColor(attr, 0);
-                break;
-            case R.styleable.KeyboardView_shadowRadius:
-                mShadowRadius = a.getFloat(attr, 0f);
-                break;
-            // TODO: Use Theme (android.R.styleable.Theme_backgroundDimAmount)
-            case R.styleable.KeyboardView_backgroundDimAmount:
-                mBackgroundDimAmount = a.getFloat(attr, 0.5f);
-                break;
-            case R.styleable.KeyboardView_keyLetterStyle:
-                mKeyLetterStyle = Typeface.defaultFromStyle(a.getInt(attr, Typeface.NORMAL));
-                break;
-            case R.styleable.KeyboardView_colorScheme:
-                mColorScheme = a.getInt(attr, COLOR_SCHEME_WHITE);
-                break;
-            }
-        }
+        mKeyBackground = a.getDrawable(R.styleable.KeyboardView_keyBackground);
+        mKeyHysteresisDistance = a.getDimensionPixelOffset(
+                R.styleable.KeyboardView_keyHysteresisDistance, 0);
+        mVerticalCorrection = a.getDimensionPixelOffset(
+                R.styleable.KeyboardView_verticalCorrection, 0);
+        final int previewLayout = a.getResourceId(R.styleable.KeyboardView_keyPreviewLayout, 0);
+        mPreviewOffset = a.getDimensionPixelOffset(R.styleable.KeyboardView_keyPreviewOffset, 0);
+        mPreviewHeight = a.getDimensionPixelSize(R.styleable.KeyboardView_keyPreviewHeight, 80);
+        mKeyLetterRatio = getRatio(a, R.styleable.KeyboardView_keyLetterRatio);
+        mKeyTextColor = a.getColor(R.styleable.KeyboardView_keyTextColor, 0xFF000000);
+        mKeyTextColorDisabled = a.getColor(
+                R.styleable.KeyboardView_keyTextColorDisabled, 0xFF000000);
+        mLabelTextRatio = getRatio(a, R.styleable.KeyboardView_labelTextRatio);
+        mPopupLayout = a.getResourceId(R.styleable.KeyboardView_popupLayout, 0);
+        mShadowColor = a.getColor(R.styleable.KeyboardView_shadowColor, 0);
+        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);
+        mKeyLetterStyle = Typeface.defaultFromStyle(
+                a.getInt(R.styleable.KeyboardView_keyLetterStyle, Typeface.NORMAL));
+        mColorScheme = a.getInt(R.styleable.KeyboardView_colorScheme, COLOR_SCHEME_WHITE);
 
         final Resources res = getResources();
 
         if (previewLayout != 0) {
             mPreviewText = (TextView) LayoutInflater.from(context).inflate(previewLayout, null);
-            mPreviewTextSizeLarge = (int) res.getDimension(R.dimen.key_preview_text_size_large);
+            mPreviewTextRatio = getRatio(res, R.fraction.key_preview_text_ratio);
         } else {
-            mShowKeyPreview = false;
+            mShowKeyPreviewPopup = false;
         }
         mDelayBeforePreview = res.getInteger(R.integer.config_delay_before_preview);
         mDelayAfterPreview = res.getInteger(R.integer.config_delay_after_preview);
@@ -376,7 +349,6 @@
 
         mPaint = new Paint();
         mPaint.setAntiAlias(true);
-        mPaint.setTextSize(keyTextSize);
         mPaint.setTextAlign(Align.CENTER);
         mPaint.setAlpha(255);
 
@@ -460,6 +432,16 @@
         mKeyRepeatInterval = res.getInteger(R.integer.config_key_repeat_interval);
     }
 
+    // Read fraction value in TypedArray as float.
+    private static float getRatio(TypedArray a, int index) {
+        return a.getFraction(index, 1000, 1000, 1) / 1000.0f;
+    }
+
+    // Read fraction value in resource as float.
+    private static float getRatio(Resources res, int id) {
+        return res.getFraction(id, 1000, 1000) / 1000.0f;
+    }
+
     public void startIgnoringDoubleTap() {
         if (ENABLE_CAPSLOCK_BY_DOUBLETAP)
             mHandler.startIgnoringDoubleTap();
@@ -480,6 +462,12 @@
         return mKeyboardActionListener;
     }
 
+    @Override
+    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+        // TODO: Should notify InputMethodService instead?
+        KeyboardSwitcher.getInstance().onSizeChanged();
+    }
+
     /**
      * Attaches a keyboard to this view. The keyboard can be switched at any time and the
      * view will re-layout itself to accommodate the keyboard.
@@ -506,6 +494,10 @@
         invalidateAllKeys();
         mKeyDetector.setProximityThreshold(keyboard.getMostCommonKeyWidth());
         mPopupPanelCache.clear();
+        final int keyHeight = keyboard.getRowHeight() - keyboard.getVerticalGap();
+        mKeyLetterSize = (int)(keyHeight * mKeyLetterRatio);
+        mLabelTextSize = (int)(keyHeight * mLabelTextRatio);
+        mPreviewTextSize = (int)(keyHeight * mPreviewTextRatio);
     }
 
     /**
@@ -530,19 +522,21 @@
      * Enables or disables the key feedback popup. This is a popup that shows a magnified
      * version of the depressed key. By default the preview is enabled.
      * @param previewEnabled whether or not to enable the key feedback preview
-     * @see #isKeyPreviewEnabled()
+     * @param delay the delay after which the preview is dismissed
+     * @see #isKeyPreviewPopupEnabled()
      */
-    public void setKeyPreviewEnabled(boolean previewEnabled) {
-        mShowKeyPreview = previewEnabled;
+    public void setKeyPreviewPopupEnabled(boolean previewEnabled, int delay) {
+        mShowKeyPreviewPopup = previewEnabled;
+        mDelayAfterPreview = delay;
     }
 
     /**
      * Returns the enabled state of the key feedback preview
      * @return whether or not the key feedback preview is enabled
-     * @see #setKeyPreviewEnabled(boolean)
+     * @see #setKeyPreviewPopupEnabled(boolean, int)
      */
-    public boolean isKeyPreviewEnabled() {
-        return mShowKeyPreview;
+    public boolean isKeyPreviewPopupEnabled() {
+        return mShowKeyPreviewPopup;
     }
 
     public int getColorScheme() {
@@ -865,7 +859,7 @@
 
     @Override
     public void showKeyPreview(int keyIndex, PointerTracker tracker) {
-        if (mShowKeyPreview) {
+        if (mShowKeyPreviewPopup) {
             mHandler.showKeyPreview(mDelayBeforePreview, keyIndex, tracker);
         } else if (mKeyboard.needSpacebarPreview(keyIndex)) {
             // Show key preview (in this case, slide language switcher) without any delay.
@@ -875,13 +869,15 @@
 
     @Override
     public void dismissKeyPreview(PointerTracker tracker) {
-        if (mShowKeyPreview) {
+        if (mShowKeyPreviewPopup) {
             mHandler.cancelShowKeyPreview(tracker);
             mHandler.dismissKeyPreview(mDelayAfterPreview, tracker);
         } else if (mKeyboard.needSpacebarPreview(KeyDetector.NOT_A_KEY)) {
             // Dismiss key preview (in this case, slide language switcher) without any delay.
             mPreviewText.setVisibility(View.INVISIBLE);
         }
+        // Clear key preview display position.
+        mKeyPreviewPopupDisplayedY = -1;
     }
 
     private void addKeyPreview(TextView keyPreview) {
@@ -938,7 +934,7 @@
                 previewText.setTextSize(TypedValue.COMPLEX_UNIT_PX, mKeyLetterSize);
                 previewText.setTypeface(Typeface.DEFAULT_BOLD);
             } else {
-                previewText.setTextSize(TypedValue.COMPLEX_UNIT_PX, mPreviewTextSizeLarge);
+                previewText.setTextSize(TypedValue.COMPLEX_UNIT_PX, mPreviewTextSize);
                 previewText.setTypeface(mKeyLetterStyle);
             }
         } else {
@@ -960,7 +956,7 @@
         final int previewX = keyDrawX - (previewWidth - keyDrawWidth) / 2 + mCoordinates[0];
         final int previewY = key.mY - previewHeight + mCoordinates[1] + mPreviewOffset;
         // Record key preview position to display mini-keyboard later at the same position
-        mKeyPreviewDisplayedY = previewY;
+        mKeyPreviewPopupDisplayedY = previewY;
 
         // Place the key preview.
         // TODO: Adjust position of key previews which touch screen edges
@@ -1078,7 +1074,7 @@
         });
 
         final Keyboard keyboard = new MiniKeyboardBuilder(this, mKeyboard.getPopupKeyboardResId(),
-                parentKey).build();
+                parentKey, mKeyboard).build();
         miniKeyboardView.setKeyboard(keyboard);
 
         container.measure(MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.AT_MOST),
@@ -1111,7 +1107,7 @@
             mPopupWindow.setClippingEnabled(false);
         }
         mPopupMiniKeyboardPanel = popupPanel;
-        popupPanel.showPanel(this, parentKey, tracker, mKeyPreviewDisplayedY, mPopupWindow);
+        popupPanel.showPanel(this, parentKey, tracker, mKeyPreviewPopupDisplayedY, mPopupWindow);
 
         invalidateAllKeys();
         return true;
diff --git a/java/src/com/android/inputmethod/keyboard/LatinKeyboard.java b/java/src/com/android/inputmethod/keyboard/LatinKeyboard.java
index c279769..fe27ab4 100644
--- a/java/src/com/android/inputmethod/keyboard/LatinKeyboard.java
+++ b/java/src/com/android/inputmethod/keyboard/LatinKeyboard.java
@@ -78,7 +78,7 @@
     // of the most common key width of this keyboard).
     private static final int SPACEBAR_DRAG_WIDTH = 3;
     // Minimum width of space key preview (proportional to keyboard width).
-    private static final float SPACEBAR_POPUP_MIN_RATIO = 0.4f;
+    private static final float SPACEBAR_POPUP_MIN_RATIO = 0.5f;
     // Height in space key the language name will be drawn. (proportional to space key height)
     public static final float SPACEBAR_LANGUAGE_BASELINE = 0.6f;
     // If the full language name needs to be smaller than this value to be drawn on space key,
@@ -88,8 +88,8 @@
     private static final String SMALL_TEXT_SIZE_OF_LANGUAGE_ON_SPACEBAR = "small";
     private static final String MEDIUM_TEXT_SIZE_OF_LANGUAGE_ON_SPACEBAR = "medium";
 
-    public LatinKeyboard(Context context, KeyboardId id) {
-        super(context, id.getXmlId(), id);
+    public LatinKeyboard(Context context, KeyboardId id, int width) {
+        super(context, id.getXmlId(), id, width);
         final Resources res = context.getResources();
         mContext = context;
 
diff --git a/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java b/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java
index c98076f..185f1f8 100644
--- a/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java
+++ b/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java
@@ -16,10 +16,6 @@
 
 package com.android.inputmethod.keyboard;
 
-import com.android.inputmethod.deprecated.VoiceProxy;
-import com.android.inputmethod.latin.LatinImeLogger;
-import com.android.inputmethod.latin.Utils;
-
 import android.content.Context;
 import android.graphics.Canvas;
 import android.text.TextUtils;
@@ -27,6 +23,10 @@
 import android.util.Log;
 import android.view.MotionEvent;
 
+import com.android.inputmethod.deprecated.VoiceProxy;
+import com.android.inputmethod.latin.LatinImeLogger;
+import com.android.inputmethod.latin.Utils;
+
 // TODO: We should remove this class
 public class LatinKeyboardView extends KeyboardView {
     private static final String TAG = LatinKeyboardView.class.getSimpleName();
@@ -47,7 +47,7 @@
     private int mLastY;
 
     public LatinKeyboardView(Context context, AttributeSet attrs) {
-        this(context, attrs, 0);
+        super(context, attrs);
     }
 
     public LatinKeyboardView(Context context, AttributeSet attrs, int defStyle) {
@@ -55,14 +55,14 @@
     }
 
     @Override
-    public void setKeyPreviewEnabled(boolean previewEnabled) {
+    public void setKeyPreviewPopupEnabled(boolean previewEnabled, int delay) {
         LatinKeyboard latinKeyboard = getLatinKeyboard();
         if (latinKeyboard != null
                 && (latinKeyboard.isPhoneKeyboard() || latinKeyboard.isNumberKeyboard())) {
             // Phone and number keyboard never shows popup preview (except language switch).
-            super.setKeyPreviewEnabled(false);
+            super.setKeyPreviewPopupEnabled(false, delay);
         } else {
-            super.setKeyPreviewEnabled(previewEnabled);
+            super.setKeyPreviewPopupEnabled(previewEnabled, delay);
         }
     }
 
@@ -173,7 +173,8 @@
                 if (!mDroppingEvents) {
                     mDroppingEvents = true;
                     // Send an up event
-                    MotionEvent translated = MotionEvent.obtain(me.getEventTime(), me.getEventTime(),
+                    MotionEvent translated = MotionEvent.obtain(
+                            me.getEventTime(), me.getEventTime(),
                             MotionEvent.ACTION_UP,
                             mLastX, mLastY, me.getMetaState());
                     super.onTouchEvent(translated);
diff --git a/java/src/com/android/inputmethod/keyboard/MiniKeyboard.java b/java/src/com/android/inputmethod/keyboard/MiniKeyboard.java
index 5dde15e..2d6766f 100644
--- a/java/src/com/android/inputmethod/keyboard/MiniKeyboard.java
+++ b/java/src/com/android/inputmethod/keyboard/MiniKeyboard.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011 Google Inc.
+ * 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
@@ -23,8 +23,8 @@
 public class MiniKeyboard extends Keyboard {
     private int mDefaultKeyCoordX;
 
-    public MiniKeyboard(Context context, int xmlLayoutResId, KeyboardId id) {
-        super(context, xmlLayoutResId, id);
+    public MiniKeyboard(Context context, int xmlLayoutResId, Keyboard parentKeyboard) {
+        super(context, xmlLayoutResId, null, parentKeyboard.getMinWidth());
     }
 
     public void setDefaultCoordX(int pos) {
diff --git a/java/src/com/android/inputmethod/keyboard/MiniKeyboardBuilder.java b/java/src/com/android/inputmethod/keyboard/MiniKeyboardBuilder.java
index e540fa1..6e93912 100644
--- a/java/src/com/android/inputmethod/keyboard/MiniKeyboardBuilder.java
+++ b/java/src/com/android/inputmethod/keyboard/MiniKeyboardBuilder.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 Google Inc.
+ * 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
@@ -181,22 +181,25 @@
         }
     }
 
-    public MiniKeyboardBuilder(KeyboardView view, int layoutTemplateResId, Key parentKey) {
+    public MiniKeyboardBuilder(KeyboardView view, int layoutTemplateResId, Key parentKey,
+            Keyboard parentKeyboard) {
         final Context context = view.getContext();
         mRes = context.getResources();
-        final MiniKeyboard keyboard = new MiniKeyboard(context, layoutTemplateResId, null);
+        final MiniKeyboard keyboard = new MiniKeyboard(
+                context, layoutTemplateResId, parentKeyboard);
         mKeyboard = keyboard;
         mPopupCharacters = parentKey.mPopupCharacters;
 
         final int keyWidth = getMaxKeyWidth(view, mPopupCharacters, keyboard.getKeyWidth());
         final MiniKeyboardLayoutParams params = new MiniKeyboardLayoutParams(
                 mPopupCharacters.length, parentKey.mMaxPopupColumn,
-                keyWidth, keyboard.getRowHeight(),
+                keyWidth, parentKeyboard.getRowHeight(),
                 parentKey.mX + (parentKey.mWidth + parentKey.mGap) / 2 - keyWidth / 2,
                 view.getMeasuredWidth());
         mParams = params;
 
-        keyboard.setHeight(params.mNumRows * params.mRowHeight - keyboard.getVerticalGap());
+        keyboard.setRowHeight(params.mRowHeight);
+        keyboard.setHeight(params.mNumRows * params.mRowHeight);
         keyboard.setMinWidth(params.mNumColumns * params.mKeyWidth);
         keyboard.setDefaultCoordX(params.getDefaultKeyCoordX() + params.mKeyWidth / 2);
     }
@@ -235,7 +238,7 @@
             final CharSequence label = mPopupCharacters[n];
             final int row = n / params.mNumColumns;
             final Key key = new Key(mRes, keyboard, label, params.getX(n, row), params.getY(row),
-                    params.mKeyWidth, params.getRowFlags(row));
+                    params.mKeyWidth, params.mRowHeight, params.getRowFlags(row));
             keys.add(key);
         }
         return keyboard;
diff --git a/java/src/com/android/inputmethod/keyboard/MiniKeyboardKeyDetector.java b/java/src/com/android/inputmethod/keyboard/MiniKeyboardKeyDetector.java
index c4459f6..cc5c3bb 100644
--- a/java/src/com/android/inputmethod/keyboard/MiniKeyboardKeyDetector.java
+++ b/java/src/com/android/inputmethod/keyboard/MiniKeyboardKeyDetector.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 Google Inc.
+ * 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
diff --git a/java/src/com/android/inputmethod/keyboard/ModifierKeyState.java b/java/src/com/android/inputmethod/keyboard/ModifierKeyState.java
index f215db8..ebbc79a 100644
--- a/java/src/com/android/inputmethod/keyboard/ModifierKeyState.java
+++ b/java/src/com/android/inputmethod/keyboard/ModifierKeyState.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 Google Inc.
+ * 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
diff --git a/java/src/com/android/inputmethod/keyboard/PointerTracker.java b/java/src/com/android/inputmethod/keyboard/PointerTracker.java
index 953d487..6b4e946 100644
--- a/java/src/com/android/inputmethod/keyboard/PointerTracker.java
+++ b/java/src/com/android/inputmethod/keyboard/PointerTracker.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 Google Inc.
+ * 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
@@ -633,8 +633,6 @@
 
     private void startLongPressTimer(int keyIndex) {
         Key key = getKey(keyIndex);
-        if (!key.mEnabled)
-            return;
         if (key.mCode == Keyboard.CODE_SHIFT) {
             mHandler.startLongPressShiftTimer(mLongPressShiftKeyTimeout, keyIndex, this);
         } else if (key.mManualTemporaryUpperCaseCode != Keyboard.CODE_DUMMY
diff --git a/java/src/com/android/inputmethod/keyboard/PointerTrackerKeyState.java b/java/src/com/android/inputmethod/keyboard/PointerTrackerKeyState.java
index b3ed1e2..eecbb26 100644
--- a/java/src/com/android/inputmethod/keyboard/PointerTrackerKeyState.java
+++ b/java/src/com/android/inputmethod/keyboard/PointerTrackerKeyState.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 Google Inc.
+ * 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
diff --git a/java/src/com/android/inputmethod/keyboard/PointerTrackerQueue.java b/java/src/com/android/inputmethod/keyboard/PointerTrackerQueue.java
index 68de8df..9e287c6 100644
--- a/java/src/com/android/inputmethod/keyboard/PointerTrackerQueue.java
+++ b/java/src/com/android/inputmethod/keyboard/PointerTrackerQueue.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 Google Inc.
+ * 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
diff --git a/java/src/com/android/inputmethod/keyboard/PopupCharactersParser.java b/java/src/com/android/inputmethod/keyboard/PopupCharactersParser.java
index 32c2580..ff78ee5 100644
--- a/java/src/com/android/inputmethod/keyboard/PopupCharactersParser.java
+++ b/java/src/com/android/inputmethod/keyboard/PopupCharactersParser.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 Google Inc.
+ * 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
diff --git a/java/src/com/android/inputmethod/keyboard/PopupMiniKeyboardView.java b/java/src/com/android/inputmethod/keyboard/PopupMiniKeyboardView.java
index 12031f1..60d87f7 100644
--- a/java/src/com/android/inputmethod/keyboard/PopupMiniKeyboardView.java
+++ b/java/src/com/android/inputmethod/keyboard/PopupMiniKeyboardView.java
@@ -16,8 +16,6 @@
 
 package com.android.inputmethod.keyboard;
 
-import com.android.inputmethod.latin.R;
-
 import android.content.Context;
 import android.content.res.Resources;
 import android.os.SystemClock;
@@ -27,6 +25,8 @@
 import android.view.View;
 import android.widget.PopupWindow;
 
+import com.android.inputmethod.latin.R;
+
 /**
  * A view that renders a virtual {@link MiniKeyboard}. It handles rendering of keys and detecting
  * key presses and touch movements.
@@ -41,7 +41,7 @@
     private long mDownTime;
 
     public PopupMiniKeyboardView(Context context, AttributeSet attrs) {
-        this(context, attrs, R.attr.keyboardViewStyle);
+        this(context, attrs, R.attr.popupMiniKeyboardViewStyle);
     }
 
     public PopupMiniKeyboardView(Context context, AttributeSet attrs, int defStyle) {
@@ -55,13 +55,14 @@
                 R.dimen.mini_keyboard_slide_allowance));
         // Remove gesture detector on mini-keyboard
         mGestureDetector = null;
-        setKeyPreviewEnabled(false);
+        setKeyPreviewPopupEnabled(false, 0);
     }
 
     @Override
-    public void setKeyPreviewEnabled(boolean previewEnabled) {
-        // Mini keyboard needs no pop-up key preview displayed.
-        super.setKeyPreviewEnabled(false);
+    public void setKeyPreviewPopupEnabled(boolean previewEnabled, int delay) {
+        // Mini keyboard needs no pop-up key preview displayed, so we pass always false with a
+        // delay of 0. The delay does not matter actually since the popup is not shown anyway.
+        super.setKeyPreviewPopupEnabled(false, 0);
     }
 
     @Override
@@ -75,15 +76,17 @@
         final int pointX = (mConfigShowMiniKeyboardAtTouchedPoint) ? tracker.getLastX()
                 : parentKey.mX + parentKey.mWidth / 2;
         final int pointY = parentKey.mY;
-        final int miniKeyboardX = pointX - miniKeyboard.getDefaultCoordX()
-                - container.getPaddingLeft()
-                + parentKeyboardView.getPaddingLeft() + mCoordinates[0];
+        final int miniKeyboardLeft = pointX - miniKeyboard.getDefaultCoordX()
+                + parentKeyboardView.getPaddingLeft();
+        final int miniKeyboardX = Math.max(0, Math.min(miniKeyboardLeft,
+                parentKeyboardView.getWidth() - miniKeyboard.getMinWidth()))
+                - container.getPaddingLeft() + mCoordinates[0];
         final int miniKeyboardY = pointY - parentKeyboard.getVerticalGap()
                 - (container.getMeasuredHeight() - container.getPaddingBottom())
                 + parentKeyboardView.getPaddingTop() + mCoordinates[1];
         final int x = miniKeyboardX;
-        final int y = parentKeyboardView.isKeyPreviewEnabled() && miniKeyboard.isOneRowKeyboard()
-                ? keyPreviewY : miniKeyboardY;
+        final int y = parentKeyboardView.isKeyPreviewPopupEnabled() &&
+                miniKeyboard.isOneRowKeyboard() && keyPreviewY >= 0 ? keyPreviewY : miniKeyboardY;
 
         if (miniKeyboard.setShifted(parentKeyboard.isShiftedOrShiftLocked())) {
             invalidateAllKeys();
diff --git a/java/src/com/android/inputmethod/keyboard/ProximityInfo.java b/java/src/com/android/inputmethod/keyboard/ProximityInfo.java
index 80d6de9..33acc69 100644
--- a/java/src/com/android/inputmethod/keyboard/ProximityInfo.java
+++ b/java/src/com/android/inputmethod/keyboard/ProximityInfo.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011 Google Inc.
+ * 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
diff --git a/java/src/com/android/inputmethod/keyboard/Row.java b/java/src/com/android/inputmethod/keyboard/Row.java
index 3618c04..40d7e14 100644
--- a/java/src/com/android/inputmethod/keyboard/Row.java
+++ b/java/src/com/android/inputmethod/keyboard/Row.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 Google Inc.
+ * 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
diff --git a/java/src/com/android/inputmethod/keyboard/ShiftKeyState.java b/java/src/com/android/inputmethod/keyboard/ShiftKeyState.java
index 9229208..ba15624 100644
--- a/java/src/com/android/inputmethod/keyboard/ShiftKeyState.java
+++ b/java/src/com/android/inputmethod/keyboard/ShiftKeyState.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 Google Inc.
+ * 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
diff --git a/java/src/com/android/inputmethod/keyboard/SlidingLocaleDrawable.java b/java/src/com/android/inputmethod/keyboard/SlidingLocaleDrawable.java
index b279c1c..5cf31cb 100644
--- a/java/src/com/android/inputmethod/keyboard/SlidingLocaleDrawable.java
+++ b/java/src/com/android/inputmethod/keyboard/SlidingLocaleDrawable.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 Google Inc.
+ * 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
@@ -38,7 +38,7 @@
  * movement on the spacebar.
  */
 public class SlidingLocaleDrawable extends Drawable {
-
+    private static final int SLIDE_SPEED_MULTIPLIER_RATIO = 150;
     private final Context mContext;
     private final Resources mRes;
     private final int mWidth;
@@ -90,7 +90,7 @@
             mCurrentLanguage = null;
             return;
         }
-        mDiff = diff;
+        mDiff = Math.max(diff, diff * SLIDE_SPEED_MULTIPLIER_RATIO / 100);
         if (mDiff > mWidth) mDiff = mWidth;
         if (mDiff < -mWidth) mDiff = -mWidth;
         if (Math.abs(mDiff) > mThreshold) mHitThreshold = true;
diff --git a/java/src/com/android/inputmethod/keyboard/SwipeTracker.java b/java/src/com/android/inputmethod/keyboard/SwipeTracker.java
index 730cdc3..975b13b 100644
--- a/java/src/com/android/inputmethod/keyboard/SwipeTracker.java
+++ b/java/src/com/android/inputmethod/keyboard/SwipeTracker.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 Google Inc.
+ * 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
diff --git a/java/src/com/android/inputmethod/latin/AutoDictionary.java b/java/src/com/android/inputmethod/latin/AutoDictionary.java
index 307b81d..460930f 100644
--- a/java/src/com/android/inputmethod/latin/AutoDictionary.java
+++ b/java/src/com/android/inputmethod/latin/AutoDictionary.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 Google Inc.
+ * 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
@@ -41,13 +41,8 @@
     static final int FREQUENCY_FOR_PICKED = 3;
     // Weight added to a user typing a new word that doesn't get corrected (or is reverted)
     static final int FREQUENCY_FOR_TYPED = 1;
-    // A word that is frequently typed and gets promoted to the user dictionary, uses this
-    // frequency.
-    static final int FREQUENCY_FOR_AUTO_ADD = 250;
     // If the user touches a typed word 2 times or more, it will become valid.
     private static final int VALIDITY_THRESHOLD = 2 * FREQUENCY_FOR_PICKED;
-    // If the user touches a typed word 4 times or more, it will be added to the user dict.
-    private static final int PROMOTION_THRESHOLD = 4 * FREQUENCY_FOR_PICKED;
 
     private LatinIME mIme;
     // Locale for which this auto dictionary is storing words
@@ -151,11 +146,6 @@
         freq = freq < 0 ? addFrequency : freq + addFrequency;
         super.addWord(word, freq);
 
-        if (freq >= PROMOTION_THRESHOLD) {
-            mIme.promoteToUserDictionary(word, FREQUENCY_FOR_AUTO_ADD);
-            freq = 0;
-        }
-
         synchronized (mPendingWritesLock) {
             // Write a null frequency if it is to be deleted from the db
             mPendingWrites.put(word, freq == 0 ? null : new Integer(freq));
diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionary.java b/java/src/com/android/inputmethod/latin/BinaryDictionary.java
index d95fb96..9748d60 100644
--- a/java/src/com/android/inputmethod/latin/BinaryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/BinaryDictionary.java
@@ -196,8 +196,9 @@
         Arrays.fill(outputChars, (char) 0);
         Arrays.fill(scores, 0);
 
+        final int proximityInfo = keyboard == null ? 0 : keyboard.getProximityInfo();
         return getSuggestionsNative(
-                mNativeDict, keyboard.getProximityInfo(),
+                mNativeDict, proximityInfo,
                 codes.getXCoordinates(), codes.getYCoordinates(), mInputCodes, codesSize,
                 mFlags, outputChars, scores);
     }
diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionaryGetter.java b/java/src/com/android/inputmethod/latin/BinaryDictionaryGetter.java
index 562580d..7ce9292 100644
--- a/java/src/com/android/inputmethod/latin/BinaryDictionaryGetter.java
+++ b/java/src/com/android/inputmethod/latin/BinaryDictionaryGetter.java
@@ -78,16 +78,20 @@
         } else {
             try {
                 // If that was no-go, try to find a publicly exported dictionary.
-                return BinaryDictionaryFileDumper.getDictSetFromContentProvider(locale, context);
+                List<AssetFileAddress> listFromContentProvider =
+                        BinaryDictionaryFileDumper.getDictSetFromContentProvider(locale, context);
+                if (null != listFromContentProvider) {
+                    return listFromContentProvider;
+                }
+                // If the list is null, fall through and return the fallback
             } catch (FileNotFoundException e) {
                 Log.e(TAG, "Unable to create dictionary file from provider for locale "
                         + locale.toString() + ": falling back to internal dictionary");
-                return Arrays.asList(loadFallbackResource(context, fallbackResId));
             } catch (IOException e) {
                 Log.e(TAG, "Unable to read source data for locale "
                         + locale.toString() + ": falling back to internal dictionary");
-                return Arrays.asList(loadFallbackResource(context, fallbackResId));
             }
+            return Arrays.asList(loadFallbackResource(context, fallbackResId));
         }
     }
 }
diff --git a/java/src/com/android/inputmethod/latin/CandidateView.java b/java/src/com/android/inputmethod/latin/CandidateView.java
index abdf30e..fe3c72f 100644
--- a/java/src/com/android/inputmethod/latin/CandidateView.java
+++ b/java/src/com/android/inputmethod/latin/CandidateView.java
@@ -16,8 +16,6 @@
 
 package com.android.inputmethod.latin;
 
-import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
-
 import android.content.Context;
 import android.content.res.Resources;
 import android.graphics.Color;
@@ -40,11 +38,12 @@
 import android.view.View.OnClickListener;
 import android.view.View.OnLongClickListener;
 import android.view.ViewGroup;
-import android.widget.ImageView;
 import android.widget.LinearLayout;
 import android.widget.PopupWindow;
 import android.widget.TextView;
 
+import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
+
 import java.util.ArrayList;
 import java.util.List;
 
@@ -57,6 +56,7 @@
     private static final boolean DBG = LatinImeLogger.sDBG;
 
     private final ArrayList<View> mWords = new ArrayList<View>();
+    private final ArrayList<View> mDividers = new ArrayList<View>();
     private final boolean mConfigCandidateHighlightFontColorEnabled;
     private final CharacterStyle mInvertedForegroundColorSpan;
     private final CharacterStyle mInvertedBackgroundColorSpan;
@@ -148,10 +148,11 @@
             tv.setOnClickListener(this);
             if (i == 0)
                 tv.setOnLongClickListener(this);
-            ImageView divider = (ImageView)v.findViewById(R.id.candidate_divider);
-            // Do not display divider of first candidate.
-            divider.setVisibility(i == 0 ? INVISIBLE : VISIBLE);
             mWords.add(v);
+            if (i > 0) {
+                View divider = inflater.inflate(R.layout.candidate_divider, null);
+                mDividers.add(divider);
+            }
         }
 
         scrollTo(0, getScrollY());
@@ -237,6 +238,8 @@
             } else {
                 dv.setVisibility(GONE);
             }
+            if (i > 0)
+                addView(mDividers.get(i - 1));
             addView(v);
         }
 
@@ -275,7 +278,7 @@
         setSuggestions(builder.build());
         mShowingAddToDictionary = true;
         // Disable R.string.hint_add_to_dictionary button
-        TextView tv = (TextView)getChildAt(1).findViewById(R.id.candidate_word);
+        TextView tv = (TextView)mWords.get(1).findViewById(R.id.candidate_word);
         tv.setClickable(false);
     }
 
@@ -308,7 +311,7 @@
         previewText.setText(word);
         previewText.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
                 MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
-        View v = getChildAt(index);
+        View v = mWords.get(index);
         final int[] offsetInWindow = new int[2];
         v.getLocationInWindow(offsetInWindow);
         final int posX = offsetInWindow[0];
diff --git a/java/src/com/android/inputmethod/latin/DictionaryFactory.java b/java/src/com/android/inputmethod/latin/DictionaryFactory.java
index 605676d..bba3318 100644
--- a/java/src/com/android/inputmethod/latin/DictionaryFactory.java
+++ b/java/src/com/android/inputmethod/latin/DictionaryFactory.java
@@ -142,6 +142,25 @@
         return hasDictionary;
     }
 
+    // TODO: Do not use the size of the dictionary as an unique dictionary ID.
+    public static Long getDictionaryId(Context context, Locale locale) {
+        final Resources res = context.getResources();
+        final Locale saveLocale = Utils.setSystemLocale(res, locale);
+
+        final int resourceId = Utils.getMainDictionaryResourceId(res);
+        final AssetFileDescriptor afd = res.openRawResourceFd(resourceId);
+        final Long size = (afd != null && afd.getLength() > PLACEHOLDER_LENGTH)
+                ? afd.getLength()
+                : null;
+        try {
+            if (null != afd) afd.close();
+        } catch (java.io.IOException e) {
+        }
+
+        Utils.setSystemLocale(res, saveLocale);
+        return size;
+    }
+
     // TODO: Find the Right Way to find out whether the resource is a placeholder or not.
     // Suggestion : strip the locale, open the placeholder file and store its offset.
     // Upon opening the file, if it's the same offset, then it's the placeholder.
diff --git a/java/src/com/android/inputmethod/latin/EditingUtils.java b/java/src/com/android/inputmethod/latin/EditingUtils.java
index 39e7e40..e56aa69 100644
--- a/java/src/com/android/inputmethod/latin/EditingUtils.java
+++ b/java/src/com/android/inputmethod/latin/EditingUtils.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2009 Google Inc.
+ * Copyright (C) 2009 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
diff --git a/java/src/com/android/inputmethod/latin/ExpandableDictionary.java b/java/src/com/android/inputmethod/latin/ExpandableDictionary.java
index 26391fe..97a4a18 100644
--- a/java/src/com/android/inputmethod/latin/ExpandableDictionary.java
+++ b/java/src/com/android/inputmethod/latin/ExpandableDictionary.java
@@ -229,6 +229,7 @@
      * Returns the word's frequency or -1 if not found
      */
     protected int getWordFrequency(CharSequence word) {
+        // Case-sensitive search
         Node node = searchNode(mRoots, word, 0, word.length());
         return (node == null) ? -1 : node.mFrequency;
     }
@@ -366,12 +367,16 @@
 
     /**
      * Adds bigrams to the in-memory trie structure that is being used to retrieve any word
-     * @param frequency frequency for this bigrams
-     * @param addFrequency if true, it adds to current frequency
+     * @param frequency frequency for this bigram
+     * @param addFrequency if true, it adds to current frequency, else it overwrites the old value
      * @return returns the final frequency
      */
     private int addOrSetBigram(String word1, String word2, int frequency, boolean addFrequency) {
-        Node firstWord = searchWord(mRoots, word1, 0, null);
+        // We don't want results to be different according to case of the looked up left hand side
+        // word. We do want however to return the correct case for the right hand side.
+        // So we want to squash the case of the left hand side, and preserve that of the right
+        // hand side word.
+        Node firstWord = searchWord(mRoots, word1.toLowerCase(), 0, null);
         Node secondWord = searchWord(mRoots, word2, 0, null);
         LinkedList<NextWord> bigram = firstWord.mNGrams;
         if (bigram == null || bigram.size() == 0) {
@@ -437,8 +442,12 @@
         }
     }
 
-    private void runReverseLookUp(final CharSequence previousWord, final WordCallback callback) {
-        Node prevWord = searchNode(mRoots, previousWord, 0, previousWord.length());
+    private void runBigramReverseLookUp(final CharSequence previousWord,
+            final WordCallback callback) {
+        // Search for the lowercase version of the word only, because that's where bigrams
+        // store their sons.
+        Node prevWord = searchNode(mRoots, previousWord.toString().toLowerCase(), 0,
+                previousWord.length());
         if (prevWord != null && prevWord.mNGrams != null) {
             reverseLookUp(prevWord.mNGrams, callback);
         }
@@ -448,7 +457,7 @@
     public void getBigrams(final WordComposer codes, final CharSequence previousWord,
             final WordCallback callback) {
         if (!reloadDictionaryIfRequired()) {
-            runReverseLookUp(previousWord, callback);
+            runBigramReverseLookUp(previousWord, callback);
         }
     }
 
@@ -494,14 +503,20 @@
     }
 
     /**
-     * Search for the terminal node of the word
+     * Recursively search for the terminal node of the word.
+     *
+     * One iteration takes the full word to search for and the current index of the recursion.
+     *
+     * @param children the node of the trie to search under.
+     * @param word the word to search for. Only read [offset..length] so there may be trailing chars
+     * @param offset the index in {@code word} this recursion should operate on.
+     * @param length the length of the input word.
      * @return Returns the terminal node of the word if the word exists
      */
     private Node searchNode(final NodeArray children, final CharSequence word, final int offset,
             final int length) {
-        // TODO Consider combining with addWordRec
         final int count = children.mLength;
-        char currentChar = word.charAt(offset);
+        final char currentChar = word.charAt(offset);
         for (int j = 0; j < count; j++) {
             final Node node = children.mData[j];
             if (node.mCode == currentChar) {
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index 8b130ae..a4a04ff 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -16,21 +16,6 @@
 
 package com.android.inputmethod.latin;
 
-import com.android.inputmethod.compat.CompatUtils;
-import com.android.inputmethod.compat.EditorInfoCompatUtils;
-import com.android.inputmethod.compat.InputConnectionCompatUtils;
-import com.android.inputmethod.compat.InputMethodManagerCompatWrapper;
-import com.android.inputmethod.compat.InputMethodServiceCompatWrapper;
-import com.android.inputmethod.compat.InputTypeCompatUtils;
-import com.android.inputmethod.deprecated.LanguageSwitcherProxy;
-import com.android.inputmethod.deprecated.VoiceProxy;
-import com.android.inputmethod.keyboard.Keyboard;
-import com.android.inputmethod.keyboard.KeyboardActionListener;
-import com.android.inputmethod.keyboard.KeyboardSwitcher;
-import com.android.inputmethod.keyboard.KeyboardView;
-import com.android.inputmethod.keyboard.LatinKeyboard;
-import com.android.inputmethod.keyboard.LatinKeyboardView;
-
 import android.app.AlertDialog;
 import android.content.BroadcastReceiver;
 import android.content.Context;
@@ -58,7 +43,6 @@
 import android.util.Printer;
 import android.view.HapticFeedbackConstants;
 import android.view.KeyEvent;
-import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.ViewParent;
@@ -68,7 +52,23 @@
 import android.view.inputmethod.EditorInfo;
 import android.view.inputmethod.ExtractedText;
 import android.view.inputmethod.InputConnection;
-import android.widget.LinearLayout;
+
+import com.android.inputmethod.compat.CompatUtils;
+import com.android.inputmethod.compat.EditorInfoCompatUtils;
+import com.android.inputmethod.compat.InputConnectionCompatUtils;
+import com.android.inputmethod.compat.InputMethodManagerCompatWrapper;
+import com.android.inputmethod.compat.InputMethodServiceCompatWrapper;
+import com.android.inputmethod.compat.InputTypeCompatUtils;
+import com.android.inputmethod.compat.SuggestionSpanUtils;
+import com.android.inputmethod.deprecated.LanguageSwitcherProxy;
+import com.android.inputmethod.deprecated.VoiceProxy;
+import com.android.inputmethod.deprecated.recorrection.Recorrection;
+import com.android.inputmethod.keyboard.Keyboard;
+import com.android.inputmethod.keyboard.KeyboardActionListener;
+import com.android.inputmethod.keyboard.KeyboardSwitcher;
+import com.android.inputmethod.keyboard.KeyboardView;
+import com.android.inputmethod.keyboard.LatinKeyboard;
+import com.android.inputmethod.keyboard.LatinKeyboardView;
 
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
@@ -81,7 +81,7 @@
     private static final String TAG = LatinIME.class.getSimpleName();
     private static final boolean PERF_DEBUG = false;
     private static final boolean TRACE = false;
-    private static boolean DEBUG = LatinImeLogger.sDBG;
+    private static boolean DEBUG;
 
     /**
      * The private IME option used to indicate that no microphone should be
@@ -216,15 +216,15 @@
         @Override
         public void handleMessage(Message msg) {
             final KeyboardSwitcher switcher = mKeyboardSwitcher;
-            final LatinKeyboardView inputView = switcher.getInputView();
+            final LatinKeyboardView inputView = switcher.getKeyboardView();
             switch (msg.what) {
             case MSG_UPDATE_SUGGESTIONS:
                 updateSuggestions();
                 break;
             case MSG_UPDATE_OLD_SUGGESTIONS:
-                mRecorrection.setRecorrectionSuggestions(mVoiceProxy, mCandidateView, mSuggest,
-                        mKeyboardSwitcher, mWord, mHasUncommittedTypedChars, mLastSelectionStart,
-                        mLastSelectionEnd, mSettingsValues.mWordSeparators);
+                mRecorrection.fetchAndDisplayRecorrectionSuggestions(mVoiceProxy, mCandidateView,
+                        mSuggest, mKeyboardSwitcher, mWord, mHasUncommittedTypedChars,
+                        mLastSelectionStart, mLastSelectionEnd, mSettingsValues.mWordSeparators);
                 break;
             case MSG_UPDATE_SHIFT_STATE:
                 switcher.updateShiftState();
@@ -306,7 +306,7 @@
         public void startDisplayLanguageOnSpacebar(boolean localeChanged) {
             removeMessages(MSG_FADEOUT_LANGUAGE_ON_SPACEBAR);
             removeMessages(MSG_DISMISS_LANGUAGE_ON_SPACEBAR);
-            final LatinKeyboardView inputView = mKeyboardSwitcher.getInputView();
+            final LatinKeyboardView inputView = mKeyboardSwitcher.getKeyboardView();
             if (inputView != null) {
                 final LatinKeyboard keyboard = mKeyboardSwitcher.getLatinKeyboard();
                 // The language is always displayed when the delay is negative.
@@ -357,6 +357,7 @@
         mSubtypeSwitcher = SubtypeSwitcher.getInstance();
         mKeyboardSwitcher = KeyboardSwitcher.getInstance();
         mRecorrection = Recorrection.getInstance();
+        DEBUG = LatinImeLogger.sDBG;
 
         loadSettings();
 
@@ -405,7 +406,7 @@
 
     private void initSuggest() {
         final String localeStr = mSubtypeSwitcher.getInputLocaleStr();
-        final Locale keyboardLocale = new Locale(localeStr);
+        final Locale keyboardLocale = Utils.constructLocaleFromString(localeStr);
 
         final Resources res = mResources;
         final Locale savedLocale = Utils.setSystemLocale(res, keyboardLocale);
@@ -439,7 +440,7 @@
 
     /* package private */ void resetSuggestMainDict() {
         final String localeStr = mSubtypeSwitcher.getInputLocaleStr();
-        final Locale keyboardLocale = new Locale(localeStr);
+        final Locale keyboardLocale = Utils.constructLocaleFromString(localeStr);
         int mainDicResId = Utils.getMainDictionaryResourceId(mResources);
         mSuggest.resetMainDict(this, mainDicResId, keyboardLocale);
     }
@@ -486,24 +487,28 @@
     }
 
     @Override
-    public View onCreateCandidatesView() {
-        LayoutInflater inflater = getLayoutInflater();
-        LinearLayout container = (LinearLayout)inflater.inflate(R.layout.candidates, null);
-        mCandidateViewContainer = container;
-        mCandidateStripHeight = (int)mResources.getDimension(R.dimen.candidate_strip_height);
-        mCandidateView = (CandidateView) container.findViewById(R.id.candidates);
+    public void setInputView(View view) {
+        super.setInputView(view);
+        mCandidateViewContainer = view.findViewById(R.id.candidates_container);
+        mCandidateView = (CandidateView) view.findViewById(R.id.candidates);
         mCandidateView.setService(this);
-        setCandidatesViewShown(true);
-        return container;
+        mCandidateStripHeight = (int)mResources.getDimension(R.dimen.candidate_strip_height);
+    }
+
+    @Override
+    public void setCandidatesView(View view) {
+        // To ensure that CandidatesView will never be set.
+        return;
     }
 
     @Override
     public void onStartInputView(EditorInfo attribute, boolean restarting) {
         final KeyboardSwitcher switcher = mKeyboardSwitcher;
-        LatinKeyboardView inputView = switcher.getInputView();
+        LatinKeyboardView inputView = switcher.getKeyboardView();
 
         if (DEBUG) {
-            Log.d(TAG, "onStartInputView: " + inputView);
+            Log.d(TAG, "onStartInputView: inputType=" + ((attribute == null) ? "none"
+                    : String.format("0x%08x", attribute.inputType)));
         }
         // In landscape mode, this method gets called without the input view being created.
         if (inputView == null) {
@@ -549,13 +554,14 @@
             switcher.updateShiftState();
         }
 
-        setCandidatesViewShownInternal(isCandidateStripVisible(), false /* needsInputViewShown */ );
+        setSuggestionStripShownInternal(isCandidateStripVisible(), /* needsInputViewShown */ false);
         // Delay updating suggestions because keyboard input view may not be shown at this point.
         mHandler.postUpdateSuggestions();
 
         updateCorrectionMode();
 
-        inputView.setKeyPreviewEnabled(mSettingsValues.mPopupOn);
+        inputView.setKeyPreviewPopupEnabled(mSettingsValues.mKeyPreviewPopupOn,
+                mSettingsValues.mKeyPreviewPopupDismissDelay);
         inputView.setProximityCorrectionEnabled(true);
         // If we just entered a text field, maybe it has some old text that requires correction
         mRecorrection.checkRecorrectionOnStart();
@@ -622,6 +628,13 @@
     }
 
     @Override
+    public void onWindowHidden() {
+        super.onWindowHidden();
+        KeyboardView inputView = mKeyboardSwitcher.getKeyboardView();
+        if (inputView != null) inputView.closing();
+    }
+
+    @Override
     public void onFinishInput() {
         super.onFinishInput();
 
@@ -630,7 +643,7 @@
 
         mVoiceProxy.flushVoiceInputLogs(mConfigurationChanging);
 
-        KeyboardView inputView = mKeyboardSwitcher.getInputView();
+        KeyboardView inputView = mKeyboardSwitcher.getKeyboardView();
         if (inputView != null) inputView.closing();
         if (mAutoDictionary != null) mAutoDictionary.flushPendingWrites();
         if (mUserBigramDictionary != null) mUserBigramDictionary.flushPendingWrites();
@@ -639,7 +652,7 @@
     @Override
     public void onFinishInputView(boolean finishingInput) {
         super.onFinishInputView(finishingInput);
-        KeyboardView inputView = mKeyboardSwitcher.getInputView();
+        KeyboardView inputView = mKeyboardSwitcher.getKeyboardView();
         if (inputView != null) inputView.setForeground(false);
         // Remove pending messages related to update suggestions
         mHandler.cancelUpdateSuggestions();
@@ -684,7 +697,7 @@
                 // If the composing span has been cleared, save the typed word in the history for
                 // recorrection before we reset the candidate strip.  Then, we'll be able to show
                 // suggestions for recorrection right away.
-                mRecorrection.saveWordInHistory(mWord, mComposing);
+                mRecorrection.saveRecorrectionSuggestion(mWord, mComposing);
             }
             mComposing.setLength(0);
             mHasUncommittedTypedChars = false;
@@ -795,11 +808,11 @@
             // When in fullscreen mode, show completions generated by the application
             setSuggestions(builder.build());
             mBestWord = null;
-            setCandidatesViewShown(true);
+            setSuggestionStripShown(true);
         }
     }
 
-    private void setCandidatesViewShownInternal(boolean shown, boolean needsInputViewShown) {
+    private void setSuggestionStripShownInternal(boolean shown, boolean needsInputViewShown) {
         // TODO: Modify this if we support candidates with hard keyboard
         if (onEvaluateInputViewShown()) {
             final boolean shouldShowCandidates = shown
@@ -807,26 +820,25 @@
             if (isExtractViewShown()) {
                 // No need to have extra space to show the key preview.
                 mCandidateViewContainer.setMinimumHeight(0);
-                super.setCandidatesViewShown(shown);
+                mCandidateViewContainer.setVisibility(
+                        shouldShowCandidates ? View.VISIBLE : View.GONE);
             } else {
                 // We must control the visibility of the suggestion strip in order to avoid clipped
                 // key previews, even when we don't show the suggestion strip.
                 mCandidateViewContainer.setVisibility(
                         shouldShowCandidates ? View.VISIBLE : View.INVISIBLE);
-                super.setCandidatesViewShown(true);
             }
         }
     }
 
-    @Override
-    public void setCandidatesViewShown(boolean shown) {
-        setCandidatesViewShownInternal(shown, true /* needsInputViewShown */ );
+    private void setSuggestionStripShown(boolean shown) {
+        setSuggestionStripShownInternal(shown, /* needsInputViewShown */true);
     }
 
     @Override
     public void onComputeInsets(InputMethodService.Insets outInsets) {
         super.onComputeInsets(outInsets);
-        final KeyboardView inputView = mKeyboardSwitcher.getInputView();
+        final KeyboardView inputView = mKeyboardSwitcher.getKeyboardView();
         if (inputView == null)
             return;
         final int containerHeight = mCandidateViewContainer.getHeight();
@@ -868,8 +880,8 @@
     public boolean onKeyDown(int keyCode, KeyEvent event) {
         switch (keyCode) {
         case KeyEvent.KEYCODE_BACK:
-            if (event.getRepeatCount() == 0 && mKeyboardSwitcher.getInputView() != null) {
-                if (mKeyboardSwitcher.getInputView().handleBack()) {
+            if (event.getRepeatCount() == 0 && mKeyboardSwitcher.getKeyboardView() != null) {
+                if (mKeyboardSwitcher.getKeyboardView().handleBack()) {
                     return true;
                 }
             }
@@ -1005,14 +1017,14 @@
     }
 
     private void onSettingsKeyPressed() {
-        if (!isShowingOptionDialog()) {
-            if (!mSettingsValues.mEnableShowSubtypeSettings) {
-                showSubtypeSelectorAndSettings();
-            } else if (Utils.hasMultipleEnabledIMEsOrSubtypes(mImm)) {
-                showOptionsMenu();
-            } else {
-                launchSettings();
-            }
+        if (isShowingOptionDialog())
+            return;
+        if (InputMethodServiceCompatWrapper.CAN_HANDLE_ON_CURRENT_INPUT_METHOD_SUBTYPE_CHANGED) {
+            showSubtypeSelectorAndSettings();
+        } else if (Utils.hasMultipleEnabledIMEsOrSubtypes(mImm)) {
+            showOptionsMenu();
+        } else {
+            launchSettings();
         }
     }
 
@@ -1221,7 +1233,7 @@
             if (!mHasUncommittedTypedChars) {
                 mHasUncommittedTypedChars = true;
                 mComposing.setLength(0);
-                mRecorrection.saveWordInHistory(mWord, mBestWord);
+                mRecorrection.saveRecorrectionSuggestion(mWord, mBestWord);
                 mWord.reset();
                 clearSuggestions();
             }
@@ -1356,7 +1368,7 @@
         commitTyped(getCurrentInputConnection());
         mVoiceProxy.handleClose();
         requestHideSelf(0);
-        LatinKeyboardView inputView = mKeyboardSwitcher.getInputView();
+        LatinKeyboardView inputView = mKeyboardSwitcher.getKeyboardView();
         if (inputView != null)
             inputView.closing();
     }
@@ -1392,7 +1404,7 @@
         if (DEBUG) {
             Log.d(TAG, "Switch to keyboard view.");
         }
-        View v = mKeyboardSwitcher.getInputView();
+        View v = mKeyboardSwitcher.getKeyboardView();
         if (v != null) {
             // Confirms that the keyboard view doesn't have parent view.
             ViewParent p = v.getParent();
@@ -1401,7 +1413,7 @@
             }
             setInputView(v);
         }
-        setCandidatesViewShown(isCandidateStripVisible());
+        setSuggestionStripShown(isCandidateStripVisible());
         updateInputViewShown();
         mHandler.postUpdateSuggestions();
     }
@@ -1411,9 +1423,9 @@
     }
 
     public void setSuggestions(SuggestedWords words) {
-        if (mVoiceProxy.getAndResetIsShowingHint()) {
-             setCandidatesView(mCandidateViewContainer);
-        }
+//        if (mVoiceProxy.getAndResetIsShowingHint()) {
+//             setCandidatesView(mCandidateViewContainer);
+//        }
 
         if (mCandidateView != null) {
             mCandidateView.setSuggestions(words);
@@ -1443,7 +1455,7 @@
         CharSequence prevWord = EditingUtils.getPreviousWord(getCurrentInputConnection(),
                 mSettingsValues.mWordSeparators);
         SuggestedWords.Builder builder = mSuggest.getSuggestedWordBuilder(
-                mKeyboardSwitcher.getInputView(), word, prevWord);
+                mKeyboardSwitcher.getKeyboardView(), word, prevWord);
 
         boolean correctionAvailable = !mInputTypeNoAutoCorrect && mSuggest.hasAutoCorrection();
         final CharSequence typedWord = word.getTypedWord();
@@ -1464,14 +1476,17 @@
         // in most cases, suggestion count is 1 when typed word's length is 1, but we do always
         // need to clear the previous state when the user starts typing a word (i.e. typed word's
         // length == 1).
-        if (builder.size() > 1 || typedWord.length() == 1 || typedWordValid
-                || mCandidateView.isShowingAddToDictionaryHint()) {
-            builder.setTypedWordValid(typedWordValid).setHasMinimalSuggestion(correctionAvailable);
-        } else {
-            final SuggestedWords previousSuggestions = mCandidateView.getSuggestions();
-            if (previousSuggestions == mSettingsValues.mSuggestPuncList)
-                return;
-            builder.addTypedWordAndPreviousSuggestions(typedWord, previousSuggestions);
+        if (typedWord != null) {
+            if (builder.size() > 1 || typedWord.length() == 1 || typedWordValid
+                    || mCandidateView.isShowingAddToDictionaryHint()) {
+                builder.setTypedWordValid(typedWordValid).setHasMinimalSuggestion(
+                        correctionAvailable);
+            } else {
+                final SuggestedWords previousSuggestions = mCandidateView.getSuggestions();
+                if (previousSuggestions == mSettingsValues.mSuggestPuncList)
+                    return;
+                builder.addTypedWordAndPreviousSuggestions(typedWord, previousSuggestions);
+            }
         }
         showSuggestions(builder.build(), typedWord);
     }
@@ -1489,7 +1504,7 @@
         } else {
             mBestWord = null;
         }
-        setCandidatesViewShown(isCandidateStripVisible());
+        setSuggestionStripShown(isCandidateStripVisible());
     }
 
     private boolean pickDefaultSuggestion(int separatorCode) {
@@ -1501,7 +1516,7 @@
         if (mBestWord != null && mBestWord.length() > 0) {
             TextEntryState.acceptedDefault(mWord.getTypedWord(), mBestWord, separatorCode);
             mJustAccepted = true;
-            pickSuggestion(mBestWord);
+            commitBestWord(mBestWord);
             // Add the word to the auto dictionary if it's not a known word
             addToAutoAndUserBigramDictionaries(mBestWord, AutoDictionary.FREQUENCY_FOR_TYPED);
             return true;
@@ -1548,7 +1563,9 @@
             // a magic space even if it was a normal space. This is meant to help in case the user
             // pressed space on purpose of displaying the suggestion strip punctuation.
             final char primaryCode = suggestion.charAt(0);
-            final int toLeft = (ic == null) ? 0 : ic.getTextBeforeCursor(1, 0).charAt(0);
+            final CharSequence beforeText = ic != null ? ic.getTextBeforeCursor(1, 0) : "";
+            final int toLeft = (ic == null || TextUtils.isEmpty(beforeText))
+                    ? 0 : beforeText.charAt(0);
             final boolean oldMagicSpace = mJustAddedMagicSpace;
             if (Keyboard.CODE_SPACE == toLeft) mJustAddedMagicSpace = true;
             onCodeInput(primaryCode, new int[] { primaryCode },
@@ -1566,7 +1583,7 @@
             mWord.reset();
         }
         mJustAccepted = true;
-        pickSuggestion(suggestion);
+        commitBestWord(suggestion);
         // Add the word to the auto dictionary if it's not a known word
         if (index == 0) {
             addToAutoAndUserBigramDictionaries(suggestion, AutoDictionary.FREQUENCY_FOR_PICKED);
@@ -1602,12 +1619,14 @@
             // TextEntryState.State.PICKED_SUGGESTION state.
             TextEntryState.typedCharacter((char) Keyboard.CODE_SPACE, true,
                     WordComposer.NOT_A_COORDINATE, WordComposer.NOT_A_COORDINATE);
-            // From there on onUpdateSelection() will fire so suggestions will be updated
-        } else if (!showingAddToDictionaryHint) {
+        }
+        if (!showingAddToDictionaryHint) {
             // If we're not showing the "Touch again to save", then show corrections again.
             // In case the cursor position doesn't change, make sure we show the suggestions again.
-            clearSuggestions();
-            mHandler.postUpdateOldSuggestions();
+            updateBigramPredictions();
+            // Updating the predictions right away may be slow and feel unresponsive on slower
+            // terminals. On the other hand if we just postUpdateBigramPredictions() it will
+            // take a noticeable delay to update them which may feel uneasy.
         }
         if (showingAddToDictionaryHint) {
             mCandidateView.showAddToDictionaryHint(suggestion);
@@ -1620,25 +1639,25 @@
     /**
      * Commits the chosen word to the text field and saves it for later
      * retrieval.
-     * @param suggestion the suggestion picked by the user to be committed to
-     *            the text field
      */
-    private void pickSuggestion(CharSequence suggestion) {
+    private void commitBestWord(CharSequence bestWord) {
         KeyboardSwitcher switcher = mKeyboardSwitcher;
         if (!switcher.isKeyboardAvailable())
             return;
         InputConnection ic = getCurrentInputConnection();
         if (ic != null) {
-            mVoiceProxy.rememberReplacedWord(suggestion, mSettingsValues.mWordSeparators);
-            ic.commitText(suggestion, 1);
+            mVoiceProxy.rememberReplacedWord(bestWord, mSettingsValues.mWordSeparators);
+            SuggestedWords suggestedWords = mCandidateView.getSuggestions();
+            ic.commitText(SuggestionSpanUtils.getTextWithSuggestionSpan(
+                    this, bestWord, suggestedWords), 1);
         }
-        mRecorrection.saveWordInHistory(mWord, suggestion);
+        mRecorrection.saveRecorrectionSuggestion(mWord, bestWord);
         mHasUncommittedTypedChars = false;
-        mCommittedLength = suggestion.length();
+        mCommittedLength = bestWord.length();
     }
 
     private static final WordComposer sEmptyWordComposer = new WordComposer();
-    private void updateBigramPredictions() {
+    public void updateBigramPredictions() {
         if (mSuggest == null || !isSuggestionsRequested())
             return;
 
@@ -1650,7 +1669,7 @@
         final CharSequence prevWord = EditingUtils.getThisWord(getCurrentInputConnection(),
                 mSettingsValues.mWordSeparators);
         SuggestedWords.Builder builder = mSuggest.getSuggestedWordBuilder(
-                mKeyboardSwitcher.getInputView(), sEmptyWordComposer, prevWord);
+                mKeyboardSwitcher.getKeyboardView(), sEmptyWordComposer, prevWord);
 
         if (builder.size() > 0) {
             // Explicitly supply an empty typed word (the no-second-arg version of
@@ -1663,7 +1682,7 @@
 
     public void setPunctuationSuggestions() {
         setSuggestions(mSettingsValues.mSuggestPuncList);
-        setCandidatesViewShown(isCandidateStripVisible());
+        setSuggestionStripShown(isCandidateStripVisible());
     }
 
     private void addToAutoAndUserBigramDictionaries(CharSequence suggestion, int frequencyDelta) {
@@ -1872,7 +1891,7 @@
         // if mAudioManager is null, we don't have the ringer state yet
         // mAudioManager will be set by updateRingerMode
         if (mAudioManager == null) {
-            if (mKeyboardSwitcher.getInputView() != null) {
+            if (mKeyboardSwitcher.getKeyboardView() != null) {
                 updateRingerMode();
             }
         }
@@ -1899,7 +1918,7 @@
         if (!mSettingsValues.mVibrateOn) {
             return;
         }
-        LatinKeyboardView inputView = mKeyboardSwitcher.getInputView();
+        LatinKeyboardView inputView = mKeyboardSwitcher.getKeyboardView();
         if (inputView != null) {
             inputView.performHapticFeedback(
                     HapticFeedbackConstants.KEYBOARD_TAP,
@@ -1907,18 +1926,10 @@
         }
     }
 
-    public void promoteToUserDictionary(String word, int frequency) {
-        if (mUserDictionary.isValidWord(word)) return;
-        mUserDictionary.addWord(word, frequency);
-    }
-
     public WordComposer getCurrentWord() {
         return mWord;
     }
 
-    public boolean getPopupOn() {
-        return mSettingsValues.mPopupOn;
-    }
     boolean isSoundOn() {
         return mSettingsValues.mSoundOn && !mSilentModeOn;
     }
@@ -2026,7 +2037,7 @@
 
     private void showOptionsMenuInternal(CharSequence title, CharSequence[] items,
             DialogInterface.OnClickListener listener) {
-        final IBinder windowToken = mKeyboardSwitcher.getInputView().getWindowToken();
+        final IBinder windowToken = mKeyboardSwitcher.getKeyboardView().getWindowToken();
         if (windowToken == null) return;
         AlertDialog.Builder builder = new AlertDialog.Builder(this);
         builder.setCancelable(true);
@@ -2062,7 +2073,7 @@
         p.println("  TextEntryState.state=" + TextEntryState.getState());
         p.println("  mSoundOn=" + mSettingsValues.mSoundOn);
         p.println("  mVibrateOn=" + mSettingsValues.mVibrateOn);
-        p.println("  mPopupOn=" + mSettingsValues.mPopupOn);
+        p.println("  mKeyPreviewPopupOn=" + mSettingsValues.mKeyPreviewPopupOn);
     }
 
     // Characters per second measurement
diff --git a/java/src/com/android/inputmethod/latin/Settings.java b/java/src/com/android/inputmethod/latin/Settings.java
index 5eb3657..956c51e 100644
--- a/java/src/com/android/inputmethod/latin/Settings.java
+++ b/java/src/com/android/inputmethod/latin/Settings.java
@@ -56,7 +56,7 @@
     public static final String PREF_GENERAL_SETTINGS_KEY = "general_settings";
     public static final String PREF_VIBRATE_ON = "vibrate_on";
     public static final String PREF_SOUND_ON = "sound_on";
-    public static final String PREF_POPUP_ON = "popup_on";
+    public static final String PREF_KEY_PREVIEW_POPUP_ON = "popup_on";
     public static final String PREF_RECORRECTION_ENABLED = "recorrection_enabled";
     public static final String PREF_AUTO_CAP = "auto_cap";
     public static final String PREF_SETTINGS_KEY = "settings_key";
@@ -77,6 +77,9 @@
 
     public static final String PREF_MISC_SETTINGS_KEY = "misc_settings";
 
+    public static final String PREF_KEY_PREVIEW_POPUP_DISMISS_DELAY =
+            "pref_key_preview_popup_dismiss_delay";
+
     public static final String PREF_USABILITY_STUDY_MODE = "usability_study_mode";
 
     // Dialog ids
@@ -84,7 +87,6 @@
 
     public static class Values {
         // From resources:
-        public final boolean mEnableShowSubtypeSettings;
         public final boolean mSwipeDownDismissKeyboardEnabled;
         public final int mDelayBeforeFadeoutLanguageOnSpacebar;
         public final int mDelayUpdateSuggestions;
@@ -102,7 +104,8 @@
         // From preferences:
         public final boolean mSoundOn; // Sound setting private to Latin IME (see mSilentModeOn)
         public final boolean mVibrateOn;
-        public final boolean mPopupOn; // Warning : this escapes through LatinIME#isPopupOn
+        public final boolean mKeyPreviewPopupOn;
+        public final int mKeyPreviewPopupDismissDelay;
         public final boolean mAutoCap;
         public final boolean mQuickFixes;
         public final boolean mAutoCorrectEnabled;
@@ -117,15 +120,13 @@
             final Resources res = context.getResources();
             final Locale savedLocale;
             if (null != localeStr) {
-                final Locale keyboardLocale = new Locale(localeStr);
+                final Locale keyboardLocale = Utils.constructLocaleFromString(localeStr);
                 savedLocale = Utils.setSystemLocale(res, keyboardLocale);
             } else {
                 savedLocale = null;
             }
 
             // Get the resources
-            mEnableShowSubtypeSettings = res.getBoolean(
-                    R.bool.config_enable_show_subtype_settings);
             mSwipeDownDismissKeyboardEnabled = res.getBoolean(
                     R.bool.config_swipe_down_dismiss_keyboard_enabled);
             mDelayBeforeFadeoutLanguageOnSpacebar = res.getInteger(
@@ -161,7 +162,8 @@
             mSoundOn = prefs.getBoolean(Settings.PREF_SOUND_ON,
                     res.getBoolean(R.bool.config_default_sound_enabled));
 
-            mPopupOn = isPopupEnabled(prefs, res);
+            mKeyPreviewPopupOn = isKeyPreviewPopupEnabled(prefs, res);
+            mKeyPreviewPopupDismissDelay = getKeyPreviewPopupDismissDelay(prefs, res);
             mAutoCap = prefs.getBoolean(Settings.PREF_AUTO_CAP, true);
             mQuickFixes = isQuickFixesEnabled(prefs, res);
 
@@ -172,6 +174,8 @@
                     && isBigramPredictionEnabled(prefs, res);
 
             mAutoCorrectionThreshold = getAutoCorrectionThreshold(prefs, res);
+
+            Utils.setSystemLocale(res, savedLocale);
         }
 
         public boolean isSuggestedPunctuation(int code) {
@@ -200,6 +204,7 @@
             return sp.getBoolean(Settings.PREF_QUICK_FIXES, resources.getBoolean(
                     R.bool.config_default_quick_fixes));
         }
+
         private static boolean isAutoCorrectEnabled(SharedPreferences sp, Resources resources) {
             final String currentAutoCorrectionSetting = sp.getString(
                     Settings.PREF_AUTO_CORRECTION_THRESHOLD,
@@ -208,13 +213,24 @@
                     R.string.auto_correction_threshold_mode_index_off);
             return !currentAutoCorrectionSetting.equals(autoCorrectionOff);
         }
-        private static boolean isPopupEnabled(SharedPreferences sp, Resources resources) {
+
+        // Public to access from KeyboardSwitcher. Should it have access to some
+        // process-global instance instead?
+        public static boolean isKeyPreviewPopupEnabled(SharedPreferences sp, Resources resources) {
             final boolean showPopupOption = resources.getBoolean(
                     R.bool.config_enable_show_popup_on_keypress_option);
             if (!showPopupOption) return resources.getBoolean(R.bool.config_default_popup_preview);
-            return sp.getBoolean(Settings.PREF_POPUP_ON,
+            return sp.getBoolean(Settings.PREF_KEY_PREVIEW_POPUP_ON,
                     resources.getBoolean(R.bool.config_default_popup_preview));
         }
+
+        // Likewise
+        public static int getKeyPreviewPopupDismissDelay(SharedPreferences sp,
+                Resources resources) {
+            return Integer.parseInt(sp.getString(Settings.PREF_KEY_PREVIEW_POPUP_DISMISS_DELAY,
+                    Integer.toString(resources.getInteger(R.integer.config_delay_after_preview))));
+        }
+
         private static boolean isBigramSuggestionEnabled(SharedPreferences sp, Resources resources,
                 boolean autoCorrectEnabled) {
             final boolean showBigramSuggestionsOption = resources.getBoolean(
@@ -225,11 +241,13 @@
             return sp.getBoolean(Settings.PREF_BIGRAM_SUGGESTIONS, resources.getBoolean(
                     R.bool.config_default_bigram_suggestions));
         }
+
         private static boolean isBigramPredictionEnabled(SharedPreferences sp,
                 Resources resources) {
             return sp.getBoolean(Settings.PREF_BIGRAM_PREDICTIONS, resources.getBoolean(
                     R.bool.config_default_bigram_prediction));
         }
+
         private static double getAutoCorrectionThreshold(SharedPreferences sp,
                 Resources resources) {
             final String currentAutoCorrectionSetting = sp.getString(
@@ -255,6 +273,7 @@
             }
             return autoCorrectionThreshold;
         }
+
         private static SuggestedWords createSuggestPuncList(final String puncs) {
             SuggestedWords.Builder builder = new SuggestedWords.Builder();
             if (puncs != null) {
@@ -272,6 +291,7 @@
     private ListPreference mSettingsKeyPreference;
     private ListPreference mShowCorrectionSuggestionsPreference;
     private ListPreference mAutoCorrectionThreshold;
+    private ListPreference mKeyPreviewPopupDismissDelay;
     // Suggestion: use bigrams to adjust scores of suggestions obtained from unigram dictionary
     private CheckBoxPreference mBigramSuggestion;
     // Prediction: use bigrams to predict the next word when there is no input for it yet
@@ -297,6 +317,8 @@
     @Override
     protected void onCreate(Bundle icicle) {
         super.onCreate(icicle);
+        final Resources res = getResources();
+
         addPreferencesFromResource(R.xml.prefs);
         mInputLanguageSelection = (PreferenceScreen) findPreference(PREF_SUBTYPES);
         mInputLanguageSelection.setOnPreferenceClickListener(this);
@@ -329,16 +351,14 @@
                 (PreferenceGroup) findPreference(PREF_GENERAL_SETTINGS_KEY);
         final PreferenceGroup textCorrectionGroup =
                 (PreferenceGroup) findPreference(PREF_CORRECTION_SETTINGS_KEY);
-        final PreferenceGroup bigramGroup =
-                (PreferenceGroup) findPreference(PREF_NGRAM_SETTINGS_KEY);
 
-        final boolean showSettingsKeyOption = getResources().getBoolean(
+        final boolean showSettingsKeyOption = res.getBoolean(
                 R.bool.config_enable_show_settings_key_option);
         if (!showSettingsKeyOption) {
             generalSettings.removePreference(mSettingsKeyPreference);
         }
 
-        final boolean showVoiceKeyOption = getResources().getBoolean(
+        final boolean showVoiceKeyOption = res.getBoolean(
                 R.bool.config_enable_show_voice_key_option);
         if (!showVoiceKeyOption) {
             generalSettings.removePreference(mVoicePreference);
@@ -348,43 +368,57 @@
             generalSettings.removePreference(findPreference(PREF_VIBRATE_ON));
         }
 
-        final boolean showSubtypeSettings = getResources().getBoolean(
-                R.bool.config_enable_show_subtype_settings);
-        if (InputMethodServiceCompatWrapper.CAN_HANDLE_ON_CURRENT_INPUT_METHOD_SUBTYPE_CHANGED
-                && !showSubtypeSettings) {
+        if (InputMethodServiceCompatWrapper.CAN_HANDLE_ON_CURRENT_INPUT_METHOD_SUBTYPE_CHANGED) {
             generalSettings.removePreference(findPreference(PREF_SUBTYPES));
         }
 
-        final boolean showPopupOption = getResources().getBoolean(
+        final boolean showPopupOption = res.getBoolean(
                 R.bool.config_enable_show_popup_on_keypress_option);
         if (!showPopupOption) {
-            generalSettings.removePreference(findPreference(PREF_POPUP_ON));
+            generalSettings.removePreference(findPreference(PREF_KEY_PREVIEW_POPUP_ON));
         }
 
-        final boolean showRecorrectionOption = getResources().getBoolean(
+        final boolean showRecorrectionOption = res.getBoolean(
                 R.bool.config_enable_show_recorrection_option);
         if (!showRecorrectionOption) {
             generalSettings.removePreference(findPreference(PREF_RECORRECTION_ENABLED));
         }
 
-        final boolean showQuickFixesOption = getResources().getBoolean(
+        final boolean showQuickFixesOption = res.getBoolean(
                 R.bool.config_enable_quick_fixes_option);
         if (!showQuickFixesOption) {
             textCorrectionGroup.removePreference(findPreference(PREF_QUICK_FIXES));
         }
 
-        final boolean showBigramSuggestionsOption = getResources().getBoolean(
+        final boolean showBigramSuggestionsOption = res.getBoolean(
                 R.bool.config_enable_bigram_suggestions_option);
         if (!showBigramSuggestionsOption) {
             textCorrectionGroup.removePreference(findPreference(PREF_BIGRAM_SUGGESTIONS));
             textCorrectionGroup.removePreference(findPreference(PREF_BIGRAM_PREDICTIONS));
         }
 
-        final boolean showUsabilityModeStudyOption = getResources().getBoolean(
+        final boolean showUsabilityModeStudyOption = res.getBoolean(
                 R.bool.config_enable_usability_study_mode_option);
         if (!showUsabilityModeStudyOption) {
             getPreferenceScreen().removePreference(findPreference(PREF_USABILITY_STUDY_MODE));
         }
+
+        mKeyPreviewPopupDismissDelay =
+                (ListPreference)findPreference(PREF_KEY_PREVIEW_POPUP_DISMISS_DELAY);
+        final String[] entries = new String[] {
+                res.getString(R.string.key_preview_popup_dismiss_no_delay),
+                res.getString(R.string.key_preview_popup_dismiss_default_delay),
+        };
+        final String popupDismissDelayDefaultValue = Integer.toString(res.getInteger(
+                R.integer.config_delay_after_preview));
+        mKeyPreviewPopupDismissDelay.setEntries(entries);
+        mKeyPreviewPopupDismissDelay.setEntryValues(
+                new String[] { "0", popupDismissDelayDefaultValue });
+        if (null == mKeyPreviewPopupDismissDelay.getValue()) {
+            mKeyPreviewPopupDismissDelay.setValue(popupDismissDelayDefaultValue);
+        }
+        mKeyPreviewPopupDismissDelay.setEnabled(
+                Settings.Values.isKeyPreviewPopupEnabled(prefs, res));
     }
 
     @Override
@@ -403,6 +437,7 @@
         }
         updateSettingsKeySummary();
         updateShowCorrectionSuggestionsSummary();
+        updateKeyPreviewPopupDelaySummary();
     }
 
     @Override
@@ -421,6 +456,12 @@
                     .equals(mVoiceModeOff)) {
                 showVoiceConfirmation();
             }
+        } else if (key.equals(PREF_KEY_PREVIEW_POPUP_ON)) {
+            final ListPreference popupDismissDelay =
+                (ListPreference)findPreference(PREF_KEY_PREVIEW_POPUP_DISMISS_DELAY);
+            if (null != popupDismissDelay) {
+                popupDismissDelay.setEnabled(prefs.getBoolean(PREF_KEY_PREVIEW_POPUP_ON, true));
+            }
         }
         ensureConsistencyOfAutoCorrectionSettings();
         mVoiceOn = !(prefs.getString(PREF_VOICE_SETTINGS_KEY, mVoiceModeOff)
@@ -428,6 +469,7 @@
         updateVoiceModeSummary();
         updateSettingsKeySummary();
         updateShowCorrectionSuggestionsSummary();
+        updateKeyPreviewPopupDelaySummary();
     }
 
     @Override
@@ -454,6 +496,11 @@
                 [mSettingsKeyPreference.findIndexOfValue(mSettingsKeyPreference.getValue())]);
     }
 
+    private void updateKeyPreviewPopupDelaySummary() {
+        final ListPreference lp = mKeyPreviewPopupDismissDelay;
+        lp.setSummary(lp.getEntries()[lp.findIndexOfValue(lp.getValue())]);
+    }
+
     private void showVoiceConfirmation() {
         mOkClicked = false;
         showDialog(VOICE_INPUT_CONFIRM_DIALOG);
diff --git a/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java b/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java
index d801208..8b51af8 100644
--- a/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java
+++ b/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java
@@ -92,10 +92,9 @@
     }
 
     public static void init(LatinIME service, SharedPreferences prefs) {
+        SubtypeLocale.init(service);
         sInstance.initialize(service, prefs);
         sInstance.updateAllParameters();
-
-        SubtypeLocale.init(service);
     }
 
     private SubtypeSwitcher() {
@@ -281,14 +280,8 @@
         // "en_US" --> language: en  & country: US
         // "en" --> language: en
         // "" --> the system locale
-        mLocaleSplitter.setString(inputLocaleStr);
-        if (mLocaleSplitter.hasNext()) {
-            String language = mLocaleSplitter.next();
-            if (mLocaleSplitter.hasNext()) {
-                mInputLocale = new Locale(language, mLocaleSplitter.next());
-            } else {
-                mInputLocale = new Locale(language);
-            }
+        if (!TextUtils.isEmpty(inputLocaleStr)) {
+            mInputLocale = Utils.constructLocaleFromString(inputLocaleStr);
             mInputLocaleStr = inputLocaleStr;
         } else {
             mInputLocale = mSystemLocale;
@@ -420,7 +413,7 @@
         final KeyboardSwitcher switcher = KeyboardSwitcher.getInstance();
         final LatinKeyboard keyboard = switcher.getLatinKeyboard();
         if (keyboard != null) {
-            keyboard.updateShortcutKey(isShortcutImeReady(), switcher.getInputView());
+            keyboard.updateShortcutKey(isShortcutImeReady(), switcher.getKeyboardView());
         }
     }
 
@@ -510,7 +503,7 @@
     private void triggerVoiceIME() {
         if (!mService.isInputViewShown()) return;
         VoiceProxy.getInstance().startListening(false,
-                KeyboardSwitcher.getInstance().getInputView().getWindowToken());
+                KeyboardSwitcher.getInstance().getKeyboardView().getWindowToken());
     }
 
     //////////////////////////////////////
@@ -549,12 +542,12 @@
                     || mEnabledKeyboardSubtypesOfCurrentInputMethod.size() == 0) return;
             mCurrentKeyboardSubtypeIndex = getCurrentIndex();
             mNextKeyboardSubtype = getNextKeyboardSubtypeInternal(mCurrentKeyboardSubtypeIndex);
-            Locale locale = new Locale(mNextKeyboardSubtype.getLocale());
-            mNextLanguage = getDisplayLanguage(locale);
+            Locale locale = Utils.constructLocaleFromString(mNextKeyboardSubtype.getLocale());
+            mNextLanguage = getFullDisplayName(locale, true);
             mPreviousKeyboardSubtype = getPreviousKeyboardSubtypeInternal(
                     mCurrentKeyboardSubtypeIndex);
-            locale = new Locale(mPreviousKeyboardSubtype.getLocale());
-            mPreviousLanguage = getDisplayLanguage(locale);
+            locale = Utils.constructLocaleFromString(mPreviousKeyboardSubtype.getLocale());
+            mPreviousLanguage = getFullDisplayName(locale, true);
         }
 
         private int normalize(int index) {
@@ -591,11 +584,12 @@
     }
 
     public static String getDisplayLanguage(Locale locale) {
-        return toTitleCase(locale.getDisplayLanguage(locale));
+        return toTitleCase(SubtypeLocale.getFullDisplayName(locale));
     }
 
     public static String getMiddleDisplayLanguage(Locale locale) {
-        return toTitleCase((new Locale(locale.getLanguage()).getDisplayLanguage(locale)));
+        return toTitleCase((Utils.constructLocaleFromString(
+                locale.getLanguage()).getDisplayLanguage(locale)));
     }
 
     public static String getShortDisplayLanguage(Locale locale) {
diff --git a/java/src/com/android/inputmethod/latin/SuggestionSpanPickedNotificationReceiver.java b/java/src/com/android/inputmethod/latin/SuggestionSpanPickedNotificationReceiver.java
new file mode 100644
index 0000000..4a3f42d
--- /dev/null
+++ b/java/src/com/android/inputmethod/latin/SuggestionSpanPickedNotificationReceiver.java
@@ -0,0 +1,43 @@
+/*
+ * 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.latin;
+
+import com.android.inputmethod.compat.SuggestionSpanUtils;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.util.Log;
+
+public class SuggestionSpanPickedNotificationReceiver extends BroadcastReceiver {
+    private static final boolean DBG = LatinImeLogger.sDBG;
+    private static final String TAG =
+            SuggestionSpanPickedNotificationReceiver.class.getSimpleName();
+
+    @Override
+    public void onReceive(Context context, Intent intent) {
+        if (SuggestionSpanUtils.ACTION_SUGGESTION_PICKED.equals(intent.getAction())) {
+            if (DBG) {
+                final String before = intent.getStringExtra(
+                        SuggestionSpanUtils.SUGGESTION_SPAN_PICKED_BEFORE);
+                final String after = intent.getStringExtra(
+                        SuggestionSpanUtils.SUGGESTION_SPAN_PICKED_AFTER);
+                Log.d(TAG, "Received notification picked: " + before + "," + after);
+            }
+        }
+    }
+}
diff --git a/java/src/com/android/inputmethod/latin/UserBigramDictionary.java b/java/src/com/android/inputmethod/latin/UserBigramDictionary.java
index a32a646..5b615ca 100644
--- a/java/src/com/android/inputmethod/latin/UserBigramDictionary.java
+++ b/java/src/com/android/inputmethod/latin/UserBigramDictionary.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 Google Inc.
+ * 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
@@ -158,7 +158,7 @@
      * Pair will be added to the userbigram database.
      */
     public int addBigrams(String word1, String word2) {
-        // remove caps
+        // remove caps if second word is autocapitalized
         if (mIme != null && mIme.getCurrentWord().isAutoCapitalized()) {
             word2 = Character.toLowerCase(word2.charAt(0)) + word2.substring(1);
         }
diff --git a/java/src/com/android/inputmethod/latin/Utils.java b/java/src/com/android/inputmethod/latin/Utils.java
index d165de3..6bdc0a8 100644
--- a/java/src/com/android/inputmethod/latin/Utils.java
+++ b/java/src/com/android/inputmethod/latin/Utils.java
@@ -18,6 +18,7 @@
 
 import com.android.inputmethod.compat.InputMethodInfoCompatWrapper;
 import com.android.inputmethod.compat.InputMethodManagerCompatWrapper;
+import com.android.inputmethod.compat.InputMethodSubtypeCompatWrapper;
 import com.android.inputmethod.compat.InputTypeCompatUtils;
 import com.android.inputmethod.keyboard.Keyboard;
 import com.android.inputmethod.keyboard.KeyboardId;
@@ -43,7 +44,10 @@
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.text.SimpleDateFormat;
+import java.util.ArrayList;
 import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
 import java.util.Locale;
 
 public class Utils {
@@ -108,7 +112,34 @@
     }
 
     public static boolean hasMultipleEnabledIMEsOrSubtypes(InputMethodManagerCompatWrapper imm) {
-        return imm.getEnabledInputMethodList().size() > 1
+        final List<InputMethodInfoCompatWrapper> enabledImis = imm.getEnabledInputMethodList();
+
+        // Filters out IMEs that have auxiliary subtypes only (including either implicitly or
+        // explicitly enabled ones).
+        final ArrayList<InputMethodInfoCompatWrapper> filteredImis =
+                new ArrayList<InputMethodInfoCompatWrapper>();
+
+        outerloop:
+        for (InputMethodInfoCompatWrapper imi : enabledImis) {
+            // We can return true immediately after we find two or more filtered IMEs.
+            if (filteredImis.size() > 1) return true;
+            final List<InputMethodSubtypeCompatWrapper> subtypes =
+                    imm.getEnabledInputMethodSubtypeList(imi, true);
+            // IMEs that have no subtypes should be included.
+            if (subtypes.isEmpty()) {
+                filteredImis.add(imi);
+                continue;
+            }
+            // IMEs that have one or more non-auxiliary subtypes should be included.
+            for (InputMethodSubtypeCompatWrapper subtype : subtypes) {
+                if (!subtype.isAuxiliary()) {
+                    filteredImis.add(imi);
+                    continue outerloop;
+                }
+            }
+        }
+
+        return filteredImis.size() > 1
         // imm.getEnabledInputMethodSubtypeList(null, false) will return the current IME's enabled
         // input method subtype (The current IME should be LatinIME.)
                 || imm.getEnabledInputMethodSubtypeList(null, false).size() > 1;
@@ -537,8 +568,6 @@
                 return KeyboardId.MODE_IM;
             } else if (variation == InputType.TYPE_TEXT_VARIATION_FILTER) {
                 return KeyboardId.MODE_TEXT;
-            } else if (variation == InputType.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT) {
-                return KeyboardId.MODE_WEB;
             } else {
                 return KeyboardId.MODE_TEXT;
             }
@@ -662,4 +691,28 @@
         res.updateConfiguration(conf, res.getDisplayMetrics());
         return saveLocale;
     }
+
+    private static final HashMap<String, Locale> sLocaleCache = new HashMap<String, Locale>();
+
+    public static Locale constructLocaleFromString(String localeStr) {
+        if (localeStr == null)
+            return null;
+        synchronized (sLocaleCache) {
+            if (sLocaleCache.containsKey(localeStr))
+                return sLocaleCache.get(localeStr);
+            Locale retval = null;
+            String[] localeParams = localeStr.split("_", 3);
+            if (localeParams.length == 1) {
+                retval = new Locale(localeParams[0]);
+            } else if (localeParams.length == 2) {
+                retval = new Locale(localeParams[0], localeParams[1]);
+            } else if (localeParams.length == 3) {
+                retval = new Locale(localeParams[0], localeParams[1], localeParams[2]);
+            }
+            if (retval != null) {
+                sLocaleCache.put(localeStr, retval);
+            }
+            return retval;
+        }
+    }
 }
diff --git a/java/src/com/android/inputmethod/latin/WhitelistDictionary.java b/java/src/com/android/inputmethod/latin/WhitelistDictionary.java
index 2389d4e..4377373 100644
--- a/java/src/com/android/inputmethod/latin/WhitelistDictionary.java
+++ b/java/src/com/android/inputmethod/latin/WhitelistDictionary.java
@@ -39,6 +39,7 @@
     public static WhitelistDictionary init(Context context) {
         synchronized (sInstance) {
             if (context != null) {
+                // Wordlist is initialized by the proper language in Suggestion.java#init
                 sInstance.initWordlist(
                         context.getResources().getStringArray(R.array.wordlist_whitelist));
             } else {
diff --git a/java/src/com/android/inputmethod/latin/WordComposer.java b/java/src/com/android/inputmethod/latin/WordComposer.java
index cf05929..af5e4b1 100644
--- a/java/src/com/android/inputmethod/latin/WordComposer.java
+++ b/java/src/com/android/inputmethod/latin/WordComposer.java
@@ -62,7 +62,7 @@
         mYCoordinates = new int[N];
     }
 
-    WordComposer(WordComposer source) {
+    public WordComposer(WordComposer source) {
         init(source);
     }
 
diff --git a/java/src/com/android/inputmethod/latin/spellcheck/SpellChecker.java b/java/src/com/android/inputmethod/latin/spellcheck/SpellChecker.java
new file mode 100644
index 0000000..e3407a2
--- /dev/null
+++ b/java/src/com/android/inputmethod/latin/spellcheck/SpellChecker.java
@@ -0,0 +1,114 @@
+/*
+ * 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.latin.spellcheck;
+
+import android.content.Context;
+import android.content.res.Resources;
+
+import com.android.inputmethod.latin.Dictionary;
+import com.android.inputmethod.latin.Dictionary.DataType;
+import com.android.inputmethod.latin.Dictionary.WordCallback;
+import com.android.inputmethod.latin.DictionaryFactory;
+import com.android.inputmethod.latin.Utils;
+import com.android.inputmethod.latin.WordComposer;
+
+import java.util.Arrays;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Locale;
+
+/**
+ * Implements spell checking methods.
+ */
+public class SpellChecker {
+
+    public final Dictionary mDictionary;
+
+    public SpellChecker(final Context context, final Locale locale) {
+        final Resources resources = context.getResources();
+        final int fallbackResourceId = Utils.getMainDictionaryResourceId(resources);
+        mDictionary = DictionaryFactory.createDictionaryFromManager(context, locale,
+                fallbackResourceId);
+    }
+
+    // Note : this must be reentrant
+    /**
+     * Finds out whether a word is in the dictionary or not.
+     *
+     * @param text the sequence containing the word to check for.
+     * @param start the index of the first character of the word in text.
+     * @param end the index of the next-to-last character in text.
+     * @return true if the word is in the dictionary, false otherwise.
+     */
+    public boolean isCorrect(final CharSequence text, final int start, final int end) {
+        return mDictionary.isValidWord(text.subSequence(start, end));
+    }
+
+    private static class SuggestionsGatherer implements WordCallback {
+        private final int DEFAULT_SUGGESTION_LENGTH = 16;
+        private final List<String> mSuggestions = new LinkedList<String>();
+        private int[] mScores = new int[DEFAULT_SUGGESTION_LENGTH];
+        private int mLength = 0;
+
+        synchronized public boolean addWord(char[] word, int wordOffset, int wordLength, int score,
+                int dicTypeId, DataType dataType) {
+            if (mLength >= mScores.length) {
+                final int newLength = mScores.length * 2;
+                mScores = new int[newLength];
+            }
+            final int positionIndex = Arrays.binarySearch(mScores, 0, mLength, score);
+            // binarySearch returns the index if the element exists, and -<insertion index> - 1
+            // if it doesn't. See documentation for binarySearch.
+            final int insertionIndex = positionIndex >= 0 ? positionIndex : -positionIndex - 1;
+            System.arraycopy(mScores, insertionIndex, mScores, insertionIndex + 1,
+                    mLength - insertionIndex);
+            mLength += 1;
+            mScores[insertionIndex] = score;
+            mSuggestions.add(insertionIndex, new String(word, wordOffset, wordLength));
+            return true;
+        }
+
+        public List<String> getGatheredSuggestions() {
+            return mSuggestions;
+        }
+    }
+
+    // Note : this must be reentrant
+    /**
+     * Gets a list of suggestions for a specific string.
+     *
+     * This returns a list of possible corrections for the text passed as an
+     * arguments. It may split or group words, and even perform grammatical
+     * analysis.
+     *
+     * @param text the sequence containing the word to check for.
+     * @param start the index of the first character of the word in text.
+     * @param end the index of the next-to-last character in text.
+     * @return a list of possible suggestions to replace the text.
+     */
+    public List<String> getSuggestions(final CharSequence text, final int start, final int end) {
+        final SuggestionsGatherer suggestionsGatherer = new SuggestionsGatherer();
+        final WordComposer composer = new WordComposer();
+        for (int i = start; i < end; ++i) {
+            int character = text.charAt(i);
+            composer.add(character, new int[] { character },
+                    WordComposer.NOT_A_COORDINATE, WordComposer.NOT_A_COORDINATE);
+        }
+        mDictionary.getWords(composer, suggestionsGatherer);
+        return suggestionsGatherer.getGatheredSuggestions();
+    }
+}
diff --git a/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp b/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp
index 555a522..4b61c14 100644
--- a/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp
+++ b/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp
@@ -131,7 +131,6 @@
     Dictionary *dictionary = (Dictionary*)dict;
     if (!dictionary) return 0;
     ProximityInfo *pInfo = (ProximityInfo*)proximityInfo;
-    if (!pInfo) return 0;
 
     int *xCoordinates = env->GetIntArrayElements(xCoordinatesArray, NULL);
     int *yCoordinates = env->GetIntArrayElements(yCoordinatesArray, NULL);
diff --git a/native/src/defines.h b/native/src/defines.h
index bdab19f..0a32405 100644
--- a/native/src/defines.h
+++ b/native/src/defines.h
@@ -140,7 +140,7 @@
 // The following "rate"s are used as a multiplier before dividing by 100, so they are in percent.
 #define WORDS_WITH_MISSING_CHARACTER_DEMOTION_RATE 80
 #define WORDS_WITH_MISSING_CHARACTER_DEMOTION_START_POS_10X 12
-#define WORDS_WITH_MISSING_SPACE_CHARACTER_DEMOTION_RATE 80
+#define WORDS_WITH_MISSING_SPACE_CHARACTER_DEMOTION_RATE 67
 #define WORDS_WITH_EXCESSIVE_CHARACTER_DEMOTION_RATE 75
 #define WORDS_WITH_EXCESSIVE_CHARACTER_OUT_OF_PROXIMITY_DEMOTION_RATE 75
 #define WORDS_WITH_TRANSPOSED_CHARACTERS_DEMOTION_RATE 60
diff --git a/native/src/dictionary.cpp b/native/src/dictionary.cpp
index d69cb2a..d9ef8f3 100644
--- a/native/src/dictionary.cpp
+++ b/native/src/dictionary.cpp
@@ -53,7 +53,7 @@
     return ((mDict[1] & 0xFF) == 1);
 }
 
-// TODO: use uint16_t instead of unsigned short
+// TODO: use uint32_t instead of unsigned short
 bool Dictionary::isValidWord(unsigned short *word, int length) {
     if (IS_LATEST_DICT_VERSION) {
         return (isValidWordRec(DICTIONARY_HEADER_SIZE, word, 0, length) != NOT_VALID_WORD);
diff --git a/native/src/unigram_dictionary.cpp b/native/src/unigram_dictionary.cpp
index 20a1852..e49e95b 100644
--- a/native/src/unigram_dictionary.cpp
+++ b/native/src/unigram_dictionary.cpp
@@ -233,7 +233,7 @@
     PROF_END(5);
 
     PROF_START(6);
-    if (SUGGEST_WORDS_WITH_SPACE_PROXIMITY) {
+    if (SUGGEST_WORDS_WITH_SPACE_PROXIMITY && proximityInfo) {
         // The first and last "mistyped spaces" are taken care of by excessive character handling
         for (int i = 1; i < codesSize - 1; ++i) {
             if (DEBUG_DICT) {
@@ -451,8 +451,8 @@
 }
 
 inline static int calcFreqForSplitTwoWords(
-        const int typedLetterMultiplier, const int firstWordLength,
-        const int secondWordLength, const int firstFreq, const int secondFreq) {
+        const int typedLetterMultiplier, const int firstWordLength, const int secondWordLength,
+        const int firstFreq, const int secondFreq, const bool isSpaceProximity) {
     if (firstWordLength == 0 || secondWordLength == 0) {
         return 0;
     }
@@ -492,13 +492,22 @@
     const int normalizedScoreDemotionRateOffset = (100 + 100 / totalLength);
     multiplyRate(normalizedScoreDemotionRateOffset, &totalFreq);
 
+    if (isSpaceProximity) {
+        // A word pair with one space proximity correction
+        if (DEBUG_DICT) {
+            LOGI("Found a word pair with space proximity correction.");
+        }
+        multiplyIntCapped(typedLetterMultiplier, &totalFreq);
+        multiplyRate(WORDS_WITH_PROXIMITY_CHARACTER_DEMOTION_RATE, &totalFreq);
+    }
+
     multiplyRate(WORDS_WITH_MISSING_SPACE_CHARACTER_DEMOTION_RATE, &totalFreq);
     return totalFreq;
 }
 
 bool UnigramDictionary::getSplitTwoWordsSuggestion(const int inputLength,
         const int firstWordStartPos, const int firstWordLength, const int secondWordStartPos,
-        const int secondWordLength) {
+        const int secondWordLength, const bool isSpaceProximity) {
     if (inputLength >= MAX_WORD_LENGTH) return false;
     if (0 >= firstWordLength || 0 >= secondWordLength || firstWordStartPos >= secondWordStartPos
             || firstWordStartPos < 0 || secondWordStartPos + secondWordLength > inputLength)
@@ -527,8 +536,8 @@
         word[i] = mWord[i - firstWordLength - 1];
     }
 
-    int pairFreq = calcFreqForSplitTwoWords(
-            TYPED_LETTER_MULTIPLIER, firstWordLength, secondWordLength, firstFreq, secondFreq);
+    int pairFreq = calcFreqForSplitTwoWords(TYPED_LETTER_MULTIPLIER, firstWordLength,
+            secondWordLength, firstFreq, secondFreq, isSpaceProximity);
     if (DEBUG_DICT) {
         LOGI("Split two words:  %d, %d, %d, %d, %d", firstFreq, secondFreq, pairFreq, inputLength,
                 TYPED_LETTER_MULTIPLIER);
@@ -539,13 +548,13 @@
 
 bool UnigramDictionary::getMissingSpaceWords(const int inputLength, const int missingSpacePos) {
     return getSplitTwoWordsSuggestion(
-            inputLength, 0, missingSpacePos, missingSpacePos, inputLength - missingSpacePos);
+            inputLength, 0, missingSpacePos, missingSpacePos, inputLength - missingSpacePos, false);
 }
 
 bool UnigramDictionary::getMistypedSpaceWords(const int inputLength, const int spaceProximityPos) {
     return getSplitTwoWordsSuggestion(
             inputLength, 0, spaceProximityPos, spaceProximityPos + 1,
-            inputLength - spaceProximityPos - 1);
+            inputLength - spaceProximityPos - 1, true);
 }
 
 // Keep this for comparing spec to new getWords
diff --git a/native/src/unigram_dictionary.h b/native/src/unigram_dictionary.h
index 3d3007c..dd1b890 100644
--- a/native/src/unigram_dictionary.h
+++ b/native/src/unigram_dictionary.h
@@ -66,7 +66,7 @@
             const int nextLettersSize);
     bool getSplitTwoWordsSuggestion(const int inputLength,
             const int firstWordStartPos, const int firstWordLength,
-            const int secondWordStartPos, const int secondWordLength);
+            const int secondWordStartPos, const int secondWordLength, const bool isSpaceProximity);
     bool getMissingSpaceWords(const int inputLength, const int missingSpacePos);
     bool getMistypedSpaceWords(const int inputLength, const int spaceProximityPos);
     // Keep getWordsOld for comparing performance between getWords and getWordsOld
diff --git a/tests/src/com/android/inputmethod/latin/SubtypeLocaleTests.java b/tests/src/com/android/inputmethod/latin/SubtypeLocaleTests.java
index d128cb3..d102aa4 100644
--- a/tests/src/com/android/inputmethod/latin/SubtypeLocaleTests.java
+++ b/tests/src/com/android/inputmethod/latin/SubtypeLocaleTests.java
@@ -16,6 +16,8 @@
 
 package com.android.inputmethod.latin;
 
+import com.android.inputmethod.latin.Utils;
+
 import android.content.Context;
 import android.content.res.Resources;
 import android.test.AndroidTestCase;
@@ -75,7 +77,7 @@
         int failedCount = 0;
         for (final InputMethodSubtype subtype : mKeyboardSubtypes) {
             final String localeCode = subtype.getLocale();
-            final Locale locale = new Locale(localeCode);
+            final Locale locale = Utils.constructLocaleFromString(localeCode);
             // The locale name which will be displayed on spacebar.  For example 'English (US)' or
             // 'Francais (Canada)'.  (c=\u008d)
             final String displayName = SubtypeLocale.getFullDisplayName(locale);
diff --git a/tests/src/com/android/inputmethod/latin/SuggestHelper.java b/tests/src/com/android/inputmethod/latin/SuggestHelper.java
index 8a11ff9..87ea011 100644
--- a/tests/src/com/android/inputmethod/latin/SuggestHelper.java
+++ b/tests/src/com/android/inputmethod/latin/SuggestHelper.java
@@ -36,7 +36,7 @@
         // Use null as the locale for Suggest so as to force it to use the internal dictionary
         // (and not try to find a dictionary provider for a specified locale)
         mSuggest = new Suggest(context, dictionaryId, null);
-        mKeyboard = new LatinKeyboard(context, keyboardId);
+        mKeyboard = new LatinKeyboard(context, keyboardId, keyboardId.mWidth);
         mKeyDetector = new KeyDetector();
         init();
     }
@@ -44,7 +44,7 @@
     protected SuggestHelper(Context context, File dictionaryPath, long startOffset, long length,
             KeyboardId keyboardId) {
         mSuggest = new Suggest(context, dictionaryPath, startOffset, length, null);
-        mKeyboard = new LatinKeyboard(context, keyboardId);
+        mKeyboard = new LatinKeyboard(context, keyboardId, keyboardId.mWidth);
         mKeyDetector = new KeyDetector();
         init();
     }
diff --git a/tests/src/com/android/inputmethod/latin/SuggestTestsBase.java b/tests/src/com/android/inputmethod/latin/SuggestTestsBase.java
index 64f2674..28766c2 100644
--- a/tests/src/com/android/inputmethod/latin/SuggestTestsBase.java
+++ b/tests/src/com/android/inputmethod/latin/SuggestTestsBase.java
@@ -38,10 +38,11 @@
         mTestPackageFile = new File(getTestContext().getApplicationInfo().sourceDir);
     }
 
-    protected static KeyboardId createKeyboardId(Locale locale) {
+    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, KeyboardId.MODE_TEXT,
+                locale, Configuration.ORIENTATION_LANDSCAPE, displayWidth, KeyboardId.MODE_TEXT,
                 new EditorInfo(), false, false, false, false);
     }