Merge "Add some virama combinations and tall-a for Myanmar"
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_active_lxx_dark.9.png b/java/res/drawable-hdpi/btn_keyboard_key_active_lxx_dark.9.png
index 82e850c..bbdc411 100644
--- a/java/res/drawable-hdpi/btn_keyboard_key_active_lxx_dark.9.png
+++ b/java/res/drawable-hdpi/btn_keyboard_key_active_lxx_dark.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_active_lxx_light.9.png b/java/res/drawable-hdpi/btn_keyboard_key_active_lxx_light.9.png
new file mode 100644
index 0000000..854c849
--- /dev/null
+++ b/java/res/drawable-hdpi/btn_keyboard_key_active_lxx_light.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_active_pressed_lxx_dark.9.png b/java/res/drawable-hdpi/btn_keyboard_key_active_pressed_lxx_dark.9.png
index e2b9e3d..33f7d80 100644
--- a/java/res/drawable-hdpi/btn_keyboard_key_active_pressed_lxx_dark.9.png
+++ b/java/res/drawable-hdpi/btn_keyboard_key_active_pressed_lxx_dark.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_active_pressed_lxx_light.9.png b/java/res/drawable-hdpi/btn_keyboard_key_active_pressed_lxx_light.9.png
new file mode 100644
index 0000000..7a7e982
--- /dev/null
+++ b/java/res/drawable-hdpi/btn_keyboard_key_active_pressed_lxx_light.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_normal_off_lxx_dark.9.png b/java/res/drawable-hdpi/btn_keyboard_key_normal_off_lxx_dark.9.png
index 2e6489c..b8bb10f 100644
--- a/java/res/drawable-hdpi/btn_keyboard_key_normal_off_lxx_dark.9.png
+++ b/java/res/drawable-hdpi/btn_keyboard_key_normal_off_lxx_dark.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_normal_off_lxx_light.9.png b/java/res/drawable-hdpi/btn_keyboard_key_normal_off_lxx_light.9.png
new file mode 100644
index 0000000..0802b11
--- /dev/null
+++ b/java/res/drawable-hdpi/btn_keyboard_key_normal_off_lxx_light.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_normal_on_lxx_dark.9.png b/java/res/drawable-hdpi/btn_keyboard_key_normal_on_lxx_dark.9.png
index 0b14822..b1f5435 100644
--- a/java/res/drawable-hdpi/btn_keyboard_key_normal_on_lxx_dark.9.png
+++ b/java/res/drawable-hdpi/btn_keyboard_key_normal_on_lxx_dark.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_normal_on_lxx_light.9.png b/java/res/drawable-hdpi/btn_keyboard_key_normal_on_lxx_light.9.png
new file mode 100644
index 0000000..f0a89c5
--- /dev/null
+++ b/java/res/drawable-hdpi/btn_keyboard_key_normal_on_lxx_light.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_popup_selected_lxx_dark.9.png b/java/res/drawable-hdpi/btn_keyboard_key_popup_selected_lxx_dark.9.png
new file mode 100644
index 0000000..0ef8cc7
--- /dev/null
+++ b/java/res/drawable-hdpi/btn_keyboard_key_popup_selected_lxx_dark.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_popup_selected_lxx_light.9.png b/java/res/drawable-hdpi/btn_keyboard_key_popup_selected_lxx_light.9.png
new file mode 100644
index 0000000..45d5865
--- /dev/null
+++ b/java/res/drawable-hdpi/btn_keyboard_key_popup_selected_lxx_light.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_pressed_off_lxx_dark.9.png b/java/res/drawable-hdpi/btn_keyboard_key_pressed_off_lxx_dark.9.png
index 4bf38fc..bfc981e 100644
--- a/java/res/drawable-hdpi/btn_keyboard_key_pressed_off_lxx_dark.9.png
+++ b/java/res/drawable-hdpi/btn_keyboard_key_pressed_off_lxx_dark.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_pressed_off_lxx_light.9.png b/java/res/drawable-hdpi/btn_keyboard_key_pressed_off_lxx_light.9.png
new file mode 100644
index 0000000..1b52bcc
--- /dev/null
+++ b/java/res/drawable-hdpi/btn_keyboard_key_pressed_off_lxx_light.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_pressed_on_lxx_dark.9.png b/java/res/drawable-hdpi/btn_keyboard_key_pressed_on_lxx_dark.9.png
index ea12c77..fbb4f8c 100644
--- a/java/res/drawable-hdpi/btn_keyboard_key_pressed_on_lxx_dark.9.png
+++ b/java/res/drawable-hdpi/btn_keyboard_key_pressed_on_lxx_dark.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_pressed_on_lxx_light.9.png b/java/res/drawable-hdpi/btn_keyboard_key_pressed_on_lxx_light.9.png
new file mode 100644
index 0000000..1bc2a23
--- /dev/null
+++ b/java/res/drawable-hdpi/btn_keyboard_key_pressed_on_lxx_light.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_key_feedback_background_lxx_dark.9.png b/java/res/drawable-hdpi/keyboard_key_feedback_background_lxx_dark.9.png
index 9d6514b..e49efe5 100644
--- a/java/res/drawable-hdpi/keyboard_key_feedback_background_lxx_dark.9.png
+++ b/java/res/drawable-hdpi/keyboard_key_feedback_background_lxx_dark.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_key_feedback_background_lxx_light.9.png b/java/res/drawable-hdpi/keyboard_key_feedback_background_lxx_light.9.png
new file mode 100644
index 0000000..615a40a
--- /dev/null
+++ b/java/res/drawable-hdpi/keyboard_key_feedback_background_lxx_light.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_key_feedback_more_background_lxx_dark.9.png b/java/res/drawable-hdpi/keyboard_key_feedback_more_background_lxx_dark.9.png
index 8ad54f6..a0511a1 100644
--- a/java/res/drawable-hdpi/keyboard_key_feedback_more_background_lxx_dark.9.png
+++ b/java/res/drawable-hdpi/keyboard_key_feedback_more_background_lxx_dark.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_key_feedback_more_background_lxx_light.9.png b/java/res/drawable-hdpi/keyboard_key_feedback_more_background_lxx_light.9.png
new file mode 100644
index 0000000..c5871f6
--- /dev/null
+++ b/java/res/drawable-hdpi/keyboard_key_feedback_more_background_lxx_light.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_popup_panel_background_lxx_dark.9.png b/java/res/drawable-hdpi/keyboard_popup_panel_background_lxx_dark.9.png
index f9dd3b8..c7b147f 100644
--- a/java/res/drawable-hdpi/keyboard_popup_panel_background_lxx_dark.9.png
+++ b/java/res/drawable-hdpi/keyboard_popup_panel_background_lxx_dark.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_popup_panel_background_lxx_light.9.png b/java/res/drawable-hdpi/keyboard_popup_panel_background_lxx_light.9.png
new file mode 100644
index 0000000..41b0a1b
--- /dev/null
+++ b/java/res/drawable-hdpi/keyboard_popup_panel_background_lxx_light.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/suggestions_strip_divider.png b/java/res/drawable-hdpi/suggestions_strip_divider_holo.png
similarity index 100%
rename from java/res/drawable-hdpi/suggestions_strip_divider.png
rename to java/res/drawable-hdpi/suggestions_strip_divider_holo.png
Binary files differ
diff --git a/java/res/drawable-hdpi/suggestions_strip_divider_lxx_dark.png b/java/res/drawable-hdpi/suggestions_strip_divider_lxx_dark.png
new file mode 100644
index 0000000..68a2270
--- /dev/null
+++ b/java/res/drawable-hdpi/suggestions_strip_divider_lxx_dark.png
Binary files differ
diff --git a/java/res/drawable-hdpi/suggestions_strip_divider_lxx_light.png b/java/res/drawable-hdpi/suggestions_strip_divider_lxx_light.png
new file mode 100644
index 0000000..12485ef
--- /dev/null
+++ b/java/res/drawable-hdpi/suggestions_strip_divider_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_delete_lxx_dark.png b/java/res/drawable-hdpi/sym_keyboard_delete_lxx_dark.png
index 5f5eb3f..2e68b20 100644
--- a/java/res/drawable-hdpi/sym_keyboard_delete_lxx_dark.png
+++ b/java/res/drawable-hdpi/sym_keyboard_delete_lxx_dark.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_delete_lxx_light.png b/java/res/drawable-hdpi/sym_keyboard_delete_lxx_light.png
new file mode 100644
index 0000000..e17d297
--- /dev/null
+++ b/java/res/drawable-hdpi/sym_keyboard_delete_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_done_lxx_light.png b/java/res/drawable-hdpi/sym_keyboard_done_lxx_light.png
new file mode 100644
index 0000000..04eab59
--- /dev/null
+++ b/java/res/drawable-hdpi/sym_keyboard_done_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_go_lxx_light.png b/java/res/drawable-hdpi/sym_keyboard_go_lxx_light.png
new file mode 100644
index 0000000..189d609
--- /dev/null
+++ b/java/res/drawable-hdpi/sym_keyboard_go_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_language_switch_lxx_dark.png b/java/res/drawable-hdpi/sym_keyboard_language_switch_lxx_dark.png
index edf9a20..4fc82d6 100644
--- a/java/res/drawable-hdpi/sym_keyboard_language_switch_lxx_dark.png
+++ b/java/res/drawable-hdpi/sym_keyboard_language_switch_lxx_dark.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_language_switch_lxx_light.png b/java/res/drawable-hdpi/sym_keyboard_language_switch_lxx_light.png
new file mode 100644
index 0000000..1c7af20
--- /dev/null
+++ b/java/res/drawable-hdpi/sym_keyboard_language_switch_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_next_lxx_light.png b/java/res/drawable-hdpi/sym_keyboard_next_lxx_light.png
new file mode 100644
index 0000000..70679b0
--- /dev/null
+++ b/java/res/drawable-hdpi/sym_keyboard_next_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_previous_lxx_light.png b/java/res/drawable-hdpi/sym_keyboard_previous_lxx_light.png
new file mode 100644
index 0000000..952dd4f
--- /dev/null
+++ b/java/res/drawable-hdpi/sym_keyboard_previous_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_return_lxx_light.png b/java/res/drawable-hdpi/sym_keyboard_return_lxx_light.png
new file mode 100644
index 0000000..9ab1a3f
--- /dev/null
+++ b/java/res/drawable-hdpi/sym_keyboard_return_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_search_lxx_light.png b/java/res/drawable-hdpi/sym_keyboard_search_lxx_light.png
new file mode 100644
index 0000000..ec70627
--- /dev/null
+++ b/java/res/drawable-hdpi/sym_keyboard_search_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_send_lxx_light.png b/java/res/drawable-hdpi/sym_keyboard_send_lxx_light.png
new file mode 100644
index 0000000..bbc5094
--- /dev/null
+++ b/java/res/drawable-hdpi/sym_keyboard_send_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_settings_lxx_dark.png b/java/res/drawable-hdpi/sym_keyboard_settings_lxx_dark.png
index f261302..23eac16 100644
--- a/java/res/drawable-hdpi/sym_keyboard_settings_lxx_dark.png
+++ b/java/res/drawable-hdpi/sym_keyboard_settings_lxx_dark.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_settings_lxx_light.png b/java/res/drawable-hdpi/sym_keyboard_settings_lxx_light.png
new file mode 100644
index 0000000..144b15b
--- /dev/null
+++ b/java/res/drawable-hdpi/sym_keyboard_settings_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_shift_locked_lxx_light.png b/java/res/drawable-hdpi/sym_keyboard_shift_locked_lxx_light.png
new file mode 100644
index 0000000..657f65a
--- /dev/null
+++ b/java/res/drawable-hdpi/sym_keyboard_shift_locked_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_shift_lxx_dark.png b/java/res/drawable-hdpi/sym_keyboard_shift_lxx_dark.png
index cb03e55..427f014 100644
--- a/java/res/drawable-hdpi/sym_keyboard_shift_lxx_dark.png
+++ b/java/res/drawable-hdpi/sym_keyboard_shift_lxx_dark.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_shift_lxx_light.png b/java/res/drawable-hdpi/sym_keyboard_shift_lxx_light.png
new file mode 100644
index 0000000..a46d653
--- /dev/null
+++ b/java/res/drawable-hdpi/sym_keyboard_shift_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_smiley_lxx_dark.png b/java/res/drawable-hdpi/sym_keyboard_smiley_lxx_dark.png
index 3999d1e..2cfe1d4 100644
--- a/java/res/drawable-hdpi/sym_keyboard_smiley_lxx_dark.png
+++ b/java/res/drawable-hdpi/sym_keyboard_smiley_lxx_dark.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_smiley_lxx_light.png b/java/res/drawable-hdpi/sym_keyboard_smiley_lxx_light.png
new file mode 100644
index 0000000..2cfe1d4
--- /dev/null
+++ b/java/res/drawable-hdpi/sym_keyboard_smiley_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_spacebar_lxx_dark.9.png b/java/res/drawable-hdpi/sym_keyboard_spacebar_lxx_dark.9.png
index f344dee..c57cb73 100644
--- a/java/res/drawable-hdpi/sym_keyboard_spacebar_lxx_dark.9.png
+++ b/java/res/drawable-hdpi/sym_keyboard_spacebar_lxx_dark.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_spacebar_lxx_light.9.png b/java/res/drawable-hdpi/sym_keyboard_spacebar_lxx_light.9.png
new file mode 100644
index 0000000..c27a36e
--- /dev/null
+++ b/java/res/drawable-hdpi/sym_keyboard_spacebar_lxx_light.9.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_voice_lxx_dark.png b/java/res/drawable-hdpi/sym_keyboard_voice_lxx_dark.png
index 6b68c8a..80d1248 100644
--- a/java/res/drawable-hdpi/sym_keyboard_voice_lxx_dark.png
+++ b/java/res/drawable-hdpi/sym_keyboard_voice_lxx_dark.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_voice_lxx_light.png b/java/res/drawable-hdpi/sym_keyboard_voice_lxx_light.png
new file mode 100644
index 0000000..d6b070e
--- /dev/null
+++ b/java/res/drawable-hdpi/sym_keyboard_voice_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_voice_off_lxx_dark.png b/java/res/drawable-hdpi/sym_keyboard_voice_off_lxx_dark.png
index e67697b..e2bd604 100644
--- a/java/res/drawable-hdpi/sym_keyboard_voice_off_lxx_dark.png
+++ b/java/res/drawable-hdpi/sym_keyboard_voice_off_lxx_dark.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_voice_off_lxx_light.png b/java/res/drawable-hdpi/sym_keyboard_voice_off_lxx_light.png
new file mode 100644
index 0000000..d33ab4e
--- /dev/null
+++ b/java/res/drawable-hdpi/sym_keyboard_voice_off_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-mdpi/btn_keyboard_key_active_lxx_dark.9.png b/java/res/drawable-mdpi/btn_keyboard_key_active_lxx_dark.9.png
index 281b5d3..787ce45 100644
--- a/java/res/drawable-mdpi/btn_keyboard_key_active_lxx_dark.9.png
+++ b/java/res/drawable-mdpi/btn_keyboard_key_active_lxx_dark.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/btn_keyboard_key_active_lxx_light.9.png b/java/res/drawable-mdpi/btn_keyboard_key_active_lxx_light.9.png
new file mode 100644
index 0000000..e7a585b
--- /dev/null
+++ b/java/res/drawable-mdpi/btn_keyboard_key_active_lxx_light.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/btn_keyboard_key_active_pressed_lxx_dark.9.png b/java/res/drawable-mdpi/btn_keyboard_key_active_pressed_lxx_dark.9.png
index eb15643..7e34c6c 100644
--- a/java/res/drawable-mdpi/btn_keyboard_key_active_pressed_lxx_dark.9.png
+++ b/java/res/drawable-mdpi/btn_keyboard_key_active_pressed_lxx_dark.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/btn_keyboard_key_active_pressed_lxx_light.9.png b/java/res/drawable-mdpi/btn_keyboard_key_active_pressed_lxx_light.9.png
new file mode 100644
index 0000000..5a65133
--- /dev/null
+++ b/java/res/drawable-mdpi/btn_keyboard_key_active_pressed_lxx_light.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/btn_keyboard_key_normal_off_lxx_dark.9.png b/java/res/drawable-mdpi/btn_keyboard_key_normal_off_lxx_dark.9.png
index 9f244f2..bb9fc59 100644
--- a/java/res/drawable-mdpi/btn_keyboard_key_normal_off_lxx_dark.9.png
+++ b/java/res/drawable-mdpi/btn_keyboard_key_normal_off_lxx_dark.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/btn_keyboard_key_normal_off_lxx_light.9.png b/java/res/drawable-mdpi/btn_keyboard_key_normal_off_lxx_light.9.png
new file mode 100644
index 0000000..afcb4f9
--- /dev/null
+++ b/java/res/drawable-mdpi/btn_keyboard_key_normal_off_lxx_light.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/btn_keyboard_key_normal_on_lxx_dark.9.png b/java/res/drawable-mdpi/btn_keyboard_key_normal_on_lxx_dark.9.png
index c5b3fbb..5b23e22 100644
--- a/java/res/drawable-mdpi/btn_keyboard_key_normal_on_lxx_dark.9.png
+++ b/java/res/drawable-mdpi/btn_keyboard_key_normal_on_lxx_dark.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/btn_keyboard_key_normal_on_lxx_light.9.png b/java/res/drawable-mdpi/btn_keyboard_key_normal_on_lxx_light.9.png
new file mode 100644
index 0000000..3323d2c
--- /dev/null
+++ b/java/res/drawable-mdpi/btn_keyboard_key_normal_on_lxx_light.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/btn_keyboard_key_popup_selected_lxx_dark.9.png b/java/res/drawable-mdpi/btn_keyboard_key_popup_selected_lxx_dark.9.png
new file mode 100644
index 0000000..cf12a8c
--- /dev/null
+++ b/java/res/drawable-mdpi/btn_keyboard_key_popup_selected_lxx_dark.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/btn_keyboard_key_popup_selected_lxx_light.9.png b/java/res/drawable-mdpi/btn_keyboard_key_popup_selected_lxx_light.9.png
new file mode 100644
index 0000000..e388cfb
--- /dev/null
+++ b/java/res/drawable-mdpi/btn_keyboard_key_popup_selected_lxx_light.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/btn_keyboard_key_pressed_off_lxx_dark.9.png b/java/res/drawable-mdpi/btn_keyboard_key_pressed_off_lxx_dark.9.png
index 66824cf..1b0ed0c 100644
--- a/java/res/drawable-mdpi/btn_keyboard_key_pressed_off_lxx_dark.9.png
+++ b/java/res/drawable-mdpi/btn_keyboard_key_pressed_off_lxx_dark.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/btn_keyboard_key_pressed_off_lxx_light.9.png b/java/res/drawable-mdpi/btn_keyboard_key_pressed_off_lxx_light.9.png
new file mode 100644
index 0000000..d8e4355
--- /dev/null
+++ b/java/res/drawable-mdpi/btn_keyboard_key_pressed_off_lxx_light.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/btn_keyboard_key_pressed_on_lxx_dark.9.png b/java/res/drawable-mdpi/btn_keyboard_key_pressed_on_lxx_dark.9.png
index 527dfd0..f990a9e 100644
--- a/java/res/drawable-mdpi/btn_keyboard_key_pressed_on_lxx_dark.9.png
+++ b/java/res/drawable-mdpi/btn_keyboard_key_pressed_on_lxx_dark.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/btn_keyboard_key_pressed_on_lxx_light.9.png b/java/res/drawable-mdpi/btn_keyboard_key_pressed_on_lxx_light.9.png
new file mode 100644
index 0000000..b9a42fa
--- /dev/null
+++ b/java/res/drawable-mdpi/btn_keyboard_key_pressed_on_lxx_light.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_key_feedback_background_lxx_dark.9.png b/java/res/drawable-mdpi/keyboard_key_feedback_background_lxx_dark.9.png
index d320092..8bd1343 100644
--- a/java/res/drawable-mdpi/keyboard_key_feedback_background_lxx_dark.9.png
+++ b/java/res/drawable-mdpi/keyboard_key_feedback_background_lxx_dark.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_key_feedback_background_lxx_light.9.png b/java/res/drawable-mdpi/keyboard_key_feedback_background_lxx_light.9.png
new file mode 100644
index 0000000..f97cfb9
--- /dev/null
+++ b/java/res/drawable-mdpi/keyboard_key_feedback_background_lxx_light.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_key_feedback_more_background_lxx_dark.9.png b/java/res/drawable-mdpi/keyboard_key_feedback_more_background_lxx_dark.9.png
index 60a3633..37e45fb 100644
--- a/java/res/drawable-mdpi/keyboard_key_feedback_more_background_lxx_dark.9.png
+++ b/java/res/drawable-mdpi/keyboard_key_feedback_more_background_lxx_dark.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_key_feedback_more_background_lxx_light.9.png b/java/res/drawable-mdpi/keyboard_key_feedback_more_background_lxx_light.9.png
new file mode 100644
index 0000000..1fe06f9
--- /dev/null
+++ b/java/res/drawable-mdpi/keyboard_key_feedback_more_background_lxx_light.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_popup_panel_background_lxx_dark.9.png b/java/res/drawable-mdpi/keyboard_popup_panel_background_lxx_dark.9.png
index 8965055..f12ba5f 100644
--- a/java/res/drawable-mdpi/keyboard_popup_panel_background_lxx_dark.9.png
+++ b/java/res/drawable-mdpi/keyboard_popup_panel_background_lxx_dark.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_popup_panel_background_lxx_light.9.png b/java/res/drawable-mdpi/keyboard_popup_panel_background_lxx_light.9.png
new file mode 100644
index 0000000..1edf94f
--- /dev/null
+++ b/java/res/drawable-mdpi/keyboard_popup_panel_background_lxx_light.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/suggestions_strip_divider.png b/java/res/drawable-mdpi/suggestions_strip_divider_holo.png
similarity index 100%
rename from java/res/drawable-mdpi/suggestions_strip_divider.png
rename to java/res/drawable-mdpi/suggestions_strip_divider_holo.png
Binary files differ
diff --git a/java/res/drawable-mdpi/suggestions_strip_divider_lxx_dark.png b/java/res/drawable-mdpi/suggestions_strip_divider_lxx_dark.png
new file mode 100644
index 0000000..c8afc66
--- /dev/null
+++ b/java/res/drawable-mdpi/suggestions_strip_divider_lxx_dark.png
Binary files differ
diff --git a/java/res/drawable-mdpi/suggestions_strip_divider_lxx_light.png b/java/res/drawable-mdpi/suggestions_strip_divider_lxx_light.png
new file mode 100644
index 0000000..051e66c
--- /dev/null
+++ b/java/res/drawable-mdpi/suggestions_strip_divider_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_delete_lxx_dark.png b/java/res/drawable-mdpi/sym_keyboard_delete_lxx_dark.png
index 2d3ac97..ba74e5e 100644
--- a/java/res/drawable-mdpi/sym_keyboard_delete_lxx_dark.png
+++ b/java/res/drawable-mdpi/sym_keyboard_delete_lxx_dark.png
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_delete_lxx_light.png b/java/res/drawable-mdpi/sym_keyboard_delete_lxx_light.png
new file mode 100644
index 0000000..007b5ea
--- /dev/null
+++ b/java/res/drawable-mdpi/sym_keyboard_delete_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_done_lxx_light.png b/java/res/drawable-mdpi/sym_keyboard_done_lxx_light.png
new file mode 100644
index 0000000..930f971
--- /dev/null
+++ b/java/res/drawable-mdpi/sym_keyboard_done_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_go_lxx_light.png b/java/res/drawable-mdpi/sym_keyboard_go_lxx_light.png
new file mode 100644
index 0000000..f9975c3
--- /dev/null
+++ b/java/res/drawable-mdpi/sym_keyboard_go_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_language_switch_lxx_dark.png b/java/res/drawable-mdpi/sym_keyboard_language_switch_lxx_dark.png
index a90bf75..44dc1b6 100644
--- a/java/res/drawable-mdpi/sym_keyboard_language_switch_lxx_dark.png
+++ b/java/res/drawable-mdpi/sym_keyboard_language_switch_lxx_dark.png
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_language_switch_lxx_light.png b/java/res/drawable-mdpi/sym_keyboard_language_switch_lxx_light.png
new file mode 100644
index 0000000..e1c1265
--- /dev/null
+++ b/java/res/drawable-mdpi/sym_keyboard_language_switch_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_next_lxx_light.png b/java/res/drawable-mdpi/sym_keyboard_next_lxx_light.png
new file mode 100644
index 0000000..e18b1cf
--- /dev/null
+++ b/java/res/drawable-mdpi/sym_keyboard_next_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_previous_lxx_light.png b/java/res/drawable-mdpi/sym_keyboard_previous_lxx_light.png
new file mode 100644
index 0000000..2044db6
--- /dev/null
+++ b/java/res/drawable-mdpi/sym_keyboard_previous_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_return_lxx_light.png b/java/res/drawable-mdpi/sym_keyboard_return_lxx_light.png
new file mode 100644
index 0000000..bfc7d71
--- /dev/null
+++ b/java/res/drawable-mdpi/sym_keyboard_return_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_search_lxx_light.png b/java/res/drawable-mdpi/sym_keyboard_search_lxx_light.png
new file mode 100644
index 0000000..05fbe83
--- /dev/null
+++ b/java/res/drawable-mdpi/sym_keyboard_search_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_send_lxx_light.png b/java/res/drawable-mdpi/sym_keyboard_send_lxx_light.png
new file mode 100644
index 0000000..2de9b56
--- /dev/null
+++ b/java/res/drawable-mdpi/sym_keyboard_send_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_settings_lxx_dark.png b/java/res/drawable-mdpi/sym_keyboard_settings_lxx_dark.png
index dea7add..a04f4f5 100644
--- a/java/res/drawable-mdpi/sym_keyboard_settings_lxx_dark.png
+++ b/java/res/drawable-mdpi/sym_keyboard_settings_lxx_dark.png
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_settings_lxx_light.png b/java/res/drawable-mdpi/sym_keyboard_settings_lxx_light.png
new file mode 100644
index 0000000..f70030b
--- /dev/null
+++ b/java/res/drawable-mdpi/sym_keyboard_settings_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_shift_locked_lxx_light.png b/java/res/drawable-mdpi/sym_keyboard_shift_locked_lxx_light.png
new file mode 100644
index 0000000..298cb95
--- /dev/null
+++ b/java/res/drawable-mdpi/sym_keyboard_shift_locked_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_shift_lxx_dark.png b/java/res/drawable-mdpi/sym_keyboard_shift_lxx_dark.png
index c10066e..d5bd44c 100644
--- a/java/res/drawable-mdpi/sym_keyboard_shift_lxx_dark.png
+++ b/java/res/drawable-mdpi/sym_keyboard_shift_lxx_dark.png
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_shift_lxx_light.png b/java/res/drawable-mdpi/sym_keyboard_shift_lxx_light.png
new file mode 100644
index 0000000..056fc51
--- /dev/null
+++ b/java/res/drawable-mdpi/sym_keyboard_shift_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_smiley_lxx_dark.png b/java/res/drawable-mdpi/sym_keyboard_smiley_lxx_dark.png
index 8276d99..2258851 100644
--- a/java/res/drawable-mdpi/sym_keyboard_smiley_lxx_dark.png
+++ b/java/res/drawable-mdpi/sym_keyboard_smiley_lxx_dark.png
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_smiley_lxx_light.png b/java/res/drawable-mdpi/sym_keyboard_smiley_lxx_light.png
new file mode 100644
index 0000000..ff49d58
--- /dev/null
+++ b/java/res/drawable-mdpi/sym_keyboard_smiley_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_spacebar_lxx_dark.9.png b/java/res/drawable-mdpi/sym_keyboard_spacebar_lxx_dark.9.png
index ed32cf6..30892b8 100644
--- a/java/res/drawable-mdpi/sym_keyboard_spacebar_lxx_dark.9.png
+++ b/java/res/drawable-mdpi/sym_keyboard_spacebar_lxx_dark.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_spacebar_lxx_light.9.png b/java/res/drawable-mdpi/sym_keyboard_spacebar_lxx_light.9.png
new file mode 100644
index 0000000..ab64cd6
--- /dev/null
+++ b/java/res/drawable-mdpi/sym_keyboard_spacebar_lxx_light.9.png
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_voice_lxx_dark.png b/java/res/drawable-mdpi/sym_keyboard_voice_lxx_dark.png
index 5661f6b..d40b106 100644
--- a/java/res/drawable-mdpi/sym_keyboard_voice_lxx_dark.png
+++ b/java/res/drawable-mdpi/sym_keyboard_voice_lxx_dark.png
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_voice_lxx_light.png b/java/res/drawable-mdpi/sym_keyboard_voice_lxx_light.png
new file mode 100644
index 0000000..0ddcb79
--- /dev/null
+++ b/java/res/drawable-mdpi/sym_keyboard_voice_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_voice_off_lxx_dark.png b/java/res/drawable-mdpi/sym_keyboard_voice_off_lxx_dark.png
index 5182f1e..7bde452e 100644
--- a/java/res/drawable-mdpi/sym_keyboard_voice_off_lxx_dark.png
+++ b/java/res/drawable-mdpi/sym_keyboard_voice_off_lxx_dark.png
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_voice_off_lxx_light.png b/java/res/drawable-mdpi/sym_keyboard_voice_off_lxx_light.png
new file mode 100644
index 0000000..8831bc0
--- /dev/null
+++ b/java/res/drawable-mdpi/sym_keyboard_voice_off_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_active_lxx_dark.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_active_lxx_dark.9.png
index 0f6a3e1..4726406 100644
--- a/java/res/drawable-xhdpi/btn_keyboard_key_active_lxx_dark.9.png
+++ b/java/res/drawable-xhdpi/btn_keyboard_key_active_lxx_dark.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_active_lxx_light.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_active_lxx_light.9.png
new file mode 100644
index 0000000..dca7a32
--- /dev/null
+++ b/java/res/drawable-xhdpi/btn_keyboard_key_active_lxx_light.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_active_pressed_lxx_dark.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_active_pressed_lxx_dark.9.png
index 44c84f1..8063fcd 100644
--- a/java/res/drawable-xhdpi/btn_keyboard_key_active_pressed_lxx_dark.9.png
+++ b/java/res/drawable-xhdpi/btn_keyboard_key_active_pressed_lxx_dark.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_active_pressed_lxx_light.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_active_pressed_lxx_light.9.png
new file mode 100644
index 0000000..fa32a2c
--- /dev/null
+++ b/java/res/drawable-xhdpi/btn_keyboard_key_active_pressed_lxx_light.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_normal_off_lxx_dark.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_normal_off_lxx_dark.9.png
index 98c085b..daa3c8a 100644
--- a/java/res/drawable-xhdpi/btn_keyboard_key_normal_off_lxx_dark.9.png
+++ b/java/res/drawable-xhdpi/btn_keyboard_key_normal_off_lxx_dark.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_normal_off_lxx_light.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_normal_off_lxx_light.9.png
new file mode 100644
index 0000000..e58df5c
--- /dev/null
+++ b/java/res/drawable-xhdpi/btn_keyboard_key_normal_off_lxx_light.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_normal_on_lxx_dark.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_normal_on_lxx_dark.9.png
index f0c1328..ea002f5 100644
--- a/java/res/drawable-xhdpi/btn_keyboard_key_normal_on_lxx_dark.9.png
+++ b/java/res/drawable-xhdpi/btn_keyboard_key_normal_on_lxx_dark.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_normal_on_lxx_light.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_normal_on_lxx_light.9.png
new file mode 100644
index 0000000..5a95073
--- /dev/null
+++ b/java/res/drawable-xhdpi/btn_keyboard_key_normal_on_lxx_light.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_popup_selected_lxx_dark.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_popup_selected_lxx_dark.9.png
new file mode 100644
index 0000000..4c024e2
--- /dev/null
+++ b/java/res/drawable-xhdpi/btn_keyboard_key_popup_selected_lxx_dark.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_popup_selected_lxx_light.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_popup_selected_lxx_light.9.png
new file mode 100644
index 0000000..0b340e2
--- /dev/null
+++ b/java/res/drawable-xhdpi/btn_keyboard_key_popup_selected_lxx_light.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_pressed_off_lxx_dark.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_pressed_off_lxx_dark.9.png
index a2b17ba..10a6ab5 100644
--- a/java/res/drawable-xhdpi/btn_keyboard_key_pressed_off_lxx_dark.9.png
+++ b/java/res/drawable-xhdpi/btn_keyboard_key_pressed_off_lxx_dark.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_pressed_off_lxx_light.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_pressed_off_lxx_light.9.png
new file mode 100644
index 0000000..58b7054
--- /dev/null
+++ b/java/res/drawable-xhdpi/btn_keyboard_key_pressed_off_lxx_light.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_pressed_on_lxx_dark.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_pressed_on_lxx_dark.9.png
index 99ff0af..e6227c3 100644
--- a/java/res/drawable-xhdpi/btn_keyboard_key_pressed_on_lxx_dark.9.png
+++ b/java/res/drawable-xhdpi/btn_keyboard_key_pressed_on_lxx_dark.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_pressed_on_lxx_light.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_pressed_on_lxx_light.9.png
new file mode 100644
index 0000000..3da5f47
--- /dev/null
+++ b/java/res/drawable-xhdpi/btn_keyboard_key_pressed_on_lxx_light.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/keyboard_key_feedback_background_lxx_dark.9.png b/java/res/drawable-xhdpi/keyboard_key_feedback_background_lxx_dark.9.png
index d40afeb..8407877 100644
--- a/java/res/drawable-xhdpi/keyboard_key_feedback_background_lxx_dark.9.png
+++ b/java/res/drawable-xhdpi/keyboard_key_feedback_background_lxx_dark.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/keyboard_key_feedback_background_lxx_light.9.png b/java/res/drawable-xhdpi/keyboard_key_feedback_background_lxx_light.9.png
new file mode 100644
index 0000000..bd6ec94
--- /dev/null
+++ b/java/res/drawable-xhdpi/keyboard_key_feedback_background_lxx_light.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/keyboard_key_feedback_more_background_lxx_dark.9.png b/java/res/drawable-xhdpi/keyboard_key_feedback_more_background_lxx_dark.9.png
index d1a2f75..630340f 100644
--- a/java/res/drawable-xhdpi/keyboard_key_feedback_more_background_lxx_dark.9.png
+++ b/java/res/drawable-xhdpi/keyboard_key_feedback_more_background_lxx_dark.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/keyboard_key_feedback_more_background_lxx_light.9.png b/java/res/drawable-xhdpi/keyboard_key_feedback_more_background_lxx_light.9.png
new file mode 100644
index 0000000..eef27a3
--- /dev/null
+++ b/java/res/drawable-xhdpi/keyboard_key_feedback_more_background_lxx_light.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/keyboard_popup_panel_background_lxx_dark.9.png b/java/res/drawable-xhdpi/keyboard_popup_panel_background_lxx_dark.9.png
index 36df715..19957fa 100644
--- a/java/res/drawable-xhdpi/keyboard_popup_panel_background_lxx_dark.9.png
+++ b/java/res/drawable-xhdpi/keyboard_popup_panel_background_lxx_dark.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/keyboard_popup_panel_background_lxx_light.9.png b/java/res/drawable-xhdpi/keyboard_popup_panel_background_lxx_light.9.png
new file mode 100644
index 0000000..8a51d71
--- /dev/null
+++ b/java/res/drawable-xhdpi/keyboard_popup_panel_background_lxx_light.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/suggestions_strip_divider.png b/java/res/drawable-xhdpi/suggestions_strip_divider_holo.png
similarity index 100%
rename from java/res/drawable-xhdpi/suggestions_strip_divider.png
rename to java/res/drawable-xhdpi/suggestions_strip_divider_holo.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/suggestions_strip_divider_lxx_dark.png b/java/res/drawable-xhdpi/suggestions_strip_divider_lxx_dark.png
new file mode 100644
index 0000000..0334602
--- /dev/null
+++ b/java/res/drawable-xhdpi/suggestions_strip_divider_lxx_dark.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/suggestions_strip_divider_lxx_light.png b/java/res/drawable-xhdpi/suggestions_strip_divider_lxx_light.png
new file mode 100644
index 0000000..0047e5c
--- /dev/null
+++ b/java/res/drawable-xhdpi/suggestions_strip_divider_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/sym_keyboard_delete_lxx_dark.png b/java/res/drawable-xhdpi/sym_keyboard_delete_lxx_dark.png
index 7c9f34f..ffb9598 100644
--- a/java/res/drawable-xhdpi/sym_keyboard_delete_lxx_dark.png
+++ b/java/res/drawable-xhdpi/sym_keyboard_delete_lxx_dark.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/sym_keyboard_delete_lxx_light.png b/java/res/drawable-xhdpi/sym_keyboard_delete_lxx_light.png
new file mode 100644
index 0000000..df4e358
--- /dev/null
+++ b/java/res/drawable-xhdpi/sym_keyboard_delete_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/sym_keyboard_done_lxx_light.png b/java/res/drawable-xhdpi/sym_keyboard_done_lxx_light.png
new file mode 100644
index 0000000..070fe8d
--- /dev/null
+++ b/java/res/drawable-xhdpi/sym_keyboard_done_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/sym_keyboard_go_lxx_light.png b/java/res/drawable-xhdpi/sym_keyboard_go_lxx_light.png
new file mode 100644
index 0000000..33bbe3c
--- /dev/null
+++ b/java/res/drawable-xhdpi/sym_keyboard_go_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/sym_keyboard_language_switch_lxx_dark.png b/java/res/drawable-xhdpi/sym_keyboard_language_switch_lxx_dark.png
index f964346..bdc1267 100644
--- a/java/res/drawable-xhdpi/sym_keyboard_language_switch_lxx_dark.png
+++ b/java/res/drawable-xhdpi/sym_keyboard_language_switch_lxx_dark.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/sym_keyboard_language_switch_lxx_light.png b/java/res/drawable-xhdpi/sym_keyboard_language_switch_lxx_light.png
new file mode 100644
index 0000000..023e647
--- /dev/null
+++ b/java/res/drawable-xhdpi/sym_keyboard_language_switch_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/sym_keyboard_next_lxx_light.png b/java/res/drawable-xhdpi/sym_keyboard_next_lxx_light.png
new file mode 100644
index 0000000..2c1fe6d
--- /dev/null
+++ b/java/res/drawable-xhdpi/sym_keyboard_next_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/sym_keyboard_previous_lxx_light.png b/java/res/drawable-xhdpi/sym_keyboard_previous_lxx_light.png
new file mode 100644
index 0000000..49b2651
--- /dev/null
+++ b/java/res/drawable-xhdpi/sym_keyboard_previous_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/sym_keyboard_return_lxx_light.png b/java/res/drawable-xhdpi/sym_keyboard_return_lxx_light.png
new file mode 100644
index 0000000..85473bc
--- /dev/null
+++ b/java/res/drawable-xhdpi/sym_keyboard_return_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/sym_keyboard_search_lxx_light.png b/java/res/drawable-xhdpi/sym_keyboard_search_lxx_light.png
new file mode 100644
index 0000000..a95d554
--- /dev/null
+++ b/java/res/drawable-xhdpi/sym_keyboard_search_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/sym_keyboard_send_lxx_light.png b/java/res/drawable-xhdpi/sym_keyboard_send_lxx_light.png
new file mode 100644
index 0000000..21b0ac0
--- /dev/null
+++ b/java/res/drawable-xhdpi/sym_keyboard_send_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/sym_keyboard_settings_lxx_dark.png b/java/res/drawable-xhdpi/sym_keyboard_settings_lxx_dark.png
index 8c83d9f..ec72c38 100644
--- a/java/res/drawable-xhdpi/sym_keyboard_settings_lxx_dark.png
+++ b/java/res/drawable-xhdpi/sym_keyboard_settings_lxx_dark.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/sym_keyboard_settings_lxx_light.png b/java/res/drawable-xhdpi/sym_keyboard_settings_lxx_light.png
new file mode 100644
index 0000000..d46c26b
--- /dev/null
+++ b/java/res/drawable-xhdpi/sym_keyboard_settings_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/sym_keyboard_shift_locked_lxx_light.png b/java/res/drawable-xhdpi/sym_keyboard_shift_locked_lxx_light.png
new file mode 100644
index 0000000..64fdb17
--- /dev/null
+++ b/java/res/drawable-xhdpi/sym_keyboard_shift_locked_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/sym_keyboard_shift_lxx_dark.png b/java/res/drawable-xhdpi/sym_keyboard_shift_lxx_dark.png
index 19acffa..bf55605 100644
--- a/java/res/drawable-xhdpi/sym_keyboard_shift_lxx_dark.png
+++ b/java/res/drawable-xhdpi/sym_keyboard_shift_lxx_dark.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/sym_keyboard_shift_lxx_light.png b/java/res/drawable-xhdpi/sym_keyboard_shift_lxx_light.png
new file mode 100644
index 0000000..3a56ed9
--- /dev/null
+++ b/java/res/drawable-xhdpi/sym_keyboard_shift_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/sym_keyboard_smiley_lxx_dark.png b/java/res/drawable-xhdpi/sym_keyboard_smiley_lxx_dark.png
index 78923fa..a1d4b22 100644
--- a/java/res/drawable-xhdpi/sym_keyboard_smiley_lxx_dark.png
+++ b/java/res/drawable-xhdpi/sym_keyboard_smiley_lxx_dark.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/sym_keyboard_smiley_lxx_light.png b/java/res/drawable-xhdpi/sym_keyboard_smiley_lxx_light.png
new file mode 100644
index 0000000..df3eba7
--- /dev/null
+++ b/java/res/drawable-xhdpi/sym_keyboard_smiley_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/sym_keyboard_spacebar_lxx_dark.9.png b/java/res/drawable-xhdpi/sym_keyboard_spacebar_lxx_dark.9.png
index 71234e5..9eaa005 100644
--- a/java/res/drawable-xhdpi/sym_keyboard_spacebar_lxx_dark.9.png
+++ b/java/res/drawable-xhdpi/sym_keyboard_spacebar_lxx_dark.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/sym_keyboard_spacebar_lxx_light.9.png b/java/res/drawable-xhdpi/sym_keyboard_spacebar_lxx_light.9.png
new file mode 100644
index 0000000..0cf38f2
--- /dev/null
+++ b/java/res/drawable-xhdpi/sym_keyboard_spacebar_lxx_light.9.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/sym_keyboard_voice_lxx_dark.png b/java/res/drawable-xhdpi/sym_keyboard_voice_lxx_dark.png
index 4e9631e..5c2b406 100644
--- a/java/res/drawable-xhdpi/sym_keyboard_voice_lxx_dark.png
+++ b/java/res/drawable-xhdpi/sym_keyboard_voice_lxx_dark.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/sym_keyboard_voice_lxx_light.png b/java/res/drawable-xhdpi/sym_keyboard_voice_lxx_light.png
new file mode 100644
index 0000000..c9b2504
--- /dev/null
+++ b/java/res/drawable-xhdpi/sym_keyboard_voice_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/sym_keyboard_voice_off_lxx_dark.png b/java/res/drawable-xhdpi/sym_keyboard_voice_off_lxx_dark.png
index 66c0e3c..a32f741 100644
--- a/java/res/drawable-xhdpi/sym_keyboard_voice_off_lxx_dark.png
+++ b/java/res/drawable-xhdpi/sym_keyboard_voice_off_lxx_dark.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/sym_keyboard_voice_off_lxx_light.png b/java/res/drawable-xhdpi/sym_keyboard_voice_off_lxx_light.png
new file mode 100644
index 0000000..1398a3e
--- /dev/null
+++ b/java/res/drawable-xhdpi/sym_keyboard_voice_off_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-xxhdpi/btn_keyboard_key_active_lxx_dark.9.png b/java/res/drawable-xxhdpi/btn_keyboard_key_active_lxx_dark.9.png
index dc67c6f..f492397 100644
--- a/java/res/drawable-xxhdpi/btn_keyboard_key_active_lxx_dark.9.png
+++ b/java/res/drawable-xxhdpi/btn_keyboard_key_active_lxx_dark.9.png
Binary files differ
diff --git a/java/res/drawable-xxhdpi/btn_keyboard_key_active_lxx_light.9.png b/java/res/drawable-xxhdpi/btn_keyboard_key_active_lxx_light.9.png
new file mode 100644
index 0000000..1f5f922
--- /dev/null
+++ b/java/res/drawable-xxhdpi/btn_keyboard_key_active_lxx_light.9.png
Binary files differ
diff --git a/java/res/drawable-xxhdpi/btn_keyboard_key_active_pressed_lxx_dark.9.png b/java/res/drawable-xxhdpi/btn_keyboard_key_active_pressed_lxx_dark.9.png
index 2e12dd1..65e455c 100644
--- a/java/res/drawable-xxhdpi/btn_keyboard_key_active_pressed_lxx_dark.9.png
+++ b/java/res/drawable-xxhdpi/btn_keyboard_key_active_pressed_lxx_dark.9.png
Binary files differ
diff --git a/java/res/drawable-xxhdpi/btn_keyboard_key_active_pressed_lxx_light.9.png b/java/res/drawable-xxhdpi/btn_keyboard_key_active_pressed_lxx_light.9.png
new file mode 100644
index 0000000..0310143
--- /dev/null
+++ b/java/res/drawable-xxhdpi/btn_keyboard_key_active_pressed_lxx_light.9.png
Binary files differ
diff --git a/java/res/drawable-xxhdpi/btn_keyboard_key_normal_off_lxx_dark.9.png b/java/res/drawable-xxhdpi/btn_keyboard_key_normal_off_lxx_dark.9.png
index 4ec5864..535a00a 100644
--- a/java/res/drawable-xxhdpi/btn_keyboard_key_normal_off_lxx_dark.9.png
+++ b/java/res/drawable-xxhdpi/btn_keyboard_key_normal_off_lxx_dark.9.png
Binary files differ
diff --git a/java/res/drawable-xxhdpi/btn_keyboard_key_normal_off_lxx_light.9.png b/java/res/drawable-xxhdpi/btn_keyboard_key_normal_off_lxx_light.9.png
new file mode 100644
index 0000000..fb1dc62
--- /dev/null
+++ b/java/res/drawable-xxhdpi/btn_keyboard_key_normal_off_lxx_light.9.png
Binary files differ
diff --git a/java/res/drawable-xxhdpi/btn_keyboard_key_normal_on_lxx_dark.9.png b/java/res/drawable-xxhdpi/btn_keyboard_key_normal_on_lxx_dark.9.png
index 6b5c0c0..2166f62 100644
--- a/java/res/drawable-xxhdpi/btn_keyboard_key_normal_on_lxx_dark.9.png
+++ b/java/res/drawable-xxhdpi/btn_keyboard_key_normal_on_lxx_dark.9.png
Binary files differ
diff --git a/java/res/drawable-xxhdpi/btn_keyboard_key_normal_on_lxx_light.9.png b/java/res/drawable-xxhdpi/btn_keyboard_key_normal_on_lxx_light.9.png
new file mode 100644
index 0000000..7034621
--- /dev/null
+++ b/java/res/drawable-xxhdpi/btn_keyboard_key_normal_on_lxx_light.9.png
Binary files differ
diff --git a/java/res/drawable-xxhdpi/btn_keyboard_key_popup_selected_lxx_dark.9.png b/java/res/drawable-xxhdpi/btn_keyboard_key_popup_selected_lxx_dark.9.png
new file mode 100644
index 0000000..f74ac5c
--- /dev/null
+++ b/java/res/drawable-xxhdpi/btn_keyboard_key_popup_selected_lxx_dark.9.png
Binary files differ
diff --git a/java/res/drawable-xxhdpi/btn_keyboard_key_popup_selected_lxx_light.9.png b/java/res/drawable-xxhdpi/btn_keyboard_key_popup_selected_lxx_light.9.png
new file mode 100644
index 0000000..e58d664
--- /dev/null
+++ b/java/res/drawable-xxhdpi/btn_keyboard_key_popup_selected_lxx_light.9.png
Binary files differ
diff --git a/java/res/drawable-xxhdpi/btn_keyboard_key_pressed_off_lxx_dark.9.png b/java/res/drawable-xxhdpi/btn_keyboard_key_pressed_off_lxx_dark.9.png
index 6fd8eed..2fd8b67 100644
--- a/java/res/drawable-xxhdpi/btn_keyboard_key_pressed_off_lxx_dark.9.png
+++ b/java/res/drawable-xxhdpi/btn_keyboard_key_pressed_off_lxx_dark.9.png
Binary files differ
diff --git a/java/res/drawable-xxhdpi/btn_keyboard_key_pressed_off_lxx_light.9.png b/java/res/drawable-xxhdpi/btn_keyboard_key_pressed_off_lxx_light.9.png
new file mode 100644
index 0000000..8e01cfa2
--- /dev/null
+++ b/java/res/drawable-xxhdpi/btn_keyboard_key_pressed_off_lxx_light.9.png
Binary files differ
diff --git a/java/res/drawable-xxhdpi/btn_keyboard_key_pressed_on_lxx_dark.9.png b/java/res/drawable-xxhdpi/btn_keyboard_key_pressed_on_lxx_dark.9.png
index 9132288..d0252e1 100644
--- a/java/res/drawable-xxhdpi/btn_keyboard_key_pressed_on_lxx_dark.9.png
+++ b/java/res/drawable-xxhdpi/btn_keyboard_key_pressed_on_lxx_dark.9.png
Binary files differ
diff --git a/java/res/drawable-xxhdpi/btn_keyboard_key_pressed_on_lxx_light.9.png b/java/res/drawable-xxhdpi/btn_keyboard_key_pressed_on_lxx_light.9.png
new file mode 100644
index 0000000..1619411
--- /dev/null
+++ b/java/res/drawable-xxhdpi/btn_keyboard_key_pressed_on_lxx_light.9.png
Binary files differ
diff --git a/java/res/drawable-xxhdpi/keyboard_key_feedback_background_lxx_dark.9.png b/java/res/drawable-xxhdpi/keyboard_key_feedback_background_lxx_dark.9.png
index f781491..284302f 100644
--- a/java/res/drawable-xxhdpi/keyboard_key_feedback_background_lxx_dark.9.png
+++ b/java/res/drawable-xxhdpi/keyboard_key_feedback_background_lxx_dark.9.png
Binary files differ
diff --git a/java/res/drawable-xxhdpi/keyboard_key_feedback_background_lxx_light.9.png b/java/res/drawable-xxhdpi/keyboard_key_feedback_background_lxx_light.9.png
new file mode 100644
index 0000000..dcc0ab0
--- /dev/null
+++ b/java/res/drawable-xxhdpi/keyboard_key_feedback_background_lxx_light.9.png
Binary files differ
diff --git a/java/res/drawable-xxhdpi/keyboard_key_feedback_more_background_lxx_dark.9.png b/java/res/drawable-xxhdpi/keyboard_key_feedback_more_background_lxx_dark.9.png
index a79499f..1ae2625 100644
--- a/java/res/drawable-xxhdpi/keyboard_key_feedback_more_background_lxx_dark.9.png
+++ b/java/res/drawable-xxhdpi/keyboard_key_feedback_more_background_lxx_dark.9.png
Binary files differ
diff --git a/java/res/drawable-xxhdpi/keyboard_key_feedback_more_background_lxx_light.9.png b/java/res/drawable-xxhdpi/keyboard_key_feedback_more_background_lxx_light.9.png
new file mode 100644
index 0000000..5fd1751
--- /dev/null
+++ b/java/res/drawable-xxhdpi/keyboard_key_feedback_more_background_lxx_light.9.png
Binary files differ
diff --git a/java/res/drawable-xxhdpi/keyboard_popup_panel_background_lxx_dark.9.png b/java/res/drawable-xxhdpi/keyboard_popup_panel_background_lxx_dark.9.png
index 91d5d7f..92c479d 100644
--- a/java/res/drawable-xxhdpi/keyboard_popup_panel_background_lxx_dark.9.png
+++ b/java/res/drawable-xxhdpi/keyboard_popup_panel_background_lxx_dark.9.png
Binary files differ
diff --git a/java/res/drawable-xxhdpi/keyboard_popup_panel_background_lxx_light.9.png b/java/res/drawable-xxhdpi/keyboard_popup_panel_background_lxx_light.9.png
new file mode 100644
index 0000000..1336d80
--- /dev/null
+++ b/java/res/drawable-xxhdpi/keyboard_popup_panel_background_lxx_light.9.png
Binary files differ
diff --git a/java/res/drawable-xxhdpi/suggestions_strip_divider.png b/java/res/drawable-xxhdpi/suggestions_strip_divider_holo.png
similarity index 100%
rename from java/res/drawable-xxhdpi/suggestions_strip_divider.png
rename to java/res/drawable-xxhdpi/suggestions_strip_divider_holo.png
Binary files differ
diff --git a/java/res/drawable-xxhdpi/suggestions_strip_divider_lxx_dark.png b/java/res/drawable-xxhdpi/suggestions_strip_divider_lxx_dark.png
new file mode 100644
index 0000000..5f0b3de
--- /dev/null
+++ b/java/res/drawable-xxhdpi/suggestions_strip_divider_lxx_dark.png
Binary files differ
diff --git a/java/res/drawable-xxhdpi/suggestions_strip_divider_lxx_light.png b/java/res/drawable-xxhdpi/suggestions_strip_divider_lxx_light.png
new file mode 100644
index 0000000..9b37dd0
--- /dev/null
+++ b/java/res/drawable-xxhdpi/suggestions_strip_divider_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-xxhdpi/sym_keyboard_delete_lxx_dark.png b/java/res/drawable-xxhdpi/sym_keyboard_delete_lxx_dark.png
index dd95be6..0196033 100644
--- a/java/res/drawable-xxhdpi/sym_keyboard_delete_lxx_dark.png
+++ b/java/res/drawable-xxhdpi/sym_keyboard_delete_lxx_dark.png
Binary files differ
diff --git a/java/res/drawable-xxhdpi/sym_keyboard_delete_lxx_light.png b/java/res/drawable-xxhdpi/sym_keyboard_delete_lxx_light.png
new file mode 100644
index 0000000..c3937c4
--- /dev/null
+++ b/java/res/drawable-xxhdpi/sym_keyboard_delete_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-xxhdpi/sym_keyboard_done_lxx_light.png b/java/res/drawable-xxhdpi/sym_keyboard_done_lxx_light.png
new file mode 100644
index 0000000..0347327
--- /dev/null
+++ b/java/res/drawable-xxhdpi/sym_keyboard_done_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-xxhdpi/sym_keyboard_go_lxx_light.png b/java/res/drawable-xxhdpi/sym_keyboard_go_lxx_light.png
new file mode 100644
index 0000000..0c66a6b
--- /dev/null
+++ b/java/res/drawable-xxhdpi/sym_keyboard_go_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-xxhdpi/sym_keyboard_language_switch_lxx_dark.png b/java/res/drawable-xxhdpi/sym_keyboard_language_switch_lxx_dark.png
index fc85e51..151fafe 100644
--- a/java/res/drawable-xxhdpi/sym_keyboard_language_switch_lxx_dark.png
+++ b/java/res/drawable-xxhdpi/sym_keyboard_language_switch_lxx_dark.png
Binary files differ
diff --git a/java/res/drawable-xxhdpi/sym_keyboard_language_switch_lxx_light.png b/java/res/drawable-xxhdpi/sym_keyboard_language_switch_lxx_light.png
new file mode 100644
index 0000000..82b4d51
--- /dev/null
+++ b/java/res/drawable-xxhdpi/sym_keyboard_language_switch_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-xxhdpi/sym_keyboard_next_lxx_light.png b/java/res/drawable-xxhdpi/sym_keyboard_next_lxx_light.png
new file mode 100644
index 0000000..4e14070
--- /dev/null
+++ b/java/res/drawable-xxhdpi/sym_keyboard_next_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-xxhdpi/sym_keyboard_previous_lxx_light.png b/java/res/drawable-xxhdpi/sym_keyboard_previous_lxx_light.png
new file mode 100644
index 0000000..78865cb
--- /dev/null
+++ b/java/res/drawable-xxhdpi/sym_keyboard_previous_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-xxhdpi/sym_keyboard_return_lxx_light.png b/java/res/drawable-xxhdpi/sym_keyboard_return_lxx_light.png
new file mode 100644
index 0000000..a429d66
--- /dev/null
+++ b/java/res/drawable-xxhdpi/sym_keyboard_return_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-xxhdpi/sym_keyboard_search_lxx_light.png b/java/res/drawable-xxhdpi/sym_keyboard_search_lxx_light.png
new file mode 100644
index 0000000..1b9952a
--- /dev/null
+++ b/java/res/drawable-xxhdpi/sym_keyboard_search_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-xxhdpi/sym_keyboard_send_lxx_light.png b/java/res/drawable-xxhdpi/sym_keyboard_send_lxx_light.png
new file mode 100644
index 0000000..a886505
--- /dev/null
+++ b/java/res/drawable-xxhdpi/sym_keyboard_send_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-xxhdpi/sym_keyboard_settings_lxx_dark.png b/java/res/drawable-xxhdpi/sym_keyboard_settings_lxx_dark.png
index d513ad9..143ec00 100644
--- a/java/res/drawable-xxhdpi/sym_keyboard_settings_lxx_dark.png
+++ b/java/res/drawable-xxhdpi/sym_keyboard_settings_lxx_dark.png
Binary files differ
diff --git a/java/res/drawable-xxhdpi/sym_keyboard_settings_lxx_light.png b/java/res/drawable-xxhdpi/sym_keyboard_settings_lxx_light.png
new file mode 100644
index 0000000..e5be028
--- /dev/null
+++ b/java/res/drawable-xxhdpi/sym_keyboard_settings_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-xxhdpi/sym_keyboard_shift_locked_lxx_light.png b/java/res/drawable-xxhdpi/sym_keyboard_shift_locked_lxx_light.png
new file mode 100644
index 0000000..2da7b65
--- /dev/null
+++ b/java/res/drawable-xxhdpi/sym_keyboard_shift_locked_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-xxhdpi/sym_keyboard_shift_lxx_dark.png b/java/res/drawable-xxhdpi/sym_keyboard_shift_lxx_dark.png
index ddfc1a9..774174c 100644
--- a/java/res/drawable-xxhdpi/sym_keyboard_shift_lxx_dark.png
+++ b/java/res/drawable-xxhdpi/sym_keyboard_shift_lxx_dark.png
Binary files differ
diff --git a/java/res/drawable-xxhdpi/sym_keyboard_shift_lxx_light.png b/java/res/drawable-xxhdpi/sym_keyboard_shift_lxx_light.png
new file mode 100644
index 0000000..ee51c56
--- /dev/null
+++ b/java/res/drawable-xxhdpi/sym_keyboard_shift_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-xxhdpi/sym_keyboard_smiley_lxx_dark.png b/java/res/drawable-xxhdpi/sym_keyboard_smiley_lxx_dark.png
index a4df3bb..ea89a87 100644
--- a/java/res/drawable-xxhdpi/sym_keyboard_smiley_lxx_dark.png
+++ b/java/res/drawable-xxhdpi/sym_keyboard_smiley_lxx_dark.png
Binary files differ
diff --git a/java/res/drawable-xxhdpi/sym_keyboard_smiley_lxx_light.png b/java/res/drawable-xxhdpi/sym_keyboard_smiley_lxx_light.png
new file mode 100644
index 0000000..08d4f8a
--- /dev/null
+++ b/java/res/drawable-xxhdpi/sym_keyboard_smiley_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-xxhdpi/sym_keyboard_spacebar_lxx_dark.9.png b/java/res/drawable-xxhdpi/sym_keyboard_spacebar_lxx_dark.9.png
index 01075eb..abd263f 100644
--- a/java/res/drawable-xxhdpi/sym_keyboard_spacebar_lxx_dark.9.png
+++ b/java/res/drawable-xxhdpi/sym_keyboard_spacebar_lxx_dark.9.png
Binary files differ
diff --git a/java/res/drawable-xxhdpi/sym_keyboard_spacebar_lxx_light.9.png b/java/res/drawable-xxhdpi/sym_keyboard_spacebar_lxx_light.9.png
new file mode 100644
index 0000000..90c9637
--- /dev/null
+++ b/java/res/drawable-xxhdpi/sym_keyboard_spacebar_lxx_light.9.png
Binary files differ
diff --git a/java/res/drawable-xxhdpi/sym_keyboard_voice_lxx_dark.png b/java/res/drawable-xxhdpi/sym_keyboard_voice_lxx_dark.png
index a36724c..9bc9eff 100644
--- a/java/res/drawable-xxhdpi/sym_keyboard_voice_lxx_dark.png
+++ b/java/res/drawable-xxhdpi/sym_keyboard_voice_lxx_dark.png
Binary files differ
diff --git a/java/res/drawable-xxhdpi/sym_keyboard_voice_lxx_light.png b/java/res/drawable-xxhdpi/sym_keyboard_voice_lxx_light.png
new file mode 100644
index 0000000..42331e9
--- /dev/null
+++ b/java/res/drawable-xxhdpi/sym_keyboard_voice_lxx_light.png
Binary files differ
diff --git a/java/res/drawable-xxhdpi/sym_keyboard_voice_off_lxx_dark.png b/java/res/drawable-xxhdpi/sym_keyboard_voice_off_lxx_dark.png
index 2706dca..413c4ff 100644
--- a/java/res/drawable-xxhdpi/sym_keyboard_voice_off_lxx_dark.png
+++ b/java/res/drawable-xxhdpi/sym_keyboard_voice_off_lxx_dark.png
Binary files differ
diff --git a/java/res/drawable-xxhdpi/sym_keyboard_voice_off_lxx_light.png b/java/res/drawable-xxhdpi/sym_keyboard_voice_off_lxx_light.png
new file mode 100644
index 0000000..5a3ed0d
--- /dev/null
+++ b/java/res/drawable-xxhdpi/sym_keyboard_voice_off_lxx_light.png
Binary files differ
diff --git a/java/res/drawable/btn_keyboard_key_functional_lxx_light.xml b/java/res/drawable/btn_keyboard_key_functional_lxx_light.xml
new file mode 100644
index 0000000..e518ca1
--- /dev/null
+++ b/java/res/drawable/btn_keyboard_key_functional_lxx_light.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 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">
+    <!-- Functional keys. -->
+    <item android:state_pressed="true"
+          android:drawable="@color/key_background_pressed_lxx_light" />
+    <item android:drawable="@color/key_background_lxx_light" />
+</selector>
diff --git a/java/res/drawable/btn_keyboard_key_lxx_light.xml b/java/res/drawable/btn_keyboard_key_lxx_light.xml
new file mode 100644
index 0000000..60fe02d
--- /dev/null
+++ b/java/res/drawable/btn_keyboard_key_lxx_light.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 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">
+    <!-- Action keys. -->
+    <item android:state_active="true" android:state_pressed="true"
+          android:drawable="@drawable/btn_keyboard_key_active_pressed_lxx_light" />
+    <item android:state_active="true"
+          android:drawable="@drawable/btn_keyboard_key_active_lxx_light" />
+
+    <!-- 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_lxx_light" />
+    <item android:state_checkable="true" android:state_pressed="true"
+          android:drawable="@drawable/btn_keyboard_key_pressed_off_lxx_light" />
+    <item android:state_checkable="true" android:state_checked="true"
+          android:drawable="@drawable/btn_keyboard_key_normal_on_lxx_light" />
+    <item android:state_checkable="true"
+          android:drawable="@drawable/btn_keyboard_key_normal_off_lxx_light" />
+
+    <!-- Empty background keys. -->
+    <item android:state_empty="true"
+          android:drawable="@color/key_background_lxx_light" />
+
+    <!-- Normal keys. -->
+    <item android:state_pressed="true"
+          android:drawable="@color/key_background_pressed_lxx_light" />
+    <item android:drawable="@color/key_background_lxx_light" />
+</selector>
diff --git a/java/res/drawable/btn_keyboard_key_popup_lxx_dark.xml b/java/res/drawable/btn_keyboard_key_popup_lxx_dark.xml
new file mode 100644
index 0000000..dee6457
--- /dev/null
+++ b/java/res/drawable/btn_keyboard_key_popup_lxx_dark.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 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">
+    <item android:state_pressed="true"
+          android:drawable="@drawable/btn_keyboard_key_popup_selected_lxx_dark" />
+    <item android:drawable="@android:color/transparent" />
+</selector>
diff --git a/java/res/drawable/btn_keyboard_spacebar_lxx_light.xml b/java/res/drawable/btn_keyboard_spacebar_lxx_light.xml
new file mode 100644
index 0000000..acd19fd
--- /dev/null
+++ b/java/res/drawable/btn_keyboard_spacebar_lxx_light.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 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">
+    <item android:state_pressed="true"
+          android:drawable="@color/key_background_pressed_lxx_light" />
+    <item android:drawable="@color/key_background_lxx_light" />
+</selector>
diff --git a/java/res/drawable/btn_suggestion_lxx_light.xml b/java/res/drawable/btn_suggestion_lxx_light.xml
new file mode 100644
index 0000000..84a9120
--- /dev/null
+++ b/java/res/drawable/btn_suggestion_lxx_light.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2014, 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"
+>
+    <item
+        android:state_pressed="true"
+        android:drawable="@color/suggested_word_background_selected_lxx_dark" />
+</selector>
diff --git a/java/res/drawable/keyboard_key_feedback_lxx_light.xml b/java/res/drawable/keyboard_key_feedback_lxx_light.xml
new file mode 100644
index 0000000..f4341c9
--- /dev/null
+++ b/java/res/drawable/keyboard_key_feedback_lxx_light.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 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"
+    xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+    <!-- Left edge -->
+    <item latin:state_left_edge="true" latin:state_has_morekeys="true"
+          android:drawable="@drawable/keyboard_key_feedback_more_background_lxx_light" />
+    <item latin:state_left_edge="true"
+          android:drawable="@drawable/keyboard_key_feedback_background_lxx_light" />
+
+    <!-- Right edge -->
+    <item latin:state_right_edge="true" latin:state_has_morekeys="true"
+          android:drawable="@drawable/keyboard_key_feedback_more_background_lxx_light" />
+    <item latin:state_right_edge="true"
+          android:drawable="@drawable/keyboard_key_feedback_background_lxx_light" />
+
+    <item latin:state_has_morekeys="true"
+          android:drawable="@drawable/keyboard_key_feedback_more_background_lxx_light" />
+    <item android:drawable="@drawable/keyboard_key_feedback_background_lxx_light" />
+</selector>
diff --git a/java/res/layout/emoji_palettes_view.xml b/java/res/layout/emoji_palettes_view.xml
index 9ff090a..a6ea38b 100644
--- a/java/res/layout/emoji_palettes_view.xml
+++ b/java/res/layout/emoji_palettes_view.xml
@@ -30,6 +30,7 @@
         android:orientation="horizontal"
         android:layout_width="match_parent"
         android:layout_height="@dimen/config_suggestions_strip_height"
+        style="?attr/suggestionStripViewStyle"
     >
         <TabHost
             android:id="@+id/emoji_category_tabhost"
@@ -57,10 +58,7 @@
                     android:visibility="gone" />
             </FrameLayout>
         </TabHost>
-        <View
-            android:layout_width="2dip"
-            android:layout_height="match_parent"
-            android:background="@drawable/suggestions_strip_divider" />
+        <include layout="@layout/suggestion_divider" />
         <!-- TODO: Implement KeyView and replace this. -->
         <!-- Provide audio and haptic feedback by ourselves based on the keyboard settings.
              We just need to ignore the system's audio and haptic feedback settings. -->
diff --git a/java/res/layout/suggestion_divider.xml b/java/res/layout/suggestion_divider.xml
index 563599d..dfea017 100644
--- a/java/res/layout/suggestion_divider.xml
+++ b/java/res/layout/suggestion_divider.xml
@@ -26,9 +26,9 @@
     android:layout_height="match_parent"
     android:padding="0dp"
     android:gravity="center"
-    android:src="@drawable/suggestions_strip_divider"
     android:contentDescription="@null"
     android:clickable="false"
     android:longClickable="false"
     android:hapticFeedbackEnabled="false"
-    android:soundEffectsEnabled="false" />
+    android:soundEffectsEnabled="false"
+    style="?attr/suggestionStripViewStyle" />
diff --git a/java/res/values/colors.xml b/java/res/values/colors.xml
index 0eee08d..ad7a04e 100644
--- a/java/res/values/colors.xml
+++ b/java/res/values/colors.xml
@@ -40,21 +40,36 @@
     <color name="typed_word_color_klp">#D8F0F0F0</color>
     <color name="suggested_word_color_klp">#B2F0F0F0</color>
     <color name="highlight_translucent_color_klp">#99E0E0E0</color>
-    <!-- Color resources for LXX theme. Base color = F0F0F0 -->
-    <color name="key_text_color_lxx_dark">#FFFFFF</color>
-    <color name="key_text_inactive_color_lxx_dark">#808184</color>
-    <color name="key_hint_letter_color_lxx_dark">#808184</color>
-    <color name="highlight_color_lxx_dark">#7FCAC3</color>
-    <color name="typed_word_color_lxx_dark">#D87FCAC3</color>
-    <color name="suggested_word_color_lxx_dark">#B27FCAC3</color>
-    <color name="highlight_translucent_color_lxx_dark">#997FCAC3</color>
-    <color name="keyboard_background_lxx_dark">#384248</color>
-    <color name="key_background_lxx_dark">#384248</color>
-    <color name="key_background_pressed_lxx_dark">#546872</color>
-    <color name="suggestions_strip_background_lxx_dark">#263238</color>
-    <color name="suggested_word_background_selected_lxx_dark">#384248</color>
+    <!-- Color resources for LXX_Light theme. -->
+    <color name="key_text_color_lxx_light">#546E7A</color>
+    <color name="key_text_inactive_color_lxx_light">#99546E7A</color>
+    <color name="key_hint_letter_color_lxx_light">#99546E7A</color>
+    <color name="highlight_color_lxx_light">#4DB6AC</color>
+    <color name="typed_word_color_lxx_light">#D84DB6AC</color>
+    <color name="suggested_word_color_lxx_light">#B24DB6AC</color>
+    <color name="highlight_translucent_color_lxx_light">#994DB6AC</color>
+    <color name="keyboard_background_lxx_light">#ECEFF1</color>
+    <color name="key_background_lxx_light">#ECEFF1</color>
+    <color name="key_background_pressed_lxx_light">#26546E7A</color>
+    <color name="suggestions_strip_background_lxx_light">#E4E7E9</color>
+    <color name="suggested_word_background_selected_lxx_light">#26546E7A</color>
+    <color name="gesture_floating_preview_color_lxx_light">#C0000000</color>
+    <color name="emoji_tab_page_indicator_background_lxx_light">#E4E7E9</color>
+    <!-- Color resources for LXX_Dark theme. -->
+    <color name="key_text_color_lxx_dark">#B3FFFFFF</color>
+    <color name="key_text_inactive_color_lxx_dark">#66FFFFFF</color>
+    <color name="key_hint_letter_color_lxx_dark">#66FFFFFF</color>
+    <color name="highlight_color_lxx_dark">#80CBC4</color>
+    <color name="typed_word_color_lxx_dark">#D880CBC4</color>
+    <color name="suggested_word_color_lxx_dark">#B280CBC4</color>
+    <color name="highlight_translucent_color_lxx_dark">#9980CBC4</color>
+    <color name="keyboard_background_lxx_dark">#263238</color>
+    <color name="key_background_lxx_dark">#263238</color>
+    <color name="key_background_pressed_lxx_dark">#26CFD8DC</color>
+    <color name="suggestions_strip_background_lxx_dark">#21272B</color>
+    <color name="suggested_word_background_selected_lxx_dark">#26CFD8DC</color>
     <color name="gesture_floating_preview_color_lxx_dark">#C0000000</color>
-    <color name="emoji_tab_page_indicator_background_lxx_dark">#263238</color>
+    <color name="emoji_tab_page_indicator_background_lxx_dark">#21272B</color>
     <!-- Color resources for setup wizard and tutorial -->
     <color name="setup_background">#FFEBEBEB</color>
     <color name="setup_text_dark">#FF707070</color>
diff --git a/java/res/values/keyboard-icons-lxx-dark.xml b/java/res/values/keyboard-icons-lxx-dark.xml
index 7988e73..b1549f2 100644
--- a/java/res/values/keyboard-icons-lxx-dark.xml
+++ b/java/res/values/keyboard-icons-lxx-dark.xml
@@ -21,7 +21,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android">
     <style name="KeyboardIcons.LXX_Dark">
         <!-- Keyboard icons -->
-        <!-- TODO: Update those icons for LXX theme. -->
+        <!-- TODO: Update those icons for LXX_Dark theme. -->
         <item name="iconShiftKey">@drawable/sym_keyboard_shift_lxx_dark</item>
         <item name="iconDeleteKey">@drawable/sym_keyboard_delete_lxx_dark</item>
         <item name="iconSettingsKey">@drawable/sym_keyboard_settings_lxx_dark</item>
diff --git a/java/res/values/keyboard-icons-lxx-light.xml b/java/res/values/keyboard-icons-lxx-light.xml
new file mode 100644
index 0000000..651e75c
--- /dev/null
+++ b/java/res/values/keyboard-icons-lxx-light.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2014, 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">
+    <style name="KeyboardIcons.LXX_Light">
+        <!-- Keyboard icons -->
+        <!-- TODO: Update those icons for LXX_Light theme. -->
+        <item name="iconShiftKey">@drawable/sym_keyboard_shift_lxx_light</item>
+        <item name="iconDeleteKey">@drawable/sym_keyboard_delete_lxx_light</item>
+        <item name="iconSettingsKey">@drawable/sym_keyboard_settings_lxx_light</item>
+        <item name="iconSpaceKey">@drawable/sym_keyboard_spacebar_lxx_light</item>
+        <item name="iconEnterKey">@drawable/sym_keyboard_return_lxx_light</item>
+        <item name="iconGoKey">@drawable/sym_keyboard_go_lxx_light</item>
+        <item name="iconSearchKey">@drawable/sym_keyboard_search_lxx_light</item>
+        <item name="iconSendKey">@drawable/sym_keyboard_send_lxx_light</item>
+        <item name="iconNextKey">@drawable/sym_keyboard_next_lxx_light</item>
+        <item name="iconDoneKey">@drawable/sym_keyboard_done_lxx_light</item>
+        <item name="iconPreviousKey">@drawable/sym_keyboard_previous_lxx_light</item>
+        <item name="iconTabKey">@drawable/sym_keyboard_tab_holo_dark</item>
+        <item name="iconShortcutKey">@drawable/sym_keyboard_voice_lxx_light</item>
+        <item name="iconSpaceKeyForNumberLayout">@drawable/sym_keyboard_space_holo_dark</item>
+        <item name="iconShiftKeyShifted">@drawable/sym_keyboard_shift_locked_lxx_dark</item>
+        <item name="iconShortcutKeyDisabled">@drawable/sym_keyboard_voice_off_lxx_light</item>
+        <item name="iconLanguageSwitchKey">@drawable/sym_keyboard_language_switch_lxx_light</item>
+        <item name="iconZwnjKey">@drawable/sym_keyboard_zwnj_holo_dark</item>
+        <item name="iconZwjKey">@drawable/sym_keyboard_zwj_holo_dark</item>
+        <item name="iconEmojiKey">@drawable/sym_keyboard_smiley_lxx_light</item>
+    </style>
+</resources>
diff --git a/java/res/values/keyboard-themes.xml b/java/res/values/keyboard-themes.xml
index 28a34c3..9d772c4 100644
--- a/java/res/values/keyboard-themes.xml
+++ b/java/res/values/keyboard-themes.xml
@@ -20,15 +20,15 @@
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <!-- For keyboard color scheme option dialog. -->
     <string-array name="keyboard_theme_names" translatable="false">
-        <!-- TODO: Implement Material Light theme. -->
+        <item>@string/keyboard_theme_material_light</item>
         <item>@string/keyboard_theme_material_dark</item>
         <item>@string/keyboard_theme_holo_white</item>
         <item>@string/keyboard_theme_holo_blue</item>
     </string-array>
     <!-- An element must be a keyboard theme id of {@link KeyboardTheme#THEME_ID_*}. -->
     <string-array name="keyboard_theme_ids" translatable="false">
-        <!-- TODO: Implement Material Light theme. -->
         <item>3</item>
+        <item>4</item>
         <item>2</item>
         <item>0</item>
     </string-array>
diff --git a/java/res/values/themes-ics.xml b/java/res/values/themes-ics.xml
index 073ae90..6118ce1 100644
--- a/java/res/values/themes-ics.xml
+++ b/java/res/values/themes-ics.xml
@@ -121,6 +121,7 @@
         <item name="maxMoreSuggestionsRow">@integer/config_max_more_suggestions_row</item>
         <item name="minMoreSuggestionsWidth">@fraction/config_min_more_suggestions_width</item>
         <item name="android:background">@drawable/keyboard_suggest_strip_holo</item>
+        <item name="android:src">@drawable/suggestions_strip_divider_holo</item>
         <item name="suggestionStripOptions">autoCorrectBold|validTypedWordBold</item>
         <item name="colorValidTypedWord">@color/typed_word_color_ics</item>
         <item name="colorTypedWord">@color/typed_word_color_ics</item>
diff --git a/java/res/values/themes-klp.xml b/java/res/values/themes-klp.xml
index f895de5..1933860 100644
--- a/java/res/values/themes-klp.xml
+++ b/java/res/values/themes-klp.xml
@@ -121,6 +121,7 @@
         <item name="maxMoreSuggestionsRow">@integer/config_max_more_suggestions_row</item>
         <item name="minMoreSuggestionsWidth">@fraction/config_min_more_suggestions_width</item>
         <item name="android:background">@drawable/keyboard_suggest_strip_holo</item>
+        <item name="android:src">@drawable/suggestions_strip_divider_holo</item>
         <item name="suggestionStripOptions">autoCorrectBold|validTypedWordBold</item>
         <item name="colorValidTypedWord">@color/typed_word_color_klp</item>
         <item name="colorTypedWord">@color/typed_word_color_klp</item>
diff --git a/java/res/values/themes-lxx-dark.xml b/java/res/values/themes-lxx-dark.xml
index 1db8f42..c04e04d 100644
--- a/java/res/values/themes-lxx-dark.xml
+++ b/java/res/values/themes-lxx-dark.xml
@@ -34,7 +34,7 @@
         parent="Keyboard"
     >
         <!-- This should be aligned with KeyboardSwitcher.KEYBOARD_THEMES[] -->
-        <item name="themeId">3</item>
+        <item name="themeId">4</item>
         <item name="keyboardTopPadding">@fraction/config_keyboard_top_padding_holo</item>
         <item name="keyboardBottomPadding">@fraction/config_keyboard_bottom_padding_holo</item>
         <item name="horizontalGap">@fraction/config_key_horizontal_gap_holo</item>
@@ -108,8 +108,7 @@
         parent="KeyboardView.LXX_Dark"
     >
         <item name="android:background">@drawable/keyboard_popup_panel_background_lxx_dark</item>
-        <!-- Reuse KLP key background -->
-        <item name="keyBackground">@drawable/btn_keyboard_key_popup_klp</item>
+        <item name="keyBackground">@drawable/btn_keyboard_key_popup_lxx_dark</item>
         <item name="keyTypeface">normal</item>
         <item name="verticalCorrection">@dimen/config_more_keys_keyboard_vertical_correction_holo</item>
     </style>
@@ -122,6 +121,7 @@
         <item name="maxMoreSuggestionsRow">@integer/config_max_more_suggestions_row</item>
         <item name="minMoreSuggestionsWidth">@fraction/config_min_more_suggestions_width</item>
         <item name="android:background">@color/suggestions_strip_background_lxx_dark</item>
+        <item name="android:src">@drawable/suggestions_strip_divider_lxx_dark</item>
         <item name="suggestionStripOptions">autoCorrectBold|validTypedWordBold</item>
         <item name="colorValidTypedWord">@color/typed_word_color_lxx_dark</item>
         <item name="colorTypedWord">@color/typed_word_color_lxx_dark</item>
diff --git a/java/res/values/themes-lxx-light.xml b/java/res/values/themes-lxx-light.xml
new file mode 100644
index 0000000..3695f80
--- /dev/null
+++ b/java/res/values/themes-lxx-light.xml
@@ -0,0 +1,140 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2014, 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">
+    <style name="KeyboardTheme.LXX_Light" parent="KeyboardIcons.LXX_Light">
+        <item name="keyboardStyle">@style/Keyboard.LXX_Light</item>
+        <item name="keyboardViewStyle">@style/KeyboardView.LXX_Light</item>
+        <item name="mainKeyboardViewStyle">@style/MainKeyboardView.LXX_Light</item>
+        <item name="emojiPalettesViewStyle">@style/EmojiPalettesView.LXX_Light</item>
+        <item name="moreKeysKeyboardStyle">@style/MoreKeysKeyboard.LXX_Light</item>
+        <item name="moreKeysKeyboardViewStyle">@style/MoreKeysKeyboardView.LXX_Light</item>
+        <item name="suggestionStripViewStyle">@style/SuggestionStripView.LXX_Light</item>
+        <item name="suggestionWordStyle">@style/SuggestionWord.LXX_Light</item>
+    </style>
+    <style
+        name="Keyboard.LXX_Light"
+        parent="Keyboard"
+    >
+        <!-- This should be aligned with KeyboardSwitcher.KEYBOARD_THEMES[] -->
+        <item name="themeId">3</item>
+        <item name="keyboardTopPadding">@fraction/config_keyboard_top_padding_holo</item>
+        <item name="keyboardBottomPadding">@fraction/config_keyboard_bottom_padding_holo</item>
+        <item name="horizontalGap">@fraction/config_key_horizontal_gap_holo</item>
+        <item name="verticalGap">@fraction/config_key_vertical_gap_holo</item>
+        <item name="touchPositionCorrectionData">@array/touch_position_correction_data_holo</item>
+    </style>
+    <style
+        name="KeyboardView.LXX_Light"
+        parent="KeyboardView"
+    >
+        <item name="android:background">@color/keyboard_background_lxx_light</item>
+        <item name="keyBackground">@drawable/btn_keyboard_key_lxx_light</item>
+        <item name="functionalKeyBackground">@drawable/btn_keyboard_key_functional_lxx_light</item>
+        <item name="spacebarBackground">@drawable/btn_keyboard_spacebar_lxx_light</item>
+        <item name="spacebarIconWidthRatio">0.9</item>
+        <item name="keyTypeface">normal</item>
+        <item name="keyTextColor">@color/key_text_color_lxx_light</item>
+        <item name="keyTextInactivatedColor">@color/key_text_inactive_color_lxx_light</item>
+        <item name="functionalTextColor">@color/key_hint_letter_color_lxx_light</item>
+        <item name="keyHintLetterColor">@color/key_hint_letter_color_lxx_light</item>
+        <item name="keyHintLabelColor">@color/key_text_inactive_color_lxx_light</item>
+        <item name="keyShiftedLetterHintInactivatedColor">@color/key_text_inactive_color_lxx_light</item>
+        <item name="keyShiftedLetterHintActivatedColor">@color/key_text_color_lxx_light</item>
+        <item name="keyPreviewTextColor">@color/key_text_color_lxx_light</item>
+        <!-- A negative value to disable key text shadow layer. -->
+        <item name="keyTextShadowRadius">-1.0</item>
+    </style>
+    <style
+        name="MainKeyboardView.LXX_Light"
+        parent="KeyboardView.LXX_Light"
+    >
+        <item name="keyPreviewBackground">@drawable/keyboard_key_feedback_lxx_light</item>
+        <item name="keyPreviewOffset">@dimen/config_key_preview_offset_holo</item>
+        <item name="gestureFloatingPreviewTextColor">@color/highlight_color_lxx_light</item>
+        <item name="gestureFloatingPreviewColor">@color/gesture_floating_preview_color_lxx_light</item>
+        <item name="gestureTrailColor">@color/highlight_color_lxx_light</item>
+        <item name="slidingKeyInputPreviewColor">@color/highlight_translucent_color_lxx_light</item>
+        <item name="languageOnSpacebarTextColor">@color/key_text_inactive_color_lxx_light</item>
+        <!-- A negative value to disable text shadow layer. -->
+        <item name="languageOnSpacebarTextShadowRadius">-1.0</item>
+    </style>
+    <!-- Though {@link EmojiPalettesView} doesn't extend {@link KeyboardView}, some views inside it,
+         for instance delete button, need themed {@link KeyboardView} attributes. -->
+    <style
+        name="EmojiPalettesView.LXX_Light"
+        parent="MainKeyboardView.LXX_Light"
+    >
+        <item name="categoryIndicatorEnabled">false</item>
+        <item name="categoryPageIndicatorColor">@color/highlight_color_lxx_light</item>
+        <item name="categoryPageIndicatorBackground">@color/emoji_tab_page_indicator_background_lxx_light</item>
+        <!-- TODO: Update those icons to LXX_Light theme. -->
+        <item name="iconEmojiRecentsTab">@drawable/ic_emoji_recents_holo_dark</item>
+        <item name="iconEmojiCategory1Tab">@drawable/ic_emoji_people_holo_dark</item>
+        <item name="iconEmojiCategory2Tab">@drawable/ic_emoji_objects_holo_dark</item>
+        <item name="iconEmojiCategory3Tab">@drawable/ic_emoji_nature_holo_dark</item>
+        <item name="iconEmojiCategory4Tab">@drawable/ic_emoji_places_holo_dark</item>
+        <item name="iconEmojiCategory5Tab">@drawable/ic_emoji_symbols_holo_dark</item>
+        <item name="iconEmojiCategory6Tab">@drawable/ic_emoji_emoticons_holo_dark</item>
+    </style>
+    <style
+        name="MoreKeysKeyboard.LXX_Light"
+        parent="Keyboard.LXX_Light"
+    >
+        <item name="keyboardTopPadding">0%p</item>
+        <item name="keyboardBottomPadding">0%p</item>
+        <item name="horizontalGap">0%p</item>
+        <item name="touchPositionCorrectionData">@null</item>
+    </style>
+    <style
+        name="MoreKeysKeyboardView.LXX_Light"
+        parent="KeyboardView.LXX_Light"
+    >
+        <item name="android:background">@drawable/keyboard_popup_panel_background_lxx_light</item>
+        <!-- Reuse KLP key background -->
+        <item name="keyBackground">@drawable/btn_keyboard_key_popup_klp</item>
+        <item name="keyTypeface">normal</item>
+        <item name="verticalCorrection">@dimen/config_more_keys_keyboard_vertical_correction_holo</item>
+    </style>
+    <style
+        name="SuggestionStripView.LXX_Light"
+        parent="KeyboardView.LXX_Light"
+    >
+        <item name="suggestionsCountInStrip">@integer/config_suggestions_count_in_strip</item>
+        <item name="centerSuggestionPercentile">@fraction/config_center_suggestion_percentile</item>
+        <item name="maxMoreSuggestionsRow">@integer/config_max_more_suggestions_row</item>
+        <item name="minMoreSuggestionsWidth">@fraction/config_min_more_suggestions_width</item>
+        <item name="android:background">@color/suggestions_strip_background_lxx_light</item>
+        <item name="android:src">@drawable/suggestions_strip_divider_lxx_light</item>
+        <item name="suggestionStripOptions">autoCorrectBold|validTypedWordBold</item>
+        <item name="colorValidTypedWord">@color/typed_word_color_lxx_light</item>
+        <item name="colorTypedWord">@color/typed_word_color_lxx_light</item>
+        <item name="colorAutoCorrect">@color/highlight_color_lxx_light</item>
+        <item name="colorSuggested">@color/suggested_word_color_lxx_light</item>
+        <item name="alphaObsoleted">70%</item>
+    </style>
+    <style
+        name="SuggestionWord.LXX_Light"
+        parent="SuggestionWord"
+    >
+        <item name="android:background">@drawable/btn_suggestion_lxx_light</item>
+        <item name="android:textColor">@color/highlight_color_lxx_light</item>
+    </style>
+</resources>
diff --git a/java/src/com/android/inputmethod/compat/TextInfoCompatUtils.java b/java/src/com/android/inputmethod/compat/TextInfoCompatUtils.java
index 8bd9197..09f39a7 100644
--- a/java/src/com/android/inputmethod/compat/TextInfoCompatUtils.java
+++ b/java/src/com/android/inputmethod/compat/TextInfoCompatUtils.java
@@ -22,7 +22,6 @@
 
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Method;
-import java.util.Locale;
 
 @UsedForTesting
 public final class TextInfoCompatUtils {
@@ -50,9 +49,18 @@
                 sequenceNumber);
     }
 
+    /**
+     * Returns the result of {@link TextInfo#getCharSequence()} when available. Otherwise returns
+     * the result of {@link TextInfo#getText()} as fall back.
+     * @param textInfo the instance for which {@link TextInfo#getCharSequence()} or
+     * {@link TextInfo#getText()} is called.
+     * @return the result of {@link TextInfo#getCharSequence()} when available. Otherwise returns
+     * the result of {@link TextInfo#getText()} as fall back. If {@code textInfo} is {@code null},
+     * returns {@code null}.
+     */
     @UsedForTesting
-    public static CharSequence getCharSequence(final TextInfo textInfo,
-            final CharSequence defaultValue) {
+    public static CharSequence getCharSequenceOrString(final TextInfo textInfo) {
+        final CharSequence defaultValue = (textInfo == null ? null : textInfo.getText());
         return (CharSequence) CompatUtils.invoke(textInfo, defaultValue,
                 TEXT_INFO_GET_CHAR_SEQUENCE);
     }
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardTheme.java b/java/src/com/android/inputmethod/keyboard/KeyboardTheme.java
index 7b41dfe..4c2e0dd 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardTheme.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardTheme.java
@@ -34,7 +34,8 @@
 
     public static final int THEME_ID_ICS = 0;
     public static final int THEME_ID_KLP = 2;
-    public static final int THEME_ID_LXX_DARK = 3;
+    public static final int THEME_ID_LXX_LIGHT = 3;
+    public static final int THEME_ID_LXX_DARK = 4;
     public static final int DEFAULT_THEME_ID = THEME_ID_KLP;
 
     private static final KeyboardTheme[] KEYBOARD_THEMES = {
@@ -44,10 +45,12 @@
         new KeyboardTheme(THEME_ID_KLP, R.style.KeyboardTheme_KLP,
                 // Default theme for ICS, JB, and KLP.
                 VERSION_CODES.ICE_CREAM_SANDWICH),
-        new KeyboardTheme(THEME_ID_LXX_DARK, R.style.KeyboardTheme_LXX_Dark,
+        new KeyboardTheme(THEME_ID_LXX_LIGHT, R.style.KeyboardTheme_LXX_Light,
                 // Default theme for LXX.
                 // TODO: Update this constant once the *next* version becomes available.
                 VERSION_CODES.CUR_DEVELOPMENT),
+        new KeyboardTheme(THEME_ID_LXX_DARK, R.style.KeyboardTheme_LXX_Dark,
+                VERSION_CODES.BASE),
     };
 
     static {
diff --git a/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java b/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java
index 90c8f61..72b5031 100644
--- a/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java
+++ b/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java
@@ -16,22 +16,31 @@
 
 package com.android.inputmethod.latin.spellcheck;
 
+import android.content.Context;
 import android.content.Intent;
 import android.content.SharedPreferences;
 import android.preference.PreferenceManager;
 import android.service.textservice.SpellCheckerService;
 import android.text.InputType;
 import android.util.Log;
+import android.util.LruCache;
 import android.view.inputmethod.EditorInfo;
 import android.view.inputmethod.InputMethodSubtype;
 import android.view.textservice.SuggestionsInfo;
 
+import com.android.inputmethod.keyboard.Keyboard;
+import com.android.inputmethod.keyboard.KeyboardId;
 import com.android.inputmethod.keyboard.KeyboardLayoutSet;
+import com.android.inputmethod.keyboard.ProximityInfo;
 import com.android.inputmethod.latin.ContactsBinaryDictionary;
 import com.android.inputmethod.latin.Dictionary;
 import com.android.inputmethod.latin.DictionaryCollection;
+import com.android.inputmethod.latin.DictionaryFacilitator;
 import com.android.inputmethod.latin.DictionaryFactory;
+import com.android.inputmethod.latin.PrevWordsInfo;
 import com.android.inputmethod.latin.R;
+import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
+import com.android.inputmethod.latin.settings.SettingsValuesForSuggestion;
 import com.android.inputmethod.latin.UserBinaryDictionary;
 import com.android.inputmethod.latin.utils.AdditionalSubtypeUtils;
 import com.android.inputmethod.latin.utils.BinaryDictionaryUtils;
@@ -39,15 +48,23 @@
 import com.android.inputmethod.latin.utils.LocaleUtils;
 import com.android.inputmethod.latin.utils.ScriptUtils;
 import com.android.inputmethod.latin.utils.StringUtils;
+import com.android.inputmethod.latin.utils.SuggestionResults;
+import com.android.inputmethod.latin.WordComposer;
 
 import java.lang.ref.WeakReference;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Locale;
 import java.util.Map;
+import java.util.TreeMap;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.concurrent.Semaphore;
+import java.util.concurrent.TimeUnit;
 
 /**
  * Service for spell checking, using LatinIME's dictionaries and mechanisms.
@@ -56,31 +73,79 @@
         implements SharedPreferences.OnSharedPreferenceChangeListener {
     private static final String TAG = AndroidSpellCheckerService.class.getSimpleName();
     private static final boolean DBG = false;
-    private static final int POOL_SIZE = 2;
 
     public static final String PREF_USE_CONTACTS_KEY = "pref_spellcheck_use_contacts";
 
     private static final int SPELLCHECKER_DUMMY_KEYBOARD_WIDTH = 480;
     private static final int SPELLCHECKER_DUMMY_KEYBOARD_HEIGHT = 368;
 
-    private final static String[] EMPTY_STRING_ARRAY = new String[0];
-    private Map<String, DictionaryPool> mDictionaryPools = CollectionUtils.newSynchronizedTreeMap();
-    private Map<String, UserBinaryDictionary> mUserDictionaries =
-            CollectionUtils.newSynchronizedTreeMap();
-    private ContactsBinaryDictionary mContactsDictionary;
+    private static final String DICTIONARY_NAME_PREFIX = "spellcheck_";
+    private static final int WAIT_FOR_LOADING_MAIN_DICT_IN_MILLISECONDS = 1000;
+    private static final int MAX_RETRY_COUNT_FOR_WAITING_FOR_LOADING_DICT = 5;
+
+    private static final String[] EMPTY_STRING_ARRAY = new String[0];
+
+    private final HashSet<Locale> mCachedLocales = new HashSet<>();
+
+    private final int MAX_NUM_OF_THREADS_READ_DICTIONARY = 2;
+    private final Semaphore mSemaphore = new Semaphore(MAX_NUM_OF_THREADS_READ_DICTIONARY,
+            true /* fair */);
+    // TODO: Make each spell checker session has its own session id.
+    private final ConcurrentLinkedQueue<Integer> mSessionIdPool = new ConcurrentLinkedQueue<>();
+
+    private static class DictionaryFacilitatorLruCache extends
+            LruCache<Locale, DictionaryFacilitator> {
+        private final HashSet<Locale> mCachedLocales;
+        public DictionaryFacilitatorLruCache(final HashSet<Locale> cachedLocales, int maxSize) {
+            super(maxSize);
+            mCachedLocales = cachedLocales;
+        }
+
+        @Override
+        protected void entryRemoved(boolean evicted, Locale key,
+                DictionaryFacilitator oldValue, DictionaryFacilitator newValue) {
+            if (oldValue != null && oldValue != newValue) {
+                oldValue.closeDictionaries();
+            }
+            if (key != null && newValue == null) {
+                // Remove locale from the cache when the dictionary facilitator for the locale is
+                // evicted and new facilitator is not set for the locale.
+                mCachedLocales.remove(key);
+                if (size() >= maxSize()) {
+                    Log.w(TAG, "DictionaryFacilitator for " + key.toString()
+                            + " has been evicted due to cache size limit."
+                            + " size: " + size() + ", maxSize: " + maxSize());
+                }
+            }
+        }
+    }
+
+    private static final int MAX_DICTIONARY_FACILITATOR_COUNT = 3;
+    private final LruCache<Locale, DictionaryFacilitator> mDictionaryFacilitatorCache =
+            new DictionaryFacilitatorLruCache(mCachedLocales, MAX_DICTIONARY_FACILITATOR_COUNT);
+    private final ConcurrentHashMap<Locale, Keyboard> mKeyboardCache = new ConcurrentHashMap<>();
 
     // The threshold for a suggestion to be considered "recommended".
     private float mRecommendedThreshold;
     // Whether to use the contacts dictionary
     private boolean mUseContactsDictionary;
-    private final Object mUseContactsLock = new Object();
-
-    private final HashSet<WeakReference<DictionaryCollection>> mDictionaryCollectionsList =
-            new HashSet<>();
+    // TODO: make a spell checker option to block offensive words or not
+    private final SettingsValuesForSuggestion mSettingsValuesForSuggestion =
+            new SettingsValuesForSuggestion(true /* blockPotentiallyOffensive */,
+                    true /* spaceAwareGestureEnabled */,
+                    null /* additionalFeaturesSettingValues */);
+    private final Object mDictionaryLock = new Object();
 
     public static final String SINGLE_QUOTE = "\u0027";
     public static final String APOSTROPHE = "\u2019";
 
+    public AndroidSpellCheckerService() {
+        super();
+        for (int i = 0; i < MAX_NUM_OF_THREADS_READ_DICTIONARY; i++) {
+            mSessionIdPool.add(i);
+        }
+    }
+
     @Override public void onCreate() {
         super.onCreate();
         mRecommendedThreshold =
@@ -106,52 +171,21 @@
     @Override
     public void onSharedPreferenceChanged(final SharedPreferences prefs, final String key) {
         if (!PREF_USE_CONTACTS_KEY.equals(key)) return;
-        synchronized(mUseContactsLock) {
-            mUseContactsDictionary = prefs.getBoolean(PREF_USE_CONTACTS_KEY, true);
-            if (mUseContactsDictionary) {
-                startUsingContactsDictionaryLocked();
-            } else {
-                stopUsingContactsDictionaryLocked();
+            final boolean useContactsDictionary = prefs.getBoolean(PREF_USE_CONTACTS_KEY, true);
+            if (useContactsDictionary != mUseContactsDictionary) {
+                mSemaphore.acquireUninterruptibly(MAX_NUM_OF_THREADS_READ_DICTIONARY);
+                try {
+                    mUseContactsDictionary = useContactsDictionary;
+                    for (final Locale locale : mCachedLocales) {
+                        final DictionaryFacilitator dictionaryFacilitator =
+                                mDictionaryFacilitatorCache.get(locale);
+                        resetDictionariesForLocale(this /* context  */,
+                                dictionaryFacilitator, locale, mUseContactsDictionary);
+                    }
+                } finally {
+                    mSemaphore.release(MAX_NUM_OF_THREADS_READ_DICTIONARY);
+                }
             }
-        }
-    }
-
-    private void startUsingContactsDictionaryLocked() {
-        if (null == mContactsDictionary) {
-            // TODO: use the right locale for each session
-            mContactsDictionary =
-                    new SynchronouslyLoadedContactsBinaryDictionary(this, Locale.getDefault());
-        }
-        final Iterator<WeakReference<DictionaryCollection>> iterator =
-                mDictionaryCollectionsList.iterator();
-        while (iterator.hasNext()) {
-            final WeakReference<DictionaryCollection> dictRef = iterator.next();
-            final DictionaryCollection dict = dictRef.get();
-            if (null == dict) {
-                iterator.remove();
-            } else {
-                dict.addDictionary(mContactsDictionary);
-            }
-        }
-    }
-
-    private void stopUsingContactsDictionaryLocked() {
-        if (null == mContactsDictionary) return;
-        final Dictionary contactsDict = mContactsDictionary;
-        // TODO: revert to the concrete type when USE_BINARY_CONTACTS_DICTIONARY is no longer needed
-        mContactsDictionary = null;
-        final Iterator<WeakReference<DictionaryCollection>> iterator =
-                mDictionaryCollectionsList.iterator();
-        while (iterator.hasNext()) {
-            final WeakReference<DictionaryCollection> dictRef = iterator.next();
-            final DictionaryCollection dict = dictRef.get();
-            if (null == dict) {
-                iterator.remove();
-            } else {
-                dict.removeDictionary(contactsDict);
-            }
-        }
-        contactsDict.close();
     }
 
     @Override
@@ -203,11 +237,6 @@
         private final int mMaxLength;
         private int mLength = 0;
 
-        // The two following attributes are only ever filled if the requested max length
-        // is 0 (or less, which is treated the same).
-        private String mBestSuggestion = null;
-        private int mBestScore = Integer.MIN_VALUE; // As small as possible
-
         SuggestionsGatherer(final String originalText, final float recommendedThreshold,
                 final int maxLength) {
             mOriginalText = originalText;
@@ -226,20 +255,6 @@
 
             // Weak <- insertIndex == 0, ..., insertIndex == mLength -> Strong
             if (insertIndex == 0 && mLength >= mMaxLength) {
-                // In the future, we may want to keep track of the best suggestion score even if
-                // we are asked for 0 suggestions. In this case, we can use the following
-                // (tested) code to keep it:
-                // If the maxLength is 0 (should never be less, but if it is, it's treated as 0)
-                // then we need to keep track of the best suggestion in mBestScore and
-                // mBestSuggestion. This is so that we know whether the best suggestion makes
-                // the score cutoff, since we need to know that to return a meaningful
-                // looksLikeTypo.
-                // if (0 >= mMaxLength) {
-                //     if (score > mBestScore) {
-                //         mBestScore = score;
-                //         mBestSuggestion = new String(word, wordOffset, wordLength);
-                //     }
-                // }
                 return true;
             }
 
@@ -264,20 +279,8 @@
             final String[] gatheredSuggestions;
             final boolean hasRecommendedSuggestions;
             if (0 == mLength) {
-                // TODO: the comment below describes what is intended, but in the practice
-                // mBestSuggestion is only ever set to null so it doesn't work. Fix this.
-                // Either we found no suggestions, or we found some BUT the max length was 0.
-                // If we found some mBestSuggestion will not be null. If it is null, then
-                // we found none, regardless of the max length.
-                if (null == mBestSuggestion) {
-                    gatheredSuggestions = null;
-                    hasRecommendedSuggestions = false;
-                } else {
-                    gatheredSuggestions = EMPTY_STRING_ARRAY;
-                    final float normalizedScore = BinaryDictionaryUtils.calcNormalizedScore(
-                            mOriginalText, mBestSuggestion, mBestScore);
-                    hasRecommendedSuggestions = (normalizedScore > mRecommendedThreshold);
-                }
+                gatheredSuggestions = null;
+                hasRecommendedSuggestions = false;
             } else {
                 if (DBG) {
                     if (mLength != mSuggestions.size()) {
@@ -323,85 +326,114 @@
         }
     }
 
+    public boolean isValidWord(final Locale locale, final String word) {
+        mSemaphore.acquireUninterruptibly();
+        try {
+            DictionaryFacilitator dictionaryFacilitatorForLocale =
+                    getDictionaryFacilitatorForLocaleLocked(locale);
+            return dictionaryFacilitatorForLocale.isValidWord(word, false /* igroreCase */);
+        } finally {
+            mSemaphore.release();
+        }
+    }
+
+    public SuggestionResults getSuggestionResults(final Locale locale, final WordComposer composer,
+            final PrevWordsInfo prevWordsInfo, final ProximityInfo proximityInfo) {
+        Integer sessionId = null;
+        mSemaphore.acquireUninterruptibly();
+        try {
+            sessionId = mSessionIdPool.poll();
+            DictionaryFacilitator dictionaryFacilitatorForLocale =
+                    getDictionaryFacilitatorForLocaleLocked(locale);
+            return dictionaryFacilitatorForLocale.getSuggestionResults(composer, prevWordsInfo,
+                    proximityInfo, mSettingsValuesForSuggestion, sessionId);
+        } finally {
+            if (sessionId != null) {
+                mSessionIdPool.add(sessionId);
+            }
+            mSemaphore.release();
+        }
+    }
+
+    public boolean hasMainDictionaryForLocale(final Locale locale) {
+        mSemaphore.acquireUninterruptibly();
+        try {
+            final DictionaryFacilitator dictionaryFacilitator =
+                    getDictionaryFacilitatorForLocaleLocked(locale);
+            return dictionaryFacilitator.hasInitializedMainDictionary();
+        } finally {
+            mSemaphore.release();
+        }
+    }
+
+    private DictionaryFacilitator getDictionaryFacilitatorForLocaleLocked(final Locale locale) {
+        DictionaryFacilitator dictionaryFacilitatorForLocale =
+                mDictionaryFacilitatorCache.get(locale);
+        if (dictionaryFacilitatorForLocale == null) {
+            dictionaryFacilitatorForLocale = new DictionaryFacilitator();
+            mDictionaryFacilitatorCache.put(locale, dictionaryFacilitatorForLocale);
+            mCachedLocales.add(locale);
+            resetDictionariesForLocale(this /* context */, dictionaryFacilitatorForLocale,
+                    locale, mUseContactsDictionary);
+        }
+        return dictionaryFacilitatorForLocale;
+    }
+
+    private static void resetDictionariesForLocale(final Context context,
+            final DictionaryFacilitator dictionaryFacilitator, final Locale locale,
+            final boolean useContactsDictionary) {
+        dictionaryFacilitator.resetDictionariesWithDictNamePrefix(context, locale,
+                useContactsDictionary, false /* usePersonalizedDicts */,
+                false /* forceReloadMainDictionary */, null /* listener */,
+                DICTIONARY_NAME_PREFIX);
+        for (int i = 0; i < MAX_RETRY_COUNT_FOR_WAITING_FOR_LOADING_DICT; i++) {
+            try {
+                dictionaryFacilitator.waitForLoadingMainDictionary(
+                        WAIT_FOR_LOADING_MAIN_DICT_IN_MILLISECONDS, TimeUnit.MILLISECONDS);
+                return;
+            } catch (final InterruptedException e) {
+                Log.i(TAG, "Interrupted during waiting for loading main dictionary.", e);
+                if (i < MAX_RETRY_COUNT_FOR_WAITING_FOR_LOADING_DICT - 1) {
+                    Log.i(TAG, "Retry", e);
+                } else {
+                    Log.w(TAG, "Give up retrying. Retried "
+                            + MAX_RETRY_COUNT_FOR_WAITING_FOR_LOADING_DICT + " times.", e);
+                }
+            }
+        }
+    }
+
     @Override
     public boolean onUnbind(final Intent intent) {
-        closeAllDictionaries();
+        mSemaphore.acquireUninterruptibly(MAX_NUM_OF_THREADS_READ_DICTIONARY);
+        try {
+            mDictionaryFacilitatorCache.evictAll();
+            mCachedLocales.clear();
+        } finally {
+            mSemaphore.release(MAX_NUM_OF_THREADS_READ_DICTIONARY);
+        }
+        mKeyboardCache.clear();
         return false;
     }
 
-    private void closeAllDictionaries() {
-        final Map<String, DictionaryPool> oldPools = mDictionaryPools;
-        mDictionaryPools = CollectionUtils.newSynchronizedTreeMap();
-        final Map<String, UserBinaryDictionary> oldUserDictionaries = mUserDictionaries;
-        mUserDictionaries = CollectionUtils.newSynchronizedTreeMap();
-        new Thread("spellchecker_close_dicts") {
-            @Override
-            public void run() {
-                // Contacts dictionary can be closed multiple times here. If the dictionary is
-                // already closed, extra closings are no-ops, so it's safe.
-                for (DictionaryPool pool : oldPools.values()) {
-                    pool.close();
-                }
-                for (Dictionary dict : oldUserDictionaries.values()) {
-                    dict.close();
-                }
-                synchronized (mUseContactsLock) {
-                    if (null != mContactsDictionary) {
-                        // The synchronously loaded contacts dictionary should have been in one
-                        // or several pools, but it is shielded against multiple closing and it's
-                        // safe to call it several times.
-                        final ContactsBinaryDictionary dictToClose = mContactsDictionary;
-                        // TODO: revert to the concrete type when USE_BINARY_CONTACTS_DICTIONARY
-                        // is no longer needed
-                        mContactsDictionary = null;
-                        dictToClose.close();
-                    }
-                }
+    public Keyboard getKeyboardForLocale(final Locale locale) {
+        Keyboard keyboard = mKeyboardCache.get(locale);
+        if (keyboard == null) {
+            keyboard = createKeyboardForLocale(locale);
+            if (keyboard != null) {
+                mKeyboardCache.put(locale, keyboard);
             }
-        }.start();
-    }
-
-    public DictionaryPool getDictionaryPool(final String locale) {
-        DictionaryPool pool = mDictionaryPools.get(locale);
-        if (null == pool) {
-            final Locale localeObject = LocaleUtils.constructLocaleFromString(locale);
-            pool = new DictionaryPool(POOL_SIZE, this, localeObject);
-            mDictionaryPools.put(locale, pool);
         }
-        return pool;
+        return keyboard;
     }
 
-    public DictAndKeyboard createDictAndKeyboard(final Locale locale) {
+    private Keyboard createKeyboardForLocale(final Locale locale) {
         final int script = ScriptUtils.getScriptFromSpellCheckerLocale(locale);
         final String keyboardLayoutName = getKeyboardLayoutNameForScript(script);
         final InputMethodSubtype subtype = AdditionalSubtypeUtils.createDummyAdditionalSubtype(
                 locale.toString(), keyboardLayoutName);
         final KeyboardLayoutSet keyboardLayoutSet = createKeyboardSetForSpellChecker(subtype);
-
-        final DictionaryCollection dictionaryCollection =
-                DictionaryFactory.createMainDictionaryFromManager(this, locale,
-                        true /* useFullEditDistance */);
-        final String localeStr = locale.toString();
-        UserBinaryDictionary userDictionary = mUserDictionaries.get(localeStr);
-        if (null == userDictionary) {
-            userDictionary = new SynchronouslyLoadedUserBinaryDictionary(this, locale, true);
-            mUserDictionaries.put(localeStr, userDictionary);
-        }
-        dictionaryCollection.addDictionary(userDictionary);
-        synchronized (mUseContactsLock) {
-            if (mUseContactsDictionary) {
-                if (null == mContactsDictionary) {
-                    // TODO: use the right locale. We can't do it right now because the
-                    // spell checker is reusing the contacts dictionary across sessions
-                    // without regard for their locale, so we need to fix that first.
-                    mContactsDictionary = new SynchronouslyLoadedContactsBinaryDictionary(this,
-                            Locale.getDefault());
-                }
-            }
-            dictionaryCollection.addDictionary(mContactsDictionary);
-            mDictionaryCollectionsList.add(new WeakReference<>(dictionaryCollection));
-        }
-        return new DictAndKeyboard(dictionaryCollection, keyboardLayoutSet);
+        return keyboardLayoutSet.getKeyboard(KeyboardId.ELEMENT_ALPHABET);
     }
 
     private KeyboardLayoutSet createKeyboardSetForSpellChecker(final InputMethodSubtype subtype) {
diff --git a/java/src/com/android/inputmethod/latin/spellcheck/AndroidWordLevelSpellCheckerSession.java b/java/src/com/android/inputmethod/latin/spellcheck/AndroidWordLevelSpellCheckerSession.java
index 08adaf8..19c1dd0 100644
--- a/java/src/com/android/inputmethod/latin/spellcheck/AndroidWordLevelSpellCheckerSession.java
+++ b/java/src/com/android/inputmethod/latin/spellcheck/AndroidWordLevelSpellCheckerSession.java
@@ -28,8 +28,9 @@
 import android.view.textservice.TextInfo;
 
 import com.android.inputmethod.compat.SuggestionsInfoCompatUtils;
+import com.android.inputmethod.keyboard.Keyboard;
+import com.android.inputmethod.keyboard.ProximityInfo;
 import com.android.inputmethod.latin.Constants;
-import com.android.inputmethod.latin.Dictionary;
 import com.android.inputmethod.latin.PrevWordsInfo;
 import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
 import com.android.inputmethod.latin.WordComposer;
@@ -39,17 +40,15 @@
 import com.android.inputmethod.latin.utils.LocaleUtils;
 import com.android.inputmethod.latin.utils.ScriptUtils;
 import com.android.inputmethod.latin.utils.StringUtils;
+import com.android.inputmethod.latin.utils.SuggestionResults;
 
-import java.util.ArrayList;
 import java.util.Locale;
 
 public abstract class AndroidWordLevelSpellCheckerSession extends Session {
     private static final String TAG = AndroidWordLevelSpellCheckerSession.class.getSimpleName();
     private static final boolean DBG = false;
 
-    // Immutable, but need the locale which is not available in the constructor yet
-    private DictionaryPool mDictionaryPool;
-    // Likewise
+    // Immutable, but not available in the constructor.
     private Locale mLocale;
     // Cache this for performance
     private int mScript; // One of SCRIPT_LATIN or SCRIPT_CYRILLIC for now.
@@ -116,7 +115,6 @@
     @Override
     public void onCreate() {
         final String localeString = getLocale();
-        mDictionaryPool = mService.getDictionaryPool(localeString);
         mLocale = LocaleUtils.constructLocaleFromString(localeString);
         mScript = ScriptUtils.getScriptFromSpellCheckerLocale(mLocale);
     }
@@ -191,24 +189,24 @@
      * If the "TEXT" is fully upper case, we test the exact string "TEXT", the lower-cased
      *  version of it "text" and the capitalized version of it "Text".
      */
-    private boolean isInDictForAnyCapitalization(final Dictionary dict, final String text,
-            final int capitalizeType) {
+    private boolean isInDictForAnyCapitalization(final String text, final int capitalizeType) {
         // If the word is in there as is, then it's in the dictionary. If not, we'll test lower
         // case versions, but only if the word is not already all-lower case or mixed case.
-        if (dict.isValidWord(text)) return true;
+        if (mService.isValidWord(mLocale, text)) return true;
         if (StringUtils.CAPITALIZE_NONE == capitalizeType) return false;
 
         // If we come here, we have a capitalized word (either First- or All-).
         // Downcase the word and look it up again. If the word is only capitalized, we
         // tested all possibilities, so if it's still negative we can return false.
         final String lowerCaseText = text.toLowerCase(mLocale);
-        if (dict.isValidWord(lowerCaseText)) return true;
+        if (mService.isValidWord(mLocale, lowerCaseText)) return true;
         if (StringUtils.CAPITALIZE_FIRST == capitalizeType) return false;
 
         // If the lower case version is not in the dictionary, it's still possible
         // that we have an all-caps version of a word that needs to be capitalized
         // according to the dictionary. E.g. "GERMANS" only exists in the dictionary as "Germans".
-        return dict.isValidWord(StringUtils.capitalizeFirstAndDowncaseRest(lowerCaseText, mLocale));
+        return mService.isValidWord(mLocale,
+                StringUtils.capitalizeFirstAndDowncaseRest(lowerCaseText, mLocale));
     }
 
     // Note : this must be reentrant
@@ -236,46 +234,28 @@
                 return new SuggestionsInfo(
                         cachedSuggestionsParams.mFlags, cachedSuggestionsParams.mSuggestions);
             }
-
             final int checkability = getCheckabilityInScript(inText, mScript);
             if (CHECKABILITY_CHECKABLE != checkability) {
-                DictAndKeyboard dictInfo = null;
-                try {
-                    dictInfo = mDictionaryPool.pollWithDefaultTimeout();
-                    if (!DictionaryPool.isAValidDictionary(dictInfo)) {
-                        return AndroidSpellCheckerService.getNotInDictEmptySuggestions(
-                                false /* reportAsTypo */);
-                    }
-                    if (CHECKABILITY_CONTAINS_PERIOD == checkability) {
-                        final String[] splitText = inText.split(Constants.REGEXP_PERIOD);
-                        boolean allWordsAreValid = true;
-                        for (final String word : splitText) {
-                            if (!dictInfo.mDictionary.isValidWord(word)) {
-                                allWordsAreValid = false;
-                                break;
-                            }
-                        }
-                        if (allWordsAreValid) {
-                            return new SuggestionsInfo(SuggestionsInfo.RESULT_ATTR_LOOKS_LIKE_TYPO
-                                    | SuggestionsInfo.RESULT_ATTR_HAS_RECOMMENDED_SUGGESTIONS,
-                                    new String[] {
-                                            TextUtils.join(Constants.STRING_SPACE, splitText),
-                                            TextUtils.join(Constants.STRING_PERIOD_AND_SPACE,
-                                                    splitText) });
+                if (CHECKABILITY_CONTAINS_PERIOD == checkability) {
+                    final String[] splitText = inText.split(Constants.REGEXP_PERIOD);
+                    boolean allWordsAreValid = true;
+                    for (final String word : splitText) {
+                        if (!mService.isValidWord(mLocale, word)) {
+                            allWordsAreValid = false;
+                            break;
                         }
                     }
-                    return dictInfo.mDictionary.isValidWord(inText)
-                            ? AndroidSpellCheckerService.getInDictEmptySuggestions()
-                            : AndroidSpellCheckerService.getNotInDictEmptySuggestions(
-                                    CHECKABILITY_CONTAINS_PERIOD == checkability
-                                    /* reportAsTypo */);
-                } finally {
-                    if (null != dictInfo) {
-                        if (!mDictionaryPool.offer(dictInfo)) {
-                            Log.e(TAG, "Can't re-insert a dictionary into its pool");
-                        }
+                    if (allWordsAreValid) {
+                        return new SuggestionsInfo(SuggestionsInfo.RESULT_ATTR_LOOKS_LIKE_TYPO
+                                | SuggestionsInfo.RESULT_ATTR_HAS_RECOMMENDED_SUGGESTIONS,
+                                new String[] {
+                                        TextUtils.join(Constants.STRING_SPACE, splitText) });
                     }
                 }
+                return mService.isValidWord(mLocale, inText) ?
+                        AndroidSpellCheckerService.getInDictEmptySuggestions() :
+                        AndroidSpellCheckerService.getNotInDictEmptySuggestions(
+                                CHECKABILITY_CONTAINS_PERIOD == checkability /* reportAsTypo */);
             }
             final String text = inText.replaceAll(
                     AndroidSpellCheckerService.APOSTROPHE, AndroidSpellCheckerService.SINGLE_QUOTE);
@@ -289,48 +269,34 @@
 
             final int capitalizeType = StringUtils.getCapitalizationType(text);
             boolean isInDict = true;
-            DictAndKeyboard dictInfo = null;
-            try {
-                dictInfo = mDictionaryPool.pollWithDefaultTimeout();
-                if (!DictionaryPool.isAValidDictionary(dictInfo)) {
-                    return AndroidSpellCheckerService.getNotInDictEmptySuggestions(
-                            false /* reportAsTypo */);
-                }
-                final WordComposer composer = new WordComposer();
-                final int[] codePoints = StringUtils.toCodePointArray(text);
-                final int[] coordinates;
-                if (null == dictInfo.mKeyboard) {
-                    coordinates = CoordinateUtils.newCoordinateArray(codePoints.length,
-                            Constants.NOT_A_COORDINATE, Constants.NOT_A_COORDINATE);
-                } else {
-                    coordinates = dictInfo.mKeyboard.getCoordinates(codePoints);
-                }
-                composer.setComposingWord(codePoints, coordinates);
-                // TODO: make a spell checker option to block offensive words or not
-                final ArrayList<SuggestedWordInfo> suggestions =
-                        dictInfo.mDictionary.getSuggestions(composer, prevWordsInfo,
-                                dictInfo.getProximityInfo(),
-                                new SettingsValuesForSuggestion(
-                                        true /* blockPotentiallyOffensive */,
-                                        true /* spaceAwareGestureEnabled */,
-                                        null /* additionalFeaturesSettingValues */),
-                                0 /* sessionId */,
-                                null /* inOutLanguageWeight */);
-                if (suggestions != null) {
-                    for (final SuggestedWordInfo suggestion : suggestions) {
-                        final String suggestionStr = suggestion.mWord;
-                        suggestionsGatherer.addWord(suggestionStr.toCharArray(), null, 0,
-                                suggestionStr.length(), suggestion.mScore);
-                    }
-                }
-                isInDict = isInDictForAnyCapitalization(dictInfo.mDictionary, text, capitalizeType);
-            } finally {
-                if (null != dictInfo) {
-                    if (!mDictionaryPool.offer(dictInfo)) {
-                        Log.e(TAG, "Can't re-insert a dictionary into its pool");
-                    }
+            if (!mService.hasMainDictionaryForLocale(mLocale)) {
+                return AndroidSpellCheckerService.getNotInDictEmptySuggestions(
+                        false /* reportAsTypo */);
+            }
+            final Keyboard keyboard = mService.getKeyboardForLocale(mLocale);
+            final WordComposer composer = new WordComposer();
+            final int[] codePoints = StringUtils.toCodePointArray(text);
+            final int[] coordinates;
+            final ProximityInfo proximityInfo;
+            if (null == keyboard) {
+                coordinates = CoordinateUtils.newCoordinateArray(codePoints.length,
+                        Constants.NOT_A_COORDINATE, Constants.NOT_A_COORDINATE);
+                proximityInfo = null;
+            } else {
+                coordinates = keyboard.getCoordinates(codePoints);
+                proximityInfo = keyboard.getProximityInfo();
+            }
+            composer.setComposingWord(codePoints, coordinates);
+            final SuggestionResults suggestionResults = mService.getSuggestionResults(
+                    mLocale, composer, prevWordsInfo, proximityInfo);
+            if (suggestionResults != null) {
+                for (final SuggestedWordInfo suggestion : suggestionResults) {
+                    final String suggestionStr = suggestion.mWord;
+                    suggestionsGatherer.addWord(suggestionStr.toCharArray(), null, 0,
+                            suggestionStr.length(), suggestion.mScore);
                 }
             }
+            isInDict = isInDictForAnyCapitalization(text, capitalizeType);
 
             final SuggestionsGatherer.Result result = suggestionsGatherer.getResults(
                     capitalizeType, mLocale);
diff --git a/java/src/com/android/inputmethod/latin/spellcheck/DictAndKeyboard.java b/java/src/com/android/inputmethod/latin/spellcheck/DictAndKeyboard.java
deleted file mode 100644
index b33739f..0000000
--- a/java/src/com/android/inputmethod/latin/spellcheck/DictAndKeyboard.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * 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 com.android.inputmethod.keyboard.Keyboard;
-import com.android.inputmethod.keyboard.KeyboardId;
-import com.android.inputmethod.keyboard.KeyboardLayoutSet;
-import com.android.inputmethod.keyboard.ProximityInfo;
-import com.android.inputmethod.latin.Dictionary;
-
-/**
- * A container for a Dictionary and a Keyboard.
- */
-public final class DictAndKeyboard {
-    public final Dictionary mDictionary;
-    public final Keyboard mKeyboard;
-
-    public DictAndKeyboard(
-            final Dictionary dictionary, final KeyboardLayoutSet keyboardLayoutSet) {
-        mDictionary = dictionary;
-        if (keyboardLayoutSet == null) {
-            mKeyboard = null;
-            return;
-        }
-        mKeyboard = keyboardLayoutSet.getKeyboard(KeyboardId.ELEMENT_ALPHABET);
-    }
-
-    public ProximityInfo getProximityInfo() {
-        return mKeyboard == null ? null : mKeyboard.getProximityInfo();
-    }
-}
diff --git a/java/src/com/android/inputmethod/latin/spellcheck/DictionaryPool.java b/java/src/com/android/inputmethod/latin/spellcheck/DictionaryPool.java
deleted file mode 100644
index eb85d49..0000000
--- a/java/src/com/android/inputmethod/latin/spellcheck/DictionaryPool.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * 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.util.Log;
-
-import com.android.inputmethod.keyboard.ProximityInfo;
-import com.android.inputmethod.latin.Dictionary;
-import com.android.inputmethod.latin.PrevWordsInfo;
-import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
-import com.android.inputmethod.latin.settings.SettingsValuesForSuggestion;
-import com.android.inputmethod.latin.WordComposer;
-
-import java.util.ArrayList;
-import java.util.Locale;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.TimeUnit;
-
-/**
- * A blocking queue that creates dictionaries up to a certain limit as necessary.
- * As a deadlock-detecting device, if waiting for more than TIMEOUT = 3 seconds, we
- * will clear the queue and generate its contents again. This is transparent for
- * the client code, but may help with sloppy clients.
- */
-@SuppressWarnings("serial")
-public final class DictionaryPool extends LinkedBlockingQueue<DictAndKeyboard> {
-    private final static String TAG = DictionaryPool.class.getSimpleName();
-    // How many seconds we wait for a dictionary to become available. Past this delay, we give up in
-    // fear some bug caused a deadlock, and reset the whole pool.
-    private final static int TIMEOUT = 3;
-    private final AndroidSpellCheckerService mService;
-    private final int mMaxSize;
-    private final Locale mLocale;
-    private int mSize;
-    private volatile boolean mClosed;
-    final static ArrayList<SuggestedWordInfo> noSuggestions = new ArrayList<>();
-    private final static DictAndKeyboard dummyDict = new DictAndKeyboard(
-            new Dictionary(Dictionary.TYPE_MAIN) {
-                // TODO: this dummy dictionary should be a singleton in the Dictionary class.
-                @Override
-                public ArrayList<SuggestedWordInfo> getSuggestions(final WordComposer composer,
-                        final PrevWordsInfo prevWordsInfo, final ProximityInfo proximityInfo,
-                        final SettingsValuesForSuggestion settingsValuesForSuggestion,
-                        final int sessionId, final float[] inOutLanguageWeight) {
-                    return noSuggestions;
-                }
-                @Override
-                public boolean isInDictionary(final String word) {
-                    // This is never called. However if for some strange reason it ever gets
-                    // called, returning true is less destructive (it will not underline the
-                    // word in red).
-                    return true;
-                }
-            }, null);
-
-    static public boolean isAValidDictionary(final DictAndKeyboard dictInfo) {
-        return null != dictInfo && dummyDict != dictInfo;
-    }
-
-    public DictionaryPool(final int maxSize, final AndroidSpellCheckerService service,
-            final Locale locale) {
-        super();
-        mMaxSize = maxSize;
-        mService = service;
-        mLocale = locale;
-        mSize = 0;
-        mClosed = false;
-    }
-
-    @Override
-    public DictAndKeyboard poll(final long timeout, final TimeUnit unit)
-            throws InterruptedException {
-        final DictAndKeyboard dict = poll();
-        if (null != dict) return dict;
-        synchronized(this) {
-            if (mSize >= mMaxSize) {
-                // Our pool is already full. Wait until some dictionary is ready, or TIMEOUT
-                // expires to avoid a deadlock.
-                final DictAndKeyboard result = super.poll(timeout, unit);
-                if (null == result) {
-                    Log.e(TAG, "Deadlock detected ! Resetting dictionary pool");
-                    clear();
-                    mSize = 1;
-                    return mService.createDictAndKeyboard(mLocale);
-                } else {
-                    return result;
-                }
-            } else {
-                ++mSize;
-                return mService.createDictAndKeyboard(mLocale);
-            }
-        }
-    }
-
-    // Convenience method
-    public DictAndKeyboard pollWithDefaultTimeout() {
-        try {
-            return poll(TIMEOUT, TimeUnit.SECONDS);
-        } catch (InterruptedException e) {
-            return null;
-        }
-    }
-
-    public void close() {
-        synchronized(this) {
-            mClosed = true;
-            for (DictAndKeyboard dict : this) {
-                dict.mDictionary.close();
-            }
-            clear();
-        }
-    }
-
-    @Override
-    public boolean offer(final DictAndKeyboard dict) {
-        if (mClosed) {
-            dict.mDictionary.close();
-            return super.offer(dummyDict);
-        } else {
-            return super.offer(dict);
-        }
-    }
-}
diff --git a/java/src/com/android/inputmethod/latin/spellcheck/SynchronouslyLoadedContactsBinaryDictionary.java b/java/src/com/android/inputmethod/latin/spellcheck/SynchronouslyLoadedContactsBinaryDictionary.java
deleted file mode 100644
index 688b184..0000000
--- a/java/src/com/android/inputmethod/latin/spellcheck/SynchronouslyLoadedContactsBinaryDictionary.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (C) 2012 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 com.android.inputmethod.keyboard.ProximityInfo;
-import com.android.inputmethod.latin.ContactsBinaryDictionary;
-import com.android.inputmethod.latin.PrevWordsInfo;
-import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
-import com.android.inputmethod.latin.settings.SettingsValuesForSuggestion;
-import com.android.inputmethod.latin.WordComposer;
-
-import java.util.ArrayList;
-import java.util.Locale;
-
-public final class SynchronouslyLoadedContactsBinaryDictionary extends ContactsBinaryDictionary {
-    private static final String NAME = "spellcheck_contacts";
-    private final Object mLock = new Object();
-
-    public SynchronouslyLoadedContactsBinaryDictionary(final Context context, final Locale locale) {
-        super(context, locale, null /* dictFile */, NAME);
-    }
-
-    @Override
-    public ArrayList<SuggestedWordInfo> getSuggestions(final WordComposer codes,
-            final PrevWordsInfo prevWordsInfo, final ProximityInfo proximityInfo,
-            final SettingsValuesForSuggestion settingsValuesForSuggestion,
-            final int sessionId, final float[] inOutLanguageWeight) {
-        synchronized (mLock) {
-            return super.getSuggestions(codes, prevWordsInfo, proximityInfo,
-                    settingsValuesForSuggestion, sessionId, inOutLanguageWeight);
-        }
-    }
-
-    @Override
-    public boolean isInDictionary(final String word) {
-        synchronized (mLock) {
-            return super.isInDictionary(word);
-        }
-    }
-}
diff --git a/java/src/com/android/inputmethod/latin/spellcheck/SynchronouslyLoadedUserBinaryDictionary.java b/java/src/com/android/inputmethod/latin/spellcheck/SynchronouslyLoadedUserBinaryDictionary.java
deleted file mode 100644
index ff71f59..0000000
--- a/java/src/com/android/inputmethod/latin/spellcheck/SynchronouslyLoadedUserBinaryDictionary.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (C) 2012 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 com.android.inputmethod.keyboard.ProximityInfo;
-import com.android.inputmethod.latin.PrevWordsInfo;
-import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
-import com.android.inputmethod.latin.settings.SettingsValuesForSuggestion;
-import com.android.inputmethod.latin.UserBinaryDictionary;
-import com.android.inputmethod.latin.WordComposer;
-
-import java.util.ArrayList;
-import java.util.Locale;
-
-public final class SynchronouslyLoadedUserBinaryDictionary extends UserBinaryDictionary {
-    private static final String NAME = "spellcheck_user";
-    private final Object mLock = new Object();
-
-    public SynchronouslyLoadedUserBinaryDictionary(final Context context, final Locale locale) {
-        this(context, locale, false /* alsoUseMoreRestrictiveLocales */);
-    }
-
-    public SynchronouslyLoadedUserBinaryDictionary(final Context context, final Locale locale,
-            final boolean alsoUseMoreRestrictiveLocales) {
-        super(context, locale, alsoUseMoreRestrictiveLocales, null /* dictFile */, NAME);
-    }
-
-    @Override
-    public ArrayList<SuggestedWordInfo> getSuggestions(final WordComposer codes,
-            final PrevWordsInfo prevWordsInfo, final ProximityInfo proximityInfo,
-            final SettingsValuesForSuggestion settingsValuesForSuggestion,
-            final int sessionId, final float[] inOutLanguageWeight) {
-        synchronized (mLock) {
-            return super.getSuggestions(codes, prevWordsInfo, proximityInfo,
-                    settingsValuesForSuggestion, sessionId, inOutLanguageWeight);
-        }
-    }
-
-    @Override
-    public boolean isInDictionary(final String word) {
-        synchronized (mLock) {
-            return super.isInDictionary(word);
-        }
-    }
-}
diff --git a/tests/src/com/android/inputmethod/compat/TextInfoCompatUtilsTests.java b/tests/src/com/android/inputmethod/compat/TextInfoCompatUtilsTests.java
index 5721ed1..c399cce 100644
--- a/tests/src/com/android/inputmethod/compat/TextInfoCompatUtilsTests.java
+++ b/tests/src/com/android/inputmethod/compat/TextInfoCompatUtilsTests.java
@@ -58,7 +58,7 @@
         final Spanned expectedSpanned = (Spanned) text.subSequence(TEST_CHAR_SEQUENCE_START,
                 TEST_CHAR_SEQUENCE_END);
         final CharSequence actualCharSequence =
-                TextInfoCompatUtils.getCharSequence(textInfo, textInfo.getText());
+                TextInfoCompatUtils.getCharSequenceOrString(textInfo);
 
         // This should be valid even if TextInfo#getCharSequence is not supported.
         assertTrue(TextUtils.equals(expectedSpanned, actualCharSequence));
diff --git a/tests/src/com/android/inputmethod/keyboard/KeyboardThemeTests.java b/tests/src/com/android/inputmethod/keyboard/KeyboardThemeTests.java
index f9d98af..0c7e400 100644
--- a/tests/src/com/android/inputmethod/keyboard/KeyboardThemeTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/KeyboardThemeTests.java
@@ -16,6 +16,11 @@
 
 package com.android.inputmethod.keyboard;
 
+import static com.android.inputmethod.keyboard.KeyboardTheme.THEME_ID_ICS;
+import static com.android.inputmethod.keyboard.KeyboardTheme.THEME_ID_KLP;
+import static com.android.inputmethod.keyboard.KeyboardTheme.THEME_ID_LXX_DARK;
+import static com.android.inputmethod.keyboard.KeyboardTheme.THEME_ID_LXX_LIGHT;
+
 import android.content.SharedPreferences;
 import android.os.Build.VERSION_CODES;
 import android.preference.PreferenceManager;
@@ -33,9 +38,6 @@
     private static final int THEME_ID_UNKNOWN = -2;
     private static final int THEME_ID_ILLEGAL = -3;
     private static final String ILLEGAL_THEME_ID_STRING = "ThisCausesNumberFormatExecption";
-    private static final int THEME_ID_ICS = KeyboardTheme.THEME_ID_ICS;
-    private static final int THEME_ID_KLP = KeyboardTheme.THEME_ID_KLP;
-    private static final int THEME_ID_LXX_DARK = KeyboardTheme.THEME_ID_LXX_DARK;
 
     @Override
     protected void setUp() throws Exception {
@@ -51,6 +53,7 @@
         switch (themeId) {
         case THEME_ID_ICS:
         case THEME_ID_KLP:
+        case THEME_ID_LXX_LIGHT:
         case THEME_ID_LXX_DARK:
             return true;
         default:
@@ -99,6 +102,7 @@
         assertKeyboardThemePreference(sdkVersion, THEME_ID_NULL, defaultThemeId);
         assertKeyboardThemePreference(sdkVersion, THEME_ID_ICS, THEME_ID_ICS);
         assertKeyboardThemePreference(sdkVersion, THEME_ID_KLP, THEME_ID_KLP);
+        assertKeyboardThemePreference(sdkVersion, THEME_ID_LXX_LIGHT, THEME_ID_LXX_LIGHT);
         assertKeyboardThemePreference(sdkVersion, THEME_ID_LXX_DARK, THEME_ID_LXX_DARK);
         assertKeyboardThemePreference(sdkVersion, THEME_ID_UNKNOWN, defaultThemeId);
         assertKeyboardThemePreference(sdkVersion, THEME_ID_ILLEGAL, defaultThemeId);
@@ -114,10 +118,11 @@
     }
 
     private void assertKeyboardThemePreferenceOnLxx(final int sdkVersion) {
-        final int defaultThemeId = THEME_ID_LXX_DARK;
+        final int defaultThemeId = THEME_ID_LXX_LIGHT;
         assertKeyboardThemePreference(sdkVersion, THEME_ID_NULL, defaultThemeId);
         assertKeyboardThemePreference(sdkVersion, THEME_ID_ICS, THEME_ID_ICS);
         assertKeyboardThemePreference(sdkVersion, THEME_ID_KLP, THEME_ID_KLP);
+        assertKeyboardThemePreference(sdkVersion, THEME_ID_LXX_LIGHT, THEME_ID_LXX_LIGHT);
         assertKeyboardThemePreference(sdkVersion, THEME_ID_LXX_DARK, THEME_ID_LXX_DARK);
         assertKeyboardThemePreference(sdkVersion, THEME_ID_UNKNOWN, defaultThemeId);
         assertKeyboardThemePreference(sdkVersion, THEME_ID_ILLEGAL, defaultThemeId);
@@ -169,11 +174,11 @@
 
     private void assertDefaultKeyboardThemeOnLxx(final int sdkVersion) {
         // Forced to switch to LXX theme.
-        assertDefaultKeyboardTheme(sdkVersion, THEME_ID_NULL, THEME_ID_LXX_DARK);
-        assertDefaultKeyboardTheme(sdkVersion, THEME_ID_ICS, THEME_ID_LXX_DARK);
-        assertDefaultKeyboardTheme(sdkVersion, THEME_ID_KLP, THEME_ID_LXX_DARK);
-        assertDefaultKeyboardTheme(sdkVersion, THEME_ID_UNKNOWN, THEME_ID_LXX_DARK);
-        assertDefaultKeyboardTheme(sdkVersion, THEME_ID_ILLEGAL, THEME_ID_LXX_DARK);
+        assertDefaultKeyboardTheme(sdkVersion, THEME_ID_NULL, THEME_ID_LXX_LIGHT);
+        assertDefaultKeyboardTheme(sdkVersion, THEME_ID_ICS, THEME_ID_LXX_LIGHT);
+        assertDefaultKeyboardTheme(sdkVersion, THEME_ID_KLP, THEME_ID_LXX_LIGHT);
+        assertDefaultKeyboardTheme(sdkVersion, THEME_ID_UNKNOWN, THEME_ID_LXX_LIGHT);
+        assertDefaultKeyboardTheme(sdkVersion, THEME_ID_ILLEGAL, THEME_ID_LXX_LIGHT);
     }
 
     public void testDefaultKeyboardThemeOnLxx() {
@@ -234,11 +239,11 @@
 
     private void assertUpgradeKeyboardToLxxOnLxx(final int sdkVersion) {
         // Forced to switch to LXX theme.
-        assertUpgradeKeyboardToLxxOn(sdkVersion, THEME_ID_NULL, THEME_ID_LXX_DARK);
-        assertUpgradeKeyboardToLxxOn(sdkVersion, THEME_ID_ICS, THEME_ID_LXX_DARK);
-        assertUpgradeKeyboardToLxxOn(sdkVersion, THEME_ID_KLP, THEME_ID_LXX_DARK);
-        assertUpgradeKeyboardToLxxOn(sdkVersion, THEME_ID_UNKNOWN, THEME_ID_LXX_DARK);
-        assertUpgradeKeyboardToLxxOn(sdkVersion, THEME_ID_ILLEGAL, THEME_ID_LXX_DARK);
+        assertUpgradeKeyboardToLxxOn(sdkVersion, THEME_ID_NULL, THEME_ID_LXX_LIGHT);
+        assertUpgradeKeyboardToLxxOn(sdkVersion, THEME_ID_ICS, THEME_ID_LXX_LIGHT);
+        assertUpgradeKeyboardToLxxOn(sdkVersion, THEME_ID_KLP, THEME_ID_LXX_LIGHT);
+        assertUpgradeKeyboardToLxxOn(sdkVersion, THEME_ID_UNKNOWN, THEME_ID_LXX_LIGHT);
+        assertUpgradeKeyboardToLxxOn(sdkVersion, THEME_ID_ILLEGAL, THEME_ID_LXX_LIGHT);
     }
 
     // Upgrading keyboard on L.
@@ -298,15 +303,15 @@
         // Forced to switch to LXX theme.
         final int newSdkVersion = VERSION_CODES_LXX;
         assertUpgradePlatformFromTo(
-                oldSdkVersion, newSdkVersion, THEME_ID_NULL, THEME_ID_LXX_DARK);
+                oldSdkVersion, newSdkVersion, THEME_ID_NULL, THEME_ID_LXX_LIGHT);
         assertUpgradePlatformFromTo(
-                oldSdkVersion, newSdkVersion, THEME_ID_ICS, THEME_ID_LXX_DARK);
+                oldSdkVersion, newSdkVersion, THEME_ID_ICS, THEME_ID_LXX_LIGHT);
         assertUpgradePlatformFromTo(
-                oldSdkVersion, newSdkVersion, THEME_ID_KLP, THEME_ID_LXX_DARK);
+                oldSdkVersion, newSdkVersion, THEME_ID_KLP, THEME_ID_LXX_LIGHT);
         assertUpgradePlatformFromTo(
-                oldSdkVersion, newSdkVersion, THEME_ID_UNKNOWN, THEME_ID_LXX_DARK);
+                oldSdkVersion, newSdkVersion, THEME_ID_UNKNOWN, THEME_ID_LXX_LIGHT);
         assertUpgradePlatformFromTo(
-                oldSdkVersion, newSdkVersion, THEME_ID_ILLEGAL, THEME_ID_LXX_DARK);
+                oldSdkVersion, newSdkVersion, THEME_ID_ILLEGAL, THEME_ID_LXX_LIGHT);
     }
 
     // Update platform from I,J, and K to L
@@ -324,14 +329,18 @@
         final int oldSdkVersion = VERSION_CODES_LXX;
         final int newSdkVersion = VERSION_CODES_LXX;
         assertUpgradePlatformFromTo(
-                oldSdkVersion, newSdkVersion, THEME_ID_NULL, THEME_ID_LXX_DARK);
+                oldSdkVersion, newSdkVersion, THEME_ID_NULL, THEME_ID_LXX_LIGHT);
         assertUpgradePlatformFromTo(
                 oldSdkVersion, newSdkVersion, THEME_ID_ICS, THEME_ID_ICS);
         assertUpgradePlatformFromTo(
                 oldSdkVersion, newSdkVersion, THEME_ID_KLP, THEME_ID_KLP);
         assertUpgradePlatformFromTo(
-                oldSdkVersion, newSdkVersion, THEME_ID_UNKNOWN, THEME_ID_LXX_DARK);
+                oldSdkVersion, newSdkVersion, THEME_ID_LXX_LIGHT, THEME_ID_LXX_LIGHT);
         assertUpgradePlatformFromTo(
-                oldSdkVersion, newSdkVersion, THEME_ID_ILLEGAL, THEME_ID_LXX_DARK);
+                oldSdkVersion, newSdkVersion, THEME_ID_LXX_DARK, THEME_ID_LXX_DARK);
+        assertUpgradePlatformFromTo(
+                oldSdkVersion, newSdkVersion, THEME_ID_UNKNOWN, THEME_ID_LXX_LIGHT);
+        assertUpgradePlatformFromTo(
+                oldSdkVersion, newSdkVersion, THEME_ID_ILLEGAL, THEME_ID_LXX_LIGHT);
     }
 }